@bleedingdev/modern-js-create 3.5.0-ultramodern.10 → 3.5.0-ultramodern.12

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 (25) hide show
  1. package/dist/cjs/ultramodern-tooling/commands.cjs +176 -2
  2. package/dist/cjs/ultramodern-workspace/app-files.cjs +8 -11
  3. package/dist/cjs/ultramodern-workspace/package-json.cjs +14 -6
  4. package/dist/cjs/ultramodern-workspace/versions.cjs +5 -0
  5. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +1 -0
  6. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +1 -0
  7. package/dist/esm/ultramodern-tooling/commands.js +177 -3
  8. package/dist/esm/ultramodern-workspace/app-files.js +8 -11
  9. package/dist/esm/ultramodern-workspace/package-json.js +4 -6
  10. package/dist/esm/ultramodern-workspace/versions.js +3 -1
  11. package/dist/esm/ultramodern-workspace/workspace-scripts.js +2 -1
  12. package/dist/esm/ultramodern-workspace/write-workspace.js +2 -1
  13. package/dist/esm-node/ultramodern-tooling/commands.js +177 -3
  14. package/dist/esm-node/ultramodern-workspace/app-files.js +8 -11
  15. package/dist/esm-node/ultramodern-workspace/package-json.js +4 -6
  16. package/dist/esm-node/ultramodern-workspace/versions.js +3 -1
  17. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +2 -1
  18. package/dist/esm-node/ultramodern-workspace/write-workspace.js +2 -1
  19. package/dist/types/ultramodern-workspace/versions.d.ts +2 -0
  20. package/package.json +3 -3
  21. package/template-workspace/.gitignore.handlebars +2 -0
  22. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +452 -0
  23. package/template-workspace/patches/effect-schema-error-type-id.patch +18 -0
  24. package/template-workspace/pnpm-workspace.yaml.handlebars +1 -0
  25. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +37 -2
@@ -1,3 +1,4 @@
1
+ import node_path from "node:path";
1
2
  import { WORKSPACE_PACKAGE_VERSION, modernPackageSpecifier } from "../ultramodern-package-source.js";
2
3
  import { appHasApi, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalApiApps, zephyrRemoteDependency } from "./descriptors.js";
3
4
  import { readFileTemplate } from "./fs-io.js";
