penpot/frontend/shadow-cljs.edn
Álvaro Tejero Cantero a0ec4225b4
🔧 Run the A/B bench at :advanced, now that the corruption is answered
The :simple pin existed because datascript's query layer was broken at
:advanced under this toolchain, which mirror:ds-advanced-corruption has
since answered: shadow-cljs never reads a library's own deps.cljs
externs declaration, so the build must name the file itself.

:ab-bench therefore runs :advanced with :externs
["datascript/externs.js"], and with :infer-externs :all to match the
datahike column, whose build needs it. The default :auto infers externs
for a project's own sources and not for a jar.

bench.core/-main now exits explicitly. Datahike keeps the node event
loop alive after the last reading, and the shared body must stay
identical between the two worktrees.

Entry: pp🪞graph-overlay-experiment
AI-assisted-by: opus-5
2026-10-06 10:32:57 +02:00

231 lines
7.4 KiB
Clojure

{:deps {:aliases [:dev]}
:http {:port #shadow/env ["HTTP_PORT" :as :int :default 3448]}
:nrepl {:port #shadow/env ["NREPL_PORT" :as :int :default 3447] :host "0.0.0.0"}
:dev-http {#shadow/env ["DEV_PORT" :as :int :default 8888] "classpath:public"}
:cache-dir #shadow/env ["CACHE" :default ".shadow-cljs"]
:builds
{:main
{:target :esm
:output-dir "resources/public/js/"
:asset-path "/js"
:devtools {:watch-dir "resources/public"
:reload-strategy :full}
:dev {;; allows remote-relay per parallel environment
;; inside :dev so the integration tests won't use it
:devtools {:devtools-url #shadow/env ["SHADOW_SERVER_URL" :default ""]}}
:build-options {:manifest-name "manifest.json"}
:modules
{:shared
{:entries []}
:main
{:entries [app.main app.plugins.api]
:depends-on #{:shared}
:exports {init app.main/init}}
:util-highlight
{:entries [app.util.code-highlight]
:depends-on #{:shared}}
:main-auth
{:entries [app.main.ui.auth
app.main.ui.auth.verify-token]
:depends-on #{:shared}}
:main-viewer
{:entries [app.main.ui.viewer]
:depends-on #{:shared :main-auth}}
:main-workspace
{:entries [app.main.ui.workspace]
:depends-on #{:shared}}
:main-dashboard
{:entries [app.main.ui.dashboard]
:depends-on #{:shared}}
:main-settings
{:entries [app.main.ui.settings]
:depends-on #{:shared}}
:render
{:entries [app.render]
:depends-on #{:shared}
:exports {init app.render/init}}
:rasterizer
{:entries [app.rasterizer]
:depends-on #{:shared}
:exports {init app.rasterizer/init}}}
:js-options
{:entry-keys ["module" "browser" "main"]
:export-conditions ["module" "import", "browser" "require" "default"]
:js-provider :external
:external-index "target/index.js"
:external-index-format :esm}
:compiler-options
{:output-feature-set :es2020
:output-wrapper false
:warnings {:fn-deprecated false}}
:release
{:closure-defines {goog.DEBUG false
goog.debug.LOGGING_ENABLED true
app.config/compiled-version-tag #shadow/env ["VERSION_TAG" :default "develop"]}
:compiler-options
{:fn-invoke-direct true
:optimizations #shadow/env ["PENPOT_BUILD_OPTIMIZATIONS" :as :keyword :default :advanced]
:source-map true
:pseudo-names true
:elide-asserts true
:anon-fn-naming-policy :off
:cross-chunk-method-motion false
:source-map-detail-level :all}}}
:worker
{:target :browser
:output-dir "resources/public/js/worker/"
:asset-path "/js/worker"
:devtools {:watch-dir "resources/public"
:reload-strategy :full
:browser-inject :main}
:dev {;; allows remote-relay per parallel environment
;; inside :dev so the integration tests won't use it
:devtools {:devtools-url #shadow/env ["SHADOW_SERVER_URL" :default ""]}}
:build-options {:manifest-name "manifest.json"}
:modules
{:main
{:entries [app.worker]
:web-worker true
:prepend-js "importScripts('./render.js');"
:depends-on #{}}}
:js-options
{:entry-keys ["module" "browser" "main"]
:export-conditions ["module" "import", "browser" "require" "default"]}
:compiler-options
{:output-feature-set :es2020
:output-wrapper false
:warnings {:fn-deprecated false}}
:release
{:compiler-options
{:fn-invoke-direct true
:optimizations #shadow/env ["PENPOT_BUILD_OPTIMIZATIONS" :as :keyword :default :advanced]
:output-wrapper true
:rename-prefix-namespace "PENPOT"
:source-map true
:elide-asserts true
:anon-fn-naming-policy :off
;; datascript's query layer reads a datom's slots by string property
;; name, so property renaming silently returns the wrong slot: see
;; bench.debug, the gate that proves it, and mirror:ds-advanced-corruption.
;; The library ships these externs and declares them in its deps.cljs,
;; which shadow-cljs does not read, so the build names them here.
:externs ["datascript/externs.js"]
:source-map-detail-level :all}}}
;; FIXME: maybe rename to :components ? (there are nothing storybook
;; related, is just an ESM export of components that will be used
;; initially on storybook but not limited to storybook)
:storybook
{:target :esm
:output-dir "target/storybook/"
:devtools {:enabled false
:console-support false}
:js-options
{:js-provider :import
:entry-keys ["module" "browser" "main"]
:export-conditions ["module" "import", "browser" "require" "default"]}
:modules
{:components
{:exports {default app.main.ui.ds/default
helpers app.main.ui.ds.helpers/default}
:prepend-js ";(globalThis.goog.provide = globalThis.goog.constructNamespace_);(globalThis.goog.require = globalThis.goog.module.get);"
:depends-on #{}}}
:compiler-options
{:output-feature-set :es-next
:output-wrapper false
:warnings {:fn-deprecated false}}}
:test
{:target :esm
:output-dir "target/tests"
:runtime :custom
:js-options {:js-provider :import}
:modules
{:test {:init-fn frontend-tests.runner/init
:prepend-js ";if (typeof globalThis.navigator?.userAgent === 'undefined') { globalThis.navigator = {userAgent: ''}; };"}}}
;; The A/B bench runs both engines at :advanced under one compiler
;; configuration, each build naming its own library's externs declaration
;; because shadow-cljs never reads it from the library's deps.cljs. The
;; :simple pin this replaces was forced by that unread declaration, and the
;; 2026-08-21 report's V8 table was read under it.
:ab-bench
{:target :node-script
:output-to "target/ab-bench.js"
:output-dir "target/ab-bench/"
:main bench.core/-main
:compiler-options
{:optimizations :advanced
:output-wrapper false
:warnings {:fn-deprecated false}
;; :all, not the default :auto, to match the datahike column: :auto
;; infers externs for this project's own sources and not for a jar.
:infer-externs :all
:externs ["datascript/externs.js"]}}
;; The gate for mirror:ds-advanced-corruption: bench.debug reads one
;; database six ways and exits non-zero on a wrong answer. Its release
;; options mirror :worker's, because the worker is the build the answer is
;; about. To see the corruption, delete the :externs entry below and
;; rebuild: `--config-merge` reaches a build's own keys and never a
;; :release profile's, and externs from several places are concatenated, so
;; no command line can take this one away.
:ds-probe
{:target :node-script
:output-to "target/ds-probe.js"
:output-dir "target/ds-probe/"
:main bench.debug/-main
:compiler-options
{:output-feature-set :es2020
:output-wrapper false
:warnings {:fn-deprecated false}}
:release
{:compiler-options
{:fn-invoke-direct true
:optimizations #shadow/env ["PENPOT_BUILD_OPTIMIZATIONS" :as :keyword :default :advanced]
:elide-asserts true
:anon-fn-naming-policy :off
:externs ["datascript/externs.js"]}}}
:bench
{:target :node-script
:output-to "target/bench.js"
:output-dir "target/bench/"
:main bench/main
:compiler-options
{:output-feature-set :es2020
:output-wrapper false
:warnings {:fn-deprecated false}}
:release
{:compiler-options
{:fn-invoke-direct true
:elide-asserts true
:anon-fn-naming-policy :off}}}}}