@bleedingdev/modern-js-create 3.2.0-ultramodern.12 → 3.2.0-ultramodern.121

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.
Files changed (165) hide show
  1. package/README.md +167 -72
  2. package/bin/run.js +0 -0
  3. package/dist/cjs/create-package-root.cjs +63 -0
  4. package/dist/cjs/index.cjs +528 -0
  5. package/dist/cjs/locale/en.cjs +93 -0
  6. package/dist/cjs/locale/index.cjs +50 -0
  7. package/dist/cjs/locale/zh.cjs +93 -0
  8. package/dist/cjs/ultramodern-package-source.cjs +135 -0
  9. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +337 -0
  10. package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
  11. package/dist/cjs/ultramodern-workspace/contracts.cjs +836 -0
  12. package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
  13. package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
  14. package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
  15. package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
  16. package/dist/cjs/ultramodern-workspace/index.cjs +48 -0
  17. package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
  18. package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
  19. package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
  20. package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
  21. package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
  22. package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
  23. package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
  24. package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
  25. package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
  26. package/dist/cjs/ultramodern-workspace/versions.cjs +153 -0
  27. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +153 -0
  28. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +175 -0
  29. package/dist/esm/create-package-root.js +14 -0
  30. package/dist/esm/index.js +491 -0
  31. package/dist/esm/locale/en.js +55 -0
  32. package/dist/esm/locale/index.js +9 -0
  33. package/dist/esm/locale/zh.js +55 -0
  34. package/dist/esm/ultramodern-package-source.js +63 -0
  35. package/dist/esm/ultramodern-workspace/add-vertical.js +252 -0
  36. package/dist/esm/ultramodern-workspace/app-files.js +149 -0
  37. package/dist/esm/ultramodern-workspace/contracts.js +741 -0
  38. package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
  39. package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
  40. package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
  41. package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
  42. package/dist/esm/ultramodern-workspace/index.js +3 -0
  43. package/dist/esm/ultramodern-workspace/locales.js +122 -0
  44. package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
  45. package/dist/esm/ultramodern-workspace/naming.js +71 -0
  46. package/dist/esm/ultramodern-workspace/package-json.js +338 -0
  47. package/dist/esm/ultramodern-workspace/package-source.js +21 -0
  48. package/dist/esm/ultramodern-workspace/policy.js +183 -0
  49. package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
  50. package/dist/esm/ultramodern-workspace/routes.js +280 -0
  51. package/dist/esm/ultramodern-workspace/types.js +16 -0
  52. package/dist/esm/ultramodern-workspace/versions.js +34 -0
  53. package/dist/esm/ultramodern-workspace/workspace-scripts.js +91 -0
  54. package/dist/esm/ultramodern-workspace/write-workspace.js +121 -0
  55. package/dist/esm-node/create-package-root.js +15 -0
  56. package/dist/esm-node/index.js +492 -0
  57. package/dist/esm-node/locale/en.js +56 -0
  58. package/dist/esm-node/locale/index.js +10 -0
  59. package/dist/esm-node/locale/zh.js +56 -0
  60. package/dist/esm-node/ultramodern-package-source.js +64 -0
  61. package/dist/esm-node/ultramodern-workspace/add-vertical.js +253 -0
  62. package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
  63. package/dist/esm-node/ultramodern-workspace/contracts.js +742 -0
  64. package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
  65. package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
  66. package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
  67. package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
  68. package/dist/esm-node/ultramodern-workspace/index.js +4 -0
  69. package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
  70. package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
  71. package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
  72. package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
  73. package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
  74. package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
  75. package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
  76. package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
  77. package/dist/esm-node/ultramodern-workspace/types.js +17 -0
  78. package/dist/esm-node/ultramodern-workspace/versions.js +35 -0
  79. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -0
  80. package/dist/esm-node/ultramodern-workspace/write-workspace.js +122 -0
  81. package/dist/types/create-package-root.d.ts +1 -0
  82. package/dist/types/locale/en.d.ts +8 -9
  83. package/dist/types/locale/index.d.ts +109 -2
  84. package/dist/types/locale/zh.d.ts +8 -9
  85. package/dist/types/ultramodern-package-source.d.ts +28 -0
  86. package/dist/types/ultramodern-workspace/add-vertical.d.ts +19 -0
  87. package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
  88. package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
  89. package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
  90. package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
  91. package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
  92. package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
  93. package/dist/types/ultramodern-workspace/index.d.ts +4 -0
  94. package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
  95. package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
  96. package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
  97. package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
  98. package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
  99. package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
  100. package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
  101. package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
  102. package/dist/types/ultramodern-workspace/types.d.ts +95 -0
  103. package/dist/types/ultramodern-workspace/versions.d.ts +38 -0
  104. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
  105. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
  106. package/package.json +34 -15
  107. package/template-workspace/.agents/agent-reference-repos.json +24 -0
  108. package/template-workspace/.agents/skills-lock.json +19 -0
  109. package/template-workspace/.codex/hooks.json +16 -0
  110. package/template-workspace/.github/renovate.json +29 -0
  111. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +67 -0
  112. package/template-workspace/.gitignore.handlebars +5 -0
  113. package/template-workspace/.mise.toml.handlebars +3 -0
  114. package/template-workspace/AGENTS.md.handlebars +87 -0
  115. package/template-workspace/README.md.handlebars +132 -11
  116. package/template-workspace/lefthook.yml +24 -0
  117. package/template-workspace/oxfmt.config.ts +1 -0
  118. package/template-workspace/oxlint.config.ts +1 -0
  119. package/template-workspace/pnpm-workspace.yaml.handlebars +40 -0
  120. package/template-workspace/scripts/bootstrap-agent-skills.mjs +184 -21
  121. package/template-workspace/scripts/setup-agent-reference-repos.mjs +370 -0
  122. package/templates/app/shell-frame.tsx +49 -0
  123. package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
  124. package/templates/packages/shared-contracts-index.ts +466 -0
  125. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
  126. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
  127. package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
  128. package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
  129. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
  130. package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
  131. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
  132. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +593 -0
  133. package/dist/index.js +0 -2626
  134. package/dist/types/ultramodern-workspace.d.ts +0 -20
  135. package/template/.agents/skills-lock.json +0 -34
  136. package/template/.browserslistrc +0 -4
  137. package/template/.github/workflows/ultramodern-gates.yml.handlebars +0 -30
  138. package/template/.gitignore.handlebars +0 -30
  139. package/template/.nvmrc +0 -2
  140. package/template/AGENTS.md +0 -25
  141. package/template/README.md +0 -79
  142. package/template/api/effect/index.ts.handlebars +0 -23
  143. package/template/api/lambda/hello.ts.handlebars +0 -6
  144. package/template/config/public/locales/cs/translation.json +0 -39
  145. package/template/config/public/locales/en/translation.json +0 -39
  146. package/template/modern.config.ts.handlebars +0 -53
  147. package/template/oxfmt.config.ts +0 -8
  148. package/template/oxlint.config.ts +0 -12
  149. package/template/package.json.handlebars +0 -67
  150. package/template/postcss.config.mjs.handlebars +0 -6
  151. package/template/scripts/bootstrap-agent-skills.mjs +0 -95
  152. package/template/scripts/check-i18n-strings.mjs +0 -83
  153. package/template/scripts/validate-ultramodern.mjs.handlebars +0 -178
  154. package/template/shared/effect/api.ts.handlebars +0 -17
  155. package/template/src/modern-app-env.d.ts +0 -1
  156. package/template/src/modern.runtime.ts.handlebars +0 -23
  157. package/template/src/routes/index.css.handlebars +0 -129
  158. package/template/src/routes/layout.tsx.handlebars +0 -9
  159. package/template/src/routes/page.tsx.handlebars +0 -155
  160. package/template/tailwind.config.ts.handlebars +0 -10
  161. package/template/tsconfig.json +0 -120
  162. package/template-workspace/AGENTS.md +0 -50
  163. package/template-workspace/pnpm-workspace.yaml +0 -17
  164. package/template-workspace/scripts/check-i18n-strings.mjs +0 -83
  165. package/template-workspace/scripts/validate-ultramodern-workspace.mjs.handlebars +0 -433
