diff --git a/docs/RELEASE_DEPENDENCIES.md b/docs/RELEASE_DEPENDENCIES.md index ab62db7..f31b9a5 100644 --- a/docs/RELEASE_DEPENDENCIES.md +++ b/docs/RELEASE_DEPENDENCIES.md @@ -95,6 +95,15 @@ package entry. Keep one committed full-product release lockfile at `webui/package.release.json` in a clean release workspace. Development `package-lock.json` may continue to point at local `file:` dependencies. +The default WebUI build discovers every declared, installed module package, +including Tasks and its Work page, dashboard widget, and Quick Access tool. +Discovery still respects enabled backend modules and user permissions; adding +a package never grants access. `GOVOPLAN_WEBUI_MODULE_PACKAGES` selects an +explicit smaller build when set, and an explicitly empty value selects +core-only. The prebuild interface check compares the default descriptor list +with the package manifest so explicit permutation tests cannot conceal a +module accidentally omitted from the ordinary build. + Frontend module permutations are regression-tested through `GOVOPLAN_WEBUI_MODULE_PACKAGES` and temporary build output, not through committed lockfiles for every possible combination. If a smaller composition diff --git a/webui/package-lock.json b/webui/package-lock.json index 85e4c8c..2b4a805 100644 --- a/webui/package-lock.json +++ b/webui/package-lock.json @@ -139,7 +139,7 @@ }, "../../govoplan-approvals/webui": { "name": "@govoplan/approvals-webui", - "version": "0.1.20", + "version": "0.1.21", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -344,7 +344,7 @@ }, "../../govoplan-encryption/webui": { "name": "@govoplan/encryption-webui", - "version": "0.1.19", + "version": "0.1.20", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -378,7 +378,7 @@ }, "../../govoplan-forms-runtime/webui": { "name": "@govoplan/forms-runtime-webui", - "version": "0.1.20", + "version": "0.1.21", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -394,7 +394,7 @@ }, "../../govoplan-forms/webui": { "name": "@govoplan/forms-webui", - "version": "0.1.22", + "version": "0.1.23", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -426,7 +426,7 @@ }, "../../govoplan-identity-trust/webui": { "name": "@govoplan/identity-trust-webui", - "version": "0.1.20", + "version": "0.1.21", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -441,7 +441,7 @@ }, "../../govoplan-identity/webui": { "name": "@govoplan/identity-webui", - "version": "0.1.20", + "version": "0.1.21", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -551,7 +551,7 @@ }, "../../govoplan-payments/webui": { "name": "@govoplan/payments-webui", - "version": "0.1.21", + "version": "0.1.22", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -583,7 +583,7 @@ }, "../../govoplan-portal/webui": { "name": "@govoplan/portal-webui", - "version": "0.1.21", + "version": "0.1.22", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -599,7 +599,7 @@ }, "../../govoplan-postbox/webui": { "name": "@govoplan/postbox-webui", - "version": "0.1.22", + "version": "0.1.23", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -615,7 +615,7 @@ }, "../../govoplan-projects/webui": { "name": "@govoplan/projects-webui", - "version": "0.1.19", + "version": "0.1.20", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -631,7 +631,7 @@ }, "../../govoplan-quick-access/webui": { "name": "@govoplan/quick-access-webui", - "version": "0.1.20", + "version": "0.1.21", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", @@ -647,7 +647,7 @@ }, "../../govoplan-records/webui": { "name": "@govoplan/records-webui", - "version": "0.1.23", + "version": "0.1.24", "peerDependencies": { "@govoplan/core-webui": "^0.1.18", "lucide-react": "^1.23.0", diff --git a/webui/package.release.json b/webui/package.release.json index d52b479..ec6d83c 100644 --- a/webui/package.release.json +++ b/webui/package.release.json @@ -37,7 +37,7 @@ "@govoplan/access-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-access.git#v0.1.25", "@govoplan/addresses-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-addresses.git#v0.1.22", "@govoplan/admin-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-admin.git#v0.1.23", - "@govoplan/approvals-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-approvals.git#v0.1.20", + "@govoplan/approvals-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-approvals.git#v0.1.21", "@govoplan/audit-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-audit.git#v0.1.20", "@govoplan/calendar-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-calendar.git#v0.1.23", "@govoplan/campaign-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-campaign.git#v0.1.28", @@ -49,25 +49,25 @@ "@govoplan/datasources-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-datasources.git#v0.1.25", "@govoplan/dist-lists-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-dist-lists.git#v0.1.21", "@govoplan/docs-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-docs.git#v0.1.23", - "@govoplan/encryption-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-encryption.git#v0.1.19", + "@govoplan/encryption-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-encryption.git#v0.1.20", "@govoplan/files-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-files.git#v0.1.26", - "@govoplan/forms-runtime-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-forms-runtime.git#v0.1.20", - "@govoplan/forms-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-forms.git#v0.1.22", + "@govoplan/forms-runtime-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-forms-runtime.git#v0.1.21", + "@govoplan/forms-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-forms.git#v0.1.23", "@govoplan/helpdesk-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-helpdesk.git#v0.1.21", - "@govoplan/identity-trust-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-identity-trust.git#v0.1.20", - "@govoplan/identity-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-identity.git#v0.1.20", + "@govoplan/identity-trust-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-identity-trust.git#v0.1.21", + "@govoplan/identity-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-identity.git#v0.1.21", "@govoplan/idm-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-idm.git#v0.1.25", "@govoplan/mail-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-mail.git#v0.1.27", "@govoplan/notifications-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-notifications.git#v0.1.20", "@govoplan/ops-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-ops.git#v0.1.22", "@govoplan/organizations-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-organizations.git#v0.1.21", - "@govoplan/payments-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-payments.git#v0.1.21", + "@govoplan/payments-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-payments.git#v0.1.22", "@govoplan/policy-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-policy.git#v0.1.23", - "@govoplan/portal-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-portal.git#v0.1.21", - "@govoplan/postbox-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-postbox.git#v0.1.22", - "@govoplan/projects-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-projects.git#v0.1.19", - "@govoplan/quick-access-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-quick-access.git#v0.1.20", - "@govoplan/records-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-records.git#v0.1.23", + "@govoplan/portal-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-portal.git#v0.1.22", + "@govoplan/postbox-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-postbox.git#v0.1.23", + "@govoplan/projects-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-projects.git#v0.1.20", + "@govoplan/quick-access-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-quick-access.git#v0.1.21", + "@govoplan/records-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-records.git#v0.1.24", "@govoplan/reporting-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-reporting.git#v0.1.21", "@govoplan/risk-compliance-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-risk-compliance.git#v0.1.21", "@govoplan/scheduling-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-scheduling.git#v0.1.22", diff --git a/webui/scripts/test-core-interface-patterns.mjs b/webui/scripts/test-core-interface-patterns.mjs index b182c4d..0dd4b25 100644 --- a/webui/scripts/test-core-interface-patterns.mjs +++ b/webui/scripts/test-core-interface-patterns.mjs @@ -39,6 +39,18 @@ const layoutStyles = read("src/styles/layout.css"); const authGateStyles = read("src/styles/auth-gate.css"); const viteConfig = read("vite.config.ts"); const packageManifest = JSON.parse(read("package.json")); +const defaultModulePackages = [...(viteConfig.match(/const defaultWebModulePackages = \[([\s\S]*?)\];/)?.[1] ?? "") + .matchAll(/"([^"]+)"/g)].map((match) => match[1]); +const declaredModulePackages = Object.keys(packageManifest.dependencies) + .filter((name) => name.startsWith("@govoplan/")).sort(); +assert.deepEqual([...defaultModulePackages].sort(), declaredModulePackages, + "every declared module must be discoverable in the default build, including Tasks; explicit permutations cannot hide an omitted descriptor"); +assert.match(viteConfig, /if \(configured === undefined\) return defaultWebModulePackages;/, + "only an absent override selects the full default composition"); +assert.match(viteConfig, /return configured\.split\(","\)\.map\([\s\S]*?\.filter\(Boolean\)/, + "an explicit empty override still supports a core-only build"); +assert.match(viteConfig, /return configuredWebModulePackages\(\)\.filter\(packageInstalled\)/, + "declared modules remain optional when their package is not installed"); // Component presence alone cannot detect a collection toolbar in a left pane. await import("./test-workspace-collection-actions.mjs"); diff --git a/webui/vite.config.ts b/webui/vite.config.ts index 65ce8b2..b65eabe 100644 --- a/webui/vite.config.ts +++ b/webui/vite.config.ts @@ -51,6 +51,7 @@ const defaultWebModulePackages = [ "@govoplan/risk-compliance-webui", "@govoplan/scheduling-webui", "@govoplan/search-webui", + "@govoplan/tasks-webui", "@govoplan/tenancy-webui", "@govoplan/templates-webui", "@govoplan/tickets-webui",