diff --git a/src/Umbraco.Web.UI.Client/devops/publish/cleanse-pkg.js b/src/Umbraco.Web.UI.Client/devops/publish/cleanse-pkg.js index 6ef013fe3b85..841846f441be 100644 --- a/src/Umbraco.Web.UI.Client/devops/publish/cleanse-pkg.js +++ b/src/Umbraco.Web.UI.Client/devops/publish/cleanse-pkg.js @@ -1,4 +1,6 @@ -import { readFileSync, writeFileSync } from 'fs'; +import { readFileSync, writeFileSync, existsSync } from 'fs'; +import { join } from 'path'; +import glob from 'tiny-glob' console.log('[Prepublish] Cleansing package.json'); @@ -12,5 +14,40 @@ delete packageJson.devDependencies; packageJson.peerDependencies = { ...packageJson.dependencies }; delete packageJson.dependencies; +// Iterate all workspaces and hoist the dependencies to the root package.json +const workspaces = packageJson.workspaces || []; +const workspacePromises = workspaces.map(async workspaceGlob => { + // Use glob to find the workspace path + const localWorkspace = workspaceGlob.replace(/\.\/src/, './dist-cms'); + const workspacePaths = await glob(localWorkspace, { cwd: './', absolute: true }); + + workspacePaths.forEach(workspace => { + const workspacePackageFile = join(workspace, 'package.json'); + + // Ensure the workspace package.json exists + if (!existsSync(workspacePackageFile)) { + // If the package.json does not exist, log a warning and continue + console.warn(`No package.json found in workspace: ${workspace}`); + return; + } + + const workspacePackageJson = JSON.parse(readFileSync(workspacePackageFile, 'utf8')); + + // Move dependencies from the workspace to the root package.json + if (workspacePackageJson.dependencies) { + Object.entries(workspacePackageJson.dependencies).forEach(([key, value]) => { + console.log('Hoisting dependency:', key, 'from workspace:', workspace, 'with version:', value); + packageJson.peerDependencies[key] = value; + }); + } + }) +}); + +// Wait for all workspace processing to complete +await Promise.all(workspacePromises); + +// Remove the workspaces field from the root package.json +delete packageJson.workspaces; + // Write the package.json back to disk writeFileSync(packageFile, JSON.stringify(packageJson, null, 2), 'utf8'); diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index e2b349e2d09d..1f0f8ef502ff 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -4468,6 +4468,14 @@ "resolved": "src/packages/search", "link": true }, + "node_modules/@umbraco-backoffice/segment": { + "resolved": "src/packages/segment", + "link": true + }, + "node_modules/@umbraco-backoffice/settings": { + "resolved": "src/packages/settings", + "link": true + }, "node_modules/@umbraco-backoffice/static-file": { "resolved": "src/packages/static-file", "link": true @@ -4492,6 +4500,10 @@ "resolved": "src/packages/tiptap", "link": true }, + "node_modules/@umbraco-backoffice/translation": { + "resolved": "src/packages/translation", + "link": true + }, "node_modules/@umbraco-backoffice/ufm": { "resolved": "src/packages/ufm", "link": true @@ -17560,6 +17572,12 @@ "src/packages/search": { "name": "@umbraco-backoffice/search" }, + "src/packages/segment": { + "name": "@umbraco-backoffice/segment" + }, + "src/packages/settings": { + "name": "@umbraco-backoffice/settings" + }, "src/packages/static-file": { "name": "@umbraco-backoffice/static-file" }, @@ -17578,6 +17596,9 @@ "src/packages/tiptap": { "name": "@umbraco-backoffice/tiptap" }, + "src/packages/translation": { + "name": "@umbraco-backoffice/translation" + }, "src/packages/ufm": { "name": "@umbraco-backoffice/ufm" }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/package.json b/src/Umbraco.Web.UI.Client/src/packages/segment/package.json new file mode 100644 index 000000000000..f1365f6af623 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/package.json @@ -0,0 +1,8 @@ +{ + "name": "@umbraco-backoffice/segment", + "private": true, + "type": "module", + "scripts": { + "build": "vite build" + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/package.json b/src/Umbraco.Web.UI.Client/src/packages/settings/package.json new file mode 100644 index 000000000000..1125485668bb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/package.json @@ -0,0 +1,8 @@ +{ + "name": "@umbraco-backoffice/settings", + "private": true, + "type": "module", + "scripts": { + "build": "vite build" + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/vite.config.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/vite.config.ts new file mode 100644 index 000000000000..9a2769bc2432 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/vite.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite'; +import { rmSync } from 'fs'; +import { getDefaultConfig } from '../../vite-config-base'; + +const dist = '../../../dist-cms/packages/settings'; + +// delete the unbundled dist folder +rmSync(dist, { recursive: true, force: true }); + +export default defineConfig({ + ...getDefaultConfig({ + dist, + }), +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/translation/package.json b/src/Umbraco.Web.UI.Client/src/packages/translation/package.json new file mode 100644 index 000000000000..b137299eace9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/translation/package.json @@ -0,0 +1,8 @@ +{ + "name": "@umbraco-backoffice/translation", + "private": true, + "type": "module", + "scripts": { + "build": "vite build" + } +} \ No newline at end of file