@gtkx/cli 1.0.0-rc.4 → 1.1.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 -5
- package/dist/builder.d.ts +2 -2
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +21 -3
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +9 -3
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +2 -4
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +8 -5
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +25 -19
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +1 -1
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +5 -6
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +11 -1
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/deploy.d.ts +22 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +44 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +7 -5
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs.d.ts +2 -2
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +27 -4
- package/dist/commands/docs.js.map +1 -1
- package/dist/deploy/depends.d.ts +8 -0
- package/dist/deploy/depends.d.ts.map +1 -0
- package/dist/deploy/depends.js +27 -0
- package/dist/deploy/depends.js.map +1 -0
- package/dist/deploy/download.d.ts +20 -0
- package/dist/deploy/download.d.ts.map +1 -0
- package/dist/deploy/download.js +98 -0
- package/dist/deploy/download.js.map +1 -0
- package/dist/deploy/freedesktop/copyright.d.ts +4 -0
- package/dist/deploy/freedesktop/copyright.d.ts.map +1 -0
- package/dist/deploy/freedesktop/copyright.js +33 -0
- package/dist/deploy/freedesktop/copyright.js.map +1 -0
- package/dist/deploy/freedesktop/dbus-service.d.ts +4 -0
- package/dist/deploy/freedesktop/dbus-service.d.ts.map +1 -0
- package/dist/deploy/freedesktop/dbus-service.js +15 -0
- package/dist/deploy/freedesktop/dbus-service.js.map +1 -0
- package/dist/deploy/freedesktop/desktop-entry.d.ts +4 -0
- package/dist/deploy/freedesktop/desktop-entry.d.ts.map +1 -0
- package/dist/deploy/freedesktop/desktop-entry.js +73 -0
- package/dist/deploy/freedesktop/desktop-entry.js.map +1 -0
- package/dist/deploy/freedesktop/ini.d.ts +7 -0
- package/dist/deploy/freedesktop/ini.d.ts.map +1 -0
- package/dist/deploy/freedesktop/ini.js +22 -0
- package/dist/deploy/freedesktop/ini.js.map +1 -0
- package/dist/deploy/freedesktop/metainfo-sections.d.ts +13 -0
- package/dist/deploy/freedesktop/metainfo-sections.d.ts.map +1 -0
- package/dist/deploy/freedesktop/metainfo-sections.js +73 -0
- package/dist/deploy/freedesktop/metainfo-sections.js.map +1 -0
- package/dist/deploy/freedesktop/metainfo.d.ts +4 -0
- package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -0
- package/dist/deploy/freedesktop/metainfo.js +29 -0
- package/dist/deploy/freedesktop/metainfo.js.map +1 -0
- package/dist/deploy/freedesktop/mime-package.d.ts +4 -0
- package/dist/deploy/freedesktop/mime-package.d.ts.map +1 -0
- package/dist/deploy/freedesktop/mime-package.js +16 -0
- package/dist/deploy/freedesktop/mime-package.js.map +1 -0
- package/dist/deploy/freedesktop/validate.d.ts +4 -0
- package/dist/deploy/freedesktop/validate.d.ts.map +1 -0
- package/dist/deploy/freedesktop/validate.js +81 -0
- package/dist/deploy/freedesktop/validate.js.map +1 -0
- package/dist/deploy/freedesktop/xml.d.ts +11 -0
- package/dist/deploy/freedesktop/xml.d.ts.map +1 -0
- package/dist/deploy/freedesktop/xml.js +33 -0
- package/dist/deploy/freedesktop/xml.js.map +1 -0
- package/dist/deploy/git.d.ts +4 -0
- package/dist/deploy/git.d.ts.map +1 -0
- package/dist/deploy/git.js +17 -0
- package/dist/deploy/git.js.map +1 -0
- package/dist/deploy/install-hints.d.ts +5 -0
- package/dist/deploy/install-hints.d.ts.map +1 -0
- package/dist/deploy/install-hints.js +85 -0
- package/dist/deploy/install-hints.js.map +1 -0
- package/dist/deploy/nfpm/config.d.ts +8 -0
- package/dist/deploy/nfpm/config.d.ts.map +1 -0
- package/dist/deploy/nfpm/config.js +119 -0
- package/dist/deploy/nfpm/config.js.map +1 -0
- package/dist/deploy/nfpm/contents.d.ts +12 -0
- package/dist/deploy/nfpm/contents.d.ts.map +1 -0
- package/dist/deploy/nfpm/contents.js +48 -0
- package/dist/deploy/nfpm/contents.js.map +1 -0
- package/dist/deploy/nfpm/description.d.ts +5 -0
- package/dist/deploy/nfpm/description.d.ts.map +1 -0
- package/dist/deploy/nfpm/description.js +5 -0
- package/dist/deploy/nfpm/description.js.map +1 -0
- package/dist/deploy/nfpm/optional.d.ts +5 -0
- package/dist/deploy/nfpm/optional.d.ts.map +1 -0
- package/dist/deploy/nfpm/optional.js +4 -0
- package/dist/deploy/nfpm/optional.js.map +1 -0
- package/dist/deploy/nfpm/pack.d.ts +5 -0
- package/dist/deploy/nfpm/pack.d.ts.map +1 -0
- package/dist/deploy/nfpm/pack.js +32 -0
- package/dist/deploy/nfpm/pack.js.map +1 -0
- package/dist/deploy/node-runtime/download.d.ts +3 -0
- package/dist/deploy/node-runtime/download.d.ts.map +1 -0
- package/dist/deploy/node-runtime/download.js +39 -0
- package/dist/deploy/node-runtime/download.js.map +1 -0
- package/dist/deploy/node-runtime/elf.d.ts +7 -0
- package/dist/deploy/node-runtime/elf.d.ts.map +1 -0
- package/dist/deploy/node-runtime/elf.js +100 -0
- package/dist/deploy/node-runtime/elf.js.map +1 -0
- package/dist/deploy/node-runtime/guard.d.ts +4 -0
- package/dist/deploy/node-runtime/guard.d.ts.map +1 -0
- package/dist/deploy/node-runtime/guard.js +22 -0
- package/dist/deploy/node-runtime/guard.js.map +1 -0
- package/dist/deploy/node-runtime/index.d.ts +4 -0
- package/dist/deploy/node-runtime/index.d.ts.map +1 -0
- package/dist/deploy/node-runtime/index.js +61 -0
- package/dist/deploy/node-runtime/index.js.map +1 -0
- package/dist/deploy/payload/copy-tree.d.ts +7 -0
- package/dist/deploy/payload/copy-tree.d.ts.map +1 -0
- package/dist/deploy/payload/copy-tree.js +36 -0
- package/dist/deploy/payload/copy-tree.js.map +1 -0
- package/dist/deploy/payload/icons.d.ts +6 -0
- package/dist/deploy/payload/icons.d.ts.map +1 -0
- package/dist/deploy/payload/icons.js +53 -0
- package/dist/deploy/payload/icons.js.map +1 -0
- package/dist/deploy/payload/launcher.d.ts +5 -0
- package/dist/deploy/payload/launcher.d.ts.map +1 -0
- package/dist/deploy/payload/launcher.js +22 -0
- package/dist/deploy/payload/launcher.js.map +1 -0
- package/dist/deploy/payload/schemas.d.ts +4 -0
- package/dist/deploy/payload/schemas.d.ts.map +1 -0
- package/dist/deploy/payload/schemas.js +17 -0
- package/dist/deploy/payload/schemas.js.map +1 -0
- package/dist/deploy/payload/stage.d.ts +15 -0
- package/dist/deploy/payload/stage.d.ts.map +1 -0
- package/dist/deploy/payload/stage.js +100 -0
- package/dist/deploy/payload/stage.js.map +1 -0
- package/dist/deploy/registry.d.ts +7 -0
- package/dist/deploy/registry.d.ts.map +1 -0
- package/dist/deploy/registry.js +30 -0
- package/dist/deploy/registry.js.map +1 -0
- package/dist/deploy/run-deploy.d.ts +11 -0
- package/dist/deploy/run-deploy.d.ts.map +1 -0
- package/dist/deploy/run-deploy.js +153 -0
- package/dist/deploy/run-deploy.js.map +1 -0
- package/dist/deploy/settings/arch.d.ts +4 -0
- package/dist/deploy/settings/arch.d.ts.map +1 -0
- package/dist/deploy/settings/arch.js +13 -0
- package/dist/deploy/settings/arch.js.map +1 -0
- package/dist/deploy/settings/categories.d.ts +4 -0
- package/dist/deploy/settings/categories.d.ts.map +1 -0
- package/dist/deploy/settings/categories.js +29 -0
- package/dist/deploy/settings/categories.js.map +1 -0
- package/dist/deploy/settings/exec.d.ts +6 -0
- package/dist/deploy/settings/exec.d.ts.map +1 -0
- package/dist/deploy/settings/exec.js +20 -0
- package/dist/deploy/settings/exec.js.map +1 -0
- package/dist/deploy/settings/identity.d.ts +18 -0
- package/dist/deploy/settings/identity.d.ts.map +1 -0
- package/dist/deploy/settings/identity.js +73 -0
- package/dist/deploy/settings/identity.js.map +1 -0
- package/dist/deploy/settings/index.d.ts +11 -0
- package/dist/deploy/settings/index.d.ts.map +1 -0
- package/dist/deploy/settings/index.js +103 -0
- package/dist/deploy/settings/index.js.map +1 -0
- package/dist/deploy/settings/package-manifest.d.ts +15 -0
- package/dist/deploy/settings/package-manifest.d.ts.map +1 -0
- package/dist/deploy/settings/package-manifest.js +41 -0
- package/dist/deploy/settings/package-manifest.js.map +1 -0
- package/dist/deploy/settings/paths.d.ts +9 -0
- package/dist/deploy/settings/paths.d.ts.map +1 -0
- package/dist/deploy/settings/paths.js +82 -0
- package/dist/deploy/settings/paths.js.map +1 -0
- package/dist/deploy/settings/screenshots.d.ts +8 -0
- package/dist/deploy/settings/screenshots.d.ts.map +1 -0
- package/dist/deploy/settings/screenshots.js +79 -0
- package/dist/deploy/settings/screenshots.js.map +1 -0
- package/dist/deploy/settings/starter.d.ts +4 -0
- package/dist/deploy/settings/starter.d.ts.map +1 -0
- package/dist/deploy/settings/starter.js +28 -0
- package/dist/deploy/settings/starter.js.map +1 -0
- package/dist/deploy/settings/version.d.ts +9 -0
- package/dist/deploy/settings/version.d.ts.map +1 -0
- package/dist/deploy/settings/version.js +37 -0
- package/dist/deploy/settings/version.js.map +1 -0
- package/dist/deploy/targets/appimage.d.ts +4 -0
- package/dist/deploy/targets/appimage.d.ts.map +1 -0
- package/dist/deploy/targets/appimage.js +105 -0
- package/dist/deploy/targets/appimage.js.map +1 -0
- package/dist/deploy/targets/deb.d.ts +4 -0
- package/dist/deploy/targets/deb.d.ts.map +1 -0
- package/dist/deploy/targets/deb.js +4 -0
- package/dist/deploy/targets/deb.js.map +1 -0
- package/dist/deploy/targets/flatpak-manifest.d.ts +6 -0
- package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -0
- package/dist/deploy/targets/flatpak-manifest.js +48 -0
- package/dist/deploy/targets/flatpak-manifest.js.map +1 -0
- package/dist/deploy/targets/flatpak-prebuilt.d.ts +8 -0
- package/dist/deploy/targets/flatpak-prebuilt.d.ts.map +1 -0
- package/dist/deploy/targets/flatpak-prebuilt.js +43 -0
- package/dist/deploy/targets/flatpak-prebuilt.js.map +1 -0
- package/dist/deploy/targets/flatpak-source.d.ts +5 -0
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -0
- package/dist/deploy/targets/flatpak-source.js +110 -0
- package/dist/deploy/targets/flatpak-source.js.map +1 -0
- package/dist/deploy/targets/flatpak-sources.d.ts +17 -0
- package/dist/deploy/targets/flatpak-sources.d.ts.map +1 -0
- package/dist/deploy/targets/flatpak-sources.js +108 -0
- package/dist/deploy/targets/flatpak-sources.js.map +1 -0
- package/dist/deploy/targets/flatpak.d.ts +4 -0
- package/dist/deploy/targets/flatpak.d.ts.map +1 -0
- package/dist/deploy/targets/flatpak.js +112 -0
- package/dist/deploy/targets/flatpak.js.map +1 -0
- package/dist/deploy/targets/nfpm-target.d.ts +5 -0
- package/dist/deploy/targets/nfpm-target.d.ts.map +1 -0
- package/dist/deploy/targets/nfpm-target.js +26 -0
- package/dist/deploy/targets/nfpm-target.js.map +1 -0
- package/dist/deploy/targets/rpm.d.ts +4 -0
- package/dist/deploy/targets/rpm.d.ts.map +1 -0
- package/dist/deploy/targets/rpm.js +4 -0
- package/dist/deploy/targets/rpm.js.map +1 -0
- package/dist/deploy/tools.d.ts +18 -0
- package/dist/deploy/tools.d.ts.map +1 -0
- package/dist/deploy/tools.js +92 -0
- package/dist/deploy/tools.js.map +1 -0
- package/dist/deploy/types.d.ts +140 -0
- package/dist/deploy/types.d.ts.map +1 -0
- package/dist/deploy/types.js +2 -0
- package/dist/deploy/types.js.map +1 -0
- package/dist/deploy/vendored/appimagetool.d.ts +7 -0
- package/dist/deploy/vendored/appimagetool.d.ts.map +1 -0
- package/dist/deploy/vendored/appimagetool.js +42 -0
- package/dist/deploy/vendored/appimagetool.js.map +1 -0
- package/dist/deploy/vendored/nfpm.d.ts +3 -0
- package/dist/deploy/vendored/nfpm.d.ts.map +1 -0
- package/dist/deploy/vendored/nfpm.js +60 -0
- package/dist/deploy/vendored/nfpm.js.map +1 -0
- package/dist/dev/change-queue.d.ts +11 -0
- package/dist/dev/change-queue.d.ts.map +1 -0
- package/dist/dev/change-queue.js +34 -0
- package/dist/dev/change-queue.js.map +1 -0
- package/dist/dev/entry-env.d.ts +3 -0
- package/dist/dev/entry-env.d.ts.map +1 -0
- package/dist/dev/entry-env.js +3 -0
- package/dist/dev/entry-env.js.map +1 -0
- package/dist/dev/failure-tracker.d.ts +10 -0
- package/dist/dev/failure-tracker.d.ts.map +1 -0
- package/dist/dev/failure-tracker.js +61 -0
- package/dist/dev/failure-tracker.js.map +1 -0
- package/dist/dev/missing-import.d.ts +4 -0
- package/dist/dev/missing-import.d.ts.map +1 -0
- package/dist/dev/missing-import.js +23 -0
- package/dist/dev/missing-import.js.map +1 -0
- package/dist/dev/runner-deps.d.ts.map +1 -1
- package/dist/dev/runner-deps.js +25 -5
- 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 +3 -3
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts +8 -3
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +343 -65
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/supervisor.d.ts +10 -4
- package/dist/dev/supervisor.d.ts.map +1 -1
- package/dist/dev/supervisor.js +23 -4
- package/dist/dev/supervisor.js.map +1 -1
- package/dist/dev/vite-dev-server.d.ts +13 -2
- package/dist/dev/vite-dev-server.d.ts.map +1 -1
- package/dist/dev/vite-dev-server.js +30 -2
- package/dist/dev/vite-dev-server.js.map +1 -1
- package/dist/internal/application-args.d.ts +6 -0
- package/dist/internal/application-args.d.ts.map +1 -0
- package/dist/internal/application-args.js +10 -0
- package/dist/internal/application-args.js.map +1 -0
- package/dist/internal/entry-arg.d.ts +1 -7
- package/dist/internal/entry-arg.d.ts.map +1 -1
- package/dist/internal/entry-arg.js +18 -11
- package/dist/internal/entry-arg.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -2
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +1 -1
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/module-loads.d.ts +7 -0
- package/dist/internal/module-loads.d.ts.map +1 -0
- package/dist/internal/module-loads.js +21 -0
- package/dist/internal/module-loads.js.map +1 -0
- package/dist/internal/prepare-project.d.ts +16 -0
- package/dist/internal/prepare-project.d.ts.map +1 -0
- package/dist/internal/prepare-project.js +15 -0
- package/dist/internal/prepare-project.js.map +1 -0
- package/dist/internal/run-cli-tool.d.ts +11 -0
- package/dist/internal/run-cli-tool.d.ts.map +1 -0
- package/dist/internal/run-cli-tool.js +24 -0
- package/dist/internal/run-cli-tool.js.map +1 -0
- package/dist/internal/staging-dir.d.ts +8 -1
- package/dist/internal/staging-dir.d.ts.map +1 -1
- package/dist/internal/staging-dir.js +38 -2
- package/dist/internal/staging-dir.js.map +1 -1
- package/dist/mcp/client.d.ts +1 -1
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/handlers.d.ts +1 -1
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +78 -41
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/serialize-widget.d.ts +4 -3
- package/dist/mcp/serialize-widget.d.ts.map +1 -1
- package/dist/mcp/serialize-widget.js +47 -17
- package/dist/mcp/serialize-widget.js.map +1 -1
- package/dist/mcp/testing-loader.d.ts +5 -2
- package/dist/mcp/testing-loader.d.ts.map +1 -1
- package/dist/mcp/testing-loader.js +7 -3
- package/dist/mcp/testing-loader.js.map +1 -1
- package/dist/mcp/widget-properties.d.ts +6 -0
- package/dist/mcp/widget-properties.d.ts.map +1 -0
- package/dist/mcp/widget-properties.js +102 -0
- package/dist/mcp/widget-properties.js.map +1 -0
- package/dist/refresh-runtime.d.ts +2 -1
- package/dist/refresh-runtime.d.ts.map +1 -1
- package/dist/refresh-runtime.js +32 -2
- package/dist/refresh-runtime.js.map +1 -1
- package/dist/settings/compile.d.ts.map +1 -1
- package/dist/settings/compile.js +8 -12
- package/dist/settings/compile.js.map +1 -1
- package/dist/settings/schema.d.ts +1 -2
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +1 -1
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-emitter.d.ts +9 -0
- package/dist/vite-plugins/asset-emitter.d.ts.map +1 -0
- package/dist/vite-plugins/asset-emitter.js +2 -0
- package/dist/vite-plugins/asset-emitter.js.map +1 -0
- package/dist/vite-plugins/asset-extensions.d.ts +2 -2
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
- package/dist/vite-plugins/asset-extensions.js +2 -1
- package/dist/vite-plugins/asset-extensions.js.map +1 -1
- package/dist/vite-plugins/asset-imports.d.ts +4 -0
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -0
- package/dist/vite-plugins/asset-imports.js +88 -0
- package/dist/vite-plugins/asset-imports.js.map +1 -0
- package/dist/vite-plugins/asset-specifier.d.ts +5 -0
- package/dist/vite-plugins/asset-specifier.d.ts.map +1 -0
- package/dist/vite-plugins/asset-specifier.js +7 -0
- package/dist/vite-plugins/asset-specifier.js.map +1 -0
- package/dist/vite-plugins/built-url.d.ts.map +1 -1
- package/dist/vite-plugins/built-url.js +14 -10
- package/dist/vite-plugins/built-url.js.map +1 -1
- package/dist/vite-plugins/ensure-store.d.ts +4 -0
- package/dist/vite-plugins/ensure-store.d.ts.map +1 -0
- package/dist/vite-plugins/ensure-store.js +10 -0
- package/dist/vite-plugins/ensure-store.js.map +1 -0
- package/dist/vite-plugins/esm-extension.d.ts +4 -0
- package/dist/vite-plugins/esm-extension.d.ts.map +1 -0
- package/dist/vite-plugins/esm-extension.js +4 -0
- package/dist/vite-plugins/esm-extension.js.map +1 -0
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +1 -3
- package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
- package/dist/vite-plugins/fast-refresh/swc-refresh.js +1 -1
- package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
- package/dist/vite-plugins/icons.d.ts.map +1 -1
- package/dist/vite-plugins/icons.js.map +1 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +4 -0
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/react-compiler.d.ts +1 -1
- package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
- package/dist/vite-plugins/react-compiler.js.map +1 -1
- package/dist/vite-plugins/resource-shared.d.ts +2 -1
- package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
- package/dist/vite-plugins/resource-shared.js +2 -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 +36 -44
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/self-contained.d.ts +4 -0
- package/dist/vite-plugins/self-contained.d.ts.map +1 -0
- package/dist/vite-plugins/self-contained.js +244 -0
- package/dist/vite-plugins/self-contained.js.map +1 -0
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +19 -40
- package/dist/vite-plugins/settings.js.map +1 -1
- package/dist/vite-plugins/store-links.d.ts +4 -0
- package/dist/vite-plugins/store-links.d.ts.map +1 -0
- package/dist/vite-plugins/store-links.js +19 -0
- package/dist/vite-plugins/store-links.js.map +1 -0
- package/dist/vite-plugins/undeclared-library.d.ts +1 -1
- package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
- package/dist/vite-plugins/undeclared-library.js +51 -12
- package/dist/vite-plugins/undeclared-library.js.map +1 -1
- package/dist/vite-plugins/worker.d.ts +4 -0
- package/dist/vite-plugins/worker.d.ts.map +1 -0
- package/dist/vite-plugins/worker.js +138 -0
- package/dist/vite-plugins/worker.js.map +1 -0
- package/dist/vitest-plugin.d.ts +7 -0
- package/dist/vitest-plugin.d.ts.map +1 -1
- package/dist/vitest-plugin.js +14 -1
- package/dist/vitest-plugin.js.map +1 -1
- package/env.d.ts +106 -25
- package/package.json +23 -12
- package/src/builder.ts +24 -5
- package/src/cli.ts +10 -3
- package/src/codegen/freshness.ts +2 -4
- package/src/codegen/run-codegen.ts +37 -23
- package/src/codegen/store-resolver.ts +1 -1
- package/src/commands/build.ts +5 -6
- package/src/commands/codegen.ts +14 -1
- package/src/commands/deploy.ts +47 -0
- package/src/commands/dev.ts +7 -5
- package/src/commands/docs.ts +39 -4
- package/src/deploy/depends.ts +42 -0
- package/src/deploy/download.ts +148 -0
- package/src/deploy/freedesktop/copyright.ts +41 -0
- package/src/deploy/freedesktop/dbus-service.ts +19 -0
- package/src/deploy/freedesktop/desktop-entry.ts +102 -0
- package/src/deploy/freedesktop/ini.ts +39 -0
- package/src/deploy/freedesktop/metainfo-sections.ts +116 -0
- package/src/deploy/freedesktop/metainfo.ts +46 -0
- package/src/deploy/freedesktop/mime-package.ts +28 -0
- package/src/deploy/freedesktop/validate.ts +124 -0
- package/src/deploy/freedesktop/xml.ts +53 -0
- package/src/deploy/git.ts +20 -0
- package/src/deploy/install-hints.ts +108 -0
- package/src/deploy/nfpm/config.ts +153 -0
- package/src/deploy/nfpm/contents.ts +69 -0
- package/src/deploy/nfpm/description.ts +11 -0
- package/src/deploy/nfpm/optional.ts +8 -0
- package/src/deploy/nfpm/pack.ts +44 -0
- package/src/deploy/node-runtime/download.ts +48 -0
- package/src/deploy/node-runtime/elf.ts +145 -0
- package/src/deploy/node-runtime/guard.ts +29 -0
- package/src/deploy/node-runtime/index.ts +80 -0
- package/src/deploy/payload/copy-tree.ts +51 -0
- package/src/deploy/payload/icons.ts +80 -0
- package/src/deploy/payload/launcher.ts +27 -0
- package/src/deploy/payload/schemas.ts +27 -0
- package/src/deploy/payload/stage.ts +145 -0
- package/src/deploy/registry.ts +40 -0
- package/src/deploy/run-deploy.ts +235 -0
- package/src/deploy/settings/arch.ts +18 -0
- package/src/deploy/settings/categories.ts +39 -0
- package/src/deploy/settings/exec.ts +29 -0
- package/src/deploy/settings/identity.ts +133 -0
- package/src/deploy/settings/index.ts +189 -0
- package/src/deploy/settings/package-manifest.ts +66 -0
- package/src/deploy/settings/paths.ts +115 -0
- package/src/deploy/settings/screenshots.ts +125 -0
- package/src/deploy/settings/starter.ts +41 -0
- package/src/deploy/settings/version.ts +59 -0
- package/src/deploy/targets/appimage.ts +140 -0
- package/src/deploy/targets/deb.ts +6 -0
- package/src/deploy/targets/flatpak-manifest.ts +61 -0
- package/src/deploy/targets/flatpak-prebuilt.ts +59 -0
- package/src/deploy/targets/flatpak-source.ts +168 -0
- package/src/deploy/targets/flatpak-sources.ts +171 -0
- package/src/deploy/targets/flatpak.ts +143 -0
- package/src/deploy/targets/nfpm-target.ts +33 -0
- package/src/deploy/targets/rpm.ts +6 -0
- package/src/deploy/tools.ts +135 -0
- package/src/deploy/types.ts +174 -0
- package/src/deploy/vendored/appimagetool.ts +57 -0
- package/src/deploy/vendored/nfpm.ts +79 -0
- package/src/dev/change-queue.ts +59 -0
- package/src/dev/entry-env.ts +3 -0
- package/src/dev/failure-tracker.ts +92 -0
- package/src/dev/missing-import.ts +32 -0
- package/src/dev/runner-deps.ts +34 -5
- package/src/dev/runner-main.ts +3 -4
- package/src/dev/runner.ts +524 -89
- package/src/dev/supervisor.ts +51 -11
- package/src/dev/vite-dev-server.ts +54 -3
- package/src/internal/application-args.ts +13 -0
- package/src/internal/entry-arg.ts +25 -11
- package/src/internal/errors.ts +1 -1
- package/src/internal/module-loads.ts +32 -0
- package/src/internal/prepare-project.ts +23 -0
- package/src/internal/run-cli-tool.ts +38 -0
- package/src/internal/staging-dir.ts +57 -2
- package/src/mcp/client.ts +1 -1
- package/src/mcp/handlers.ts +123 -56
- package/src/mcp/index.ts +1 -0
- package/src/mcp/serialize-widget.ts +73 -22
- package/src/mcp/testing-loader.ts +19 -4
- package/src/mcp/widget-properties.ts +153 -0
- package/src/refresh-runtime.ts +48 -2
- package/src/settings/compile.ts +8 -11
- package/src/settings/schema.ts +0 -1
- package/src/vite-plugins/asset-emitter.ts +5 -0
- package/src/vite-plugins/asset-extensions.ts +2 -1
- package/src/vite-plugins/asset-imports.ts +134 -0
- package/src/vite-plugins/asset-specifier.ts +9 -0
- package/src/vite-plugins/built-url.ts +19 -13
- package/src/vite-plugins/ensure-store.ts +14 -0
- package/src/vite-plugins/esm-extension.ts +4 -0
- package/src/vite-plugins/fast-refresh/swc-refresh.ts +1 -1
- package/src/vite-plugins/icons.ts +2 -5
- package/src/vite-plugins/index.ts +4 -0
- package/src/vite-plugins/react-compiler.ts +2 -1
- package/src/vite-plugins/resource-shared.ts +2 -0
- package/src/vite-plugins/resources.ts +43 -52
- package/src/vite-plugins/self-contained.ts +352 -0
- package/src/vite-plugins/settings.ts +23 -50
- package/src/vite-plugins/store-links.ts +25 -0
- package/src/vite-plugins/undeclared-library.ts +75 -13
- package/src/vite-plugins/worker.ts +238 -0
- package/src/vitest-plugin.ts +15 -1
- package/dist/internal/resolve-cli-tool.d.ts +0 -3
- package/dist/internal/resolve-cli-tool.d.ts.map +0 -1
- package/dist/internal/resolve-cli-tool.js +0 -27
- package/dist/internal/resolve-cli-tool.js.map +0 -1
- package/src/internal/resolve-cli-tool.ts +0 -37
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { DeployConfig, DeployDeveloper } from "../types.js";
|
|
2
|
+
import type { PackageManifest } from "./package-manifest.js";
|
|
3
|
+
|
|
4
|
+
type IdentityRequest = {
|
|
5
|
+
applicationId: string;
|
|
6
|
+
deploy: DeployConfig;
|
|
7
|
+
manifest: PackageManifest;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const DEFAULT_METADATA_LICENSE = "CC0-1.0";
|
|
11
|
+
const NAME_SEPARATORS = /[_-]+/;
|
|
12
|
+
const NON_NAME_CHARACTERS = /[^a-z\d]+/;
|
|
13
|
+
const SCOPE_PREFIX = /^@[^/]+\//;
|
|
14
|
+
const BINARY_NAME_PATTERN = /^[a-z\d][a-z\d+.-]+$/;
|
|
15
|
+
|
|
16
|
+
const lastSegment = (applicationId: string): string => applicationId.split(".").at(-1) ?? applicationId;
|
|
17
|
+
|
|
18
|
+
const titleCase = (value: string): string =>
|
|
19
|
+
value
|
|
20
|
+
.split(NAME_SEPARATORS)
|
|
21
|
+
.filter((word) => word.length > 0)
|
|
22
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
23
|
+
.join(" ");
|
|
24
|
+
|
|
25
|
+
const normalizePackageName = (value: string): string =>
|
|
26
|
+
value
|
|
27
|
+
.replace(SCOPE_PREFIX, "")
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.split(NON_NAME_CHARACTERS)
|
|
30
|
+
.filter((part) => part.length > 0)
|
|
31
|
+
.join("-");
|
|
32
|
+
|
|
33
|
+
const resolveBinaryName = ({ applicationId, deploy, manifest }: IdentityRequest): string => {
|
|
34
|
+
const configured = deploy.binaryName;
|
|
35
|
+
const derived = normalizePackageName(configured ?? manifest.name ?? lastSegment(applicationId));
|
|
36
|
+
|
|
37
|
+
if (!BINARY_NAME_PATTERN.test(derived)) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
`Cannot use "${derived}" as a package name: it must match ${String(BINARY_NAME_PATTERN)}. ` +
|
|
40
|
+
"Set `deploy.binaryName`.",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return derived;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const resolveName = ({ applicationId, deploy, manifest }: IdentityRequest): string =>
|
|
48
|
+
deploy.name ?? titleCase(manifest.name?.replace(SCOPE_PREFIX, "") ?? lastSegment(applicationId));
|
|
49
|
+
|
|
50
|
+
const resolveSummary = ({ deploy, manifest }: IdentityRequest): string => {
|
|
51
|
+
const summary = deploy.summary ?? manifest.description?.split("\n", 1)[0];
|
|
52
|
+
|
|
53
|
+
if (summary === undefined) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
"Cannot deploy without a summary: set `deploy.summary` in gtkx.config.ts, " +
|
|
56
|
+
"or `description` in package.json.",
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return summary;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const resolveDescription = (request: IdentityRequest): string[] => {
|
|
64
|
+
const configured = request.deploy.description;
|
|
65
|
+
|
|
66
|
+
return configured === undefined || configured.length === 0 ? [resolveSummary(request)] : configured;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const resolveDeveloperId = (applicationId: string): string | null => {
|
|
70
|
+
const segments = applicationId.split(".");
|
|
71
|
+
|
|
72
|
+
return segments.length > 2 ? segments.slice(0, -1).join(".") : null;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const resolveDeveloper = ({ applicationId, deploy, manifest }: IdentityRequest): DeployDeveloper => {
|
|
76
|
+
const name = deploy.developer?.name ?? manifest.author.name;
|
|
77
|
+
|
|
78
|
+
if (name === null) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
"Cannot deploy without a developer: set `deploy.developer.name` in gtkx.config.ts, " +
|
|
81
|
+
"or `author` in package.json.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
id: deploy.developer?.id ?? resolveDeveloperId(applicationId),
|
|
87
|
+
name,
|
|
88
|
+
email: deploy.developer?.email ?? manifest.author.email,
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const resolveLicense = ({ deploy, manifest }: IdentityRequest): string => {
|
|
93
|
+
const license = deploy.license ?? manifest.license;
|
|
94
|
+
|
|
95
|
+
if (license === null) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
"Cannot deploy without a license: set `deploy.license` in gtkx.config.ts, or `license` in package.json.",
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return license;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const resolveVersionString = ({ deploy, manifest }: IdentityRequest): string => {
|
|
105
|
+
const version = deploy.version ?? manifest.version;
|
|
106
|
+
|
|
107
|
+
if (version === null) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
"Cannot deploy without a version: set `deploy.version` in gtkx.config.ts, or `version` in package.json.",
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return version;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const resolveCopyright = (request: IdentityRequest, developer: DeployDeveloper, year: number): string =>
|
|
117
|
+
request.deploy.copyright ?? `Copyright © ${String(year)} ${developer.name}`;
|
|
118
|
+
|
|
119
|
+
const resolveMetadataLicense = ({ deploy }: IdentityRequest): string =>
|
|
120
|
+
deploy.metadataLicense ?? DEFAULT_METADATA_LICENSE;
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
type IdentityRequest,
|
|
124
|
+
resolveBinaryName,
|
|
125
|
+
resolveCopyright,
|
|
126
|
+
resolveDescription,
|
|
127
|
+
resolveDeveloper,
|
|
128
|
+
resolveLicense,
|
|
129
|
+
resolveMetadataLicense,
|
|
130
|
+
resolveName,
|
|
131
|
+
resolveSummary,
|
|
132
|
+
resolveVersionString,
|
|
133
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { Config } from "@gtkx/config";
|
|
2
|
+
import type {
|
|
3
|
+
DeployConfig,
|
|
4
|
+
DeployDesktopAction,
|
|
5
|
+
DeployDeveloper,
|
|
6
|
+
DeployRelease,
|
|
7
|
+
DeploySettings,
|
|
8
|
+
DeployVersions,
|
|
9
|
+
} from "../types.js";
|
|
10
|
+
import { resolveArch } from "./arch.js";
|
|
11
|
+
import { resolveExecToken, resolveFileAssociations, resolveMimeTypes } from "./exec.js";
|
|
12
|
+
import {
|
|
13
|
+
type IdentityRequest,
|
|
14
|
+
resolveBinaryName,
|
|
15
|
+
resolveCopyright,
|
|
16
|
+
resolveDescription,
|
|
17
|
+
resolveDeveloper,
|
|
18
|
+
resolveLicense,
|
|
19
|
+
resolveMetadataLicense,
|
|
20
|
+
resolveName,
|
|
21
|
+
resolveSummary,
|
|
22
|
+
resolveVersionString,
|
|
23
|
+
} from "./identity.js";
|
|
24
|
+
import { readPackageManifest } from "./package-manifest.js";
|
|
25
|
+
import { resolvePaths } from "./paths.js";
|
|
26
|
+
import { resolveScreenshots } from "./screenshots.js";
|
|
27
|
+
import { resolveVersions } from "./version.js";
|
|
28
|
+
|
|
29
|
+
type SettingsRequest = {
|
|
30
|
+
root: string;
|
|
31
|
+
config: Config;
|
|
32
|
+
outDirOverride?: string | undefined;
|
|
33
|
+
now?: Date | undefined;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type ResolvedCore = {
|
|
37
|
+
identity: IdentityRequest;
|
|
38
|
+
developer: DeployDeveloper;
|
|
39
|
+
versions: DeployVersions;
|
|
40
|
+
date: string;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type IdentitySlice = Pick<
|
|
44
|
+
DeploySettings,
|
|
45
|
+
| "applicationId" |
|
|
46
|
+
"binaryName" |
|
|
47
|
+
"copyright" |
|
|
48
|
+
"description" |
|
|
49
|
+
"developer" |
|
|
50
|
+
"genericName" |
|
|
51
|
+
"homepage" |
|
|
52
|
+
"license" |
|
|
53
|
+
"metadataLicense" |
|
|
54
|
+
"name" |
|
|
55
|
+
"summary"
|
|
56
|
+
>;
|
|
57
|
+
|
|
58
|
+
type MetadataSlice = Pick<
|
|
59
|
+
DeploySettings,
|
|
60
|
+
"branding" | "categories" | "contentRating" | "keywords" | "mimeTypes" | "releases" | "screenshots" | "urls"
|
|
61
|
+
>;
|
|
62
|
+
|
|
63
|
+
type DesktopSlice = Pick<
|
|
64
|
+
DeploySettings,
|
|
65
|
+
| "desktopActions" |
|
|
66
|
+
"desktopEntry" |
|
|
67
|
+
"execArgs" |
|
|
68
|
+
"execToken" |
|
|
69
|
+
"fileAssociations" |
|
|
70
|
+
"isDbusActivatable" |
|
|
71
|
+
"protocols"
|
|
72
|
+
>;
|
|
73
|
+
|
|
74
|
+
const ISO_DATE_LENGTH = 10;
|
|
75
|
+
const MILLISECONDS_PER_SECOND = 1000;
|
|
76
|
+
|
|
77
|
+
const reproducibleDate = (epoch: string | undefined): Date | null => {
|
|
78
|
+
if (epoch === undefined || epoch.trim().length === 0) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const seconds = Number(epoch);
|
|
83
|
+
|
|
84
|
+
return Number.isFinite(seconds) ? new Date(seconds * MILLISECONDS_PER_SECOND) : null;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const buildDate = (now: Date): string => {
|
|
88
|
+
const stamp = reproducibleDate(process.env.SOURCE_DATE_EPOCH) ?? now;
|
|
89
|
+
|
|
90
|
+
return stamp.toISOString().slice(0, ISO_DATE_LENGTH);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const newestFirst = (a: DeployRelease, b: DeployRelease): number => Number(a.date < b.date) - Number(a.date > b.date);
|
|
94
|
+
|
|
95
|
+
const resolveReleases = (deploy: DeployConfig, version: string, date: string): DeployRelease[] =>
|
|
96
|
+
(deploy.releases ?? [{ version, date }])
|
|
97
|
+
.map((entry) => ({
|
|
98
|
+
version: entry.version,
|
|
99
|
+
date: entry.date,
|
|
100
|
+
type: entry.type ?? null,
|
|
101
|
+
urgency: entry.urgency ?? null,
|
|
102
|
+
notes: entry.notes ?? [],
|
|
103
|
+
url: entry.url ?? null,
|
|
104
|
+
}))
|
|
105
|
+
.toSorted(newestFirst);
|
|
106
|
+
|
|
107
|
+
const resolveDesktopActions = (deploy: DeployConfig): DeployDesktopAction[] =>
|
|
108
|
+
Object.entries(deploy.desktopActions ?? {}).map(([id, action]) => ({
|
|
109
|
+
id,
|
|
110
|
+
name: action.name,
|
|
111
|
+
args: action.args ?? [],
|
|
112
|
+
icon: action.icon ?? null,
|
|
113
|
+
}));
|
|
114
|
+
|
|
115
|
+
const resolveLibraries = (config: Config): string[] => (Array.isArray(config.libraries) ? config.libraries : []);
|
|
116
|
+
|
|
117
|
+
const identitySlice = ({ identity, developer, date }: ResolvedCore): IdentitySlice => ({
|
|
118
|
+
applicationId: identity.applicationId,
|
|
119
|
+
binaryName: resolveBinaryName(identity),
|
|
120
|
+
name: resolveName(identity),
|
|
121
|
+
genericName: identity.deploy.genericName ?? null,
|
|
122
|
+
summary: resolveSummary(identity),
|
|
123
|
+
description: resolveDescription(identity),
|
|
124
|
+
developer,
|
|
125
|
+
license: resolveLicense(identity),
|
|
126
|
+
metadataLicense: resolveMetadataLicense(identity),
|
|
127
|
+
copyright: resolveCopyright(identity, developer, new Date(date).getUTCFullYear()),
|
|
128
|
+
homepage: identity.deploy.homepage ?? identity.manifest.homepage,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const metadataSlice = (root: string, { identity, versions, date }: ResolvedCore): MetadataSlice => {
|
|
132
|
+
const deploy = identity.deploy;
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
keywords: deploy.keywords ?? [],
|
|
136
|
+
categories: deploy.categories ?? [],
|
|
137
|
+
mimeTypes: resolveMimeTypes(deploy),
|
|
138
|
+
urls: deploy.urls ?? {},
|
|
139
|
+
screenshots: resolveScreenshots({ root, deploy }),
|
|
140
|
+
branding: deploy.branding ?? null,
|
|
141
|
+
contentRating: deploy.contentRating ?? {},
|
|
142
|
+
releases: resolveReleases(deploy, versions.packageVersion, date),
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const desktopSlice = (deploy: DeployConfig): DesktopSlice => ({
|
|
147
|
+
execArgs: deploy.execArgs ?? [],
|
|
148
|
+
execToken: resolveExecToken(deploy),
|
|
149
|
+
fileAssociations: resolveFileAssociations(deploy),
|
|
150
|
+
protocols: deploy.protocols ?? [],
|
|
151
|
+
desktopActions: resolveDesktopActions(deploy),
|
|
152
|
+
desktopEntry: deploy.desktopEntry ?? {},
|
|
153
|
+
isDbusActivatable: deploy.isDbusActivatable ?? false,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const resolveCore = (request: SettingsRequest): ResolvedCore => {
|
|
157
|
+
const identity: IdentityRequest = {
|
|
158
|
+
applicationId: request.config.applicationId,
|
|
159
|
+
deploy: request.config.deploy ?? {},
|
|
160
|
+
manifest: readPackageManifest(request.root),
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const versions = resolveVersions({
|
|
164
|
+
version: resolveVersionString(identity),
|
|
165
|
+
release: identity.deploy.release,
|
|
166
|
+
epoch: identity.deploy.epoch,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
return { identity, developer: resolveDeveloper(identity), versions, date: buildDate(request.now ?? new Date()) };
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const resolveDeploySettings = (request: SettingsRequest): DeploySettings => {
|
|
173
|
+
const core = resolveCore(request);
|
|
174
|
+
const deploy = core.identity.deploy;
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
...identitySlice(core),
|
|
178
|
+
...metadataSlice(request.root, core),
|
|
179
|
+
...desktopSlice(deploy),
|
|
180
|
+
extraFiles: deploy.extraFiles ?? {},
|
|
181
|
+
versions: core.versions,
|
|
182
|
+
arch: resolveArch(),
|
|
183
|
+
paths: resolvePaths({ root: request.root, deploy, outDirOverride: request.outDirOverride }),
|
|
184
|
+
libraries: resolveLibraries(request.config),
|
|
185
|
+
deploy,
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
export { resolveDeploySettings };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { isRecord } from "@gtkx/utils";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
type ManifestAuthor = {
|
|
6
|
+
name: string | null;
|
|
7
|
+
email: string | null;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
type PackageManifest = {
|
|
11
|
+
name: string | null;
|
|
12
|
+
version: string | null;
|
|
13
|
+
description: string | null;
|
|
14
|
+
license: string | null;
|
|
15
|
+
homepage: string | null;
|
|
16
|
+
author: ManifestAuthor;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const AUTHOR_PATTERN = /^(?<name>[^<(]*)(?:\([^)]*\)\s*)?(?:<(?<email>[^>]*)>)?/;
|
|
20
|
+
const EMPTY_AUTHOR: ManifestAuthor = { name: null, email: null };
|
|
21
|
+
|
|
22
|
+
const optionalString = (value: unknown): string | null =>
|
|
23
|
+
typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
24
|
+
|
|
25
|
+
const parseAuthorString = (author: string): ManifestAuthor => {
|
|
26
|
+
const groups = AUTHOR_PATTERN.exec(author)?.groups;
|
|
27
|
+
|
|
28
|
+
return { name: optionalString(groups?.name), email: optionalString(groups?.email) };
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const parseAuthor = (author: unknown): ManifestAuthor => {
|
|
32
|
+
if (typeof author === "string") {
|
|
33
|
+
return parseAuthorString(author);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (!isRecord(author)) {
|
|
37
|
+
return EMPTY_AUTHOR;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { name: optionalString(author.name), email: optionalString(author.email) };
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const readManifestJson = (root: string): Record<string, unknown> => {
|
|
44
|
+
try {
|
|
45
|
+
const parsed: unknown = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
|
|
46
|
+
|
|
47
|
+
return isRecord(parsed) ? parsed : {};
|
|
48
|
+
} catch {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const readPackageManifest = (root: string): PackageManifest => {
|
|
54
|
+
const manifest = readManifestJson(root);
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
name: optionalString(manifest.name),
|
|
58
|
+
version: optionalString(manifest.version),
|
|
59
|
+
description: optionalString(manifest.description),
|
|
60
|
+
license: optionalString(manifest.license),
|
|
61
|
+
homepage: optionalString(manifest.homepage),
|
|
62
|
+
author: parseAuthor(manifest.author),
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export { type PackageManifest, readPackageManifest };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type Stats, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import type { DeployConfig, DeployPaths } from "../types.js";
|
|
4
|
+
import { resolveDataDir } from "../../internal/data-dir.js";
|
|
5
|
+
import { findSchemaFiles } from "../../settings/schema.js";
|
|
6
|
+
|
|
7
|
+
type PathsRequest = {
|
|
8
|
+
root: string;
|
|
9
|
+
deploy: DeployConfig;
|
|
10
|
+
outDirOverride: string | undefined;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type ResolvedIcons = {
|
|
14
|
+
iconsDir: string | null;
|
|
15
|
+
iconFile: string | null;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const DEFAULT_OUT_DIR = "build";
|
|
19
|
+
const DIST_DIR = "dist";
|
|
20
|
+
const ICONS_DIR = "icons";
|
|
21
|
+
const LICENSE_CANDIDATES = ["LICENSE", "LICENSE.md", "LICENSE.txt", "COPYING", "COPYING.md"];
|
|
22
|
+
|
|
23
|
+
const isInside = (parent: string, candidate: string): boolean => {
|
|
24
|
+
const rel = relative(parent, candidate);
|
|
25
|
+
|
|
26
|
+
return rel.length > 0 && !rel.startsWith("..") && !isAbsolute(rel);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const resolveOutDir = ({ root, deploy, outDirOverride }: PathsRequest): string => {
|
|
30
|
+
const configured = outDirOverride ?? deploy.outDir ?? DEFAULT_OUT_DIR;
|
|
31
|
+
const outDir = resolve(root, configured);
|
|
32
|
+
|
|
33
|
+
if (!isInside(root, outDir)) {
|
|
34
|
+
throw new Error(`Cannot use "${configured}" as the deploy output directory: it is outside ${root}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return outDir;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const getStats = (path: string): Stats | undefined => {
|
|
41
|
+
try {
|
|
42
|
+
return statSync(path, { throwIfNoEntry: false });
|
|
43
|
+
} catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const existingFile = (path: string): string | null => (getStats(path)?.isFile() === true ? path : null);
|
|
49
|
+
const existingDir = (path: string): string | null => (getStats(path)?.isDirectory() === true ? path : null);
|
|
50
|
+
|
|
51
|
+
const resolveLicenseFile = (root: string, configured: string | undefined): string | null => {
|
|
52
|
+
if (configured !== undefined) {
|
|
53
|
+
const path = resolve(root, configured);
|
|
54
|
+
|
|
55
|
+
if (existingFile(path) === null) {
|
|
56
|
+
throw new Error(`Cannot read the license file "${configured}": no such file under ${root}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return path;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return LICENSE_CANDIDATES.map((name) => existingFile(join(root, name))).find((path) => path !== null) ?? null;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const configuredIcons = (root: string, configured: string): ResolvedIcons => {
|
|
66
|
+
const path = resolve(root, configured);
|
|
67
|
+
|
|
68
|
+
if (!isInside(root, path)) {
|
|
69
|
+
throw new Error(`Cannot use "${configured}" as the icon path: it is outside ${root}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (existingDir(path) !== null) {
|
|
73
|
+
return { iconsDir: path, iconFile: null };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (existingFile(path) === null) {
|
|
77
|
+
throw new Error(`Cannot read the icon path "${configured}": no such file or directory under ${root}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return { iconsDir: null, iconFile: path };
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const defaultIcons = (root: string, dataDir: string | null): ResolvedIcons => ({
|
|
84
|
+
iconsDir: dataDir === null ? null : existingDir(join(root, dataDir, ICONS_DIR)),
|
|
85
|
+
iconFile: null,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const resolveIcons = (root: string, dataDir: string | null, configured: string | undefined): ResolvedIcons =>
|
|
89
|
+
configured === undefined ? defaultIcons(root, dataDir) : configuredIcons(root, configured);
|
|
90
|
+
|
|
91
|
+
const resolvePaths = (request: PathsRequest): DeployPaths => {
|
|
92
|
+
const { root, deploy } = request;
|
|
93
|
+
const outDir = resolveOutDir(request);
|
|
94
|
+
const dataDir = resolveDataDir(root);
|
|
95
|
+
const { iconsDir, iconFile } = resolveIcons(root, dataDir, deploy.icons);
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
root,
|
|
99
|
+
dist: join(root, DIST_DIR),
|
|
100
|
+
outDir,
|
|
101
|
+
metadata: join(outDir, "metadata"),
|
|
102
|
+
runtime: join(outDir, "runtime"),
|
|
103
|
+
stage: join(outDir, "stage"),
|
|
104
|
+
overlay: join(outDir, "overlay"),
|
|
105
|
+
targets: join(outDir, "targets"),
|
|
106
|
+
output: join(outDir, "out"),
|
|
107
|
+
dataDir,
|
|
108
|
+
iconsDir,
|
|
109
|
+
iconFile,
|
|
110
|
+
licenseFile: resolveLicenseFile(root, deploy.licenseFile),
|
|
111
|
+
schemaFiles: dataDir === null ? [] : findSchemaFiles(join(root, dataDir)),
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export { resolvePaths };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { DeployConfig, DeployScreenshot } from "../types.js";
|
|
2
|
+
import { gitRemoteUrl, runGit } from "../git.js";
|
|
3
|
+
|
|
4
|
+
type ScreenshotRequest = {
|
|
5
|
+
root: string;
|
|
6
|
+
deploy: DeployConfig;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type RemoteParts = {
|
|
10
|
+
host: string;
|
|
11
|
+
owner: string;
|
|
12
|
+
repo: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const DEFAULT_BRANCH = "main";
|
|
16
|
+
const GIT_SUFFIX = ".git";
|
|
17
|
+
const PORTED_HOST = /^([^/]*):\d+(?=\/|$)/;
|
|
18
|
+
const SCHEME_SEPARATOR = "://";
|
|
19
|
+
const TRAILING_SLASH = "/";
|
|
20
|
+
|
|
21
|
+
const RAW_BASE_BY_HOST: Record<string, (owner: string, repo: string, branch: string) => string> = {
|
|
22
|
+
"github.com": (owner, repo, branch) => `https://raw.githubusercontent.com/${owner}/${repo}/${branch}`,
|
|
23
|
+
"gitlab.com": (owner, repo, branch) => `https://gitlab.com/${owner}/${repo}/-/raw/${branch}`,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const readRepositoryPrefix = (root: string): string =>
|
|
27
|
+
trimTrailingSlash(runGit(root, ["rev-parse", "--show-prefix"]) ?? "");
|
|
28
|
+
|
|
29
|
+
const trimTrailingSlash = (value: string): string =>
|
|
30
|
+
value.endsWith(TRAILING_SLASH) ? trimTrailingSlash(value.slice(0, -1)) : value;
|
|
31
|
+
|
|
32
|
+
const trimLeadingSlash = (value: string): string => {
|
|
33
|
+
const withoutDot = value.startsWith("./") ? value.slice(2) : value;
|
|
34
|
+
|
|
35
|
+
return withoutDot.startsWith(TRAILING_SLASH) ? withoutDot.slice(1) : withoutDot;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const afterMarker = (value: string, marker: string): string => {
|
|
39
|
+
const index = value.indexOf(marker);
|
|
40
|
+
|
|
41
|
+
return index === -1 ? value : value.slice(index + marker.length);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const normalizeLocation = (trimmed: string): string => {
|
|
45
|
+
const location = afterMarker(afterMarker(trimmed, SCHEME_SEPARATOR), "@");
|
|
46
|
+
|
|
47
|
+
return trimmed.includes(SCHEME_SEPARATOR) ? location.replace(PORTED_HOST, "$1") : location.replace(":", "/");
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const parseRemote = (remote: string): RemoteParts | null => {
|
|
51
|
+
const trimmed = remote.endsWith(GIT_SUFFIX) ? remote.slice(0, -GIT_SUFFIX.length) : remote;
|
|
52
|
+
const [host, owner, repo, ...extra] = normalizeLocation(trimmed).split("/");
|
|
53
|
+
|
|
54
|
+
if (repo === undefined || extra.length > 0) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return { host: host ?? "", owner: owner ?? "", repo };
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const readDefaultBranch = (root: string): string => {
|
|
62
|
+
const head = runGit(root, ["symbolic-ref", "--short", "refs/remotes/origin/HEAD"]);
|
|
63
|
+
|
|
64
|
+
if (head === null || head.length === 0) {
|
|
65
|
+
return DEFAULT_BRANCH;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const separator = head.indexOf(TRAILING_SLASH);
|
|
69
|
+
|
|
70
|
+
return separator === -1 ? head : head.slice(separator + 1);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const baseForRemote = (remote: string, branch: string): string | null => {
|
|
74
|
+
const parts = parseRemote(remote);
|
|
75
|
+
|
|
76
|
+
if (parts === null) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const build = RAW_BASE_BY_HOST[parts.host];
|
|
81
|
+
|
|
82
|
+
return build === undefined ? null : build(parts.owner, parts.repo, branch);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const resolveScreenshotBaseUrl = ({ root, deploy }: ScreenshotRequest): string | null => {
|
|
86
|
+
if (deploy.screenshotBaseUrl !== undefined) {
|
|
87
|
+
return trimTrailingSlash(deploy.screenshotBaseUrl);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const remote = gitRemoteUrl(root);
|
|
91
|
+
const base = remote === null ? null : baseForRemote(remote, readDefaultBranch(root));
|
|
92
|
+
const prefix = base === null ? "" : readRepositoryPrefix(root);
|
|
93
|
+
|
|
94
|
+
return base === null || prefix.length === 0 ? base : `${base}/${prefix}`;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const urlForScreenshot = (file: string, baseUrl: string | null): string => {
|
|
98
|
+
if (baseUrl === null) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Cannot turn the screenshot "${file}" into a URL: a software center fetches screenshots over the ` +
|
|
101
|
+
"network. Set `deploy.screenshotBaseUrl`, or give the screenshot an absolute `url`.",
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return `${baseUrl}/${trimLeadingSlash(file)}`;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const resolveScreenshots = (request: ScreenshotRequest): DeployScreenshot[] => {
|
|
109
|
+
const configured = request.deploy.screenshots ?? [];
|
|
110
|
+
|
|
111
|
+
if (configured.length === 0) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const baseUrl = resolveScreenshotBaseUrl(request);
|
|
116
|
+
const defaultIndex = configured.findIndex((entry) => entry.isDefault === true);
|
|
117
|
+
|
|
118
|
+
return configured.map((entry, index) => ({
|
|
119
|
+
url: entry.url ?? urlForScreenshot(entry.file ?? "", baseUrl),
|
|
120
|
+
caption: entry.caption ?? null,
|
|
121
|
+
isDefault: index === defaultIndex,
|
|
122
|
+
}));
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export { resolveScreenshots };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { PackageManifest } from "./package-manifest.js";
|
|
2
|
+
|
|
3
|
+
const INDENT = " ".repeat(4);
|
|
4
|
+
const DOCS_URL = "https://gtkx.dev/guide/deploying";
|
|
5
|
+
|
|
6
|
+
const quoted = (value: string): string => JSON.stringify(value);
|
|
7
|
+
|
|
8
|
+
const titleFor = (applicationId: string): string => {
|
|
9
|
+
const segment = applicationId.split(".").at(-1) ?? applicationId;
|
|
10
|
+
|
|
11
|
+
return segment.charAt(0).toUpperCase() + segment.slice(1);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const developerLine = (manifest: PackageManifest): string => {
|
|
15
|
+
const name = manifest.author.name ?? "Your Name";
|
|
16
|
+
const email = manifest.author.email;
|
|
17
|
+
const parts = email === null ? [`name: ${quoted(name)}`] : [`name: ${quoted(name)}`, `email: ${quoted(email)}`];
|
|
18
|
+
|
|
19
|
+
return `${INDENT.repeat(2)}developer: { ${parts.join(", ")} },`;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const starterBlock = (applicationId: string, manifest: PackageManifest): string =>
|
|
23
|
+
[
|
|
24
|
+
`${INDENT}deploy: {`,
|
|
25
|
+
`${INDENT.repeat(2)}name: ${quoted(manifest.name ?? titleFor(applicationId))},`,
|
|
26
|
+
`${INDENT.repeat(2)}summary: ${quoted(manifest.description ?? "What the app does, in one line")},`,
|
|
27
|
+
`${INDENT.repeat(2)}categories: ["Utility"],`,
|
|
28
|
+
developerLine(manifest),
|
|
29
|
+
`${INDENT.repeat(2)}license: ${quoted(manifest.license ?? "MIT")},`,
|
|
30
|
+
`${INDENT}},`,
|
|
31
|
+
].join("\n");
|
|
32
|
+
|
|
33
|
+
const missingDeployError = (applicationId: string, manifest: PackageManifest): Error =>
|
|
34
|
+
new Error(
|
|
35
|
+
"gtkx.config.ts: no `deploy` section, so there is nothing to package.\n" +
|
|
36
|
+
"Add this to gtkx.config.ts and adjust it:\n\n" +
|
|
37
|
+
`${starterBlock(applicationId, manifest)}\n\n` +
|
|
38
|
+
`Every value above was derived from package.json; see ${DOCS_URL}.`,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
export { missingDeployError };
|