@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.
- package/dist/cjs/ultramodern-tooling/commands.cjs +176 -2
- package/dist/cjs/ultramodern-workspace/app-files.cjs +8 -11
- package/dist/cjs/ultramodern-workspace/package-json.cjs +14 -6
- package/dist/cjs/ultramodern-workspace/versions.cjs +5 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +1 -0
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +1 -0
- package/dist/esm/ultramodern-tooling/commands.js +177 -3
- package/dist/esm/ultramodern-workspace/app-files.js +8 -11
- package/dist/esm/ultramodern-workspace/package-json.js +4 -6
- package/dist/esm/ultramodern-workspace/versions.js +3 -1
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +2 -1
- package/dist/esm/ultramodern-workspace/write-workspace.js +2 -1
- package/dist/esm-node/ultramodern-tooling/commands.js +177 -3
- package/dist/esm-node/ultramodern-workspace/app-files.js +8 -11
- package/dist/esm-node/ultramodern-workspace/package-json.js +4 -6
- package/dist/esm-node/ultramodern-workspace/versions.js +3 -1
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +2 -1
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +2 -1
- package/dist/types/ultramodern-workspace/versions.d.ts +2 -0
- package/package.json +3 -3
- package/template-workspace/.gitignore.handlebars +2 -0
- package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +452 -0
- package/template-workspace/patches/effect-schema-error-type-id.patch +18 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +1 -0
- 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:
|
|
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.
|
|
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:
|
|
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 {
|
|
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,
|
|
450
|
-
has to pass pnpm api: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
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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:
|
|
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.
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
102
|
+
"frameworkVersion": "3.5.0-ultramodern.12"
|
|
103
103
|
}
|
|
104
104
|
}
|