@gtkx/cli 1.3.0 → 1.5.0
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/README.md +5 -4
- package/dist/builder.d.ts +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +6 -6
- package/dist/builder.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +3 -2
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +41 -12
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/commands/build.d.ts +0 -4
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +0 -5
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +2 -4
- package/dist/commands/codegen.js.map +1 -1
- package/dist/deploy/depends.d.ts +2 -2
- package/dist/deploy/depends.d.ts.map +1 -1
- package/dist/deploy/depends.js +30 -15
- package/dist/deploy/depends.js.map +1 -1
- package/dist/deploy/freedesktop/localize.d.ts +6 -0
- package/dist/deploy/freedesktop/localize.d.ts.map +1 -0
- package/dist/deploy/freedesktop/localize.js +107 -0
- package/dist/deploy/freedesktop/localize.js.map +1 -0
- package/dist/deploy/install-hints.d.ts.map +1 -1
- package/dist/deploy/install-hints.js +5 -0
- package/dist/deploy/install-hints.js.map +1 -1
- package/dist/deploy/nfpm/config.js +1 -1
- package/dist/deploy/nfpm/config.js.map +1 -1
- package/dist/deploy/node-runtime/elf.d.ts +1 -1
- package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
- package/dist/deploy/node-runtime/elf.js +2 -2
- package/dist/deploy/node-runtime/elf.js.map +1 -1
- package/dist/deploy/node-runtime/index.js +2 -2
- package/dist/deploy/node-runtime/index.js.map +1 -1
- package/dist/deploy/notices/collect.d.ts +3 -1
- package/dist/deploy/notices/collect.d.ts.map +1 -1
- package/dist/deploy/notices/collect.js +2 -2
- package/dist/deploy/notices/collect.js.map +1 -1
- package/dist/deploy/notices/packages.d.ts +2 -1
- package/dist/deploy/notices/packages.d.ts.map +1 -1
- package/dist/deploy/notices/packages.js +4 -27
- package/dist/deploy/notices/packages.js.map +1 -1
- package/dist/deploy/payload/icons.d.ts +7 -3
- package/dist/deploy/payload/icons.d.ts.map +1 -1
- package/dist/deploy/payload/icons.js +46 -28
- package/dist/deploy/payload/icons.js.map +1 -1
- package/dist/deploy/payload/launcher.d.ts.map +1 -1
- package/dist/deploy/payload/launcher.js +2 -0
- package/dist/deploy/payload/launcher.js.map +1 -1
- package/dist/deploy/payload/stage.d.ts +1 -1
- package/dist/deploy/payload/stage.d.ts.map +1 -1
- package/dist/deploy/payload/stage.js +23 -13
- package/dist/deploy/payload/stage.js.map +1 -1
- package/dist/deploy/run-deploy.d.ts.map +1 -1
- package/dist/deploy/run-deploy.js +149 -25
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/settings/build-manifest.d.ts +9 -0
- package/dist/deploy/settings/build-manifest.d.ts.map +1 -0
- package/dist/deploy/settings/build-manifest.js +80 -0
- package/dist/deploy/settings/build-manifest.js.map +1 -0
- package/dist/deploy/settings/index.d.ts.map +1 -1
- package/dist/deploy/settings/index.js +9 -3
- package/dist/deploy/settings/index.js.map +1 -1
- package/dist/deploy/settings/libraries.d.ts +8 -0
- package/dist/deploy/settings/libraries.d.ts.map +1 -0
- package/dist/deploy/settings/libraries.js +39 -0
- package/dist/deploy/settings/libraries.js.map +1 -0
- package/dist/deploy/settings/paths.d.ts +3 -0
- package/dist/deploy/settings/paths.d.ts.map +1 -1
- package/dist/deploy/settings/paths.js +6 -32
- package/dist/deploy/settings/paths.js.map +1 -1
- package/dist/deploy/targets/appimage.d.ts.map +1 -1
- package/dist/deploy/targets/appimage.js +19 -13
- package/dist/deploy/targets/appimage.js.map +1 -1
- package/dist/deploy/targets/flatpak-manifest.d.ts +2 -1
- package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-manifest.js +5 -1
- package/dist/deploy/targets/flatpak-manifest.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +30 -16
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/deploy/tools.d.ts +6 -1
- package/dist/deploy/tools.d.ts.map +1 -1
- package/dist/deploy/tools.js +26 -1
- package/dist/deploy/tools.js.map +1 -1
- package/dist/deploy/types.d.ts +4 -4
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/types.js.map +1 -1
- package/dist/dev/icon-dir.d.ts +1 -1
- package/dist/dev/icon-dir.d.ts.map +1 -1
- package/dist/dev/icon-dir.js +20 -7
- package/dist/dev/icon-dir.js.map +1 -1
- package/dist/dev/locale-dir.d.ts +3 -0
- package/dist/dev/locale-dir.d.ts.map +1 -0
- package/dist/dev/locale-dir.js +17 -0
- package/dist/dev/locale-dir.js.map +1 -0
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +5 -1
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +6 -4
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts +1 -1
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +7 -1
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/schema-dir.d.ts +1 -1
- package/dist/dev/schema-dir.d.ts.map +1 -1
- package/dist/dev/schema-dir.js +3 -1
- package/dist/dev/schema-dir.js.map +1 -1
- package/dist/dev/vite-dev-server.d.ts +1 -0
- package/dist/dev/vite-dev-server.d.ts.map +1 -1
- package/dist/dev/vite-dev-server.js.map +1 -1
- package/dist/i18n/binding-extractor.d.ts +30 -0
- package/dist/i18n/binding-extractor.d.ts.map +1 -0
- package/dist/i18n/binding-extractor.js +1324 -0
- package/dist/i18n/binding-extractor.js.map +1 -0
- package/dist/i18n/catalog-template.d.ts +3 -0
- package/dist/i18n/catalog-template.d.ts.map +1 -0
- package/dist/i18n/catalog-template.js +18 -0
- package/dist/i18n/catalog-template.js.map +1 -0
- package/dist/i18n/catalogs.d.ts +21 -0
- package/dist/i18n/catalogs.d.ts.map +1 -0
- package/dist/i18n/catalogs.js +139 -0
- package/dist/i18n/catalogs.js.map +1 -0
- package/dist/i18n/extractor-plugin.d.ts +8 -0
- package/dist/i18n/extractor-plugin.d.ts.map +1 -0
- package/dist/i18n/extractor-plugin.js +247 -0
- package/dist/i18n/extractor-plugin.js.map +1 -0
- package/dist/i18n/metadata-templates.d.ts +11 -0
- package/dist/i18n/metadata-templates.d.ts.map +1 -0
- package/dist/i18n/metadata-templates.js +11 -0
- package/dist/i18n/metadata-templates.js.map +1 -0
- package/dist/i18n/source-messages.d.ts +23 -0
- package/dist/i18n/source-messages.d.ts.map +1 -0
- package/dist/i18n/source-messages.js +403 -0
- package/dist/i18n/source-messages.js.map +1 -0
- package/dist/i18n/types.d.ts +10 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +108 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/internal/build-manifest.d.ts +20 -0
- package/dist/internal/build-manifest.d.ts.map +1 -0
- package/dist/internal/build-manifest.js +6 -0
- package/dist/internal/build-manifest.js.map +1 -0
- package/dist/internal/icon-path.d.ts +13 -0
- package/dist/internal/icon-path.d.ts.map +1 -0
- package/dist/internal/icon-path.js +86 -0
- package/dist/internal/icon-path.js.map +1 -0
- package/dist/internal/source-imports.d.ts +12 -0
- package/dist/internal/source-imports.d.ts.map +1 -0
- package/dist/internal/source-imports.js +123 -0
- package/dist/internal/source-imports.js.map +1 -0
- package/dist/mcp/client.d.ts +0 -1
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +11 -39
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/handlers.d.ts +2 -1
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/widget-properties.d.ts.map +1 -1
- package/dist/mcp/widget-properties.js +3 -12
- package/dist/mcp/widget-properties.js.map +1 -1
- package/dist/settings/render.d.ts +10 -1
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +78 -20
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts +4 -3
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +124 -15
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-emitter.d.ts +1 -1
- package/dist/vite-plugins/asset-emitter.d.ts.map +1 -1
- package/dist/vite-plugins/asset-emitter.js.map +1 -1
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
- package/dist/vite-plugins/asset-extensions.js +1 -0
- package/dist/vite-plugins/asset-extensions.js.map +1 -1
- package/dist/vite-plugins/asset-imports.d.ts +2 -1
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +39 -28
- package/dist/vite-plugins/asset-imports.js.map +1 -1
- package/dist/vite-plugins/asset-specifier.d.ts +13 -1
- package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
- package/dist/vite-plugins/asset-specifier.js +39 -1
- package/dist/vite-plugins/asset-specifier.js.map +1 -1
- package/dist/vite-plugins/build-manifest.d.ts +5 -0
- package/dist/vite-plugins/build-manifest.d.ts.map +1 -0
- package/dist/vite-plugins/{bundled-packages.js → build-manifest.js} +20 -14
- package/dist/vite-plugins/build-manifest.js.map +1 -0
- package/dist/vite-plugins/built-url.d.ts +1 -1
- package/dist/vite-plugins/built-url.d.ts.map +1 -1
- package/dist/vite-plugins/built-url.js +37 -24
- package/dist/vite-plugins/built-url.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts +5 -0
- package/dist/vite-plugins/i18n.d.ts.map +1 -0
- package/dist/vite-plugins/i18n.js +88 -0
- package/dist/vite-plugins/i18n.js.map +1 -0
- package/dist/vite-plugins/icons.d.ts +2 -1
- package/dist/vite-plugins/icons.d.ts.map +1 -1
- package/dist/vite-plugins/icons.js +25 -12
- package/dist/vite-plugins/icons.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +2 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +9 -5
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/native.d.ts.map +1 -1
- package/dist/vite-plugins/native.js +23 -4
- package/dist/vite-plugins/native.js.map +1 -1
- package/dist/vite-plugins/resource-init-module.d.ts +7 -3
- package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
- package/dist/vite-plugins/resource-init-module.js +39 -14
- package/dist/vite-plugins/resource-init-module.js.map +1 -1
- package/dist/vite-plugins/resource-shared.d.ts +3 -1
- package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
- package/dist/vite-plugins/resource-shared.js +3 -1
- package/dist/vite-plugins/resource-shared.js.map +1 -1
- package/dist/vite-plugins/resources.d.ts +1 -1
- package/dist/vite-plugins/resources.d.ts.map +1 -1
- package/dist/vite-plugins/resources.js +877 -86
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/self-contained.d.ts.map +1 -1
- package/dist/vite-plugins/self-contained.js +128 -135
- package/dist/vite-plugins/self-contained.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +6 -3
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts +3 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +63 -23
- package/dist/vite-plugins/settings.js.map +1 -1
- package/env.d.ts +11 -192
- package/package.json +11 -10
- package/src/builder.ts +7 -7
- package/src/codegen/run-codegen.ts +64 -15
- package/src/commands/build.ts +0 -5
- package/src/commands/codegen.ts +2 -4
- package/src/deploy/depends.ts +47 -18
- package/src/deploy/freedesktop/localize.ts +144 -0
- package/src/deploy/install-hints.ts +5 -0
- package/src/deploy/nfpm/config.ts +1 -1
- package/src/deploy/node-runtime/elf.ts +3 -3
- package/src/deploy/node-runtime/index.ts +2 -2
- package/src/deploy/notices/collect.ts +4 -2
- package/src/deploy/notices/packages.ts +5 -43
- package/src/deploy/payload/icons.ts +64 -34
- package/src/deploy/payload/launcher.ts +2 -0
- package/src/deploy/payload/stage.ts +40 -12
- package/src/deploy/run-deploy.ts +214 -24
- package/src/deploy/settings/build-manifest.ts +122 -0
- package/src/deploy/settings/index.ts +9 -4
- package/src/deploy/settings/libraries.ts +57 -0
- package/src/deploy/settings/paths.ts +10 -47
- package/src/deploy/targets/appimage.ts +32 -15
- package/src/deploy/targets/flatpak-manifest.ts +7 -1
- package/src/deploy/targets/flatpak-source.ts +42 -20
- package/src/deploy/tools.ts +35 -0
- package/src/deploy/types.ts +4 -4
- package/src/dev/icon-dir.ts +31 -7
- package/src/dev/locale-dir.ts +22 -0
- package/src/dev/runner-deps.ts +5 -1
- package/src/dev/runner-main.ts +6 -4
- package/src/dev/runner.ts +10 -2
- package/src/dev/schema-dir.ts +3 -1
- package/src/dev/vite-dev-server.ts +1 -0
- package/src/i18n/binding-extractor.ts +1969 -0
- package/src/i18n/catalog-template.ts +24 -0
- package/src/i18n/catalogs.ts +216 -0
- package/src/i18n/extractor-plugin.ts +413 -0
- package/src/i18n/metadata-templates.ts +29 -0
- package/src/i18n/source-messages.ts +608 -0
- package/src/i18n/types.ts +154 -0
- package/src/internal/build-manifest.ts +32 -0
- package/src/internal/icon-path.ts +127 -0
- package/src/internal/source-imports.ts +171 -0
- package/src/mcp/client.ts +17 -44
- package/src/mcp/handlers.ts +7 -6
- package/src/mcp/widget-properties.ts +3 -14
- package/src/settings/render.ts +113 -21
- package/src/settings/schema.ts +192 -17
- package/src/vite-plugins/asset-emitter.ts +1 -1
- package/src/vite-plugins/asset-extensions.ts +1 -0
- package/src/vite-plugins/asset-imports.ts +62 -33
- package/src/vite-plugins/asset-specifier.ts +73 -1
- package/src/vite-plugins/{bundled-packages.ts → build-manifest.ts} +30 -19
- package/src/vite-plugins/built-url.ts +49 -28
- package/src/vite-plugins/i18n.ts +146 -0
- package/src/vite-plugins/icons.ts +33 -14
- package/src/vite-plugins/index.ts +15 -5
- package/src/vite-plugins/native.ts +31 -4
- package/src/vite-plugins/resource-init-module.ts +44 -15
- package/src/vite-plugins/resource-shared.ts +4 -0
- package/src/vite-plugins/resources.ts +1397 -100
- package/src/vite-plugins/self-contained.ts +150 -169
- package/src/vite-plugins/settings-worker-env.ts +7 -3
- package/src/vite-plugins/settings.ts +89 -21
- package/dist/vite-plugins/bundled-packages.d.ts +0 -5
- package/dist/vite-plugins/bundled-packages.d.ts.map +0 -1
- package/dist/vite-plugins/bundled-packages.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-emitter.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-emitter.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"asset-emitter.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-emitter.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC1F,CAAC;AAEF,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-emitter.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,CAAC","sourcesContent":["type AssetEmitter = {\n emitFile: (file: { type: \"asset\"; fileName: string; source: Buffer }) => void;\n};\n\nexport { type AssetEmitter };\n"]}
|
|
1
|
+
{"version":3,"file":"asset-emitter.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,CAAC","sourcesContent":["type AssetEmitter = {\n emitFile: (file: { type: \"asset\"; fileName: string; source: Buffer | string }) => void;\n};\n\nexport { type AssetEmitter };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AA0BA,QAAA,MAAM,QAAQ,QAAoE,CAAC;AACnF,QAAA,MAAM,aAAa,QAA6E,CAAC;AACjG,QAAA,MAAM,gBAAgB,QAAmE,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACrB,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACjG,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nconst ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\nconst ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\nconst ASSET_MENTION_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})`, \"i\");\n\nexport { ASSET_MENTION_RE, ASSET_PATH_RE, ASSET_RE };\n"]}
|
|
1
|
+
{"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACrB,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACjG,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"xpm\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nconst ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\nconst ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\nconst ASSET_MENTION_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})`, \"i\");\n\nexport { ASSET_MENTION_RE, ASSET_PATH_RE, ASSET_RE };\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
import type { ConfigLoader } from "@gtkx/config";
|
|
1
2
|
import type { Plugin } from "vite";
|
|
2
|
-
declare function gtkxAssetImports(): Plugin;
|
|
3
|
+
declare function gtkxAssetImports(loadConfig?: ConfigLoader): Plugin;
|
|
3
4
|
export { gtkxAssetImports };
|
|
4
5
|
//# sourceMappingURL=asset-imports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-imports.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"asset-imports.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAe,MAAM,EAAc,MAAM,MAAM,CAAC;AA+I5D,iBAAS,gBAAgB,CAAC,UAAU,GAAE,YAAmC,GAAG,MAAM,CAgBjF;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,19 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
2
|
import { parseSync } from "vite";
|
|
3
|
+
import { sourceLanguage } from "../internal/source-imports.js";
|
|
3
4
|
import { ASSET_MENTION_RE } from "./asset-extensions.js";
|
|
4
|
-
import { DATA_PREFIX, isAssetSpecifier, isDataAsset } from "./asset-specifier.js";
|
|
5
|
+
import { DATA_PREFIX, isAssetSpecifier, isDataAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, } from "./asset-specifier.js";
|
|
5
6
|
import { RESOURCE_PATH_EXPORT } from "./resource-shared.js";
|
|
6
7
|
import { stripQuery } from "./strip-query.js";
|
|
7
|
-
const SOURCE_LANGUAGES = new Map([
|
|
8
|
-
[".cjs", "jsx"],
|
|
9
|
-
[".cts", "ts"],
|
|
10
|
-
[".js", "jsx"],
|
|
11
|
-
[".jsx", "jsx"],
|
|
12
|
-
[".mjs", "jsx"],
|
|
13
|
-
[".mts", "ts"],
|
|
14
|
-
[".ts", "ts"],
|
|
15
|
-
[".tsx", "tsx"],
|
|
16
|
-
]);
|
|
17
8
|
const NODE_MODULES = /(?:^|\/)node_modules\//;
|
|
18
9
|
const VIRTUAL_PREFIX = "\0";
|
|
19
10
|
const DEFAULT_BINDING = "default";
|
|
@@ -22,8 +13,9 @@ const DATA_IMPORT_EXAMPLE = `"${DATA_PREFIX}<path>"`;
|
|
|
22
13
|
const URL_FALLBACK = ", or import the default for the asset URL.";
|
|
23
14
|
const BUNDLE_ADVICE = `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a "resource://" default, and ` +
|
|
24
15
|
"nothing else.";
|
|
25
|
-
const QUERY_ADVICE =
|
|
26
|
-
|
|
16
|
+
const QUERY_ADVICE = `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;
|
|
17
|
+
const RESOURCE_ADVICE = `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;
|
|
18
|
+
const ICON_ADVICE = "An icon asset exports only its default icon-theme name, and nothing else.";
|
|
27
19
|
const RELATIVE_ADVICE = `Only assets imported through "${DATA_PREFIX}" are staged into the GResource bundle and export ` +
|
|
28
20
|
`${RESOURCE_BINDING}; move the file under the data directory and import it as ` +
|
|
29
21
|
`${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;
|
|
@@ -48,39 +40,58 @@ const bindings = (parsed) => [
|
|
|
48
40
|
...parsed.staticImports.flatMap((statement) => importBindings(statement)),
|
|
49
41
|
...parsed.staticExports.flatMap((statement) => exportBindings(statement)),
|
|
50
42
|
];
|
|
51
|
-
const isBacked = ({ name, source }) =>
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
const isBacked = ({ name, source }, isV2) => {
|
|
44
|
+
if (name !== RESOURCE_PATH_EXPORT) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return isV2 ? parseResourceSpecifier(source) !== null : isDataAsset(source);
|
|
48
|
+
};
|
|
49
|
+
const isCheckedSpecifier = (source) => isAssetSpecifier(source) || isUrlSpecifier(source);
|
|
50
|
+
const unbackedBinding = (parsed, isV2) => bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding, isV2));
|
|
51
|
+
const isBundledResource = (source, isV2) => isV2
|
|
52
|
+
? parseResourceSpecifier(source) !== null || parseIconSpecifier(source) !== null
|
|
53
|
+
: isDataAsset(source);
|
|
54
|
+
const v2BundleAdvice = (source) => parseIconSpecifier(source) === null ? RESOURCE_ADVICE : ICON_ADVICE;
|
|
55
|
+
const bundleAdvice = (source, isV2) => {
|
|
56
|
+
if (isBundledResource(source, isV2)) {
|
|
57
|
+
return isV2 ? v2BundleAdvice(source) : BUNDLE_ADVICE;
|
|
58
|
+
}
|
|
59
|
+
if (isUrlSpecifier(source)) {
|
|
60
|
+
return QUERY_ADVICE;
|
|
56
61
|
}
|
|
57
62
|
return source.startsWith(DATA_PREFIX) ? QUERY_ADVICE : RELATIVE_ADVICE;
|
|
58
63
|
};
|
|
59
|
-
const unbackedBindingError = (path, binding) => new Error(`${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +
|
|
64
|
+
const unbackedBindingError = (path, binding, isV2) => new Error(`${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +
|
|
60
65
|
"gtkx build rejects and gtkx dev would bind as undefined. " +
|
|
61
|
-
bundleAdvice(binding.source));
|
|
66
|
+
bundleAdvice(binding.source, isV2));
|
|
62
67
|
const isCheckedSource = (path) => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);
|
|
63
|
-
const
|
|
68
|
+
const hasCheckedAssetMention = (code) => ASSET_MENTION_RE.test(code) || code.includes("?url");
|
|
69
|
+
const checkAssetImports = (code, id, isV2) => {
|
|
64
70
|
const path = stripQuery(id);
|
|
65
|
-
const lang =
|
|
66
|
-
if (lang === undefined || !isCheckedSource(path) || !
|
|
71
|
+
const lang = sourceLanguage(path);
|
|
72
|
+
if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {
|
|
67
73
|
return;
|
|
68
74
|
}
|
|
69
75
|
const parsed = parseSync(path, code, { lang });
|
|
70
76
|
if (parsed.errors.length > 0) {
|
|
71
77
|
return;
|
|
72
78
|
}
|
|
73
|
-
const binding = unbackedBinding(parsed.module);
|
|
79
|
+
const binding = unbackedBinding(parsed.module, isV2);
|
|
74
80
|
if (binding !== undefined) {
|
|
75
|
-
throw unbackedBindingError(path, binding);
|
|
81
|
+
throw unbackedBindingError(path, binding, isV2);
|
|
76
82
|
}
|
|
77
83
|
};
|
|
78
|
-
function gtkxAssetImports() {
|
|
84
|
+
function gtkxAssetImports(loadConfig = createConfigLoader()) {
|
|
85
|
+
const state = { isV2: false };
|
|
79
86
|
return {
|
|
80
87
|
name: "gtkx:asset-imports",
|
|
81
88
|
enforce: "pre",
|
|
89
|
+
async config(config) {
|
|
90
|
+
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
91
|
+
state.isV2 = loaded.config.future?.v2ResourceImports === true;
|
|
92
|
+
},
|
|
82
93
|
transform(code, id) {
|
|
83
|
-
checkAssetImports(code, id);
|
|
94
|
+
checkAssetImports(code, id, state.isV2);
|
|
84
95
|
},
|
|
85
96
|
};
|
|
86
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAU9C,MAAM,gBAAgB,GAAgC,IAAI,GAAG,CAAC;IAC1D,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,KAAK,EAAE,IAAI,CAAC;IACb,CAAC,MAAM,EAAE,KAAK,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAC9D,MAAM,mBAAmB,GAAG,IAAI,WAAW,SAAS,CAAC;AACrD,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAElE,MAAM,aAAa,GACf,qDAAqD,gBAAgB,oCAAoC;IACzG,eAAe,CAAC;AAEpB,MAAM,YAAY,GACd,uGAAuG;IACvG,iBAAiB,gBAAgB,GAAG,YAAY,EAAE,CAAC;AAEvD,MAAM,eAAe,GACjB,iCAAiC,WAAW,oDAAoD;IAChG,GAAG,gBAAgB,4DAA4D;IAC/E,GAAG,mBAAmB,GAAG,YAAY,EAAE,CAAC;AAE5C,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAiB,EAAE;IACrD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;IAElC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAA0B,EAAkB,EAAE,CAClE,SAAS,CAAC,OAAO;KACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;KAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAE1E,MAAM,aAAa,GAAG,CAAC,KAAkB,EAAuB,EAAE;IAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;IAE1C,OAAO,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAA0B,EAAkB,EAAE,CAClE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;AAEjG,MAAM,QAAQ,GAAG,CAAC,MAAoB,EAAkB,EAAE,CAAC;IACvD,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzE,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAgB,EAAW,EAAE,CACzD,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,oBAAoB,CAAC;AAEzD,MAAM,eAAe,GAAG,CAAC,MAAoB,EAA4B,EAAE,CACvE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/F,MAAM,YAAY,GAAG,CAAC,MAAc,EAAU,EAAE;IAC5C,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,OAAqB,EAAS,EAAE,CACxE,IAAI,KAAK,CACL,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU;IACpG,2DAA2D;IAC3D,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAC/B,CAAC;AAEN,MAAM,eAAe,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhH,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAU,EAAQ,EAAE;IACzD,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAE/D,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,gBAAgB;IACrB,OAAO;QACH,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YACd,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import type { ParseResult, ParserOptions, Plugin } from \"vite\";\nimport { extname } from \"node:path\";\nimport { parseSync } from \"vite\";\nimport { ASSET_MENTION_RE } from \"./asset-extensions.js\";\nimport { DATA_PREFIX, isAssetSpecifier, isDataAsset } from \"./asset-specifier.js\";\nimport { RESOURCE_PATH_EXPORT } from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype SourceLanguage = NonNullable<ParserOptions[\"lang\"]>;\ntype ParsedModule = ParseResult[\"module\"];\ntype ImportStatement = ParsedModule[\"staticImports\"][number];\ntype ExportStatement = ParsedModule[\"staticExports\"][number];\ntype ExportEntry = ExportStatement[\"entries\"][number];\ntype BindingEntry = { importName: { name: string | null }; isType: boolean };\ntype NamedBinding = { name: string; source: string };\n\nconst SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([\n [\".cjs\", \"jsx\"],\n [\".cts\", \"ts\"],\n [\".js\", \"jsx\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"jsx\"],\n [\".mts\", \"ts\"],\n [\".ts\", \"ts\"],\n [\".tsx\", \"tsx\"],\n]);\n\nconst NODE_MODULES = /(?:^|\\/)node_modules\\//;\nconst VIRTUAL_PREFIX = \"\\0\";\nconst DEFAULT_BINDING = \"default\";\nconst RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);\nconst DATA_IMPORT_EXAMPLE = `\"${DATA_PREFIX}<path>\"`;\nconst URL_FALLBACK = \", or import the default for the asset URL.\";\n\nconst BUNDLE_ADVICE =\n `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a \"resource://\" default, and ` +\n \"nothing else.\";\n\nconst QUERY_ADVICE =\n \"A query suffix hands the import to the Vite asset pipeline instead of the GResource bundle; drop the \" +\n `query to keep ${RESOURCE_BINDING}${URL_FALLBACK}`;\n\nconst RELATIVE_ADVICE =\n `Only assets imported through \"${DATA_PREFIX}\" are staged into the GResource bundle and export ` +\n `${RESOURCE_BINDING}; move the file under the data directory and import it as ` +\n `${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;\n\nconst boundName = (entry: BindingEntry): string | null => {\n const { name } = entry.importName;\n\n if (name === null || name === DEFAULT_BINDING || entry.isType) {\n return null;\n }\n\n return name;\n};\n\nconst importBindings = (statement: ImportStatement): NamedBinding[] =>\n statement.entries\n .map((entry) => boundName(entry))\n .filter((name) => name !== null)\n .map((name) => ({ name, source: statement.moduleRequest.value }));\n\nconst exportBinding = (entry: ExportEntry): NamedBinding | null => {\n const name = boundName(entry);\n const source = entry.moduleRequest?.value;\n\n return name === null || source === undefined ? null : { name, source };\n};\n\nconst exportBindings = (statement: ExportStatement): NamedBinding[] =>\n statement.entries.map((entry) => exportBinding(entry)).filter((binding) => binding !== null);\n\nconst bindings = (parsed: ParsedModule): NamedBinding[] => [\n ...parsed.staticImports.flatMap((statement) => importBindings(statement)),\n ...parsed.staticExports.flatMap((statement) => exportBindings(statement)),\n];\n\nconst isBacked = ({ name, source }: NamedBinding): boolean =>\n isDataAsset(source) && name === RESOURCE_PATH_EXPORT;\n\nconst unbackedBinding = (parsed: ParsedModule): NamedBinding | undefined =>\n bindings(parsed).find((binding) => isAssetSpecifier(binding.source) && !isBacked(binding));\n\nconst bundleAdvice = (source: string): string => {\n if (isDataAsset(source)) {\n return BUNDLE_ADVICE;\n }\n\n return source.startsWith(DATA_PREFIX) ? QUERY_ADVICE : RELATIVE_ADVICE;\n};\n\nconst unbackedBindingError = (path: string, binding: NamedBinding): Error =>\n new Error(\n `${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +\n \"gtkx build rejects and gtkx dev would bind as undefined. \" +\n bundleAdvice(binding.source),\n );\n\nconst isCheckedSource = (path: string): boolean => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);\n\nconst checkAssetImports = (code: string, id: string): void => {\n const path = stripQuery(id);\n const lang = SOURCE_LANGUAGES.get(extname(path).toLowerCase());\n\n if (lang === undefined || !isCheckedSource(path) || !ASSET_MENTION_RE.test(code)) {\n return;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n if (parsed.errors.length > 0) {\n return;\n }\n\n const binding = unbackedBinding(parsed.module);\n\n if (binding !== undefined) {\n throw unbackedBindingError(path, binding);\n }\n};\n\nfunction gtkxAssetImports(): Plugin {\n return {\n name: \"gtkx:asset-imports\",\n enforce: \"pre\",\n\n transform(code, id) {\n checkAssetImports(code, id);\n },\n };\n}\n\nexport { gtkxAssetImports };\n"]}
|
|
1
|
+
{"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { ParseResult, Plugin, UserConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { parseSync } from \"vite\";\nimport { sourceLanguage } from \"../internal/source-imports.js\";\nimport { ASSET_MENTION_RE } from \"./asset-extensions.js\";\nimport {\n DATA_PREFIX,\n isAssetSpecifier,\n isDataAsset,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"./asset-specifier.js\";\nimport { RESOURCE_PATH_EXPORT } from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ParsedModule = ParseResult[\"module\"];\ntype ImportStatement = ParsedModule[\"staticImports\"][number];\ntype ExportStatement = ParsedModule[\"staticExports\"][number];\ntype ExportEntry = ExportStatement[\"entries\"][number];\ntype BindingEntry = { importName: { name: string | null }; isType: boolean };\ntype NamedBinding = { name: string; source: string };\ntype PluginState = { isV2: boolean };\n\nconst NODE_MODULES = /(?:^|\\/)node_modules\\//;\nconst VIRTUAL_PREFIX = \"\\0\";\nconst DEFAULT_BINDING = \"default\";\nconst RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);\nconst DATA_IMPORT_EXAMPLE = `\"${DATA_PREFIX}<path>\"`;\nconst URL_FALLBACK = \", or import the default for the asset URL.\";\n\nconst BUNDLE_ADVICE =\n `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a \"resource://\" default, and ` +\n \"nothing else.\";\n\nconst QUERY_ADVICE =\n `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;\n\nconst RESOURCE_ADVICE =\n `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;\n\nconst ICON_ADVICE = \"An icon asset exports only its default icon-theme name, and nothing else.\";\n\nconst RELATIVE_ADVICE =\n `Only assets imported through \"${DATA_PREFIX}\" are staged into the GResource bundle and export ` +\n `${RESOURCE_BINDING}; move the file under the data directory and import it as ` +\n `${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;\n\nconst boundName = (entry: BindingEntry): string | null => {\n const { name } = entry.importName;\n\n if (name === null || name === DEFAULT_BINDING || entry.isType) {\n return null;\n }\n\n return name;\n};\n\nconst importBindings = (statement: ImportStatement): NamedBinding[] =>\n statement.entries\n .map((entry) => boundName(entry))\n .filter((name) => name !== null)\n .map((name) => ({ name, source: statement.moduleRequest.value }));\n\nconst exportBinding = (entry: ExportEntry): NamedBinding | null => {\n const name = boundName(entry);\n const source = entry.moduleRequest?.value;\n\n return name === null || source === undefined ? null : { name, source };\n};\n\nconst exportBindings = (statement: ExportStatement): NamedBinding[] =>\n statement.entries.map((entry) => exportBinding(entry)).filter((binding) => binding !== null);\n\nconst bindings = (parsed: ParsedModule): NamedBinding[] => [\n ...parsed.staticImports.flatMap((statement) => importBindings(statement)),\n ...parsed.staticExports.flatMap((statement) => exportBindings(statement)),\n];\n\nconst isBacked = ({ name, source }: NamedBinding, isV2: boolean): boolean => {\n if (name !== RESOURCE_PATH_EXPORT) {\n return false;\n }\n\n return isV2 ? parseResourceSpecifier(source) !== null : isDataAsset(source);\n};\n\nconst isCheckedSpecifier = (source: string): boolean => isAssetSpecifier(source) || isUrlSpecifier(source);\n\nconst unbackedBinding = (parsed: ParsedModule, isV2: boolean): NamedBinding | undefined =>\n bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding, isV2));\n\nconst isBundledResource = (source: string, isV2: boolean): boolean =>\n isV2\n ? parseResourceSpecifier(source) !== null || parseIconSpecifier(source) !== null\n : isDataAsset(source);\n\nconst v2BundleAdvice = (source: string): string =>\n parseIconSpecifier(source) === null ? RESOURCE_ADVICE : ICON_ADVICE;\n\nconst bundleAdvice = (source: string, isV2: boolean): string => {\n if (isBundledResource(source, isV2)) {\n return isV2 ? v2BundleAdvice(source) : BUNDLE_ADVICE;\n }\n\n if (isUrlSpecifier(source)) {\n return QUERY_ADVICE;\n }\n\n return source.startsWith(DATA_PREFIX) ? QUERY_ADVICE : RELATIVE_ADVICE;\n};\n\nconst unbackedBindingError = (path: string, binding: NamedBinding, isV2: boolean): Error =>\n new Error(\n `${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +\n \"gtkx build rejects and gtkx dev would bind as undefined. \" +\n bundleAdvice(binding.source, isV2),\n );\n\nconst isCheckedSource = (path: string): boolean => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);\nconst hasCheckedAssetMention = (code: string): boolean => ASSET_MENTION_RE.test(code) || code.includes(\"?url\");\n\nconst checkAssetImports = (code: string, id: string, isV2: boolean): void => {\n const path = stripQuery(id);\n const lang = sourceLanguage(path);\n\n if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {\n return;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n if (parsed.errors.length > 0) {\n return;\n }\n\n const binding = unbackedBinding(parsed.module, isV2);\n\n if (binding !== undefined) {\n throw unbackedBindingError(path, binding, isV2);\n }\n};\n\nfunction gtkxAssetImports(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = { isV2: false };\n\n return {\n name: \"gtkx:asset-imports\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isV2 = loaded.config.future?.v2ResourceImports === true;\n },\n\n transform(code, id) {\n checkAssetImports(code, id, state.isV2);\n },\n };\n}\n\nexport { gtkxAssetImports };\n"]}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
|
+
type ResourceSpecifier = {
|
|
2
|
+
assetSource: string;
|
|
3
|
+
resourcePath: string | null;
|
|
4
|
+
};
|
|
5
|
+
type IconSpecifier = {
|
|
6
|
+
assetSource: string;
|
|
7
|
+
iconName: string | null;
|
|
8
|
+
};
|
|
1
9
|
declare const DATA_PREFIX = "#data/";
|
|
2
10
|
declare const isAssetSpecifier: (source: string) => boolean;
|
|
3
11
|
declare const isDataAsset: (source: string) => boolean;
|
|
4
|
-
|
|
12
|
+
declare const isBareRelativeAsset: (source: string) => boolean;
|
|
13
|
+
declare const parseResourceSpecifier: (source: string) => ResourceSpecifier | null;
|
|
14
|
+
declare const parseIconSpecifier: (source: string) => IconSpecifier | null;
|
|
15
|
+
declare const isUrlSpecifier: (source: string) => boolean;
|
|
16
|
+
export { DATA_PREFIX, isAssetSpecifier, isBareRelativeAsset, isDataAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, };
|
|
5
17
|
//# sourceMappingURL=asset-specifier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-specifier.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asset-specifier.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"AAIA,KAAK,iBAAiB,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,aAAa,GAAG;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,QAAA,MAAM,WAAW,WAA2B,CAAC;AAY7C,QAAA,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,OAAqC,CAAC;AACjF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,OAAkE,CAAC;AAEzG,QAAA,MAAM,mBAAmB,GAAI,QAAQ,MAAM,KAAG,OAC2C,CAAC;AAE1F,QAAA,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,iBAAiB,GAAG,IAepE,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,QAAQ,MAAM,KAAG,aAAa,GAAG,IAe5D,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAIxC,CAAC;AAEF,OAAO,EACH,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,sBAAsB,GACzB,CAAC"}
|
|
@@ -1,7 +1,45 @@
|
|
|
1
1
|
import { DATA_IMPORT_PREFIX } from "../internal/data-dir.js";
|
|
2
2
|
import { ASSET_PATH_RE, ASSET_RE } from "./asset-extensions.js";
|
|
3
|
+
import { stripQuery } from "./strip-query.js";
|
|
3
4
|
const DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;
|
|
5
|
+
const RELATIVE_PREFIX_RE = /^\.\.?(?:\/|$)/;
|
|
6
|
+
const RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;
|
|
7
|
+
const ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;
|
|
8
|
+
const URL_QUERY_RE = /(?:^|&)url(?:&|$)/;
|
|
9
|
+
const getQuery = (source) => {
|
|
10
|
+
const queryIndex = source.indexOf("?");
|
|
11
|
+
return queryIndex === -1 ? null : source.slice(queryIndex + 1);
|
|
12
|
+
};
|
|
4
13
|
const isAssetSpecifier = (source) => ASSET_PATH_RE.test(source);
|
|
5
14
|
const isDataAsset = (source) => source.startsWith(DATA_PREFIX) && ASSET_RE.test(source);
|
|
6
|
-
|
|
15
|
+
const isBareRelativeAsset = (source) => getQuery(source) === null && RELATIVE_PREFIX_RE.test(source) && ASSET_RE.test(source);
|
|
16
|
+
const parseResourceSpecifier = (source) => {
|
|
17
|
+
const query = getQuery(source);
|
|
18
|
+
const assetSource = stripQuery(source);
|
|
19
|
+
if (query === null || !ASSET_RE.test(assetSource)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const match = RESOURCE_QUERY_RE.exec(query);
|
|
23
|
+
if (match === null) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return { assetSource, resourcePath: match[1] ?? null };
|
|
27
|
+
};
|
|
28
|
+
const parseIconSpecifier = (source) => {
|
|
29
|
+
const query = getQuery(source);
|
|
30
|
+
const assetSource = stripQuery(source);
|
|
31
|
+
if (query === null || !ASSET_RE.test(assetSource)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const match = ICON_QUERY_RE.exec(query);
|
|
35
|
+
if (match === null) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return { assetSource, iconName: match[1] ?? null };
|
|
39
|
+
};
|
|
40
|
+
const isUrlSpecifier = (source) => {
|
|
41
|
+
const query = getQuery(source);
|
|
42
|
+
return query !== null && URL_QUERY_RE.test(query);
|
|
43
|
+
};
|
|
44
|
+
export { DATA_PREFIX, isAssetSpecifier, isBareRelativeAsset, isDataAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, };
|
|
7
45
|
//# sourceMappingURL=asset-specifier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-specifier.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"asset-specifier.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { DATA_IMPORT_PREFIX } from \"../internal/data-dir.js\";\nimport { ASSET_PATH_RE, ASSET_RE } from \"./asset-extensions.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ResourceSpecifier = {\n assetSource: string;\n resourcePath: string | null;\n};\n\ntype IconSpecifier = {\n assetSource: string;\n iconName: string | null;\n};\n\nconst DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;\nconst RELATIVE_PREFIX_RE = /^\\.\\.?(?:\\/|$)/;\nconst RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;\nconst ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;\nconst URL_QUERY_RE = /(?:^|&)url(?:&|$)/;\n\nconst getQuery = (source: string): string | null => {\n const queryIndex = source.indexOf(\"?\");\n\n return queryIndex === -1 ? null : source.slice(queryIndex + 1);\n};\n\nconst isAssetSpecifier = (source: string): boolean => ASSET_PATH_RE.test(source);\nconst isDataAsset = (source: string): boolean => source.startsWith(DATA_PREFIX) && ASSET_RE.test(source);\n\nconst isBareRelativeAsset = (source: string): boolean =>\n getQuery(source) === null && RELATIVE_PREFIX_RE.test(source) && ASSET_RE.test(source);\n\nconst parseResourceSpecifier = (source: string): ResourceSpecifier | null => {\n const query = getQuery(source);\n const assetSource = stripQuery(source);\n\n if (query === null || !ASSET_RE.test(assetSource)) {\n return null;\n }\n\n const match = RESOURCE_QUERY_RE.exec(query);\n\n if (match === null) {\n return null;\n }\n\n return { assetSource, resourcePath: match[1] ?? null };\n};\n\nconst parseIconSpecifier = (source: string): IconSpecifier | null => {\n const query = getQuery(source);\n const assetSource = stripQuery(source);\n\n if (query === null || !ASSET_RE.test(assetSource)) {\n return null;\n }\n\n const match = ICON_QUERY_RE.exec(query);\n\n if (match === null) {\n return null;\n }\n\n return { assetSource, iconName: match[1] ?? null };\n};\n\nconst isUrlSpecifier = (source: string): boolean => {\n const query = getQuery(source);\n\n return query !== null && URL_QUERY_RE.test(query);\n};\n\nexport {\n DATA_PREFIX,\n isAssetSpecifier,\n isBareRelativeAsset,\n isDataAsset,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n};\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import { type BuildManifestCollector } from "../internal/build-manifest.js";
|
|
3
|
+
declare function gtkxBuildManifest(root: string, collector: BuildManifestCollector): Plugin;
|
|
4
|
+
export { gtkxBuildManifest };
|
|
5
|
+
//# sourceMappingURL=build-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-manifest.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,EAKH,KAAK,sBAAsB,EAE9B,MAAM,+BAA+B,CAAC;AAgEvC,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,GAAG,MAAM,CA4BlF;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { isRecord, sortStringsBy } from "@gtkx/utils";
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { dirname, join, relative, resolve } from "node:path";
|
|
4
|
+
import { BUILD_MANIFEST_FILENAME, BUILD_MANIFEST_FORMAT_VERSION, BUILD_MANIFEST_GENERATOR, } from "../internal/build-manifest.js";
|
|
4
5
|
import { stripQuery } from "./strip-query.js";
|
|
5
|
-
const
|
|
6
|
-
const MANIFEST_FILENAME = "package.json";
|
|
6
|
+
const PACKAGE_MANIFEST_FILENAME = "package.json";
|
|
7
7
|
const DEFAULT_OUT_DIR = "dist";
|
|
8
8
|
const JSON_INDENT = 4;
|
|
9
9
|
const identityIn = (dir) => {
|
|
10
10
|
try {
|
|
11
|
-
const parsed = JSON.parse(readFileSync(join(dir,
|
|
11
|
+
const parsed = JSON.parse(readFileSync(join(dir, PACKAGE_MANIFEST_FILENAME), "utf8"));
|
|
12
12
|
if (!isRecord(parsed) || typeof parsed.name !== "string") {
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
@@ -30,34 +30,40 @@ const packageForModule = (id) => {
|
|
|
30
30
|
const path = stripQuery(id);
|
|
31
31
|
return path.startsWith("/") ? packageIn(dirname(path)) : null;
|
|
32
32
|
};
|
|
33
|
-
const
|
|
33
|
+
const packageKey = (entry) => `${entry.name}@${entry.version ?? ""}`;
|
|
34
34
|
const relativeTo = (outDir, entry) => ({
|
|
35
35
|
...entry,
|
|
36
36
|
dir: relative(outDir, entry.dir),
|
|
37
37
|
});
|
|
38
|
-
const
|
|
38
|
+
const packagesFor = (outDir, ids) => {
|
|
39
39
|
const found = ids.map((id) => packageForModule(id)).filter((entry) => entry !== null);
|
|
40
|
-
const unique = new Map(found.map((entry) => [
|
|
41
|
-
|
|
42
|
-
return `${JSON.stringify({ packages }, null, JSON_INDENT)}\n`;
|
|
40
|
+
const unique = new Map(found.map((entry) => [packageKey(entry), entry]));
|
|
41
|
+
return sortStringsBy(unique.values(), packageKey).map((entry) => relativeTo(outDir, entry));
|
|
43
42
|
};
|
|
44
|
-
|
|
43
|
+
const renderManifest = (manifest) => `${JSON.stringify(manifest, null, JSON_INDENT)}\n`;
|
|
44
|
+
function gtkxBuildManifest(root, collector) {
|
|
45
45
|
const state = { outDir: join(root, DEFAULT_OUT_DIR) };
|
|
46
46
|
return {
|
|
47
|
-
name: "gtkx:
|
|
47
|
+
name: "gtkx:build-manifest",
|
|
48
48
|
apply: "build",
|
|
49
49
|
configResolved(config) {
|
|
50
50
|
state.outDir = resolve(config.root, config.build.outDir);
|
|
51
51
|
},
|
|
52
52
|
generateBundle(_options, bundle) {
|
|
53
53
|
const ids = Object.values(bundle).flatMap((output) => (output.type === "chunk" ? output.moduleIds : []));
|
|
54
|
+
const manifest = {
|
|
55
|
+
generator: BUILD_MANIFEST_GENERATOR,
|
|
56
|
+
formatVersion: BUILD_MANIFEST_FORMAT_VERSION,
|
|
57
|
+
schemas: collector.schemas,
|
|
58
|
+
packages: packagesFor(state.outDir, ids),
|
|
59
|
+
};
|
|
54
60
|
this.emitFile({
|
|
55
61
|
type: "asset",
|
|
56
|
-
fileName:
|
|
57
|
-
source:
|
|
62
|
+
fileName: BUILD_MANIFEST_FILENAME,
|
|
63
|
+
source: renderManifest(manifest),
|
|
58
64
|
});
|
|
59
65
|
},
|
|
60
66
|
};
|
|
61
67
|
}
|
|
62
|
-
export {
|
|
63
|
-
//# sourceMappingURL=
|
|
68
|
+
export { gtkxBuildManifest };
|
|
69
|
+
//# sourceMappingURL=build-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-manifest.js","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { isRecord, sortStringsBy } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport {\n BUILD_MANIFEST_FILENAME,\n BUILD_MANIFEST_FORMAT_VERSION,\n BUILD_MANIFEST_GENERATOR,\n type BuildManifest,\n type BuildManifestCollector,\n type RecordedPackage,\n} from \"../internal/build-manifest.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype PackageIdentity = {\n name: string;\n version: string | null;\n};\n\ntype ManifestState = {\n outDir: string;\n};\n\nconst PACKAGE_MANIFEST_FILENAME = \"package.json\";\nconst DEFAULT_OUT_DIR = \"dist\";\nconst JSON_INDENT = 4;\n\nconst identityIn = (dir: string): PackageIdentity | null => {\n try {\n const parsed: unknown = JSON.parse(readFileSync(join(dir, PACKAGE_MANIFEST_FILENAME), \"utf8\"));\n\n if (!isRecord(parsed) || typeof parsed.name !== \"string\") {\n return null;\n }\n\n return { name: parsed.name, version: typeof parsed.version === \"string\" ? parsed.version : null };\n } catch {\n return null;\n }\n};\n\nconst packageIn = (dir: string): RecordedPackage | null => {\n const identity = identityIn(dir);\n\n if (identity !== null) {\n return { ...identity, dir };\n }\n\n const parent = dirname(dir);\n\n return parent === dir ? null : packageIn(parent);\n};\n\nconst packageForModule = (id: string): RecordedPackage | null => {\n const path = stripQuery(id);\n\n return path.startsWith(\"/\") ? packageIn(dirname(path)) : null;\n};\n\nconst packageKey = (entry: RecordedPackage): string => `${entry.name}@${entry.version ?? \"\"}`;\n\nconst relativeTo = (outDir: string, entry: RecordedPackage): RecordedPackage => ({\n ...entry,\n dir: relative(outDir, entry.dir),\n});\n\nconst packagesFor = (outDir: string, ids: string[]): RecordedPackage[] => {\n const found = ids.map((id) => packageForModule(id)).filter((entry) => entry !== null);\n const unique: Map<string, RecordedPackage> = new Map(found.map((entry) => [packageKey(entry), entry]));\n\n return sortStringsBy(unique.values(), packageKey).map((entry) => relativeTo(outDir, entry));\n};\n\nconst renderManifest = (manifest: BuildManifest): string => `${JSON.stringify(manifest, null, JSON_INDENT)}\\n`;\n\nfunction gtkxBuildManifest(root: string, collector: BuildManifestCollector): Plugin {\n const state: ManifestState = { outDir: join(root, DEFAULT_OUT_DIR) };\n\n return {\n name: \"gtkx:build-manifest\",\n apply: \"build\",\n\n configResolved(config) {\n state.outDir = resolve(config.root, config.build.outDir);\n },\n\n generateBundle(_options, bundle) {\n const ids = Object.values(bundle).flatMap((output) => (output.type === \"chunk\" ? output.moduleIds : []));\n\n const manifest: BuildManifest = {\n generator: BUILD_MANIFEST_GENERATOR,\n formatVersion: BUILD_MANIFEST_FORMAT_VERSION,\n schemas: collector.schemas,\n packages: packagesFor(state.outDir, ids),\n };\n\n this.emitFile({\n type: \"asset\",\n fileName: BUILD_MANIFEST_FILENAME,\n source: renderManifest(manifest),\n });\n },\n };\n}\n\nexport { gtkxBuildManifest };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAyD/C,iBAAS,YAAY,IAAI,MAAM,CAiB9B;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -1,38 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const specifier = JSON.stringify(target.replace(LEADING_SLASHES, "./"));
|
|
6
|
-
return `decodeURIComponent(new URL(${specifier}, ${EXECUTABLE_URL_BASE}).pathname)`;
|
|
7
|
-
};
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
|
+
import { stripQuery } from "./strip-query.js";
|
|
4
|
+
const URL_QUERY_RE = /\?url(?:&t=\d+)?$/;
|
|
8
5
|
const bundleRelativeUrl = (filename) => {
|
|
9
6
|
const specifier = JSON.stringify(`./${filename}`);
|
|
10
7
|
return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;
|
|
11
8
|
};
|
|
12
|
-
const renderAssetUrl = (filename, type
|
|
9
|
+
const renderAssetUrl = (filename, type) => {
|
|
13
10
|
if (type !== "asset") {
|
|
14
11
|
return undefined;
|
|
15
12
|
}
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
return { runtime: bundleRelativeUrl(filename) };
|
|
14
|
+
};
|
|
15
|
+
const configureBuiltUrl = (userConfig, command) => {
|
|
16
|
+
if (command !== "build" || userConfig.experimental?.renderBuiltUrl) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
experimental: {
|
|
21
|
+
renderBuiltUrl(filename, { type }) {
|
|
22
|
+
return renderAssetUrl(filename, type);
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
const loadDevFileUrl = (ctx, state, id) => {
|
|
28
|
+
if (state.isBuild || !URL_QUERY_RE.test(id)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const file = stripQuery(id);
|
|
32
|
+
if (!isAbsolute(file) || !existsSync(file)) {
|
|
33
|
+
return undefined;
|
|
18
34
|
}
|
|
19
|
-
|
|
35
|
+
ctx.addWatchFile(file);
|
|
36
|
+
return `export default ${JSON.stringify(file)};`;
|
|
20
37
|
};
|
|
21
|
-
function gtkxBuiltUrl(
|
|
38
|
+
function gtkxBuiltUrl() {
|
|
39
|
+
const state = { isBuild: false };
|
|
22
40
|
return {
|
|
23
41
|
name: "gtkx:built-url",
|
|
24
|
-
|
|
25
|
-
config(userConfig)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
renderBuiltUrl(filename, { type }) {
|
|
32
|
-
return renderAssetUrl(filename, type, assetBase);
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
};
|
|
42
|
+
enforce: "pre",
|
|
43
|
+
config: (userConfig, { command }) => configureBuiltUrl(userConfig, command),
|
|
44
|
+
configResolved(config) {
|
|
45
|
+
state.isBuild = config.command === "build";
|
|
46
|
+
},
|
|
47
|
+
load(id) {
|
|
48
|
+
return loadDevFileUrl(this, state, id);
|
|
36
49
|
},
|
|
37
50
|
};
|
|
38
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAElD,OAAO,8BAA8B,SAAS,8BAA8B,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,QAAgB,EAChB,IAAY,EACmB,EAAE;IACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,UAAsB,EAAE,OAAe,EAA0B,EAAE;IAC1F,IAAI,OAAO,KAAK,OAAO,IAAI,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,YAAY,EAAE;YACV,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;gBAC7B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;SACJ;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,GAAiB,EAAE,KAAkB,EAAE,EAAU,EAAsB,EAAE;IAC7F,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACrD,CAAC,CAAC;AAEF,SAAS,YAAY;IACjB,MAAM,KAAK,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAE9C,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK;QAEd,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;QAE3E,cAAc,CAAC,MAAM;YACjB,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,EAAE;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute } from \"node:path\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype PluginState = { isBuild: boolean };\ntype WatchContext = { addWatchFile: (file: string) => void };\n\nconst URL_QUERY_RE = /\\?url(?:&t=\\d+)?$/;\n\nconst bundleRelativeUrl = (filename: string): string => {\n const specifier = JSON.stringify(`./${filename}`);\n\n return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;\n};\n\nconst renderAssetUrl = (\n filename: string,\n type: string,\n): { runtime: string } | undefined => {\n if (type !== \"asset\") {\n return undefined;\n }\n\n return { runtime: bundleRelativeUrl(filename) };\n};\n\nconst configureBuiltUrl = (userConfig: UserConfig, command: string): UserConfig | undefined => {\n if (command !== \"build\" || userConfig.experimental?.renderBuiltUrl) {\n return undefined;\n }\n\n return {\n experimental: {\n renderBuiltUrl(filename, { type }) {\n return renderAssetUrl(filename, type);\n },\n },\n };\n};\n\nconst loadDevFileUrl = (ctx: WatchContext, state: PluginState, id: string): string | undefined => {\n if (state.isBuild || !URL_QUERY_RE.test(id)) {\n return undefined;\n }\n\n const file = stripQuery(id);\n\n if (!isAbsolute(file) || !existsSync(file)) {\n return undefined;\n }\n\n ctx.addWatchFile(file);\n\n return `export default ${JSON.stringify(file)};`;\n};\n\nfunction gtkxBuiltUrl(): Plugin {\n const state: PluginState = { isBuild: false };\n\n return {\n name: \"gtkx:built-url\",\n enforce: \"pre\",\n\n config: (userConfig, { command }) => configureBuiltUrl(userConfig, command),\n\n configResolved(config) {\n state.isBuild = config.command === \"build\";\n },\n\n load(id) {\n return loadDevFileUrl(this, state, id);\n },\n };\n}\n\nexport { gtkxBuiltUrl };\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ConfigLoader } from "@gtkx/config";
|
|
2
|
+
import type { Plugin } from "vite";
|
|
3
|
+
declare const gtkxI18n: (entryPath: string, loadConfig?: ConfigLoader, shouldPreserveMetadataMessages?: boolean) => Plugin;
|
|
4
|
+
export { gtkxI18n };
|
|
5
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AA2GnD,QAAA,MAAM,QAAQ,GACV,WAAW,MAAM,EACjB,aAAY,YAAmC,EAC/C,wCAAqC,KACtC,MA+BF,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join, posix, relative, resolve } from "node:path";
|
|
5
|
+
import { compileCatalogs, LOCALE_DIRNAME, resolveCatalogProject, synchronizeCatalogs, } from "../i18n/catalogs.js";
|
|
6
|
+
import { extractSourceCatalog } from "../i18n/source-messages.js";
|
|
7
|
+
import { discoverSourceFiles } from "../internal/source-imports.js";
|
|
8
|
+
import { stripQuery } from "./strip-query.js";
|
|
9
|
+
const BOOTSTRAP_SPECIFIER = "@gtkx/i18n/bootstrap";
|
|
10
|
+
const LOCALE_URL_PLACEHOLDER = "__GTKX_BUNDLE_LOCALE_DIR__";
|
|
11
|
+
const LOCALE_MODULE_PATHS = new Set(["dist/locale.js", "src/locale.ts"]);
|
|
12
|
+
const LOCALE_URL_PATTERN = /new URL\((["'])locale\1,\s*import\.meta\.url\)/;
|
|
13
|
+
const isI18nLocaleModule = (state, id) => {
|
|
14
|
+
if (state.i18nRoot.length === 0) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const path = relative(state.i18nRoot, stripQuery(id)).replaceAll("\\", "/");
|
|
18
|
+
return LOCALE_MODULE_PATHS.has(path);
|
|
19
|
+
};
|
|
20
|
+
const markLocaleUrl = (code) => code.replace(LOCALE_URL_PATTERN, () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`);
|
|
21
|
+
const localeUrlForChunk = (fileName) => {
|
|
22
|
+
const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);
|
|
23
|
+
return path.length === 0 ? "." : path;
|
|
24
|
+
};
|
|
25
|
+
const rebaseLocaleUrl = (state, code, fileName, moduleIds) => {
|
|
26
|
+
if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);
|
|
30
|
+
if (!code.includes(placeholder)) {
|
|
31
|
+
throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);
|
|
32
|
+
}
|
|
33
|
+
return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));
|
|
34
|
+
};
|
|
35
|
+
const applyResolvedConfig = async (state, config, loadConfig) => {
|
|
36
|
+
state.entryPath = resolve(config.root, state.entryPath);
|
|
37
|
+
state.outDir = resolve(config.root, config.build.outDir);
|
|
38
|
+
const application = await loadConfig.resolve(config.root);
|
|
39
|
+
state.project = resolveCatalogProject(config.root, application.applicationId);
|
|
40
|
+
if (state.project !== null) {
|
|
41
|
+
const projectRequire = createRequire(resolve(config.root, "package.json"));
|
|
42
|
+
state.i18nRoot = dirname(projectRequire.resolve("@gtkx/i18n/package.json"));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const buildCatalogs = (state) => {
|
|
46
|
+
const project = state.project;
|
|
47
|
+
if (project === null) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
mkdirSync(state.outDir, { recursive: true });
|
|
51
|
+
compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));
|
|
52
|
+
};
|
|
53
|
+
const extractProjectMessages = async (state, shouldPreserveMetadataMessages) => {
|
|
54
|
+
const project = state.project;
|
|
55
|
+
if (project === null) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const srcDir = join(project.root, "src");
|
|
59
|
+
const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);
|
|
60
|
+
await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
|
|
61
|
+
synchronizeCatalogs(project);
|
|
62
|
+
};
|
|
63
|
+
const gtkxI18n = (entryPath, loadConfig = createConfigLoader(), shouldPreserveMetadataMessages = true) => {
|
|
64
|
+
const state = { entryPath, i18nRoot: "", outDir: "", project: null };
|
|
65
|
+
return {
|
|
66
|
+
name: "gtkx:i18n",
|
|
67
|
+
enforce: "pre",
|
|
68
|
+
configResolved: (config) => applyResolvedConfig(state, config, loadConfig),
|
|
69
|
+
buildStart: () => extractProjectMessages(state, shouldPreserveMetadataMessages),
|
|
70
|
+
transform(code, id) {
|
|
71
|
+
if (isI18nLocaleModule(state, id)) {
|
|
72
|
+
return markLocaleUrl(code);
|
|
73
|
+
}
|
|
74
|
+
if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\n${code}`;
|
|
78
|
+
},
|
|
79
|
+
renderChunk(code, chunk) {
|
|
80
|
+
return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);
|
|
81
|
+
},
|
|
82
|
+
generateBundle() {
|
|
83
|
+
buildCatalogs(state);
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
export { gtkxI18n };
|
|
88
|
+
//# sourceMappingURL=i18n.js.map
|