@bleedingdev/modern-js-create 3.4.0-ultramodern.13 → 3.4.0-ultramodern.15

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.
@@ -589,9 +589,9 @@ function addUltramodernVertical(options) {
589
589
  },
590
590
  ...updatedVerticals
591
591
  ]));
592
- const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
593
- const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
594
- const result = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
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 afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.targetDir);
196
- const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
197
- const result = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
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 afterFiles = createFileSnapshot(options.workspaceRoot);
534
- const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
535
- const result = createGenerationResult({
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 afterFiles = createFileSnapshot(options.targetDir);
151
- const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
152
- const result = createGenerationResult({
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 afterFiles = createFileSnapshot(options.workspaceRoot);
535
- const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
536
- const result = createGenerationResult({
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 afterFiles = createFileSnapshot(options.targetDir);
152
- const { createdPaths, rewrittenPaths } = diffFileSnapshots(beforeFiles, afterFiles);
153
- const result = createGenerationResult({
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.13",
24
+ "version": "3.4.0-ultramodern.15",
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
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.4.0-ultramodern.13"
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.15"
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.13"
102
+ "frameworkVersion": "3.4.0-ultramodern.15"
101
103
  }
102
104
  }