@bleedingdev/modern-js-ultramodern-create 3.9.3-ultramodern.7 → 3.9.3-ultramodern.9
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/dist/cjs/ultramodern-tooling/config/normalize.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +7 -7
- package/dist/cjs/ultramodern-workspace/package-json.cjs +9 -2
- package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +20 -2
- package/dist/cjs/ultramodern-workspace/validation/renderer.cjs +3 -3
- package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/versions.cjs +21 -21
- package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +5 -0
- package/dist/esm/ultramodern-tooling/config/normalize.js +2 -2
- package/dist/esm/ultramodern-workspace/module-federation/config.js +7 -7
- package/dist/esm/ultramodern-workspace/package-json.js +9 -2
- package/dist/esm/ultramodern-workspace/patch-inventory.js +20 -2
- package/dist/esm/ultramodern-workspace/validation/renderer.js +3 -3
- package/dist/esm/ultramodern-workspace/validation/workspace.js +1 -1
- package/dist/esm/ultramodern-workspace/versions.js +21 -21
- package/dist/esm/ultramodern-workspace/workspace-script-plan.js +5 -0
- package/dist/esm-node/ultramodern-tooling/config/normalize.js +2 -2
- package/dist/esm-node/ultramodern-workspace/module-federation/config.js +7 -7
- package/dist/esm-node/ultramodern-workspace/package-json.js +9 -2
- package/dist/esm-node/ultramodern-workspace/patch-inventory.js +20 -2
- package/dist/esm-node/ultramodern-workspace/validation/renderer.js +3 -3
- package/dist/esm-node/ultramodern-workspace/validation/workspace.js +1 -1
- package/dist/esm-node/ultramodern-workspace/versions.js +21 -21
- package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +5 -0
- package/dist/types/ultramodern-workspace/policy.d.ts +27 -27
- package/dist/types/ultramodern-workspace/versions.d.ts +45 -45
- package/package.json +34 -34
- package/release-cohort.json +52 -64
- package/templates/workspace-scripts/materialize-zerops-runtime.mjs +332 -82
|
@@ -165,7 +165,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
|
|
|
165
165
|
rendererProfile: app.rendererProfile,
|
|
166
166
|
routerBindings: app.routerBindings,
|
|
167
167
|
rendererCapabilities: app.rendererCapabilities,
|
|
168
|
-
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !(0, renderer_profile_cjs_namespaceObject.
|
|
168
|
+
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !(0, renderer_profile_cjs_namespaceObject.getRendererGenerationProfile)(app.renderer).capabilities.federation) ? {} : {
|
|
169
169
|
moduleFederation: {
|
|
170
170
|
role: 'shell' === app.kind ? 'host' : 'remote',
|
|
171
171
|
name: app.mfName,
|
|
@@ -44,12 +44,12 @@ function createAppModernConfig(app, enableTailwind = true) {
|
|
|
44
44
|
const renderer = (0, external_renderer_profile_cjs_namespaceObject.resolveWorkspaceRenderer)(app);
|
|
45
45
|
if ((0, external_renderer_generations_cjs_namespaceObject.hasNativeAppGeneration)(renderer)) {
|
|
46
46
|
const generation = (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app);
|
|
47
|
-
const
|
|
48
|
-
return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
|
|
49
|
-
${
|
|
47
|
+
const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
|
|
48
|
+
return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
|
|
49
|
+
${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
|
|
50
50
|
${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
|
|
51
51
|
${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
|
|
52
|
-
${
|
|
52
|
+
${authoredAssetPrefix ? `// Set ${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app)} to this remote's public origin when deploying.
|
|
53
53
|
const remoteAddress = createRemoteManifestUrl({
|
|
54
54
|
manifestEnv: ${JSON.stringify((0, external_descriptors_cjs_namespaceObject.createRemoteManifestEnv)(app))},
|
|
55
55
|
publicUrlEnv: ${JSON.stringify((0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app))},
|
|
@@ -59,10 +59,10 @@ const remoteAddress = createRemoteManifestUrl({
|
|
|
59
59
|
const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
|
|
60
60
|
|
|
61
61
|
` : ''}
|
|
62
|
-
export default defineConfig({
|
|
62
|
+
export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
|
|
63
63
|
${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
|
|
64
64
|
${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? ' plugins: [bffPlugin()],\n' : ''}
|
|
65
|
-
${
|
|
65
|
+
${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
|
|
66
66
|
server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? `,
|
|
67
67
|
bff: {
|
|
68
68
|
effect: {
|
|
@@ -73,7 +73,7 @@ ${'rest' === (0, external_descriptors_cjs_namespaceObject.resolveApiProtocol)(ap
|
|
|
73
73
|
runtimeFramework: 'effect',
|
|
74
74
|
}` : ''} },
|
|
75
75
|
source: { mainEntryName: 'main' },
|
|
76
|
-
});
|
|
76
|
+
}${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
|
|
77
77
|
`;
|
|
78
78
|
}
|
|
79
79
|
const emitsUi = (0, external_descriptors_cjs_namespaceObject.appEmitsBrowserUi)(app);
|
|
@@ -102,7 +102,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
|
|
|
102
102
|
const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
|
|
103
103
|
const renderer = (0, external_renderer_profile_cjs_namespaceObject.resolveWorkspaceRenderer)(app);
|
|
104
104
|
const generationProfile = (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app);
|
|
105
|
-
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
|
|
105
|
+
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
|
|
106
106
|
return {
|
|
107
107
|
...(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) || 'shell' === app.kind && 'react' === renderer ? {
|
|
108
108
|
'@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
|
|
@@ -128,8 +128,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
128
128
|
...additionalShells,
|
|
129
129
|
...remotes
|
|
130
130
|
];
|
|
131
|
+
const workerApps = apps.filter((app)=>(0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.capabilities.workers);
|
|
132
|
+
const workerFilters = workerApps.map((app)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}`).join(' ');
|
|
131
133
|
if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
|
|
132
|
-
const rootDevDependencies = Object.fromEntries(Object.entries(external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
134
|
+
const rootDevDependencies = Object.fromEntries(Object.entries(external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
133
135
|
return {
|
|
134
136
|
private: true,
|
|
135
137
|
name: scope,
|
|
@@ -144,6 +146,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
144
146
|
dev: `pnpm --parallel ${apps.map((app)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}`).join(' ')} dev`,
|
|
145
147
|
'dev:shell': `pnpm --filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, primaryShell.packageSuffix)} dev`,
|
|
146
148
|
build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
|
|
149
|
+
...workerApps.length > 0 ? {
|
|
150
|
+
'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
|
|
151
|
+
'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
|
|
152
|
+
'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
|
|
153
|
+
} : {},
|
|
147
154
|
typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
|
|
148
155
|
'contract:check': 'ultramodern-create ultramodern validate',
|
|
149
156
|
check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',
|
|
@@ -28,10 +28,28 @@ var __webpack_require__ = {};
|
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
const __rspack_default_export = [
|
|
31
|
+
{
|
|
32
|
+
packageName: '@tanstack/router-core',
|
|
33
|
+
version: '1.171.34',
|
|
34
|
+
path: 'patches/@tanstack__router-core@1.171.34.patch',
|
|
35
|
+
sha256: '0e526bc0a1fd038c459fbf45b2b62da81f7f2516176b585f41fed7098ac4abbb',
|
|
36
|
+
repository: true,
|
|
37
|
+
workspace: null,
|
|
38
|
+
reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, including public types and emitted CJS/ESM source maps. Applies only to the accepted Octane router-core 1.171.34 closure during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
packageName: '@tanstack/router-core',
|
|
42
|
+
version: '1.171.37',
|
|
43
|
+
path: 'patches/@tanstack__router-core@1.171.37.patch',
|
|
44
|
+
sha256: '6ffa70914ed338f3cb56d3cd1f526e35286e09f287ecf48ee6dbc1aa18305458',
|
|
45
|
+
repository: true,
|
|
46
|
+
workspace: null,
|
|
47
|
+
reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, preserving current location caching and SSR rewrite behavior, public types and emitted CJS/ESM source maps. Applies only to Modern router-core 1.171.37 during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
|
|
48
|
+
},
|
|
31
49
|
{
|
|
32
50
|
packageName: 'ultracite',
|
|
33
|
-
version: '
|
|
34
|
-
path: 'patches/ultracite@
|
|
51
|
+
version: '8.0.1',
|
|
52
|
+
path: 'patches/ultracite@8.0.1.patch',
|
|
35
53
|
sha256: 'a18b2c7be68a6823a793f0def8ce13d7655c67c56c2200978a2be600cb29ba74',
|
|
36
54
|
repository: false,
|
|
37
55
|
workspace: null,
|
|
@@ -110,7 +110,7 @@ function parseNpmAlias(value) {
|
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
112
|
function isForeignRendererPackage(name, renderer) {
|
|
113
|
-
const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') ||
|
|
113
|
+
const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') || name.startsWith('@modern-js/i18n-runtime-extensions/') || '@modern-js/plugin-runtime' === name || name.startsWith('@modern-js/plugin-runtime/');
|
|
114
114
|
if (react) return 'react' !== renderer;
|
|
115
115
|
const owner = (0, ultramodern_app_tools_namespaceObject.specifierRenderer)(name);
|
|
116
116
|
return void 0 !== owner && 'react' !== owner && owner !== renderer;
|
|
@@ -210,7 +210,7 @@ function assertAuthoredRendererDependencyPins(manifest, generation, options = {}
|
|
|
210
210
|
for (const [name, version] of Object.entries({
|
|
211
211
|
...generation.dependencies,
|
|
212
212
|
...generation.devDependencies
|
|
213
|
-
}))if (isForeignRendererPackage(name, 'none')) pins[name] = version;
|
|
213
|
+
}))if (name === profile.compiler.name || name === profile.router.coreName || isForeignRendererPackage(name, 'none')) pins[name] = version;
|
|
214
214
|
for (const group of [
|
|
215
215
|
'dependencies',
|
|
216
216
|
'devDependencies',
|
|
@@ -299,7 +299,7 @@ function assertNativeRendererSourceSurface(root, app, generation, manifest) {
|
|
|
299
299
|
])(0, external_assertions_cjs_namespaceObject.assert)(!external_node_fs_default().existsSync(external_node_path_default().join(appRoot, relative)), `${app.id} native renderer contains unsupported artifact ${relative}`);
|
|
300
300
|
const tsconfig = JSON.parse(external_node_fs_default().readFileSync(external_node_path_default().join(appRoot, 'tsconfig.json'), 'utf8'));
|
|
301
301
|
(0, external_assertions_cjs_namespaceObject.assert)(tsconfig.compilerOptions?.jsxImportSource === generation.jsxImportSource && tsconfig.compilerOptions?.jsx === 'preserve', `${app.id} JSX compiler configuration disagrees with the selected renderer`);
|
|
302
|
-
for (const script of Object.values(manifest.scripts ?? {}))(0, external_assertions_cjs_namespaceObject.assert)('string' == typeof script && !/
|
|
302
|
+
for (const script of Object.values(manifest.scripts ?? {}))(0, external_assertions_cjs_namespaceObject.assert)('string' == typeof script && !/i18n/iu.test(script) && (generation.capabilities.workers || !/wrangler/iu.test(script)) && (generation.capabilities.federation || !/module-federation/iu.test(script)), `${app.id} native renderer scripts claim an unsupported capability`);
|
|
303
303
|
}
|
|
304
304
|
function validateApiOnlySourceSurface(root, app) {
|
|
305
305
|
(0, external_assertions_cjs_namespaceObject.assert)(!Object.hasOwn(app.backendFederation?.versionBoundary ?? {}, 'ui'), `topology/reference-topology.json verticals.${app.id}.backendFederation must omit the UI boundary for an api-only unit`);
|
|
@@ -211,7 +211,7 @@ function validateWorkspace(root, expected) {
|
|
|
211
211
|
requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
|
|
212
212
|
if (input.emitsUi && !nativeRenderer) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
|
|
213
213
|
requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
|
|
214
|
-
if (!nativeRenderer) {
|
|
214
|
+
if (!nativeRenderer || generation.capabilities.workers) {
|
|
215
215
|
const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
|
|
216
216
|
for (const field of [
|
|
217
217
|
'workerName',
|
|
@@ -27,40 +27,40 @@ var __webpack_require__ = {};
|
|
|
27
27
|
})();
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
const TANSTACK_ROUTER_VERSION = '1.170.
|
|
31
|
-
const TANSTACK_ROUTER_CORE_VERSION = '1.171.
|
|
32
|
-
const TANSTACK_HISTORY_VERSION = '1.162.
|
|
30
|
+
const TANSTACK_ROUTER_VERSION = '1.170.44';
|
|
31
|
+
const TANSTACK_ROUTER_CORE_VERSION = '1.171.37';
|
|
32
|
+
const TANSTACK_HISTORY_VERSION = '1.162.5';
|
|
33
33
|
const MODULE_FEDERATION_VERSION = '2.9.2';
|
|
34
34
|
const MODULE_FEDERATION_BRIDGE_REACT_FORK_VERSION = '2.9.3';
|
|
35
35
|
const MODULE_FEDERATION_RUNTIME_FORK_VERSION = '2.9.3';
|
|
36
36
|
const MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION = '2.9.4';
|
|
37
|
-
const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.
|
|
38
|
-
const ZEPHYR_AGENT_VERSION = '1.
|
|
39
|
-
const WRANGLER_VERSION = '4.
|
|
37
|
+
const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.6.0';
|
|
38
|
+
const ZEPHYR_AGENT_VERSION = '1.6.0';
|
|
39
|
+
const WRANGLER_VERSION = '4.151.0';
|
|
40
40
|
const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
|
|
41
41
|
const TAILWIND_VERSION = '4.3.3';
|
|
42
42
|
const RSBUILD_PLUGIN_TAILWINDCSS_VERSION = '2.0.3';
|
|
43
|
-
const EFFECT_VERSION = '4.0.
|
|
44
|
-
const EFFECT_TSGO_VERSION = '0.53.
|
|
43
|
+
const EFFECT_VERSION = '4.0.5';
|
|
44
|
+
const EFFECT_TSGO_VERSION = '0.53.1';
|
|
45
45
|
const TYPESCRIPT_STABLE_VERSION = '7.0.2';
|
|
46
46
|
const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
|
|
47
|
-
const OXLINT_VERSION = '1.
|
|
48
|
-
const OXFMT_VERSION = '0.
|
|
49
|
-
const ULTRACITE_VERSION = '
|
|
50
|
-
const LEFTHOOK_VERSION = '2.
|
|
51
|
-
const I18NEXT_VERSION = '26.4.
|
|
47
|
+
const OXLINT_VERSION = '1.88.0';
|
|
48
|
+
const OXFMT_VERSION = '0.73.0';
|
|
49
|
+
const ULTRACITE_VERSION = '8.0.1';
|
|
50
|
+
const LEFTHOOK_VERSION = '2.2.2';
|
|
51
|
+
const I18NEXT_VERSION = '26.4.6';
|
|
52
52
|
const MODULE_FEDERATION_NODE_VERSION = '2.7.52';
|
|
53
|
-
const MINIFLARE_VERSION = '5.
|
|
54
|
-
const WORKERD_VERSION = '1.
|
|
55
|
-
const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.
|
|
53
|
+
const MINIFLARE_VERSION = '5.20261012.0-beta';
|
|
54
|
+
const WORKERD_VERSION = '1.20261015.1';
|
|
55
|
+
const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20261015.1';
|
|
56
56
|
const NODE_FETCH_VERSION = '3.3.2';
|
|
57
|
-
const REACT_VERSION = '19.3.
|
|
58
|
-
const REACT_DOM_VERSION = '19.3.
|
|
59
|
-
const TYPES_NODE_VERSION = '26.6.
|
|
57
|
+
const REACT_VERSION = '19.3.1';
|
|
58
|
+
const REACT_DOM_VERSION = '19.3.1';
|
|
59
|
+
const TYPES_NODE_VERSION = '26.6.5';
|
|
60
60
|
const TYPES_REACT_VERSION = '19.3.0';
|
|
61
61
|
const TYPES_REACT_DOM_VERSION = '19.3.0';
|
|
62
|
-
const NODE_VERSION = '26.
|
|
63
|
-
const PNPM_VERSION = '12.
|
|
62
|
+
const NODE_VERSION = '26.12.0';
|
|
63
|
+
const PNPM_VERSION = '12.11.2';
|
|
64
64
|
const BRACES_FORK_VERSION = '3.0.4';
|
|
65
65
|
const SHARP_VERSION = '0.35.5';
|
|
66
66
|
const ULTRAMODERN_PACKAGE_PINS = {
|
|
@@ -126,6 +126,11 @@ function createWorkspaceAppPackageScripts(app) {
|
|
|
126
126
|
dev: 'ultramodern dev',
|
|
127
127
|
build: 'ultramodern build',
|
|
128
128
|
serve: 'ultramodern serve',
|
|
129
|
+
...(0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.capabilities.workers ? {
|
|
130
|
+
'cloudflare:build': 'ultramodern build --deploy-target cloudflare && ultramodern deploy --skip-build --deploy-target cloudflare',
|
|
131
|
+
'cloudflare:deploy': 'pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
|
|
132
|
+
'cloudflare:preview': `pnpm run cloudflare:build && wrangler dev --port ${app.port} --config .output/wrangler.json`
|
|
133
|
+
} : {},
|
|
129
134
|
typecheck: (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.typecheckCommand ?? createStrictTsgoTypecheckCommand(app.directory)
|
|
130
135
|
};
|
|
131
136
|
const plan = createWorkspaceAppScriptPlan(app);
|
|
@@ -4,7 +4,7 @@ import { verticalsFromTopology } from "../../ultramodern-workspace/add-vertical/
|
|
|
4
4
|
import { createNeutralOwnership, shellApp } from "../../ultramodern-workspace/descriptors.js";
|
|
5
5
|
import { readModuleFederationExposePaths } from "../../ultramodern-workspace/mf-validation.js";
|
|
6
6
|
import { toEnvSegment } from "../../ultramodern-workspace/naming.js";
|
|
7
|
-
import {
|
|
7
|
+
import { getRendererGenerationProfile } from "../../ultramodern-workspace/renderer-profile.js";
|
|
8
8
|
import { readJsonObject } from "./json.js";
|
|
9
9
|
import { packageScopeFromRoot, readWorkspacePackageSource } from "./metadata.js";
|
|
10
10
|
function normalizeWorkspaceInputs(workspaceRoot, inputs) {
|
|
@@ -118,7 +118,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
|
|
|
118
118
|
rendererProfile: app.rendererProfile,
|
|
119
119
|
routerBindings: app.routerBindings,
|
|
120
120
|
rendererCapabilities: app.rendererCapabilities,
|
|
121
|
-
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !
|
|
121
|
+
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !getRendererGenerationProfile(app.renderer).capabilities.federation) ? {} : {
|
|
122
122
|
moduleFederation: {
|
|
123
123
|
role: 'shell' === app.kind ? 'host' : 'remote',
|
|
124
124
|
name: app.mfName,
|
|
@@ -8,12 +8,12 @@ function createAppModernConfig(app, enableTailwind = true) {
|
|
|
8
8
|
const renderer = resolveWorkspaceRenderer(app);
|
|
9
9
|
if (hasNativeAppGeneration(renderer)) {
|
|
10
10
|
const generation = resolveAppGenerationProfile(app);
|
|
11
|
-
const
|
|
12
|
-
return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
|
|
13
|
-
${
|
|
11
|
+
const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
|
|
12
|
+
return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
|
|
13
|
+
${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
|
|
14
14
|
${appHasApi(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
|
|
15
15
|
${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
|
|
16
|
-
${
|
|
16
|
+
${authoredAssetPrefix ? `// Set ${createCloudflarePublicUrlEnv(app)} to this remote's public origin when deploying.
|
|
17
17
|
const remoteAddress = createRemoteManifestUrl({
|
|
18
18
|
manifestEnv: ${JSON.stringify(createRemoteManifestEnv(app))},
|
|
19
19
|
publicUrlEnv: ${JSON.stringify(createCloudflarePublicUrlEnv(app))},
|
|
@@ -23,10 +23,10 @@ const remoteAddress = createRemoteManifestUrl({
|
|
|
23
23
|
const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
|
|
24
24
|
|
|
25
25
|
` : ''}
|
|
26
|
-
export default defineConfig({
|
|
26
|
+
export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
|
|
27
27
|
${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
|
|
28
28
|
${appHasApi(app) ? ' plugins: [bffPlugin()],\n' : ''}
|
|
29
|
-
${
|
|
29
|
+
${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
|
|
30
30
|
server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${appHasApi(app) ? `,
|
|
31
31
|
bff: {
|
|
32
32
|
effect: {
|
|
@@ -37,7 +37,7 @@ ${'rest' === resolveApiProtocol(app) ? " openapi: { path: '/openapi.json'
|
|
|
37
37
|
runtimeFramework: 'effect',
|
|
38
38
|
}` : ''} },
|
|
39
39
|
source: { mainEntryName: 'main' },
|
|
40
|
-
});
|
|
40
|
+
}${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
|
|
41
41
|
`;
|
|
42
42
|
}
|
|
43
43
|
const emitsUi = appEmitsBrowserUi(app);
|
|
@@ -59,7 +59,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
|
|
|
59
59
|
const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
|
|
60
60
|
const renderer = resolveWorkspaceRenderer(app);
|
|
61
61
|
const generationProfile = resolveAppGenerationProfile(app);
|
|
62
|
-
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
|
|
62
|
+
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
|
|
63
63
|
return {
|
|
64
64
|
...appHasApi(app) || 'shell' === app.kind && 'react' === renderer ? {
|
|
65
65
|
'@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
|
|
@@ -85,8 +85,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
85
85
|
...additionalShells,
|
|
86
86
|
...remotes
|
|
87
87
|
];
|
|
88
|
+
const workerApps = apps.filter((app)=>resolveAppGenerationProfile(app)?.capabilities.workers);
|
|
89
|
+
const workerFilters = workerApps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ');
|
|
88
90
|
if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
|
|
89
|
-
const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
91
|
+
const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
90
92
|
return {
|
|
91
93
|
private: true,
|
|
92
94
|
name: scope,
|
|
@@ -101,6 +103,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
101
103
|
dev: `pnpm --parallel ${apps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ')} dev`,
|
|
102
104
|
'dev:shell': `pnpm --filter ${packageName(scope, primaryShell.packageSuffix)} dev`,
|
|
103
105
|
build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
|
|
106
|
+
...workerApps.length > 0 ? {
|
|
107
|
+
'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
|
|
108
|
+
'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
|
|
109
|
+
'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
|
|
110
|
+
} : {},
|
|
104
111
|
typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
|
|
105
112
|
'contract:check': 'ultramodern-create ultramodern validate',
|
|
106
113
|
check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',
|
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
const patch_inventory = [
|
|
2
|
+
{
|
|
3
|
+
packageName: '@tanstack/router-core',
|
|
4
|
+
version: '1.171.34',
|
|
5
|
+
path: 'patches/@tanstack__router-core@1.171.34.patch',
|
|
6
|
+
sha256: '0e526bc0a1fd038c459fbf45b2b62da81f7f2516176b585f41fed7098ac4abbb',
|
|
7
|
+
repository: true,
|
|
8
|
+
workspace: null,
|
|
9
|
+
reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, including public types and emitted CJS/ESM source maps. Applies only to the accepted Octane router-core 1.171.34 closure during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
packageName: '@tanstack/router-core',
|
|
13
|
+
version: '1.171.37',
|
|
14
|
+
path: 'patches/@tanstack__router-core@1.171.37.patch',
|
|
15
|
+
sha256: '6ffa70914ed338f3cb56d3cd1f526e35286e09f287ecf48ee6dbc1aa18305458',
|
|
16
|
+
repository: true,
|
|
17
|
+
workspace: null,
|
|
18
|
+
reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, preserving current location caching and SSR rewrite behavior, public types and emitted CJS/ESM source maps. Applies only to Modern router-core 1.171.37 during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
|
|
19
|
+
},
|
|
2
20
|
{
|
|
3
21
|
packageName: 'ultracite',
|
|
4
|
-
version: '
|
|
5
|
-
path: 'patches/ultracite@
|
|
22
|
+
version: '8.0.1',
|
|
23
|
+
path: 'patches/ultracite@8.0.1.patch',
|
|
6
24
|
sha256: 'a18b2c7be68a6823a793f0def8ce13d7655c67c56c2200978a2be600cb29ba74',
|
|
7
25
|
repository: false,
|
|
8
26
|
workspace: null,
|
|
@@ -56,7 +56,7 @@ function parseNpmAlias(value) {
|
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
function isForeignRendererPackage(name, renderer) {
|
|
59
|
-
const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') ||
|
|
59
|
+
const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') || name.startsWith('@modern-js/i18n-runtime-extensions/') || '@modern-js/plugin-runtime' === name || name.startsWith('@modern-js/plugin-runtime/');
|
|
60
60
|
if (react) return 'react' !== renderer;
|
|
61
61
|
const owner = specifierRenderer(name);
|
|
62
62
|
return void 0 !== owner && 'react' !== owner && owner !== renderer;
|
|
@@ -156,7 +156,7 @@ function assertAuthoredRendererDependencyPins(manifest, generation, options = {}
|
|
|
156
156
|
for (const [name, version] of Object.entries({
|
|
157
157
|
...generation.dependencies,
|
|
158
158
|
...generation.devDependencies
|
|
159
|
-
}))if (isForeignRendererPackage(name, 'none')) pins[name] = version;
|
|
159
|
+
}))if (name === profile.compiler.name || name === profile.router.coreName || isForeignRendererPackage(name, 'none')) pins[name] = version;
|
|
160
160
|
for (const group of [
|
|
161
161
|
'dependencies',
|
|
162
162
|
'devDependencies',
|
|
@@ -245,7 +245,7 @@ function assertNativeRendererSourceSurface(root, app, generation, manifest) {
|
|
|
245
245
|
])assert(!node_fs.existsSync(node_path.join(appRoot, relative)), `${app.id} native renderer contains unsupported artifact ${relative}`);
|
|
246
246
|
const tsconfig = JSON.parse(node_fs.readFileSync(node_path.join(appRoot, 'tsconfig.json'), 'utf8'));
|
|
247
247
|
assert(tsconfig.compilerOptions?.jsxImportSource === generation.jsxImportSource && tsconfig.compilerOptions?.jsx === 'preserve', `${app.id} JSX compiler configuration disagrees with the selected renderer`);
|
|
248
|
-
for (const script of Object.values(manifest.scripts ?? {}))assert('string' == typeof script && !/
|
|
248
|
+
for (const script of Object.values(manifest.scripts ?? {}))assert('string' == typeof script && !/i18n/iu.test(script) && (generation.capabilities.workers || !/wrangler/iu.test(script)) && (generation.capabilities.federation || !/module-federation/iu.test(script)), `${app.id} native renderer scripts claim an unsupported capability`);
|
|
249
249
|
}
|
|
250
250
|
function validateApiOnlySourceSurface(root, app) {
|
|
251
251
|
assert(!Object.hasOwn(app.backendFederation?.versionBoundary ?? {}, 'ui'), `topology/reference-topology.json verticals.${app.id}.backendFederation must omit the UI boundary for an api-only unit`);
|
|
@@ -164,7 +164,7 @@ function validateWorkspace(root, expected) {
|
|
|
164
164
|
requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
|
|
165
165
|
if (input.emitsUi && !nativeRenderer) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
|
|
166
166
|
requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
|
|
167
|
-
if (!nativeRenderer) {
|
|
167
|
+
if (!nativeRenderer || generation.capabilities.workers) {
|
|
168
168
|
const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
|
|
169
169
|
for (const field of [
|
|
170
170
|
'workerName',
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
const TANSTACK_ROUTER_VERSION = '1.170.
|
|
2
|
-
const TANSTACK_ROUTER_CORE_VERSION = '1.171.
|
|
3
|
-
const TANSTACK_HISTORY_VERSION = '1.162.
|
|
1
|
+
const TANSTACK_ROUTER_VERSION = '1.170.44';
|
|
2
|
+
const TANSTACK_ROUTER_CORE_VERSION = '1.171.37';
|
|
3
|
+
const TANSTACK_HISTORY_VERSION = '1.162.5';
|
|
4
4
|
const MODULE_FEDERATION_VERSION = '2.9.2';
|
|
5
5
|
const MODULE_FEDERATION_BRIDGE_REACT_FORK_VERSION = '2.9.3';
|
|
6
6
|
const MODULE_FEDERATION_RUNTIME_FORK_VERSION = '2.9.3';
|
|
7
7
|
const MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION = '2.9.4';
|
|
8
|
-
const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.
|
|
9
|
-
const ZEPHYR_AGENT_VERSION = '1.
|
|
10
|
-
const WRANGLER_VERSION = '4.
|
|
8
|
+
const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.6.0';
|
|
9
|
+
const ZEPHYR_AGENT_VERSION = '1.6.0';
|
|
10
|
+
const WRANGLER_VERSION = '4.151.0';
|
|
11
11
|
const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
|
|
12
12
|
const TAILWIND_VERSION = '4.3.3';
|
|
13
13
|
const RSBUILD_PLUGIN_TAILWINDCSS_VERSION = '2.0.3';
|
|
14
|
-
const EFFECT_VERSION = '4.0.
|
|
15
|
-
const EFFECT_TSGO_VERSION = '0.53.
|
|
14
|
+
const EFFECT_VERSION = '4.0.5';
|
|
15
|
+
const EFFECT_TSGO_VERSION = '0.53.1';
|
|
16
16
|
const TYPESCRIPT_STABLE_VERSION = '7.0.2';
|
|
17
17
|
const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
|
|
18
|
-
const OXLINT_VERSION = '1.
|
|
19
|
-
const OXFMT_VERSION = '0.
|
|
20
|
-
const ULTRACITE_VERSION = '
|
|
21
|
-
const LEFTHOOK_VERSION = '2.
|
|
22
|
-
const I18NEXT_VERSION = '26.4.
|
|
18
|
+
const OXLINT_VERSION = '1.88.0';
|
|
19
|
+
const OXFMT_VERSION = '0.73.0';
|
|
20
|
+
const ULTRACITE_VERSION = '8.0.1';
|
|
21
|
+
const LEFTHOOK_VERSION = '2.2.2';
|
|
22
|
+
const I18NEXT_VERSION = '26.4.6';
|
|
23
23
|
const MODULE_FEDERATION_NODE_VERSION = '2.7.52';
|
|
24
|
-
const MINIFLARE_VERSION = '5.
|
|
25
|
-
const WORKERD_VERSION = '1.
|
|
26
|
-
const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.
|
|
24
|
+
const MINIFLARE_VERSION = '5.20261012.0-beta';
|
|
25
|
+
const WORKERD_VERSION = '1.20261015.1';
|
|
26
|
+
const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20261015.1';
|
|
27
27
|
const NODE_FETCH_VERSION = '3.3.2';
|
|
28
|
-
const REACT_VERSION = '19.3.
|
|
29
|
-
const REACT_DOM_VERSION = '19.3.
|
|
30
|
-
const TYPES_NODE_VERSION = '26.6.
|
|
28
|
+
const REACT_VERSION = '19.3.1';
|
|
29
|
+
const REACT_DOM_VERSION = '19.3.1';
|
|
30
|
+
const TYPES_NODE_VERSION = '26.6.5';
|
|
31
31
|
const TYPES_REACT_VERSION = '19.3.0';
|
|
32
32
|
const TYPES_REACT_DOM_VERSION = '19.3.0';
|
|
33
|
-
const NODE_VERSION = '26.
|
|
34
|
-
const PNPM_VERSION = '12.
|
|
33
|
+
const NODE_VERSION = '26.12.0';
|
|
34
|
+
const PNPM_VERSION = '12.11.2';
|
|
35
35
|
const BRACES_FORK_VERSION = '3.0.4';
|
|
36
36
|
const SHARP_VERSION = '0.35.5';
|
|
37
37
|
const ULTRAMODERN_PACKAGE_PINS = {
|
|
@@ -89,6 +89,11 @@ function createWorkspaceAppPackageScripts(app) {
|
|
|
89
89
|
dev: 'ultramodern dev',
|
|
90
90
|
build: 'ultramodern build',
|
|
91
91
|
serve: 'ultramodern serve',
|
|
92
|
+
...resolveAppGenerationProfile(app)?.capabilities.workers ? {
|
|
93
|
+
'cloudflare:build': 'ultramodern build --deploy-target cloudflare && ultramodern deploy --skip-build --deploy-target cloudflare',
|
|
94
|
+
'cloudflare:deploy': 'pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
|
|
95
|
+
'cloudflare:preview': `pnpm run cloudflare:build && wrangler dev --port ${app.port} --config .output/wrangler.json`
|
|
96
|
+
} : {},
|
|
92
97
|
typecheck: resolveAppGenerationProfile(app)?.typecheckCommand ?? createStrictTsgoTypecheckCommand(app.directory)
|
|
93
98
|
};
|
|
94
99
|
const plan = createWorkspaceAppScriptPlan(app);
|
|
@@ -5,7 +5,7 @@ import { verticalsFromTopology } from "../../ultramodern-workspace/add-vertical/
|
|
|
5
5
|
import { createNeutralOwnership, shellApp } from "../../ultramodern-workspace/descriptors.js";
|
|
6
6
|
import { readModuleFederationExposePaths } from "../../ultramodern-workspace/mf-validation.js";
|
|
7
7
|
import { toEnvSegment } from "../../ultramodern-workspace/naming.js";
|
|
8
|
-
import {
|
|
8
|
+
import { getRendererGenerationProfile } from "../../ultramodern-workspace/renderer-profile.js";
|
|
9
9
|
import { readJsonObject } from "./json.js";
|
|
10
10
|
import { packageScopeFromRoot, readWorkspacePackageSource } from "./metadata.js";
|
|
11
11
|
function normalizeWorkspaceInputs(workspaceRoot, inputs) {
|
|
@@ -119,7 +119,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
|
|
|
119
119
|
rendererProfile: app.rendererProfile,
|
|
120
120
|
routerBindings: app.routerBindings,
|
|
121
121
|
rendererCapabilities: app.rendererCapabilities,
|
|
122
|
-
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !
|
|
122
|
+
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !getRendererGenerationProfile(app.renderer).capabilities.federation) ? {} : {
|
|
123
123
|
moduleFederation: {
|
|
124
124
|
role: 'shell' === app.kind ? 'host' : 'remote',
|
|
125
125
|
name: app.mfName,
|
|
@@ -9,12 +9,12 @@ function createAppModernConfig(app, enableTailwind = true) {
|
|
|
9
9
|
const renderer = resolveWorkspaceRenderer(app);
|
|
10
10
|
if (hasNativeAppGeneration(renderer)) {
|
|
11
11
|
const generation = resolveAppGenerationProfile(app);
|
|
12
|
-
const
|
|
13
|
-
return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
|
|
14
|
-
${
|
|
12
|
+
const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
|
|
13
|
+
return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
|
|
14
|
+
${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
|
|
15
15
|
${appHasApi(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
|
|
16
16
|
${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
|
|
17
|
-
${
|
|
17
|
+
${authoredAssetPrefix ? `// Set ${createCloudflarePublicUrlEnv(app)} to this remote's public origin when deploying.
|
|
18
18
|
const remoteAddress = createRemoteManifestUrl({
|
|
19
19
|
manifestEnv: ${JSON.stringify(createRemoteManifestEnv(app))},
|
|
20
20
|
publicUrlEnv: ${JSON.stringify(createCloudflarePublicUrlEnv(app))},
|
|
@@ -24,10 +24,10 @@ const remoteAddress = createRemoteManifestUrl({
|
|
|
24
24
|
const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
|
|
25
25
|
|
|
26
26
|
` : ''}
|
|
27
|
-
export default defineConfig({
|
|
27
|
+
export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
|
|
28
28
|
${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
|
|
29
29
|
${appHasApi(app) ? ' plugins: [bffPlugin()],\n' : ''}
|
|
30
|
-
${
|
|
30
|
+
${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
|
|
31
31
|
server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${appHasApi(app) ? `,
|
|
32
32
|
bff: {
|
|
33
33
|
effect: {
|
|
@@ -38,7 +38,7 @@ ${'rest' === resolveApiProtocol(app) ? " openapi: { path: '/openapi.json'
|
|
|
38
38
|
runtimeFramework: 'effect',
|
|
39
39
|
}` : ''} },
|
|
40
40
|
source: { mainEntryName: 'main' },
|
|
41
|
-
});
|
|
41
|
+
}${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
|
|
42
42
|
`;
|
|
43
43
|
}
|
|
44
44
|
const emitsUi = appEmitsBrowserUi(app);
|
|
@@ -60,7 +60,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
|
|
|
60
60
|
const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
|
|
61
61
|
const renderer = resolveWorkspaceRenderer(app);
|
|
62
62
|
const generationProfile = resolveAppGenerationProfile(app);
|
|
63
|
-
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
|
|
63
|
+
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
|
|
64
64
|
return {
|
|
65
65
|
...appHasApi(app) || 'shell' === app.kind && 'react' === renderer ? {
|
|
66
66
|
'@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
|
|
@@ -86,8 +86,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
86
86
|
...additionalShells,
|
|
87
87
|
...remotes
|
|
88
88
|
];
|
|
89
|
+
const workerApps = apps.filter((app)=>resolveAppGenerationProfile(app)?.capabilities.workers);
|
|
90
|
+
const workerFilters = workerApps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ');
|
|
89
91
|
if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
|
|
90
|
-
const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
92
|
+
const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
91
93
|
return {
|
|
92
94
|
private: true,
|
|
93
95
|
name: scope,
|
|
@@ -102,6 +104,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
102
104
|
dev: `pnpm --parallel ${apps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ')} dev`,
|
|
103
105
|
'dev:shell': `pnpm --filter ${packageName(scope, primaryShell.packageSuffix)} dev`,
|
|
104
106
|
build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
|
|
107
|
+
...workerApps.length > 0 ? {
|
|
108
|
+
'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
|
|
109
|
+
'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
|
|
110
|
+
'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
|
|
111
|
+
} : {},
|
|
105
112
|
typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
|
|
106
113
|
'contract:check': 'ultramodern-create ultramodern validate',
|
|
107
114
|
check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',
|