@bleedingdev/modern-js-create 3.4.0-ultramodern.13 → 3.4.0-ultramodern.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +25 -7
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +18 -7
- package/dist/esm/ultramodern-workspace/add-vertical.js +26 -8
- package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
- package/dist/esm/ultramodern-workspace/write-workspace.js +19 -8
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +26 -8
- package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +19 -8
- package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
- package/package.json +5 -3
|
@@ -589,9 +589,9 @@ function addUltramodernVertical(options) {
|
|
|
589
589
|
},
|
|
590
590
|
...updatedVerticals
|
|
591
591
|
]));
|
|
592
|
-
const
|
|
593
|
-
const
|
|
594
|
-
const
|
|
592
|
+
const preliminaryAfterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
|
|
593
|
+
const preliminaryDiff = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, preliminaryAfterFiles);
|
|
594
|
+
const preliminaryResult = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
|
|
595
595
|
operation: 'vertical',
|
|
596
596
|
workspaceRoot: options.workspaceRoot,
|
|
597
597
|
packageScope: scope,
|
|
@@ -599,15 +599,33 @@ function addUltramodernVertical(options) {
|
|
|
599
599
|
createdApps: [
|
|
600
600
|
vertical
|
|
601
601
|
],
|
|
602
|
-
createdPaths,
|
|
603
|
-
rewrittenPaths
|
|
602
|
+
createdPaths: preliminaryDiff.createdPaths,
|
|
603
|
+
rewrittenPaths: preliminaryDiff.rewrittenPaths
|
|
604
604
|
});
|
|
605
605
|
(0, external_overlays_cjs_namespaceObject.runCodeSmithOverlays)({
|
|
606
606
|
workspaceRoot: options.workspaceRoot,
|
|
607
607
|
overlays: options.overlays,
|
|
608
|
-
result
|
|
608
|
+
result: preliminaryResult
|
|
609
|
+
});
|
|
610
|
+
const afterOverlaysFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
|
|
611
|
+
const changedPaths = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterOverlaysFiles);
|
|
612
|
+
(0, external_fs_io_cjs_namespaceObject.formatGeneratedWorkspaceFiles)(options.workspaceRoot, [
|
|
613
|
+
...changedPaths.createdPaths,
|
|
614
|
+
...changedPaths.rewrittenPaths
|
|
615
|
+
]);
|
|
616
|
+
const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
|
|
617
|
+
const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
|
|
618
|
+
return (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
|
|
619
|
+
operation: 'vertical',
|
|
620
|
+
workspaceRoot: options.workspaceRoot,
|
|
621
|
+
packageScope: scope,
|
|
622
|
+
packageSource,
|
|
623
|
+
createdApps: [
|
|
624
|
+
vertical
|
|
625
|
+
],
|
|
626
|
+
createdPaths,
|
|
627
|
+
rewrittenPaths
|
|
609
628
|
});
|
|
610
|
-
return result;
|
|
611
629
|
}
|
|
612
630
|
exports.addShellWorkspaceDependency = __webpack_exports__.addShellWorkspaceDependency;
|
|
613
631
|
exports.addShellZephyrDependency = __webpack_exports__.addShellZephyrDependency;
|
|
@@ -46,6 +46,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
46
46
|
createPackageRoot: ()=>createPackageRoot,
|
|
47
47
|
ensureInsideRoot: ()=>ensureInsideRoot,
|
|
48
48
|
fileTemplatesDir: ()=>fileTemplatesDir,
|
|
49
|
+
formatGeneratedWorkspaceFiles: ()=>formatGeneratedWorkspaceFiles,
|
|
49
50
|
hashFile: ()=>hashFile,
|
|
50
51
|
hashTemplateTree: ()=>hashTemplateTree,
|
|
51
52
|
readFileTemplate: ()=>readFileTemplate,
|
|
@@ -58,19 +59,53 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
58
59
|
writeJson: ()=>writeJson,
|
|
59
60
|
writeJsonFile: ()=>writeJsonFile
|
|
60
61
|
});
|
|
62
|
+
const external_node_child_process_namespaceObject = require("node:child_process");
|
|
61
63
|
const external_node_crypto_namespaceObject = require("node:crypto");
|
|
62
64
|
var external_node_crypto_default = /*#__PURE__*/ __webpack_require__.n(external_node_crypto_namespaceObject);
|
|
63
65
|
const external_node_fs_namespaceObject = require("node:fs");
|
|
64
66
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
67
|
+
const external_node_module_namespaceObject = require("node:module");
|
|
65
68
|
const external_node_path_namespaceObject = require("node:path");
|
|
66
69
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
67
70
|
const external_node_url_namespaceObject = require("node:url");
|
|
68
71
|
const external_create_package_root_cjs_namespaceObject = require("../create-package-root.cjs");
|
|
69
72
|
const external_naming_cjs_namespaceObject = require("./naming.cjs");
|
|
70
73
|
const fs_io_dirname = external_node_path_default().dirname((0, external_node_url_namespaceObject.fileURLToPath)(__rslib_import_meta_url__));
|
|
74
|
+
const fs_io_require = (0, external_node_module_namespaceObject.createRequire)(__rslib_import_meta_url__);
|
|
71
75
|
const createPackageRoot = (0, external_create_package_root_cjs_namespaceObject.resolveCreatePackageRoot)(fs_io_dirname);
|
|
72
76
|
const workspaceTemplateDir = external_node_path_default().join(createPackageRoot, 'template-workspace');
|
|
73
77
|
const fileTemplatesDir = external_node_path_default().join(createPackageRoot, 'templates');
|
|
78
|
+
const preformatConfigDir = '.modern-js';
|
|
79
|
+
const preformatConfigPath = external_node_path_default().join(preformatConfigDir, 'ultramodern-preformat.oxfmt.config.mjs');
|
|
80
|
+
const workspaceOxfmtIgnorePatterns = [
|
|
81
|
+
'.agents',
|
|
82
|
+
'.codex/skills',
|
|
83
|
+
'.output',
|
|
84
|
+
'**/*.json',
|
|
85
|
+
'dist',
|
|
86
|
+
'node_modules',
|
|
87
|
+
'repos/**',
|
|
88
|
+
'.modern',
|
|
89
|
+
'.modernjs',
|
|
90
|
+
'**/modern-tanstack/**',
|
|
91
|
+
'**/routeTree.gen.*'
|
|
92
|
+
];
|
|
93
|
+
const formattableExtensions = new Set([
|
|
94
|
+
'.cjs',
|
|
95
|
+
'.cts',
|
|
96
|
+
'.js',
|
|
97
|
+
'.json',
|
|
98
|
+
'.jsonc',
|
|
99
|
+
'.jsx',
|
|
100
|
+
'.mjs',
|
|
101
|
+
'.mts',
|
|
102
|
+
'.md',
|
|
103
|
+
'.mdx',
|
|
104
|
+
'.ts',
|
|
105
|
+
'.tsx',
|
|
106
|
+
'.yaml',
|
|
107
|
+
'.yml'
|
|
108
|
+
]);
|
|
74
109
|
function readFileTemplate(relativePath) {
|
|
75
110
|
return external_node_fs_default().readFileSync(external_node_path_default().join(fileTemplatesDir, relativePath), 'utf-8');
|
|
76
111
|
}
|
|
@@ -106,6 +141,86 @@ function writeFileReplacing(targetDir, relativePath, content) {
|
|
|
106
141
|
function writeJson(targetDir, relativePath, value) {
|
|
107
142
|
writeFile(targetDir, relativePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
108
143
|
}
|
|
144
|
+
function formatGeneratedWorkspaceFiles(targetDir, relativePaths) {
|
|
145
|
+
const oxfmtBin = resolveOxfmtBin();
|
|
146
|
+
const oxfmtConfigPath = writePreformatConfig(targetDir);
|
|
147
|
+
const targets = void 0 === relativePaths ? [
|
|
148
|
+
targetDir,
|
|
149
|
+
`!${(0, external_naming_cjs_namespaceObject.normalizePath)(external_node_path_default().join(targetDir, 'repos'))}/**`
|
|
150
|
+
] : relativePaths.filter((relativePath)=>formattableExtensions.has(external_node_path_default().extname(relativePath))).map((relativePath)=>external_node_path_default().join(targetDir, relativePath));
|
|
151
|
+
if (0 === targets.length) return void removePreformatConfig(targetDir);
|
|
152
|
+
try {
|
|
153
|
+
const result = (0, external_node_child_process_namespaceObject.spawnSync)(process.execPath, [
|
|
154
|
+
oxfmtBin,
|
|
155
|
+
'--config',
|
|
156
|
+
oxfmtConfigPath,
|
|
157
|
+
'--no-error-on-unmatched-pattern',
|
|
158
|
+
...targets
|
|
159
|
+
], {
|
|
160
|
+
cwd: targetDir,
|
|
161
|
+
encoding: 'utf-8',
|
|
162
|
+
env: {
|
|
163
|
+
...process.env,
|
|
164
|
+
FORCE_COLOR: '0'
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
if (0 !== result.status) {
|
|
168
|
+
const detail = [
|
|
169
|
+
result.stderr.trim(),
|
|
170
|
+
result.stdout.trim()
|
|
171
|
+
].filter(Boolean).join('\n');
|
|
172
|
+
throw new Error([
|
|
173
|
+
'Failed to format generated UltraModern workspace output.',
|
|
174
|
+
detail
|
|
175
|
+
].filter(Boolean).join('\n'));
|
|
176
|
+
}
|
|
177
|
+
} finally{
|
|
178
|
+
removePreformatConfig(targetDir);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function writePreformatConfig(targetDir) {
|
|
182
|
+
const configPath = external_node_path_default().join(targetDir, preformatConfigPath);
|
|
183
|
+
external_node_fs_default().mkdirSync(external_node_path_default().dirname(configPath), {
|
|
184
|
+
recursive: true
|
|
185
|
+
});
|
|
186
|
+
const oxfmtUrl = (0, external_node_url_namespaceObject.pathToFileURL)(resolveOxfmtEntry()).href;
|
|
187
|
+
const ultraciteConfigUrl = (0, external_node_url_namespaceObject.pathToFileURL)(resolveUltraciteOxfmtConfig()).href;
|
|
188
|
+
external_node_fs_default().writeFileSync(configPath, [
|
|
189
|
+
`import { defineConfig } from ${JSON.stringify(oxfmtUrl)};`,
|
|
190
|
+
`import ultracite from ${JSON.stringify(ultraciteConfigUrl)};`,
|
|
191
|
+
'',
|
|
192
|
+
'export default defineConfig({',
|
|
193
|
+
' extends: [ultracite],',
|
|
194
|
+
' ignorePatterns: [',
|
|
195
|
+
...workspaceOxfmtIgnorePatterns.map((pattern)=>` ${JSON.stringify(pattern)},`),
|
|
196
|
+
' ],',
|
|
197
|
+
' singleQuote: true,',
|
|
198
|
+
'});',
|
|
199
|
+
''
|
|
200
|
+
].join('\n'), 'utf-8');
|
|
201
|
+
return configPath;
|
|
202
|
+
}
|
|
203
|
+
function removePreformatConfig(targetDir) {
|
|
204
|
+
external_node_fs_default().rmSync(external_node_path_default().join(targetDir, preformatConfigPath), {
|
|
205
|
+
force: true
|
|
206
|
+
});
|
|
207
|
+
try {
|
|
208
|
+
external_node_fs_default().rmdirSync(external_node_path_default().join(targetDir, preformatConfigDir));
|
|
209
|
+
} catch {}
|
|
210
|
+
}
|
|
211
|
+
function resolveOxfmtBin() {
|
|
212
|
+
const packageJsonPath = fs_io_require.resolve('oxfmt/package.json');
|
|
213
|
+
const packageJson = JSON.parse(external_node_fs_default().readFileSync(packageJsonPath, 'utf-8'));
|
|
214
|
+
const binPath = 'string' == typeof packageJson.bin ? packageJson.bin : packageJson.bin?.oxfmt;
|
|
215
|
+
if ('string' != typeof binPath || 0 === binPath.length) throw new Error('Unable to resolve oxfmt binary from package metadata.');
|
|
216
|
+
return external_node_path_default().join(external_node_path_default().dirname(packageJsonPath), binPath);
|
|
217
|
+
}
|
|
218
|
+
function resolveOxfmtEntry() {
|
|
219
|
+
return fs_io_require.resolve('oxfmt');
|
|
220
|
+
}
|
|
221
|
+
function resolveUltraciteOxfmtConfig() {
|
|
222
|
+
return fs_io_require.resolve('ultracite/oxfmt');
|
|
223
|
+
}
|
|
109
224
|
function renderTemplate(template, data) {
|
|
110
225
|
return template.replace(/\{\{(\w+)\}\}/g, (match, key)=>data[key] ?? match);
|
|
111
226
|
}
|
|
@@ -156,6 +271,7 @@ exports.copyRootTemplate = __webpack_exports__.copyRootTemplate;
|
|
|
156
271
|
exports.createPackageRoot = __webpack_exports__.createPackageRoot;
|
|
157
272
|
exports.ensureInsideRoot = __webpack_exports__.ensureInsideRoot;
|
|
158
273
|
exports.fileTemplatesDir = __webpack_exports__.fileTemplatesDir;
|
|
274
|
+
exports.formatGeneratedWorkspaceFiles = __webpack_exports__.formatGeneratedWorkspaceFiles;
|
|
159
275
|
exports.hashFile = __webpack_exports__.hashFile;
|
|
160
276
|
exports.hashTemplateTree = __webpack_exports__.hashTemplateTree;
|
|
161
277
|
exports.readFileTemplate = __webpack_exports__.readFileTemplate;
|
|
@@ -174,6 +290,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
174
290
|
"createPackageRoot",
|
|
175
291
|
"ensureInsideRoot",
|
|
176
292
|
"fileTemplatesDir",
|
|
293
|
+
"formatGeneratedWorkspaceFiles",
|
|
177
294
|
"hashFile",
|
|
178
295
|
"hashTemplateTree",
|
|
179
296
|
"readFileTemplate",
|
|
@@ -192,23 +192,34 @@ function generateUltramodernWorkspace(options) {
|
|
|
192
192
|
for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals, bridge);
|
|
193
193
|
writeSharedPackages(options.targetDir, scope);
|
|
194
194
|
(0, external_workspace_scripts_cjs_namespaceObject.writeGeneratedWorkspaceScripts)(options.targetDir, scope, enableTailwind, initialVerticals);
|
|
195
|
-
const
|
|
196
|
-
const
|
|
197
|
-
const
|
|
195
|
+
const preliminaryAfterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
|
|
196
|
+
const preliminaryDiff = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, preliminaryAfterFiles);
|
|
197
|
+
const preliminaryResult = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
|
|
198
198
|
operation: 'workspace',
|
|
199
199
|
workspaceRoot: options.targetDir,
|
|
200
200
|
packageScope: scope,
|
|
201
201
|
packageSource,
|
|
202
202
|
createdApps,
|
|
203
|
-
createdPaths,
|
|
204
|
-
rewrittenPaths
|
|
203
|
+
createdPaths: preliminaryDiff.createdPaths,
|
|
204
|
+
rewrittenPaths: preliminaryDiff.rewrittenPaths
|
|
205
205
|
});
|
|
206
206
|
(0, external_overlays_cjs_namespaceObject.runCodeSmithOverlays)({
|
|
207
207
|
workspaceRoot: options.targetDir,
|
|
208
208
|
overlays: options.overlays,
|
|
209
|
-
result
|
|
209
|
+
result: preliminaryResult
|
|
210
|
+
});
|
|
211
|
+
(0, external_fs_io_cjs_namespaceObject.formatGeneratedWorkspaceFiles)(options.targetDir);
|
|
212
|
+
const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
|
|
213
|
+
const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
|
|
214
|
+
return (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
|
|
215
|
+
operation: 'workspace',
|
|
216
|
+
workspaceRoot: options.targetDir,
|
|
217
|
+
packageScope: scope,
|
|
218
|
+
packageSource,
|
|
219
|
+
createdApps,
|
|
220
|
+
createdPaths,
|
|
221
|
+
rewrittenPaths
|
|
210
222
|
});
|
|
211
|
-
return result;
|
|
212
223
|
}
|
|
213
224
|
exports.createCompactUltramodernConfig = __webpack_exports__.createCompactUltramodernConfig;
|
|
214
225
|
exports.generateUltramodernWorkspace = __webpack_exports__.generateUltramodernWorkspace;
|
|
@@ -7,7 +7,7 @@ import { createAppEnvDts, createAppRuntimeConfig, createShellFrameComponent } fr
|
|
|
7
7
|
import { createShellPage, createShellRemoteComponents } from "./demo-components.js";
|
|
8
8
|
import { GENERATED_CONTRACT_PATH, ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, remoteDependencyAlias, shellApp, zephyrRemoteDependency } from "./descriptors.js";
|
|
9
9
|
import { createShellEffectClient, effectApiTopologyMetadata } from "./effect-api.js";
|
|
10
|
-
import { readJsonFile, writeFileReplacing, writeJsonFile } from "./fs-io.js";
|
|
10
|
+
import { formatGeneratedWorkspaceFiles, readJsonFile, writeFileReplacing, writeJsonFile } from "./fs-io.js";
|
|
11
11
|
import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
|
|
12
12
|
import { createAppPublicLocaleMessages } from "./locales.js";
|
|
13
13
|
import { createShellModuleFederationConfig } from "./module-federation.js";
|
|
@@ -530,9 +530,9 @@ function addUltramodernVertical(options) {
|
|
|
530
530
|
},
|
|
531
531
|
...updatedVerticals
|
|
532
532
|
]));
|
|
533
|
-
const
|
|
534
|
-
const
|
|
535
|
-
const
|
|
533
|
+
const preliminaryAfterFiles = createFileSnapshot(options.workspaceRoot);
|
|
534
|
+
const preliminaryDiff = diffFileSnapshots(beforeFiles, preliminaryAfterFiles);
|
|
535
|
+
const preliminaryResult = createGenerationResult({
|
|
536
536
|
operation: 'vertical',
|
|
537
537
|
workspaceRoot: options.workspaceRoot,
|
|
538
538
|
packageScope: scope,
|
|
@@ -540,14 +540,32 @@ function addUltramodernVertical(options) {
|
|
|
540
540
|
createdApps: [
|
|
541
541
|
vertical
|
|
542
542
|
],
|
|
543
|
-
createdPaths,
|
|
544
|
-
rewrittenPaths
|
|
543
|
+
createdPaths: preliminaryDiff.createdPaths,
|
|
544
|
+
rewrittenPaths: preliminaryDiff.rewrittenPaths
|
|
545
545
|
});
|
|
546
546
|
runCodeSmithOverlays({
|
|
547
547
|
workspaceRoot: options.workspaceRoot,
|
|
548
548
|
overlays: options.overlays,
|
|
549
|
-
result
|
|
549
|
+
result: preliminaryResult
|
|
550
|
+
});
|
|
551
|
+
const afterOverlaysFiles = createFileSnapshot(options.workspaceRoot);
|
|
552
|
+
const changedPaths = diffFileSnapshots(beforeFiles, afterOverlaysFiles);
|
|
553
|
+
formatGeneratedWorkspaceFiles(options.workspaceRoot, [
|
|
554
|
+
...changedPaths.createdPaths,
|
|
555
|
+
...changedPaths.rewrittenPaths
|
|
556
|
+
]);
|
|
557
|
+
const afterFiles = createFileSnapshot(options.workspaceRoot);
|
|
558
|
+
const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
|
|
559
|
+
return createGenerationResult({
|
|
560
|
+
operation: 'vertical',
|
|
561
|
+
workspaceRoot: options.workspaceRoot,
|
|
562
|
+
packageScope: scope,
|
|
563
|
+
packageSource,
|
|
564
|
+
createdApps: [
|
|
565
|
+
vertical
|
|
566
|
+
],
|
|
567
|
+
createdPaths,
|
|
568
|
+
rewrittenPaths
|
|
550
569
|
});
|
|
551
|
-
return result;
|
|
552
570
|
}
|
|
553
571
|
export { addShellWorkspaceDependency, addShellZephyrDependency, addUltramodernVertical, assertCanCreate, assertValidVerticalName, existingBridgeConfig, existingPackageSource, existingTailwindEnabled, nextAvailablePort, ownershipEntry, planUltramodernVertical, prepareAddUltramodernVertical, rewriteShellAppFiles, updateRootWorkspaceScripts, verticalTopologyEntry, verticalsFromTopology };
|
|
@@ -1,13 +1,47 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
1
2
|
import node_crypto from "node:crypto";
|
|
2
3
|
import node_fs from "node:fs";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
3
5
|
import node_path from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
7
|
import { resolveCreatePackageRoot } from "../create-package-root.js";
|
|
6
8
|
import { normalizePath } from "./naming.js";
|
|
7
9
|
const fs_io_dirname = node_path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const fs_io_require = createRequire(import.meta.url);
|
|
8
11
|
const createPackageRoot = resolveCreatePackageRoot(fs_io_dirname);
|
|
9
12
|
const workspaceTemplateDir = node_path.join(createPackageRoot, 'template-workspace');
|
|
10
13
|
const fileTemplatesDir = node_path.join(createPackageRoot, 'templates');
|
|
14
|
+
const preformatConfigDir = '.modern-js';
|
|
15
|
+
const preformatConfigPath = node_path.join(preformatConfigDir, 'ultramodern-preformat.oxfmt.config.mjs');
|
|
16
|
+
const workspaceOxfmtIgnorePatterns = [
|
|
17
|
+
'.agents',
|
|
18
|
+
'.codex/skills',
|
|
19
|
+
'.output',
|
|
20
|
+
'**/*.json',
|
|
21
|
+
'dist',
|
|
22
|
+
'node_modules',
|
|
23
|
+
'repos/**',
|
|
24
|
+
'.modern',
|
|
25
|
+
'.modernjs',
|
|
26
|
+
'**/modern-tanstack/**',
|
|
27
|
+
'**/routeTree.gen.*'
|
|
28
|
+
];
|
|
29
|
+
const formattableExtensions = new Set([
|
|
30
|
+
'.cjs',
|
|
31
|
+
'.cts',
|
|
32
|
+
'.js',
|
|
33
|
+
'.json',
|
|
34
|
+
'.jsonc',
|
|
35
|
+
'.jsx',
|
|
36
|
+
'.mjs',
|
|
37
|
+
'.mts',
|
|
38
|
+
'.md',
|
|
39
|
+
'.mdx',
|
|
40
|
+
'.ts',
|
|
41
|
+
'.tsx',
|
|
42
|
+
'.yaml',
|
|
43
|
+
'.yml'
|
|
44
|
+
]);
|
|
11
45
|
function readFileTemplate(relativePath) {
|
|
12
46
|
return node_fs.readFileSync(node_path.join(fileTemplatesDir, relativePath), 'utf-8');
|
|
13
47
|
}
|
|
@@ -43,6 +77,86 @@ function writeFileReplacing(targetDir, relativePath, content) {
|
|
|
43
77
|
function writeJson(targetDir, relativePath, value) {
|
|
44
78
|
writeFile(targetDir, relativePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
45
79
|
}
|
|
80
|
+
function formatGeneratedWorkspaceFiles(targetDir, relativePaths) {
|
|
81
|
+
const oxfmtBin = resolveOxfmtBin();
|
|
82
|
+
const oxfmtConfigPath = writePreformatConfig(targetDir);
|
|
83
|
+
const targets = void 0 === relativePaths ? [
|
|
84
|
+
targetDir,
|
|
85
|
+
`!${normalizePath(node_path.join(targetDir, 'repos'))}/**`
|
|
86
|
+
] : relativePaths.filter((relativePath)=>formattableExtensions.has(node_path.extname(relativePath))).map((relativePath)=>node_path.join(targetDir, relativePath));
|
|
87
|
+
if (0 === targets.length) return void removePreformatConfig(targetDir);
|
|
88
|
+
try {
|
|
89
|
+
const result = spawnSync(process.execPath, [
|
|
90
|
+
oxfmtBin,
|
|
91
|
+
'--config',
|
|
92
|
+
oxfmtConfigPath,
|
|
93
|
+
'--no-error-on-unmatched-pattern',
|
|
94
|
+
...targets
|
|
95
|
+
], {
|
|
96
|
+
cwd: targetDir,
|
|
97
|
+
encoding: 'utf-8',
|
|
98
|
+
env: {
|
|
99
|
+
...process.env,
|
|
100
|
+
FORCE_COLOR: '0'
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
if (0 !== result.status) {
|
|
104
|
+
const detail = [
|
|
105
|
+
result.stderr.trim(),
|
|
106
|
+
result.stdout.trim()
|
|
107
|
+
].filter(Boolean).join('\n');
|
|
108
|
+
throw new Error([
|
|
109
|
+
'Failed to format generated UltraModern workspace output.',
|
|
110
|
+
detail
|
|
111
|
+
].filter(Boolean).join('\n'));
|
|
112
|
+
}
|
|
113
|
+
} finally{
|
|
114
|
+
removePreformatConfig(targetDir);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function writePreformatConfig(targetDir) {
|
|
118
|
+
const configPath = node_path.join(targetDir, preformatConfigPath);
|
|
119
|
+
node_fs.mkdirSync(node_path.dirname(configPath), {
|
|
120
|
+
recursive: true
|
|
121
|
+
});
|
|
122
|
+
const oxfmtUrl = pathToFileURL(resolveOxfmtEntry()).href;
|
|
123
|
+
const ultraciteConfigUrl = pathToFileURL(resolveUltraciteOxfmtConfig()).href;
|
|
124
|
+
node_fs.writeFileSync(configPath, [
|
|
125
|
+
`import { defineConfig } from ${JSON.stringify(oxfmtUrl)};`,
|
|
126
|
+
`import ultracite from ${JSON.stringify(ultraciteConfigUrl)};`,
|
|
127
|
+
'',
|
|
128
|
+
'export default defineConfig({',
|
|
129
|
+
' extends: [ultracite],',
|
|
130
|
+
' ignorePatterns: [',
|
|
131
|
+
...workspaceOxfmtIgnorePatterns.map((pattern)=>` ${JSON.stringify(pattern)},`),
|
|
132
|
+
' ],',
|
|
133
|
+
' singleQuote: true,',
|
|
134
|
+
'});',
|
|
135
|
+
''
|
|
136
|
+
].join('\n'), 'utf-8');
|
|
137
|
+
return configPath;
|
|
138
|
+
}
|
|
139
|
+
function removePreformatConfig(targetDir) {
|
|
140
|
+
node_fs.rmSync(node_path.join(targetDir, preformatConfigPath), {
|
|
141
|
+
force: true
|
|
142
|
+
});
|
|
143
|
+
try {
|
|
144
|
+
node_fs.rmdirSync(node_path.join(targetDir, preformatConfigDir));
|
|
145
|
+
} catch {}
|
|
146
|
+
}
|
|
147
|
+
function resolveOxfmtBin() {
|
|
148
|
+
const packageJsonPath = fs_io_require.resolve('oxfmt/package.json');
|
|
149
|
+
const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
150
|
+
const binPath = 'string' == typeof packageJson.bin ? packageJson.bin : packageJson.bin?.oxfmt;
|
|
151
|
+
if ('string' != typeof binPath || 0 === binPath.length) throw new Error('Unable to resolve oxfmt binary from package metadata.');
|
|
152
|
+
return node_path.join(node_path.dirname(packageJsonPath), binPath);
|
|
153
|
+
}
|
|
154
|
+
function resolveOxfmtEntry() {
|
|
155
|
+
return fs_io_require.resolve('oxfmt');
|
|
156
|
+
}
|
|
157
|
+
function resolveUltraciteOxfmtConfig() {
|
|
158
|
+
return fs_io_require.resolve('ultracite/oxfmt');
|
|
159
|
+
}
|
|
46
160
|
function renderTemplate(template, data) {
|
|
47
161
|
return template.replace(/\{\{(\w+)\}\}/g, (match, key)=>data[key] ?? match);
|
|
48
162
|
}
|
|
@@ -87,4 +201,4 @@ function readJsonFile(filePath) {
|
|
|
87
201
|
function writeJsonFile(filePath, value) {
|
|
88
202
|
node_fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
|
|
89
203
|
}
|
|
90
|
-
export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
|
|
204
|
+
export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, formatGeneratedWorkspaceFiles, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
|
|
@@ -5,7 +5,7 @@ import { createDevelopmentOverlay, createOwnership, createTopology, createUltram
|
|
|
5
5
|
import { createLayout, createRemoteEntry, createRemoteExposeComponent, createRemotePage, createShellPage, createShellRemoteComponents, remoteComponentOutputPath } from "./demo-components.js";
|
|
6
6
|
import { ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createShellHost, sharedPackages, shellApp } from "./descriptors.js";
|
|
7
7
|
import { createEffectClient, createEffectServiceEntry, createEffectSharedApi, createShellEffectClient } from "./effect-api.js";
|
|
8
|
-
import { copyRootTemplate, writeFile, writeFileReplacing, writeJson } from "./fs-io.js";
|
|
8
|
+
import { copyRootTemplate, formatGeneratedWorkspaceFiles, writeFile, writeFileReplacing, writeJson } from "./fs-io.js";
|
|
9
9
|
import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
|
|
10
10
|
import { createAppPublicLocaleMessages } from "./locales.js";
|
|
11
11
|
import { createAppModernConfig, createRemoteModuleFederationConfig, createShellModuleFederationConfig, createUltramodernBuildModule, createUltramodernBuildReexportModule } from "./module-federation.js";
|
|
@@ -147,22 +147,33 @@ function generateUltramodernWorkspace(options) {
|
|
|
147
147
|
for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals, bridge);
|
|
148
148
|
writeSharedPackages(options.targetDir, scope);
|
|
149
149
|
writeGeneratedWorkspaceScripts(options.targetDir, scope, enableTailwind, initialVerticals);
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
const
|
|
150
|
+
const preliminaryAfterFiles = createFileSnapshot(options.targetDir);
|
|
151
|
+
const preliminaryDiff = diffFileSnapshots(beforeFiles, preliminaryAfterFiles);
|
|
152
|
+
const preliminaryResult = createGenerationResult({
|
|
153
153
|
operation: 'workspace',
|
|
154
154
|
workspaceRoot: options.targetDir,
|
|
155
155
|
packageScope: scope,
|
|
156
156
|
packageSource,
|
|
157
157
|
createdApps,
|
|
158
|
-
createdPaths,
|
|
159
|
-
rewrittenPaths
|
|
158
|
+
createdPaths: preliminaryDiff.createdPaths,
|
|
159
|
+
rewrittenPaths: preliminaryDiff.rewrittenPaths
|
|
160
160
|
});
|
|
161
161
|
runCodeSmithOverlays({
|
|
162
162
|
workspaceRoot: options.targetDir,
|
|
163
163
|
overlays: options.overlays,
|
|
164
|
-
result
|
|
164
|
+
result: preliminaryResult
|
|
165
|
+
});
|
|
166
|
+
formatGeneratedWorkspaceFiles(options.targetDir);
|
|
167
|
+
const afterFiles = createFileSnapshot(options.targetDir);
|
|
168
|
+
const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
|
|
169
|
+
return createGenerationResult({
|
|
170
|
+
operation: 'workspace',
|
|
171
|
+
workspaceRoot: options.targetDir,
|
|
172
|
+
packageScope: scope,
|
|
173
|
+
packageSource,
|
|
174
|
+
createdApps,
|
|
175
|
+
createdPaths,
|
|
176
|
+
rewrittenPaths
|
|
165
177
|
});
|
|
166
|
-
return result;
|
|
167
178
|
}
|
|
168
179
|
export { createCompactUltramodernConfig, generateUltramodernWorkspace, writeApp, writeSharedPackages };
|
|
@@ -8,7 +8,7 @@ import { createAppEnvDts, createAppRuntimeConfig, createShellFrameComponent } fr
|
|
|
8
8
|
import { createShellPage, createShellRemoteComponents } from "./demo-components.js";
|
|
9
9
|
import { GENERATED_CONTRACT_PATH, ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, remoteDependencyAlias, shellApp, zephyrRemoteDependency } from "./descriptors.js";
|
|
10
10
|
import { createShellEffectClient, effectApiTopologyMetadata } from "./effect-api.js";
|
|
11
|
-
import { readJsonFile, writeFileReplacing, writeJsonFile } from "./fs-io.js";
|
|
11
|
+
import { formatGeneratedWorkspaceFiles, readJsonFile, writeFileReplacing, writeJsonFile } from "./fs-io.js";
|
|
12
12
|
import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
|
|
13
13
|
import { createAppPublicLocaleMessages } from "./locales.js";
|
|
14
14
|
import { createShellModuleFederationConfig } from "./module-federation.js";
|
|
@@ -531,9 +531,9 @@ function addUltramodernVertical(options) {
|
|
|
531
531
|
},
|
|
532
532
|
...updatedVerticals
|
|
533
533
|
]));
|
|
534
|
-
const
|
|
535
|
-
const
|
|
536
|
-
const
|
|
534
|
+
const preliminaryAfterFiles = createFileSnapshot(options.workspaceRoot);
|
|
535
|
+
const preliminaryDiff = diffFileSnapshots(beforeFiles, preliminaryAfterFiles);
|
|
536
|
+
const preliminaryResult = createGenerationResult({
|
|
537
537
|
operation: 'vertical',
|
|
538
538
|
workspaceRoot: options.workspaceRoot,
|
|
539
539
|
packageScope: scope,
|
|
@@ -541,14 +541,32 @@ function addUltramodernVertical(options) {
|
|
|
541
541
|
createdApps: [
|
|
542
542
|
vertical
|
|
543
543
|
],
|
|
544
|
-
createdPaths,
|
|
545
|
-
rewrittenPaths
|
|
544
|
+
createdPaths: preliminaryDiff.createdPaths,
|
|
545
|
+
rewrittenPaths: preliminaryDiff.rewrittenPaths
|
|
546
546
|
});
|
|
547
547
|
runCodeSmithOverlays({
|
|
548
548
|
workspaceRoot: options.workspaceRoot,
|
|
549
549
|
overlays: options.overlays,
|
|
550
|
-
result
|
|
550
|
+
result: preliminaryResult
|
|
551
|
+
});
|
|
552
|
+
const afterOverlaysFiles = createFileSnapshot(options.workspaceRoot);
|
|
553
|
+
const changedPaths = diffFileSnapshots(beforeFiles, afterOverlaysFiles);
|
|
554
|
+
formatGeneratedWorkspaceFiles(options.workspaceRoot, [
|
|
555
|
+
...changedPaths.createdPaths,
|
|
556
|
+
...changedPaths.rewrittenPaths
|
|
557
|
+
]);
|
|
558
|
+
const afterFiles = createFileSnapshot(options.workspaceRoot);
|
|
559
|
+
const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
|
|
560
|
+
return createGenerationResult({
|
|
561
|
+
operation: 'vertical',
|
|
562
|
+
workspaceRoot: options.workspaceRoot,
|
|
563
|
+
packageScope: scope,
|
|
564
|
+
packageSource,
|
|
565
|
+
createdApps: [
|
|
566
|
+
vertical
|
|
567
|
+
],
|
|
568
|
+
createdPaths,
|
|
569
|
+
rewrittenPaths
|
|
551
570
|
});
|
|
552
|
-
return result;
|
|
553
571
|
}
|
|
554
572
|
export { addShellWorkspaceDependency, addShellZephyrDependency, addUltramodernVertical, assertCanCreate, assertValidVerticalName, existingBridgeConfig, existingPackageSource, existingTailwindEnabled, nextAvailablePort, ownershipEntry, planUltramodernVertical, prepareAddUltramodernVertical, rewriteShellAppFiles, updateRootWorkspaceScripts, verticalTopologyEntry, verticalsFromTopology };
|
|
@@ -1,14 +1,48 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
2
3
|
import node_crypto from "node:crypto";
|
|
3
4
|
import node_fs from "node:fs";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
4
6
|
import node_path from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
6
8
|
import { resolveCreatePackageRoot } from "../create-package-root.js";
|
|
7
9
|
import { normalizePath } from "./naming.js";
|
|
8
10
|
const fs_io_dirname = node_path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const fs_io_require = createRequire(import.meta.url);
|
|
9
12
|
const createPackageRoot = resolveCreatePackageRoot(fs_io_dirname);
|
|
10
13
|
const workspaceTemplateDir = node_path.join(createPackageRoot, 'template-workspace');
|
|
11
14
|
const fileTemplatesDir = node_path.join(createPackageRoot, 'templates');
|
|
15
|
+
const preformatConfigDir = '.modern-js';
|
|
16
|
+
const preformatConfigPath = node_path.join(preformatConfigDir, 'ultramodern-preformat.oxfmt.config.mjs');
|
|
17
|
+
const workspaceOxfmtIgnorePatterns = [
|
|
18
|
+
'.agents',
|
|
19
|
+
'.codex/skills',
|
|
20
|
+
'.output',
|
|
21
|
+
'**/*.json',
|
|
22
|
+
'dist',
|
|
23
|
+
'node_modules',
|
|
24
|
+
'repos/**',
|
|
25
|
+
'.modern',
|
|
26
|
+
'.modernjs',
|
|
27
|
+
'**/modern-tanstack/**',
|
|
28
|
+
'**/routeTree.gen.*'
|
|
29
|
+
];
|
|
30
|
+
const formattableExtensions = new Set([
|
|
31
|
+
'.cjs',
|
|
32
|
+
'.cts',
|
|
33
|
+
'.js',
|
|
34
|
+
'.json',
|
|
35
|
+
'.jsonc',
|
|
36
|
+
'.jsx',
|
|
37
|
+
'.mjs',
|
|
38
|
+
'.mts',
|
|
39
|
+
'.md',
|
|
40
|
+
'.mdx',
|
|
41
|
+
'.ts',
|
|
42
|
+
'.tsx',
|
|
43
|
+
'.yaml',
|
|
44
|
+
'.yml'
|
|
45
|
+
]);
|
|
12
46
|
function readFileTemplate(relativePath) {
|
|
13
47
|
return node_fs.readFileSync(node_path.join(fileTemplatesDir, relativePath), 'utf-8');
|
|
14
48
|
}
|
|
@@ -44,6 +78,86 @@ function writeFileReplacing(targetDir, relativePath, content) {
|
|
|
44
78
|
function writeJson(targetDir, relativePath, value) {
|
|
45
79
|
writeFile(targetDir, relativePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
46
80
|
}
|
|
81
|
+
function formatGeneratedWorkspaceFiles(targetDir, relativePaths) {
|
|
82
|
+
const oxfmtBin = resolveOxfmtBin();
|
|
83
|
+
const oxfmtConfigPath = writePreformatConfig(targetDir);
|
|
84
|
+
const targets = void 0 === relativePaths ? [
|
|
85
|
+
targetDir,
|
|
86
|
+
`!${normalizePath(node_path.join(targetDir, 'repos'))}/**`
|
|
87
|
+
] : relativePaths.filter((relativePath)=>formattableExtensions.has(node_path.extname(relativePath))).map((relativePath)=>node_path.join(targetDir, relativePath));
|
|
88
|
+
if (0 === targets.length) return void removePreformatConfig(targetDir);
|
|
89
|
+
try {
|
|
90
|
+
const result = spawnSync(process.execPath, [
|
|
91
|
+
oxfmtBin,
|
|
92
|
+
'--config',
|
|
93
|
+
oxfmtConfigPath,
|
|
94
|
+
'--no-error-on-unmatched-pattern',
|
|
95
|
+
...targets
|
|
96
|
+
], {
|
|
97
|
+
cwd: targetDir,
|
|
98
|
+
encoding: 'utf-8',
|
|
99
|
+
env: {
|
|
100
|
+
...process.env,
|
|
101
|
+
FORCE_COLOR: '0'
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
if (0 !== result.status) {
|
|
105
|
+
const detail = [
|
|
106
|
+
result.stderr.trim(),
|
|
107
|
+
result.stdout.trim()
|
|
108
|
+
].filter(Boolean).join('\n');
|
|
109
|
+
throw new Error([
|
|
110
|
+
'Failed to format generated UltraModern workspace output.',
|
|
111
|
+
detail
|
|
112
|
+
].filter(Boolean).join('\n'));
|
|
113
|
+
}
|
|
114
|
+
} finally{
|
|
115
|
+
removePreformatConfig(targetDir);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function writePreformatConfig(targetDir) {
|
|
119
|
+
const configPath = node_path.join(targetDir, preformatConfigPath);
|
|
120
|
+
node_fs.mkdirSync(node_path.dirname(configPath), {
|
|
121
|
+
recursive: true
|
|
122
|
+
});
|
|
123
|
+
const oxfmtUrl = pathToFileURL(resolveOxfmtEntry()).href;
|
|
124
|
+
const ultraciteConfigUrl = pathToFileURL(resolveUltraciteOxfmtConfig()).href;
|
|
125
|
+
node_fs.writeFileSync(configPath, [
|
|
126
|
+
`import { defineConfig } from ${JSON.stringify(oxfmtUrl)};`,
|
|
127
|
+
`import ultracite from ${JSON.stringify(ultraciteConfigUrl)};`,
|
|
128
|
+
'',
|
|
129
|
+
'export default defineConfig({',
|
|
130
|
+
' extends: [ultracite],',
|
|
131
|
+
' ignorePatterns: [',
|
|
132
|
+
...workspaceOxfmtIgnorePatterns.map((pattern)=>` ${JSON.stringify(pattern)},`),
|
|
133
|
+
' ],',
|
|
134
|
+
' singleQuote: true,',
|
|
135
|
+
'});',
|
|
136
|
+
''
|
|
137
|
+
].join('\n'), 'utf-8');
|
|
138
|
+
return configPath;
|
|
139
|
+
}
|
|
140
|
+
function removePreformatConfig(targetDir) {
|
|
141
|
+
node_fs.rmSync(node_path.join(targetDir, preformatConfigPath), {
|
|
142
|
+
force: true
|
|
143
|
+
});
|
|
144
|
+
try {
|
|
145
|
+
node_fs.rmdirSync(node_path.join(targetDir, preformatConfigDir));
|
|
146
|
+
} catch {}
|
|
147
|
+
}
|
|
148
|
+
function resolveOxfmtBin() {
|
|
149
|
+
const packageJsonPath = fs_io_require.resolve('oxfmt/package.json');
|
|
150
|
+
const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
151
|
+
const binPath = 'string' == typeof packageJson.bin ? packageJson.bin : packageJson.bin?.oxfmt;
|
|
152
|
+
if ('string' != typeof binPath || 0 === binPath.length) throw new Error('Unable to resolve oxfmt binary from package metadata.');
|
|
153
|
+
return node_path.join(node_path.dirname(packageJsonPath), binPath);
|
|
154
|
+
}
|
|
155
|
+
function resolveOxfmtEntry() {
|
|
156
|
+
return fs_io_require.resolve('oxfmt');
|
|
157
|
+
}
|
|
158
|
+
function resolveUltraciteOxfmtConfig() {
|
|
159
|
+
return fs_io_require.resolve('ultracite/oxfmt');
|
|
160
|
+
}
|
|
47
161
|
function renderTemplate(template, data) {
|
|
48
162
|
return template.replace(/\{\{(\w+)\}\}/g, (match, key)=>data[key] ?? match);
|
|
49
163
|
}
|
|
@@ -88,4 +202,4 @@ function readJsonFile(filePath) {
|
|
|
88
202
|
function writeJsonFile(filePath, value) {
|
|
89
203
|
node_fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
|
|
90
204
|
}
|
|
91
|
-
export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
|
|
205
|
+
export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, formatGeneratedWorkspaceFiles, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
|
|
@@ -6,7 +6,7 @@ import { createDevelopmentOverlay, createOwnership, createTopology, createUltram
|
|
|
6
6
|
import { createLayout, createRemoteEntry, createRemoteExposeComponent, createRemotePage, createShellPage, createShellRemoteComponents, remoteComponentOutputPath } from "./demo-components.js";
|
|
7
7
|
import { ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createShellHost, sharedPackages, shellApp } from "./descriptors.js";
|
|
8
8
|
import { createEffectClient, createEffectServiceEntry, createEffectSharedApi, createShellEffectClient } from "./effect-api.js";
|
|
9
|
-
import { copyRootTemplate, writeFile, writeFileReplacing, writeJson } from "./fs-io.js";
|
|
9
|
+
import { copyRootTemplate, formatGeneratedWorkspaceFiles, writeFile, writeFileReplacing, writeJson } from "./fs-io.js";
|
|
10
10
|
import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
|
|
11
11
|
import { createAppPublicLocaleMessages } from "./locales.js";
|
|
12
12
|
import { createAppModernConfig, createRemoteModuleFederationConfig, createShellModuleFederationConfig, createUltramodernBuildModule, createUltramodernBuildReexportModule } from "./module-federation.js";
|
|
@@ -148,22 +148,33 @@ function generateUltramodernWorkspace(options) {
|
|
|
148
148
|
for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals, bridge);
|
|
149
149
|
writeSharedPackages(options.targetDir, scope);
|
|
150
150
|
writeGeneratedWorkspaceScripts(options.targetDir, scope, enableTailwind, initialVerticals);
|
|
151
|
-
const
|
|
152
|
-
const
|
|
153
|
-
const
|
|
151
|
+
const preliminaryAfterFiles = createFileSnapshot(options.targetDir);
|
|
152
|
+
const preliminaryDiff = diffFileSnapshots(beforeFiles, preliminaryAfterFiles);
|
|
153
|
+
const preliminaryResult = createGenerationResult({
|
|
154
154
|
operation: 'workspace',
|
|
155
155
|
workspaceRoot: options.targetDir,
|
|
156
156
|
packageScope: scope,
|
|
157
157
|
packageSource,
|
|
158
158
|
createdApps,
|
|
159
|
-
createdPaths,
|
|
160
|
-
rewrittenPaths
|
|
159
|
+
createdPaths: preliminaryDiff.createdPaths,
|
|
160
|
+
rewrittenPaths: preliminaryDiff.rewrittenPaths
|
|
161
161
|
});
|
|
162
162
|
runCodeSmithOverlays({
|
|
163
163
|
workspaceRoot: options.targetDir,
|
|
164
164
|
overlays: options.overlays,
|
|
165
|
-
result
|
|
165
|
+
result: preliminaryResult
|
|
166
|
+
});
|
|
167
|
+
formatGeneratedWorkspaceFiles(options.targetDir);
|
|
168
|
+
const afterFiles = createFileSnapshot(options.targetDir);
|
|
169
|
+
const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
|
|
170
|
+
return createGenerationResult({
|
|
171
|
+
operation: 'workspace',
|
|
172
|
+
workspaceRoot: options.targetDir,
|
|
173
|
+
packageScope: scope,
|
|
174
|
+
packageSource,
|
|
175
|
+
createdApps,
|
|
176
|
+
createdPaths,
|
|
177
|
+
rewrittenPaths
|
|
166
178
|
});
|
|
167
|
-
return result;
|
|
168
179
|
}
|
|
169
180
|
export { createCompactUltramodernConfig, generateUltramodernWorkspace, writeApp, writeSharedPackages };
|
|
@@ -9,6 +9,7 @@ export declare function ensureInsideRoot(root: string, targetPath: string): void
|
|
|
9
9
|
export declare function writeFile(targetDir: string, relativePath: string, content: string): void;
|
|
10
10
|
export declare function writeFileReplacing(targetDir: string, relativePath: string, content: string): void;
|
|
11
11
|
export declare function writeJson(targetDir: string, relativePath: string, value: JsonValue): void;
|
|
12
|
+
export declare function formatGeneratedWorkspaceFiles(targetDir: string, relativePaths?: readonly string[]): void;
|
|
12
13
|
export declare function renderTemplate(template: string, data: Record<string, string>): string;
|
|
13
14
|
export declare function collectTemplateFiles(dir: string): string[];
|
|
14
15
|
export declare function hashFile(filePath: string): string;
|
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20"
|
|
23
23
|
},
|
|
24
|
-
"version": "3.4.0-ultramodern.
|
|
24
|
+
"version": "3.4.0-ultramodern.14",
|
|
25
25
|
"types": "./dist/types/index.d.ts",
|
|
26
26
|
"main": "./dist/esm-node/index.js",
|
|
27
27
|
"bin": {
|
|
@@ -75,7 +75,9 @@
|
|
|
75
75
|
],
|
|
76
76
|
"dependencies": {
|
|
77
77
|
"@modern-js/codesmith": "2.6.9",
|
|
78
|
-
"
|
|
78
|
+
"oxfmt": "0.55.0",
|
|
79
|
+
"ultracite": "7.8.3",
|
|
80
|
+
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.4.0-ultramodern.14"
|
|
79
81
|
},
|
|
80
82
|
"devDependencies": {
|
|
81
83
|
"@rslib/core": "0.23.0",
|
|
@@ -97,6 +99,6 @@
|
|
|
97
99
|
"test": "rm -rf dist && rslib build -c rslibconfig.mts && rstest --passWithNoTests"
|
|
98
100
|
},
|
|
99
101
|
"ultramodern": {
|
|
100
|
-
"frameworkVersion": "3.4.0-ultramodern.
|
|
102
|
+
"frameworkVersion": "3.4.0-ultramodern.14"
|
|
101
103
|
}
|
|
102
104
|
}
|