@@ -248,7 +249,6 @@ function createTsConfigBase() {
248
249
  noFallthroughCasesInSwitch: true,
249
250
  noPropertyAccessFromIndexSignature: true,
250
251
  noImplicitReturns: true,
251
- skipLibCheck: true,
252
252
  resolveJsonModule: true,
253
253
  plugins: [
254
254
  {
@@ -280,7 +280,7 @@ function createReferences(packageDir, references) {
280
280
  return [
281
281
  ...new Set(references)
282
282
  ].filter((reference)=>reference !== packageDir).map((reference)=>({
283
- path: `${relativeRootFor(packageDir)}/${reference}`
283
+ path: node_path.relative(packageDir, reference).split(node_path.sep).join('/')
284
284
  }));
285
285
  }
286
286
  function createPackageTsConfig(packageDir, options = {}) {
@@ -290,8 +290,6 @@ function createPackageTsConfig(packageDir, options = {}) {
290
290
  const include = resolvedOptions.include ?? [
291
291
  'src',
292
292
  'locales/**/*.json',
293
- 'modern.config.ts',
294
- 'module-federation.config.ts',
295
293
  'package.json',
296
294
  'shared'
297
295
  ];
@@ -325,9 +323,9 @@ function createAppTsConfig(app, remotes = []) {
325
323
  });
326
324
  }
327
325
  function createAppMfTypesTsConfig(app) {
328
- const exposedFiles = Object.values(app.exposes ?? {}).map((exposePath)=>exposePath.replace(/^\.\//u, ''));
326
+ const exposedFiles = Object.entries(app.exposes ?? {}).sort(([left], [right])=>'./Route' === left ? -1 : './Route' === right ? 1 : 0).map(([, exposePath])=>exposePath.replace(/^\.\//u, ''));
329
327
  return {
330
- extends: './tsconfig.json',
328
+ extends: `${relativeRootFor(app.directory)}/tsconfig.base.json`,
331
329
  include: [
332
330
  ...new Set([
333
331
  ...exposedFiles,
@@ -11,6 +11,7 @@ const POSTCSS_VERSION = '8.5.15';
11
11
  const EFFECT_VERSION = '4.0.0-beta.91';
12
12
  const EFFECT_VITEST_VERSION = '4.0.0-beta.91';
13
13
  const EFFECT_TSGO_VERSION = '0.14.6';
14
+ const DRIZZLE_ORM_VERSION = '1.0.0-rc.4';
14
15
  const TYPESCRIPT_STABLE_VERSION = '6.0.3';
15
16
  const TYPESCRIPT_NATIVE_PREVIEW_VERSION = '7.0.0-dev.20260628.1';
16
17
  const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
@@ -35,7 +36,8 @@ const ultramodernWorkspaceVersions = {
35
36
  moduleFederation: MODULE_FEDERATION_VERSION,
36
37
  effect: EFFECT_VERSION,
37
38
  effectVitest: EFFECT_VITEST_VERSION,
39
+ drizzleOrm: DRIZZLE_ORM_VERSION,
38
40
  tailwind: TAILWIND_VERSION,
39
41
  tailwindPostcss: TAILWIND_POSTCSS_VERSION
40
42
  };
41
- export { CLOUDFLARE_COMPATIBILITY_DATE, EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MODULE_FEDERATION_AGENT_SKILLS_COMMIT, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, POSTCSS_VERSION, REACT_DOM_VERSION, REACT_ROUTER_VERSION, REACT_VERSION, RSTACK_AGENT_SKILLS_COMMIT, TAILWIND_POSTCSS_VERSION, TAILWIND_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION, ultramodernWorkspaceVersions };
43
+ export { CLOUDFLARE_COMPATIBILITY_DATE, DRIZZLE_ORM_VERSION, EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MODULE_FEDERATION_AGENT_SKILLS_COMMIT, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, POSTCSS_VERSION, REACT_DOM_VERSION, REACT_ROUTER_VERSION, REACT_VERSION, RSTACK_AGENT_SKILLS_COMMIT, TAILWIND_POSTCSS_VERSION, TAILWIND_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION, ultramodernWorkspaceVersions };
@@ -8,7 +8,7 @@ import { packageName, tailwindPrefixForApp } from "./naming.js";
8
8
  import { createCloudflareSecurityContract } from "./policy.js";
9
9
  import { publicSurfaceManagedSourceAssetPaths } from "./public-surface.js";
10
10
  import { createLocalisedUrlsMap, createRouteMetaFilePath, createRouteOwnedI18nPaths, createRoutePageFilePath } from "./routes.js";
11
- import { CLOUDFLARE_COMPATIBILITY_DATE, NODE_VERSION, PNPM_VERSION } from "./versions.js";
11
+ import { CLOUDFLARE_COMPATIBILITY_DATE, EFFECT_VERSION, NODE_VERSION, PNPM_VERSION } from "./versions.js";
12
12
  function createToolWrapperScript(command, extraArgs = []) {
13
13
  const commandJson = JSON.stringify(command);
14
14
  const extraArgsJson = JSON.stringify(extraArgs);
@@ -127,6 +127,7 @@ function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
127
127
  const expectedCloudflareSecurity = createCloudflareSecurityContract();
128
128
  return renderFileTemplate("workspace-scripts/validate-ultramodern-workspace.mjs", {
129
129
  packageScope: scope,
130
+ effectVersion: EFFECT_VERSION,
130
131
  nodeVersion: NODE_VERSION,
131
132
  pnpmVersion: PNPM_VERSION,
132
133
  tailwindEnabledJson: JSON.stringify(enableTailwind),
@@ -14,7 +14,7 @@ import { runCodeSmithOverlays } from "./overlays.js";
14
14
  import { createAppMfTypesTsConfig, createAppPackage, createAppTsConfig, createRootPackageJson, createRootTsConfig, createSharedContractsIndex, createSharedPackage, createSharedPackageTsConfig, createTsConfigBase } from "./package-json.js";
15
15
  import { resolvePackageSource } from "./package-source.js";
16
16
  import { createPublicWebAppArtifacts } from "./public-surface.js";
17
- import { EFFECT_VERSION, EFFECT_VITEST_VERSION, NODE_FETCH_VERSION, NODE_VERSION, PNPM_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_VERSION } from "./versions.js";
17
+ import { DRIZZLE_ORM_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, NODE_FETCH_VERSION, NODE_VERSION, PNPM_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_VERSION } from "./versions.js";
18
18
  import { writeGeneratedWorkspaceScripts } from "./workspace-scripts.js";
19
19
  function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = [], bridge) {
20
20
  const resolvedApp = 'shell' === app.kind ? createShellHost(remotes) : app;
@@ -130,6 +130,7 @@ function generateUltramodernWorkspace(options) {
130
130
  nodeVersion: NODE_VERSION,
131
131
  pnpmVersion: PNPM_VERSION,
132
132
  nodeFetchVersion: NODE_FETCH_VERSION,
133
+ drizzleOrmVersion: DRIZZLE_ORM_VERSION,
133
134
  effectVersion: EFFECT_VERSION,
134
135
  effectVitestVersion: EFFECT_VITEST_VERSION,
135
136
  tanstackRouterCoreVersion: TANSTACK_ROUTER_CORE_VERSION,
@@ -6,8 +6,10 @@ import node_path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { resolveCreatePackageRoot } from "../create-package-root.js";
8
8
  import { BLEEDINGDEV_PACKAGE_NAME_PREFIX, BLEEDINGDEV_PACKAGE_SCOPE, ULTRAMODERN_SINGLE_APP_MODERN_PACKAGES, ULTRAMODERN_WORKSPACE_MODERN_PACKAGES, WORKSPACE_PACKAGE_VERSION, modernPackageSpecifier } from "../ultramodern-package-source.js";
9
+ import { createAppEnvDts } from "../ultramodern-workspace/app-files.js";
9
10
  import { validateModuleFederationTypes } from "../ultramodern-workspace/mf-validation.js";
10
- import { EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, OXFMT_VERSION, OXLINT_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION } from "../ultramodern-workspace/versions.js";
11
+ import { createAppMfTypesTsConfig, createAppTsConfig, createSharedPackageTsConfig, createTsConfigBase } from "../ultramodern-workspace/package-json.js";
12
+ import { DRIZZLE_ORM_VERSION, EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, OXFMT_VERSION, OXLINT_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION } from "../ultramodern-workspace/versions.js";
11
13
  import { createWorkspaceValidationScript } from "../ultramodern-workspace/workspace-scripts.js";
12
14
  import { readUltramodernConfig, workspaceAppsFromToolingConfig } from "./config.js";
13
15
  const commands_dirname = node_path.dirname(fileURLToPath(import.meta.url));
@@ -187,6 +189,10 @@ const strictEffectPackageVersionPolicyExclusions = [
187
189
  `effect@${EFFECT_VERSION}`,
188
190
  `@effect/opentelemetry@${EFFECT_VERSION}`
189
191
  ];
192
+ const effectDeclarationPatchPath = 'patches/effect-schema-error-type-id.patch';
193
+ const effectDeclarationPatchSourcePath = node_path.join(createPackageRoot, 'template-workspace', effectDeclarationPatchPath);
194
+ const drizzleOrmDeclarationPatchPath = 'patches/drizzle-orm-ts7-strict-declarations.patch';
195
+ const drizzleOrmDeclarationPatchSourcePath = node_path.join(createPackageRoot, 'template-workspace', drizzleOrmDeclarationPatchPath);
190
196
  function updateGeneratedToolingDependencies(packageJson) {
191
197
  let changed = false;
192
198
  for (const section of [
@@ -322,11 +328,117 @@ function ensureYamlListItem(source, key, item) {
322
328
  changed: true
323
329
  };
324
330
  }
331
+ function ensureYamlMapEntry(source, key, entryKey, value) {
332
+ const entryLine = ` '${entryKey}': ${value}`;
333
+ const packageName = entryKey.includes('@') ? entryKey.slice(0, entryKey.lastIndexOf('@')) : entryKey;
334
+ const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
335
+ const currentEntryPattern = new RegExp(`^ {2}'${escapedPackageName}@[^']+': .+$`, 'mu');
336
+ const currentEntry = source.match(currentEntryPattern);
337
+ if (currentEntry) {
338
+ if (currentEntry[0] === entryLine) return {
339
+ source,
340
+ changed: false
341
+ };
342
+ return {
343
+ source: source.replace(currentEntryPattern, entryLine),
344
+ changed: true
345
+ };
346
+ }
347
+ const headerPattern = new RegExp(`^${key}:\\n(?:(?: .+\\n)*)`, 'mu');
348
+ const header = source.match(headerPattern);
349
+ if (header) {
350
+ if (header[0].split('\n').includes(entryLine)) return {
351
+ source,
352
+ changed: false
353
+ };
354
+ return {
355
+ source: source.replace(headerPattern, `${header[0]}${entryLine}\n`),
356
+ changed: true
357
+ };
358
+ }
359
+ return {
360
+ source: `${source.trimEnd()}\n${key}:\n${entryLine}\n`,
361
+ changed: true
362
+ };
363
+ }
364
+ function removeYamlMapEntry(source, entryKey) {
365
+ const packageName = entryKey.includes('@') ? entryKey.slice(0, entryKey.lastIndexOf('@')) : entryKey;
366
+ const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
367
+ const currentEntryPattern = new RegExp(`^ {2}'${escapedPackageName}@[^']+': .+\\n?`, 'mu');
368
+ if (!currentEntryPattern.test(source)) return {
369
+ source,
370
+ changed: false
371
+ };
372
+ return {
373
+ source: source.replace(currentEntryPattern, ''),
374
+ changed: true
375
+ };
376
+ }
377
+ function ensureGeneratedPatchFile(workspaceRoot, relativePatchPath, sourcePatchPath) {
378
+ const targetPath = node_path.join(workspaceRoot, relativePatchPath);
379
+ const patch = node_fs.readFileSync(sourcePatchPath, 'utf-8');
380
+ if (node_fs.existsSync(targetPath) && node_fs.readFileSync(targetPath, 'utf-8') === patch) return false;
381
+ node_fs.mkdirSync(node_path.dirname(targetPath), {
382
+ recursive: true
383
+ });
384
+ node_fs.writeFileSync(targetPath, patch, 'utf-8');
385
+ return true;
386
+ }
387
+ function removeGeneratedPatchFileIfUnchanged(workspaceRoot, relativePatchPath, sourcePatchPath) {
388
+ const targetPath = node_path.join(workspaceRoot, relativePatchPath);
389
+ if (!node_fs.existsSync(targetPath)) return false;
390
+ const patch = node_fs.readFileSync(sourcePatchPath, 'utf-8');
391
+ if (node_fs.readFileSync(targetPath, 'utf-8') !== patch) return false;
392
+ node_fs.rmSync(targetPath);
393
+ return true;
394
+ }
395
+ function workspaceUsesDependency(workspaceRoot, packageName) {
396
+ const packageJsonPaths = [
397
+ node_path.join(workspaceRoot, 'package.json')
398
+ ];
399
+ for (const workspaceDir of [
400
+ 'apps',
401
+ 'verticals',
402
+ 'packages'
403
+ ]){
404
+ const absoluteWorkspaceDir = node_path.join(workspaceRoot, workspaceDir);
405
+ if (node_fs.existsSync(absoluteWorkspaceDir)) for (const entry of node_fs.readdirSync(absoluteWorkspaceDir, {
406
+ withFileTypes: true
407
+ })){
408
+ if (!entry.isDirectory()) continue;
409
+ const packageJsonPath = node_path.join(absoluteWorkspaceDir, entry.name, 'package.json');
410
+ if (node_fs.existsSync(packageJsonPath)) packageJsonPaths.push(packageJsonPath);
411
+ }
412
+ }
413
+ for (const packageJsonPath of packageJsonPaths){
414
+ const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
415
+ for (const field of [
416
+ 'dependencies',
417
+ 'devDependencies',
418
+ 'peerDependencies',
419
+ 'optionalDependencies'
420
+ ]){
421
+ const dependencies = packageJson[field];
422
+ if (dependencies && 'object' == typeof dependencies) {
423
+ if (Object.prototype.hasOwnProperty.call(dependencies, packageName)) return true;
424
+ for (const specifier of Object.values(dependencies))if ('string' == typeof specifier && specifier.startsWith(`npm:${packageName}@`)) return true;
425
+ }
426
+ }
427
+ }
428
+ return false;
429
+ }
430
+ function ensureGeneratedDeclarationPatches(workspaceRoot, options) {
431
+ let changed = false;
432
+ changed = ensureGeneratedPatchFile(workspaceRoot, effectDeclarationPatchPath, effectDeclarationPatchSourcePath) || changed;
433
+ changed = options.includeDrizzleOrmPatch ? ensureGeneratedPatchFile(workspaceRoot, drizzleOrmDeclarationPatchPath, drizzleOrmDeclarationPatchSourcePath) || changed : removeGeneratedPatchFileIfUnchanged(workspaceRoot, drizzleOrmDeclarationPatchPath, drizzleOrmDeclarationPatchSourcePath) || changed;
434
+ return changed;
435
+ }
325
436
  function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
326
437
  const workspaceFile = node_path.join(workspaceRoot, 'pnpm-workspace.yaml');
327
438
  if (!node_fs.existsSync(workspaceFile)) return false;
328
439
  let source = node_fs.readFileSync(workspaceFile, 'utf-8');
329
440
  let changed = false;
441
+ const usesDrizzleOrm = workspaceUsesDependency(workspaceRoot, 'drizzle-orm');
330
442
  const replacements = [
331
443
  [
332
444
  /^ {4}'@effect\/vitest>effect': .+$/mu,
@@ -361,6 +473,12 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
361
473
  changed = policyExclude.changed || changed;
362
474
  }
363
475
  }
476
+ const effectPatch = ensureYamlMapEntry(source, 'patchedDependencies', `effect@${EFFECT_VERSION}`, effectDeclarationPatchPath);
477
+ source = effectPatch.source;
478
+ changed = effectPatch.changed || changed;
479
+ const drizzleOrmPatch = usesDrizzleOrm ? ensureYamlMapEntry(source, 'patchedDependencies', `drizzle-orm@${DRIZZLE_ORM_VERSION}`, drizzleOrmDeclarationPatchPath) : removeYamlMapEntry(source, `drizzle-orm@${DRIZZLE_ORM_VERSION}`);
480
+ source = drizzleOrmPatch.source;
481
+ changed = drizzleOrmPatch.changed || changed;
364
482
  if (changed) node_fs.writeFileSync(workspaceFile, source, 'utf-8');
365
483
  return changed;
366
484
  }
@@ -383,6 +501,57 @@ function updateUltramodernConfig(workspaceRoot, packageSource) {
383
501
  for (const app of config.topology?.apps ?? [])if (app && 'object' == typeof app && !Array.isArray(app)) normalizeStrictEffectApiMetadata(app);
384
502
  writeJsonFile(configPath, config);
385
503
  }
504
+ function writeJsonIfChanged(filePath, value) {
505
+ const next = `${JSON.stringify(value, null, 2)}\n`;
506
+ if (node_fs.existsSync(filePath) && node_fs.readFileSync(filePath, 'utf-8') === next) return false;
507
+ node_fs.mkdirSync(node_path.dirname(filePath), {
508
+ recursive: true
509
+ });
510
+ node_fs.writeFileSync(filePath, next, 'utf-8');
511
+ return true;
512
+ }
513
+ function writeTextIfChanged(filePath, value) {
514
+ if (node_fs.existsSync(filePath) && node_fs.readFileSync(filePath, 'utf-8') === value) return false;
515
+ node_fs.mkdirSync(node_path.dirname(filePath), {
516
+ recursive: true
517
+ });
518
+ node_fs.writeFileSync(filePath, value, 'utf-8');
519
+ return true;
520
+ }
521
+ function ensureGeneratedIgnoreRules(workspaceRoot) {
522
+ const gitignorePath = node_path.join(workspaceRoot, '.gitignore');
523
+ const existing = node_fs.existsSync(gitignorePath) ? node_fs.readFileSync(gitignorePath, 'utf-8') : '';
524
+ const lines = 0 === existing.trimEnd().length ? [] : existing.trimEnd().split(/\r?\n/u);
525
+ let changed = false;
526
+ for (const rule of [
527
+ '.mf/',
528
+ '**/.mf/'
529
+ ])if (!lines.includes(rule)) {
530
+ lines.push(rule);
531
+ changed = true;
532
+ }
533
+ if (!changed) return false;
534
+ const next = `${lines.join('\n')}\n`;
535
+ node_fs.writeFileSync(gitignorePath, next, 'utf-8');
536
+ return true;
537
+ }
538
+ function updateGeneratedTypeScriptSurfaces(workspaceRoot, config) {
539
+ let changed = false;
540
+ const apps = workspaceAppsFromToolingConfig(config);
541
+ const remotes = apps.filter((app)=>'shell' !== app.kind);
542
+ changed = writeJsonIfChanged(node_path.join(workspaceRoot, 'tsconfig.base.json'), createTsConfigBase()) || changed;
543
+ changed = ensureGeneratedIgnoreRules(workspaceRoot) || changed;
544
+ for (const sharedPackage of [
545
+ 'packages/shared-contracts',
546
+ 'packages/shared-design-tokens'
547
+ ])changed = writeJsonIfChanged(node_path.join(workspaceRoot, sharedPackage, 'tsconfig.json'), createSharedPackageTsConfig(sharedPackage)) || changed;
548
+ for (const app of apps){
549
+ changed = writeJsonIfChanged(node_path.join(workspaceRoot, app.directory, 'tsconfig.json'), createAppTsConfig(app, remotes)) || changed;
550
+ changed = writeJsonIfChanged(node_path.join(workspaceRoot, app.directory, 'tsconfig.mf-types.json'), createAppMfTypesTsConfig(app)) || changed;
551
+ changed = writeTextIfChanged(node_path.join(workspaceRoot, app.directory, 'src/modern-app-env.d.ts'), createAppEnvDts(app, remotes)) || changed;
552
+ }
553
+ return changed;
554
+ }
386
555
  function updateReferenceTopology(workspaceRoot) {
387
556
  const topologyPath = node_path.join(workspaceRoot, 'topology/reference-topology.json');
388
557
  if (!node_fs.existsSync(topologyPath)) return false;
@@ -446,8 +615,9 @@ function runMigrateStrictEffect(args, context) {
446
615
 
447
616
  Updates generated UltraModern package-source metadata, Modern package aliases,
448
617
  framework-owned toolchain pins, direct Effect API topology metadata, strict
449
- Effect pnpm overrides/trust policy, and the pnpm lockfile. Source code still
450
- has to pass pnpm api:check and pnpm contract:check.
618
+ Effect pnpm overrides/trust policy, framework-owned TypeScript config
619
+ surfaces, and the pnpm lockfile. Source code still has to pass pnpm api:check
620
+ and pnpm contract:check.
451
621
  `);
452
622
  return 0;
453
623
  }
@@ -455,6 +625,7 @@ has to pass pnpm api:check and pnpm contract:check.
455
625
  const packageSource = createMigrationPackageSource(args, current);
456
626
  updateUltramodernConfig(context.workspaceRoot, packageSource);
457
627
  updateReferenceTopology(context.workspaceRoot);
628
+ updateGeneratedTypeScriptSurfaces(context.workspaceRoot, current);
458
629
  for (const relativePackageFile of listWorkspacePackageFiles(context.workspaceRoot)){
459
630
  const packageFile = node_path.join(context.workspaceRoot, relativePackageFile);
460
631
  const packageJson = readJsonFile(packageFile);
@@ -473,6 +644,9 @@ has to pass pnpm api:check and pnpm contract:check.
473
644
  else if ('package.json' === relativePackageFile) writeJsonFile(packageFile, packageJson);
474
645
  }
475
646
  updateGeneratedPnpmWorkspacePolicy(context.workspaceRoot);
647
+ ensureGeneratedDeclarationPatches(context.workspaceRoot, {
648
+ includeDrizzleOrmPatch: workspaceUsesDependency(context.workspaceRoot, 'drizzle-orm')
649
+ });
476
650
  if (!hasFlag(args, '--skip-install')) {
477
651
  const status = runPnpmLockfileRefresh(context);
478
652
  if (0 !== status) return status;
@@ -28,17 +28,14 @@ function createAppEnvDts(app, remotes = []) {
28
28
  }
29
29
  `;
30
30
  })).join('\n');
31
- const reactTypeReference = remoteModuleDeclarations ? "/// <reference types='react' />\n" : '';
32
- const siteUrlDeclaration = 'declare const ULTRAMODERN_SITE_URL: string;';
33
- return `${reactTypeReference}/// <reference types='@modern-js/app-tools/types' />
34
-
35
- ${siteUrlDeclaration}
36
- declare module '*.svg' {
37
- const url: string;
38
- export default url;
39
- }
40
- declare module '*.css';
41
- ${remoteModuleDeclarations ? `\n${remoteModuleDeclarations}` : ''}`;
31
+ const reactTypeImport = remoteModuleDeclarations ? "import type React from 'react';\n" : '';
32
+ return [
33
+ `import '@modern-js/app-tools/types';\n${reactTypeImport}`.trimEnd(),
34
+ `declare global {
35
+ const ULTRAMODERN_SITE_URL: string;
36
+ }`,
37
+ remoteModuleDeclarations.trimEnd()
38
+ ].filter((section)=>section.length > 0).join('\n\n').concat('\n');
42
39
  }
43
40
  function createAppRuntimeConfig(app, scope, remotes = []) {
44
41
  const pluginsConfig = 'shell' === app.kind ? ` plugins: [
@@ -1,4 +1,5 @@
1
1
  import "node:module";
2
+ import node_path from "node:path";
2
3
  import { WORKSPACE_PACKAGE_VERSION, modernPackageSpecifier } from "../ultramodern-package-source.js";
3
4
  import { appHasApi, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalApiApps, zephyrRemoteDependency } from "./descriptors.js";
4
5
  import { readFileTemplate } from "./fs-io.js";
@@ -249,7 +250,6 @@ function createTsConfigBase() {
249
250
  noFallthroughCasesInSwitch: true,
250
251
  noPropertyAccessFromIndexSignature: true,
251
252
  noImplicitReturns: true,
252
- skipLibCheck: true,
253
253
  resolveJsonModule: true,
254
254
  plugins: [
255
255
  {
@@ -281,7 +281,7 @@ function createReferences(packageDir, references) {
281
281
  return [
282
282
  ...new Set(references)
283
283
  ].filter((reference)=>reference !== packageDir).map((reference)=>({
284
- path: `${relativeRootFor(packageDir)}/${reference}`
284
+ path: node_path.relative(packageDir, reference).split(node_path.sep).join('/')
285
285
  }));
286
286
  }
287
287
  function createPackageTsConfig(packageDir, options = {}) {
@@ -291,8 +291,6 @@ function createPackageTsConfig(packageDir, options = {}) {
291
291
  const include = resolvedOptions.include ?? [
292
292
  'src',
293
293
  'locales/**/*.json',
294
- 'modern.config.ts',
295
- 'module-federation.config.ts',
296
294
  'package.json',
297
295
  'shared'
298
296
  ];
@@ -326,9 +324,9 @@ function createAppTsConfig(app, remotes = []) {
326
324
  });
327
325
  }
328
326
  function createAppMfTypesTsConfig(app) {
329
- const exposedFiles = Object.values(app.exposes ?? {}).map((exposePath)=>exposePath.replace(/^\.\//u, ''));
327
+ const exposedFiles = Object.entries(app.exposes ?? {}).sort(([left], [right])=>'./Route' === left ? -1 : './Route' === right ? 1 : 0).map(([, exposePath])=>exposePath.replace(/^\.\//u, ''));
330
328
  return {
331
- extends: './tsconfig.json',
329
+ extends: `${relativeRootFor(app.directory)}/tsconfig.base.json`,
332
330
  include: [
333
331
  ...new Set([
334
332
  ...exposedFiles,
@@ -12,6 +12,7 @@ const POSTCSS_VERSION = '8.5.15';
12
12
  const EFFECT_VERSION = '4.0.0-beta.91';
13
13
  const EFFECT_VITEST_VERSION = '4.0.0-beta.91';
14
14
  const EFFECT_TSGO_VERSION = '0.14.6';
15
+ const DRIZZLE_ORM_VERSION = '1.0.0-rc.4';
15
16
  const TYPESCRIPT_STABLE_VERSION = '6.0.3';
16
17
  const TYPESCRIPT_NATIVE_PREVIEW_VERSION = '7.0.0-dev.20260628.1';
17
18
  const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
@@ -36,7 +37,8 @@ const ultramodernWorkspaceVersions = {
36
37
  moduleFederation: MODULE_FEDERATION_VERSION,
37
38
  effect: EFFECT_VERSION,
38
39
  effectVitest: EFFECT_VITEST_VERSION,
40
+ drizzleOrm: DRIZZLE_ORM_VERSION,
39
41
  tailwind: TAILWIND_VERSION,
40
42
  tailwindPostcss: TAILWIND_POSTCSS_VERSION
41
43
  };
42
- export { CLOUDFLARE_COMPATIBILITY_DATE, EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MODULE_FEDERATION_AGENT_SKILLS_COMMIT, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, POSTCSS_VERSION, REACT_DOM_VERSION, REACT_ROUTER_VERSION, REACT_VERSION, RSTACK_AGENT_SKILLS_COMMIT, TAILWIND_POSTCSS_VERSION, TAILWIND_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION, ultramodernWorkspaceVersions };
44
+ export { CLOUDFLARE_COMPATIBILITY_DATE, DRIZZLE_ORM_VERSION, EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MODULE_FEDERATION_AGENT_SKILLS_COMMIT, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, POSTCSS_VERSION, REACT_DOM_VERSION, REACT_ROUTER_VERSION, REACT_VERSION, RSTACK_AGENT_SKILLS_COMMIT, TAILWIND_POSTCSS_VERSION, TAILWIND_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION, ultramodernWorkspaceVersions };
@@ -9,7 +9,7 @@ import { packageName, tailwindPrefixForApp } from "./naming.js";
9
9
  import { createCloudflareSecurityContract } from "./policy.js";
10
10
  import { publicSurfaceManagedSourceAssetPaths } from "./public-surface.js";
11
11
  import { createLocalisedUrlsMap, createRouteMetaFilePath, createRouteOwnedI18nPaths, createRoutePageFilePath } from "./routes.js";
12
- import { CLOUDFLARE_COMPATIBILITY_DATE, NODE_VERSION, PNPM_VERSION } from "./versions.js";
12
+ import { CLOUDFLARE_COMPATIBILITY_DATE, EFFECT_VERSION, NODE_VERSION, PNPM_VERSION } from "./versions.js";
13
13
  function createToolWrapperScript(command, extraArgs = []) {
14
14
  const commandJson = JSON.stringify(command);
15
15
  const extraArgsJson = JSON.stringify(extraArgs);
@@ -128,6 +128,7 @@ function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
128
128
  const expectedCloudflareSecurity = createCloudflareSecurityContract();
129
129
  return renderFileTemplate("workspace-scripts/validate-ultramodern-workspace.mjs", {
130
130
  packageScope: scope,
131
+ effectVersion: EFFECT_VERSION,
131
132
  nodeVersion: NODE_VERSION,
132
133
  pnpmVersion: PNPM_VERSION,
133
134
  tailwindEnabledJson: JSON.stringify(enableTailwind),
@@ -15,7 +15,7 @@ import { runCodeSmithOverlays } from "./overlays.js";
15
15
  import { createAppMfTypesTsConfig, createAppPackage, createAppTsConfig, createRootPackageJson, createRootTsConfig, createSharedContractsIndex, createSharedPackage, createSharedPackageTsConfig, createTsConfigBase } from "./package-json.js";
16
16
  import { resolvePackageSource } from "./package-source.js";
17
17
  import { createPublicWebAppArtifacts } from "./public-surface.js";
18
- import { EFFECT_VERSION, EFFECT_VITEST_VERSION, NODE_FETCH_VERSION, NODE_VERSION, PNPM_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_VERSION } from "./versions.js";
18
+ import { DRIZZLE_ORM_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, NODE_FETCH_VERSION, NODE_VERSION, PNPM_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_VERSION } from "./versions.js";
19
19
  import { writeGeneratedWorkspaceScripts } from "./workspace-scripts.js";
20
20
  function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = [], bridge) {
21
21
  const resolvedApp = 'shell' === app.kind ? createShellHost(remotes) : app;
@@ -131,6 +131,7 @@ function generateUltramodernWorkspace(options) {
131
131
  nodeVersion: NODE_VERSION,
132
132
  pnpmVersion: PNPM_VERSION,
133
133
  nodeFetchVersion: NODE_FETCH_VERSION,
134
+ drizzleOrmVersion: DRIZZLE_ORM_VERSION,
134
135
  effectVersion: EFFECT_VERSION,
135
136
  effectVitestVersion: EFFECT_VITEST_VERSION,
136
137
  tanstackRouterCoreVersion: TANSTACK_ROUTER_CORE_VERSION,
@@ -16,6 +16,7 @@ export declare const POSTCSS_VERSION = "8.5.15";
16
16
  export declare const EFFECT_VERSION = "4.0.0-beta.91";
17
17
  export declare const EFFECT_VITEST_VERSION = "4.0.0-beta.91";
18
18
  export declare const EFFECT_TSGO_VERSION = "0.14.6";
19
+ export declare const DRIZZLE_ORM_VERSION = "1.0.0-rc.4";
19
20
  export declare const TYPESCRIPT_STABLE_VERSION = "6.0.3";
20
21
  export declare const TYPESCRIPT_NATIVE_PREVIEW_VERSION = "7.0.0-dev.20260628.1";
21
22
  export declare const TYPESCRIPT_VERSION = "6.0.3";
@@ -40,6 +41,7 @@ export declare const ultramodernWorkspaceVersions: {
40
41
  moduleFederation: string;
41
42
  effect: string;
42
43
  effectVitest: string;
44
+ drizzleOrm: string;
43
45
  tailwind: string;
44
46
  tailwindPostcss: string;
45
47
  };
package/package.json CHANGED
@@ -21,7 +21,7 @@
21
21
  "engines": {
22
22
  "node": ">=20"
23
23
  },
24
- "version": "3.5.0-ultramodern.10",
24
+ "version": "3.5.0-ultramodern.12",
25
25
  "types": "./dist/types/index.d.ts",
26
26
  "main": "./dist/esm-node/index.js",
27
27
  "bin": {
@@ -77,7 +77,7 @@
77
77
  "@modern-js/codesmith": "2.6.9",
78
78
  "oxfmt": "0.56.0",
79
79
  "ultracite": "7.8.3",
80
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.5.0-ultramodern.10"
80
+ "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.5.0-ultramodern.12"
81
81
  },
82
82
  "devDependencies": {
83
83
  "@rslib/core": "0.23.1",
@@ -99,6 +99,6 @@
99
99
  "test": "rm -rf dist && rslib build -c rslibconfig.mts && rstest --passWithNoTests"
100
100
  },
101
101
  "ultramodern": {
102
- "frameworkVersion": "3.5.0-ultramodern.10"
102
+ "frameworkVersion": "3.5.0-ultramodern.12"
103
103
  }
104
104
  }
@@ -4,5 +4,7 @@ build/
4
4
  .modernjs/cache/
5
5
  .modern-js/
6
6
  **/.modern-js/
7
+ .mf/
8
+ **/.mf/
7
9
  .modernjs/agent-reference-repos-tmp/
8
10
  .codex/reports/