@bleedingdev/modern-js-create 3.2.0-ultramodern.120 → 3.2.0-ultramodern.122

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 (118) hide show
  1. package/README.md +35 -12
  2. package/dist/cjs/create-package-root.cjs +7 -9
  3. package/dist/cjs/index.cjs +74 -44
  4. package/dist/cjs/locale/en.cjs +6 -7
  5. package/dist/cjs/locale/zh.cjs +6 -7
  6. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +337 -0
  7. package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
  8. package/dist/cjs/ultramodern-workspace/contracts.cjs +836 -0
  9. package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
  10. package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
  11. package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
  12. package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
  13. package/dist/cjs/ultramodern-workspace/index.cjs +48 -0
  14. package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
  15. package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
  16. package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
  17. package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
  18. package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
  19. package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
  20. package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
  21. package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
  22. package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
  23. package/dist/cjs/ultramodern-workspace/versions.cjs +153 -0
  24. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +153 -0
  25. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +175 -0
  26. package/dist/esm/create-package-root.js +7 -9
  27. package/dist/esm/index.js +72 -42
  28. package/dist/esm/locale/en.js +6 -7
  29. package/dist/esm/locale/zh.js +6 -7
  30. package/dist/esm/ultramodern-workspace/add-vertical.js +252 -0
  31. package/dist/esm/ultramodern-workspace/app-files.js +149 -0
  32. package/dist/esm/ultramodern-workspace/contracts.js +741 -0
  33. package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
  34. package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
  35. package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
  36. package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
  37. package/dist/esm/ultramodern-workspace/index.js +3 -0
  38. package/dist/esm/ultramodern-workspace/locales.js +122 -0
  39. package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
  40. package/dist/esm/ultramodern-workspace/naming.js +71 -0
  41. package/dist/esm/ultramodern-workspace/package-json.js +338 -0
  42. package/dist/esm/ultramodern-workspace/package-source.js +21 -0
  43. package/dist/esm/ultramodern-workspace/policy.js +183 -0
  44. package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
  45. package/dist/esm/ultramodern-workspace/routes.js +280 -0
  46. package/dist/esm/ultramodern-workspace/types.js +16 -0
  47. package/dist/esm/ultramodern-workspace/versions.js +34 -0
  48. package/dist/esm/ultramodern-workspace/workspace-scripts.js +91 -0
  49. package/dist/esm/ultramodern-workspace/write-workspace.js +121 -0
  50. package/dist/esm-node/create-package-root.js +7 -9
  51. package/dist/esm-node/index.js +72 -42
  52. package/dist/esm-node/locale/en.js +6 -7
  53. package/dist/esm-node/locale/zh.js +6 -7
  54. package/dist/esm-node/ultramodern-workspace/add-vertical.js +253 -0
  55. package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
  56. package/dist/esm-node/ultramodern-workspace/contracts.js +742 -0
  57. package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
  58. package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
  59. package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
  60. package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
  61. package/dist/esm-node/ultramodern-workspace/index.js +4 -0
  62. package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
  63. package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
  64. package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
  65. package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
  66. package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
  67. package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
  68. package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
  69. package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
  70. package/dist/esm-node/ultramodern-workspace/types.js +17 -0
  71. package/dist/esm-node/ultramodern-workspace/versions.js +35 -0
  72. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -0
  73. package/dist/esm-node/ultramodern-workspace/write-workspace.js +122 -0
  74. package/dist/types/locale/en.d.ts +4 -5
  75. package/dist/types/locale/index.d.ts +8 -10
  76. package/dist/types/locale/zh.d.ts +4 -5
  77. package/dist/types/ultramodern-workspace/add-vertical.d.ts +19 -0
  78. package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
  79. package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
  80. package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
  81. package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
  82. package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
  83. package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
  84. package/dist/types/ultramodern-workspace/index.d.ts +4 -0
  85. package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
  86. package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
  87. package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
  88. package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
  89. package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
  90. package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
  91. package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
  92. package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
  93. package/dist/types/ultramodern-workspace/types.d.ts +95 -0
  94. package/dist/types/ultramodern-workspace/versions.d.ts +38 -0
  95. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
  96. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
  97. package/package.json +4 -3
  98. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +1 -4
  99. package/template-workspace/.mise.toml.handlebars +1 -0
  100. package/template-workspace/{AGENTS.md → AGENTS.md.handlebars} +12 -7
  101. package/template-workspace/README.md.handlebars +40 -24
  102. package/template-workspace/{pnpm-workspace.yaml → pnpm-workspace.yaml.handlebars} +2 -2
  103. package/template-workspace/scripts/bootstrap-agent-skills.mjs +31 -51
  104. package/templates/app/shell-frame.tsx +49 -0
  105. package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
  106. package/templates/packages/shared-contracts-index.ts +466 -0
  107. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
  108. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
  109. package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
  110. package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
  111. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
  112. package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
  113. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
  114. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +656 -0
  115. package/dist/cjs/ultramodern-workspace.cjs +0 -6797
  116. package/dist/esm/ultramodern-workspace.js +0 -6738
  117. package/dist/esm-node/ultramodern-workspace.js +0 -6739
  118. package/dist/types/ultramodern-workspace.d.ts +0 -29
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ createAssertMfTypesScript: ()=>createAssertMfTypesScript,
32
+ createCloudflareProofHelperScript: ()=>createCloudflareProofHelperScript,
33
+ createCloudflareVersionProofScript: ()=>createCloudflareVersionProofScript,
34
+ createPerformanceReadinessConfigScript: ()=>createPerformanceReadinessConfigScript,
35
+ createPerformanceReadinessScript: ()=>createPerformanceReadinessScript,
36
+ createPublicSurfaceAssetsScript: ()=>createPublicSurfaceAssetsScript,
37
+ createWorkspaceI18nBoundaryValidationScript: ()=>createWorkspaceI18nBoundaryValidationScript,
38
+ createWorkspaceValidationScript: ()=>createWorkspaceValidationScript,
39
+ writeGeneratedWorkspaceScripts: ()=>writeGeneratedWorkspaceScripts
40
+ });
41
+ const external_demo_components_cjs_namespaceObject = require("./demo-components.cjs");
42
+ const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
43
+ const external_effect_api_cjs_namespaceObject = require("./effect-api.cjs");
44
+ const external_fs_io_cjs_namespaceObject = require("./fs-io.cjs");
45
+ const external_naming_cjs_namespaceObject = require("./naming.cjs");
46
+ const external_policy_cjs_namespaceObject = require("./policy.cjs");
47
+ const external_public_surface_cjs_namespaceObject = require("./public-surface.cjs");
48
+ const external_routes_cjs_namespaceObject = require("./routes.cjs");
49
+ const external_versions_cjs_namespaceObject = require("./versions.cjs");
50
+ function createAssertMfTypesScript(remotes = []) {
51
+ return (0, external_fs_io_cjs_namespaceObject.renderFileTemplate)("workspace-scripts/assert-mf-types.mjs", {
52
+ defaultAppDirsJson: JSON.stringify(remotes.map((remote)=>remote.directory), null, 2)
53
+ });
54
+ }
55
+ function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
56
+ const verticals = remotes.filter(external_descriptors_cjs_namespaceObject.appHasEffectApi).map((remote)=>({
57
+ id: remote.id,
58
+ domain: remote.domain,
59
+ stem: remote.effectApi.stem,
60
+ group: (0, external_effect_api_cjs_namespaceObject.verticalEffectGroupName)(remote),
61
+ path: remote.directory,
62
+ mfName: remote.mfName,
63
+ apiPrefix: remote.effectApi.prefix,
64
+ tailwindPrefix: (0, external_naming_cjs_namespaceObject.tailwindPrefixForApp)(remote),
65
+ zephyrAlias: (0, external_descriptors_cjs_namespaceObject.remoteDependencyAlias)(remote),
66
+ packageName: (0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix),
67
+ exposes: Object.keys(remote.exposes ?? {}),
68
+ componentPaths: Object.keys(remote.exposes ?? {}).map((expose)=>(0, external_demo_components_cjs_namespaceObject.remoteComponentOutputPath)(remote, expose)).filter((componentPath)=>Boolean(componentPath)),
69
+ namespace: (0, external_descriptors_cjs_namespaceObject.appI18nNamespace)(remote),
70
+ routePagePaths: (0, external_routes_cjs_namespaceObject.createRouteOwnedI18nPaths)(remote).filter((route)=>'/' !== route.canonicalPath).map((route)=>(0, external_routes_cjs_namespaceObject.createRoutePageFilePath)(remote, route.canonicalPath)),
71
+ routeMetaPaths: (0, external_routes_cjs_namespaceObject.createRouteOwnedI18nPaths)(remote).map((route)=>(0, external_routes_cjs_namespaceObject.createRouteMetaFilePath)(remote, route.canonicalPath)),
72
+ localisedUrls: (0, external_routes_cjs_namespaceObject.createLocalisedUrlsMap)(remote),
73
+ verticalRefs: remote.verticalRefs ?? []
74
+ }));
75
+ const shellRouteMetaPaths = (0, external_routes_cjs_namespaceObject.createRouteOwnedI18nPaths)(external_descriptors_cjs_namespaceObject.shellApp).map((route)=>(0, external_routes_cjs_namespaceObject.createRouteMetaFilePath)(external_descriptors_cjs_namespaceObject.shellApp, route.canonicalPath));
76
+ const shellNamespace = (0, external_descriptors_cjs_namespaceObject.appI18nNamespace)(external_descriptors_cjs_namespaceObject.shellApp);
77
+ const oldRemotePaths = [
78
+ 'apps/remotes'
79
+ ];
80
+ const expectedBuildScript = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types && pnpm performance:readiness' : 'ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types && pnpm performance:readiness';
81
+ const expectedCloudflareBuildScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types';
82
+ const expectedCloudflareDeployScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:deploy && pnpm --filter "./apps/shell-super-app" run cloudflare:deploy' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:deploy';
83
+ const expectedCloudflareSecurity = (0, external_policy_cjs_namespaceObject.createCloudflareSecurityContract)();
84
+ return (0, external_fs_io_cjs_namespaceObject.renderFileTemplate)("workspace-scripts/validate-ultramodern-workspace.mjs", {
85
+ packageScope: scope,
86
+ nodeVersion: external_versions_cjs_namespaceObject.NODE_VERSION,
87
+ pnpmVersion: external_versions_cjs_namespaceObject.PNPM_VERSION,
88
+ tailwindEnabledJson: JSON.stringify(enableTailwind),
89
+ fullStackVerticalsJson: JSON.stringify(verticals, null, 2),
90
+ shellNamespaceJson: JSON.stringify(shellNamespace),
91
+ oldRemotePathsJson: JSON.stringify(oldRemotePaths, null, 2),
92
+ expectedBuildScriptJson: JSON.stringify(expectedBuildScript),
93
+ expectedCloudflareBuildScriptJson: JSON.stringify(expectedCloudflareBuildScript),
94
+ expectedCloudflareDeployScriptJson: JSON.stringify(expectedCloudflareDeployScript),
95
+ expectedCloudflareSecurityJson: JSON.stringify(expectedCloudflareSecurity, null, 2),
96
+ publicSurfaceManagedSourceAssetPathsJson: JSON.stringify([
97
+ ...external_public_surface_cjs_namespaceObject.publicSurfaceManagedSourceAssetPaths
98
+ ], null, 2),
99
+ shellRouteMetaPathsJson: JSON.stringify(shellRouteMetaPaths, null, 2),
100
+ cloudflareCompatibilityDate: external_versions_cjs_namespaceObject.CLOUDFLARE_COMPATIBILITY_DATE
101
+ });
102
+ }
103
+ function createWorkspaceI18nBoundaryValidationScript() {
104
+ return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/check-ultramodern-i18n-boundaries.mjs");
105
+ }
106
+ function createPublicSurfaceAssetsScript() {
107
+ return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/generate-public-surface-assets.mjs");
108
+ }
109
+ function createCloudflareProofHelperScript() {
110
+ return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-cloudflare-proof.mjs");
111
+ }
112
+ function createCloudflareVersionProofScript() {
113
+ return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/proof-cloudflare-version.mjs");
114
+ }
115
+ function createPerformanceReadinessConfigScript() {
116
+ return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-performance-readiness.config.mjs");
117
+ }
118
+ function createPerformanceReadinessScript() {
119
+ return (0, external_fs_io_cjs_namespaceObject.readFileTemplate)("workspace-scripts/ultramodern-performance-readiness.mjs");
120
+ }
121
+ function writeGeneratedWorkspaceScripts(targetDir, scope, enableTailwind, remotes = []) {
122
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/assert-mf-types.mjs", createAssertMfTypesScript(remotes));
123
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/validate-ultramodern-workspace.mjs", createWorkspaceValidationScript(scope, enableTailwind, remotes));
124
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/check-ultramodern-i18n-boundaries.mjs", createWorkspaceI18nBoundaryValidationScript());
125
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/generate-public-surface-assets.mjs", createPublicSurfaceAssetsScript());
126
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-cloudflare-proof.mjs", createCloudflareProofHelperScript());
127
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/proof-cloudflare-version.mjs", createCloudflareVersionProofScript());
128
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-performance-readiness.config.mjs", createPerformanceReadinessConfigScript());
129
+ (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(targetDir, "scripts/ultramodern-performance-readiness.mjs", createPerformanceReadinessScript());
130
+ }
131
+ exports.createAssertMfTypesScript = __webpack_exports__.createAssertMfTypesScript;
132
+ exports.createCloudflareProofHelperScript = __webpack_exports__.createCloudflareProofHelperScript;
133
+ exports.createCloudflareVersionProofScript = __webpack_exports__.createCloudflareVersionProofScript;
134
+ exports.createPerformanceReadinessConfigScript = __webpack_exports__.createPerformanceReadinessConfigScript;
135
+ exports.createPerformanceReadinessScript = __webpack_exports__.createPerformanceReadinessScript;
136
+ exports.createPublicSurfaceAssetsScript = __webpack_exports__.createPublicSurfaceAssetsScript;
137
+ exports.createWorkspaceI18nBoundaryValidationScript = __webpack_exports__.createWorkspaceI18nBoundaryValidationScript;
138
+ exports.createWorkspaceValidationScript = __webpack_exports__.createWorkspaceValidationScript;
139
+ exports.writeGeneratedWorkspaceScripts = __webpack_exports__.writeGeneratedWorkspaceScripts;
140
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
141
+ "createAssertMfTypesScript",
142
+ "createCloudflareProofHelperScript",
143
+ "createCloudflareVersionProofScript",
144
+ "createPerformanceReadinessConfigScript",
145
+ "createPerformanceReadinessScript",
146
+ "createPublicSurfaceAssetsScript",
147
+ "createWorkspaceI18nBoundaryValidationScript",
148
+ "createWorkspaceValidationScript",
149
+ "writeGeneratedWorkspaceScripts"
150
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
151
+ Object.defineProperty(exports, '__esModule', {
152
+ value: true
153
+ });
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ generateUltramodernWorkspace: ()=>generateUltramodernWorkspace,
41
+ writeApp: ()=>writeApp,
42
+ writeSharedPackages: ()=>writeSharedPackages
43
+ });
44
+ const external_node_fs_namespaceObject = require("node:fs");
45
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
46
+ const external_app_files_cjs_namespaceObject = require("./app-files.cjs");
47
+ const external_contracts_cjs_namespaceObject = require("./contracts.cjs");
48
+ const external_demo_components_cjs_namespaceObject = require("./demo-components.cjs");
49
+ const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
50
+ const external_effect_api_cjs_namespaceObject = require("./effect-api.cjs");
51
+ const external_fs_io_cjs_namespaceObject = require("./fs-io.cjs");
52
+ const external_locales_cjs_namespaceObject = require("./locales.cjs");
53
+ const external_module_federation_cjs_namespaceObject = require("./module-federation.cjs");
54
+ const external_naming_cjs_namespaceObject = require("./naming.cjs");
55
+ const external_package_json_cjs_namespaceObject = require("./package-json.cjs");
56
+ const external_package_source_cjs_namespaceObject = require("./package-source.cjs");
57
+ const external_public_surface_cjs_namespaceObject = require("./public-surface.cjs");
58
+ const external_versions_cjs_namespaceObject = require("./versions.cjs");
59
+ const external_workspace_scripts_cjs_namespaceObject = require("./workspace-scripts.cjs");
60
+ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = []) {
61
+ const resolvedApp = 'shell' === app.kind ? (0, external_descriptors_cjs_namespaceObject.createShellHost)(remotes) : app;
62
+ const publicWeb = (0, external_public_surface_cjs_namespaceObject.createPublicWebAppArtifacts)(resolvedApp);
63
+ const writeAppFile = (relativePath, content)=>{
64
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/${relativePath}`, content);
65
+ };
66
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/package.json`, (0, external_package_json_cjs_namespaceObject.createAppPackage)(scope, resolvedApp, packageSource, enableTailwind, remotes));
67
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/tsconfig.json`, (0, external_package_json_cjs_namespaceObject.createPackageTsConfig)(resolvedApp.directory, (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(resolvedApp)));
68
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/modern-app-env.d.ts`, (0, external_app_files_cjs_namespaceObject.createAppEnvDts)(resolvedApp, remotes));
69
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/ultramodern-build.ts`, (0, external_module_federation_cjs_namespaceObject.createUltramodernBuildModule)(scope, resolvedApp));
70
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, publicWeb.jsonLdHelperFile.path, publicWeb.jsonLdHelperFile.content);
71
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, publicWeb.routeMetadataFile.path, publicWeb.routeMetadataFile.content);
72
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, publicWeb.routeHeadFile.path, publicWeb.routeHeadFile.content);
73
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/modern.config.ts`, (0, external_module_federation_cjs_namespaceObject.createAppModernConfig)(scope, resolvedApp));
74
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/modern.runtime.ts`, (0, external_app_files_cjs_namespaceObject.createAppRuntimeConfig)(resolvedApp, scope, remotes));
75
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/locales/en/translation.json`, (0, external_locales_cjs_namespaceObject.createAppPublicLocaleMessages)(resolvedApp, 'en', remotes));
76
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/locales/en/${(0, external_descriptors_cjs_namespaceObject.appI18nNamespace)(resolvedApp)}.json`, (0, external_locales_cjs_namespaceObject.createAppPublicLocaleMessages)(resolvedApp, 'en', remotes));
77
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/locales/cs/translation.json`, (0, external_locales_cjs_namespaceObject.createAppPublicLocaleMessages)(resolvedApp, 'cs', remotes));
78
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${resolvedApp.directory}/locales/cs/${(0, external_descriptors_cjs_namespaceObject.appI18nNamespace)(resolvedApp)}.json`, (0, external_locales_cjs_namespaceObject.createAppPublicLocaleMessages)(resolvedApp, 'cs', remotes));
79
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/routes/index.css`, (0, external_app_files_cjs_namespaceObject.createAppStyles)(enableTailwind, scope, resolvedApp));
80
+ if (enableTailwind) {
81
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/postcss.config.mjs`, (0, external_app_files_cjs_namespaceObject.createPostcssConfig)());
82
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/tailwind.config.ts`, (0, external_app_files_cjs_namespaceObject.createTailwindConfig)());
83
+ }
84
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/module-federation.config.ts`, 'shell' === resolvedApp.kind ? (0, external_module_federation_cjs_namespaceObject.createShellModuleFederationConfig)(scope, remotes) : (0, external_module_federation_cjs_namespaceObject.createRemoteModuleFederationConfig)(scope, resolvedApp, remotes));
85
+ writeAppFile('src/routes/layout.tsx', (0, external_demo_components_cjs_namespaceObject.createLayout)(resolvedApp.id));
86
+ writeAppFile('src/routes/[lang]/page.tsx', 'shell' === resolvedApp.kind ? (0, external_demo_components_cjs_namespaceObject.createShellPage)(remotes) : (0, external_demo_components_cjs_namespaceObject.createRemotePage)(resolvedApp));
87
+ for (const generatedFile of publicWeb.routeMetaFiles)(0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, generatedFile.path, generatedFile.content);
88
+ for (const generatedFile of publicWeb.routeAliasFiles)(0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, generatedFile.path, generatedFile.content);
89
+ if ('shell' === resolvedApp.kind) {
90
+ writeAppFile('src/routes/vertical-components.tsx', (0, external_demo_components_cjs_namespaceObject.createShellRemoteComponents)(scope, remotes));
91
+ writeAppFile('src/routes/shell-frame.tsx', (0, external_app_files_cjs_namespaceObject.createShellFrameComponent)());
92
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/effect/vertical-clients.ts`, (0, external_effect_api_cjs_namespaceObject.createShellEffectClient)(scope, remotes));
93
+ }
94
+ if ((0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(resolvedApp)) {
95
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/shared/effect/api.ts`, (0, external_effect_api_cjs_namespaceObject.createEffectSharedApi)(resolvedApp));
96
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/api/effect/index.ts`, (0, external_effect_api_cjs_namespaceObject.createEffectServiceEntry)(resolvedApp, '../../shared/effect/api.ts'));
97
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, `${resolvedApp.directory}/src/effect/${resolvedApp.effectApi.stem}-client.ts`, (0, external_effect_api_cjs_namespaceObject.createEffectClient)(resolvedApp, '../../shared/effect/api'));
98
+ }
99
+ if ('vertical' === resolvedApp.kind) {
100
+ writeAppFile('src/federation-entry.tsx', (0, external_demo_components_cjs_namespaceObject.createRemoteEntry)(resolvedApp));
101
+ for (const expose of Object.keys(resolvedApp.exposes ?? {})){
102
+ const outputPath = (0, external_demo_components_cjs_namespaceObject.remoteComponentOutputPath)(resolvedApp, expose);
103
+ if (outputPath) writeAppFile(outputPath.slice(resolvedApp.directory.length + 1), (0, external_demo_components_cjs_namespaceObject.createRemoteExposeComponent)(resolvedApp, expose));
104
+ }
105
+ }
106
+ }
107
+ function writeSharedPackages(targetDir, scope) {
108
+ for (const sharedPackage of external_descriptors_cjs_namespaceObject.sharedPackages){
109
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${sharedPackage.directory}/package.json`, (0, external_package_json_cjs_namespaceObject.createSharedPackage)(scope, sharedPackage.id, sharedPackage.description));
110
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(targetDir, `${sharedPackage.directory}/tsconfig.json`, {
111
+ extends: `${(0, external_naming_cjs_namespaceObject.relativeRootFor)(sharedPackage.directory)}/tsconfig.base.json`,
112
+ include: [
113
+ 'src'
114
+ ]
115
+ });
116
+ }
117
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, 'packages/shared-contracts/src/index.ts', (0, external_package_json_cjs_namespaceObject.createSharedContractsIndex)());
118
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, 'packages/shared-design-tokens/src/index.ts', `export const sharedDesignTokens = {
119
+ color: {
120
+ accent: '#2f8f68',
121
+ foreground: '#133225',
122
+ surface: '#f6fbf7',
123
+ },
124
+ } as const;
125
+ `);
126
+ (0, external_fs_io_cjs_namespaceObject.writeFile)(targetDir, 'packages/shared-design-tokens/src/tokens.css', (0, external_app_files_cjs_namespaceObject.createSharedDesignTokensCss)());
127
+ }
128
+ function generateUltramodernWorkspace(options) {
129
+ const scope = (0, external_naming_cjs_namespaceObject.toPackageScope)(options.packageName);
130
+ const packageSource = (0, external_package_source_cjs_namespaceObject.resolvePackageSource)(options);
131
+ const enableTailwind = false !== options.enableTailwind;
132
+ const initialVerticals = [];
133
+ (0, external_naming_cjs_namespaceObject.assertUniqueTailwindPrefixes)([
134
+ external_descriptors_cjs_namespaceObject.shellApp,
135
+ ...initialVerticals
136
+ ]);
137
+ external_node_fs_default().mkdirSync(options.targetDir, {
138
+ recursive: true
139
+ });
140
+ (0, external_fs_io_cjs_namespaceObject.copyRootTemplate)(options.targetDir, {
141
+ packageName: options.packageName,
142
+ packageScope: scope,
143
+ nodeVersion: external_versions_cjs_namespaceObject.NODE_VERSION,
144
+ pnpmVersion: external_versions_cjs_namespaceObject.PNPM_VERSION,
145
+ nodeFetchVersion: external_versions_cjs_namespaceObject.NODE_FETCH_VERSION,
146
+ tanstackRouterVersion: external_versions_cjs_namespaceObject.TANSTACK_ROUTER_VERSION,
147
+ tailwindEnabled: String(enableTailwind)
148
+ });
149
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'package.json', (0, external_package_json_cjs_namespaceObject.createRootPackageJson)(scope, packageSource, initialVerticals));
150
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'tsconfig.base.json', (0, external_package_json_cjs_namespaceObject.createTsConfigBase)());
151
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'topology/reference-topology.json', (0, external_contracts_cjs_namespaceObject.createTopology)(scope, initialVerticals));
152
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'topology/ownership.json', (0, external_contracts_cjs_namespaceObject.createOwnership)(scope, initialVerticals));
153
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, 'topology/local-overlays/development.json', (0, external_contracts_cjs_namespaceObject.createDevelopmentOverlay)(initialVerticals));
154
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, '.modernjs/ultramodern-workspace-template-manifest.json', (0, external_contracts_cjs_namespaceObject.createTemplateManifest)(options.modernVersion, packageSource));
155
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, '.modernjs/ultramodern-package-source.json', (0, external_contracts_cjs_namespaceObject.createPackageSourceMetadata)(scope, packageSource));
156
+ (0, external_fs_io_cjs_namespaceObject.writeJson)(options.targetDir, external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH, (0, external_contracts_cjs_namespaceObject.createGeneratedContract)(scope, [
157
+ (0, external_descriptors_cjs_namespaceObject.createShellHost)(initialVerticals),
158
+ ...initialVerticals
159
+ ], enableTailwind));
160
+ writeApp(options.targetDir, scope, external_descriptors_cjs_namespaceObject.shellApp, packageSource, enableTailwind, initialVerticals);
161
+ for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals);
162
+ writeSharedPackages(options.targetDir, scope);
163
+ (0, external_workspace_scripts_cjs_namespaceObject.writeGeneratedWorkspaceScripts)(options.targetDir, scope, enableTailwind, initialVerticals);
164
+ }
165
+ exports.generateUltramodernWorkspace = __webpack_exports__.generateUltramodernWorkspace;
166
+ exports.writeApp = __webpack_exports__.writeApp;
167
+ exports.writeSharedPackages = __webpack_exports__.writeSharedPackages;
168
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
169
+ "generateUltramodernWorkspace",
170
+ "writeApp",
171
+ "writeSharedPackages"
172
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
173
+ Object.defineProperty(exports, '__esModule', {
174
+ value: true
175
+ });
@@ -1,16 +1,14 @@
1
1
  import node_fs from "node:fs";
2
2
  import node_path from "node:path";
3
+ const MAX_WALK_UP_LEVELS = 5;
3
4
  function resolveCreatePackageRoot(fromDir) {
4
- const candidates = [
5
- fromDir,
6
- node_path.resolve(fromDir, '..'),
7
- node_path.resolve(fromDir, '..', '..')
8
- ];
9
- const seen = new Set();
10
- for (const candidate of candidates)if (!seen.has(candidate)) {
11
- seen.add(candidate);
5
+ let candidate = fromDir;
6
+ for(let level = 0; level <= MAX_WALK_UP_LEVELS; level++){
12
7
  if (node_fs.existsSync(node_path.join(candidate, 'package.json')) && node_fs.existsSync(node_path.join(candidate, 'template-workspace'))) return candidate;
8
+ const parent = node_path.dirname(candidate);
9
+ if (parent === candidate) break;
10
+ candidate = parent;
13
11
  }
14
- throw new Error('Unable to resolve create package root');
12
+ throw new Error(`Unable to resolve the @modern-js/create package root (a directory containing both package.json and template-workspace/) within ${MAX_WALK_UP_LEVELS} levels above ${fromDir}`);
15
13
  }
16
14
  export { resolveCreatePackageRoot };
package/dist/esm/index.js CHANGED
@@ -6,12 +6,19 @@ import { fileURLToPath } from "node:url";
6
6
  import { resolveCreatePackageRoot } from "./create-package-root.js";
7
7
  import { i18n, localeKeys } from "./locale/index.js";
8
8
  import { BLEEDINGDEV_CREATE_PACKAGE, BLEEDINGDEV_FRAMEWORK_VERSION_ENV, BLEEDINGDEV_PACKAGE_NAME_PREFIX, BLEEDINGDEV_PACKAGE_SCOPE, WORKSPACE_PACKAGE_VERSION } from "./ultramodern-package-source.js";
9
- import { addUltramodernVertical, generateUltramodernWorkspace } from "./ultramodern-workspace.js";
9
+ import { addUltramodernVertical, generateUltramodernWorkspace } from "./ultramodern-workspace/index.js";
10
10
  const src_dirname = node_path.dirname(fileURLToPath(import.meta.url));
11
11
  const createPackageRoot = resolveCreatePackageRoot(src_dirname);
12
12
  const semverPattern = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
13
13
  const LEGACY_MODERN_JS_FLAG = '--legacy-modern-js';
14
14
  const LEGACY_MODERN_JS_CONFIRMATION = 'USE LEGACY MODERN.JS';
15
+ const WORKSPACE_PROTOCOL_FLAG = '--workspace';
16
+ const BFF_FLAG = '--bff';
17
+ const BFF_RUNTIME_OPTION = '--bff-runtime';
18
+ const SUPPORTED_BFF_RUNTIMES = [
19
+ 'effect'
20
+ ];
21
+ const REGISTRY_LOOKUP_TIMEOUT_MS = 15000;
15
22
  function getOptionValue(args, names) {
16
23
  for (const name of names){
17
24
  const prefix = `${name}=`;
@@ -45,8 +52,10 @@ function getBleedingDevFrameworkVersion(createPackage, fallbackVersion) {
45
52
  }
46
53
  function showVersion() {
47
54
  const createPackage = readCreatePackageJson();
55
+ const name = createPackage.name || '@modern-js/create';
48
56
  const version = createPackage.version || 'unknown';
49
57
  console.log(i18n.t(localeKeys.version.message, {
58
+ name,
50
59
  version
51
60
  }));
52
61
  process.exit(0);
@@ -62,20 +71,26 @@ function showHelp() {
62
71
  console.log(i18n.t(localeKeys.help.optionHelp));
63
72
  console.log(i18n.t(localeKeys.help.optionVersion));
64
73
  console.log(i18n.t(localeKeys.help.optionLang));
65
- if (localeKeys.help.optionTailwind) console.log(i18n.t(localeKeys.help.optionTailwind));
66
- if (localeKeys.help.optionUltramodernPackageSource) console.log(i18n.t(localeKeys.help.optionUltramodernPackageSource));
67
- if (localeKeys.help.optionUltramodernPackageScope) console.log(i18n.t(localeKeys.help.optionUltramodernPackageScope));
68
- if (localeKeys.help.optionUltramodernPackageNamePrefix) console.log(i18n.t(localeKeys.help.optionUltramodernPackageNamePrefix));
69
- if (localeKeys.help.optionVertical) console.log(i18n.t(localeKeys.help.optionVertical));
70
- if (localeKeys.help.optionLegacyModernJs) console.log(i18n.t(localeKeys.help.optionLegacyModernJs));
74
+ console.log(i18n.t(localeKeys.help.optionTailwind));
75
+ console.log(i18n.t(localeKeys.help.optionBff));
76
+ console.log(i18n.t(localeKeys.help.optionBffRuntime));
77
+ console.log(i18n.t(localeKeys.help.optionWorkspace));
78
+ console.log(i18n.t(localeKeys.help.optionUltramodernPackageSource));
79
+ console.log(i18n.t(localeKeys.help.optionUltramodernPackageVersion));
80
+ console.log(i18n.t(localeKeys.help.optionUltramodernPackageRegistry));
81
+ console.log(i18n.t(localeKeys.help.optionUltramodernPackageScope));
82
+ console.log(i18n.t(localeKeys.help.optionUltramodernPackageNamePrefix));
83
+ console.log(i18n.t(localeKeys.help.optionVertical));
84
+ console.log(i18n.t(localeKeys.help.optionLegacyModernJs));
71
85
  console.log('');
72
86
  console.log(i18n.t(localeKeys.help.examples));
73
87
  console.log(i18n.t(localeKeys.help.example1));
74
88
  console.log(i18n.t(localeKeys.help.example2));
75
- if (localeKeys.help.example4) console.log(i18n.t(localeKeys.help.example4));
76
- if (localeKeys.help.example5) console.log(i18n.t(localeKeys.help.example5));
77
- if (localeKeys.help.example6) console.log(i18n.t(localeKeys.help.example6));
78
- if (localeKeys.help.example12) console.log(i18n.t(localeKeys.help.example12));
89
+ console.log(i18n.t(localeKeys.help.example3));
90
+ console.log(i18n.t(localeKeys.help.example4));
91
+ console.log(i18n.t(localeKeys.help.example5));
92
+ console.log(i18n.t(localeKeys.help.example6));
93
+ console.log(i18n.t(localeKeys.help.example7));
79
94
  console.log('');
80
95
  console.log(i18n.t(localeKeys.help.moreInfo));
81
96
  console.log('');
@@ -132,6 +147,26 @@ function delegateLegacyModernJsSetup(args) {
132
147
  });
133
148
  throw new Error('Legacy Modern.js setup requires pnpm or npx to run @modern-js/create.');
134
149
  }
150
+ function detectBffRuntime(args) {
151
+ if (args.some((arg)=>arg.startsWith(`${BFF_FLAG}=`))) {
152
+ console.error(`${BFF_FLAG} does not accept a value. Use: ${BFF_RUNTIME_OPTION} <runtime>`);
153
+ process.exit(1);
154
+ }
155
+ const runtimeRequested = args.some((arg)=>arg === BFF_RUNTIME_OPTION || arg.startsWith(`${BFF_RUNTIME_OPTION}=`));
156
+ if (!runtimeRequested) return 'effect';
157
+ const runtime = getOptionValue(args, [
158
+ BFF_RUNTIME_OPTION
159
+ ]);
160
+ if (!runtime) {
161
+ console.error(`${BFF_RUNTIME_OPTION} requires a value (supported: ${SUPPORTED_BFF_RUNTIMES.join(', ')})`);
162
+ process.exit(1);
163
+ }
164
+ if (!SUPPORTED_BFF_RUNTIMES.includes(runtime)) {
165
+ console.error(`Unsupported BFF runtime "${runtime}". UltraModern workspaces scaffold an Effect BFF for every MicroVertical (supported: ${SUPPORTED_BFF_RUNTIMES.join(', ')}).`);
166
+ process.exit(1);
167
+ }
168
+ return runtime;
169
+ }
135
170
  function detectTailwindFlag() {
136
171
  const args = process.argv.slice(2);
137
172
  return !args.includes('--no-tailwind');
@@ -183,7 +218,7 @@ function hasExplicitUltramodernPackageSource(args, value) {
183
218
  ]);
184
219
  return value ? configuredValue === value : void 0 !== configuredValue;
185
220
  }
186
- function readBleedingDevFrameworkVersionFromRegistry() {
221
+ function readBleedingDevFrameworkVersionFromRegistry(fallbackVersion) {
187
222
  const envVersion = process.env[BLEEDINGDEV_FRAMEWORK_VERSION_ENV]?.trim();
188
223
  if (envVersion) {
189
224
  if (!semverPattern.test(envVersion)) {
@@ -198,16 +233,19 @@ function readBleedingDevFrameworkVersionFromRegistry() {
198
233
  `${BLEEDINGDEV_CREATE_PACKAGE}@latest`,
199
234
  'ultramodern.frameworkVersion',
200
235
  '--json'
201
- ]).trim();
236
+ ], {
237
+ timeoutMs: REGISTRY_LOOKUP_TIMEOUT_MS
238
+ }).trim();
202
239
  const version = JSON.parse(rawVersion);
203
240
  if ('string' == typeof version && semverPattern.test(version)) return version;
204
241
  } catch {}
205
- console.error([
206
- `Could not resolve ${BLEEDINGDEV_CREATE_PACKAGE}@latest ultramodern.frameworkVersion.`,
207
- 'Pass --workspace to use local workspace protocol dependencies,',
242
+ console.warn([
243
+ `Could not resolve ${BLEEDINGDEV_CREATE_PACKAGE}@latest ultramodern.frameworkVersion from the npm registry.`,
244
+ `Falling back to the packaged framework version ${fallbackVersion}.`,
245
+ `Pass ${WORKSPACE_PROTOCOL_FLAG} to use local workspace protocol dependencies,`,
208
246
  'or pass --ultramodern-package-version with the exact BleedingDev framework cohort.'
209
247
  ].join(' '));
210
- process.exit(1);
248
+ return fallbackVersion;
211
249
  }
212
250
  function resolveInstallBackedPackageSource(args, createPackage, packageSource) {
213
251
  const explicitVersion = getOptionValue(args, [
@@ -222,7 +260,7 @@ function resolveInstallBackedPackageSource(args, createPackage, packageSource) {
222
260
  return {
223
261
  ...packageSource,
224
262
  strategy: 'install',
225
- modernPackageVersion: explicitVersion ?? (isBleedingDevCreatePackage(createPackage) ? packageSource.modernPackageVersion : readBleedingDevFrameworkVersionFromRegistry()),
263
+ modernPackageVersion: explicitVersion ?? (isBleedingDevCreatePackage(createPackage) ? packageSource.modernPackageVersion : readBleedingDevFrameworkVersionFromRegistry(packageSource.modernPackageVersion)),
226
264
  aliasScope,
227
265
  aliasPackageNamePrefix: getOptionValue(args, [
228
266
  '--ultramodern-package-name-prefix'
@@ -230,7 +268,12 @@ function resolveInstallBackedPackageSource(args, createPackage, packageSource) {
230
268
  };
231
269
  }
232
270
  function resolveWorkspacePackageSource(args, createPackage, packageSource) {
233
- if (hasExplicitUltramodernPackageSource(args, 'workspace')) return {
271
+ const workspaceProtocolRequested = args.includes(WORKSPACE_PROTOCOL_FLAG);
272
+ if (workspaceProtocolRequested && hasExplicitUltramodernPackageSource(args, 'install')) {
273
+ console.error(`${WORKSPACE_PROTOCOL_FLAG} conflicts with --ultramodern-package-source=install`);
274
+ process.exit(1);
275
+ }
276
+ if (workspaceProtocolRequested || hasExplicitUltramodernPackageSource(args, 'workspace')) return {
234
277
  ...packageSource,
235
278
  strategy: 'workspace',
236
279
  modernPackageVersion: WORKSPACE_PACKAGE_VERSION
@@ -245,7 +288,8 @@ function runSetupCommand(command, args, options = {}) {
245
288
  'ignore',
246
289
  'pipe',
247
290
  'pipe'
248
- ]
291
+ ],
292
+ timeout: options.timeoutMs
249
293
  });
250
294
  }
251
295
  function commandExists(command) {
@@ -260,26 +304,9 @@ function commandExists(command) {
260
304
  return false;
261
305
  }
262
306
  }
263
- function installGitForGeneratedProject() {
307
+ function assertGitAvailableForGeneratedProject() {
264
308
  if (commandExists('git')) return;
265
- const runShell = (script)=>runSetupCommand('sh', [
266
- '-lc',
267
- script
268
- ], {
269
- stdio: 'inherit'
270
- });
271
- const sudo = 'function' == typeof process.getuid && 0 === process.getuid() ? '' : 'sudo ';
272
- if (commandExists('brew')) runSetupCommand('brew', [
273
- 'install',
274
- 'git'
275
- ], {
276
- stdio: 'inherit'
277
- });
278
- else if ('linux' === process.platform && commandExists('apt-get')) runShell(`${sudo}apt-get update && ${sudo}apt-get install -y git`);
279
- else if ('linux' === process.platform && commandExists('dnf')) runShell(`${sudo}dnf install -y git`);
280
- else if ('linux' === process.platform && commandExists('yum')) runShell(`${sudo}yum install -y git`);
281
- else if ('linux' === process.platform && commandExists('apk')) runShell('apk add --no-cache git');
282
- if (!commandExists('git')) throw new Error('Git is required for UltraModern setup. Install git and rerun create, or run pnpm skills:install after installing git.');
309
+ throw new Error('Git is required for UltraModern setup. Install git yourself (for example "brew install git" or "sudo apt-get install git") and rerun create. This tool never installs system packages on your behalf.');
283
310
  }
284
311
  function isInsideGitWorkTree(targetDir) {
285
312
  try {
@@ -294,7 +321,7 @@ function isInsideGitWorkTree(targetDir) {
294
321
  }
295
322
  }
296
323
  function initializeGeneratedGitRepository(targetDir) {
297
- installGitForGeneratedProject();
324
+ assertGitAvailableForGeneratedProject();
298
325
  if (isInsideGitWorkTree(targetDir)) return;
299
326
  try {
300
327
  runSetupCommand('git', [
@@ -336,6 +363,7 @@ async function getProjectName() {
336
363
  const optionWithValue = new Set([
337
364
  '--lang',
338
365
  '-l',
366
+ BFF_RUNTIME_OPTION,
339
367
  '--ultramodern-package-source',
340
368
  '--ultramodern-package-version',
341
369
  '--ultramodern-package-registry',
@@ -349,7 +377,8 @@ async function getProjectName() {
349
377
  '-v',
350
378
  '--tailwind',
351
379
  '--no-tailwind',
352
- '--workspace',
380
+ BFF_FLAG,
381
+ WORKSPACE_PROTOCOL_FLAG,
353
382
  '--vertical',
354
383
  LEGACY_MODERN_JS_FLAG
355
384
  ]);
@@ -361,7 +390,7 @@ async function getProjectName() {
361
390
  i += 1;
362
391
  continue;
363
392
  }
364
- if (!(arg.startsWith('--lang=') || arg.startsWith('--ultramodern-package-source=') || arg.startsWith('--ultramodern-package-version=') || arg.startsWith('--ultramodern-package-registry=') || arg.startsWith('--ultramodern-package-scope=') || arg.startsWith('--ultramodern-package-name-prefix='))) positionalArgs.push(arg);
393
+ if (!(arg.startsWith('--lang=') || arg.startsWith(`${BFF_RUNTIME_OPTION}=`) || arg.startsWith('--ultramodern-package-source=') || arg.startsWith('--ultramodern-package-version=') || arg.startsWith('--ultramodern-package-registry=') || arg.startsWith('--ultramodern-package-scope=') || arg.startsWith('--ultramodern-package-name-prefix='))) positionalArgs.push(arg);
365
394
  }
366
395
  }
367
396
  if (positionalArgs.length > 1) {
@@ -403,6 +432,7 @@ async function main() {
403
432
  delegateLegacyModernJsSetup(args);
404
433
  return;
405
434
  }
435
+ detectBffRuntime(args);
406
436
  console.log(`\n${i18n.t(localeKeys.message.welcome)}\n`);
407
437
  const { name: projectName, useCurrentDir } = await getProjectName();
408
438
  const targetDir = useCurrentDir ? process.cwd() : node_path.isAbsolute(projectName) ? projectName : node_path.resolve(process.cwd(), projectName);
@@ -28,8 +28,12 @@ const EN_LOCALE = {
28
28
  optionVersion: ' -v, --version Display version information',
29
29
  optionLang: ' -l, --lang Set the language (en default; zh opt-in)',
30
30
  optionTailwind: ' --no-tailwind Disable default Tailwind CSS v4 workspace styling',
31
+ optionBff: ' --bff Keep the default Effect BFF scaffolding (every MicroVertical ships an Effect BFF)',
32
+ optionBffRuntime: ' --bff-runtime Select the BFF runtime for scaffolded MicroVerticals (supported: effect; default: effect)',
31
33
  optionWorkspace: ' --workspace Use workspace protocol for @modern-js dependencies (for local monorepo testing)',
32
34
  optionUltramodernPackageSource: ' --ultramodern-package-source Select UltraModern package source (workspace or install; BleedingDev defaults to install aliases)',
35
+ optionUltramodernPackageVersion: ' --ultramodern-package-version Pin the exact BleedingDev framework cohort for install package sources',
36
+ optionUltramodernPackageRegistry: ' --ultramodern-package-registry npm registry URL used for install package sources',
33
37
  optionUltramodernPackageScope: ' --ultramodern-package-scope Publish scope for npm alias installs (for example bleedingdev)',
34
38
  optionUltramodernPackageNamePrefix: ' --ultramodern-package-name-prefix Prefix for npm alias package names (default: modern-js-)',
35
39
  optionVertical: ' --vertical Mutate the current existing UltraModern workspace and wire a MicroVertical named <project-name>',
@@ -41,16 +45,11 @@ const EN_LOCALE = {
41
45
  example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
42
46
  example5: ' pnpm dlx @bleedingdev/modern-js-create .',
43
47
  example6: ' pnpm dlx @bleedingdev/modern-js-create my-workspace --workspace',
44
- example7: '',
45
- example8: '',
46
- example9: '',
47
- example10: '',
48
- example11: '',
49
- example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
48
+ example7: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
50
49
  moreInfo: '📚 Learn more: https://modernjs.dev'
51
50
  },
52
51
  version: {
53
- message: '@bleedingdev/modern-js-create version: {version}'
52
+ message: '{name} version: {version}'
54
53
  }
55
54
  };
56
55
  export { EN_LOCALE };