From 184fcde37c152ea9d3c2c4d624b3d0a49af89c37 Mon Sep 17 00:00:00 2001 From: Tegan Churchill Date: Tue, 18 Aug 2026 15:06:30 -0700 Subject: [PATCH 1/2] Make package exports explicit --- .github/workflows/lint-and-test.yml | 2 + package.json | 897 +++++++++++++++++++++++++++- scripts/generate-exports.mjs | 195 ++++-- scripts/public-exports.mjs | 183 ++++++ 4 files changed, 1203 insertions(+), 74 deletions(-) create mode 100644 scripts/public-exports.mjs diff --git a/.github/workflows/lint-and-test.yml b/.github/workflows/lint-and-test.yml index 668ca6125d..5dacf83ac4 100644 --- a/.github/workflows/lint-and-test.yml +++ b/.github/workflows/lint-and-test.yml @@ -29,6 +29,8 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Checkout and Setup Node uses: ./.github/actions/setup-node + - name: Check package exports + run: pnpm check:exports - name: Lint run: pnpm run --if-present lint:ci check-types: diff --git a/package.json b/package.json index 7f50cc7200..94a982d34a 100644 --- a/package.json +++ b/package.json @@ -57,11 +57,11 @@ "preview:docker": "VITE_API=http://localhost:8080 VITE_TEMPORAL_UI_BUILD_TARGET=local vite preview", "preview:local-temporal": "VITE_API=http://localhost:8081 vite build --sourcemap && VITE_TEMPORAL_UI_BUILD_TARGET=local vite preview --port 3001", "preview:local-temporal:full": "trap 'kill 0' EXIT INT TERM; pnpm temporal-server & pnpm dev:local-temporal & pnpm preview:local-temporal", - "package": "svelte-package", - "package:patch": "pnpm version patch && svelte-package", - "package:minor": "pnpm version minor && svelte-package", - "package:major": "pnpm version major && svelte-package", - "prepack": "svelte-package && node scripts/generate-exports.mjs", + "package": "svelte-package && node scripts/generate-exports.mjs --validate-dist", + "package:patch": "pnpm version patch && pnpm package", + "package:minor": "pnpm version minor && pnpm package", + "package:major": "pnpm version major && pnpm package", + "prepack": "pnpm check:exports && pnpm package", "catalog": "esno scripts/catalog/catalog-cli.ts", "catalog:test-package": "CATALOG_PACKAGE_TEST=1 TZ=UTC vitest run scripts/catalog/catalog-artifacts.test.ts -t 'clean consumer' --pool=forks --maxWorkers=1", "stories:dev": "storybook dev -p 6006", @@ -69,6 +69,8 @@ "stories:test": "test-storybook --index-json", "stylelint": "stylelint \"src/**/*.{css,postcss,svelte}\"", "stylelint:fix": "stylelint --fix \"src/**/*.{css,postcss,svelte}\"", + "generate:exports": "node scripts/generate-exports.mjs", + "check:exports": "node scripts/generate-exports.mjs --check", "generate:locales": "esno scripts/generate-locales.ts", "generate:proto": "esno scripts/generate-temporal-proto.ts", "run-workflows": "esno scripts/run-workflows.ts", @@ -277,14 +279,881 @@ }, "packageManager": "pnpm@10.10.0", "exports": { - "./_": "Wildcard entries below are replaced with explicit paths by scripts/generate-exports.mjs during prepack", - "./*.svelte": { - "types": "./dist/*.svelte.d.ts", - "svelte": "./dist/*.svelte" - }, - "./*": { - "types": "./dist/*.d.ts", - "import": "./dist/*.js" - } + "./components/bottom-nav.svelte": { + "types": "./dist/components/bottom-nav.svelte.d.ts", + "svelte": "./dist/components/bottom-nav.svelte", + "default": "./dist/components/bottom-nav.svelte" + }, + "./components/codec-server-form/codec-server-form.svelte": { + "types": "./dist/components/codec-server-form/codec-server-form.svelte.d.ts", + "svelte": "./dist/components/codec-server-form/codec-server-form.svelte", + "default": "./dist/components/codec-server-form/codec-server-form.svelte" + }, + "./components/dark-mode-menu.svelte": { + "types": "./dist/components/dark-mode-menu.svelte.d.ts", + "svelte": "./dist/components/dark-mode-menu.svelte", + "default": "./dist/components/dark-mode-menu.svelte" + }, + "./components/data-encoder-settings.svelte": { + "types": "./dist/components/data-encoder-settings.svelte.d.ts", + "svelte": "./dist/components/data-encoder-settings.svelte", + "default": "./dist/components/data-encoder-settings.svelte" + }, + "./components/data-encoder-status.svelte": { + "types": "./dist/components/data-encoder-status.svelte.d.ts", + "svelte": "./dist/components/data-encoder-status.svelte", + "default": "./dist/components/data-encoder-status.svelte" + }, + "./components/form/form-error.svelte": { + "types": "./dist/components/form/form-error.svelte.d.ts", + "svelte": "./dist/components/form/form-error.svelte", + "default": "./dist/components/form/form-error.svelte" + }, + "./components/form/message.svelte": { + "types": "./dist/components/form/message.svelte.d.ts", + "svelte": "./dist/components/form/message.svelte", + "default": "./dist/components/form/message.svelte" + }, + "./components/news-feed/news-feed-widget.svelte": { + "types": "./dist/components/news-feed/news-feed-widget.svelte.d.ts", + "svelte": "./dist/components/news-feed/news-feed-widget.svelte", + "default": "./dist/components/news-feed/news-feed-widget.svelte" + }, + "./components/search-attributes-form/search-attributes-form.svelte": { + "types": "./dist/components/search-attributes-form/search-attributes-form.svelte.d.ts", + "svelte": "./dist/components/search-attributes-form/search-attributes-form.svelte", + "default": "./dist/components/search-attributes-form/search-attributes-form.svelte" + }, + "./components/search-attributes-form/types": { + "types": "./dist/components/search-attributes-form/types.d.ts", + "import": "./dist/components/search-attributes-form/types.js", + "default": "./dist/components/search-attributes-form/types.js" + }, + "./components/skip-nav.svelte": { + "types": "./dist/components/skip-nav.svelte.d.ts", + "svelte": "./dist/components/skip-nav.svelte", + "default": "./dist/components/skip-nav.svelte" + }, + "./components/timestamp.svelte": { + "types": "./dist/components/timestamp.svelte.d.ts", + "svelte": "./dist/components/timestamp.svelte", + "default": "./dist/components/timestamp.svelte" + }, + "./components/timezone-select.svelte": { + "types": "./dist/components/timezone-select.svelte.d.ts", + "svelte": "./dist/components/timezone-select.svelte", + "default": "./dist/components/timezone-select.svelte" + }, + "./components/top-nav.svelte": { + "types": "./dist/components/top-nav.svelte.d.ts", + "svelte": "./dist/components/top-nav.svelte", + "default": "./dist/components/top-nav.svelte" + }, + "./components/workers/workers-table/task-queue-workers-table.svelte": { + "types": "./dist/components/workers/workers-table/task-queue-workers-table.svelte.d.ts", + "svelte": "./dist/components/workers/workers-table/task-queue-workers-table.svelte", + "default": "./dist/components/workers/workers-table/task-queue-workers-table.svelte" + }, + "./components/workflow/workflow-common-errors.svelte": { + "types": "./dist/components/workflow/workflow-common-errors.svelte.d.ts", + "svelte": "./dist/components/workflow/workflow-common-errors.svelte", + "default": "./dist/components/workflow/workflow-common-errors.svelte" + }, + "./components/workflow/workflow-relationships.svelte": { + "types": "./dist/components/workflow/workflow-relationships.svelte.d.ts", + "svelte": "./dist/components/workflow/workflow-relationships.svelte", + "default": "./dist/components/workflow/workflow-relationships.svelte" + }, + "./holocene/accordion/accordion.svelte": { + "types": "./dist/holocene/accordion/accordion.svelte.d.ts", + "svelte": "./dist/holocene/accordion/accordion.svelte", + "default": "./dist/holocene/accordion/accordion.svelte" + }, + "./holocene/alert.svelte": { + "types": "./dist/holocene/alert.svelte.d.ts", + "svelte": "./dist/holocene/alert.svelte", + "default": "./dist/holocene/alert.svelte" + }, + "./holocene/badge.svelte": { + "types": "./dist/holocene/badge.svelte.d.ts", + "svelte": "./dist/holocene/badge.svelte", + "default": "./dist/holocene/badge.svelte" + }, + "./holocene/button.svelte": { + "types": "./dist/holocene/button.svelte.d.ts", + "svelte": "./dist/holocene/button.svelte", + "default": "./dist/holocene/button.svelte" + }, + "./holocene/card.svelte": { + "types": "./dist/holocene/card.svelte.d.ts", + "svelte": "./dist/holocene/card.svelte", + "default": "./dist/holocene/card.svelte" + }, + "./holocene/checkbox.svelte": { + "types": "./dist/holocene/checkbox.svelte.d.ts", + "svelte": "./dist/holocene/checkbox.svelte", + "default": "./dist/holocene/checkbox.svelte" + }, + "./holocene/code-block.svelte": { + "types": "./dist/holocene/code-block.svelte.d.ts", + "svelte": "./dist/holocene/code-block.svelte", + "default": "./dist/holocene/code-block.svelte" + }, + "./holocene/combobox/combobox.svelte": { + "types": "./dist/holocene/combobox/combobox.svelte.d.ts", + "svelte": "./dist/holocene/combobox/combobox.svelte", + "default": "./dist/holocene/combobox/combobox.svelte" + }, + "./holocene/copyable/button.svelte": { + "types": "./dist/holocene/copyable/button.svelte.d.ts", + "svelte": "./dist/holocene/copyable/button.svelte", + "default": "./dist/holocene/copyable/button.svelte" + }, + "./holocene/copyable/index.svelte": { + "types": "./dist/holocene/copyable/index.svelte.d.ts", + "svelte": "./dist/holocene/copyable/index.svelte", + "default": "./dist/holocene/copyable/index.svelte" + }, + "./holocene/date-picker.svelte": { + "types": "./dist/holocene/date-picker.svelte.d.ts", + "svelte": "./dist/holocene/date-picker.svelte", + "default": "./dist/holocene/date-picker.svelte" + }, + "./holocene/drawer-content.svelte": { + "types": "./dist/holocene/drawer-content.svelte.d.ts", + "svelte": "./dist/holocene/drawer-content.svelte", + "default": "./dist/holocene/drawer-content.svelte" + }, + "./holocene/drawer.svelte": { + "types": "./dist/holocene/drawer.svelte.d.ts", + "svelte": "./dist/holocene/drawer.svelte", + "default": "./dist/holocene/drawer.svelte" + }, + "./holocene/empty-state.svelte": { + "types": "./dist/holocene/empty-state.svelte.d.ts", + "svelte": "./dist/holocene/empty-state.svelte", + "default": "./dist/holocene/empty-state.svelte" + }, + "./holocene/error.svelte": { + "types": "./dist/holocene/error.svelte.d.ts", + "svelte": "./dist/holocene/error.svelte", + "default": "./dist/holocene/error.svelte" + }, + "./holocene/icon-button.svelte": { + "types": "./dist/holocene/icon-button.svelte.d.ts", + "svelte": "./dist/holocene/icon-button.svelte", + "default": "./dist/holocene/icon-button.svelte" + }, + "./holocene/icon/icon.svelte": { + "types": "./dist/holocene/icon/icon.svelte.d.ts", + "svelte": "./dist/holocene/icon/icon.svelte", + "default": "./dist/holocene/icon/icon.svelte" + }, + "./holocene/icon/index": { + "types": "./dist/holocene/icon/index.d.ts", + "import": "./dist/holocene/icon/index.js", + "default": "./dist/holocene/icon/index.js" + }, + "./holocene/icon/paths": { + "types": "./dist/holocene/icon/paths.d.ts", + "import": "./dist/holocene/icon/paths.js", + "default": "./dist/holocene/icon/paths.js" + }, + "./holocene/icon/svg.svelte": { + "types": "./dist/holocene/icon/svg.svelte.d.ts", + "svelte": "./dist/holocene/icon/svg.svelte", + "default": "./dist/holocene/icon/svg.svelte" + }, + "./holocene/icon/svg/chevron-down.svelte": { + "types": "./dist/holocene/icon/svg/chevron-down.svelte.d.ts", + "svelte": "./dist/holocene/icon/svg/chevron-down.svelte", + "default": "./dist/holocene/icon/svg/chevron-down.svelte" + }, + "./holocene/icon/svg/spinner.svelte": { + "types": "./dist/holocene/icon/svg/spinner.svelte.d.ts", + "svelte": "./dist/holocene/icon/svg/spinner.svelte", + "default": "./dist/holocene/icon/svg/spinner.svelte" + }, + "./holocene/input/chip-input.svelte": { + "types": "./dist/holocene/input/chip-input.svelte.d.ts", + "svelte": "./dist/holocene/input/chip-input.svelte", + "default": "./dist/holocene/input/chip-input.svelte" + }, + "./holocene/input/input.svelte": { + "types": "./dist/holocene/input/input.svelte.d.ts", + "svelte": "./dist/holocene/input/input.svelte", + "default": "./dist/holocene/input/input.svelte" + }, + "./holocene/input/number-input.svelte": { + "types": "./dist/holocene/input/number-input.svelte.d.ts", + "svelte": "./dist/holocene/input/number-input.svelte", + "default": "./dist/holocene/input/number-input.svelte" + }, + "./holocene/label.svelte": { + "types": "./dist/holocene/label.svelte.d.ts", + "svelte": "./dist/holocene/label.svelte", + "default": "./dist/holocene/label.svelte" + }, + "./holocene/link.svelte": { + "types": "./dist/holocene/link.svelte.d.ts", + "svelte": "./dist/holocene/link.svelte", + "default": "./dist/holocene/link.svelte" + }, + "./holocene/loading.svelte": { + "types": "./dist/holocene/loading.svelte.d.ts", + "svelte": "./dist/holocene/loading.svelte", + "default": "./dist/holocene/loading.svelte" + }, + "./holocene/main-content-container.svelte": { + "types": "./dist/holocene/main-content-container.svelte.d.ts", + "svelte": "./dist/holocene/main-content-container.svelte", + "default": "./dist/holocene/main-content-container.svelte" + }, + "./holocene/menu/index": { + "types": "./dist/holocene/menu/index.d.ts", + "import": "./dist/holocene/menu/index.js", + "default": "./dist/holocene/menu/index.js" + }, + "./holocene/menu/menu-button.svelte": { + "types": "./dist/holocene/menu/menu-button.svelte.d.ts", + "svelte": "./dist/holocene/menu/menu-button.svelte", + "default": "./dist/holocene/menu/menu-button.svelte" + }, + "./holocene/menu/menu-container.svelte": { + "types": "./dist/holocene/menu/menu-container.svelte.d.ts", + "svelte": "./dist/holocene/menu/menu-container.svelte", + "default": "./dist/holocene/menu/menu-container.svelte" + }, + "./holocene/menu/menu-divider.svelte": { + "types": "./dist/holocene/menu/menu-divider.svelte.d.ts", + "svelte": "./dist/holocene/menu/menu-divider.svelte", + "default": "./dist/holocene/menu/menu-divider.svelte" + }, + "./holocene/menu/menu-item.svelte": { + "types": "./dist/holocene/menu/menu-item.svelte.d.ts", + "svelte": "./dist/holocene/menu/menu-item.svelte", + "default": "./dist/holocene/menu/menu-item.svelte" + }, + "./holocene/menu/menu.svelte": { + "types": "./dist/holocene/menu/menu.svelte.d.ts", + "svelte": "./dist/holocene/menu/menu.svelte", + "default": "./dist/holocene/menu/menu.svelte" + }, + "./holocene/modal.svelte": { + "types": "./dist/holocene/modal.svelte.d.ts", + "svelte": "./dist/holocene/modal.svelte", + "default": "./dist/holocene/modal.svelte" + }, + "./holocene/navigation/navigation-badge.svelte": { + "types": "./dist/holocene/navigation/navigation-badge.svelte.d.ts", + "svelte": "./dist/holocene/navigation/navigation-badge.svelte", + "default": "./dist/holocene/navigation/navigation-badge.svelte" + }, + "./holocene/navigation/navigation-button.svelte": { + "types": "./dist/holocene/navigation/navigation-button.svelte.d.ts", + "svelte": "./dist/holocene/navigation/navigation-button.svelte", + "default": "./dist/holocene/navigation/navigation-button.svelte" + }, + "./holocene/navigation/navigation-container.svelte": { + "types": "./dist/holocene/navigation/navigation-container.svelte.d.ts", + "svelte": "./dist/holocene/navigation/navigation-container.svelte", + "default": "./dist/holocene/navigation/navigation-container.svelte" + }, + "./holocene/navigation/navigation-item.svelte": { + "types": "./dist/holocene/navigation/navigation-item.svelte.d.ts", + "svelte": "./dist/holocene/navigation/navigation-item.svelte", + "default": "./dist/holocene/navigation/navigation-item.svelte" + }, + "./holocene/pill-container/pill-container.svelte": { + "types": "./dist/holocene/pill-container/pill-container.svelte.d.ts", + "svelte": "./dist/holocene/pill-container/pill-container.svelte", + "default": "./dist/holocene/pill-container/pill-container.svelte" + }, + "./holocene/pill-container/pill.svelte": { + "types": "./dist/holocene/pill-container/pill.svelte.d.ts", + "svelte": "./dist/holocene/pill-container/pill.svelte", + "default": "./dist/holocene/pill-container/pill.svelte" + }, + "./holocene/radio-input/radio-group.svelte": { + "types": "./dist/holocene/radio-input/radio-group.svelte.d.ts", + "svelte": "./dist/holocene/radio-input/radio-group.svelte", + "default": "./dist/holocene/radio-input/radio-group.svelte" + }, + "./holocene/radio-input/radio-input.svelte": { + "types": "./dist/holocene/radio-input/radio-input.svelte.d.ts", + "svelte": "./dist/holocene/radio-input/radio-input.svelte", + "default": "./dist/holocene/radio-input/radio-input.svelte" + }, + "./holocene/select/filter-select.svelte": { + "types": "./dist/holocene/select/filter-select.svelte.d.ts", + "svelte": "./dist/holocene/select/filter-select.svelte", + "default": "./dist/holocene/select/filter-select.svelte" + }, + "./holocene/select/multi-select.svelte": { + "types": "./dist/holocene/select/multi-select.svelte.d.ts", + "svelte": "./dist/holocene/select/multi-select.svelte", + "default": "./dist/holocene/select/multi-select.svelte" + }, + "./holocene/select/option.svelte": { + "types": "./dist/holocene/select/option.svelte.d.ts", + "svelte": "./dist/holocene/select/option.svelte", + "default": "./dist/holocene/select/option.svelte" + }, + "./holocene/select/select.svelte": { + "types": "./dist/holocene/select/select.svelte.d.ts", + "svelte": "./dist/holocene/select/select.svelte", + "default": "./dist/holocene/select/select.svelte" + }, + "./holocene/skeleton/index.svelte": { + "types": "./dist/holocene/skeleton/index.svelte.d.ts", + "svelte": "./dist/holocene/skeleton/index.svelte", + "default": "./dist/holocene/skeleton/index.svelte" + }, + "./holocene/skeleton/table.svelte": { + "types": "./dist/holocene/skeleton/table.svelte.d.ts", + "svelte": "./dist/holocene/skeleton/table.svelte", + "default": "./dist/holocene/skeleton/table.svelte" + }, + "./holocene/split-button.svelte": { + "types": "./dist/holocene/split-button.svelte.d.ts", + "svelte": "./dist/holocene/split-button.svelte", + "default": "./dist/holocene/split-button.svelte" + }, + "./holocene/tab/tab-list.svelte": { + "types": "./dist/holocene/tab/tab-list.svelte.d.ts", + "svelte": "./dist/holocene/tab/tab-list.svelte", + "default": "./dist/holocene/tab/tab-list.svelte" + }, + "./holocene/tab/tab-panel.svelte": { + "types": "./dist/holocene/tab/tab-panel.svelte.d.ts", + "svelte": "./dist/holocene/tab/tab-panel.svelte", + "default": "./dist/holocene/tab/tab-panel.svelte" + }, + "./holocene/tab/tab.svelte": { + "types": "./dist/holocene/tab/tab.svelte.d.ts", + "svelte": "./dist/holocene/tab/tab.svelte", + "default": "./dist/holocene/tab/tab.svelte" + }, + "./holocene/tab/tabs.svelte": { + "types": "./dist/holocene/tab/tabs.svelte.d.ts", + "svelte": "./dist/holocene/tab/tabs.svelte", + "default": "./dist/holocene/tab/tabs.svelte" + }, + "./holocene/table/paginated-table/api-paginated.svelte": { + "types": "./dist/holocene/table/paginated-table/api-paginated.svelte.d.ts", + "svelte": "./dist/holocene/table/paginated-table/api-paginated.svelte", + "default": "./dist/holocene/table/paginated-table/api-paginated.svelte" + }, + "./holocene/table/paginated-table/index.svelte": { + "types": "./dist/holocene/table/paginated-table/index.svelte.d.ts", + "svelte": "./dist/holocene/table/paginated-table/index.svelte", + "default": "./dist/holocene/table/paginated-table/index.svelte" + }, + "./holocene/table/paginated-table/paginated.svelte": { + "types": "./dist/holocene/table/paginated-table/paginated.svelte.d.ts", + "svelte": "./dist/holocene/table/paginated-table/paginated.svelte", + "default": "./dist/holocene/table/paginated-table/paginated.svelte" + }, + "./holocene/table/table-header-row.svelte": { + "types": "./dist/holocene/table/table-header-row.svelte.d.ts", + "svelte": "./dist/holocene/table/table-header-row.svelte", + "default": "./dist/holocene/table/table-header-row.svelte" + }, + "./holocene/table/table-row.svelte": { + "types": "./dist/holocene/table/table-row.svelte.d.ts", + "svelte": "./dist/holocene/table/table-row.svelte", + "default": "./dist/holocene/table/table-row.svelte" + }, + "./holocene/table/table.svelte": { + "types": "./dist/holocene/table/table.svelte.d.ts", + "svelte": "./dist/holocene/table/table.svelte", + "default": "./dist/holocene/table/table.svelte" + }, + "./holocene/textarea.svelte": { + "types": "./dist/holocene/textarea.svelte.d.ts", + "svelte": "./dist/holocene/textarea.svelte", + "default": "./dist/holocene/textarea.svelte" + }, + "./holocene/toaster.svelte": { + "types": "./dist/holocene/toaster.svelte.d.ts", + "svelte": "./dist/holocene/toaster.svelte", + "default": "./dist/holocene/toaster.svelte" + }, + "./holocene/toggle-button/toggle-button.svelte": { + "types": "./dist/holocene/toggle-button/toggle-button.svelte.d.ts", + "svelte": "./dist/holocene/toggle-button/toggle-button.svelte", + "default": "./dist/holocene/toggle-button/toggle-button.svelte" + }, + "./holocene/toggle-button/toggle-buttons.svelte": { + "types": "./dist/holocene/toggle-button/toggle-buttons.svelte.d.ts", + "svelte": "./dist/holocene/toggle-button/toggle-buttons.svelte", + "default": "./dist/holocene/toggle-button/toggle-buttons.svelte" + }, + "./holocene/toggle-switch.svelte": { + "types": "./dist/holocene/toggle-switch.svelte.d.ts", + "svelte": "./dist/holocene/toggle-switch.svelte", + "default": "./dist/holocene/toggle-switch.svelte" + }, + "./holocene/tooltip.svelte": { + "types": "./dist/holocene/tooltip.svelte.d.ts", + "svelte": "./dist/holocene/tooltip.svelte", + "default": "./dist/holocene/tooltip.svelte" + }, + "./holocene/vertical-nav/vertical-nav-item.svelte": { + "types": "./dist/holocene/vertical-nav/vertical-nav-item.svelte.d.ts", + "svelte": "./dist/holocene/vertical-nav/vertical-nav-item.svelte", + "default": "./dist/holocene/vertical-nav/vertical-nav-item.svelte" + }, + "./holocene/vertical-nav/vertical-nav.svelte": { + "types": "./dist/holocene/vertical-nav/vertical-nav.svelte.d.ts", + "svelte": "./dist/holocene/vertical-nav/vertical-nav.svelte", + "default": "./dist/holocene/vertical-nav/vertical-nav.svelte" + }, + "./i18n/index": { + "types": "./dist/i18n/index.d.ts", + "import": "./dist/i18n/index.js", + "default": "./dist/i18n/index.js" + }, + "./i18n/locales/en/nexus": { + "types": "./dist/i18n/locales/en/nexus.d.ts", + "import": "./dist/i18n/locales/en/nexus.js", + "default": "./dist/i18n/locales/en/nexus.js" + }, + "./i18n/locales/en/workers": { + "types": "./dist/i18n/locales/en/workers.d.ts", + "import": "./dist/i18n/locales/en/workers.js", + "default": "./dist/i18n/locales/en/workers.js" + }, + "./i18n/locales/index": { + "types": "./dist/i18n/locales/index.d.ts", + "import": "./dist/i18n/locales/index.js", + "default": "./dist/i18n/locales/index.js" + }, + "./i18n/translate": { + "types": "./dist/i18n/translate.d.ts", + "import": "./dist/i18n/translate.js", + "default": "./dist/i18n/translate.js" + }, + "./layouts/standalone-activity-layout.svelte": { + "types": "./dist/layouts/standalone-activity-layout.svelte.d.ts", + "svelte": "./dist/layouts/standalone-activity-layout.svelte", + "default": "./dist/layouts/standalone-activity-layout.svelte" + }, + "./layouts/standalone-nexus-operation-layout.svelte": { + "types": "./dist/layouts/standalone-nexus-operation-layout.svelte.d.ts", + "svelte": "./dist/layouts/standalone-nexus-operation-layout.svelte", + "default": "./dist/layouts/standalone-nexus-operation-layout.svelte" + }, + "./layouts/workers-layout.svelte": { + "types": "./dist/layouts/workers-layout.svelte.d.ts", + "svelte": "./dist/layouts/workers-layout.svelte", + "default": "./dist/layouts/workers-layout.svelte" + }, + "./layouts/workflow-history-layout.svelte": { + "types": "./dist/layouts/workflow-history-layout.svelte.d.ts", + "svelte": "./dist/layouts/workflow-history-layout.svelte", + "default": "./dist/layouts/workflow-history-layout.svelte" + }, + "./layouts/workflow-run-layout.svelte": { + "types": "./dist/layouts/workflow-run-layout.svelte.d.ts", + "svelte": "./dist/layouts/workflow-run-layout.svelte", + "default": "./dist/layouts/workflow-run-layout.svelte" + }, + "./layouts/workflow-timeline-layout.svelte": { + "types": "./dist/layouts/workflow-timeline-layout.svelte.d.ts", + "svelte": "./dist/layouts/workflow-timeline-layout.svelte", + "default": "./dist/layouts/workflow-timeline-layout.svelte" + }, + "./models/core-user": { + "types": "./dist/models/core-user.d.ts", + "import": "./dist/models/core-user.js", + "default": "./dist/models/core-user.js" + }, + "./pages/batch-operation.svelte": { + "types": "./dist/pages/batch-operation.svelte.d.ts", + "svelte": "./dist/pages/batch-operation.svelte", + "default": "./dist/pages/batch-operation.svelte" + }, + "./pages/batch-operations.svelte": { + "types": "./dist/pages/batch-operations.svelte.d.ts", + "svelte": "./dist/pages/batch-operations.svelte", + "default": "./dist/pages/batch-operations.svelte" + }, + "./pages/deployment.svelte": { + "types": "./dist/pages/deployment.svelte.d.ts", + "svelte": "./dist/pages/deployment.svelte", + "default": "./dist/pages/deployment.svelte" + }, + "./pages/deployments.svelte": { + "types": "./dist/pages/deployments.svelte.d.ts", + "svelte": "./dist/pages/deployments.svelte", + "default": "./dist/pages/deployments.svelte" + }, + "./pages/nexus-create-endpoint.svelte": { + "types": "./dist/pages/nexus-create-endpoint.svelte.d.ts", + "svelte": "./dist/pages/nexus-create-endpoint.svelte", + "default": "./dist/pages/nexus-create-endpoint.svelte" + }, + "./pages/nexus-edit-endpoint.svelte": { + "types": "./dist/pages/nexus-edit-endpoint.svelte.d.ts", + "svelte": "./dist/pages/nexus-edit-endpoint.svelte", + "default": "./dist/pages/nexus-edit-endpoint.svelte" + }, + "./pages/nexus-empty-state.svelte": { + "types": "./dist/pages/nexus-empty-state.svelte.d.ts", + "svelte": "./dist/pages/nexus-empty-state.svelte", + "default": "./dist/pages/nexus-empty-state.svelte" + }, + "./pages/nexus-endpoint.svelte": { + "types": "./dist/pages/nexus-endpoint.svelte.d.ts", + "svelte": "./dist/pages/nexus-endpoint.svelte", + "default": "./dist/pages/nexus-endpoint.svelte" + }, + "./pages/nexus-form.svelte": { + "types": "./dist/pages/nexus-form.svelte.d.ts", + "svelte": "./dist/pages/nexus-form.svelte", + "default": "./dist/pages/nexus-form.svelte" + }, + "./pages/schedule-edit.svelte": { + "types": "./dist/pages/schedule-edit.svelte.d.ts", + "svelte": "./dist/pages/schedule-edit.svelte", + "default": "./dist/pages/schedule-edit.svelte" + }, + "./pages/schedule-view.svelte": { + "types": "./dist/pages/schedule-view.svelte.d.ts", + "svelte": "./dist/pages/schedule-view.svelte", + "default": "./dist/pages/schedule-view.svelte" + }, + "./pages/schedules-create.svelte": { + "types": "./dist/pages/schedules-create.svelte.d.ts", + "svelte": "./dist/pages/schedules-create.svelte", + "default": "./dist/pages/schedules-create.svelte" + }, + "./pages/schedules.svelte": { + "types": "./dist/pages/schedules.svelte.d.ts", + "svelte": "./dist/pages/schedules.svelte", + "default": "./dist/pages/schedules.svelte" + }, + "./pages/serverless-worker-create.svelte": { + "types": "./dist/pages/serverless-worker-create.svelte.d.ts", + "svelte": "./dist/pages/serverless-worker-create.svelte", + "default": "./dist/pages/serverless-worker-create.svelte" + }, + "./pages/standalone-activities.svelte": { + "types": "./dist/pages/standalone-activities.svelte.d.ts", + "svelte": "./dist/pages/standalone-activities.svelte", + "default": "./dist/pages/standalone-activities.svelte" + }, + "./pages/standalone-activity-details.svelte": { + "types": "./dist/pages/standalone-activity-details.svelte.d.ts", + "svelte": "./dist/pages/standalone-activity-details.svelte", + "default": "./dist/pages/standalone-activity-details.svelte" + }, + "./pages/standalone-activity-metadata.svelte": { + "types": "./dist/pages/standalone-activity-metadata.svelte.d.ts", + "svelte": "./dist/pages/standalone-activity-metadata.svelte", + "default": "./dist/pages/standalone-activity-metadata.svelte" + }, + "./pages/standalone-activity-search-attributes.svelte": { + "types": "./dist/pages/standalone-activity-search-attributes.svelte.d.ts", + "svelte": "./dist/pages/standalone-activity-search-attributes.svelte", + "default": "./dist/pages/standalone-activity-search-attributes.svelte" + }, + "./pages/standalone-activity-workers.svelte": { + "types": "./dist/pages/standalone-activity-workers.svelte.d.ts", + "svelte": "./dist/pages/standalone-activity-workers.svelte", + "default": "./dist/pages/standalone-activity-workers.svelte" + }, + "./pages/standalone-nexus-operation-details.svelte": { + "types": "./dist/pages/standalone-nexus-operation-details.svelte.d.ts", + "svelte": "./dist/pages/standalone-nexus-operation-details.svelte", + "default": "./dist/pages/standalone-nexus-operation-details.svelte" + }, + "./pages/standalone-nexus-operation-metadata.svelte": { + "types": "./dist/pages/standalone-nexus-operation-metadata.svelte.d.ts", + "svelte": "./dist/pages/standalone-nexus-operation-metadata.svelte", + "default": "./dist/pages/standalone-nexus-operation-metadata.svelte" + }, + "./pages/standalone-nexus-operation-search-attributes.svelte": { + "types": "./dist/pages/standalone-nexus-operation-search-attributes.svelte.d.ts", + "svelte": "./dist/pages/standalone-nexus-operation-search-attributes.svelte", + "default": "./dist/pages/standalone-nexus-operation-search-attributes.svelte" + }, + "./pages/standalone-nexus-operations.svelte": { + "types": "./dist/pages/standalone-nexus-operations.svelte.d.ts", + "svelte": "./dist/pages/standalone-nexus-operations.svelte", + "default": "./dist/pages/standalone-nexus-operations.svelte" + }, + "./pages/start-standalone-activity.svelte": { + "types": "./dist/pages/start-standalone-activity.svelte.d.ts", + "svelte": "./dist/pages/start-standalone-activity.svelte", + "default": "./dist/pages/start-standalone-activity.svelte" + }, + "./pages/start-standalone-nexus-operation.svelte": { + "types": "./dist/pages/start-standalone-nexus-operation.svelte.d.ts", + "svelte": "./dist/pages/start-standalone-nexus-operation.svelte", + "default": "./dist/pages/start-standalone-nexus-operation.svelte" + }, + "./pages/start-workflow.svelte": { + "types": "./dist/pages/start-workflow.svelte.d.ts", + "svelte": "./dist/pages/start-workflow.svelte", + "default": "./dist/pages/start-workflow.svelte" + }, + "./pages/task-queue.svelte": { + "types": "./dist/pages/task-queue.svelte.d.ts", + "svelte": "./dist/pages/task-queue.svelte", + "default": "./dist/pages/task-queue.svelte" + }, + "./pages/worker-deployment-version-create.svelte": { + "types": "./dist/pages/worker-deployment-version-create.svelte.d.ts", + "svelte": "./dist/pages/worker-deployment-version-create.svelte", + "default": "./dist/pages/worker-deployment-version-create.svelte" + }, + "./pages/worker-deployment-version-edit.svelte": { + "types": "./dist/pages/worker-deployment-version-edit.svelte.d.ts", + "svelte": "./dist/pages/worker-deployment-version-edit.svelte", + "default": "./dist/pages/worker-deployment-version-edit.svelte" + }, + "./pages/worker-details.svelte": { + "types": "./dist/pages/worker-details.svelte.d.ts", + "svelte": "./dist/pages/worker-details.svelte", + "default": "./dist/pages/worker-details.svelte" + }, + "./pages/workers.svelte": { + "types": "./dist/pages/workers.svelte.d.ts", + "svelte": "./dist/pages/workers.svelte", + "default": "./dist/pages/workers.svelte" + }, + "./pages/workflow-call-stack.svelte": { + "types": "./dist/pages/workflow-call-stack.svelte.d.ts", + "svelte": "./dist/pages/workflow-call-stack.svelte", + "default": "./dist/pages/workflow-call-stack.svelte" + }, + "./pages/workflow-history-event.svelte": { + "types": "./dist/pages/workflow-history-event.svelte.d.ts", + "svelte": "./dist/pages/workflow-history-event.svelte", + "default": "./dist/pages/workflow-history-event.svelte" + }, + "./pages/workflow-memo.svelte": { + "types": "./dist/pages/workflow-memo.svelte.d.ts", + "svelte": "./dist/pages/workflow-memo.svelte", + "default": "./dist/pages/workflow-memo.svelte" + }, + "./pages/workflow-metadata.svelte": { + "types": "./dist/pages/workflow-metadata.svelte.d.ts", + "svelte": "./dist/pages/workflow-metadata.svelte", + "default": "./dist/pages/workflow-metadata.svelte" + }, + "./pages/workflow-nexus-links.svelte": { + "types": "./dist/pages/workflow-nexus-links.svelte.d.ts", + "svelte": "./dist/pages/workflow-nexus-links.svelte", + "default": "./dist/pages/workflow-nexus-links.svelte" + }, + "./pages/workflow-pending-activities.svelte": { + "types": "./dist/pages/workflow-pending-activities.svelte.d.ts", + "svelte": "./dist/pages/workflow-pending-activities.svelte", + "default": "./dist/pages/workflow-pending-activities.svelte" + }, + "./pages/workflow-query.svelte": { + "types": "./dist/pages/workflow-query.svelte.d.ts", + "svelte": "./dist/pages/workflow-query.svelte", + "default": "./dist/pages/workflow-query.svelte" + }, + "./pages/workflow-search-attributes.svelte": { + "types": "./dist/pages/workflow-search-attributes.svelte.d.ts", + "svelte": "./dist/pages/workflow-search-attributes.svelte", + "default": "./dist/pages/workflow-search-attributes.svelte" + }, + "./pages/workflow-user-metadata.svelte": { + "types": "./dist/pages/workflow-user-metadata.svelte.d.ts", + "svelte": "./dist/pages/workflow-user-metadata.svelte", + "default": "./dist/pages/workflow-user-metadata.svelte" + }, + "./pages/workflows-with-new-search.svelte": { + "types": "./dist/pages/workflows-with-new-search.svelte.d.ts", + "svelte": "./dist/pages/workflows-with-new-search.svelte", + "default": "./dist/pages/workflows-with-new-search.svelte" + }, + "./services/deployments-service": { + "types": "./dist/services/deployments-service.d.ts", + "import": "./dist/services/deployments-service.js", + "default": "./dist/services/deployments-service.js" + }, + "./services/workflow-service": { + "types": "./dist/services/workflow-service.d.ts", + "import": "./dist/services/workflow-service.js", + "default": "./dist/services/workflow-service.js" + }, + "./stores/batch-operations": { + "types": "./dist/stores/batch-operations.d.ts", + "import": "./dist/stores/batch-operations.js", + "default": "./dist/stores/batch-operations.js" + }, + "./stores/error": { + "types": "./dist/stores/error.d.ts", + "import": "./dist/stores/error.js", + "default": "./dist/stores/error.js" + }, + "./stores/filters": { + "types": "./dist/stores/filters.d.ts", + "import": "./dist/stores/filters.js", + "default": "./dist/stores/filters.js" + }, + "./stores/namespaces": { + "types": "./dist/stores/namespaces.d.ts", + "import": "./dist/stores/namespaces.js", + "default": "./dist/stores/namespaces.js" + }, + "./stores/nav-open": { + "types": "./dist/stores/nav-open.d.ts", + "import": "./dist/stores/nav-open.js", + "default": "./dist/stores/nav-open.js" + }, + "./stores/previous-events": { + "types": "./dist/stores/previous-events.d.ts", + "import": "./dist/stores/previous-events.js", + "default": "./dist/stores/previous-events.js" + }, + "./stores/search-attributes": { + "types": "./dist/stores/search-attributes.d.ts", + "import": "./dist/stores/search-attributes.js", + "default": "./dist/stores/search-attributes.js" + }, + "./stores/time-format": { + "types": "./dist/stores/time-format.d.ts", + "import": "./dist/stores/time-format.js", + "default": "./dist/stores/time-format.js" + }, + "./stores/toaster": { + "types": "./dist/stores/toaster.d.ts", + "import": "./dist/stores/toaster.js", + "default": "./dist/stores/toaster.js" + }, + "./stores/workflow-run": { + "types": "./dist/stores/workflow-run.d.ts", + "import": "./dist/stores/workflow-run.js", + "default": "./dist/stores/workflow-run.js" + }, + "./theme/colors": { + "types": "./dist/theme/colors.d.ts", + "import": "./dist/theme/colors.js", + "default": "./dist/theme/colors.js" + }, + "./theme/preset": { + "types": "./dist/theme/preset.d.ts", + "import": "./dist/theme/preset.js", + "default": "./dist/theme/preset.js" + }, + "./types/deployments": { + "types": "./dist/types/deployments.d.ts", + "import": "./dist/types/deployments.js", + "default": "./dist/types/deployments.js" + }, + "./types/global": { + "types": "./dist/types/global.d.ts", + "import": "./dist/types/global.js", + "default": "./dist/types/global.js" + }, + "./types/index": { + "types": "./dist/types/index.d.ts", + "import": "./dist/types/index.js", + "default": "./dist/types/index.js" + }, + "./types/nexus": { + "types": "./dist/types/nexus.d.ts", + "import": "./dist/types/nexus.js", + "default": "./dist/types/nexus.js" + }, + "./types/workflows": { + "types": "./dist/types/workflows.d.ts", + "import": "./dist/types/workflows.js", + "default": "./dist/types/workflows.js" + }, + "./utilities/copy-to-clipboard": { + "types": "./dist/utilities/copy-to-clipboard.d.ts", + "import": "./dist/utilities/copy-to-clipboard.js", + "default": "./dist/utilities/copy-to-clipboard.js" + }, + "./utilities/core-context": { + "types": "./dist/utilities/core-context.d.ts", + "import": "./dist/utilities/core-context.js", + "default": "./dist/utilities/core-context.js" + }, + "./utilities/core-provider": { + "types": "./dist/utilities/core-provider.d.ts", + "import": "./dist/utilities/core-provider.js", + "default": "./dist/utilities/core-provider.js" + }, + "./utilities/dark-mode/dark-mode": { + "types": "./dist/utilities/dark-mode/dark-mode.d.ts", + "import": "./dist/utilities/dark-mode/dark-mode.js", + "default": "./dist/utilities/dark-mode/dark-mode.js" + }, + "./utilities/dark-mode/dark-mode.svelte": { + "types": "./dist/utilities/dark-mode/dark-mode.svelte.d.ts", + "svelte": "./dist/utilities/dark-mode/dark-mode.svelte", + "default": "./dist/utilities/dark-mode/dark-mode.svelte" + }, + "./utilities/decode-payload": { + "types": "./dist/utilities/decode-payload.d.ts", + "import": "./dist/utilities/decode-payload.js", + "default": "./dist/utilities/decode-payload.js" + }, + "./utilities/format-camel-case": { + "types": "./dist/utilities/format-camel-case.d.ts", + "import": "./dist/utilities/format-camel-case.js", + "default": "./dist/utilities/format-camel-case.js" + }, + "./utilities/format-date": { + "types": "./dist/utilities/format-date.d.ts", + "import": "./dist/utilities/format-date.js", + "default": "./dist/utilities/format-date.js" + }, + "./utilities/format-json": { + "types": "./dist/utilities/format-json.d.ts", + "import": "./dist/utilities/format-json.js", + "default": "./dist/utilities/format-json.js" + }, + "./utilities/has": { + "types": "./dist/utilities/has.d.ts", + "import": "./dist/utilities/has.js", + "default": "./dist/utilities/has.js" + }, + "./utilities/is-email": { + "types": "./dist/utilities/is-email.d.ts", + "import": "./dist/utilities/is-email.js", + "default": "./dist/utilities/is-email.js" + }, + "./utilities/parse-with-big-int": { + "types": "./dist/utilities/parse-with-big-int.d.ts", + "import": "./dist/utilities/parse-with-big-int.js", + "default": "./dist/utilities/parse-with-big-int.js" + }, + "./utilities/pluralize": { + "types": "./dist/utilities/pluralize.d.ts", + "import": "./dist/utilities/pluralize.js", + "default": "./dist/utilities/pluralize.js" + }, + "./utilities/render-markdown": { + "types": "./dist/utilities/render-markdown.d.ts", + "import": "./dist/utilities/render-markdown.js", + "default": "./dist/utilities/render-markdown.js" + }, + "./utilities/request-from-api": { + "types": "./dist/utilities/request-from-api.d.ts", + "import": "./dist/utilities/request-from-api.js", + "default": "./dist/utilities/request-from-api.js" + }, + "./utilities/timezone": { + "types": "./dist/utilities/timezone.d.ts", + "import": "./dist/utilities/timezone.js", + "default": "./dist/utilities/timezone.js" + }, + "./utilities/update-query-parameters": { + "types": "./dist/utilities/update-query-parameters.d.ts", + "import": "./dist/utilities/update-query-parameters.js", + "default": "./dist/utilities/update-query-parameters.js" + }, + "./package.json": "./package.json" } } diff --git a/scripts/generate-exports.mjs b/scripts/generate-exports.mjs index a486d8f5a7..508d242768 100644 --- a/scripts/generate-exports.mjs +++ b/scripts/generate-exports.mjs @@ -1,78 +1,153 @@ -import { readdirSync, readFileSync, writeFileSync } from 'node:fs'; -import { dirname, join, relative, resolve } from 'node:path'; - -function* walk(dir) { - for (const entry of readdirSync(dir, { withFileTypes: true })) { - const full = join(dir, entry.name); - if (entry.isDirectory()) yield* walk(full); - else yield full; - } -} +import { existsSync, readFileSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; -const distPath = new URL('../dist', import.meta.url).pathname; -const pkgUrl = new URL('../package.json', import.meta.url); -const pkg = JSON.parse(readFileSync(pkgUrl)); -const pkgName = pkg.name; +import { publicExportTargets } from './public-exports.mjs'; -const allFiles = new Set( - [...walk(distPath)].map((f) => relative(distPath, f).replace(/\\/g, '/')), -); +const repoRoot = fileURLToPath(new URL('..', import.meta.url)); +const libRoot = join(repoRoot, 'src/lib'); +const packagePath = join(repoRoot, 'package.json'); -const isTestOrSpec = (rel) => /\.(test|spec)\./.test(rel); +const resolveEntry = (source) => { + if (source.endsWith('.svelte')) { + if (!existsSync(join(libRoot, source))) return null; + + return { + types: `./dist/${source}.d.ts`, + svelte: `./dist/${source}`, + default: `./dist/${source}`, + }; + } -const exports = {}; + const candidates = [ + { + source: `${source}.ts`, + output: `${source}.js`, + types: `${source}.d.ts`, + }, + { + source: `${source}.js`, + output: `${source}.js`, + types: `${source}.d.ts`, + }, + { + source: `${source}.svelte.ts`, + output: `${source}.svelte.js`, + types: `${source}.svelte.d.ts`, + }, + { + source: `${source}.svelte.js`, + output: `${source}.svelte.js`, + types: `${source}.svelte.d.ts`, + }, + { + source: `${source}/index.ts`, + output: `${source}/index.js`, + types: `${source}/index.d.ts`, + }, + { + source: `${source}/index.js`, + output: `${source}/index.js`, + types: `${source}/index.d.ts`, + }, + ]; -for (const rel of allFiles) { - if (isTestOrSpec(rel)) continue; + for (const candidate of candidates) { + if (!existsSync(join(libRoot, candidate.source))) continue; - if (rel.endsWith('.svelte') && !rel.includes('.d.ts')) { - exports[`./${rel}`] = { - types: `./dist/${rel.replace(/\.svelte$/, '.svelte.d.ts')}`, - svelte: `./dist/${rel}`, - default: `./dist/${rel}`, + return { + types: `./dist/${candidate.types}`, + import: `./dist/${candidate.output}`, + default: `./dist/${candidate.output}`, }; - } else if (rel.endsWith('.svelte.js')) { - const svelteCounterpart = rel.replace(/\.js$/, ''); - if (!allFiles.has(svelteCounterpart)) { - const key = `./${rel.replace(/\.js$/, '')}`; - exports[key] = { - types: `./dist/${rel.replace(/\.js$/, '.d.ts')}`, - import: `./dist/${rel}`, - default: `./dist/${rel}`, - }; + } + + return null; +}; + +const createPackageExports = () => { + const packageExports = {}; + const unresolved = []; + + for (const [subpath, source] of Object.entries(publicExportTargets).sort()) { + const entry = resolveEntry(source); + if (!entry) { + unresolved.push(`${subpath} -> ${source}`); + continue; } - } else if (rel.endsWith('.js') && !rel.includes('.svelte.')) { - const base = rel.replace(/\.js$/, ''); - exports[`./${base}`] = { - types: `./dist/${base}.d.ts`, - import: `./dist/${rel}`, - default: `./dist/${rel}`, - }; + packageExports[subpath] = entry; } -} -exports['./package.json'] = './package.json'; + if (unresolved.length) { + console.error( + `Could not resolve ${unresolved.length} public export(s) in src/lib:`, + ); + for (const entry of unresolved) console.error(` - ${entry}`); + process.exit(1); + } -for (const rel of allFiles) { - if (!rel.endsWith('.svelte') || rel.includes('.d.ts')) continue; + packageExports['./package.json'] = './package.json'; + return packageExports; +}; - const file = join(distPath, rel); - const dir = dirname(file); - let code = readFileSync(file, 'utf-8'); +const packageJson = JSON.parse(readFileSync(packagePath, 'utf8')); +const packageExports = createPackageExports(); +const serializedExports = JSON.stringify(packageExports); +const exportsAreCurrent = + JSON.stringify(packageJson.exports) === serializedExports; +const mode = process.argv[2]; - const rewritten = code.replace( - /from '(\.[^']+\.svelte)'/g, - (_, relImport) => { - const abs = resolve(dir, relImport); - const pkgRel = relative(distPath, abs).replace(/\\/g, '/'); - return `from '${pkgName}/${pkgRel}'`; - }, +if ( + process.argv.length > 3 || + ![undefined, '--check', '--validate-dist'].includes(mode) +) { + console.error( + 'Usage: node scripts/generate-exports.mjs [--check|--validate-dist]', ); + process.exit(1); +} + +if (mode === '--check') { + if (!exportsAreCurrent) { + console.error('package.json exports are stale. Run pnpm generate:exports.'); + process.exit(1); + } + console.log(`Verified ${Object.keys(packageExports).length} package exports`); + process.exit(0); +} + +if (mode === '--validate-dist') { + if (!exportsAreCurrent) { + console.error('package.json exports are stale. Run pnpm generate:exports.'); + process.exit(1); + } + + const missingTargets = new Set(); + for (const entry of Object.values(packageExports)) { + const targets = typeof entry === 'string' ? [entry] : Object.values(entry); + for (const target of targets) { + if (!existsSync(join(repoRoot, target))) missingTargets.add(target); + } + } - if (rewritten !== code) writeFileSync(file, rewritten); + if (missingTargets.size) { + console.error(`Missing ${missingTargets.size} package export target(s):`); + for (const target of [...missingTargets].sort()) + console.error(` - ${target}`); + process.exit(1); + } + + console.log( + `Validated ${Object.keys(packageExports).length} package exports`, + ); + process.exit(0); } -pkg.exports = exports; -writeFileSync(pkgUrl, JSON.stringify(pkg, null, 2) + '\n'); +if (exportsAreCurrent) { + console.log('package.json exports are already up to date'); + process.exit(0); +} -console.log(`Generated ${Object.keys(exports).length} explicit export entries`); +packageJson.exports = packageExports; +writeFileSync(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`); +console.log(`Generated ${Object.keys(packageExports).length} package exports`); diff --git a/scripts/public-exports.mjs b/scripts/public-exports.mjs new file mode 100644 index 0000000000..b6f9e61df7 --- /dev/null +++ b/scripts/public-exports.mjs @@ -0,0 +1,183 @@ +const publicSubpaths = [ + 'components/bottom-nav.svelte', + + 'components/codec-server-form/codec-server-form.svelte', + 'components/dark-mode-menu.svelte', + 'components/data-encoder-settings.svelte', + 'components/data-encoder-status.svelte', + 'components/form/form-error.svelte', + 'components/form/message.svelte', + 'components/news-feed/news-feed-widget.svelte', + 'components/search-attributes-form/search-attributes-form.svelte', + 'components/search-attributes-form/types', + 'components/skip-nav.svelte', + 'components/timestamp.svelte', + 'components/timezone-select.svelte', + 'components/top-nav.svelte', + 'components/workers/workers-table/task-queue-workers-table.svelte', + 'components/workflow/workflow-common-errors.svelte', + 'components/workflow/workflow-relationships.svelte', + 'holocene/accordion/accordion.svelte', + 'holocene/alert.svelte', + + 'holocene/badge.svelte', + 'holocene/button.svelte', + 'holocene/card.svelte', + 'holocene/checkbox.svelte', + 'holocene/code-block.svelte', + 'holocene/combobox/combobox.svelte', + 'holocene/copyable/button.svelte', + 'holocene/copyable/index.svelte', + 'holocene/date-picker.svelte', + 'holocene/drawer-content.svelte', + 'holocene/drawer.svelte', + 'holocene/empty-state.svelte', + 'holocene/error.svelte', + 'holocene/icon-button.svelte', + 'holocene/icon/icon.svelte', + 'holocene/icon/index', + 'holocene/icon/paths', + 'holocene/icon/svg.svelte', + 'holocene/icon/svg/chevron-down.svelte', + 'holocene/icon/svg/spinner.svelte', + 'holocene/input/chip-input.svelte', + 'holocene/input/input.svelte', + 'holocene/input/number-input.svelte', + 'holocene/label.svelte', + 'holocene/link.svelte', + 'holocene/loading.svelte', + 'holocene/main-content-container.svelte', + 'holocene/menu/index', + 'holocene/menu/menu-button.svelte', + 'holocene/menu/menu-container.svelte', + 'holocene/menu/menu-divider.svelte', + 'holocene/menu/menu-item.svelte', + 'holocene/menu/menu.svelte', + 'holocene/modal.svelte', + 'holocene/navigation/navigation-badge.svelte', + 'holocene/navigation/navigation-button.svelte', + 'holocene/navigation/navigation-container.svelte', + 'holocene/navigation/navigation-item.svelte', + 'holocene/pill-container/pill-container.svelte', + 'holocene/pill-container/pill.svelte', + 'holocene/radio-input/radio-group.svelte', + 'holocene/radio-input/radio-input.svelte', + 'holocene/select/filter-select.svelte', + 'holocene/select/multi-select.svelte', + 'holocene/select/option.svelte', + 'holocene/select/select.svelte', + 'holocene/skeleton/index.svelte', + 'holocene/skeleton/table.svelte', + 'holocene/split-button.svelte', + 'holocene/tab/tab-list.svelte', + 'holocene/tab/tab-panel.svelte', + 'holocene/tab/tab.svelte', + 'holocene/tab/tabs.svelte', + 'holocene/table/paginated-table/api-paginated.svelte', + 'holocene/table/paginated-table/index.svelte', + 'holocene/table/paginated-table/paginated.svelte', + 'holocene/table/table-header-row.svelte', + 'holocene/table/table-row.svelte', + 'holocene/table/table.svelte', + 'holocene/textarea.svelte', + 'holocene/toaster.svelte', + 'holocene/toggle-button/toggle-button.svelte', + 'holocene/toggle-button/toggle-buttons.svelte', + 'holocene/toggle-switch.svelte', + 'holocene/tooltip.svelte', + 'holocene/vertical-nav/vertical-nav-item.svelte', + 'holocene/vertical-nav/vertical-nav.svelte', + 'i18n/index', + 'i18n/locales/en/nexus', + 'i18n/locales/en/workers', + 'i18n/locales/index', + 'i18n/translate', + 'layouts/standalone-activity-layout.svelte', + 'layouts/standalone-nexus-operation-layout.svelte', + 'layouts/workers-layout.svelte', + 'layouts/workflow-history-layout.svelte', + 'layouts/workflow-run-layout.svelte', + 'layouts/workflow-timeline-layout.svelte', + 'models/core-user', + 'pages/batch-operation.svelte', + 'pages/batch-operations.svelte', + 'pages/deployment.svelte', + 'pages/deployments.svelte', + 'pages/nexus-create-endpoint.svelte', + 'pages/nexus-edit-endpoint.svelte', + 'pages/nexus-empty-state.svelte', + 'pages/nexus-endpoint.svelte', + 'pages/nexus-form.svelte', + 'pages/schedule-edit.svelte', + 'pages/schedule-view.svelte', + 'pages/schedules-create.svelte', + 'pages/schedules.svelte', + 'pages/serverless-worker-create.svelte', + 'pages/standalone-activities.svelte', + 'pages/standalone-activity-details.svelte', + 'pages/standalone-activity-metadata.svelte', + 'pages/standalone-activity-search-attributes.svelte', + 'pages/standalone-activity-workers.svelte', + 'pages/standalone-nexus-operation-details.svelte', + 'pages/standalone-nexus-operation-metadata.svelte', + 'pages/standalone-nexus-operation-search-attributes.svelte', + 'pages/standalone-nexus-operations.svelte', + 'pages/start-standalone-activity.svelte', + 'pages/start-standalone-nexus-operation.svelte', + 'pages/start-workflow.svelte', + 'pages/task-queue.svelte', + 'pages/worker-deployment-version-create.svelte', + 'pages/worker-deployment-version-edit.svelte', + 'pages/worker-details.svelte', + 'pages/workers.svelte', + 'pages/workflow-call-stack.svelte', + 'pages/workflow-history-event.svelte', + 'pages/workflow-memo.svelte', + 'pages/workflow-metadata.svelte', + 'pages/workflow-nexus-links.svelte', + 'pages/workflow-pending-activities.svelte', + 'pages/workflow-query.svelte', + 'pages/workflow-search-attributes.svelte', + 'pages/workflow-user-metadata.svelte', + 'pages/workflows-with-new-search.svelte', + 'services/deployments-service', + 'services/workflow-service', + 'stores/batch-operations', + 'stores/error', + 'stores/filters', + 'stores/namespaces', + 'stores/nav-open', + 'stores/previous-events', + 'stores/search-attributes', + 'stores/time-format', + 'stores/toaster', + 'stores/workflow-run', + 'theme/colors', + 'theme/preset', + 'types/deployments', + 'types/global', + 'types/index', + 'types/nexus', + 'types/workflows', + 'utilities/copy-to-clipboard', + 'utilities/core-context', + 'utilities/core-provider', + 'utilities/dark-mode/dark-mode', + 'utilities/dark-mode/dark-mode.svelte', + 'utilities/decode-payload', + 'utilities/format-camel-case', + 'utilities/format-date', + 'utilities/format-json', + 'utilities/has', + 'utilities/is-email', + 'utilities/parse-with-big-int', + 'utilities/pluralize', + 'utilities/render-markdown', + 'utilities/request-from-api', + 'utilities/timezone', + 'utilities/update-query-parameters', +]; + +export const publicExportTargets = Object.fromEntries( + publicSubpaths.map((subpath) => [`./${subpath}`, subpath]), +); From 0dc16967c04af3e5c2a2d15a87fc3e4eeddeda05 Mon Sep 17 00:00:00 2001 From: Tegan Churchill Date: Fri, 11 Sep 2026 15:17:22 -0700 Subject: [PATCH 2/2] Convert package export scripts to TypeScript --- package.json | 6 ++--- scripts/catalog/catalog-artifacts.test.ts | 4 +-- ...nerate-exports.mjs => generate-exports.ts} | 26 ++++++++++++------- .../{public-exports.mjs => public-exports.ts} | 0 4 files changed, 22 insertions(+), 14 deletions(-) rename scripts/{generate-exports.mjs => generate-exports.ts} (85%) rename scripts/{public-exports.mjs => public-exports.ts} (100%) diff --git a/package.json b/package.json index 451a0170ce..0444b17c21 100644 --- a/package.json +++ b/package.json @@ -70,9 +70,9 @@ "stories:test": "test-storybook --index-json", "stylelint": "stylelint \"src/**/*.{css,postcss,svelte}\"", "stylelint:fix": "stylelint --fix \"src/**/*.{css,postcss,svelte}\"", - "generate:exports": "node scripts/generate-exports.mjs", - "check:exports": "node scripts/generate-exports.mjs --check", - "validate:exports": "node scripts/generate-exports.mjs --validate-dist", + "generate:exports": "esno scripts/generate-exports.ts", + "check:exports": "esno scripts/generate-exports.ts --check", + "validate:exports": "esno scripts/generate-exports.ts --validate-dist", "generate:locales": "esno scripts/generate-locales.ts", "generate:proto": "esno scripts/generate-temporal-proto.ts", "demo": "esno utilities/demo/demo-cli.ts", diff --git a/scripts/catalog/catalog-artifacts.test.ts b/scripts/catalog/catalog-artifacts.test.ts index c32310e310..17e892fc47 100644 --- a/scripts/catalog/catalog-artifacts.test.ts +++ b/scripts/catalog/catalog-artifacts.test.ts @@ -1441,7 +1441,7 @@ registry.registerExample({ 'package.json', 'svelte.config.js', 'tsconfig.json', - 'scripts/generate-exports.mjs', + 'scripts/generate-exports.ts', 'src/lib/holocene/button.svelte', 'src/lib/holocene/card.svelte', 'src/lib/holocene/copyable', @@ -1560,7 +1560,7 @@ registry.registerExample({ `${JSON.stringify(packageJson, null, 2)}\n`, ); await writeFile( - join(packageDirectory, 'scripts/public-exports.mjs'), + join(packageDirectory, 'scripts/public-exports.ts'), [ 'export const publicSubpaths = [', " 'catalog/authoring',", diff --git a/scripts/generate-exports.mjs b/scripts/generate-exports.ts similarity index 85% rename from scripts/generate-exports.mjs rename to scripts/generate-exports.ts index 40dff45874..d6f2fe47c9 100644 --- a/scripts/generate-exports.mjs +++ b/scripts/generate-exports.ts @@ -2,13 +2,19 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { publicSubpaths } from './public-exports.mjs'; +import { z } from 'zod'; + +import { publicSubpaths } from './public-exports.js'; const repoRoot = fileURLToPath(new URL('..', import.meta.url)); const libRoot = join(repoRoot, 'src/lib'); const packagePath = join(repoRoot, 'package.json'); -const resolveEntry = (source) => { +type ExportConditions = Record; +type PackageExport = string | ExportConditions; +type PackageExports = Record; + +const resolveEntry = (source: string): ExportConditions | null => { if (source.endsWith('.svelte')) { if (!existsSync(join(libRoot, source))) return null; @@ -65,10 +71,10 @@ const resolveEntry = (source) => { return null; }; -const createPackageExports = () => { - const packageExports = {}; - const duplicateSubpaths = []; - const unresolvedSubpaths = []; +const createPackageExports = (): PackageExports => { + const packageExports: PackageExports = {}; + const duplicateSubpaths: string[] = []; + const unresolvedSubpaths: string[] = []; for (const source of [...publicSubpaths].sort()) { const subpath = `./${source}`; @@ -105,7 +111,9 @@ const createPackageExports = () => { return packageExports; }; -const packageJson = JSON.parse(readFileSync(packagePath, 'utf8')); +const packageJson = z + .record(z.string(), z.json()) + .parse(JSON.parse(readFileSync(packagePath, 'utf8'))); const packageExports = createPackageExports(); const serializedExports = JSON.stringify(packageExports); const exportsAreCurrent = @@ -117,7 +125,7 @@ if ( ![undefined, '--check', '--validate-dist'].includes(mode) ) { console.error( - 'Usage: node scripts/generate-exports.mjs [--check|--validate-dist]', + 'Usage: esno scripts/generate-exports.ts [--check|--validate-dist]', ); process.exit(1); } @@ -137,7 +145,7 @@ if (mode === '--validate-dist') { process.exit(1); } - const missingTargets = new Set(); + const missingTargets = new Set(); for (const entry of Object.values(packageExports)) { const targets = typeof entry === 'string' ? [entry] : Object.values(entry); for (const target of targets) { diff --git a/scripts/public-exports.mjs b/scripts/public-exports.ts similarity index 100% rename from scripts/public-exports.mjs rename to scripts/public-exports.ts