@@ -0,0 +1,72 @@
1
+ import "node:module";
2
+ import node_path from "node:path";
3
+ const TAILWIND_PREFIX_DIGIT_WORDS = [
4
+ 'zero',
5
+ 'one',
6
+ 'two',
7
+ 'three',
8
+ 'four',
9
+ 'five',
10
+ 'six',
11
+ 'seven',
12
+ 'eight',
13
+ 'nine'
14
+ ];
15
+ function normalizePath(filePath) {
16
+ return filePath.split(node_path.sep).join('/');
17
+ }
18
+ function toPackageScope(packageName) {
19
+ const normalized = packageName.replace(/^@/, '').replace(/[\\/]+/g, '-').toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^[._-]+|[._-]+$/g, '').replace(/-{2,}/g, '-');
20
+ return normalized || 'ultramodern-superapp';
21
+ }
22
+ function toKebabCase(value) {
23
+ const normalized = value.trim().replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/[._]+/g, '-').toLowerCase().replace(/-+/g, '-').replace(/^-+|-+$/g, '');
24
+ return normalized;
25
+ }
26
+ function toCamelCase(value) {
27
+ const pascal = toPascalCase(value);
28
+ return `${pascal.charAt(0).toLowerCase()}${pascal.slice(1)}`;
29
+ }
30
+ function toEnvSegment(value) {
31
+ return toKebabCase(value).replace(/-/g, '_').toUpperCase();
32
+ }
33
+ function createRspackUniqueName(app) {
34
+ return app.mfName;
35
+ }
36
+ function createRspackChunkLoadingGlobal(app) {
37
+ return `__ULTRAMODERN_${toEnvSegment(app.mfName)}_LOADED_CHUNKS__`;
38
+ }
39
+ function naming_packageName(scope, suffix) {
40
+ return `@${scope}/${suffix}`;
41
+ }
42
+ function relativeRootFor(packageDir) {
43
+ return normalizePath(node_path.relative(packageDir, '.') || '.');
44
+ }
45
+ function createTailwindPrefix(raw) {
46
+ const normalized = raw.toLowerCase().replace(/[^a-z0-9]/gu, '');
47
+ if (!normalized) throw new Error(`Cannot derive a Tailwind prefix from ${raw}`);
48
+ return normalized.replace(/[0-9]/gu, (digit)=>TAILWIND_PREFIX_DIGIT_WORDS[Number(digit)]);
49
+ }
50
+ function tailwindPrefixForApp(app) {
51
+ if ('shell' === app.kind) return 'shell';
52
+ return createTailwindPrefix(app.domain ?? app.id);
53
+ }
54
+ function assertUniqueTailwindPrefixes(apps) {
55
+ const seen = new Map();
56
+ const entries = apps.map((app)=>[
57
+ app.id,
58
+ tailwindPrefixForApp(app)
59
+ ]);
60
+ for (const [id, prefix] of entries){
61
+ const previous = seen.get(prefix);
62
+ if (previous) throw new Error(`Tailwind prefix ${prefix} for ${id} collides with ${previous}`);
63
+ seen.set(prefix, id);
64
+ }
65
+ }
66
+ function createTw(prefix) {
67
+ return (classList)=>classList.split(/\s+/u).filter(Boolean).map((candidate)=>`${prefix}:${candidate.replace(/\[&&\]:/gu, '')}`).join(' ');
68
+ }
69
+ function toPascalCase(value) {
70
+ return value.split(/[-_]+/).filter(Boolean).map((part)=>`${part.charAt(0).toUpperCase()}${part.slice(1)}`).join('');
71
+ }
72
+ export { TAILWIND_PREFIX_DIGIT_WORDS, assertUniqueTailwindPrefixes, createRspackChunkLoadingGlobal, createRspackUniqueName, createTailwindPrefix, createTw, naming_packageName as packageName, normalizePath, relativeRootFor, tailwindPrefixForApp, toCamelCase, toEnvSegment, toKebabCase, toPackageScope, toPascalCase };
@@ -0,0 +1,339 @@
1
+ import "node:module";
2
+ import { WORKSPACE_PACKAGE_VERSION, modernPackageSpecifier } from "../ultramodern-package-source.js";
3
+ import { appHasEffectApi, remoteDependencyAlias, resolveRemoteRefs, shellApp, verticalEffectApps, zephyrRemoteDependency } from "./descriptors.js";
4
+ import { readFileTemplate } from "./fs-io.js";
5
+ import { packageName, relativeRootFor } from "./naming.js";
6
+ import { createPublicSurfaceGenerationCommand } from "./public-surface.js";
7
+ import { EFFECT_TSGO_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, POSTCSS_VERSION, REACT_DOM_VERSION, REACT_ROUTER_DOM_VERSION, REACT_VERSION, TAILWIND_POSTCSS_VERSION, TAILWIND_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION } from "./versions.js";
8
+ const effectTsgoTypecheckCommand = "node -e \"const fs = require('node:fs'); const { execFileSync, spawnSync } = require('node:child_process'); const bin = execFileSync('effect-tsgo', ['get-exe-path'], { encoding: 'utf8' }).trim(); if (process.platform !== 'win32') fs.chmodSync(bin, 0o755); const result = spawnSync(bin, ['--noEmit', '-p', 'tsconfig.json'], { stdio: 'inherit' }); process.exit(result.status ?? 1);\"";
9
+ const effectDiagnostics = [
10
+ 'anyUnknownInErrorContext',
11
+ 'classSelfMismatch',
12
+ 'duplicatePackage',
13
+ 'effectFnImplicitAny',
14
+ 'floatingEffect',
15
+ 'genericEffectServices',
16
+ 'missingEffectContext',
17
+ 'missingEffectError',
18
+ 'missingLayerContext',
19
+ 'missingReturnYieldStar',
20
+ 'missingStarInYieldEffectGen',
21
+ 'nonObjectEffectServiceType',
22
+ 'outdatedApi',
23
+ 'overriddenSchemaConstructor',
24
+ 'catchUnfailableEffect',
25
+ 'effectFnIife',
26
+ 'effectGenUsesAdapter',
27
+ 'effectInFailure',
28
+ 'effectInVoidSuccess',
29
+ 'globalErrorInEffectCatch',
30
+ 'globalErrorInEffectFailure',
31
+ 'layerMergeAllWithDependencies',
32
+ 'lazyPromiseInEffectSync',
33
+ 'leakingRequirements',
34
+ 'multipleEffectProvide',
35
+ 'returnEffectInGen',
36
+ 'runEffectInsideEffect',
37
+ 'schemaSyncInEffect',
38
+ 'scopeInLayerEffect',
39
+ 'strictEffectProvide',
40
+ 'tryCatchInEffectGen',
41
+ 'unknownInEffectCatch',
42
+ 'asyncFunction',
43
+ 'cryptoRandomUUID',
44
+ 'cryptoRandomUUIDInEffect',
45
+ 'extendsNativeError',
46
+ 'globalConsole',
47
+ 'globalConsoleInEffect',
48
+ 'globalDate',
49
+ 'globalDateInEffect',
50
+ 'globalFetch',
51
+ 'globalFetchInEffect',
52
+ 'globalRandom',
53
+ 'globalRandomInEffect',
54
+ 'globalTimers',
55
+ 'globalTimersInEffect',
56
+ 'instanceOfSchema',
57
+ 'newPromise',
58
+ 'nodeBuiltinImport',
59
+ 'preferSchemaOverJson',
60
+ 'processEnv',
61
+ 'processEnvInEffect',
62
+ 'unsafeEffectTypeAssertion',
63
+ 'catchAllToMapError',
64
+ 'deterministicKeys',
65
+ 'effectDoNotation',
66
+ 'effectFnOpportunity',
67
+ 'effectMapFlatten',
68
+ 'effectMapVoid',
69
+ 'effectSucceedWithVoid',
70
+ 'missedPipeableOpportunity',
71
+ 'missingEffectServiceDependency',
72
+ 'nestedEffectGenYield',
73
+ 'redundantSchemaTagIdentifier',
74
+ 'schemaStructWithTag',
75
+ 'schemaUnionOfLiterals',
76
+ 'serviceNotAsClass',
77
+ 'strictBooleanExpressions',
78
+ 'unnecessaryArrowBlock',
79
+ 'unnecessaryEffectGen',
80
+ 'unnecessaryFailYieldableError',
81
+ 'unnecessaryPipe',
82
+ 'unnecessaryPipeChain'
83
+ ];
84
+ function appDependencies(scope, packageSource, app, remotes = []) {
85
+ const dependencies = {
86
+ '@modern-js/plugin-tanstack': modernPackageSpecifier('@modern-js/plugin-tanstack', packageSource),
87
+ '@modern-js/plugin-i18n': modernPackageSpecifier('@modern-js/plugin-i18n', packageSource),
88
+ '@modern-js/runtime': modernPackageSpecifier('@modern-js/runtime', packageSource),
89
+ '@module-federation/bridge-react': MODULE_FEDERATION_VERSION,
90
+ '@module-federation/modern-js-v3': MODULE_FEDERATION_VERSION,
91
+ '@module-federation/runtime': MODULE_FEDERATION_VERSION,
92
+ '@tanstack/react-router': TANSTACK_ROUTER_VERSION,
93
+ i18next: I18NEXT_VERSION,
94
+ 'node-fetch': NODE_FETCH_VERSION,
95
+ [packageName(scope, 'shared-contracts')]: WORKSPACE_PACKAGE_VERSION,
96
+ [packageName(scope, 'shared-design-tokens')]: WORKSPACE_PACKAGE_VERSION,
97
+ react: REACT_VERSION,
98
+ 'react-dom': REACT_DOM_VERSION,
99
+ 'react-router-dom': REACT_ROUTER_DOM_VERSION
100
+ };
101
+ if ('shell' === app.kind) {
102
+ dependencies['@modern-js/plugin-bff'] = modernPackageSpecifier('@modern-js/plugin-bff', packageSource);
103
+ for (const remote of verticalEffectApps(remotes))dependencies[packageName(scope, remote.packageSuffix)] = WORKSPACE_PACKAGE_VERSION;
104
+ }
105
+ for (const remote of resolveRemoteRefs(app, remotes))dependencies[packageName(scope, remote.packageSuffix)] = WORKSPACE_PACKAGE_VERSION;
106
+ if (appHasEffectApi(app)) dependencies['@modern-js/plugin-bff'] = modernPackageSpecifier('@modern-js/plugin-bff', packageSource);
107
+ return dependencies;
108
+ }
109
+ function appDevDependencies(packageSource, enableTailwind) {
110
+ return {
111
+ '@modern-js/app-tools': modernPackageSpecifier('@modern-js/app-tools', packageSource),
112
+ '@effect/tsgo': EFFECT_TSGO_VERSION,
113
+ ...enableTailwind ? {
114
+ '@tailwindcss/postcss': `^${TAILWIND_POSTCSS_VERSION}`,
115
+ postcss: `^${POSTCSS_VERSION}`,
116
+ tailwindcss: `^${TAILWIND_VERSION}`
117
+ } : {},
118
+ "@typescript/native-preview": TYPESCRIPT_NATIVE_PREVIEW_VERSION,
119
+ '@types/node': '^20',
120
+ '@types/react': TYPES_REACT_VERSION,
121
+ '@types/react-dom': TYPES_REACT_DOM_VERSION,
122
+ typescript: TYPESCRIPT_VERSION,
123
+ 'zephyr-rspack-plugin': ZEPHYR_RSPACK_PLUGIN_VERSION,
124
+ wrangler: WRANGLER_VERSION
125
+ };
126
+ }
127
+ function createRootPackageJson(scope, packageSource, remotes = []) {
128
+ const shellFilter = `--filter ${packageName(scope, shellApp.packageSuffix)}`;
129
+ const remoteFilters = remotes.map((remote)=>`--filter ${packageName(scope, remote.packageSuffix)}`);
130
+ const remoteBuildPrefix = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ' : '';
131
+ const remoteCloudflareBuildPrefix = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && ' : '';
132
+ const remoteCloudflareDeployPrefix = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:deploy && ' : '';
133
+ return {
134
+ private: true,
135
+ name: scope,
136
+ version: '0.1.0',
137
+ type: 'module',
138
+ packageManager: `pnpm@${PNPM_VERSION}`,
139
+ scripts: {
140
+ dev: `pnpm --parallel ${[
141
+ shellFilter,
142
+ ...remoteFilters
143
+ ].join(' ')} dev`,
144
+ 'dev:shell': `pnpm --filter ${packageName(scope, shellApp.packageSuffix)} dev`,
145
+ ...Object.fromEntries(remotes.map((remote)=>[
146
+ `dev:${remote.packageSuffix}`,
147
+ `pnpm --filter ${packageName(scope, remote.packageSuffix)} dev`
148
+ ])),
149
+ build: `${remoteBuildPrefix}ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types && pnpm performance:readiness`,
150
+ format: "oxfmt . '!repos/**'",
151
+ 'format:check': "oxfmt --check . '!repos/**'",
152
+ lint: 'oxlint apps verticals packages',
153
+ 'lint:fix': 'oxlint apps verticals packages --fix',
154
+ typecheck: `pnpm -r --filter "@${scope}/*" typecheck`,
155
+ 'cloudflare:build': `${remoteCloudflareBuildPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types`,
156
+ 'cloudflare:deploy': `${remoteCloudflareDeployPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:deploy`,
157
+ 'cloudflare:proof': "node ./scripts/proof-cloudflare-version.mjs --out .codex/reports/cloudflare-version-proof/public-url-proof.json",
158
+ 'skills:install': "node ./scripts/bootstrap-agent-skills.mjs",
159
+ 'skills:check': "node ./scripts/bootstrap-agent-skills.mjs --check",
160
+ 'agents:refs:install': "node ./scripts/setup-agent-reference-repos.mjs",
161
+ 'agents:refs:check': "node ./scripts/setup-agent-reference-repos.mjs --check",
162
+ 'mf:types': "node ./scripts/assert-mf-types.mjs",
163
+ 'performance:readiness': "node ./scripts/ultramodern-performance-readiness.mjs",
164
+ 'contract:check': "node ./scripts/validate-ultramodern-workspace.mjs",
165
+ 'i18n:boundaries': "node ./scripts/check-ultramodern-i18n-boundaries.mjs",
166
+ postinstall: "oxfmt . '!repos/**' && node ./scripts/bootstrap-agent-skills.mjs --postinstall",
167
+ check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm skills:check && pnpm i18n:boundaries && pnpm contract:check && pnpm performance:readiness'
168
+ },
169
+ engines: {
170
+ node: '>=26',
171
+ pnpm: `>=${PNPM_VERSION} <11.6.0`
172
+ },
173
+ workspaces: [
174
+ 'apps/*',
175
+ 'verticals/*',
176
+ 'packages/*'
177
+ ],
178
+ modernjs: {
179
+ preset: 'presetUltramodern',
180
+ workspace: 'ultramodern-superapp',
181
+ topology: './topology/reference-topology.json',
182
+ ownership: './topology/ownership.json',
183
+ packageSource: {
184
+ strategy: packageSource.strategy,
185
+ config: './.modernjs/ultramodern-package-source.json'
186
+ }
187
+ },
188
+ devDependencies: {
189
+ '@effect/tsgo': EFFECT_TSGO_VERSION,
190
+ '@modern-js/code-tools': modernPackageSpecifier('@modern-js/code-tools', packageSource),
191
+ '@modern-js/create': modernPackageSpecifier('@modern-js/create', packageSource),
192
+ "@typescript/native-preview": TYPESCRIPT_NATIVE_PREVIEW_VERSION,
193
+ lefthook: LEFTHOOK_VERSION,
194
+ oxlint: OXLINT_VERSION,
195
+ oxfmt: OXFMT_VERSION,
196
+ ultracite: ULTRACITE_VERSION,
197
+ wrangler: WRANGLER_VERSION,
198
+ 'zephyr-agent': ZEPHYR_AGENT_VERSION
199
+ }
200
+ };
201
+ }
202
+ function createZephyrDependencies(scope, app, remotes = []) {
203
+ if (!app.verticalRefs?.length) return {};
204
+ return Object.fromEntries(resolveRemoteRefs(app, remotes).map((remote)=>[
205
+ remoteDependencyAlias(remote),
206
+ zephyrRemoteDependency(scope, remote)
207
+ ]));
208
+ }
209
+ function createTsConfigBase() {
210
+ return {
211
+ compilerOptions: {
212
+ target: 'ESNext',
213
+ lib: [
214
+ 'ESNext',
215
+ 'DOM',
216
+ 'DOM.Iterable'
217
+ ],
218
+ module: 'preserve',
219
+ moduleResolution: 'Bundler',
220
+ moduleDetection: 'force',
221
+ jsx: 'preserve',
222
+ isolatedModules: true,
223
+ verbatimModuleSyntax: true,
224
+ strict: true,
225
+ noEmit: true,
226
+ allowImportingTsExtensions: true,
227
+ allowJs: true,
228
+ esModuleInterop: true,
229
+ noUncheckedIndexedAccess: true,
230
+ exactOptionalPropertyTypes: true,
231
+ noImplicitOverride: true,
232
+ noFallthroughCasesInSwitch: true,
233
+ noPropertyAccessFromIndexSignature: true,
234
+ noImplicitReturns: true,
235
+ skipLibCheck: true,
236
+ resolveJsonModule: true,
237
+ plugins: [
238
+ {
239
+ name: '@effect/language-service',
240
+ diagnostics: true,
241
+ includeSuggestionsInTsc: true,
242
+ ignoreEffectSuggestionsInTscExitCode: false,
243
+ ignoreEffectWarningsInTscExitCode: false,
244
+ ignoreEffectErrorsInTscExitCode: false,
245
+ skipDisabledOptimization: true,
246
+ diagnosticSeverity: Object.fromEntries(effectDiagnostics.map((name)=>[
247
+ name,
248
+ 'error'
249
+ ]))
250
+ }
251
+ ]
252
+ }
253
+ };
254
+ }
255
+ function createPackageTsConfig(packageDir, includeApi = false) {
256
+ const include = [
257
+ 'src',
258
+ 'modern.config.ts',
259
+ 'module-federation.config.ts'
260
+ ];
261
+ if (includeApi) include.push('api', 'shared');
262
+ return {
263
+ extends: `${relativeRootFor(packageDir)}/tsconfig.base.json`,
264
+ include
265
+ };
266
+ }
267
+ function createAppPackage(scope, app, packageSource, enableTailwind, remotes = []) {
268
+ const publicSurfaceBuildCommand = createPublicSurfaceGenerationCommand(app, 'dist');
269
+ const publicSurfaceCloudflareBuildCommand = createPublicSurfaceGenerationCommand(app, 'dist');
270
+ const publicSurfaceCloudflareOutputCommand = createPublicSurfaceGenerationCommand(app, 'cloudflare');
271
+ const packageExports = Object.fromEntries(Object.entries(app.exposes ?? {}).map(([expose, source])=>[
272
+ expose,
273
+ source
274
+ ]));
275
+ const packageJson = {
276
+ private: true,
277
+ name: packageName(scope, app.packageSuffix),
278
+ version: '0.1.0',
279
+ scripts: {
280
+ dev: 'modern dev',
281
+ build: app.exposes ? `ULTRAMODERN_ZEPHYR=false modern build && ${publicSurfaceBuildCommand} && node ${relativeRootFor(app.directory)}/scripts/assert-mf-types.mjs` : `ULTRAMODERN_ZEPHYR=false modern build && ${publicSurfaceBuildCommand}`,
282
+ 'cloudflare:build': `ULTRAMODERN_ZEPHYR=false MODERNJS_DEPLOY=cloudflare modern build && ${publicSurfaceCloudflareBuildCommand} && ULTRAMODERN_ZEPHYR=false MODERNJS_DEPLOY=cloudflare modern deploy && ${publicSurfaceCloudflareOutputCommand}`,
283
+ 'cloudflare:deploy': 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS=true pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
284
+ 'cloudflare:preview': 'pnpm run cloudflare:build && wrangler dev --config .output/wrangler.json',
285
+ 'cloudflare:proof': `node ${relativeRootFor(app.directory)}/scripts/proof-cloudflare-version.mjs --app ${app.id}`,
286
+ serve: 'modern serve',
287
+ typecheck: effectTsgoTypecheckCommand
288
+ },
289
+ modernjs: {
290
+ preset: 'presetUltramodern',
291
+ role: 'shell' === app.kind ? 'shell' : 'module-federation-remote',
292
+ appId: app.id,
293
+ topology: `${relativeRootFor(app.directory)}/topology/reference-topology.json`,
294
+ ...appHasEffectApi(app) ? {
295
+ apiRuntime: 'effect-bff'
296
+ } : {}
297
+ },
298
+ 'zephyr:dependencies': createZephyrDependencies(scope, app, remotes),
299
+ dependencies: appDependencies(scope, packageSource, app, remotes),
300
+ devDependencies: appDevDependencies(packageSource, enableTailwind)
301
+ };
302
+ if (appHasEffectApi(app)) Object.assign(packageExports, {
303
+ './effect/client': `./src/effect/${app.effectApi.stem}-client.ts`,
304
+ './shared/effect/api': './shared/effect/api.ts'
305
+ });
306
+ else if ('shell' === app.kind) Object.assign(packageExports, {
307
+ './effect/clients': './src/effect/vertical-clients.ts'
308
+ });
309
+ if (Object.keys(packageExports).length > 0) packageJson.exports = packageExports;
310
+ return packageJson;
311
+ }
312
+ function createSharedPackage(scope, id, description) {
313
+ const packageJson = {
314
+ private: true,
315
+ name: packageName(scope, id),
316
+ version: '0.1.0',
317
+ description,
318
+ type: 'module',
319
+ exports: {
320
+ '.': './src/index.ts'
321
+ },
322
+ scripts: {
323
+ typecheck: effectTsgoTypecheckCommand
324
+ },
325
+ devDependencies: {
326
+ '@effect/tsgo': EFFECT_TSGO_VERSION,
327
+ "@typescript/native-preview": TYPESCRIPT_NATIVE_PREVIEW_VERSION
328
+ }
329
+ };
330
+ if ('shared-design-tokens' === id) packageJson.exports = {
331
+ ...packageJson.exports,
332
+ './tokens.css': './src/tokens.css'
333
+ };
334
+ return packageJson;
335
+ }
336
+ function createSharedContractsIndex() {
337
+ return readFileTemplate('packages/shared-contracts-index.ts');
338
+ }
339
+ export { appDependencies, appDevDependencies, createAppPackage, createPackageTsConfig, createRootPackageJson, createSharedContractsIndex, createSharedPackage, createTsConfigBase, createZephyrDependencies, effectDiagnostics, effectTsgoTypecheckCommand };
@@ -0,0 +1,22 @@
1
+ import "node:module";
2
+ import { BLEEDINGDEV_PACKAGE_NAME_PREFIX, BLEEDINGDEV_PACKAGE_SCOPE, WORKSPACE_PACKAGE_VERSION } from "../ultramodern-package-source.js";
3
+ function resolvePackageSource(options) {
4
+ const strategy = options.packageSource?.strategy ?? 'install';
5
+ if ('workspace' === strategy) return {
6
+ strategy,
7
+ modernPackageVersion: WORKSPACE_PACKAGE_VERSION,
8
+ registry: options.packageSource?.registry,
9
+ aliasScope: options.packageSource?.aliasScope,
10
+ aliasPackageNamePrefix: options.packageSource?.aliasPackageNamePrefix
11
+ };
12
+ const registry = options.packageSource?.registry;
13
+ const aliasScope = options.packageSource?.aliasScope ?? (registry ? void 0 : BLEEDINGDEV_PACKAGE_SCOPE);
14
+ return {
15
+ strategy,
16
+ modernPackageVersion: options.packageSource?.modernPackageVersion ?? options.modernVersion,
17
+ registry,
18
+ aliasScope,
19
+ aliasPackageNamePrefix: options.packageSource?.aliasPackageNamePrefix ?? (aliasScope ? BLEEDINGDEV_PACKAGE_NAME_PREFIX : void 0)
20
+ };
21
+ }
22
+ export { resolvePackageSource };
@@ -0,0 +1,184 @@
1
+ import "node:module";
2
+ import { appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, effectApiPrefix, effectApiStem } from "./descriptors.js";
3
+ import { createLocalisedUrlsMap } from "./routes.js";
4
+ import { isRecord } from "./types.js";
5
+ import { CLOUDFLARE_COMPATIBILITY_DATE } from "./versions.js";
6
+ function createCloudflareProofRoute(app) {
7
+ if ('shell' === app.kind) return {
8
+ ssr: '/en',
9
+ mfManifest: '/mf-manifest.json',
10
+ locale: `/locales/en/${appI18nNamespace(app)}.json`
11
+ };
12
+ const languageRoutes = createLocalisedUrlsMap(app);
13
+ const firstCanonicalPath = Object.keys(languageRoutes)[0];
14
+ const localizedPath = firstCanonicalPath && isRecord(languageRoutes[firstCanonicalPath]) ? languageRoutes[firstCanonicalPath].en : void 0;
15
+ return {
16
+ ssr: localizedPath ?? '/en',
17
+ mfManifest: '/mf-manifest.json',
18
+ locale: `/locales/en/${appI18nNamespace(app)}.json`,
19
+ ...appHasEffectApi(app) ? {
20
+ effectReadiness: `${effectApiPrefix(app)}/effect/${effectApiStem(app)}/readiness`
21
+ } : {}
22
+ };
23
+ }
24
+ function createCloudflareSecurityContract() {
25
+ return {
26
+ enabled: true,
27
+ headers: {
28
+ referrerPolicy: 'strict-origin-when-cross-origin',
29
+ contentTypeOptions: 'nosniff',
30
+ permissionsPolicy: 'camera=(), geolocation=(), microphone=(), payment=(), usb=()'
31
+ },
32
+ contentSecurityPolicy: {
33
+ mode: 'report-only',
34
+ directives: {
35
+ 'base-uri': [
36
+ "'self'"
37
+ ],
38
+ 'connect-src': [
39
+ "'self'",
40
+ 'https:',
41
+ 'http:',
42
+ 'wss:',
43
+ 'ws:'
44
+ ],
45
+ 'default-src': [
46
+ "'self'"
47
+ ],
48
+ 'font-src': [
49
+ "'self'",
50
+ 'data:',
51
+ 'https:',
52
+ 'http:'
53
+ ],
54
+ 'form-action': [
55
+ "'self'"
56
+ ],
57
+ 'frame-ancestors': [
58
+ "'self'"
59
+ ],
60
+ 'img-src': [
61
+ "'self'",
62
+ 'data:',
63
+ 'blob:',
64
+ 'https:',
65
+ 'http:'
66
+ ],
67
+ 'manifest-src': [
68
+ "'self'",
69
+ 'https:',
70
+ 'http:'
71
+ ],
72
+ 'object-src': [
73
+ "'none'"
74
+ ],
75
+ "script-src": [
76
+ "'self'",
77
+ "'unsafe-inline'",
78
+ "'unsafe-eval'",
79
+ 'https:',
80
+ 'http:',
81
+ 'blob:'
82
+ ],
83
+ 'style-src': [
84
+ "'self'",
85
+ "'unsafe-inline'",
86
+ 'https:',
87
+ 'http:'
88
+ ],
89
+ 'worker-src': [
90
+ "'self'",
91
+ 'blob:'
92
+ ]
93
+ },
94
+ reason: "Report-only by default so Cloudflare Module Federation SSR can prove remote script, style, and connect compatibility before enforcement."
95
+ },
96
+ noindex: {
97
+ workersDev: true,
98
+ localhost: true,
99
+ previewHostnames: []
100
+ }
101
+ };
102
+ }
103
+ const PUBLIC_WEBSITE_POLICY = {
104
+ qualityGates: {
105
+ publicRoutes: {
106
+ requireSitemapWhenPresent: true,
107
+ requireRobotsSitemapConsistency: true,
108
+ requireWebManifestWhenPresent: true
109
+ },
110
+ statusCodes: {
111
+ notFoundRoute: '/__ultramodern-smoke-missing',
112
+ unknownRouteStatus: 404
113
+ },
114
+ indexing: {
115
+ previewNoindex: true,
116
+ productionPublicRoutesIndexable: true
117
+ },
118
+ assets: {
119
+ cssPreloadRequired: true,
120
+ cssResponseRequired: true,
121
+ cacheControlRequiredForCss: true,
122
+ sourcemapsPubliclyReferenced: false
123
+ },
124
+ budgets: {
125
+ ssrHtmlMaxBytes: 250000,
126
+ mfManifestMaxBytes: 500000,
127
+ localeJsonMaxBytes: 100000,
128
+ sitemapXmlMaxBytes: 500000,
129
+ cssAssetMaxBytes: 750000
130
+ },
131
+ csp: {
132
+ finalMode: 'report-only-dogfood',
133
+ decision: "Report-only remains the generated final mode until public smoke proof records MF SSR script/style/connect compatibility for the deployed surface."
134
+ }
135
+ },
136
+ publicHead: {
137
+ indexableRobots: 'index, follow',
138
+ privateRouteRobots: 'noindex, nofollow'
139
+ },
140
+ publicSurface: {
141
+ defaultProviderFile: 'route.sitemap.mjs',
142
+ draftPolicy: 'omit-draft-by-default',
143
+ indexablePolicy: 'omit-indexable-false'
144
+ }
145
+ };
146
+ function formatTsJsonValue(value, indent) {
147
+ return JSON.stringify(value, null, 2).replaceAll('\n', `\n${' '.repeat(indent)}`);
148
+ }
149
+ function formatIntegerCodeLiteral(value) {
150
+ return String(value).replace(/\B(?=(\d{3})+(?!\d))/gu, '_');
151
+ }
152
+ function createPublicWebsiteQualityGateContract() {
153
+ return PUBLIC_WEBSITE_POLICY.qualityGates;
154
+ }
155
+ function createPublicWebsiteBudgetFallback(budgetName) {
156
+ return formatIntegerCodeLiteral(PUBLIC_WEBSITE_POLICY.qualityGates.budgets[budgetName]);
157
+ }
158
+ function createPublicHeadRobotsPolicy() {
159
+ return PUBLIC_WEBSITE_POLICY.publicHead;
160
+ }
161
+ function createPublicSurfaceContentExpansionPolicy() {
162
+ return PUBLIC_WEBSITE_POLICY.publicSurface;
163
+ }
164
+ function createCloudflareDeployContract(scope, app) {
165
+ return {
166
+ target: 'cloudflare',
167
+ workerName: createCloudflareWorkerName(scope, app),
168
+ publicUrlEnv: createCloudflarePublicUrlEnv(app),
169
+ compatibilityDate: CLOUDFLARE_COMPATIBILITY_DATE,
170
+ compatibilityFlags: [
171
+ 'nodejs_compat',
172
+ 'global_fetch_strictly_public'
173
+ ],
174
+ assetsBinding: 'ASSETS',
175
+ routes: createCloudflareProofRoute(app),
176
+ security: createCloudflareSecurityContract(),
177
+ qualityGates: createPublicWebsiteQualityGateContract(),
178
+ evidence: {
179
+ proofScript: "scripts/proof-cloudflare-version.mjs",
180
+ reportDefault: '.codex/reports/cloudflare-version-proof/public-url-proof.json'
181
+ }
182
+ };
183
+ }
184
+ export { PUBLIC_WEBSITE_POLICY, createCloudflareDeployContract, createCloudflareProofRoute, createCloudflareSecurityContract, createPublicHeadRobotsPolicy, createPublicSurfaceContentExpansionPolicy, createPublicWebsiteBudgetFallback, createPublicWebsiteQualityGateContract, formatIntegerCodeLiteral, formatTsJsonValue };