@bleedingdev/modern-js-create 3.2.0-ultramodern.120 → 3.2.0-ultramodern.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -12
- package/dist/cjs/create-package-root.cjs +7 -9
- package/dist/cjs/index.cjs +74 -44
- package/dist/cjs/locale/en.cjs +6 -7
- package/dist/cjs/locale/zh.cjs +6 -7
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +337 -0
- package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
- package/dist/cjs/ultramodern-workspace/contracts.cjs +836 -0
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
- package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
- package/dist/cjs/ultramodern-workspace/index.cjs +48 -0
- package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
- package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
- package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
- package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
- package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
- package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
- package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
- package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +153 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +153 -0
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +175 -0
- package/dist/esm/create-package-root.js +7 -9
- package/dist/esm/index.js +72 -42
- package/dist/esm/locale/en.js +6 -7
- package/dist/esm/locale/zh.js +6 -7
- package/dist/esm/ultramodern-workspace/add-vertical.js +252 -0
- package/dist/esm/ultramodern-workspace/app-files.js +149 -0
- package/dist/esm/ultramodern-workspace/contracts.js +741 -0
- package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
- package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
- package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
- package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
- package/dist/esm/ultramodern-workspace/index.js +3 -0
- package/dist/esm/ultramodern-workspace/locales.js +122 -0
- package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
- package/dist/esm/ultramodern-workspace/naming.js +71 -0
- package/dist/esm/ultramodern-workspace/package-json.js +338 -0
- package/dist/esm/ultramodern-workspace/package-source.js +21 -0
- package/dist/esm/ultramodern-workspace/policy.js +183 -0
- package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
- package/dist/esm/ultramodern-workspace/routes.js +280 -0
- package/dist/esm/ultramodern-workspace/types.js +16 -0
- package/dist/esm/ultramodern-workspace/versions.js +34 -0
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +91 -0
- package/dist/esm/ultramodern-workspace/write-workspace.js +121 -0
- package/dist/esm-node/create-package-root.js +7 -9
- package/dist/esm-node/index.js +72 -42
- package/dist/esm-node/locale/en.js +6 -7
- package/dist/esm-node/locale/zh.js +6 -7
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +253 -0
- package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
- package/dist/esm-node/ultramodern-workspace/contracts.js +742 -0
- package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
- package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
- package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
- package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
- package/dist/esm-node/ultramodern-workspace/index.js +4 -0
- package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
- package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
- package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
- package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
- package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
- package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
- package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
- package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
- package/dist/esm-node/ultramodern-workspace/types.js +17 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +35 -0
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -0
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +122 -0
- package/dist/types/locale/en.d.ts +4 -5
- package/dist/types/locale/index.d.ts +8 -10
- package/dist/types/locale/zh.d.ts +4 -5
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +19 -0
- package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
- package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
- package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
- package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
- package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
- package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
- package/dist/types/ultramodern-workspace/index.d.ts +4 -0
- package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
- package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
- package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
- package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
- package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
- package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
- package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
- package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
- package/dist/types/ultramodern-workspace/types.d.ts +95 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +38 -0
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
- package/package.json +4 -3
- package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +1 -4
- package/template-workspace/.mise.toml.handlebars +1 -0
- package/template-workspace/{AGENTS.md → AGENTS.md.handlebars} +12 -7
- package/template-workspace/README.md.handlebars +40 -24
- package/template-workspace/{pnpm-workspace.yaml → pnpm-workspace.yaml.handlebars} +2 -2
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +31 -51
- package/templates/app/shell-frame.tsx +49 -0
- package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
- package/templates/packages/shared-contracts-index.ts +466 -0
- package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
- package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +656 -0
- package/dist/cjs/ultramodern-workspace.cjs +0 -6797
- package/dist/esm/ultramodern-workspace.js +0 -6738
- package/dist/esm-node/ultramodern-workspace.js +0 -6739
- package/dist/types/ultramodern-workspace.d.ts +0 -29
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import node_fs from "node:fs";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import { createRouteHeadModule } from "./app-files.js";
|
|
4
|
+
import { relativeRootFor } from "./naming.js";
|
|
5
|
+
import { createPublicHeadRobotsPolicy, createPublicSurfaceContentExpansionPolicy } from "./policy.js";
|
|
6
|
+
import { createJsonLdHelperModule, createPublicRouteMetadata, createRouteAliasPage, createRouteMetaFilePath, createRouteMetaModule, createRouteMetadataModule, createRouteOwnedI18nPaths, createRoutePageFilePath, isConcretePublicPath, normalisePublicPath } from "./routes.js";
|
|
7
|
+
import { supportedWorkspaceLanguages } from "./types.js";
|
|
8
|
+
const publicSurfaceManagedSourceAssetPaths = [
|
|
9
|
+
'config/public/robots.txt',
|
|
10
|
+
'config/public/sitemap.xml',
|
|
11
|
+
'config/public/site.webmanifest'
|
|
12
|
+
];
|
|
13
|
+
const publicSurfaceBaseOutputFiles = [
|
|
14
|
+
'robots.txt'
|
|
15
|
+
];
|
|
16
|
+
const publicSurfacePublicRouteOutputFiles = [
|
|
17
|
+
'sitemap.xml',
|
|
18
|
+
'site.webmanifest'
|
|
19
|
+
];
|
|
20
|
+
function createLocalisedPublicPath(pathname, language) {
|
|
21
|
+
const publicPath = normalisePublicPath(pathname);
|
|
22
|
+
return '/' === publicPath ? `/${language}` : `/${language}${publicPath}`;
|
|
23
|
+
}
|
|
24
|
+
function uniqueSorted(values) {
|
|
25
|
+
return Array.from(new Set(values)).sort((left, right)=>left.localeCompare(right));
|
|
26
|
+
}
|
|
27
|
+
function createPublicSurfaceRouteEntries(app) {
|
|
28
|
+
return createPublicRouteMetadata(app).map((route)=>{
|
|
29
|
+
const localeUrlPaths = Object.fromEntries(supportedWorkspaceLanguages.map((language)=>[
|
|
30
|
+
language,
|
|
31
|
+
createLocalisedPublicPath(route.localisedPaths[language], language)
|
|
32
|
+
]));
|
|
33
|
+
if (!Object.values(localeUrlPaths).every(isConcretePublicPath)) return;
|
|
34
|
+
return {
|
|
35
|
+
...route,
|
|
36
|
+
canonicalUrlPath: localeUrlPaths.en,
|
|
37
|
+
localeUrlPaths
|
|
38
|
+
};
|
|
39
|
+
}).filter((route)=>void 0 !== route).sort((left, right)=>left.canonicalUrlPath.localeCompare(right.canonicalUrlPath) || left.id.localeCompare(right.id));
|
|
40
|
+
}
|
|
41
|
+
function createPublicSurfaceUrlPaths(app) {
|
|
42
|
+
return uniqueSorted(createPublicSurfaceRouteEntries(app).flatMap((route)=>supportedWorkspaceLanguages.map((language)=>route.localeUrlPaths[language])));
|
|
43
|
+
}
|
|
44
|
+
function createPublicSurfaceOutputFiles(app) {
|
|
45
|
+
return [
|
|
46
|
+
...publicSurfaceBaseOutputFiles,
|
|
47
|
+
...createPublicRouteMetadata(app).length > 0 ? publicSurfacePublicRouteOutputFiles : []
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
function createPublicSurfaceGenerationCommand(app, target, requirePublicOrigin = false) {
|
|
51
|
+
return `node ${relativeRootFor(app.directory)}/scripts/generate-public-surface-assets.mjs --app ${app.id} --target ${target}${requirePublicOrigin ? ' --require-public-origin' : ''}`;
|
|
52
|
+
}
|
|
53
|
+
function rewriteWorkspaceAssetsForApp(workspaceRoot, app) {
|
|
54
|
+
for (const relativePath of publicSurfaceManagedSourceAssetPaths)node_fs.rmSync(node_path.join(workspaceRoot, app.directory, relativePath), {
|
|
55
|
+
force: true
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function createPublicSurfaceContract(app) {
|
|
59
|
+
const files = createPublicSurfaceOutputFiles(app);
|
|
60
|
+
const contentExpansionPolicy = createPublicSurfaceContentExpansionPolicy();
|
|
61
|
+
return {
|
|
62
|
+
authoring: 'colocated-route-meta',
|
|
63
|
+
artifactLifecycle: 'build-and-deploy-output',
|
|
64
|
+
generatedManifest: './src/routes/ultramodern-route-metadata',
|
|
65
|
+
source: 'route-owned-public-routes',
|
|
66
|
+
metadataExport: './src/routes/ultramodern-route-metadata',
|
|
67
|
+
generator: "scripts/generate-public-surface-assets.mjs",
|
|
68
|
+
outputRoot: 'dist/public',
|
|
69
|
+
cloudflareOutputRoot: '.output/public',
|
|
70
|
+
privateRoutePolicy: 'omit-from-generated-public-surface',
|
|
71
|
+
files,
|
|
72
|
+
omittedByDefault: [
|
|
73
|
+
'api-catalog.json',
|
|
74
|
+
'llms.txt',
|
|
75
|
+
'security.txt'
|
|
76
|
+
],
|
|
77
|
+
languages: [
|
|
78
|
+
...supportedWorkspaceLanguages
|
|
79
|
+
],
|
|
80
|
+
contentExpansion: {
|
|
81
|
+
authoring: 'route-owned-esm-provider',
|
|
82
|
+
defaultProviderFile: contentExpansionPolicy.defaultProviderFile,
|
|
83
|
+
entryExport: 'default-or-entries',
|
|
84
|
+
paramsSource: 'params-or-localeParams',
|
|
85
|
+
draftPolicy: contentExpansionPolicy.draftPolicy,
|
|
86
|
+
indexablePolicy: contentExpansionPolicy.indexablePolicy,
|
|
87
|
+
lifecycle: 'executed-during-public-surface-generation'
|
|
88
|
+
},
|
|
89
|
+
contentSources: [],
|
|
90
|
+
publicRoutes: createPublicRouteMetadata(app),
|
|
91
|
+
routeEntries: createPublicSurfaceRouteEntries(app),
|
|
92
|
+
concreteUrlPaths: createPublicSurfaceUrlPaths(app)
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function createPublicHeadContract() {
|
|
96
|
+
const robotsPolicy = createPublicHeadRobotsPolicy();
|
|
97
|
+
return {
|
|
98
|
+
authoring: 'colocated-route-meta',
|
|
99
|
+
generator: './src/routes/ultramodern-route-head',
|
|
100
|
+
renderer: '@modern-js/runtime/head Helmet',
|
|
101
|
+
ssr: true,
|
|
102
|
+
title: {
|
|
103
|
+
required: true,
|
|
104
|
+
source: 'route.titleKey'
|
|
105
|
+
},
|
|
106
|
+
description: {
|
|
107
|
+
required: true,
|
|
108
|
+
source: "route.descriptionKey"
|
|
109
|
+
},
|
|
110
|
+
canonical: {
|
|
111
|
+
publicIndexableOnly: true,
|
|
112
|
+
source: 'localized canonical route URL'
|
|
113
|
+
},
|
|
114
|
+
alternates: {
|
|
115
|
+
hreflang: [
|
|
116
|
+
...supportedWorkspaceLanguages
|
|
117
|
+
],
|
|
118
|
+
xDefault: 'en'
|
|
119
|
+
},
|
|
120
|
+
openGraph: {
|
|
121
|
+
publicIndexableOnly: true,
|
|
122
|
+
required: [
|
|
123
|
+
'og:title',
|
|
124
|
+
"og:description",
|
|
125
|
+
'og:url',
|
|
126
|
+
'og:type'
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
twitter: {
|
|
130
|
+
publicIndexableOnly: true,
|
|
131
|
+
required: [
|
|
132
|
+
'twitter:card',
|
|
133
|
+
'twitter:title',
|
|
134
|
+
"twitter:description"
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
structuredData: {
|
|
138
|
+
publicIndexableOnly: true,
|
|
139
|
+
optional: true,
|
|
140
|
+
source: 'route.jsonLd',
|
|
141
|
+
inference: false,
|
|
142
|
+
helperModule: './src/routes/ultramodern-jsonld',
|
|
143
|
+
helperTypes: [
|
|
144
|
+
'WebPage',
|
|
145
|
+
'WebApplication',
|
|
146
|
+
'SoftwareApplication',
|
|
147
|
+
'BreadcrumbList',
|
|
148
|
+
'FAQPage',
|
|
149
|
+
'Organization'
|
|
150
|
+
],
|
|
151
|
+
sanitizesHtmlOpenBracket: true
|
|
152
|
+
},
|
|
153
|
+
privateRouteRobots: robotsPolicy.privateRouteRobots
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function createPublicWebAppArtifacts(app) {
|
|
157
|
+
const routeMetadata = createRouteOwnedI18nPaths(app);
|
|
158
|
+
return {
|
|
159
|
+
jsonLdHelperFile: {
|
|
160
|
+
path: `${app.directory}/src/routes/ultramodern-jsonld.ts`,
|
|
161
|
+
content: createJsonLdHelperModule()
|
|
162
|
+
},
|
|
163
|
+
routeMetadataFile: {
|
|
164
|
+
path: `${app.directory}/src/routes/ultramodern-route-metadata.ts`,
|
|
165
|
+
content: createRouteMetadataModule(app)
|
|
166
|
+
},
|
|
167
|
+
routeHeadFile: {
|
|
168
|
+
path: `${app.directory}/src/routes/ultramodern-route-head.tsx`,
|
|
169
|
+
content: createRouteHeadModule(app)
|
|
170
|
+
},
|
|
171
|
+
routeMetaFiles: routeMetadata.map((route)=>({
|
|
172
|
+
path: createRouteMetaFilePath(app, route.canonicalPath),
|
|
173
|
+
content: createRouteMetaModule(route)
|
|
174
|
+
})),
|
|
175
|
+
routeAliasFiles: routeMetadata.filter((route)=>'/' !== route.canonicalPath && 'shell' !== app.kind).map((route)=>({
|
|
176
|
+
path: createRoutePageFilePath(app, route.canonicalPath),
|
|
177
|
+
content: createRouteAliasPage(route.canonicalPath)
|
|
178
|
+
})),
|
|
179
|
+
publicHead: createPublicHeadContract(),
|
|
180
|
+
publicSurface: createPublicSurfaceContract(app)
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
export { createLocalisedPublicPath, createPublicHeadContract, createPublicSurfaceContract, createPublicSurfaceGenerationCommand, createPublicSurfaceOutputFiles, createPublicSurfaceRouteEntries, createPublicSurfaceUrlPaths, createPublicWebAppArtifacts, publicSurfaceBaseOutputFiles, publicSurfaceManagedSourceAssetPaths, publicSurfacePublicRouteOutputFiles, rewriteWorkspaceAssetsForApp, uniqueSorted };
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { appI18nNamespace } from "./descriptors.js";
|
|
2
|
+
import { sortJsonValue } from "./types.js";
|
|
3
|
+
const privateAppRoutePublicness = {
|
|
4
|
+
indexable: false,
|
|
5
|
+
public: false,
|
|
6
|
+
publicSurface: 'private-app-screen'
|
|
7
|
+
};
|
|
8
|
+
function createRouteOwnedI18nPaths(app) {
|
|
9
|
+
const namespace = appI18nNamespace(app);
|
|
10
|
+
const base = {
|
|
11
|
+
descriptionKey: `${namespace}.seo.description`,
|
|
12
|
+
mfBoundaryId: app.mfName,
|
|
13
|
+
namespace,
|
|
14
|
+
ownerAppId: app.id,
|
|
15
|
+
...privateAppRoutePublicness
|
|
16
|
+
};
|
|
17
|
+
if ('shell' === app.kind) return [
|
|
18
|
+
{
|
|
19
|
+
...base,
|
|
20
|
+
canonicalPath: '/',
|
|
21
|
+
id: 'shell-home',
|
|
22
|
+
localisedPaths: {
|
|
23
|
+
cs: '/',
|
|
24
|
+
en: '/'
|
|
25
|
+
},
|
|
26
|
+
titleKey: 'shell.title'
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
return [
|
|
30
|
+
{
|
|
31
|
+
...base,
|
|
32
|
+
canonicalPath: '/',
|
|
33
|
+
id: `${app.id}-home`,
|
|
34
|
+
localisedPaths: {
|
|
35
|
+
cs: '/',
|
|
36
|
+
en: '/'
|
|
37
|
+
},
|
|
38
|
+
titleKey: `${namespace}.title`
|
|
39
|
+
}
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
function isPublicIndexableRoute(route) {
|
|
43
|
+
return route.public && route.indexable;
|
|
44
|
+
}
|
|
45
|
+
function createLocalisedUrlsMapFromRoutes(routes) {
|
|
46
|
+
return Object.fromEntries(routes.flatMap((route)=>{
|
|
47
|
+
if ('/' === route.canonicalPath) return [];
|
|
48
|
+
return Array.from(new Set([
|
|
49
|
+
route.canonicalPath,
|
|
50
|
+
...Object.values(route.localisedPaths)
|
|
51
|
+
])).map((pathname)=>[
|
|
52
|
+
pathname,
|
|
53
|
+
route.localisedPaths
|
|
54
|
+
]);
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
function createLocalisedUrlsMap(app) {
|
|
58
|
+
return createLocalisedUrlsMapFromRoutes(createRouteOwnedI18nPaths(app));
|
|
59
|
+
}
|
|
60
|
+
function createPublicRouteMetadataFromRoutes(routes) {
|
|
61
|
+
return routes.filter(isPublicIndexableRoute).map((route)=>{
|
|
62
|
+
const metadata = {
|
|
63
|
+
canonicalPath: route.canonicalPath,
|
|
64
|
+
id: route.id,
|
|
65
|
+
localisedPaths: route.localisedPaths,
|
|
66
|
+
namespace: route.namespace,
|
|
67
|
+
ownerAppId: route.ownerAppId,
|
|
68
|
+
descriptionKey: route.descriptionKey,
|
|
69
|
+
titleKey: route.titleKey
|
|
70
|
+
};
|
|
71
|
+
if (void 0 !== route.jsonLd) metadata.jsonLd = route.jsonLd;
|
|
72
|
+
return metadata;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function createPublicRouteMetadata(app) {
|
|
76
|
+
return createPublicRouteMetadataFromRoutes(createRouteOwnedI18nPaths(app));
|
|
77
|
+
}
|
|
78
|
+
function createJsonLdHelperModule() {
|
|
79
|
+
return `export type JsonLdPrimitive = string | number | boolean | null;
|
|
80
|
+
export type JsonLdValue =
|
|
81
|
+
| JsonLdPrimitive
|
|
82
|
+
| readonly JsonLdValue[]
|
|
83
|
+
| { readonly [key: string]: JsonLdValue };
|
|
84
|
+
export type JsonLdObject = Readonly<Record<string, JsonLdValue>>;
|
|
85
|
+
export type RouteJsonLd = JsonLdObject | readonly JsonLdObject[];
|
|
86
|
+
|
|
87
|
+
const schemaContext = 'https://schema.org' as const;
|
|
88
|
+
|
|
89
|
+
type SchemaObject<TType extends string> = JsonLdObject & {
|
|
90
|
+
readonly '@context': typeof schemaContext;
|
|
91
|
+
readonly '@type': TType;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
type ThingReference =
|
|
95
|
+
| string
|
|
96
|
+
| {
|
|
97
|
+
readonly '@id'?: string;
|
|
98
|
+
readonly '@type'?: string;
|
|
99
|
+
readonly name?: string;
|
|
100
|
+
readonly url?: string;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const withSchemaContext = <TType extends string, TInput extends object>(
|
|
104
|
+
type: TType,
|
|
105
|
+
input: TInput,
|
|
106
|
+
): SchemaObject<TType> & TInput => ({
|
|
107
|
+
'@context': schemaContext,
|
|
108
|
+
'@type': type,
|
|
109
|
+
...input,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export const defineRouteJsonLd = <TJsonLd extends RouteJsonLd>(
|
|
113
|
+
jsonLd: TJsonLd,
|
|
114
|
+
): TJsonLd => jsonLd;
|
|
115
|
+
|
|
116
|
+
export interface WebPageJsonLdInput {
|
|
117
|
+
readonly name: string;
|
|
118
|
+
readonly url: string;
|
|
119
|
+
readonly description?: string;
|
|
120
|
+
readonly inLanguage?: string | readonly string[];
|
|
121
|
+
readonly isPartOf?: ThingReference;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export const webPageJsonLd = (input: WebPageJsonLdInput) =>
|
|
125
|
+
withSchemaContext('WebPage', input);
|
|
126
|
+
|
|
127
|
+
export interface WebApplicationJsonLdInput {
|
|
128
|
+
readonly name: string;
|
|
129
|
+
readonly url: string;
|
|
130
|
+
readonly applicationCategory?: string;
|
|
131
|
+
readonly browserRequirements?: string;
|
|
132
|
+
readonly description?: string;
|
|
133
|
+
readonly operatingSystem?: string;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export const webApplicationJsonLd = (input: WebApplicationJsonLdInput) =>
|
|
137
|
+
withSchemaContext('WebApplication', input);
|
|
138
|
+
|
|
139
|
+
export interface SoftwareApplicationJsonLdInput {
|
|
140
|
+
readonly name: string;
|
|
141
|
+
readonly url: string;
|
|
142
|
+
readonly applicationCategory?: string;
|
|
143
|
+
readonly applicationSubCategory?: string;
|
|
144
|
+
readonly description?: string;
|
|
145
|
+
readonly offers?: ThingReference;
|
|
146
|
+
readonly operatingSystem?: string;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export const softwareApplicationJsonLd = (
|
|
150
|
+
input: SoftwareApplicationJsonLdInput,
|
|
151
|
+
) => withSchemaContext('SoftwareApplication', input);
|
|
152
|
+
|
|
153
|
+
export interface OrganizationJsonLdInput {
|
|
154
|
+
readonly name: string;
|
|
155
|
+
readonly url?: string;
|
|
156
|
+
readonly logo?: string;
|
|
157
|
+
readonly sameAs?: readonly string[];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export const organizationJsonLd = (input: OrganizationJsonLdInput) =>
|
|
161
|
+
withSchemaContext('Organization', input);
|
|
162
|
+
|
|
163
|
+
export interface BreadcrumbListItemInput {
|
|
164
|
+
readonly name: string;
|
|
165
|
+
readonly item: string;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export const breadcrumbListJsonLd = (
|
|
169
|
+
items: readonly BreadcrumbListItemInput[],
|
|
170
|
+
) =>
|
|
171
|
+
withSchemaContext('BreadcrumbList', {
|
|
172
|
+
itemListElement: items.map((entry, index) => ({
|
|
173
|
+
'@type': 'ListItem',
|
|
174
|
+
item: entry.item,
|
|
175
|
+
name: entry.name,
|
|
176
|
+
position: index + 1,
|
|
177
|
+
})),
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
export interface FAQPageQuestionInput {
|
|
181
|
+
readonly name: string;
|
|
182
|
+
readonly acceptedAnswer: {
|
|
183
|
+
readonly text: string;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export const faqPageJsonLd = (questions: readonly FAQPageQuestionInput[]) =>
|
|
188
|
+
withSchemaContext('FAQPage', {
|
|
189
|
+
mainEntity: questions.map(question => ({
|
|
190
|
+
'@type': 'Question',
|
|
191
|
+
acceptedAnswer: {
|
|
192
|
+
'@type': 'Answer',
|
|
193
|
+
text: question.acceptedAnswer.text,
|
|
194
|
+
},
|
|
195
|
+
name: question.name,
|
|
196
|
+
})),
|
|
197
|
+
});
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
function createRouteMetadataModule(app) {
|
|
201
|
+
const routes = sortJsonValue(createRouteOwnedI18nPaths(app));
|
|
202
|
+
const localisedUrls = sortJsonValue(createLocalisedUrlsMap(app));
|
|
203
|
+
const publicRoutes = sortJsonValue(createPublicRouteMetadata(app));
|
|
204
|
+
const namespace = appI18nNamespace(app);
|
|
205
|
+
return `// @generated by @modern-js/create.
|
|
206
|
+
// Author route metadata in colocated src/routes/**/route.meta.ts files.
|
|
207
|
+
// This compatibility manifest is regenerated from route-owned metadata.
|
|
208
|
+
|
|
209
|
+
export const ultramodernRouteNamespace = '${namespace}' as const;
|
|
210
|
+
|
|
211
|
+
export const ultramodernRouteMetadata = ${JSON.stringify(routes, null, 2)} as const;
|
|
212
|
+
|
|
213
|
+
export const ultramodernLocalisedUrls = ${JSON.stringify(localisedUrls, null, 2)} as const;
|
|
214
|
+
|
|
215
|
+
export const ultramodernPublicRoutes = ${JSON.stringify(publicRoutes, null, 2)} as const;
|
|
216
|
+
|
|
217
|
+
export const ultramodernRouteConfig = {
|
|
218
|
+
authoring: 'colocated-route-meta',
|
|
219
|
+
generatedManifest: true,
|
|
220
|
+
localisedUrls: ultramodernLocalisedUrls,
|
|
221
|
+
namespace: ultramodernRouteNamespace,
|
|
222
|
+
publicRoutes: ultramodernPublicRoutes,
|
|
223
|
+
routes: ultramodernRouteMetadata,
|
|
224
|
+
source: 'route-owned',
|
|
225
|
+
} as const;
|
|
226
|
+
`;
|
|
227
|
+
}
|
|
228
|
+
function createRouteMetaModule(route) {
|
|
229
|
+
return `const routeMeta = ${JSON.stringify(sortJsonValue(route), null, 2)} as const;
|
|
230
|
+
|
|
231
|
+
export default routeMeta;
|
|
232
|
+
export { routeMeta };
|
|
233
|
+
`;
|
|
234
|
+
}
|
|
235
|
+
function normalisePublicPath(pathname) {
|
|
236
|
+
const normalised = pathname.trim().replaceAll(/\/+/gu, '/').replace(/\/+$/u, '');
|
|
237
|
+
return normalised.length > 0 && normalised.startsWith('/') ? normalised : `/${normalised}`;
|
|
238
|
+
}
|
|
239
|
+
function splitPublicPathSegments(pathname) {
|
|
240
|
+
return normalisePublicPath(pathname).split('/').filter(Boolean);
|
|
241
|
+
}
|
|
242
|
+
function routePathParamName(segment) {
|
|
243
|
+
if (segment.startsWith(':')) return segment.slice(1).replace(/[?*+]$/u, '');
|
|
244
|
+
if (segment.startsWith('[') && segment.endsWith(']')) return segment.slice(1, -1).replace(/^\.\.\./u, '').replace(/\$$/u, '');
|
|
245
|
+
}
|
|
246
|
+
function isDynamicPublicPathSegment(segment) {
|
|
247
|
+
return void 0 !== routePathParamName(segment) || segment.includes('*') || segment.startsWith('[');
|
|
248
|
+
}
|
|
249
|
+
function isConcretePublicPath(pathname) {
|
|
250
|
+
return !splitPublicPathSegments(pathname).some(isDynamicPublicPathSegment);
|
|
251
|
+
}
|
|
252
|
+
function routeSegmentToDirectory(segment) {
|
|
253
|
+
const paramName = routePathParamName(segment);
|
|
254
|
+
if (paramName && segment.startsWith(':')) return segment.endsWith('?') ? `[${paramName}$]` : `[${paramName}]`;
|
|
255
|
+
return segment;
|
|
256
|
+
}
|
|
257
|
+
function routePathDirectorySegments(routePath) {
|
|
258
|
+
return splitPublicPathSegments(routePath).map(routeSegmentToDirectory);
|
|
259
|
+
}
|
|
260
|
+
function createRoutePageFilePath(app, canonicalPath) {
|
|
261
|
+
const segments = routePathDirectorySegments(canonicalPath);
|
|
262
|
+
return `${app.directory}/src/routes/[lang]/${[
|
|
263
|
+
...segments,
|
|
264
|
+
'page.tsx'
|
|
265
|
+
].join('/')}`;
|
|
266
|
+
}
|
|
267
|
+
function createRouteMetaFilePath(app, canonicalPath) {
|
|
268
|
+
const segments = routePathDirectorySegments(canonicalPath);
|
|
269
|
+
return `${app.directory}/src/routes/[lang]/${[
|
|
270
|
+
...segments,
|
|
271
|
+
'route.meta.ts'
|
|
272
|
+
].join('/')}`;
|
|
273
|
+
}
|
|
274
|
+
function createRouteAliasPage(canonicalPath) {
|
|
275
|
+
const depth = canonicalPath.split('/').filter(Boolean).length;
|
|
276
|
+
const rootPageImport = `${'../'.repeat(depth)}page`;
|
|
277
|
+
return `export { default } from '${rootPageImport}';
|
|
278
|
+
`;
|
|
279
|
+
}
|
|
280
|
+
export { createJsonLdHelperModule, createLocalisedUrlsMap, createLocalisedUrlsMapFromRoutes, createPublicRouteMetadata, createPublicRouteMetadataFromRoutes, createRouteAliasPage, createRouteMetaFilePath, createRouteMetaModule, createRouteMetadataModule, createRouteOwnedI18nPaths, createRoutePageFilePath, isConcretePublicPath, isDynamicPublicPathSegment, isPublicIndexableRoute, normalisePublicPath, privateAppRoutePublicness, routePathDirectorySegments, routePathParamName, routeSegmentToDirectory, splitPublicPathSegments };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function sortJsonValue(value) {
|
|
2
|
+
if (Array.isArray(value)) return value.map(sortJsonValue);
|
|
3
|
+
if (null !== value && 'object' == typeof value) return Object.fromEntries(Object.entries(value).sort(([left], [right])=>left.localeCompare(right)).map(([key, entry])=>[
|
|
4
|
+
key,
|
|
5
|
+
sortJsonValue(entry)
|
|
6
|
+
]));
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
const supportedWorkspaceLanguages = [
|
|
10
|
+
'en',
|
|
11
|
+
'cs'
|
|
12
|
+
];
|
|
13
|
+
function isRecord(value) {
|
|
14
|
+
return null !== value && 'object' == typeof value && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
export { isRecord, sortJsonValue, supportedWorkspaceLanguages };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const TANSTACK_ROUTER_VERSION = '1.170.15';
|
|
2
|
+
const MODULE_FEDERATION_VERSION = '2.5.1';
|
|
3
|
+
const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.1.1';
|
|
4
|
+
const ZEPHYR_AGENT_VERSION = '1.1.1';
|
|
5
|
+
const WRANGLER_VERSION = '4.99.0';
|
|
6
|
+
const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
|
|
7
|
+
const TAILWIND_VERSION = '4.3.0';
|
|
8
|
+
const TAILWIND_POSTCSS_VERSION = '4.3.0';
|
|
9
|
+
const POSTCSS_VERSION = '8.5.15';
|
|
10
|
+
const EFFECT_TSGO_VERSION = '0.14.3';
|
|
11
|
+
const TYPESCRIPT_VERSION = '6.0.3';
|
|
12
|
+
const TYPESCRIPT_NATIVE_PREVIEW_VERSION = '7.0.0-dev.20260610.1';
|
|
13
|
+
const OXLINT_VERSION = '1.69.0';
|
|
14
|
+
const OXFMT_VERSION = '0.54.0';
|
|
15
|
+
const ULTRACITE_VERSION = '7.8.3';
|
|
16
|
+
const LEFTHOOK_VERSION = '^2.1.9';
|
|
17
|
+
const I18NEXT_VERSION = '26.3.1';
|
|
18
|
+
const NODE_FETCH_VERSION = '^3.3.2';
|
|
19
|
+
const REACT_VERSION = '^19.2.7';
|
|
20
|
+
const REACT_DOM_VERSION = '^19.2.7';
|
|
21
|
+
const REACT_ROUTER_DOM_VERSION = '7.17.0';
|
|
22
|
+
const TYPES_REACT_VERSION = '^19.2.17';
|
|
23
|
+
const TYPES_REACT_DOM_VERSION = '^19.2.3';
|
|
24
|
+
const NODE_VERSION = '26.3.0';
|
|
25
|
+
const PNPM_VERSION = '11.5.3';
|
|
26
|
+
const RSTACK_AGENT_SKILLS_COMMIT = '61c948b42512e223bad44b83af4080eba48b2677';
|
|
27
|
+
const MODULE_FEDERATION_AGENT_SKILLS_COMMIT = '07bb5b6c43ad457609e00c081b72d4c42508ec76';
|
|
28
|
+
const ultramodernWorkspaceVersions = {
|
|
29
|
+
tanstackRouter: TANSTACK_ROUTER_VERSION,
|
|
30
|
+
moduleFederation: MODULE_FEDERATION_VERSION,
|
|
31
|
+
tailwind: TAILWIND_VERSION,
|
|
32
|
+
tailwindPostcss: TAILWIND_POSTCSS_VERSION
|
|
33
|
+
};
|
|
34
|
+
export { CLOUDFLARE_COMPATIBILITY_DATE, EFFECT_TSGO_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_DOM_VERSION, REACT_VERSION, RSTACK_AGENT_SKILLS_COMMIT, TAILWIND_POSTCSS_VERSION, TAILWIND_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION, ultramodernWorkspaceVersions };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { remoteComponentOutputPath } from "./demo-components.js";
|
|
2
|
+
import { appHasEffectApi, appI18nNamespace, remoteDependencyAlias, shellApp } from "./descriptors.js";
|
|
3
|
+
import { verticalEffectGroupName } from "./effect-api.js";
|
|
4
|
+
import { readFileTemplate, renderFileTemplate, writeFileReplacing } from "./fs-io.js";
|
|
5
|
+
import { packageName, tailwindPrefixForApp } from "./naming.js";
|
|
6
|
+
import { createCloudflareSecurityContract } from "./policy.js";
|
|
7
|
+
import { publicSurfaceManagedSourceAssetPaths } from "./public-surface.js";
|
|
8
|
+
import { createLocalisedUrlsMap, createRouteMetaFilePath, createRouteOwnedI18nPaths, createRoutePageFilePath } from "./routes.js";
|
|
9
|
+
import { CLOUDFLARE_COMPATIBILITY_DATE, NODE_VERSION, PNPM_VERSION } from "./versions.js";
|
|
10
|
+
function createAssertMfTypesScript(remotes = []) {
|
|
11
|
+
return renderFileTemplate("workspace-scripts/assert-mf-types.mjs", {
|
|
12
|
+
defaultAppDirsJson: JSON.stringify(remotes.map((remote)=>remote.directory), null, 2)
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function createWorkspaceValidationScript(scope, enableTailwind, remotes = []) {
|
|
16
|
+
const verticals = remotes.filter(appHasEffectApi).map((remote)=>({
|
|
17
|
+
id: remote.id,
|
|
18
|
+
domain: remote.domain,
|
|
19
|
+
stem: remote.effectApi.stem,
|
|
20
|
+
group: verticalEffectGroupName(remote),
|
|
21
|
+
path: remote.directory,
|
|
22
|
+
mfName: remote.mfName,
|
|
23
|
+
apiPrefix: remote.effectApi.prefix,
|
|
24
|
+
tailwindPrefix: tailwindPrefixForApp(remote),
|
|
25
|
+
zephyrAlias: remoteDependencyAlias(remote),
|
|
26
|
+
packageName: packageName(scope, remote.packageSuffix),
|
|
27
|
+
exposes: Object.keys(remote.exposes ?? {}),
|
|
28
|
+
componentPaths: Object.keys(remote.exposes ?? {}).map((expose)=>remoteComponentOutputPath(remote, expose)).filter((componentPath)=>Boolean(componentPath)),
|
|
29
|
+
namespace: appI18nNamespace(remote),
|
|
30
|
+
routePagePaths: createRouteOwnedI18nPaths(remote).filter((route)=>'/' !== route.canonicalPath).map((route)=>createRoutePageFilePath(remote, route.canonicalPath)),
|
|
31
|
+
routeMetaPaths: createRouteOwnedI18nPaths(remote).map((route)=>createRouteMetaFilePath(remote, route.canonicalPath)),
|
|
32
|
+
localisedUrls: createLocalisedUrlsMap(remote),
|
|
33
|
+
verticalRefs: remote.verticalRefs ?? []
|
|
34
|
+
}));
|
|
35
|
+
const shellRouteMetaPaths = createRouteOwnedI18nPaths(shellApp).map((route)=>createRouteMetaFilePath(shellApp, route.canonicalPath));
|
|
36
|
+
const shellNamespace = appI18nNamespace(shellApp);
|
|
37
|
+
const oldRemotePaths = [
|
|
38
|
+
'apps/remotes'
|
|
39
|
+
];
|
|
40
|
+
const expectedBuildScript = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types && pnpm performance:readiness' : 'ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types && pnpm performance:readiness';
|
|
41
|
+
const expectedCloudflareBuildScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types';
|
|
42
|
+
const expectedCloudflareDeployScript = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:deploy && pnpm --filter "./apps/shell-super-app" run cloudflare:deploy' : 'pnpm --filter "./apps/shell-super-app" run cloudflare:deploy';
|
|
43
|
+
const expectedCloudflareSecurity = createCloudflareSecurityContract();
|
|
44
|
+
return renderFileTemplate("workspace-scripts/validate-ultramodern-workspace.mjs", {
|
|
45
|
+
packageScope: scope,
|
|
46
|
+
nodeVersion: NODE_VERSION,
|
|
47
|
+
pnpmVersion: PNPM_VERSION,
|
|
48
|
+
tailwindEnabledJson: JSON.stringify(enableTailwind),
|
|
49
|
+
fullStackVerticalsJson: JSON.stringify(verticals, null, 2),
|
|
50
|
+
shellNamespaceJson: JSON.stringify(shellNamespace),
|
|
51
|
+
oldRemotePathsJson: JSON.stringify(oldRemotePaths, null, 2),
|
|
52
|
+
expectedBuildScriptJson: JSON.stringify(expectedBuildScript),
|
|
53
|
+
expectedCloudflareBuildScriptJson: JSON.stringify(expectedCloudflareBuildScript),
|
|
54
|
+
expectedCloudflareDeployScriptJson: JSON.stringify(expectedCloudflareDeployScript),
|
|
55
|
+
expectedCloudflareSecurityJson: JSON.stringify(expectedCloudflareSecurity, null, 2),
|
|
56
|
+
publicSurfaceManagedSourceAssetPathsJson: JSON.stringify([
|
|
57
|
+
...publicSurfaceManagedSourceAssetPaths
|
|
58
|
+
], null, 2),
|
|
59
|
+
shellRouteMetaPathsJson: JSON.stringify(shellRouteMetaPaths, null, 2),
|
|
60
|
+
cloudflareCompatibilityDate: CLOUDFLARE_COMPATIBILITY_DATE
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function createWorkspaceI18nBoundaryValidationScript() {
|
|
64
|
+
return readFileTemplate("workspace-scripts/check-ultramodern-i18n-boundaries.mjs");
|
|
65
|
+
}
|
|
66
|
+
function createPublicSurfaceAssetsScript() {
|
|
67
|
+
return readFileTemplate("workspace-scripts/generate-public-surface-assets.mjs");
|
|
68
|
+
}
|
|
69
|
+
function createCloudflareProofHelperScript() {
|
|
70
|
+
return readFileTemplate("workspace-scripts/ultramodern-cloudflare-proof.mjs");
|
|
71
|
+
}
|
|
72
|
+
function createCloudflareVersionProofScript() {
|
|
73
|
+
return readFileTemplate("workspace-scripts/proof-cloudflare-version.mjs");
|
|
74
|
+
}
|
|
75
|
+
function createPerformanceReadinessConfigScript() {
|
|
76
|
+
return readFileTemplate("workspace-scripts/ultramodern-performance-readiness.config.mjs");
|
|
77
|
+
}
|
|
78
|
+
function createPerformanceReadinessScript() {
|
|
79
|
+
return readFileTemplate("workspace-scripts/ultramodern-performance-readiness.mjs");
|
|
80
|
+
}
|
|
81
|
+
function writeGeneratedWorkspaceScripts(targetDir, scope, enableTailwind, remotes = []) {
|
|
82
|
+
writeFileReplacing(targetDir, "scripts/assert-mf-types.mjs", createAssertMfTypesScript(remotes));
|
|
83
|
+
writeFileReplacing(targetDir, "scripts/validate-ultramodern-workspace.mjs", createWorkspaceValidationScript(scope, enableTailwind, remotes));
|
|
84
|
+
writeFileReplacing(targetDir, "scripts/check-ultramodern-i18n-boundaries.mjs", createWorkspaceI18nBoundaryValidationScript());
|
|
85
|
+
writeFileReplacing(targetDir, "scripts/generate-public-surface-assets.mjs", createPublicSurfaceAssetsScript());
|
|
86
|
+
writeFileReplacing(targetDir, "scripts/ultramodern-cloudflare-proof.mjs", createCloudflareProofHelperScript());
|
|
87
|
+
writeFileReplacing(targetDir, "scripts/proof-cloudflare-version.mjs", createCloudflareVersionProofScript());
|
|
88
|
+
writeFileReplacing(targetDir, "scripts/ultramodern-performance-readiness.config.mjs", createPerformanceReadinessConfigScript());
|
|
89
|
+
writeFileReplacing(targetDir, "scripts/ultramodern-performance-readiness.mjs", createPerformanceReadinessScript());
|
|
90
|
+
}
|
|
91
|
+
export { createAssertMfTypesScript, createCloudflareProofHelperScript, createCloudflareVersionProofScript, createPerformanceReadinessConfigScript, createPerformanceReadinessScript, createPublicSurfaceAssetsScript, createWorkspaceI18nBoundaryValidationScript, createWorkspaceValidationScript, writeGeneratedWorkspaceScripts };
|