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