@sebbro/paraglide-lite 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundler-plugins/per-locale-build/index.js +5 -3
- package/dist/bundler-plugins/per-locale-build/index.js.map +1 -1
- package/dist/bundler-plugins/per-locale-build/vite-environments.js +12 -7
- package/dist/bundler-plugins/per-locale-build/vite-environments.js.map +1 -1
- package/dist/bundler-plugins/plugin-core.d.ts +38 -2
- package/dist/bundler-plugins/plugin-core.js +198 -11
- package/dist/bundler-plugins/plugin-core.js.map +1 -1
- package/dist/bundler-plugins/rolldown.test.js +15 -6
- package/dist/bundler-plugins/rolldown.test.js.map +1 -1
- package/dist/bundler-plugins/unplugin.js +5 -0
- package/dist/bundler-plugins/unplugin.js.map +1 -1
- package/dist/bundler-plugins/unplugin.test.js +67 -0
- package/dist/bundler-plugins/unplugin.test.js.map +1 -1
- package/dist/bundler-plugins/virtual-modules.test.js +64 -1
- package/dist/bundler-plugins/virtual-modules.test.js.map +1 -1
- package/dist/cli/commands/compile/command.js +8 -1
- package/dist/cli/commands/compile/command.js.map +1 -1
- package/dist/cli/commands/compile/command.test.js +51 -0
- package/dist/cli/commands/compile/command.test.js.map +1 -1
- package/dist/compiler/compile-annotation.d.ts +2 -2
- package/dist/compiler/compile-annotation.js +9 -9
- package/dist/compiler/compile-annotation.js.map +1 -1
- package/dist/compiler/compile-local-variable.d.ts +2 -1
- package/dist/compiler/compile-local-variable.js +4 -4
- package/dist/compiler/compile-local-variable.js.map +1 -1
- package/dist/compiler/compile-local-variable.test.js +82 -0
- package/dist/compiler/compile-local-variable.test.js.map +1 -1
- package/dist/compiler/compile-message.js +10 -2
- package/dist/compiler/compile-message.js.map +1 -1
- package/dist/compiler/compile-message.test.js +132 -2
- package/dist/compiler/compile-message.test.js.map +1 -1
- package/dist/compiler/compile-pattern.js +4 -2
- package/dist/compiler/compile-pattern.js.map +1 -1
- package/dist/compiler/compile-pattern.test.js +31 -0
- package/dist/compiler/compile-pattern.test.js.map +1 -1
- package/dist/compiler/compile.bench.js +1 -1
- package/dist/compiler/compile.bench.js.map +1 -1
- package/dist/compiler/compile.test.js +14 -0
- package/dist/compiler/compile.test.js.map +1 -1
- package/dist/compiler/compiler-options.d.ts +9 -1
- package/dist/compiler/compiler-options.js.map +1 -1
- package/dist/compiler/emit-message-dts.d.ts +18 -0
- package/dist/compiler/emit-message-dts.js +166 -0
- package/dist/compiler/emit-message-dts.js.map +1 -0
- package/dist/compiler/emit-message-dts.test.d.ts +1 -0
- package/dist/compiler/emit-message-dts.test.js +283 -0
- package/dist/compiler/emit-message-dts.test.js.map +1 -0
- package/dist/compiler/runtime/create-runtime.d.ts +1 -0
- package/dist/compiler/runtime/create-runtime.js +11 -0
- package/dist/compiler/runtime/create-runtime.js.map +1 -1
- package/dist/compiler/runtime/exec-url-pattern.d.ts +9 -0
- package/dist/compiler/runtime/exec-url-pattern.js +31 -0
- package/dist/compiler/runtime/exec-url-pattern.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.js +9 -4
- package/dist/compiler/runtime/extract-locale-from-url.js.map +1 -1
- package/dist/compiler/runtime/generate-static-localized-urls.js +13 -6
- package/dist/compiler/runtime/generate-static-localized-urls.js.map +1 -1
- package/dist/compiler/runtime/generate-static-localized-urls.test.js +38 -0
- package/dist/compiler/runtime/generate-static-localized-urls.test.js.map +1 -1
- package/dist/compiler/runtime/host-routing.d.ts +3 -3
- package/dist/compiler/runtime/host-routing.js +2 -2
- package/dist/compiler/runtime/host-routing.js.map +1 -1
- package/dist/compiler/runtime/host-routing.test.js +79 -0
- package/dist/compiler/runtime/host-routing.test.js.map +1 -1
- package/dist/compiler/runtime/localize-href.bench.d.ts +1 -0
- package/dist/compiler/runtime/localize-href.bench.js +68 -0
- package/dist/compiler/runtime/localize-href.bench.js.map +1 -0
- package/dist/compiler/runtime/localize-href.test.js +35 -0
- package/dist/compiler/runtime/localize-href.test.js.map +1 -1
- package/dist/compiler/runtime/localize-url.d.ts +14 -0
- package/dist/compiler/runtime/localize-url.js +338 -19
- package/dist/compiler/runtime/localize-url.js.map +1 -1
- package/dist/compiler/runtime/localize-url.test.js +139 -0
- package/dist/compiler/runtime/localize-url.test.js.map +1 -1
- package/dist/compiler/runtime/normalize-trailing-slash.d.ts +10 -0
- package/dist/compiler/runtime/normalize-trailing-slash.js +23 -0
- package/dist/compiler/runtime/normalize-trailing-slash.js.map +1 -0
- package/dist/compiler/runtime/route-strategy.js +4 -2
- package/dist/compiler/runtime/route-strategy.js.map +1 -1
- package/dist/compiler/runtime/should-redirect.js +4 -1
- package/dist/compiler/runtime/should-redirect.js.map +1 -1
- package/dist/compiler/runtime/should-redirect.test.js +26 -2
- package/dist/compiler/runtime/should-redirect.test.js.map +1 -1
- package/dist/compiler/runtime/type.d.ts +1 -0
- package/dist/compiler/runtime/type.js.map +1 -1
- package/dist/compiler/runtime/url-pattern.d.ts +11 -0
- package/dist/compiler/runtime/url-pattern.js +39 -1
- package/dist/compiler/runtime/url-pattern.js.map +1 -1
- package/dist/compiler/runtime/variables.d.ts +9 -3
- package/dist/compiler/runtime/variables.js +7 -1
- package/dist/compiler/runtime/variables.js.map +1 -1
- package/dist/compiler/server/create-server-file.js +18 -4
- package/dist/compiler/server/create-server-file.js.map +1 -1
- package/dist/compiler/server/create-server-file.test.js +76 -0
- package/dist/compiler/server/create-server-file.test.js.map +1 -1
- package/dist/compiler/server/middleware.js +6 -2
- package/dist/compiler/server/middleware.js.map +1 -1
- package/dist/compiler/server/middleware.test.js +30 -0
- package/dist/compiler/server/middleware.test.js.map +1 -1
- package/dist/compiler/strip-jsdoc.d.ts +9 -0
- package/dist/compiler/strip-jsdoc.js +19 -0
- package/dist/compiler/strip-jsdoc.js.map +1 -0
- package/dist/compiler/strip-jsdoc.test.d.ts +1 -0
- package/dist/compiler/strip-jsdoc.test.js +95 -0
- package/dist/compiler/strip-jsdoc.test.js.map +1 -0
- package/dist/compiler/variable-access.d.ts +2 -0
- package/dist/compiler/variable-access.js +6 -0
- package/dist/compiler/variable-access.js.map +1 -1
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +9 -0
- package/dist/index.test.js.map +1 -0
- package/dist/messages/load-messages.js +4 -5
- package/dist/messages/load-messages.js.map +1 -1
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- package/dist/services/file-handling/write-output.bench.d.ts +1 -0
- package/dist/services/file-handling/write-output.bench.js +24 -0
- package/dist/services/file-handling/write-output.bench.js.map +1 -0
- package/dist/services/file-handling/write-output.d.ts +5 -0
- package/dist/services/file-handling/write-output.js +54 -9
- package/dist/services/file-handling/write-output.js.map +1 -1
- package/dist/services/file-handling/write-output.test.js +27 -0
- package/dist/services/file-handling/write-output.test.js.map +1 -1
- package/dist/services/logger/index.js +2 -0
- package/dist/services/logger/index.js.map +1 -1
- package/package.json +86 -86
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-core.js","sourceRoot":"","sources":["../../src/bundler-plugins/plugin-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,OAAO,EAA0B,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,iCAAiC,EAAE,MAAM,0CAA0C,CAAC;AAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EACN,eAAe,EACf,eAAe,EACf,uBAAuB,GACvB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAExE,MAAM,CAAC,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAErD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AA0B5B,0EAA0E;AAC1E,0EAA0E;AAC1E,2EAA2E;AAC3E,yDAAyD;AACzD,IAAI,WAAoC,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,IAAI,kBAAsC,CAAC;AAElD,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC9D,kBAAkB,GAAG,KAAK,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAqB;IACnD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,WAAW,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,mBAAmB,EAAE,SAAS;YAC9B,oBAAoB,EAAE,SAAS;YAC/B,cAAc,EAAE,IAAI,GAAG,EAAE;YACzB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;SACxD,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,wBAAwB;IACvC,WAAW,GAAG,SAAS,CAAC;IACxB,kBAAkB,GAAG,SAAS,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,IAAqB;IAErB,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC;IAC7C,KAAK,WAAW,CAAC;IACjB,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,IAAqB;IAErB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAC3D,OAAO,CACN,IAAI,CAAC,eAAe;QACpB,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CACrD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,KAAkB,EAClB,IAAqB,EACrB,eAAgE;IAEhE,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC;QACJ,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,IAAI,CAAC;QAC9C,KAAK,GAAG,CAAC;QACT,IAAI,CAAC,MAAM,CACV,IAAI,CAAC,SAAS,CAAC;YACd,GAAG,gBAAgB;YACnB,eAAe;YACf,QAAQ,EAAE,kBAAkB;SAC5B,CAAC,CACF,CAAC;QACF,KAAK,MAAM,aAAa,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,GAAG;iBACvB,OAAO,CAAC,aAAa,CAAC;iBACtB,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,aAAa,CAAC,MAAM,IAAI,aAAa,GAAG,CAAC,CAAC;YAC/D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACP,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC;gBAC1C,CAAC;YACF,CAAC;QACF,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,UAAU,QAAQ,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC,CAAC;YACtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,CAAC;AACb,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAM3C;IACA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAClD,MAAM,eAAe,GAAoB,IAAI,CAAC,cAAc;QAC3D,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;QAClC,CAAC,CAAC,QAAQ,CAAC;IACZ,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACvC,MAAM,eAAe,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAE3D,IAAI,CAAC;QACJ,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC7D,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAC9C,KAAK,EACL,eAAe,EACf,eAAe,CACf,CAAC;YACF,IAAI,aAAa,KAAK,KAAK,CAAC,oBAAoB,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CACV,2CAA2C,eAAe,GAAG,CAC7D,CAAC;gBACF,OAAO;YACR,CAAC;QACF,CAAC;QAED,MAAM,cAAc,GACnB,KAAK,CAAC,mBAAmB;YACzB,CAAC,MAAM,iCAAiC,CAAC;gBACxC,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ;aAChC,CAAC,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC5B,mBAAmB,EAAE,cAAc;YACnC,eAAe;YACf,QAAQ,EAAE,kBAAkB;YAC5B,GAAG,kBAAkB,CAAC,eAAe,CAAC;YACtC,WAAW,EAAE,KAAK;YAClB,EAAE,EAAE,SAAS;SACb,CAAC,CAAC;QAEH,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QACrD,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAAC;QACnC,KAAK,CAAC,oBAAoB,GAAG,MAAM,mBAAmB,CACrD,KAAK,EACL,eAAe,EACf,eAAe,CACf,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,yBAAyB,eAAe,GAAG,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,oBAAoB,GAAG,SAAS,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACtE,IAAI,YAAY;YAAE,MAAM,KAAK,CAAC;IAC/B,CAAC;YAAS,CAAC;QACV,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE;YAC1C,MAAM,EAAE,eAAe,CAAC,MAAM;SAC9B,CAAC,CAAC;QACH,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAM5C;IACA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,eAAe,GAAoB,IAAI,CAAC,cAAc;QAC3D,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE;QAC9C,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IACxB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IACvD,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE;QAC1C,MAAM,EAAE,eAAe,CAAC,MAAM;KAC9B,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3C,OAAO;IACR,CAAC;IACD,MAAM,aAAa,GAClB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;QACjC,uBAAuB,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO;IACR,CAAC;IAED,MAAM,eAAe,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;IAChE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,CAAC;QACJ,MAAM,CAAC,IAAI,CACV,kCAAkC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC3F,CAAC;QAEF,cAAc,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC5B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;YAC9C,eAAe;YACf,QAAQ,EAAE,kBAAkB;YAC5B,GAAG,kBAAkB,CAAC,eAAe,CAAC;YACtC,WAAW,EAAE,KAAK;YAClB,EAAE,EAAE,SAAS;SACb,CAAC,CAAC;QAEH,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QACrD,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAAC;QACnC,KAAK,CAAC,oBAAoB,GAAG,MAAM,mBAAmB,CACrD,KAAK,EACL,eAAe,EACf,eAAe,CACf,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,4BAA4B,eAAe,GAAG,CAAC,CAAC;QAE/D,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,EAAE;YAC9C,MAAM,EAAE,eAAe,CAAC,MAAM;SAC9B,CAAC,CAAC;QACH,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,cAAc,EAAE,CAAC;QACjB,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;YAC5C,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACtC,KAAK,CAAC,oBAAoB,GAAG,SAAS,CAAC;QACvC,KAAK,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAC5B,KAAkB,EAClB,IAAqB,EACrB,MAAyB;IAEzB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,KAAK,CAAC,cAAc,GAAG,mBAAmB,CACzC,IAAI,CAAC,MAAM,EACX,MAAM,CAAC,MAAM,EACb,OAAO,CAAC,GAAG,EAAE,CACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACP,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE5D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;YAChD,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,OAAO,UAAU,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,UAAU,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,GAAG,UAAU,KAAK,CAAC;QAC3B,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACvE,IACC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EACvC,CAAC;YACF,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB,EAAE,SAAiB;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO,CACN,YAAY,KAAK,EAAE;QACnB,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,EAAU,EACV,KAAkB;IAElB,MAAM,UAAU,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAU;IACpC,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;IACpB,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport nodeFs from \"node:fs\";\nimport path from \"node:path\";\nimport { relative } from \"node:path\";\nimport { compile, type CompilationResult } from \"../compiler/compile.js\";\nimport type { CompilerOptions } from \"../compiler/compiler-options.js\";\nimport { buildVirtualModules } from \"../compiler/emit-files.js\";\nimport { seedPreviousCompilationFromOutdir } from \"../compiler/seed-previous-compilation.js\";\nimport { Logger } from \"../services/logger/index.js\";\nimport {\n\tcreateTrackedFs,\n\tgetWatchTargets,\n\tisPathWithinDirectories,\n} from \"../services/file-watching/tracked-fs.js\";\nimport { nodeNormalizePath } from \"../utilities/node-normalize-path.js\";\n\nexport const PLUGIN_NAME = \"unplugin-paraglide-lite\";\n\nconst logger = new Logger();\n\nexport type PluginState = {\n\t/** Identity of the fs the tracked wrapper was created around. */\n\tbaseFs: typeof nodeFs | undefined;\n\ttrackedFs: typeof nodeFs;\n\treadFiles: Set<string>;\n\tclearReadFiles: () => void;\n\tpreviousCompilation: CompilationResult | undefined;\n\t/**\n\t * Digest of the input files and options of the last successful compilation.\n\t *\n\t * `vite build` fires `buildStart` once per environment (client, ssr, ...).\n\t * When the digest of the current inputs matches, `compile()` is skipped\n\t * entirely — project loading and message compilation are expensive even\n\t * when `previousCompilation` dedupes the writes.\n\t *\n\t * https://github.com/opral/paraglide-js/issues/693\n\t */\n\tpreviousInputsDigest: string | undefined;\n\t/** Absolute path → generated JS source for resolveId/load. */\n\tvirtualModules: Map<string, string>;\n\t/** Absolute outdir used to build virtualModules. */\n\tabsoluteOutdir: string;\n};\n\n// Module-scoped so the warm state survives plugin re-instantiation within\n// one process (e.g. a vite config reload), but recreated when a different\n// fs is passed — the tracked wrapper, read set, and cached compilation are\n// only valid for the filesystem they were produced from.\nlet pluginState: PluginState | undefined;\n\n/**\n * Default isServer which differs per bundler. Mutated by Vite hooks.\n */\nexport let isServerExpression: string | undefined;\n\nexport function setIsServerExpression(value: string | undefined): void {\n\tisServerExpression = value;\n}\n\nexport function getPluginState(args: CompilerOptions): PluginState {\n\tif (pluginState === undefined || pluginState.baseFs !== args.fs) {\n\t\tconst tracked = createTrackedFs({ fs: args.fs });\n\t\tpluginState = {\n\t\t\tbaseFs: args.fs,\n\t\t\ttrackedFs: tracked.fs,\n\t\t\treadFiles: tracked.readFiles,\n\t\t\tclearReadFiles: tracked.clearReadFiles,\n\t\t\tpreviousCompilation: undefined,\n\t\t\tpreviousInputsDigest: undefined,\n\t\t\tvirtualModules: new Map(),\n\t\t\tabsoluteOutdir: path.resolve(process.cwd(), args.outdir),\n\t\t};\n\t}\n\treturn pluginState;\n}\n\n/** @internal test helper */\nexport function resetPluginStateForTests(): void {\n\tpluginState = undefined;\n\tisServerExpression = undefined;\n}\n\nexport function withoutCleanOutdir(\n\targs: CompilerOptions\n): Omit<CompilerOptions, \"cleanOutdir\"> {\n\tconst { cleanOutdir, ...compileArgs } = args;\n\tvoid cleanOutdir;\n\treturn compileArgs;\n}\n\nexport function resolveOutputStructure(\n\targs: CompilerOptions\n): NonNullable<CompilerOptions[\"outputStructure\"]> {\n\tconst isProduction = process.env.NODE_ENV === \"production\";\n\treturn (\n\t\targs.outputStructure ??\n\t\t(isProduction ? \"message-modules\" : \"locale-modules\")\n\t);\n}\n\n/**\n * Hashes the files (and directory listings) the last compilation read,\n * together with the options that affect the output. Returns `undefined`\n * when the digest can't be computed (no tracked reads yet, an unexpected\n * read error, ...) — `undefined` never matches, so the caller compiles.\n */\nexport async function computeInputsDigest(\n\tstate: PluginState,\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n): Promise<string | undefined> {\n\tif (state.readFiles.size === 0) {\n\t\treturn undefined;\n\t}\n\tconst targets = getWatchTargets(state.readFiles, { outdir: args.outdir });\n\tif (targets.files.size === 0) {\n\t\treturn undefined;\n\t}\n\tconst fsp = (args.fs ?? nodeFs).promises;\n\tconst hash = createHash(\"sha256\");\n\ttry {\n\t\tconst { fs: _fs, ...serializableArgs } = args;\n\t\tvoid _fs;\n\t\thash.update(\n\t\t\tJSON.stringify({\n\t\t\t\t...serializableArgs,\n\t\t\t\toutputStructure,\n\t\t\t\tisServer: isServerExpression,\n\t\t\t})\n\t\t);\n\t\tfor (const directoryPath of [...targets.directories].sort()) {\n\t\t\tconst entries = await fsp\n\t\t\t\t.readdir(directoryPath)\n\t\t\t\t.catch(rethrowUnlessEnoent);\n\t\t\thash.update(`\\0dir:${directoryPath.length}:${directoryPath}:`);\n\t\t\tif (entries === undefined) {\n\t\t\t\thash.update(\"missing\");\n\t\t\t} else {\n\t\t\t\tfor (const entry of [...entries].sort()) {\n\t\t\t\t\thash.update(`${entry.length}:${entry},`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const filePath of [...targets.files].sort()) {\n\t\t\tconst content = await fsp.readFile(filePath).catch(rethrowUnlessEnoent);\n\t\t\thash.update(`\\0file:${filePath.length}:${filePath}:`);\n\t\t\tif (content === undefined) {\n\t\t\t\thash.update(\"missing\");\n\t\t\t} else {\n\t\t\t\thash.update(`${content.length}:`);\n\t\t\t\thash.update(content);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn undefined;\n\t}\n\treturn hash.digest(\"hex\");\n}\n\nfunction rethrowUnlessEnoent(error: unknown): undefined {\n\tif ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n\t\treturn undefined;\n\t}\n\tthrow error;\n}\n\nexport type AddWatchFile = (id: string) => void;\n\nexport async function compileFromBuildStart(args: {\n\tcompilerOptions: CompilerOptions;\n\tstate: PluginState;\n\taddWatchFile: AddWatchFile;\n\t/** Force full disk emit (CLI / per-locale builds). */\n\tforceEmitFiles?: true;\n}): Promise<void> {\n\tconst { state, compilerOptions: userArgs } = args;\n\tconst compilerOptions: CompilerOptions = args.forceEmitFiles\n\t\t? { ...userArgs, emitFiles: true }\n\t\t: userArgs;\n\tconst { trackedFs, readFiles } = state;\n\tconst outputStructure = resolveOutputStructure(compilerOptions);\n\tconst isProduction = process.env.NODE_ENV === \"production\";\n\n\ttry {\n\t\tif (state.previousCompilation && state.previousInputsDigest) {\n\t\t\tconst currentDigest = await computeInputsDigest(\n\t\t\t\tstate,\n\t\t\t\tcompilerOptions,\n\t\t\t\toutputStructure\n\t\t\t);\n\t\t\tif (currentDigest === state.previousInputsDigest) {\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Compilation skipped — inputs unchanged (${outputStructure})`\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst seededPrevious =\n\t\t\tstate.previousCompilation ??\n\t\t\t(await seedPreviousCompilationFromOutdir({\n\t\t\t\toutdir: compilerOptions.outdir,\n\t\t\t\tfs: compilerOptions.fs?.promises,\n\t\t\t}));\n\n\t\tconst result = await compile({\n\t\t\tpreviousCompilation: seededPrevious,\n\t\t\toutputStructure,\n\t\t\tisServer: isServerExpression,\n\t\t\t...withoutCleanOutdir(compilerOptions),\n\t\t\tcleanOutdir: false,\n\t\t\tfs: trackedFs,\n\t\t});\n\n\t\tupdateVirtualModules(state, compilerOptions, result);\n\t\tstate.previousCompilation = result;\n\t\tstate.previousInputsDigest = await computeInputsDigest(\n\t\t\tstate,\n\t\t\tcompilerOptions,\n\t\t\toutputStructure\n\t\t);\n\t\tlogger.success(`Compilation complete (${outputStructure})`);\n\t} catch (error) {\n\t\tstate.previousInputsDigest = undefined;\n\t\tlogger.error(\"Failed to compile project:\", (error as Error).message);\n\t\tlogger.info(\"Please check your translation files for syntax errors.\");\n\t\tif (isProduction) throw error;\n\t} finally {\n\t\tconst targets = getWatchTargets(readFiles, {\n\t\t\toutdir: compilerOptions.outdir,\n\t\t});\n\t\tfor (const filePath of targets.files) {\n\t\t\targs.addWatchFile(filePath);\n\t\t}\n\t\tfor (const directoryPath of targets.directories) {\n\t\t\targs.addWatchFile(directoryPath);\n\t\t}\n\t}\n}\n\nexport async function compileFromWatchChange(args: {\n\tcompilerOptions: CompilerOptions;\n\tstate: PluginState;\n\tchangedPath: string;\n\taddWatchFile: AddWatchFile;\n\tforceEmitFiles?: true;\n}): Promise<void> {\n\tconst { state } = args;\n\tconst compilerOptions: CompilerOptions = args.forceEmitFiles\n\t\t? { ...args.compilerOptions, emitFiles: true }\n\t\t: args.compilerOptions;\n\tconst { trackedFs, readFiles, clearReadFiles } = state;\n\tconst normalizedPath = nodeNormalizePath(args.changedPath);\n\tconst targets = getWatchTargets(readFiles, {\n\t\toutdir: compilerOptions.outdir,\n\t});\n\tif (targets.isIgnoredPath(normalizedPath)) {\n\t\treturn;\n\t}\n\tconst shouldCompile =\n\t\ttargets.files.has(normalizedPath) ||\n\t\tisPathWithinDirectories(normalizedPath, targets.directories);\n\tif (shouldCompile === false) {\n\t\treturn;\n\t}\n\n\tconst outputStructure = resolveOutputStructure(compilerOptions);\n\tconst previouslyReadFiles = new Set(readFiles);\n\n\ttry {\n\t\tlogger.info(\n\t\t\t`Re-compiling messages... File \"${relative(process.cwd(), args.changedPath)}\" has changed.`\n\t\t);\n\n\t\tclearReadFiles();\n\n\t\tconst result = await compile({\n\t\t\tpreviousCompilation: state.previousCompilation,\n\t\t\toutputStructure,\n\t\t\tisServer: isServerExpression,\n\t\t\t...withoutCleanOutdir(compilerOptions),\n\t\t\tcleanOutdir: false,\n\t\t\tfs: trackedFs,\n\t\t});\n\n\t\tupdateVirtualModules(state, compilerOptions, result);\n\t\tstate.previousCompilation = result;\n\t\tstate.previousInputsDigest = await computeInputsDigest(\n\t\t\tstate,\n\t\t\tcompilerOptions,\n\t\t\toutputStructure\n\t\t);\n\n\t\tlogger.success(`Re-compilation complete (${outputStructure})`);\n\n\t\tconst nextTargets = getWatchTargets(readFiles, {\n\t\t\toutdir: compilerOptions.outdir,\n\t\t});\n\t\tfor (const filePath of nextTargets.files) {\n\t\t\targs.addWatchFile(filePath);\n\t\t}\n\t\tfor (const directoryPath of nextTargets.directories) {\n\t\t\targs.addWatchFile(directoryPath);\n\t\t}\n\t} catch (e) {\n\t\tclearReadFiles();\n\t\tfor (const filePath of previouslyReadFiles) {\n\t\t\treadFiles.add(filePath);\n\t\t}\n\t\tstate.previousCompilation = undefined;\n\t\tstate.previousInputsDigest = undefined;\n\t\tstate.virtualModules = new Map();\n\t\tlogger.warn(\"Failed to re-compile project:\", (e as Error).message);\n\t}\n}\n\nfunction updateVirtualModules(\n\tstate: PluginState,\n\targs: CompilerOptions,\n\tresult: CompilationResult\n): void {\n\tstate.absoluteOutdir = path.resolve(process.cwd(), args.outdir);\n\tstate.virtualModules = buildVirtualModules(\n\t\targs.outdir,\n\t\tresult.output,\n\t\tprocess.cwd()\n\t);\n}\n\n/**\n * Resolves an import to a generated paraglide module when present in memory.\n *\n * Only claims ids that resolve to a path under `outdir`. Relative imports from\n * outside outdir (e.g. Svelte's own `./runtime.js`) must not be rewritten.\n */\nexport function resolveVirtualModuleId(args: {\n\tid: string;\n\timporter: string | undefined;\n\tstate: PluginState;\n}): string | undefined {\n\tif (args.state.virtualModules.size === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst bareId = stripQueryAndHash(args.id);\n\tconst candidates: string[] = [];\n\n\tif (path.isAbsolute(bareId)) {\n\t\tcandidates.push(bareId);\n\t} else if (args.importer) {\n\t\tconst importerPath = stripQueryAndHash(args.importer);\n\t\tcandidates.push(path.resolve(path.dirname(importerPath), bareId));\n\t} else {\n\t\tcandidates.push(path.resolve(process.cwd(), bareId));\n\t}\n\n\tconst outdir = nodeNormalizePath(args.state.absoluteOutdir);\n\n\tfor (const candidate of candidates) {\n\t\tconst normalized = nodeNormalizePath(candidate);\n\t\tif (!isPathInsideDirectory(normalized, outdir)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (args.state.virtualModules.has(normalized)) {\n\t\t\treturn normalized;\n\t\t}\n\t\tif (args.state.virtualModules.has(`${normalized}.js`)) {\n\t\t\treturn `${normalized}.js`;\n\t\t}\n\t\tconst indexPath = nodeNormalizePath(path.join(normalized, \"index.js\"));\n\t\tif (\n\t\t\t!normalized.endsWith(\".js\") &&\n\t\t\targs.state.virtualModules.has(indexPath)\n\t\t) {\n\t\t\treturn indexPath;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction isPathInsideDirectory(filePath: string, directory: string): boolean {\n\tconst relativePath = path.relative(directory, filePath);\n\treturn (\n\t\trelativePath === \"\" ||\n\t\t(!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath))\n\t);\n}\n\nexport function loadVirtualModule(\n\tid: string,\n\tstate: PluginState\n): string | undefined {\n\tconst normalized = nodeNormalizePath(stripQueryAndHash(id));\n\treturn state.virtualModules.get(normalized);\n}\n\nfunction stripQueryAndHash(id: string): string {\n\tconst queryIndex = id.indexOf(\"?\");\n\tconst hashIndex = id.indexOf(\"#\");\n\tlet end = id.length;\n\tif (queryIndex !== -1) end = Math.min(end, queryIndex);\n\tif (hashIndex !== -1) end = Math.min(end, hashIndex);\n\treturn id.slice(0, end);\n}\n\nexport { logger };\n"]}
|
|
1
|
+
{"version":3,"file":"plugin-core.js","sourceRoot":"","sources":["../../src/bundler-plugins/plugin-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport nodeFs from \"node:fs\";\nimport path from \"node:path\";\nimport { relative } from \"node:path\";\nimport { compile, type CompilationResult } from \"../compiler/compile.js\";\nimport type { CompilerOptions } from \"../compiler/compiler-options.js\";\nimport { buildVirtualModules } from \"../compiler/emit-files.js\";\nimport { seedPreviousCompilationFromOutdir } from \"../compiler/seed-previous-compilation.js\";\nimport { ENV_VARIABLES } from \"../services/env-variables/index.js\";\nimport { Logger } from \"../services/logger/index.js\";\nimport { readDirectoryOutput } from \"../services/file-handling/write-output.js\";\nimport {\n\tcreateTrackedFs,\n\tgetWatchTargets,\n\tisPathWithinDirectories,\n} from \"../services/file-watching/tracked-fs.js\";\nimport { nodeNormalizePath } from \"../utilities/node-normalize-path.js\";\n\nexport const PLUGIN_NAME = \"unplugin-paraglide-lite\";\n\nconst logger = new Logger();\n\nconst PERSISTENT_CACHE_VERSION = 1;\n\ntype PersistentCompilationCache = {\n\tversion: typeof PERSISTENT_CACHE_VERSION;\n\tcompilerVersion: string;\n\tinputsDigest: string;\n\treadFiles: string[];\n\toutputHashes: Record<string, string>;\n};\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t!Array.isArray(value) &&\n\t\tObject.values(value).every((entry) => typeof entry === \"string\")\n\t);\n}\n\nexport type PluginState = {\n\t/** Identity of the fs the tracked wrapper was created around. */\n\tbaseFs: typeof nodeFs | undefined;\n\ttrackedFs: typeof nodeFs;\n\treadFiles: Set<string>;\n\tclearReadFiles: () => void;\n\tpreviousCompilation: CompilationResult | undefined;\n\t/**\n\t * Digest of the input files and options of the last successful compilation.\n\t *\n\t * `vite build` fires `buildStart` once per environment (client, ssr, ...).\n\t * When the digest of the current inputs matches, `compile()` is skipped\n\t * entirely — project loading and message compilation are expensive even\n\t * when `previousCompilation` dedupes the writes.\n\t *\n\t * https://github.com/opral/paraglide-js/issues/693\n\t */\n\tpreviousInputsDigest: string | undefined;\n\t/** Absolute path → generated JS source for resolveId/load. */\n\tvirtualModules: Map<string, string>;\n\t/** Absolute outdir used to build virtualModules. */\n\tabsoluteOutdir: string;\n};\n\n// Module-scoped so the warm state survives plugin re-instantiation within\n// one process (e.g. a vite config reload), but recreated when a different\n// fs is passed — the tracked wrapper, read set, and cached compilation are\n// only valid for the filesystem they were produced from.\nlet pluginState: PluginState | undefined;\n\n/**\n * Default isServer which differs per bundler. Mutated by Vite hooks.\n */\nexport let isServerExpression: string | undefined;\n\nexport function setIsServerExpression(value: string | undefined): void {\n\tisServerExpression = value;\n}\n\nexport function getPluginState(args: CompilerOptions): PluginState {\n\tif (pluginState === undefined || pluginState.baseFs !== args.fs) {\n\t\tconst tracked = createTrackedFs({ fs: args.fs });\n\t\tpluginState = {\n\t\t\tbaseFs: args.fs,\n\t\t\ttrackedFs: tracked.fs,\n\t\t\treadFiles: tracked.readFiles,\n\t\t\tclearReadFiles: tracked.clearReadFiles,\n\t\t\tpreviousCompilation: undefined,\n\t\t\tpreviousInputsDigest: undefined,\n\t\t\tvirtualModules: new Map(),\n\t\t\tabsoluteOutdir: path.resolve(process.cwd(), args.outdir),\n\t\t};\n\t}\n\treturn pluginState;\n}\n\n/** @internal test helper */\nexport function resetPluginStateForTests(): void {\n\tpluginState = undefined;\n\tisServerExpression = undefined;\n}\n\nexport function withoutCleanOutdir(\n\targs: CompilerOptions\n): Omit<CompilerOptions, \"cleanOutdir\"> {\n\tconst { cleanOutdir, ...compileArgs } = args;\n\tvoid cleanOutdir;\n\treturn compileArgs;\n}\n\nexport function resolveOutputStructure(\n\targs: CompilerOptions\n): NonNullable<CompilerOptions[\"outputStructure\"]> {\n\tconst isProduction = process.env.NODE_ENV === \"production\";\n\treturn (\n\t\targs.outputStructure ??\n\t\t(isProduction ? \"message-modules\" : \"locale-modules\")\n\t);\n}\n\nfunction getCompilerConfig(\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n) {\n\tconst { fs: _fs, ...serializableArgs } = args;\n\tvoid _fs;\n\treturn {\n\t\t...serializableArgs,\n\t\toutputStructure,\n\t\tisServer: isServerExpression,\n\t\tcompilerVersion: ENV_VARIABLES.PARJS_PACKAGE_VERSION,\n\t};\n}\n\nfunction getPersistentCachePath(\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n): string {\n\tconst absoluteOutdir = path.resolve(process.cwd(), args.outdir);\n\tconst cacheKey = createHash(\"sha256\")\n\t\t.update(\n\t\t\tJSON.stringify({\n\t\t\t\tabsoluteOutdir,\n\t\t\t\tcompilerConfig: getCompilerConfig(args, outputStructure),\n\t\t\t})\n\t\t)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 16);\n\treturn path.resolve(\n\t\tprocess.cwd(),\n\t\t\".paraglide-lite\",\n\t\t\"cache\",\n\t\t`${cacheKey}.json`\n\t);\n}\n\nasync function readPersistentCache(\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n): Promise<PersistentCompilationCache | undefined> {\n\tconst fsp = (args.fs ?? nodeFs).promises;\n\ttry {\n\t\tconst parsed = JSON.parse(\n\t\t\tawait fsp.readFile(getPersistentCachePath(args, outputStructure), \"utf8\")\n\t\t) as Partial<PersistentCompilationCache>;\n\t\tif (\n\t\t\tparsed.version !== PERSISTENT_CACHE_VERSION ||\n\t\t\tparsed.compilerVersion !== ENV_VARIABLES.PARJS_PACKAGE_VERSION ||\n\t\t\ttypeof parsed.inputsDigest !== \"string\" ||\n\t\t\t!Array.isArray(parsed.readFiles) ||\n\t\t\tparsed.readFiles.some((file) => typeof file !== \"string\") ||\n\t\t\t!isStringRecord(parsed.outputHashes)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn parsed as PersistentCompilationCache;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function preparePersistentCacheDirectory(\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n): Promise<void> {\n\ttry {\n\t\tawait (args.fs ?? nodeFs).promises.mkdir(\n\t\t\tpath.dirname(getPersistentCachePath(args, outputStructure)),\n\t\t\t{ recursive: true }\n\t\t);\n\t} catch {\n\t\t// The cache is an optimization. Read-only projects must still compile.\n\t}\n}\n\nasync function writePersistentCache(\n\tstate: PluginState,\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n): Promise<void> {\n\tif (\n\t\tstate.previousInputsDigest === undefined ||\n\t\tstate.previousCompilation?.outputHashes === undefined\n\t) {\n\t\treturn;\n\t}\n\tconst cachePath = getPersistentCachePath(args, outputStructure);\n\tconst cache: PersistentCompilationCache = {\n\t\tversion: PERSISTENT_CACHE_VERSION,\n\t\tcompilerVersion: ENV_VARIABLES.PARJS_PACKAGE_VERSION,\n\t\tinputsDigest: state.previousInputsDigest,\n\t\treadFiles: [...state.readFiles].sort(),\n\t\toutputHashes: state.previousCompilation.outputHashes,\n\t};\n\tconst fsp = (args.fs ?? nodeFs).promises;\n\ttry {\n\t\tawait fsp.mkdir(path.dirname(cachePath), { recursive: true });\n\t\tawait fsp.writeFile(cachePath, JSON.stringify(cache));\n\t} catch {\n\t\t// The cache is an optimization. Read-only projects must still compile.\n\t}\n}\n\nfunction outputHashesMatch(\n\tleft: Record<string, string> | undefined,\n\tright: Record<string, string>\n): boolean {\n\tif (left === undefined) return false;\n\tconst leftEntries = Object.entries(left);\n\tconst rightEntries = Object.entries(right);\n\tif (leftEntries.length !== rightEntries.length) return false;\n\treturn leftEntries.every(([file, hash]) => right[file] === hash);\n}\n\nasync function restorePersistentCache(args: {\n\tstate: PluginState;\n\tcompilerOptions: CompilerOptions;\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>;\n}): Promise<boolean> {\n\tconst cached = await readPersistentCache(\n\t\targs.compilerOptions,\n\t\targs.outputStructure\n\t);\n\tif (cached === undefined) return false;\n\n\tconst cachedReadFiles = new Set<string>();\n\tfor (const file of cached.readFiles) {\n\t\tcachedReadFiles.add(file);\n\t}\n\tconst validationState: PluginState = {\n\t\t...args.state,\n\t\treadFiles: cachedReadFiles,\n\t\tclearReadFiles: () => cachedReadFiles.clear(),\n\t};\n\tconst [inputsDigest, previousCompilation, diskOutput] = await Promise.all([\n\t\tcomputeInputsDigest(\n\t\t\tvalidationState,\n\t\t\targs.compilerOptions,\n\t\t\targs.outputStructure\n\t\t),\n\t\tseedPreviousCompilationFromOutdir({\n\t\t\toutdir: args.compilerOptions.outdir,\n\t\t\tfs: args.compilerOptions.fs?.promises,\n\t\t}),\n\t\treadDirectoryOutput(\n\t\t\tpath.resolve(process.cwd(), args.compilerOptions.outdir),\n\t\t\targs.compilerOptions.fs?.promises ?? nodeFs.promises\n\t\t),\n\t]);\n\tif (\n\t\tinputsDigest !== cached.inputsDigest ||\n\t\t!outputHashesMatch(previousCompilation?.outputHashes, cached.outputHashes)\n\t) {\n\t\treturn false;\n\t}\n\n\targs.state.clearReadFiles();\n\tfor (const file of cachedReadFiles) {\n\t\targs.state.readFiles.add(file);\n\t}\n\targs.state.previousCompilation = {\n\t\toutputHashes: previousCompilation?.outputHashes,\n\t\toutput: diskOutput ?? {},\n\t};\n\targs.state.previousInputsDigest = inputsDigest;\n\tupdateVirtualModules(args.state, args.compilerOptions, {\n\t\toutputHashes: previousCompilation?.outputHashes,\n\t\toutput: diskOutput ?? {},\n\t});\n\treturn true;\n}\n\n/**\n * Hashes the files (and directory listings) the last compilation read,\n * together with the options that affect the output. Returns `undefined`\n * when the digest can't be computed (no tracked reads yet, an unexpected\n * read error, ...) — `undefined` never matches, so the caller compiles.\n */\nexport async function computeInputsDigest(\n\tstate: PluginState,\n\targs: CompilerOptions,\n\toutputStructure: NonNullable<CompilerOptions[\"outputStructure\"]>\n): Promise<string | undefined> {\n\tif (state.readFiles.size === 0) {\n\t\treturn undefined;\n\t}\n\tconst targets = getWatchTargets(state.readFiles, { outdir: args.outdir });\n\tif (targets.files.size === 0) {\n\t\treturn undefined;\n\t}\n\tconst fsp = (args.fs ?? nodeFs).promises;\n\tconst hash = createHash(\"sha256\");\n\ttry {\n\t\thash.update(JSON.stringify(getCompilerConfig(args, outputStructure)));\n\t\tfor (const directoryPath of [...targets.directories].sort()) {\n\t\t\tconst entries = await fsp\n\t\t\t\t.readdir(directoryPath)\n\t\t\t\t.catch(rethrowUnlessEnoent);\n\t\t\thash.update(`\\0dir:${directoryPath.length}:${directoryPath}:`);\n\t\t\tif (entries === undefined) {\n\t\t\t\thash.update(\"missing\");\n\t\t\t} else {\n\t\t\t\tfor (const entry of [...entries].sort()) {\n\t\t\t\t\thash.update(`${entry.length}:${entry},`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const filePath of [...targets.files].sort()) {\n\t\t\tconst content = await fsp.readFile(filePath).catch(rethrowUnlessEnoent);\n\t\t\thash.update(`\\0file:${filePath.length}:${filePath}:`);\n\t\t\tif (content === undefined) {\n\t\t\t\thash.update(\"missing\");\n\t\t\t} else {\n\t\t\t\thash.update(`${content.length}:`);\n\t\t\t\thash.update(content);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn undefined;\n\t}\n\treturn hash.digest(\"hex\");\n}\n\nfunction rethrowUnlessEnoent(error: unknown): undefined {\n\tif ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n\t\treturn undefined;\n\t}\n\tthrow error;\n}\n\nexport type AddWatchFile = (id: string) => void;\n\nexport async function compileFromBuildStart(args: {\n\tcompilerOptions: CompilerOptions;\n\tstate: PluginState;\n\taddWatchFile: AddWatchFile;\n\t/** Force full disk emit (CLI / per-locale builds). */\n\tforceEmitFiles?: true;\n}): Promise<void> {\n\tconst { state, compilerOptions: userArgs } = args;\n\tconst compilerOptions: CompilerOptions = args.forceEmitFiles\n\t\t? { ...userArgs, emitFiles: true }\n\t\t: userArgs;\n\tconst { trackedFs, readFiles } = state;\n\tconst outputStructure = resolveOutputStructure(compilerOptions);\n\tconst isProduction = process.env.NODE_ENV === \"production\";\n\n\ttry {\n\t\tawait preparePersistentCacheDirectory(compilerOptions, outputStructure);\n\t\tif (\n\t\t\tstate.previousCompilation === undefined &&\n\t\t\t(await restorePersistentCache({\n\t\t\t\tstate,\n\t\t\t\tcompilerOptions,\n\t\t\t\toutputStructure,\n\t\t\t}))\n\t\t) {\n\t\t\tlogger.info(\n\t\t\t\t`Compilation skipped — inputs unchanged (${outputStructure})`\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (state.previousCompilation && state.previousInputsDigest) {\n\t\t\tconst currentDigest = await computeInputsDigest(\n\t\t\t\tstate,\n\t\t\t\tcompilerOptions,\n\t\t\t\toutputStructure\n\t\t\t);\n\t\t\tif (currentDigest === state.previousInputsDigest) {\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Compilation skipped — inputs unchanged (${outputStructure})`\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst seededPrevious =\n\t\t\tstate.previousCompilation ??\n\t\t\t(await seedPreviousCompilationFromOutdir({\n\t\t\t\toutdir: compilerOptions.outdir,\n\t\t\t\tfs: compilerOptions.fs?.promises,\n\t\t\t}));\n\n\t\tconst result = await compile({\n\t\t\tpreviousCompilation: seededPrevious,\n\t\t\toutputStructure,\n\t\t\tisServer: isServerExpression,\n\t\t\t...withoutCleanOutdir(compilerOptions),\n\t\t\tcleanOutdir: false,\n\t\t\tfs: trackedFs,\n\t\t});\n\n\t\tupdateVirtualModules(state, compilerOptions, result);\n\t\tstate.previousCompilation = result;\n\t\tstate.previousInputsDigest = await computeInputsDigest(\n\t\t\tstate,\n\t\t\tcompilerOptions,\n\t\t\toutputStructure\n\t\t);\n\t\tawait writePersistentCache(state, compilerOptions, outputStructure);\n\t\tlogger.success(`Compilation complete (${outputStructure})`);\n\t} catch (error) {\n\t\tstate.previousInputsDigest = undefined;\n\t\tlogger.error(\"Failed to compile project:\", (error as Error).message);\n\t\tlogger.info(\"Please check your translation files for syntax errors.\");\n\t\tif (isProduction) throw error;\n\t} finally {\n\t\tconst targets = getWatchTargets(readFiles, {\n\t\t\toutdir: compilerOptions.outdir,\n\t\t});\n\t\tfor (const filePath of targets.files) {\n\t\t\targs.addWatchFile(filePath);\n\t\t}\n\t\tfor (const directoryPath of targets.directories) {\n\t\t\targs.addWatchFile(directoryPath);\n\t\t}\n\t}\n}\n\nexport async function compileFromWatchChange(args: {\n\tcompilerOptions: CompilerOptions;\n\tstate: PluginState;\n\tchangedPath: string;\n\taddWatchFile: AddWatchFile;\n\tforceEmitFiles?: true;\n}): Promise<void> {\n\tconst { state } = args;\n\tconst compilerOptions: CompilerOptions = args.forceEmitFiles\n\t\t? { ...args.compilerOptions, emitFiles: true }\n\t\t: args.compilerOptions;\n\tconst { trackedFs, readFiles, clearReadFiles } = state;\n\tconst normalizedPath = nodeNormalizePath(args.changedPath);\n\tconst targets = getWatchTargets(readFiles, {\n\t\toutdir: compilerOptions.outdir,\n\t});\n\tif (targets.isIgnoredPath(normalizedPath)) {\n\t\treturn;\n\t}\n\tconst shouldCompile =\n\t\ttargets.files.has(normalizedPath) ||\n\t\tisPathWithinDirectories(normalizedPath, targets.directories);\n\tif (shouldCompile === false) {\n\t\treturn;\n\t}\n\n\tconst outputStructure = resolveOutputStructure(compilerOptions);\n\tconst previouslyReadFiles = new Set(readFiles);\n\n\ttry {\n\t\tlogger.info(\n\t\t\t`Re-compiling messages... File \"${relative(process.cwd(), args.changedPath)}\" has changed.`\n\t\t);\n\n\t\tclearReadFiles();\n\n\t\tconst result = await compile({\n\t\t\tpreviousCompilation: state.previousCompilation,\n\t\t\toutputStructure,\n\t\t\tisServer: isServerExpression,\n\t\t\t...withoutCleanOutdir(compilerOptions),\n\t\t\tcleanOutdir: false,\n\t\t\tfs: trackedFs,\n\t\t});\n\n\t\tupdateVirtualModules(state, compilerOptions, result);\n\t\tstate.previousCompilation = result;\n\t\tstate.previousInputsDigest = await computeInputsDigest(\n\t\t\tstate,\n\t\t\tcompilerOptions,\n\t\t\toutputStructure\n\t\t);\n\t\tawait writePersistentCache(state, compilerOptions, outputStructure);\n\n\t\tlogger.success(`Re-compilation complete (${outputStructure})`);\n\n\t\tconst nextTargets = getWatchTargets(readFiles, {\n\t\t\toutdir: compilerOptions.outdir,\n\t\t});\n\t\tfor (const filePath of nextTargets.files) {\n\t\t\targs.addWatchFile(filePath);\n\t\t}\n\t\tfor (const directoryPath of nextTargets.directories) {\n\t\t\targs.addWatchFile(directoryPath);\n\t\t}\n\t} catch (e) {\n\t\tclearReadFiles();\n\t\tfor (const filePath of previouslyReadFiles) {\n\t\t\treadFiles.add(filePath);\n\t\t}\n\t\tstate.previousCompilation = undefined;\n\t\tstate.previousInputsDigest = undefined;\n\t\tstate.virtualModules = new Map();\n\t\tlogger.warn(\"Failed to re-compile project:\", (e as Error).message);\n\t}\n}\n\nfunction updateVirtualModules(\n\tstate: PluginState,\n\targs: CompilerOptions,\n\tresult: CompilationResult\n): void {\n\tstate.absoluteOutdir = path.resolve(process.cwd(), args.outdir);\n\tstate.virtualModules = buildVirtualModules(\n\t\targs.outdir,\n\t\tresult.output,\n\t\tprocess.cwd()\n\t);\n}\n\n/**\n * Whether a generated paraglide module is side-effect-free and safe to\n * tree-shake per entry.\n *\n * With `outputStructure: \"message-modules\"` each key is its own file and\n * `messages.js` re-exports them as the `m` barrel. Rolldown can only drop\n * unused barrel re-exports when the modules are known to be pure. Each\n * message file imports `runtime.js`, which has real top-level side effects\n * (`globalThis.__paraglide = …`), so without a purity signal Rolldown packs\n * every message used anywhere in the app into one shared chunk.\n *\n * The compiler emits `messages/package.json` with `sideEffects: false`, but\n * Vite only reads `sideEffects` from package.json on bare package resolves.\n * For `src/paraglide/messages/*.js` resolved by this plugin that walk never\n * happens, and `load()` serves source from memory — so the hook must return\n * `moduleSideEffects: false` explicitly.\n *\n * Scoped to `messages.js` and `messages/` so `runtime.js` (which has real\n * side effects) is unaffected.\n *\n * See https://github.com/opral/paraglide-js/issues/668\n */\nexport function isSideEffectFreeParaglideModule(\n\tabsolutePath: string,\n\tabsoluteOutdir: string\n): boolean {\n\tconst normalizedPath = nodeNormalizePath(absolutePath);\n\tconst outdir = nodeNormalizePath(absoluteOutdir);\n\tif (normalizedPath === `${outdir}/messages.js`) {\n\t\treturn true;\n\t}\n\tconst messagesDir = `${outdir}/messages/`;\n\tif (!normalizedPath.startsWith(messagesDir)) {\n\t\treturn false;\n\t}\n\treturn (\n\t\tnormalizedPath.endsWith(\".js\") ||\n\t\tnormalizedPath.endsWith(\".mjs\") ||\n\t\tnormalizedPath.endsWith(\".cjs\")\n\t);\n}\n\nexport type VirtualModuleResolution =\n\tstring | { id: string; moduleSideEffects: false } | undefined;\n\nexport type VirtualModuleLoad =\n\tstring | { code: string; moduleSideEffects: false } | undefined;\n\n/**\n * Resolves an import to a generated paraglide module when present in memory.\n *\n * Only claims ids that resolve to a path under `outdir`. Relative imports from\n * outside outdir (e.g. Svelte's own `./runtime.js`) must not be rewritten.\n *\n * Side-effect-free message modules (`messages.js`, `messages/*.js`) resolve\n * to `{ id, moduleSideEffects: false }` so Rolldown/Vite can tree-shake\n * unused barrel re-exports per entry. `runtime.js` and other generated\n * modules keep default side-effect handling.\n */\nexport function resolveVirtualModuleId(args: {\n\tid: string;\n\timporter: string | undefined;\n\tstate: PluginState;\n}): VirtualModuleResolution {\n\tif (args.state.virtualModules.size === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst bareId = stripQueryAndHash(args.id);\n\tconst candidates: string[] = [];\n\n\tif (path.isAbsolute(bareId)) {\n\t\tcandidates.push(bareId);\n\t} else if (args.importer) {\n\t\tconst importerPath = stripQueryAndHash(args.importer);\n\t\tcandidates.push(path.resolve(path.dirname(importerPath), bareId));\n\t} else {\n\t\tcandidates.push(path.resolve(process.cwd(), bareId));\n\t}\n\n\tconst outdir = nodeNormalizePath(args.state.absoluteOutdir);\n\n\tfor (const candidate of candidates) {\n\t\tconst normalized = nodeNormalizePath(candidate);\n\t\tif (!isPathInsideDirectory(normalized, outdir)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (args.state.virtualModules.has(normalized)) {\n\t\t\treturn toVirtualModuleResolution(normalized, args.state.absoluteOutdir);\n\t\t}\n\t\tif (args.state.virtualModules.has(`${normalized}.js`)) {\n\t\t\treturn toVirtualModuleResolution(\n\t\t\t\t`${normalized}.js`,\n\t\t\t\targs.state.absoluteOutdir\n\t\t\t);\n\t\t}\n\t\tconst indexPath = nodeNormalizePath(path.join(normalized, \"index.js\"));\n\t\tif (\n\t\t\t!normalized.endsWith(\".js\") &&\n\t\t\targs.state.virtualModules.has(indexPath)\n\t\t) {\n\t\t\treturn toVirtualModuleResolution(indexPath, args.state.absoluteOutdir);\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction toVirtualModuleResolution(\n\tresolved: string,\n\tabsoluteOutdir: string\n): VirtualModuleResolution {\n\tif (isSideEffectFreeParaglideModule(resolved, absoluteOutdir)) {\n\t\treturn { id: resolved, moduleSideEffects: false };\n\t}\n\treturn resolved;\n}\n\nfunction isPathInsideDirectory(filePath: string, directory: string): boolean {\n\tconst relativePath = path.relative(directory, filePath);\n\treturn (\n\t\trelativePath === \"\" ||\n\t\t(!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath))\n\t);\n}\n\nexport function loadVirtualModule(\n\tid: string,\n\tstate: PluginState\n): VirtualModuleLoad {\n\tconst normalized = nodeNormalizePath(stripQueryAndHash(id));\n\tconst code = state.virtualModules.get(normalized);\n\tif (code === undefined) {\n\t\treturn undefined;\n\t}\n\tif (isSideEffectFreeParaglideModule(normalized, state.absoluteOutdir)) {\n\t\treturn { code, moduleSideEffects: false };\n\t}\n\treturn code;\n}\n\nfunction stripQueryAndHash(id: string): string {\n\tconst queryIndex = id.indexOf(\"?\");\n\tconst hashIndex = id.indexOf(\"#\");\n\tlet end = id.length;\n\tif (queryIndex !== -1) end = Math.min(end, queryIndex);\n\tif (hashIndex !== -1) end = Math.min(end, hashIndex);\n\treturn id.slice(0, end);\n}\n\nexport { logger };\n"]}
|
|
@@ -28,12 +28,21 @@ test("rolldown plugin compiles and serves virtual modules without writing js", a
|
|
|
28
28
|
// memfs isn't used by rolldown's real FS — write entry + messages to a
|
|
29
29
|
// temp approach: instead assert resolveId/load from the plugin directly.
|
|
30
30
|
const resolved = plugin.resolveId?.(`${outdir}/messages.js`, entryPath);
|
|
31
|
-
expect(resolved).
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
expect(resolved).toEqual({
|
|
32
|
+
id: path.resolve(outdir, "messages.js"),
|
|
33
|
+
moduleSideEffects: false,
|
|
34
|
+
});
|
|
35
|
+
const resolvedId = typeof resolved === "string" ? resolved : resolved.id;
|
|
36
|
+
const loaded = plugin.load?.(resolvedId);
|
|
37
|
+
expect(typeof loaded === "object" ? loaded.code : loaded).toContain("messages/_index.js");
|
|
38
|
+
const indexResolved = plugin.resolveId?.("./messages/_index.js", resolvedId);
|
|
39
|
+
expect(indexResolved).toEqual({
|
|
40
|
+
id: path.resolve(outdir, "messages/_index.js"),
|
|
41
|
+
moduleSideEffects: false,
|
|
42
|
+
});
|
|
43
|
+
const indexId = typeof indexResolved === "string" ? indexResolved : indexResolved.id;
|
|
44
|
+
const indexLoaded = plugin.load?.(indexId);
|
|
45
|
+
expect(typeof indexLoaded === "object" ? indexLoaded.code : indexLoaded).toContain("hello");
|
|
37
46
|
});
|
|
38
47
|
test("rolldown can bundle with emitFiles true using on-disk output", async () => {
|
|
39
48
|
const { paraglideRolldownPlugin } = await import("./rolldown.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rolldown.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/rolldown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EACN,kBAAkB,EAClB,2BAA2B,GAC3B,MAAM,6BAA6B,CAAC;AAErC,UAAU,CAAC,GAAG,EAAE;IACf,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACzF,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAElE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC;IAE/B,MAAM,MAAM,GAAG,uBAAuB,CAAC;QACtC,GAAG,2BAA2B;QAC9B,MAAM;QACN,SAAS,EAAE,KAAK;QAChB,EAAE;KACF,CAAC,CAAC;IAEH,+CAA+C;IAC/C,MAAO,MAAc,CAAC,UAAU,EAAE,IAAI,CAAC;QACtC,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;KACtB,CAAC,CAAC;IAEH,MAAM,MAAM,CACX,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAChE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAEpB,uDAAuD;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC;IAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAC1B,SAAS,EACT,0BAA0B,MAAM,yCAAyC,CACzE,CAAC;IAEF,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,QAAQ,GAAI,MAAc,CAAC,SAAS,EAAE,CAC3C,GAAG,MAAM,cAAc,EACvB,SAAS,CACT,CAAC;IACF,MAAM,CAAC,QAAQ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"rolldown.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/rolldown.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, expect, test, vi } from \"vitest\";\nimport consola from \"consola\";\nimport path from \"node:path\";\nimport { rolldown } from \"rolldown\";\nimport {\n\tcreatePluginTestFs,\n\tdefaultPluginCompileOptions,\n} from \"../compiler/test-helpers.js\";\n\nbeforeEach(() => {\n\tvi.resetModules();\n\tconsola.mockTypes(() => vi.fn());\n});\n\ntest(\"rolldown plugin compiles and serves virtual modules without writing js\", async () => {\n\tconst { paraglideRolldownPlugin } = await import(\"./rolldown.js\");\n\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/rolldown-out\";\n\n\tconst plugin = paraglideRolldownPlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: false,\n\t\tfs,\n\t});\n\n\t// Drive buildStart the same way Rolldown would\n\tawait (plugin as any).buildStart?.call({\n\t\taddWatchFile: () => {},\n\t});\n\n\tawait expect(\n\t\tfs.promises.readFile(path.resolve(outdir, \"runtime.js\"), \"utf8\")\n\t).rejects.toThrow();\n\n\t// Bundle an entry that imports from the virtual outdir\n\tconst entryPath = \"/entry.js\";\n\tawait fs.promises.writeFile(\n\t\tentryPath,\n\t\t`import { hello } from \"${outdir}/messages.js\";\\nexport default hello;\\n`\n\t);\n\n\t// memfs isn't used by rolldown's real FS — write entry + messages to a\n\t// temp approach: instead assert resolveId/load from the plugin directly.\n\tconst resolved = (plugin as any).resolveId?.(\n\t\t`${outdir}/messages.js`,\n\t\tentryPath\n\t);\n\texpect(resolved).toEqual({\n\t\tid: path.resolve(outdir, \"messages.js\"),\n\t\tmoduleSideEffects: false,\n\t});\n\tconst resolvedId = typeof resolved === \"string\" ? resolved : resolved.id;\n\tconst loaded = (plugin as any).load?.(resolvedId);\n\texpect(typeof loaded === \"object\" ? loaded.code : loaded).toContain(\n\t\t\"messages/_index.js\"\n\t);\n\n\tconst indexResolved = (plugin as any).resolveId?.(\n\t\t\"./messages/_index.js\",\n\t\tresolvedId\n\t);\n\texpect(indexResolved).toEqual({\n\t\tid: path.resolve(outdir, \"messages/_index.js\"),\n\t\tmoduleSideEffects: false,\n\t});\n\tconst indexId =\n\t\ttypeof indexResolved === \"string\" ? indexResolved : indexResolved.id;\n\tconst indexLoaded = (plugin as any).load?.(indexId);\n\texpect(\n\t\ttypeof indexLoaded === \"object\" ? indexLoaded.code : indexLoaded\n\t).toContain(\"hello\");\n});\n\ntest(\"rolldown can bundle with emitFiles true using on-disk output\", async () => {\n\tconst { paraglideRolldownPlugin } = await import(\"./rolldown.js\");\n\tconst { mkdtemp, writeFile, mkdir, rm, readFile } = await import(\n\t\t\"node:fs/promises\"\n\t);\n\tconst { tmpdir } = await import(\"node:os\");\n\n\tconst root = await mkdtemp(path.join(tmpdir(), \"paraglide-rolldown-\"));\n\ttry {\n\t\tconst messagesDir = path.join(root, \"messages\");\n\t\tconst outdir = path.join(root, \"paraglide\");\n\t\tconst entry = path.join(root, \"entry.js\");\n\t\tawait mkdir(messagesDir, { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath.join(messagesDir, \"en.json\"),\n\t\t\tJSON.stringify({ hello: \"Hello {name}\" })\n\t\t);\n\t\tawait writeFile(\n\t\t\tpath.join(messagesDir, \"de.json\"),\n\t\t\tJSON.stringify({ hello: \"Hallo {name}\" })\n\t\t);\n\t\tawait writeFile(\n\t\t\tentry,\n\t\t\t`import * as m from \"./paraglide/messages.js\";\\nexport const text = m.hello({ name: \"Ada\" });\\n`\n\t\t);\n\n\t\tconst plugin = paraglideRolldownPlugin({\n\t\t\tmessages: path.join(messagesDir, \"{locale}.json\"),\n\t\t\tlocales: [\"en\", \"de\"],\n\t\t\tbaseLocale: \"en\",\n\t\t\toutdir,\n\t\t\temitFiles: true,\n\t\t\toutputStructure: \"locale-modules\",\n\t\t});\n\n\t\tconst bundle = await rolldown({\n\t\t\tinput: entry,\n\t\t\tplugins: [plugin],\n\t\t});\n\t\tconst { output } = await bundle.generate({ format: \"esm\" });\n\t\tconst code = output.map((chunk) => (\"code\" in chunk ? chunk.code : \"\")).join(\n\t\t\t\"\\n\"\n\t\t);\n\t\texpect(code).toMatch(/Hello|Ada/);\n\t\tawait expect(readFile(path.join(outdir, \"runtime.js\"), \"utf8\")).resolves.toBeTruthy();\n\t} finally {\n\t\tawait rm(root, { recursive: true, force: true });\n\t}\n});\n"]}
|
|
@@ -20,9 +20,14 @@ export const unpluginFactory = (args) => {
|
|
|
20
20
|
});
|
|
21
21
|
},
|
|
22
22
|
resolveId(id, importer) {
|
|
23
|
+
// `resolveVirtualModuleId` returns `{ id, moduleSideEffects: false }`
|
|
24
|
+
// for side-effect-free message modules. Unplugin's types only allow
|
|
25
|
+
// `string | { id, external }`, but the object is forwarded as-is to
|
|
26
|
+
// Rollup/Vite/Rolldown, which honor `moduleSideEffects`.
|
|
23
27
|
return resolveVirtualModuleId({ id, importer, state });
|
|
24
28
|
},
|
|
25
29
|
load(id) {
|
|
30
|
+
// Same passthrough for `{ code, moduleSideEffects: false }`.
|
|
26
31
|
return loadVirtualModule(id, state);
|
|
27
32
|
},
|
|
28
33
|
vite: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unplugin.js","sourceRoot":"","sources":["../../src/bundler-plugins/unplugin.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,eAAe,GAAqC,CAAC,IAAI,EAAE,EAAE;IACzE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK;QACd,KAAK,CAAC,UAAU;YACf,MAAM,qBAAqB,CAAC;gBAC3B,eAAe,EAAE,IAAI;gBACrB,KAAK;gBACL,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;aAC3C,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,WAAW;YAC5B,MAAM,sBAAsB,CAAC;gBAC5B,eAAe,EAAE,IAAI;gBACrB,KAAK;gBACL,WAAW;gBACX,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;aAC3C,CAAC,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,EAAE,EAAE,QAAQ;YACrB,OAAO,sBAAsB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"unplugin.js","sourceRoot":"","sources":["../../src/bundler-plugins/unplugin.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,eAAe,GAAqC,CAAC,IAAI,EAAE,EAAE;IACzE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK;QACd,KAAK,CAAC,UAAU;YACf,MAAM,qBAAqB,CAAC;gBAC3B,eAAe,EAAE,IAAI;gBACrB,KAAK;gBACL,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;aAC3C,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,WAAW;YAC5B,MAAM,sBAAsB,CAAC;gBAC5B,eAAe,EAAE,IAAI;gBACrB,KAAK;gBACL,WAAW;gBACX,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;aAC3C,CAAC,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,EAAE,EAAE,QAAQ;YACrB,sEAAsE;YACtE,oEAAoE;YACpE,oEAAoE;YACpE,yDAAyD;YACzD,OAAO,sBAAsB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAClC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,EAAE;YACN,6DAA6D;YAC7D,OAAO,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAkC,CAAC;QACtE,CAAC;QACD,IAAI,EAAE;YACL,MAAM,EAAE;gBACP,OAAO,EAAE,GAAG,EAAE;oBACb,qBAAqB,CACpB,uDAAuD,CACvD,CAAC;gBACH,CAAC;aACD;YACD,iBAAiB,EAAE;gBAClB,OAAO,EAAE,GAAG,EAAE;oBACb,qBAAqB,CACpB,uDAAuD,CACvD,CAAC;gBACH,CAAC;aACD;SACD;QACD,OAAO,CAAC,QAAQ;YACf,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG;gBAC1B,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO;gBAC3B,QAAQ,EAAE;oBACT,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ;oBACrC,uCAAuC;oBACvC,WAAW,EAAE,KAAK;oBAClB,kBAAkB,EAAE,KAAK;iBACzB;aACD,CAAC;YAEF,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBAC3D,MAAM,qBAAqB,CAAC;oBAC3B,eAAe,EAAE,IAAI;oBACrB,KAAK;oBACL,gEAAgE;oBAChE,cAAc,EAAE,IAAI;oBACpB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;iBACtB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC;AACH,CAAC,CAAC","sourcesContent":["import type { UnpluginFactory } from \"unplugin\";\nimport type { CompilerOptions } from \"../compiler/compiler-options.js\";\nimport {\n\tPLUGIN_NAME,\n\tcompileFromBuildStart,\n\tcompileFromWatchChange,\n\tgetPluginState,\n\tloadVirtualModule,\n\tresolveVirtualModuleId,\n\tsetIsServerExpression,\n} from \"./plugin-core.js\";\n\nexport const unpluginFactory: UnpluginFactory<CompilerOptions> = (args) => {\n\tconst state = getPluginState(args);\n\treturn {\n\t\tname: PLUGIN_NAME,\n\t\tenforce: \"pre\",\n\t\tasync buildStart() {\n\t\t\tawait compileFromBuildStart({\n\t\t\t\tcompilerOptions: args,\n\t\t\t\tstate,\n\t\t\t\taddWatchFile: (id) => this.addWatchFile(id),\n\t\t\t});\n\t\t},\n\t\tasync watchChange(changedPath) {\n\t\t\tawait compileFromWatchChange({\n\t\t\t\tcompilerOptions: args,\n\t\t\t\tstate,\n\t\t\t\tchangedPath,\n\t\t\t\taddWatchFile: (id) => this.addWatchFile(id),\n\t\t\t});\n\t\t},\n\t\tresolveId(id, importer) {\n\t\t\t// `resolveVirtualModuleId` returns `{ id, moduleSideEffects: false }`\n\t\t\t// for side-effect-free message modules. Unplugin's types only allow\n\t\t\t// `string | { id, external }`, but the object is forwarded as-is to\n\t\t\t// Rollup/Vite/Rolldown, which honor `moduleSideEffects`.\n\t\t\treturn resolveVirtualModuleId({ id, importer, state }) as unknown as\n\t\t\t\tstring | undefined;\n\t\t},\n\t\tload(id) {\n\t\t\t// Same passthrough for `{ code, moduleSideEffects: false }`.\n\t\t\treturn loadVirtualModule(id, state) as unknown as string | undefined;\n\t\t},\n\t\tvite: {\n\t\t\tconfig: {\n\t\t\t\thandler: () => {\n\t\t\t\t\tsetIsServerExpression(\n\t\t\t\t\t\t\"import.meta.env?.SSR ?? typeof window === 'undefined'\"\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t\tconfigEnvironment: {\n\t\t\t\thandler: () => {\n\t\t\t\t\tsetIsServerExpression(\n\t\t\t\t\t\t\"import.meta.env?.SSR ?? typeof window === 'undefined'\"\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\twebpack(compiler) {\n\t\t\tcompiler.options.resolve = {\n\t\t\t\t...compiler.options.resolve,\n\t\t\t\tfallback: {\n\t\t\t\t\t...compiler.options.resolve?.fallback,\n\t\t\t\t\t// https://stackoverflow.com/a/72989932\n\t\t\t\t\tasync_hooks: false,\n\t\t\t\t\t\"node:async_hooks\": false,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tcompiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, async () => {\n\t\t\t\tawait compileFromBuildStart({\n\t\t\t\t\tcompilerOptions: args,\n\t\t\t\t\tstate,\n\t\t\t\t\t// webpack cannot load virtual JS modules reliably — always emit\n\t\t\t\t\tforceEmitFiles: true,\n\t\t\t\t\taddWatchFile: () => {},\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t};\n};\n"]}
|
|
@@ -122,6 +122,73 @@ test("vite plugin warm-restart writes nothing when inputs unchanged (#659)", asy
|
|
|
122
122
|
await plugin2.buildStart?.call(mockContext);
|
|
123
123
|
expect(writeFileSpy).not.toHaveBeenCalled();
|
|
124
124
|
});
|
|
125
|
+
// Regression test for https://github.com/opral/paraglide-js/issues/741:
|
|
126
|
+
// a new Vite process should validate the persisted inputs and output instead
|
|
127
|
+
// of loading the project and compiling every message again.
|
|
128
|
+
test("vite plugin skips compile on an unchanged fresh process (#741)", async () => {
|
|
129
|
+
const actualCompileModule = await vi.importActual("../compiler/compile.js");
|
|
130
|
+
const compileSpy = vi.fn(actualCompileModule.compile);
|
|
131
|
+
vi.doMock("../compiler/compile.js", () => ({
|
|
132
|
+
...actualCompileModule,
|
|
133
|
+
compile: compileSpy,
|
|
134
|
+
}));
|
|
135
|
+
try {
|
|
136
|
+
const fs = createPluginTestFs();
|
|
137
|
+
const options = {
|
|
138
|
+
...defaultPluginCompileOptions,
|
|
139
|
+
outdir: "/test-output",
|
|
140
|
+
emitReadme: true,
|
|
141
|
+
fs,
|
|
142
|
+
};
|
|
143
|
+
const mockContext = { addWatchFile: () => { } };
|
|
144
|
+
const startFreshProcess = async () => {
|
|
145
|
+
vi.resetModules();
|
|
146
|
+
const { paraglideVitePlugin } = await import("../bundler-plugins/vite.js");
|
|
147
|
+
const plugin = paraglideVitePlugin(options);
|
|
148
|
+
await plugin.buildStart?.call(mockContext);
|
|
149
|
+
};
|
|
150
|
+
await startFreshProcess();
|
|
151
|
+
expect(compileSpy).toHaveBeenCalledTimes(1);
|
|
152
|
+
// The persisted cache makes the unchanged cold restart skip compile().
|
|
153
|
+
await startFreshProcess();
|
|
154
|
+
expect(compileSpy).toHaveBeenCalledTimes(1);
|
|
155
|
+
// A file added beside a tracked message input invalidates the cache.
|
|
156
|
+
await fs.promises.writeFile(path.join(path.dirname(testMessageFilePath("en")), "new-project-input.txt"), "new");
|
|
157
|
+
await startFreshProcess();
|
|
158
|
+
expect(compileSpy).toHaveBeenCalledTimes(2);
|
|
159
|
+
// Compiler options are part of the cache key.
|
|
160
|
+
options.emitReadme = false;
|
|
161
|
+
await startFreshProcess();
|
|
162
|
+
expect(compileSpy).toHaveBeenCalledTimes(3);
|
|
163
|
+
// Generated output is validated too, so edited output self-repairs.
|
|
164
|
+
await fs.promises.writeFile("/test-output/runtime.js", "tampered");
|
|
165
|
+
await startFreshProcess();
|
|
166
|
+
expect(compileSpy).toHaveBeenCalledTimes(4);
|
|
167
|
+
expect(await fs.promises.readFile("/test-output/runtime.js", "utf8")).not.toBe("tampered");
|
|
168
|
+
// A compiler version change invalidates the persisted cache.
|
|
169
|
+
const cacheDirectory = path.resolve(process.cwd(), ".paraglide-lite/cache");
|
|
170
|
+
for (const cacheFile of await fs.promises.readdir(cacheDirectory)) {
|
|
171
|
+
const cachePath = `${cacheDirectory}/${cacheFile}`;
|
|
172
|
+
const cache = JSON.parse(await fs.promises.readFile(cachePath, "utf8"));
|
|
173
|
+
cache.compilerVersion = "0.0.0-stale";
|
|
174
|
+
await fs.promises.writeFile(cachePath, JSON.stringify(cache));
|
|
175
|
+
}
|
|
176
|
+
await startFreshProcess();
|
|
177
|
+
expect(compileSpy).toHaveBeenCalledTimes(5);
|
|
178
|
+
// A syntactically valid but malformed cache is treated as a miss.
|
|
179
|
+
for (const cacheFile of await fs.promises.readdir(cacheDirectory)) {
|
|
180
|
+
const cachePath = `${cacheDirectory}/${cacheFile}`;
|
|
181
|
+
const cache = JSON.parse(await fs.promises.readFile(cachePath, "utf8"));
|
|
182
|
+
cache.outputHashes = null;
|
|
183
|
+
await fs.promises.writeFile(cachePath, JSON.stringify(cache));
|
|
184
|
+
}
|
|
185
|
+
await startFreshProcess();
|
|
186
|
+
expect(compileSpy).toHaveBeenCalledTimes(6);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
vi.doUnmock("../compiler/compile.js");
|
|
190
|
+
}
|
|
191
|
+
});
|
|
125
192
|
// Regression test for https://github.com/opral/paraglide-js/issues/693:
|
|
126
193
|
// `vite build` fires buildStart once per environment (client, ssr) and each
|
|
127
194
|
// run used to do a full compile() — project loading + message compilation —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unplugin.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/unplugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect, beforeEach, afterEach, vi } from \"vitest\";\nimport consola from \"consola\";\nimport path from \"node:path\";\nimport { memfs } from \"memfs\";\nimport { createPluginTestFs, defaultPluginCompileOptions, testMessageFilePath } from \"../compiler/test-helpers.js\";\n\nlet originalNodeEnv: string | undefined;\n\nbeforeEach(() => {\n\toriginalNodeEnv = process.env.NODE_ENV;\n\n\t// Reset module state between tests so the module-scoped\n\t// `previousCompilation` doesn't leak across tests.\n\tvi.resetModules();\n\n\t// Mock logging methods to suppress error messages in tests\n\tconsola.mockTypes(() => vi.fn());\n});\n\nafterEach(() => {\n\tif (originalNodeEnv !== undefined) {\n\t\tprocess.env.NODE_ENV = originalNodeEnv;\n\t} else {\n\t\tdelete process.env.NODE_ENV;\n\t}\n});\n\ntest(\"vite plugin does not throw when compilation is successful\", async () => {\n\t// Dynamic import so beforeEach's vi.resetModules() yields a fresh module\n\t// (a static import would share module state across tests).\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\t// Create and save a viable project to the virtual file system\n\tconst fs = createPluginTestFs();\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin does not throw on compilation errors in development\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"development\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tmessages: \"./missing/{locale}.json\", locales: [\"en\"], baseLocale: \"en\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In development mode - should catch errors and NOT throw\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin throws on compilation errors at build time\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"production\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tmessages: \"./missing/{locale}.json\", locales: [\"en\"], baseLocale: \"en\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In production mode - should throw the error\n\tawait expect(plugin.buildStart?.call(mockContext)).rejects.toThrow();\n});\n\n// Regression test for https://github.com/opral/inlang-paraglide-js/issues/659:\n// the bundler plugins used to wipe `outdir` on every fresh process, racing\n// concurrent reads (SSR/prerender modules, sibling Vite processes, the\n// config-watcher reload) and producing ENOENT/MISSING_EXPORT/ERR_LOAD_URL.\ntest(\"vite plugin does not wipe outdir during first buildStart (#659)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst fs = createPluginTestFs();\n\n\t// Pre-seed outdir with a sentinel file mimicking a prior compilation\n\t// still on disk from an earlier process.\n\tawait fs.promises.mkdir(\"/test-output\", { recursive: true });\n\tawait fs.promises.writeFile(\"/test-output/__sentinel__.txt\", \"kept\");\n\n\tconst rmSpy = vi.spyOn(fs.promises, \"rm\");\n\n\tconst plugin = vitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tcleanOutdir: true,\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = { addWatchFile: () => {} };\n\tawait plugin.buildStart?.call(mockContext);\n\n\t// The plugin must not recursively remove the outdir during the first\n\t// compile, even though previousCompilation is undefined. Concurrent\n\t// readers may be holding file handles into outdir.\n\tfor (const call of rmSpy.mock.calls) {\n\t\texpect(call[0]).not.toBe(\"/test-output\");\n\t}\n});\n\ntest(\"vite plugin warm-restart writes nothing when inputs unchanged (#659)\", async () => {\n\tconst fs = createPluginTestFs();\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\t// First process: compile and persist files to outdir.\n\t{\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\t\tawait plugin.buildStart?.call(mockContext);\n\t}\n\n\t// Second process: simulate a fresh node process by resetting modules so\n\t// the module-scoped `previousCompilation` is undefined again. The plugin\n\t// should seed from on-disk hashes and write zero files (no race window).\n\tvi.resetModules();\n\tconst { paraglideVitePlugin: vitePluginFresh } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\tconst plugin2 = vitePluginFresh({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst writeFileSpy = vi.spyOn(fs.promises, \"writeFile\");\n\tawait plugin2.buildStart?.call(mockContext);\n\n\texpect(writeFileSpy).not.toHaveBeenCalled();\n});\n\n// Regression test for https://github.com/opral/paraglide-js/issues/693:\n// `vite build` fires buildStart once per environment (client, ssr) and each\n// run used to do a full compile() — project loading + message compilation —\n// even though the inputs hadn't changed.\ntest(\"vite plugin skips compile() when buildStart fires again with unchanged inputs (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst fs = createPluginTestFs();\n\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\t// First environment (e.g. client) compiles.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Second environment (e.g. ssr) — inputs unchanged, compile skipped.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Changing a message file invalidates the digest and recompiles.\n\t\tconst messagePath = testMessageFilePath(\"en\");\n\t\tconst messages = JSON.parse(await fs.promises.readFile(messagePath, \"utf-8\"));\n\t\tmessages.changed = \"trigger recompile\";\n\t\tawait fs.promises.writeFile(messagePath, JSON.stringify(messages));\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// A new file added next to tracked inputs must invalidate the digest via\n// the directory-listing part of the hash, not only edits to known files.\ntest(\"vite plugin recompiles when a file is added to a tracked directory (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst fs = createPluginTestFs();\n\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// No tracked file changed, but the listing of a tracked directory did.\n\t\tawait fs.promises.writeFile(\n\t\t\tpath.join(path.dirname(testMessageFilePath(\"en\")), \"added-later.txt\"),\n\t\t\t\"new\"\n\t\t);\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// After a failed compile the stored digest must not be reused: restoring an\n// input to its previous content has to trigger a real recompile, because the\n// failed attempt may have left no (or partial) output.\ntest(\"vite plugin does not reuse a digest from before a failed compile (#693)\", async () => {\n\tprocess.env.NODE_ENV = \"development\";\n\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst fs = createPluginTestFs();\n\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\tconst messagePath = testMessageFilePath(\"en\");\n\t\tconst originalMessages = await fs.promises.readFile(messagePath, \"utf-8\");\n\n\t\t// Break a message file — the compile attempt fails (dev mode\n\t\t// swallows the error) and must clear the stored digest.\n\t\tawait fs.promises.writeFile(messagePath, \"{ not json\");\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\n\t\t// Restore the exact original content.\n\t\tawait fs.promises.writeFile(messagePath, originalMessages);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(3);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// Two plugin instances with different filesystems must not share the tracked\n// fs wrapper or cached compilation state — each compiles into its own fs.\ntest(\"vite plugin instances with different fs compile against their own fs (#693)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst makeProjectFs = async () => createPluginTestFs();\n\n\tconst fsA = await makeProjectFs();\n\tconst fsB = await makeProjectFs();\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\tconst pluginA = vitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fsA,\n\t}) as any;\n\tawait pluginA.buildStart?.call(mockContext);\n\n\tconst pluginB = vitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fsB,\n\t}) as any;\n\tawait pluginB.buildStart?.call(mockContext);\n\n\t// B's output must exist in B's filesystem — with a shared tracked fs it\n\t// would have been read from and written into A's filesystem instead.\n\tconst outputB = await fsB.promises.readdir(\"/test-output\");\n\texpect(outputB.length).toBeGreaterThan(0);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"unplugin.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/unplugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect, beforeEach, afterEach, vi } from \"vitest\";\nimport consola from \"consola\";\nimport path from \"node:path\";\nimport { memfs } from \"memfs\";\nimport { createPluginTestFs, defaultPluginCompileOptions, testMessageFilePath } from \"../compiler/test-helpers.js\";\n\nlet originalNodeEnv: string | undefined;\n\nbeforeEach(() => {\n\toriginalNodeEnv = process.env.NODE_ENV;\n\n\t// Reset module state between tests so the module-scoped\n\t// `previousCompilation` doesn't leak across tests.\n\tvi.resetModules();\n\n\t// Mock logging methods to suppress error messages in tests\n\tconsola.mockTypes(() => vi.fn());\n});\n\nafterEach(() => {\n\tif (originalNodeEnv !== undefined) {\n\t\tprocess.env.NODE_ENV = originalNodeEnv;\n\t} else {\n\t\tdelete process.env.NODE_ENV;\n\t}\n});\n\ntest(\"vite plugin does not throw when compilation is successful\", async () => {\n\t// Dynamic import so beforeEach's vi.resetModules() yields a fresh module\n\t// (a static import would share module state across tests).\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\t// Create and save a viable project to the virtual file system\n\tconst fs = createPluginTestFs();\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin does not throw on compilation errors in development\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"development\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tmessages: \"./missing/{locale}.json\", locales: [\"en\"], baseLocale: \"en\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In development mode - should catch errors and NOT throw\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin throws on compilation errors at build time\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"production\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tmessages: \"./missing/{locale}.json\", locales: [\"en\"], baseLocale: \"en\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In production mode - should throw the error\n\tawait expect(plugin.buildStart?.call(mockContext)).rejects.toThrow();\n});\n\n// Regression test for https://github.com/opral/inlang-paraglide-js/issues/659:\n// the bundler plugins used to wipe `outdir` on every fresh process, racing\n// concurrent reads (SSR/prerender modules, sibling Vite processes, the\n// config-watcher reload) and producing ENOENT/MISSING_EXPORT/ERR_LOAD_URL.\ntest(\"vite plugin does not wipe outdir during first buildStart (#659)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst fs = createPluginTestFs();\n\n\t// Pre-seed outdir with a sentinel file mimicking a prior compilation\n\t// still on disk from an earlier process.\n\tawait fs.promises.mkdir(\"/test-output\", { recursive: true });\n\tawait fs.promises.writeFile(\"/test-output/__sentinel__.txt\", \"kept\");\n\n\tconst rmSpy = vi.spyOn(fs.promises, \"rm\");\n\n\tconst plugin = vitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tcleanOutdir: true,\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = { addWatchFile: () => {} };\n\tawait plugin.buildStart?.call(mockContext);\n\n\t// The plugin must not recursively remove the outdir during the first\n\t// compile, even though previousCompilation is undefined. Concurrent\n\t// readers may be holding file handles into outdir.\n\tfor (const call of rmSpy.mock.calls) {\n\t\texpect(call[0]).not.toBe(\"/test-output\");\n\t}\n});\n\ntest(\"vite plugin warm-restart writes nothing when inputs unchanged (#659)\", async () => {\n\tconst fs = createPluginTestFs();\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\t// First process: compile and persist files to outdir.\n\t{\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\t\tawait plugin.buildStart?.call(mockContext);\n\t}\n\n\t// Second process: simulate a fresh node process by resetting modules so\n\t// the module-scoped `previousCompilation` is undefined again. The plugin\n\t// should seed from on-disk hashes and write zero files (no race window).\n\tvi.resetModules();\n\tconst { paraglideVitePlugin: vitePluginFresh } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\tconst plugin2 = vitePluginFresh({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst writeFileSpy = vi.spyOn(fs.promises, \"writeFile\");\n\tawait plugin2.buildStart?.call(mockContext);\n\n\texpect(writeFileSpy).not.toHaveBeenCalled();\n});\n\n// Regression test for https://github.com/opral/paraglide-js/issues/741:\n// a new Vite process should validate the persisted inputs and output instead\n// of loading the project and compiling every message again.\ntest(\"vite plugin skips compile on an unchanged fresh process (#741)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst fs = createPluginTestFs();\n\t\tconst options = {\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\temitReadme: true,\n\t\t\tfs,\n\t\t};\n\t\tconst mockContext = { addWatchFile: () => {} };\n\t\tconst startFreshProcess = async () => {\n\t\t\tvi.resetModules();\n\t\t\tconst { paraglideVitePlugin } =\n\t\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\t\t\tconst plugin = paraglideVitePlugin(options) as any;\n\t\t\tawait plugin.buildStart?.call(mockContext);\n\t\t};\n\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// The persisted cache makes the unchanged cold restart skip compile().\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// A file added beside a tracked message input invalidates the cache.\n\t\tawait fs.promises.writeFile(\n\t\t\tpath.join(path.dirname(testMessageFilePath(\"en\")), \"new-project-input.txt\"),\n\t\t\t\"new\"\n\t\t);\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\n\t\t// Compiler options are part of the cache key.\n\t\toptions.emitReadme = false;\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(3);\n\n\t\t// Generated output is validated too, so edited output self-repairs.\n\t\tawait fs.promises.writeFile(\"/test-output/runtime.js\", \"tampered\");\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(4);\n\t\texpect(\n\t\t\tawait fs.promises.readFile(\"/test-output/runtime.js\", \"utf8\")\n\t\t).not.toBe(\"tampered\");\n\n\t\t// A compiler version change invalidates the persisted cache.\n\t\tconst cacheDirectory = path.resolve(process.cwd(), \".paraglide-lite/cache\");\n\t\tfor (const cacheFile of await fs.promises.readdir(cacheDirectory)) {\n\t\t\tconst cachePath = `${cacheDirectory}/${cacheFile}`;\n\t\t\tconst cache = JSON.parse(await fs.promises.readFile(cachePath, \"utf8\"));\n\t\t\tcache.compilerVersion = \"0.0.0-stale\";\n\t\t\tawait fs.promises.writeFile(cachePath, JSON.stringify(cache));\n\t\t}\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(5);\n\n\t\t// A syntactically valid but malformed cache is treated as a miss.\n\t\tfor (const cacheFile of await fs.promises.readdir(cacheDirectory)) {\n\t\t\tconst cachePath = `${cacheDirectory}/${cacheFile}`;\n\t\t\tconst cache = JSON.parse(await fs.promises.readFile(cachePath, \"utf8\"));\n\t\t\tcache.outputHashes = null;\n\t\t\tawait fs.promises.writeFile(cachePath, JSON.stringify(cache));\n\t\t}\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(6);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// Regression test for https://github.com/opral/paraglide-js/issues/693:\n// `vite build` fires buildStart once per environment (client, ssr) and each\n// run used to do a full compile() — project loading + message compilation —\n// even though the inputs hadn't changed.\ntest(\"vite plugin skips compile() when buildStart fires again with unchanged inputs (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst fs = createPluginTestFs();\n\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\t// First environment (e.g. client) compiles.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Second environment (e.g. ssr) — inputs unchanged, compile skipped.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Changing a message file invalidates the digest and recompiles.\n\t\tconst messagePath = testMessageFilePath(\"en\");\n\t\tconst messages = JSON.parse(await fs.promises.readFile(messagePath, \"utf-8\"));\n\t\tmessages.changed = \"trigger recompile\";\n\t\tawait fs.promises.writeFile(messagePath, JSON.stringify(messages));\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// A new file added next to tracked inputs must invalidate the digest via\n// the directory-listing part of the hash, not only edits to known files.\ntest(\"vite plugin recompiles when a file is added to a tracked directory (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst fs = createPluginTestFs();\n\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// No tracked file changed, but the listing of a tracked directory did.\n\t\tawait fs.promises.writeFile(\n\t\t\tpath.join(path.dirname(testMessageFilePath(\"en\")), \"added-later.txt\"),\n\t\t\t\"new\"\n\t\t);\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// After a failed compile the stored digest must not be reused: restoring an\n// input to its previous content has to trigger a real recompile, because the\n// failed attempt may have left no (or partial) output.\ntest(\"vite plugin does not reuse a digest from before a failed compile (#693)\", async () => {\n\tprocess.env.NODE_ENV = \"development\";\n\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst fs = createPluginTestFs();\n\n\t\tconst plugin = vitePlugin({\n\t\t\t...defaultPluginCompileOptions,\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\tconst messagePath = testMessageFilePath(\"en\");\n\t\tconst originalMessages = await fs.promises.readFile(messagePath, \"utf-8\");\n\n\t\t// Break a message file — the compile attempt fails (dev mode\n\t\t// swallows the error) and must clear the stored digest.\n\t\tawait fs.promises.writeFile(messagePath, \"{ not json\");\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\n\t\t// Restore the exact original content.\n\t\tawait fs.promises.writeFile(messagePath, originalMessages);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(3);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// Two plugin instances with different filesystems must not share the tracked\n// fs wrapper or cached compilation state — each compiles into its own fs.\ntest(\"vite plugin instances with different fs compile against their own fs (#693)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst makeProjectFs = async () => createPluginTestFs();\n\n\tconst fsA = await makeProjectFs();\n\tconst fsB = await makeProjectFs();\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\tconst pluginA = vitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fsA,\n\t}) as any;\n\tawait pluginA.buildStart?.call(mockContext);\n\n\tconst pluginB = vitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir: \"/test-output\",\n\t\tfs: fsB,\n\t}) as any;\n\tawait pluginB.buildStart?.call(mockContext);\n\n\t// B's output must exist in B's filesystem — with a shared tracked fs it\n\t// would have been read from and written into A's filesystem instead.\n\tconst outputB = await fsB.promises.readdir(\"/test-output\");\n\texpect(outputB.length).toBeGreaterThan(0);\n});\n"]}
|
|
@@ -31,7 +31,8 @@ test("virtual resolveId/load serve generated js when emitFiles is false", async
|
|
|
31
31
|
state,
|
|
32
32
|
});
|
|
33
33
|
expect(resolved).toBe(runtimePath);
|
|
34
|
-
|
|
34
|
+
const resolvedId = typeof resolved === "string" ? resolved : resolved?.id;
|
|
35
|
+
expect(loadVirtualModule(resolvedId, state)).toContain("export");
|
|
35
36
|
// No JS written to disk
|
|
36
37
|
await expect(fs.promises.readFile(runtimePath, "utf8")).rejects.toThrow();
|
|
37
38
|
});
|
|
@@ -74,4 +75,66 @@ test("emitFiles types writes meta but not js", async () => {
|
|
|
74
75
|
await expect(fs.promises.readFile(path.resolve(outdir, "runtime.js"), "utf8")).rejects.toThrow();
|
|
75
76
|
await expect(fs.promises.readFile(path.resolve(outdir, ".gitignore"), "utf8")).resolves.toBeTruthy();
|
|
76
77
|
});
|
|
78
|
+
test("message modules resolve/load as side-effect-free, runtime.js does not (#668)", async () => {
|
|
79
|
+
const { paraglideVitePlugin } = await import("./vite.js");
|
|
80
|
+
const { resolveVirtualModuleId, loadVirtualModule, getPluginState, } = await import("./plugin-core.js");
|
|
81
|
+
const fs = createPluginTestFs();
|
|
82
|
+
const outdir = "/side-effect-out";
|
|
83
|
+
const plugin = paraglideVitePlugin({
|
|
84
|
+
...defaultPluginCompileOptions,
|
|
85
|
+
outdir,
|
|
86
|
+
emitFiles: false,
|
|
87
|
+
outputStructure: "message-modules",
|
|
88
|
+
fs,
|
|
89
|
+
});
|
|
90
|
+
await plugin.buildStart?.call({ addWatchFile: () => { } });
|
|
91
|
+
const state = getPluginState({
|
|
92
|
+
...defaultPluginCompileOptions,
|
|
93
|
+
outdir,
|
|
94
|
+
fs,
|
|
95
|
+
});
|
|
96
|
+
const messagePath = path.resolve(outdir, "messages/hello.js");
|
|
97
|
+
const messagesBarrel = path.resolve(outdir, "messages.js");
|
|
98
|
+
const messagesIndex = path.resolve(outdir, "messages/_index.js");
|
|
99
|
+
const runtimePath = path.resolve(outdir, "runtime.js");
|
|
100
|
+
// Per-key module is pure
|
|
101
|
+
const messageResolved = resolveVirtualModuleId({
|
|
102
|
+
id: "./messages/hello.js",
|
|
103
|
+
importer: messagesBarrel,
|
|
104
|
+
state,
|
|
105
|
+
});
|
|
106
|
+
expect(messageResolved).toEqual({
|
|
107
|
+
id: messagePath,
|
|
108
|
+
moduleSideEffects: false,
|
|
109
|
+
});
|
|
110
|
+
const messageLoaded = loadVirtualModule(messagePath, state);
|
|
111
|
+
expect(messageLoaded).toMatchObject({ moduleSideEffects: false });
|
|
112
|
+
expect(typeof messageLoaded === "object" ? messageLoaded.code : messageLoaded).toContain("export");
|
|
113
|
+
// messages.js barrel is pure
|
|
114
|
+
expect(resolveVirtualModuleId({
|
|
115
|
+
id: messagesBarrel,
|
|
116
|
+
importer: path.resolve(outdir, "runtime.js"),
|
|
117
|
+
state,
|
|
118
|
+
})).toEqual({ id: messagesBarrel, moduleSideEffects: false });
|
|
119
|
+
expect(loadVirtualModule(messagesBarrel, state)).toMatchObject({
|
|
120
|
+
moduleSideEffects: false,
|
|
121
|
+
});
|
|
122
|
+
// messages/_index.js barrel is pure
|
|
123
|
+
expect(resolveVirtualModuleId({
|
|
124
|
+
id: "./messages/_index.js",
|
|
125
|
+
importer: messagesBarrel,
|
|
126
|
+
state,
|
|
127
|
+
})).toEqual({ id: messagesIndex, moduleSideEffects: false });
|
|
128
|
+
expect(loadVirtualModule(messagesIndex, state)).toMatchObject({
|
|
129
|
+
moduleSideEffects: false,
|
|
130
|
+
});
|
|
131
|
+
// runtime.js has real top-level side effects — must keep default handling
|
|
132
|
+
const runtimeResolved = resolveVirtualModuleId({
|
|
133
|
+
id: "../runtime.js",
|
|
134
|
+
importer: messagePath,
|
|
135
|
+
state,
|
|
136
|
+
});
|
|
137
|
+
expect(runtimeResolved).toBe(runtimePath);
|
|
138
|
+
expect(typeof loadVirtualModule(runtimePath, state)).toBe("string");
|
|
139
|
+
});
|
|
77
140
|
//# sourceMappingURL=virtual-modules.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual-modules.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/virtual-modules.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, expect, test, vi } from \"vitest\";\nimport consola from \"consola\";\nimport path from \"node:path\";\nimport {\n\tcreatePluginTestFs,\n\tdefaultPluginCompileOptions,\n} from \"../compiler/test-helpers.js\";\n\nbeforeEach(() => {\n\tvi.resetModules();\n\tconsola.mockTypes(() => vi.fn());\n});\n\ntest(\"virtual resolveId/load serve generated js when emitFiles is false\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst {\n\t\tresolveVirtualModuleId,\n\t\tloadVirtualModule,\n\t\tgetPluginState,\n\t} = await import(\"./plugin-core.js\");\n\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/virtual-out\";\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: false,\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\n\tconst state = getPluginState({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\tfs,\n\t});\n\texpect(state.virtualModules.size).toBeGreaterThan(0);\n\n\tconst runtimePath = path.resolve(outdir, \"runtime.js\");\n\tconst resolved = resolveVirtualModuleId({\n\t\tid: \"./runtime.js\",\n\t\timporter: path.resolve(outdir, \"messages.js\"),\n\t\tstate,\n\t});\n\texpect(resolved).toBe(runtimePath);\n\texpect(loadVirtualModule(resolved!, state)).toContain(\"export\");\n\n\t// No JS written to disk\n\tawait expect(fs.promises.readFile(runtimePath, \"utf8\")).rejects.toThrow();\n});\n\ntest(\"virtual resolve does not claim unrelated runtime.js imports\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst { resolveVirtualModuleId, getPluginState } = await import(\n\t\t\"./plugin-core.js\"\n\t);\n\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/scoped-out\";\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: false,\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\tconst state = getPluginState({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\tfs,\n\t});\n\n\texpect(\n\t\tresolveVirtualModuleId({\n\t\t\tid: \"./runtime.js\",\n\t\t\timporter: \"/node_modules/svelte/src/internal/client/context.js\",\n\t\t\tstate,\n\t\t})\n\t).toBeUndefined();\n});\n\ntest(\"emitFiles types writes meta but not js\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/types-out\";\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: \"types\",\n\t\temitTsDeclarations: true,\n\t\temitGitIgnore: true,\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\n\tawait expect(\n\t\tfs.promises.readFile(path.resolve(outdir, \"runtime.js\"), \"utf8\")\n\t).rejects.toThrow();\n\tawait expect(\n\t\tfs.promises.readFile(path.resolve(outdir, \".gitignore\"), \"utf8\")\n\t).resolves.toBeTruthy();\n});\n"]}
|
|
1
|
+
{"version":3,"file":"virtual-modules.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/virtual-modules.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, expect, test, vi } from \"vitest\";\nimport consola from \"consola\";\nimport path from \"node:path\";\nimport {\n\tcreatePluginTestFs,\n\tdefaultPluginCompileOptions,\n} from \"../compiler/test-helpers.js\";\n\nbeforeEach(() => {\n\tvi.resetModules();\n\tconsola.mockTypes(() => vi.fn());\n});\n\ntest(\"virtual resolveId/load serve generated js when emitFiles is false\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst {\n\t\tresolveVirtualModuleId,\n\t\tloadVirtualModule,\n\t\tgetPluginState,\n\t} = await import(\"./plugin-core.js\");\n\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/virtual-out\";\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: false,\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\n\tconst state = getPluginState({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\tfs,\n\t});\n\texpect(state.virtualModules.size).toBeGreaterThan(0);\n\n\tconst runtimePath = path.resolve(outdir, \"runtime.js\");\n\tconst resolved = resolveVirtualModuleId({\n\t\tid: \"./runtime.js\",\n\t\timporter: path.resolve(outdir, \"messages.js\"),\n\t\tstate,\n\t});\n\texpect(resolved).toBe(runtimePath);\n\tconst resolvedId = typeof resolved === \"string\" ? resolved : resolved?.id;\n\texpect(loadVirtualModule(resolvedId!, state)).toContain(\"export\");\n\n\t// No JS written to disk\n\tawait expect(fs.promises.readFile(runtimePath, \"utf8\")).rejects.toThrow();\n});\n\ntest(\"virtual resolve does not claim unrelated runtime.js imports\", async () => {\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst { resolveVirtualModuleId, getPluginState } = await import(\n\t\t\"./plugin-core.js\"\n\t);\n\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/scoped-out\";\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: false,\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\tconst state = getPluginState({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\tfs,\n\t});\n\n\texpect(\n\t\tresolveVirtualModuleId({\n\t\t\tid: \"./runtime.js\",\n\t\t\timporter: \"/node_modules/svelte/src/internal/client/context.js\",\n\t\t\tstate,\n\t\t})\n\t).toBeUndefined();\n});\n\ntest(\"emitFiles types writes meta but not js\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/types-out\";\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: \"types\",\n\t\temitTsDeclarations: true,\n\t\temitGitIgnore: true,\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\n\tawait expect(\n\t\tfs.promises.readFile(path.resolve(outdir, \"runtime.js\"), \"utf8\")\n\t).rejects.toThrow();\n\tawait expect(\n\t\tfs.promises.readFile(path.resolve(outdir, \".gitignore\"), \"utf8\")\n\t).resolves.toBeTruthy();\n});\n\ntest(\"message modules resolve/load as side-effect-free, runtime.js does not (#668)\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"./vite.js\");\n\tconst {\n\t\tresolveVirtualModuleId,\n\t\tloadVirtualModule,\n\t\tgetPluginState,\n\t} = await import(\"./plugin-core.js\");\n\n\tconst fs = createPluginTestFs();\n\tconst outdir = \"/side-effect-out\";\n\n\tconst plugin = paraglideVitePlugin({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\temitFiles: false,\n\t\toutputStructure: \"message-modules\",\n\t\tfs,\n\t}) as any;\n\n\tawait plugin.buildStart?.call({ addWatchFile: () => {} });\n\n\tconst state = getPluginState({\n\t\t...defaultPluginCompileOptions,\n\t\toutdir,\n\t\tfs,\n\t});\n\n\tconst messagePath = path.resolve(outdir, \"messages/hello.js\");\n\tconst messagesBarrel = path.resolve(outdir, \"messages.js\");\n\tconst messagesIndex = path.resolve(outdir, \"messages/_index.js\");\n\tconst runtimePath = path.resolve(outdir, \"runtime.js\");\n\n\t// Per-key module is pure\n\tconst messageResolved = resolveVirtualModuleId({\n\t\tid: \"./messages/hello.js\",\n\t\timporter: messagesBarrel,\n\t\tstate,\n\t});\n\texpect(messageResolved).toEqual({\n\t\tid: messagePath,\n\t\tmoduleSideEffects: false,\n\t});\n\tconst messageLoaded = loadVirtualModule(messagePath, state);\n\texpect(messageLoaded).toMatchObject({ moduleSideEffects: false });\n\texpect(\n\t\ttypeof messageLoaded === \"object\" ? messageLoaded.code : messageLoaded\n\t).toContain(\"export\");\n\n\t// messages.js barrel is pure\n\texpect(\n\t\tresolveVirtualModuleId({\n\t\t\tid: messagesBarrel,\n\t\t\timporter: path.resolve(outdir, \"runtime.js\"),\n\t\t\tstate,\n\t\t})\n\t).toEqual({ id: messagesBarrel, moduleSideEffects: false });\n\texpect(loadVirtualModule(messagesBarrel, state)).toMatchObject({\n\t\tmoduleSideEffects: false,\n\t});\n\n\t// messages/_index.js barrel is pure\n\texpect(\n\t\tresolveVirtualModuleId({\n\t\t\tid: \"./messages/_index.js\",\n\t\t\timporter: messagesBarrel,\n\t\t\tstate,\n\t\t})\n\t).toEqual({ id: messagesIndex, moduleSideEffects: false });\n\texpect(loadVirtualModule(messagesIndex, state)).toMatchObject({\n\t\tmoduleSideEffects: false,\n\t});\n\n\t// runtime.js has real top-level side effects — must keep default handling\n\tconst runtimeResolved = resolveVirtualModuleId({\n\t\tid: \"../runtime.js\",\n\t\timporter: messagePath,\n\t\tstate,\n\t});\n\texpect(runtimeResolved).toBe(runtimePath);\n\texpect(typeof loadVirtualModule(runtimePath, state)).toBe(\"string\");\n});\n"]}
|
|
@@ -70,7 +70,14 @@ export const compileCommand = new Command()
|
|
|
70
70
|
if (!options.watch) {
|
|
71
71
|
logger.info(`Compiling messages ...`);
|
|
72
72
|
try {
|
|
73
|
-
await
|
|
73
|
+
const previousCompilation = await seedPreviousCompilationFromOutdir({
|
|
74
|
+
outdir: compileOptions.outdir,
|
|
75
|
+
});
|
|
76
|
+
await compile({
|
|
77
|
+
...compileOptions,
|
|
78
|
+
previousCompilation,
|
|
79
|
+
cleanOutdir: false,
|
|
80
|
+
});
|
|
74
81
|
}
|
|
75
82
|
catch (e) {
|
|
76
83
|
logger.error("Error while compiling messages.");
|