@raypx-kit/devkit 0.0.0-alpha.0 → 0.0.0-alpha.1
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/CHANGELOG.md +15 -0
- package/README.md +6 -5
- package/dist/architecture.d.mts +0 -2
- package/dist/architecture.mjs +6 -4
- package/dist/architecture.mjs.map +1 -1
- package/dist/artifact.d.mts +0 -2
- package/dist/artifact.mjs +1 -2
- package/dist/catalogs.d.mts +0 -2
- package/dist/catalogs.mjs +1 -2
- package/dist/docs.d.mts +0 -2
- package/dist/docs.mjs +1 -2
- package/dist/process.d.mts +0 -2
- package/dist/process.mjs +1 -2
- package/dist/toolchain.d.mts +0 -2
- package/dist/toolchain.mjs +1 -2
- package/dist/workspaces.d.mts +1 -3
- package/dist/workspaces.mjs +1 -2
- package/dist/workspaces.mjs.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @raypx-kit/devkit
|
|
2
2
|
|
|
3
|
+
## 0.0.0-alpha.1
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- a6af9fe: Raise the minimum supported Node.js version from 22.14.0 to 22.21.0. Update
|
|
8
|
+
package engine declarations and library build targets to the new floor, and
|
|
9
|
+
verify installed consumers on Node 22.21.0. Upgrade older Node installations
|
|
10
|
+
before installing these releases. The repository development pin remains 24.22.0.
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- a6af9fe: Allow apps and tooling to import explicitly bundled internal workspaces declared in development dependencies. Keep public export boundaries, platform compatibility, application restrictions and dependency cycle checks in force.
|
|
15
|
+
- 53ce687: Update compatible PostHog and dotenvx dependencies and the bundled ICU message
|
|
16
|
+
parser, preserving existing public interfaces and peer compatibility.
|
|
17
|
+
|
|
3
18
|
## 0.0.0-alpha.0
|
|
4
19
|
|
|
5
20
|
Initial Raypx Kit prerelease.
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ artifacts.
|
|
|
8
8
|
bun add -d @raypx-kit/devkit
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
ESM only, for Node 22.
|
|
11
|
+
ESM only, for Node 22.21+ and Bun. Each entry is independent, so a consumer loads
|
|
12
12
|
only the dependencies it uses. The package reads files and spawns processes; it
|
|
13
13
|
contains no product rules, so repositories compose their own policy from it.
|
|
14
14
|
|
|
@@ -82,10 +82,11 @@ within its workspace and correspond to an actual export. Without a mapping,
|
|
|
82
82
|
the check follows the declared export targets directly. Package-root JSON
|
|
83
83
|
configuration exports therefore need no source mapping.
|
|
84
84
|
|
|
85
|
-
`bundledDependencies` lists
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
`bundledDependencies` lists development dependencies deliberately bundled into
|
|
86
|
+
runtime by the package build. Each name must also be declared in
|
|
87
|
+
`devDependencies`. Internal workspace bundles are allowed only for apps and
|
|
88
|
+
tooling. Public export boundaries, platform compatibility, application and
|
|
89
|
+
tooling restrictions, and dependency cycle checks still apply. Ordinary runtime
|
|
89
90
|
dependencies and peers remain in their respective manifest fields.
|
|
90
91
|
|
|
91
92
|
Without an explicit `metadata` map, discovery retains the manifest interface.
|
package/dist/architecture.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { WorkspaceIndex } from "./workspaces.mjs";
|
|
2
|
-
//#region src/architecture.d.ts
|
|
3
2
|
export interface ImportEdge {
|
|
4
3
|
request: string;
|
|
5
4
|
typesOnly: boolean;
|
|
@@ -11,5 +10,4 @@ export declare function imports(file: string, source: string): ImportEdge[];
|
|
|
11
10
|
* declarations, internal paths, platform targets, tooling and test-only boundaries.
|
|
12
11
|
*/
|
|
13
12
|
export declare function checkArchitecture(index: WorkspaceIndex): string[];
|
|
14
|
-
//#endregion
|
|
15
13
|
//# sourceMappingURL=architecture.d.mts.map
|
package/dist/architecture.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { builtinModules } from "node:module";
|
|
|
3
3
|
import { existsSync, globSync, readFileSync } from "node:fs";
|
|
4
4
|
import { join, posix } from "node:path";
|
|
5
5
|
import { parseSync, visitorKeys } from "oxc-parser";
|
|
6
|
-
|
|
6
|
+
// src/architecture.ts
|
|
7
7
|
/** Static import, re-export, dynamic import and `import()` type edges, without executing code. */
|
|
8
8
|
function imports(file, source) {
|
|
9
9
|
const parsed = parseSync(file, source);
|
|
@@ -36,6 +36,9 @@ const builtins = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]
|
|
|
36
36
|
const testFile = /(?:\.(?:test|spec)\.[cm]?[jt]sx?$|\/(?:testing|test-utils)(?:\.[cm]?[jt]sx?$|\/)|\/(?:tests?|__tests__|test-fixtures)\/)/;
|
|
37
37
|
const codeFile = /\.[cm]?[jt]sx?$/;
|
|
38
38
|
const runtimeFile = /\/(?:src|server|native|app)\//;
|
|
39
|
+
function bundledWorkspace(workspace, name) {
|
|
40
|
+
return (workspace.metadata?.kind === "app" || workspace.metadata?.kind === "tooling") && workspace.metadata.bundledDependencies?.includes(name) === true && !!workspace.manifest.devDependencies?.[name];
|
|
41
|
+
}
|
|
39
42
|
function children(node) {
|
|
40
43
|
const record = node;
|
|
41
44
|
return (visitorKeys[node.type] ?? []).flatMap((key) => (Array.isArray(record[key]) ? record[key] : [record[key]]).filter((child) => !!child && typeof child === "object" && "type" in child));
|
|
@@ -150,7 +153,7 @@ function checkArchitecture(index) {
|
|
|
150
153
|
for (const [entry, target] of Object.entries(metadata.entryTargets ?? {})) if (!manifest.exports?.[entry] || !targets.includes(target)) findings.push(`${path}: invalid entryTargets override ${entry}`);
|
|
151
154
|
for (const [scope, target] of Object.entries(metadata.sourceTargets ?? {})) if (!scope || !targets.includes(target)) findings.push(`${path}: invalid sourceTargets override ${scope}`);
|
|
152
155
|
for (const [entry, source] of Object.entries(metadata.sourceEntries ?? {})) if (!manifest.exports?.[entry] || !source.startsWith("./") || source.split("/").includes("..") || !codeFile.test(source) || (source.includes("*") ? !entry.includes("*") || !globSync(posix.join(path, source), { cwd: index.root }).length : !existsSync(join(index.root, path, source)))) findings.push(`${path}: invalid sourceEntries override ${entry}: ${source}`);
|
|
153
|
-
for (const name of metadata.bundledDependencies ?? []) if (!manifest.devDependencies?.[name] || index.byName.has(name)) findings.push(`${path}: bundled dependency must be an external development dependency: ${name}`);
|
|
156
|
+
for (const name of metadata.bundledDependencies ?? []) if (!manifest.devDependencies?.[name] || index.byName.has(name) && !bundledWorkspace(workspace, name)) findings.push(`${path}: bundled dependency must be an external development dependency: ${name}`);
|
|
154
157
|
if (metadata.kind === "library" && !Object.keys(manifest.exports ?? {}).length) findings.push(`${path}: libraries need explicit exports`);
|
|
155
158
|
for (const [entry, value] of Object.entries(manifest.exports ?? {})) for (const exported of exportPaths(value)) {
|
|
156
159
|
const exists = exported.includes("*") ? globSync(posix.join(path, exported), { cwd: index.root }).length > 0 : existsSync(join(index.root, path, exported));
|
|
@@ -204,7 +207,7 @@ function checkArchitecture(index) {
|
|
|
204
207
|
if (resolved.internalPath) findings.push(`${file}: internal cross-workspace import ${request}`);
|
|
205
208
|
if (to !== workspace) {
|
|
206
209
|
if (to.metadata?.kind === "app") findings.push(`${file}: application source cannot be imported: ${request}`);
|
|
207
|
-
if (!(workspace.manifest.dependencies?.[to.manifest.name] || workspace.manifest.peerDependencies?.[to.manifest.name]) && !(typesOnly && workspace.manifest.devDependencies?.[to.manifest.name])) findings.push(`${file}: undeclared ${typesOnly ? "type" : "runtime"} dependency ${request}`);
|
|
210
|
+
if (!(workspace.manifest.dependencies?.[to.manifest.name] || workspace.manifest.peerDependencies?.[to.manifest.name] || bundledWorkspace(workspace, to.manifest.name)) && !(typesOnly && workspace.manifest.devDependencies?.[to.manifest.name])) findings.push(`${file}: undeclared ${typesOnly ? "type" : "runtime"} dependency ${request}`);
|
|
208
211
|
if (!typesOnly && workspace.metadata?.kind !== "tooling" && to.metadata?.kind === "tooling") findings.push(`${file}: runtime cannot import tooling ${request}`);
|
|
209
212
|
if (!typesOnly && !compatible(platform, resolved.targetPlatform)) findings.push(`${file}: ${platform} entry cannot import ${resolved.targetPlatform} entry ${request}${transitive ? " (transitive)" : ""}`);
|
|
210
213
|
}
|
|
@@ -260,7 +263,6 @@ function checkArchitecture(index) {
|
|
|
260
263
|
}
|
|
261
264
|
return [...new Set(findings)];
|
|
262
265
|
}
|
|
263
|
-
//#endregion
|
|
264
266
|
export { checkArchitecture, imports };
|
|
265
267
|
|
|
266
268
|
//# sourceMappingURL=architecture.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architecture.mjs","names":[],"sources":["../src/architecture.ts"],"sourcesContent":["import { existsSync, globSync, readFileSync } from \"node:fs\";\nimport { builtinModules } from \"node:module\";\nimport { join, posix } from \"node:path\";\nimport { parseSync, visitorKeys, type Node } from \"oxc-parser\";\nimport {\n compatible,\n exportPaths,\n kinds,\n resolveImport,\n sourceTarget,\n targets,\n workspaceFor,\n type Target,\n type Workspace,\n type WorkspaceIndex,\n} from \"./workspaces.js\";\n\nexport interface ImportEdge {\n request: string;\n typesOnly: boolean;\n}\n/** Static import, re-export, dynamic import and `import()` type edges, without executing code. */\nexport function imports(file: string, source: string): ImportEdge[] {\n const parsed = parseSync(file, source);\n if (parsed.errors.length) throw new Error(`${file}: ${parsed.errors[0]!.message}`);\n const found: ImportEdge[] = [];\n function walk(node: Node) {\n if (\n (node.type === \"ImportDeclaration\" ||\n node.type === \"ExportNamedDeclaration\" ||\n node.type === \"ExportAllDeclaration\") &&\n node.source\n ) {\n const record = node as unknown as {\n importKind?: string;\n exportKind?: string;\n specifiers?: { importKind?: string; exportKind?: string }[];\n };\n const typesOnly =\n record.importKind === \"type\" ||\n record.exportKind === \"type\" ||\n (!!record.specifiers?.length &&\n record.specifiers.every((s) => s.importKind === \"type\" || s.exportKind === \"type\"));\n found.push({ request: node.source.value, typesOnly });\n }\n if (\n node.type === \"ImportExpression\" &&\n node.source.type === \"Literal\" &&\n typeof node.source.value === \"string\"\n )\n found.push({ request: node.source.value, typesOnly: false });\n if (node.type === \"TSImportType\") found.push({ request: node.source.value, typesOnly: true });\n const record = node as unknown as Record<string, unknown>;\n for (const key of visitorKeys[node.type] ?? []) {\n for (const child of Array.isArray(record[key]) ? record[key] : [record[key]]) {\n if (child && typeof child === \"object\" && \"type\" in child) walk(child as Node);\n }\n }\n }\n walk(parsed.program);\n return found;\n}\n\nconst builtins = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]));\nconst testFile =\n /(?:\\.(?:test|spec)\\.[cm]?[jt]sx?$|\\/(?:testing|test-utils)(?:\\.[cm]?[jt]sx?$|\\/)|\\/(?:tests?|__tests__|test-fixtures)\\/)/;\nconst codeFile = /\\.[cm]?[jt]sx?$/;\nconst runtimeFile = /\\/(?:src|server|native|app)\\//;\n\nfunction children(node: Node): Node[] {\n const record = node as unknown as Record<string, unknown>;\n return (visitorKeys[node.type] ?? []).flatMap((key) =>\n (Array.isArray(record[key]) ? record[key] : [record[key]]).filter(\n (child): child is Node => !!child && typeof child === \"object\" && \"type\" in child,\n ),\n );\n}\n\n/** Resolve local bindings so data named `document` is not mistaken for the DOM. */\nfunction reachesDomGlobal(file: string, source: string): boolean {\n const { program, errors } = parseSync(file, source);\n if (errors.length) throw new Error(`${file}: ${errors[0]!.message}`);\n interface Scope {\n names: Set<string>;\n parent: Scope | undefined;\n }\n const lexicalScopes = new Set([\n \"BlockStatement\",\n \"ForStatement\",\n \"ForInStatement\",\n \"ForOfStatement\",\n \"SwitchStatement\",\n ]);\n function bind(node: Node | null | undefined, names: Set<string>) {\n if (!node) return;\n if (node.type === \"Identifier\") names.add(node.name);\n else if (node.type === \"RestElement\") bind(node.argument, names);\n else if (node.type === \"AssignmentPattern\") bind(node.left, names);\n else if (node.type === \"ArrayPattern\") for (const child of node.elements) bind(child, names);\n else if (node.type === \"ObjectPattern\")\n for (const property of node.properties)\n bind(property.type === \"RestElement\" ? property.argument : property.value, names);\n }\n function declarations(node: Node, names: Set<string>, nested = false) {\n if (\n node.type === \"FunctionDeclaration\" ||\n node.type === \"FunctionExpression\" ||\n node.type === \"ArrowFunctionExpression\" ||\n node.type === \"ClassDeclaration\" ||\n node.type === \"ClassExpression\"\n ) {\n if (!nested && \"id\" in node) bind(node.id, names);\n return;\n }\n if (node.type === \"VariableDeclaration\") {\n if (!nested || node.kind === \"var\")\n for (const declaration of node.declarations) bind(declaration.id, names);\n return;\n }\n if (!nested && node.type === \"ImportDeclaration\") {\n for (const specifier of node.specifiers) bind(specifier.local, names);\n return;\n }\n for (const child of children(node))\n declarations(child, names, nested || lexicalScopes.has(child.type));\n }\n function bound(name: string, scope: Scope | undefined): boolean {\n return !!scope && (scope.names.has(name) || bound(name, scope.parent));\n }\n const dom = new Set([\"window\", \"document\", \"localStorage\", \"sessionStorage\"]);\n function walk(node: Node, parent: Scope | undefined): boolean {\n let scope = parent;\n if (\n node.type === \"Program\" ||\n lexicalScopes.has(node.type) ||\n node.type === \"FunctionDeclaration\" ||\n node.type === \"FunctionExpression\" ||\n node.type === \"ArrowFunctionExpression\" ||\n node.type === \"CatchClause\"\n ) {\n scope = { names: new Set(), parent };\n if (\n node.type === \"FunctionDeclaration\" ||\n node.type === \"FunctionExpression\" ||\n node.type === \"ArrowFunctionExpression\"\n ) {\n for (const parameter of node.params) bind(parameter, scope.names);\n if (\"id\" in node) bind(node.id, scope.names);\n if (node.body) declarations(node.body, scope.names);\n } else if (node.type === \"CatchClause\") bind(node.param, scope.names);\n else\n for (const child of children(node))\n declarations(child, scope.names, lexicalScopes.has(child.type));\n }\n if (\n node.type === \"MemberExpression\" &&\n node.object.type === \"Identifier\" &&\n dom.has(node.object.name) &&\n !bound(node.object.name, scope)\n )\n return true;\n return children(node).some((child) => walk(child, scope));\n }\n return walk(program, undefined);\n}\n\nfunction hostViolation(request: string, target: Target): boolean {\n if (request.startsWith(\"bun:\")) return target !== \"bun\";\n if (request.startsWith(\"node:\") || builtins.has(request))\n return target !== \"node\" && target !== \"bun\";\n if (/^(react-dom|@base-ui\\/react)(\\/|$)/.test(request)) return target !== \"browser\";\n if (/^(react-native|expo(?:-[^/]+)?)(\\/|$)/.test(request)) return target !== \"native\";\n if (/^electrobun\\/(bun|main)(\\/|$)/.test(request)) return target !== \"bun\";\n return false;\n}\n\nfunction resolveCode(index: WorkspaceIndex, path: string): string | undefined {\n const withoutJs = path.replace(/\\.[cm]?js$/, \"\");\n return [\n path,\n `${path}.ts`,\n `${path}.tsx`,\n `${withoutJs}.ts`,\n `${withoutJs}.tsx`,\n `${path}/index.ts`,\n `${path}/index.tsx`,\n ].find((candidate) => codeFile.test(candidate) && existsSync(join(index.root, candidate)));\n}\n\n/**\n * Checks workspace metadata, exports, the dependency graph and every runtime import:\n * declarations, internal paths, platform targets, tooling and test-only boundaries.\n */\nexport function checkArchitecture(index: WorkspaceIndex): string[] {\n const findings = [...index.findings];\n const graph = new Map<string, Set<string>>();\n const parsed = new Map<string, ImportEdge[]>();\n const getImports = (file: string) => {\n let edges = parsed.get(file);\n if (!edges) {\n edges = imports(file, readFileSync(join(index.root, file), \"utf8\"));\n parsed.set(file, edges);\n }\n return edges;\n };\n for (const workspace of index.workspaces) {\n const { manifest, path, metadata } = workspace;\n if (!metadata || !kinds.includes(metadata.kind) || !targets.includes(metadata.target)) {\n const finding =\n index.metadataSource === \"options\"\n ? `${path}: ${metadata === undefined ? \"missing\" : \"invalid\"} supplied workspace metadata`\n : `${path}/package.json: invalid or missing ${index.metadataKey} metadata`;\n if (!findings.includes(finding)) findings.push(finding);\n continue;\n }\n if (manifest.type !== \"module\") findings.push(`${path}: workspaces must be ESM`);\n if (metadata.kind === \"app\" && !manifest.private)\n findings.push(`${path}: applications must be private`);\n for (const [entry, target] of Object.entries(metadata.entryTargets ?? {})) {\n if (!manifest.exports?.[entry] || !targets.includes(target))\n findings.push(`${path}: invalid entryTargets override ${entry}`);\n }\n for (const [scope, target] of Object.entries(metadata.sourceTargets ?? {})) {\n if (!scope || !targets.includes(target))\n findings.push(`${path}: invalid sourceTargets override ${scope}`);\n }\n for (const [entry, source] of Object.entries(metadata.sourceEntries ?? {})) {\n if (\n !manifest.exports?.[entry] ||\n !source.startsWith(\"./\") ||\n source.split(\"/\").includes(\"..\") ||\n !codeFile.test(source) ||\n (source.includes(\"*\")\n ? !entry.includes(\"*\") || !globSync(posix.join(path, source), { cwd: index.root }).length\n : !existsSync(join(index.root, path, source)))\n )\n findings.push(`${path}: invalid sourceEntries override ${entry}: ${source}`);\n }\n for (const name of metadata.bundledDependencies ?? []) {\n if (!manifest.devDependencies?.[name] || index.byName.has(name))\n findings.push(\n `${path}: bundled dependency must be an external development dependency: ${name}`,\n );\n }\n if (metadata.kind === \"library\" && !Object.keys(manifest.exports ?? {}).length)\n findings.push(`${path}: libraries need explicit exports`);\n for (const [entry, value] of Object.entries(manifest.exports ?? {})) {\n for (const exported of exportPaths(value)) {\n const exists = exported.includes(\"*\")\n ? globSync(posix.join(path, exported), { cwd: index.root }).length > 0\n : existsSync(join(index.root, path, exported));\n if (\n !exported.startsWith(\"./\") ||\n exported.includes(\"..\") ||\n (!metadata.sourceEntries?.[entry] && !exists)\n )\n findings.push(`${path}: missing or invalid export ${entry}: ${exported}`);\n }\n }\n const edges = new Set<string>();\n graph.set(manifest.name, edges);\n for (const [field, deps] of Object.entries({\n dependencies: manifest.dependencies,\n devDependencies: manifest.devDependencies,\n peerDependencies: manifest.peerDependencies,\n })) {\n for (const [name, range] of Object.entries(deps ?? {})) {\n const to = index.byName.get(name);\n if (!to) {\n if (range.startsWith(\"workspace:\"))\n findings.push(`${path}: missing workspace dependency ${name}`);\n continue;\n }\n edges.add(name);\n if (range !== \"workspace:*\")\n findings.push(`${path}: internal dependency ${name} must use workspace:*`);\n if (to.metadata?.kind === \"app\")\n findings.push(`${path}: applications cannot be imported: ${name}`);\n if (\n field === \"dependencies\" &&\n metadata.kind !== \"tooling\" &&\n to.metadata?.kind === \"tooling\"\n )\n findings.push(`${path}: runtime cannot depend on tooling: ${name}`);\n }\n }\n }\n\n const visited = new Set<string>();\n const active: string[] = [];\n function visit(name: string) {\n if (active.includes(name)) {\n findings.push(\n `workspace dependency cycle: ${[...active.slice(active.indexOf(name)), name].join(\" -> \")}`,\n );\n return;\n }\n if (visited.has(name)) return;\n active.push(name);\n for (const next of graph.get(name) ?? []) visit(next);\n active.pop();\n visited.add(name);\n }\n for (const name of graph.keys()) visit(name);\n\n function checkEdge(\n workspace: Workspace,\n file: string,\n edge: ImportEdge,\n platform: Target,\n transitive: boolean,\n ): string[] {\n const { request, typesOnly } = edge;\n if (\n /\\/(?:testing|test-utils)(?:\\/|$)/.test(request) &&\n !testFile.test(file) &&\n workspace.metadata?.kind !== \"tooling\"\n )\n findings.push(`${file}: runtime cannot import test-only entry ${request}`);\n if (!typesOnly && hostViolation(request, platform))\n findings.push(`${file}: ${platform} code cannot import ${request}`);\n const resolved = resolveImport(index, workspace, file, request);\n const to = resolved.target;\n if (!to) {\n if (\n !resolved.paths.length &&\n !request.startsWith(\".\") &&\n !request.startsWith(\"#\") &&\n !request.startsWith(\"virtual:\") &&\n !request.startsWith(\"bun:\") &&\n !request.startsWith(\"node:\") &&\n !builtins.has(request)\n ) {\n const name = request.startsWith(\"@\")\n ? request.split(\"/\").slice(0, 2).join(\"/\")\n : request.split(\"/\")[0]!;\n const declared =\n workspace.manifest.dependencies?.[name] ||\n workspace.manifest.peerDependencies?.[name] ||\n (workspace.metadata?.bundledDependencies?.includes(name) &&\n workspace.manifest.devDependencies?.[name]) ||\n (typesOnly &&\n (workspace.manifest.devDependencies?.[name] ||\n workspace.manifest.devDependencies?.[\n `@types/${name.startsWith(\"@\") ? name.slice(1).replace(\"/\", \"__\") : name}`\n ]));\n if (!declared)\n findings.push(\n `${file}: undeclared ${typesOnly ? \"type\" : \"runtime\"} dependency ${request}`,\n );\n }\n return resolved.paths;\n }\n if (resolved.internalPath) findings.push(`${file}: internal cross-workspace import ${request}`);\n if (to !== workspace) {\n if (to.metadata?.kind === \"app\")\n findings.push(`${file}: application source cannot be imported: ${request}`);\n const declared =\n workspace.manifest.dependencies?.[to.manifest.name] ||\n workspace.manifest.peerDependencies?.[to.manifest.name];\n if (!declared && !(typesOnly && workspace.manifest.devDependencies?.[to.manifest.name]))\n findings.push(\n `${file}: undeclared ${typesOnly ? \"type\" : \"runtime\"} dependency ${request}`,\n );\n if (!typesOnly && workspace.metadata?.kind !== \"tooling\" && to.metadata?.kind === \"tooling\")\n findings.push(`${file}: runtime cannot import tooling ${request}`);\n if (!typesOnly && !compatible(platform, resolved.targetPlatform))\n findings.push(\n `${file}: ${platform} entry cannot import ${resolved.targetPlatform} entry ${request}${transitive ? \" (transitive)\" : \"\"}`,\n );\n }\n for (const path of resolved.paths)\n if (!testFile.test(file) && testFile.test(path))\n findings.push(`${file}: runtime cannot import test-only source ${request}`);\n return typesOnly ? [] : resolved.paths;\n }\n\n for (const workspace of index.workspaces) {\n const files = globSync(`${workspace.path}/**/*.{ts,tsx,mts,js,mjs}`, {\n cwd: index.root,\n exclude: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/.output/**\",\n \"**/.hutch/**\",\n \"**/build/**\",\n \"**/artifacts/**\",\n \"**/routeTree.gen.ts\",\n \"**/*.d.ts\",\n ],\n });\n for (const file of files) {\n const normalized = file.replaceAll(\"\\\\\", \"/\");\n if (!runtimeFile.test(normalized) || testFile.test(normalized)) continue;\n try {\n for (const edge of getImports(normalized))\n checkEdge(workspace, normalized, edge, sourceTarget(workspace, normalized), false);\n } catch (error) {\n findings.push(String(error));\n }\n }\n for (const [entry, value] of Object.entries(workspace.manifest.exports ?? {})) {\n const target =\n workspace.metadata?.entryTargets?.[entry] ?? workspace.metadata?.target ?? \"universal\";\n const seen = new Set<string>();\n function walk(path: string) {\n const file = resolveCode(index, path);\n if (!file || seen.has(file)) return;\n seen.add(file);\n const owner = workspaceFor(index, file);\n if (!owner) return;\n try {\n if (\n (target === \"universal\" || target === \"native\") &&\n reachesDomGlobal(file, readFileSync(join(index.root, file), \"utf8\"))\n )\n findings.push(`${workspace.path}: ${entry} reaches DOM global in ${file}`);\n for (const edge of getImports(file))\n for (const next of checkEdge(owner, file, edge, target, true)) walk(next);\n } catch (error) {\n findings.push(String(error));\n }\n }\n const source = workspace.metadata?.sourceEntries?.[entry];\n for (const path of source ? [source] : exportPaths(value)) {\n const exported = posix.join(workspace.path, path);\n if (exported.includes(\"*\"))\n for (const file of globSync(exported, { cwd: index.root }))\n walk(file.replaceAll(\"\\\\\", \"/\"));\n else walk(exported);\n }\n }\n }\n return [...new Set(findings)];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"architecture.mjs","names":[],"sources":["../src/architecture.ts"],"sourcesContent":["import { existsSync, globSync, readFileSync } from \"node:fs\";\nimport { builtinModules } from \"node:module\";\nimport { join, posix } from \"node:path\";\nimport { parseSync, visitorKeys, type Node } from \"oxc-parser\";\nimport {\n compatible,\n exportPaths,\n kinds,\n resolveImport,\n sourceTarget,\n targets,\n workspaceFor,\n type Target,\n type Workspace,\n type WorkspaceIndex,\n} from \"./workspaces.js\";\n\nexport interface ImportEdge {\n request: string;\n typesOnly: boolean;\n}\n/** Static import, re-export, dynamic import and `import()` type edges, without executing code. */\nexport function imports(file: string, source: string): ImportEdge[] {\n const parsed = parseSync(file, source);\n if (parsed.errors.length) throw new Error(`${file}: ${parsed.errors[0]!.message}`);\n const found: ImportEdge[] = [];\n function walk(node: Node) {\n if (\n (node.type === \"ImportDeclaration\" ||\n node.type === \"ExportNamedDeclaration\" ||\n node.type === \"ExportAllDeclaration\") &&\n node.source\n ) {\n const record = node as unknown as {\n importKind?: string;\n exportKind?: string;\n specifiers?: { importKind?: string; exportKind?: string }[];\n };\n const typesOnly =\n record.importKind === \"type\" ||\n record.exportKind === \"type\" ||\n (!!record.specifiers?.length &&\n record.specifiers.every((s) => s.importKind === \"type\" || s.exportKind === \"type\"));\n found.push({ request: node.source.value, typesOnly });\n }\n if (\n node.type === \"ImportExpression\" &&\n node.source.type === \"Literal\" &&\n typeof node.source.value === \"string\"\n )\n found.push({ request: node.source.value, typesOnly: false });\n if (node.type === \"TSImportType\") found.push({ request: node.source.value, typesOnly: true });\n const record = node as unknown as Record<string, unknown>;\n for (const key of visitorKeys[node.type] ?? []) {\n for (const child of Array.isArray(record[key]) ? record[key] : [record[key]]) {\n if (child && typeof child === \"object\" && \"type\" in child) walk(child as Node);\n }\n }\n }\n walk(parsed.program);\n return found;\n}\n\nconst builtins = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]));\nconst testFile =\n /(?:\\.(?:test|spec)\\.[cm]?[jt]sx?$|\\/(?:testing|test-utils)(?:\\.[cm]?[jt]sx?$|\\/)|\\/(?:tests?|__tests__|test-fixtures)\\/)/;\nconst codeFile = /\\.[cm]?[jt]sx?$/;\nconst runtimeFile = /\\/(?:src|server|native|app)\\//;\n\nfunction bundledWorkspace(workspace: Workspace, name: string): boolean {\n return (\n (workspace.metadata?.kind === \"app\" || workspace.metadata?.kind === \"tooling\") &&\n workspace.metadata.bundledDependencies?.includes(name) === true &&\n !!workspace.manifest.devDependencies?.[name]\n );\n}\n\nfunction children(node: Node): Node[] {\n const record = node as unknown as Record<string, unknown>;\n return (visitorKeys[node.type] ?? []).flatMap((key) =>\n (Array.isArray(record[key]) ? record[key] : [record[key]]).filter(\n (child): child is Node => !!child && typeof child === \"object\" && \"type\" in child,\n ),\n );\n}\n\n/** Resolve local bindings so data named `document` is not mistaken for the DOM. */\nfunction reachesDomGlobal(file: string, source: string): boolean {\n const { program, errors } = parseSync(file, source);\n if (errors.length) throw new Error(`${file}: ${errors[0]!.message}`);\n interface Scope {\n names: Set<string>;\n parent: Scope | undefined;\n }\n const lexicalScopes = new Set([\n \"BlockStatement\",\n \"ForStatement\",\n \"ForInStatement\",\n \"ForOfStatement\",\n \"SwitchStatement\",\n ]);\n function bind(node: Node | null | undefined, names: Set<string>) {\n if (!node) return;\n if (node.type === \"Identifier\") names.add(node.name);\n else if (node.type === \"RestElement\") bind(node.argument, names);\n else if (node.type === \"AssignmentPattern\") bind(node.left, names);\n else if (node.type === \"ArrayPattern\") for (const child of node.elements) bind(child, names);\n else if (node.type === \"ObjectPattern\")\n for (const property of node.properties)\n bind(property.type === \"RestElement\" ? property.argument : property.value, names);\n }\n function declarations(node: Node, names: Set<string>, nested = false) {\n if (\n node.type === \"FunctionDeclaration\" ||\n node.type === \"FunctionExpression\" ||\n node.type === \"ArrowFunctionExpression\" ||\n node.type === \"ClassDeclaration\" ||\n node.type === \"ClassExpression\"\n ) {\n if (!nested && \"id\" in node) bind(node.id, names);\n return;\n }\n if (node.type === \"VariableDeclaration\") {\n if (!nested || node.kind === \"var\")\n for (const declaration of node.declarations) bind(declaration.id, names);\n return;\n }\n if (!nested && node.type === \"ImportDeclaration\") {\n for (const specifier of node.specifiers) bind(specifier.local, names);\n return;\n }\n for (const child of children(node))\n declarations(child, names, nested || lexicalScopes.has(child.type));\n }\n function bound(name: string, scope: Scope | undefined): boolean {\n return !!scope && (scope.names.has(name) || bound(name, scope.parent));\n }\n const dom = new Set([\"window\", \"document\", \"localStorage\", \"sessionStorage\"]);\n function walk(node: Node, parent: Scope | undefined): boolean {\n let scope = parent;\n if (\n node.type === \"Program\" ||\n lexicalScopes.has(node.type) ||\n node.type === \"FunctionDeclaration\" ||\n node.type === \"FunctionExpression\" ||\n node.type === \"ArrowFunctionExpression\" ||\n node.type === \"CatchClause\"\n ) {\n scope = { names: new Set(), parent };\n if (\n node.type === \"FunctionDeclaration\" ||\n node.type === \"FunctionExpression\" ||\n node.type === \"ArrowFunctionExpression\"\n ) {\n for (const parameter of node.params) bind(parameter, scope.names);\n if (\"id\" in node) bind(node.id, scope.names);\n if (node.body) declarations(node.body, scope.names);\n } else if (node.type === \"CatchClause\") bind(node.param, scope.names);\n else\n for (const child of children(node))\n declarations(child, scope.names, lexicalScopes.has(child.type));\n }\n if (\n node.type === \"MemberExpression\" &&\n node.object.type === \"Identifier\" &&\n dom.has(node.object.name) &&\n !bound(node.object.name, scope)\n )\n return true;\n return children(node).some((child) => walk(child, scope));\n }\n return walk(program, undefined);\n}\n\nfunction hostViolation(request: string, target: Target): boolean {\n if (request.startsWith(\"bun:\")) return target !== \"bun\";\n if (request.startsWith(\"node:\") || builtins.has(request))\n return target !== \"node\" && target !== \"bun\";\n if (/^(react-dom|@base-ui\\/react)(\\/|$)/.test(request)) return target !== \"browser\";\n if (/^(react-native|expo(?:-[^/]+)?)(\\/|$)/.test(request)) return target !== \"native\";\n if (/^electrobun\\/(bun|main)(\\/|$)/.test(request)) return target !== \"bun\";\n return false;\n}\n\nfunction resolveCode(index: WorkspaceIndex, path: string): string | undefined {\n const withoutJs = path.replace(/\\.[cm]?js$/, \"\");\n return [\n path,\n `${path}.ts`,\n `${path}.tsx`,\n `${withoutJs}.ts`,\n `${withoutJs}.tsx`,\n `${path}/index.ts`,\n `${path}/index.tsx`,\n ].find((candidate) => codeFile.test(candidate) && existsSync(join(index.root, candidate)));\n}\n\n/**\n * Checks workspace metadata, exports, the dependency graph and every runtime import:\n * declarations, internal paths, platform targets, tooling and test-only boundaries.\n */\nexport function checkArchitecture(index: WorkspaceIndex): string[] {\n const findings = [...index.findings];\n const graph = new Map<string, Set<string>>();\n const parsed = new Map<string, ImportEdge[]>();\n const getImports = (file: string) => {\n let edges = parsed.get(file);\n if (!edges) {\n edges = imports(file, readFileSync(join(index.root, file), \"utf8\"));\n parsed.set(file, edges);\n }\n return edges;\n };\n for (const workspace of index.workspaces) {\n const { manifest, path, metadata } = workspace;\n if (!metadata || !kinds.includes(metadata.kind) || !targets.includes(metadata.target)) {\n const finding =\n index.metadataSource === \"options\"\n ? `${path}: ${metadata === undefined ? \"missing\" : \"invalid\"} supplied workspace metadata`\n : `${path}/package.json: invalid or missing ${index.metadataKey} metadata`;\n if (!findings.includes(finding)) findings.push(finding);\n continue;\n }\n if (manifest.type !== \"module\") findings.push(`${path}: workspaces must be ESM`);\n if (metadata.kind === \"app\" && !manifest.private)\n findings.push(`${path}: applications must be private`);\n for (const [entry, target] of Object.entries(metadata.entryTargets ?? {})) {\n if (!manifest.exports?.[entry] || !targets.includes(target))\n findings.push(`${path}: invalid entryTargets override ${entry}`);\n }\n for (const [scope, target] of Object.entries(metadata.sourceTargets ?? {})) {\n if (!scope || !targets.includes(target))\n findings.push(`${path}: invalid sourceTargets override ${scope}`);\n }\n for (const [entry, source] of Object.entries(metadata.sourceEntries ?? {})) {\n if (\n !manifest.exports?.[entry] ||\n !source.startsWith(\"./\") ||\n source.split(\"/\").includes(\"..\") ||\n !codeFile.test(source) ||\n (source.includes(\"*\")\n ? !entry.includes(\"*\") || !globSync(posix.join(path, source), { cwd: index.root }).length\n : !existsSync(join(index.root, path, source)))\n )\n findings.push(`${path}: invalid sourceEntries override ${entry}: ${source}`);\n }\n for (const name of metadata.bundledDependencies ?? []) {\n if (\n !manifest.devDependencies?.[name] ||\n (index.byName.has(name) && !bundledWorkspace(workspace, name))\n )\n findings.push(\n `${path}: bundled dependency must be an external development dependency: ${name}`,\n );\n }\n if (metadata.kind === \"library\" && !Object.keys(manifest.exports ?? {}).length)\n findings.push(`${path}: libraries need explicit exports`);\n for (const [entry, value] of Object.entries(manifest.exports ?? {})) {\n for (const exported of exportPaths(value)) {\n const exists = exported.includes(\"*\")\n ? globSync(posix.join(path, exported), { cwd: index.root }).length > 0\n : existsSync(join(index.root, path, exported));\n if (\n !exported.startsWith(\"./\") ||\n exported.includes(\"..\") ||\n (!metadata.sourceEntries?.[entry] && !exists)\n )\n findings.push(`${path}: missing or invalid export ${entry}: ${exported}`);\n }\n }\n const edges = new Set<string>();\n graph.set(manifest.name, edges);\n for (const [field, deps] of Object.entries({\n dependencies: manifest.dependencies,\n devDependencies: manifest.devDependencies,\n peerDependencies: manifest.peerDependencies,\n })) {\n for (const [name, range] of Object.entries(deps ?? {})) {\n const to = index.byName.get(name);\n if (!to) {\n if (range.startsWith(\"workspace:\"))\n findings.push(`${path}: missing workspace dependency ${name}`);\n continue;\n }\n edges.add(name);\n if (range !== \"workspace:*\")\n findings.push(`${path}: internal dependency ${name} must use workspace:*`);\n if (to.metadata?.kind === \"app\")\n findings.push(`${path}: applications cannot be imported: ${name}`);\n if (\n field === \"dependencies\" &&\n metadata.kind !== \"tooling\" &&\n to.metadata?.kind === \"tooling\"\n )\n findings.push(`${path}: runtime cannot depend on tooling: ${name}`);\n }\n }\n }\n\n const visited = new Set<string>();\n const active: string[] = [];\n function visit(name: string) {\n if (active.includes(name)) {\n findings.push(\n `workspace dependency cycle: ${[...active.slice(active.indexOf(name)), name].join(\" -> \")}`,\n );\n return;\n }\n if (visited.has(name)) return;\n active.push(name);\n for (const next of graph.get(name) ?? []) visit(next);\n active.pop();\n visited.add(name);\n }\n for (const name of graph.keys()) visit(name);\n\n function checkEdge(\n workspace: Workspace,\n file: string,\n edge: ImportEdge,\n platform: Target,\n transitive: boolean,\n ): string[] {\n const { request, typesOnly } = edge;\n if (\n /\\/(?:testing|test-utils)(?:\\/|$)/.test(request) &&\n !testFile.test(file) &&\n workspace.metadata?.kind !== \"tooling\"\n )\n findings.push(`${file}: runtime cannot import test-only entry ${request}`);\n if (!typesOnly && hostViolation(request, platform))\n findings.push(`${file}: ${platform} code cannot import ${request}`);\n const resolved = resolveImport(index, workspace, file, request);\n const to = resolved.target;\n if (!to) {\n if (\n !resolved.paths.length &&\n !request.startsWith(\".\") &&\n !request.startsWith(\"#\") &&\n !request.startsWith(\"virtual:\") &&\n !request.startsWith(\"bun:\") &&\n !request.startsWith(\"node:\") &&\n !builtins.has(request)\n ) {\n const name = request.startsWith(\"@\")\n ? request.split(\"/\").slice(0, 2).join(\"/\")\n : request.split(\"/\")[0]!;\n const declared =\n workspace.manifest.dependencies?.[name] ||\n workspace.manifest.peerDependencies?.[name] ||\n (workspace.metadata?.bundledDependencies?.includes(name) &&\n workspace.manifest.devDependencies?.[name]) ||\n (typesOnly &&\n (workspace.manifest.devDependencies?.[name] ||\n workspace.manifest.devDependencies?.[\n `@types/${name.startsWith(\"@\") ? name.slice(1).replace(\"/\", \"__\") : name}`\n ]));\n if (!declared)\n findings.push(\n `${file}: undeclared ${typesOnly ? \"type\" : \"runtime\"} dependency ${request}`,\n );\n }\n return resolved.paths;\n }\n if (resolved.internalPath) findings.push(`${file}: internal cross-workspace import ${request}`);\n if (to !== workspace) {\n if (to.metadata?.kind === \"app\")\n findings.push(`${file}: application source cannot be imported: ${request}`);\n const declared =\n workspace.manifest.dependencies?.[to.manifest.name] ||\n workspace.manifest.peerDependencies?.[to.manifest.name] ||\n bundledWorkspace(workspace, to.manifest.name);\n if (!declared && !(typesOnly && workspace.manifest.devDependencies?.[to.manifest.name]))\n findings.push(\n `${file}: undeclared ${typesOnly ? \"type\" : \"runtime\"} dependency ${request}`,\n );\n if (!typesOnly && workspace.metadata?.kind !== \"tooling\" && to.metadata?.kind === \"tooling\")\n findings.push(`${file}: runtime cannot import tooling ${request}`);\n if (!typesOnly && !compatible(platform, resolved.targetPlatform))\n findings.push(\n `${file}: ${platform} entry cannot import ${resolved.targetPlatform} entry ${request}${transitive ? \" (transitive)\" : \"\"}`,\n );\n }\n for (const path of resolved.paths)\n if (!testFile.test(file) && testFile.test(path))\n findings.push(`${file}: runtime cannot import test-only source ${request}`);\n return typesOnly ? [] : resolved.paths;\n }\n\n for (const workspace of index.workspaces) {\n const files = globSync(`${workspace.path}/**/*.{ts,tsx,mts,js,mjs}`, {\n cwd: index.root,\n exclude: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/.output/**\",\n \"**/.hutch/**\",\n \"**/build/**\",\n \"**/artifacts/**\",\n \"**/routeTree.gen.ts\",\n \"**/*.d.ts\",\n ],\n });\n for (const file of files) {\n const normalized = file.replaceAll(\"\\\\\", \"/\");\n if (!runtimeFile.test(normalized) || testFile.test(normalized)) continue;\n try {\n for (const edge of getImports(normalized))\n checkEdge(workspace, normalized, edge, sourceTarget(workspace, normalized), false);\n } catch (error) {\n findings.push(String(error));\n }\n }\n for (const [entry, value] of Object.entries(workspace.manifest.exports ?? {})) {\n const target =\n workspace.metadata?.entryTargets?.[entry] ?? workspace.metadata?.target ?? \"universal\";\n const seen = new Set<string>();\n function walk(path: string) {\n const file = resolveCode(index, path);\n if (!file || seen.has(file)) return;\n seen.add(file);\n const owner = workspaceFor(index, file);\n if (!owner) return;\n try {\n if (\n (target === \"universal\" || target === \"native\") &&\n reachesDomGlobal(file, readFileSync(join(index.root, file), \"utf8\"))\n )\n findings.push(`${workspace.path}: ${entry} reaches DOM global in ${file}`);\n for (const edge of getImports(file))\n for (const next of checkEdge(owner, file, edge, target, true)) walk(next);\n } catch (error) {\n findings.push(String(error));\n }\n }\n const source = workspace.metadata?.sourceEntries?.[entry];\n for (const path of source ? [source] : exportPaths(value)) {\n const exported = posix.join(workspace.path, path);\n if (exported.includes(\"*\"))\n for (const file of globSync(exported, { cwd: index.root }))\n walk(file.replaceAll(\"\\\\\", \"/\"));\n else walk(exported);\n }\n }\n }\n return [...new Set(findings)];\n}\n"],"mappings":"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"}
|
package/dist/artifact.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/artifact.d.ts
|
|
2
1
|
/** A relocated probe must not quietly copy dependencies from outside the artifact. */
|
|
3
2
|
export declare function stageArtifact(source: string, destination: string): Promise<void>;
|
|
4
3
|
export interface ArtifactProbe {
|
|
@@ -21,5 +20,4 @@ export interface ArtifactProbe {
|
|
|
21
20
|
}
|
|
22
21
|
/** Starts a relocated Node server output on a free port and probes it while it runs. */
|
|
23
22
|
export declare function probeArtifact({ name, output, node, entry, healthPath, environment, check, failOnOutput }: ArtifactProbe): Promise<void>;
|
|
24
|
-
//#endregion
|
|
25
23
|
//# sourceMappingURL=artifact.d.mts.map
|
package/dist/artifact.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { cp, mkdtemp, readdir, readlink, realpath, rm } from "node:fs/promises";
|
|
|
5
5
|
import { createServer } from "node:net";
|
|
6
6
|
import { tmpdir } from "node:os";
|
|
7
7
|
import { setTimeout as setTimeout$1 } from "node:timers/promises";
|
|
8
|
-
|
|
8
|
+
// src/artifact.ts
|
|
9
9
|
/** A relocated probe must not quietly copy dependencies from outside the artifact. */
|
|
10
10
|
async function stageArtifact(source, destination) {
|
|
11
11
|
const root = await realpath(source);
|
|
@@ -98,7 +98,6 @@ async function probeArtifact({ name, output, node, entry = ".output/server/index
|
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
//#endregion
|
|
102
101
|
export { probeArtifact, stageArtifact };
|
|
103
102
|
|
|
104
103
|
//# sourceMappingURL=artifact.mjs.map
|
package/dist/catalogs.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/catalogs.d.ts
|
|
2
1
|
/** A message catalog: nested objects whose leaves are strings. */
|
|
3
2
|
export interface CatalogTree {
|
|
4
3
|
readonly [key: string]: string | CatalogTree;
|
|
@@ -9,5 +8,4 @@ export interface CatalogTree {
|
|
|
9
8
|
* are accepted; anything computed is rejected.
|
|
10
9
|
*/
|
|
11
10
|
export declare function readStaticCatalog(path: string, source?: string): CatalogTree;
|
|
12
|
-
//#endregion
|
|
13
11
|
//# sourceMappingURL=catalogs.d.mts.map
|
package/dist/catalogs.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { parseSync } from "oxc-parser";
|
|
3
|
-
|
|
3
|
+
// src/catalogs.ts
|
|
4
4
|
/**
|
|
5
5
|
* Reads a `.json` catalog or the static default export of a TS/JS module without
|
|
6
6
|
* executing it. Only object literals with string values, `as const` and `satisfies`
|
|
@@ -43,7 +43,6 @@ function readStaticCatalog(path, source = readFileSync(path, "utf8")) {
|
|
|
43
43
|
if (typeof result === "string") throw new Error(`${path}: expected a catalog object`);
|
|
44
44
|
return result;
|
|
45
45
|
}
|
|
46
|
-
//#endregion
|
|
47
46
|
export { readStaticCatalog };
|
|
48
47
|
|
|
49
48
|
//# sourceMappingURL=catalogs.mjs.map
|
package/dist/docs.d.mts
CHANGED
package/dist/docs.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
|
-
|
|
3
|
+
// src/docs.ts
|
|
4
4
|
/** Reports relative Markdown links whose target file does not exist. */
|
|
5
5
|
function checkDocumentLinks(root, files) {
|
|
6
6
|
const findings = [];
|
|
@@ -15,7 +15,6 @@ function checkDocumentLinks(root, files) {
|
|
|
15
15
|
}
|
|
16
16
|
return findings;
|
|
17
17
|
}
|
|
18
|
-
//#endregion
|
|
19
18
|
export { checkDocumentLinks };
|
|
20
19
|
|
|
21
20
|
//# sourceMappingURL=docs.mjs.map
|
package/dist/process.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/process.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Copies the current environment and layers local dotenv files beneath it; values
|
|
4
3
|
* already set in the process win. Loaded secrets are never printed.
|
|
@@ -19,5 +18,4 @@ export interface TurboOptions {
|
|
|
19
18
|
* the local cache only, so forks never read or write the shared remote cache.
|
|
20
19
|
*/
|
|
21
20
|
export declare function turbo(root: string, task: string, args?: string[], { developmentTasks, env: extra, trustedCacheEnv }?: TurboOptions): Promise<void>;
|
|
22
|
-
//#endregion
|
|
23
21
|
//# sourceMappingURL=process.d.mts.map
|
package/dist/process.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { config } from "@dotenvx/dotenvx";
|
|
5
|
-
|
|
5
|
+
// src/process.ts
|
|
6
6
|
/**
|
|
7
7
|
* Copies the current environment and layers local dotenv files beneath it; values
|
|
8
8
|
* already set in the process win. Loaded secrets are never printed.
|
|
@@ -76,7 +76,6 @@ function turbo(root, task, args = [], { developmentTasks = ["dev", "build"], env
|
|
|
76
76
|
...args
|
|
77
77
|
], root, env);
|
|
78
78
|
}
|
|
79
|
-
//#endregion
|
|
80
79
|
export { developmentEnvironment, run, turbo };
|
|
81
80
|
|
|
82
81
|
//# sourceMappingURL=process.mjs.map
|
package/dist/toolchain.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/toolchain.d.ts
|
|
2
1
|
export interface Toolchain {
|
|
3
2
|
node: string;
|
|
4
3
|
bun: string;
|
|
@@ -23,5 +22,4 @@ export declare function assertToolchainRuntime(root: string, options?: RuntimeOp
|
|
|
23
22
|
};
|
|
24
23
|
/** Check duplicated declarations without installing tools or running application code. */
|
|
25
24
|
export declare function checkToolchain(root: string, { documents, turboGlobalDependencies }?: ToolchainOptions): string[];
|
|
26
|
-
//#endregion
|
|
27
25
|
//# sourceMappingURL=toolchain.d.mts.map
|
package/dist/toolchain.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { execFileSync } from "node:child_process";
|
|
5
5
|
import { parseTOML } from "confbox/toml";
|
|
6
6
|
import { parseYAML } from "confbox/yaml";
|
|
7
|
-
|
|
7
|
+
// src/toolchain.ts
|
|
8
8
|
const exactVersion = /^\d+\.\d+\.\d+$/;
|
|
9
9
|
const manifestAt = (root, file = "package.json") => JSON.parse(readFileSync(join(root, file), "utf8"));
|
|
10
10
|
const catalogsOf = (manifest) => {
|
|
@@ -207,7 +207,6 @@ function checkToolchain(root, { documents = ["README.md", "AGENTS.md"], turboGlo
|
|
|
207
207
|
}
|
|
208
208
|
return [...new Set(findings)];
|
|
209
209
|
}
|
|
210
|
-
//#endregion
|
|
211
210
|
export { assertToolchainRuntime, checkToolchain, pinnedNode, readToolchain };
|
|
212
211
|
|
|
213
212
|
//# sourceMappingURL=toolchain.mjs.map
|
package/dist/workspaces.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/workspaces.d.ts
|
|
2
1
|
export declare const targets: readonly ["universal", "browser", "native", "node", "bun"];
|
|
3
2
|
export type Target = (typeof targets)[number];
|
|
4
3
|
export declare const kinds: readonly ["app", "library", "tooling"];
|
|
@@ -11,7 +10,7 @@ export interface Metadata {
|
|
|
11
10
|
sourceTargets?: Record<string, Target>;
|
|
12
11
|
/** Maintained source behind an export whose published target is generated. */
|
|
13
12
|
sourceEntries?: Record<string, string>;
|
|
14
|
-
/** Development dependencies explicitly bundled into
|
|
13
|
+
/** Development dependencies explicitly bundled into runtime; internal workspaces require app/tooling. */
|
|
15
14
|
bundledDependencies?: string[];
|
|
16
15
|
}
|
|
17
16
|
export interface Manifest {
|
|
@@ -67,5 +66,4 @@ export declare function resolveImport(index: WorkspaceIndex, from: Workspace, fi
|
|
|
67
66
|
paths: string[];
|
|
68
67
|
targetPlatform: "browser" | "bun" | "native" | "node" | "universal";
|
|
69
68
|
};
|
|
70
|
-
//#endregion
|
|
71
69
|
//# sourceMappingURL=workspaces.d.mts.map
|
package/dist/workspaces.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, globSync, readFileSync, readdirSync } from "node:fs";
|
|
2
2
|
import { join, posix } from "node:path";
|
|
3
|
-
|
|
3
|
+
// src/workspaces.ts
|
|
4
4
|
const targets = [
|
|
5
5
|
"universal",
|
|
6
6
|
"browser",
|
|
@@ -133,7 +133,6 @@ function resolveImport(index, from, file, request) {
|
|
|
133
133
|
targetPlatform: owner ? sourceTarget(owner, path) : "universal"
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
|
-
//#endregion
|
|
137
136
|
export { compatible, discover, exportPaths, kinds, matches, resolveImport, sourceTarget, targets, workspaceFor, workspacePatterns };
|
|
138
137
|
|
|
139
138
|
//# sourceMappingURL=workspaces.mjs.map
|
package/dist/workspaces.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaces.mjs","names":[],"sources":["../src/workspaces.ts"],"sourcesContent":["import { existsSync, globSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, posix } from \"node:path\";\n\nexport const targets = [\"universal\", \"browser\", \"native\", \"node\", \"bun\"] as const;\nexport type Target = (typeof targets)[number];\nexport const kinds = [\"app\", \"library\", \"tooling\"] as const;\nexport type Kind = (typeof kinds)[number];\n\n/** Per-workspace boundary metadata, supplied explicitly or read from package.json. */\nexport interface Metadata {\n kind: Kind;\n target: Target;\n entryTargets?: Record<string, Target>;\n sourceTargets?: Record<string, Target>;\n /** Maintained source behind an export whose published target is generated. */\n sourceEntries?: Record<string, string>;\n /** Development dependencies explicitly bundled into the published runtime. */\n bundledDependencies?: string[];\n}\nexport interface Manifest {\n name: string;\n private?: boolean;\n type?: string;\n exports?: Record<string, unknown>;\n imports?: Record<string, string>;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\nexport interface Workspace {\n path: string;\n manifest: Manifest;\n metadata: Metadata | undefined;\n aliases: Record<string, string[]>;\n}\nexport interface WorkspaceIndex {\n root: string;\n metadataKey: string;\n /** Origin of workspace metadata; omitted legacy indexes use the manifest. */\n metadataSource?: \"manifest\" | \"options\";\n workspaces: Workspace[];\n byName: Map<string, Workspace>;\n findings: string[];\n}\nexport interface DiscoverOptions {\n /** Complete metadata by exact workspace-relative path; never merged with manifests. */\n metadata?: Readonly<Record<string, Metadata>>;\n /** The package.json field holding {@link Metadata}, used only when metadata is omitted. */\n metadataKey?: string;\n /** Directories whose children must each be a workspace. */\n containers?: readonly string[];\n}\n\n/** Matches package export, import-map and tsconfig path patterns, including `**`. */\nexport function matches(pattern: string, value: string): boolean {\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === \"*\" && pattern[i + 1] === \"*\") {\n if (pattern[i + 2] === \"/\") {\n regex += \"(?:.*/)?\";\n i += 2;\n } else {\n regex += \".*\";\n i++;\n }\n } else if (char === \"*\") regex += \"[^/]*\";\n else regex += char.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(`${regex}$`).test(value);\n}\n\n/** Reads workspace patterns from the array or Bun/Yarn object form of `workspaces`. */\nexport function workspacePatterns(manifest: { workspaces?: unknown }): string[] {\n const value = manifest.workspaces;\n if (Array.isArray(value)) return value as string[];\n if (\n value &&\n typeof value === \"object\" &&\n Array.isArray((value as { packages?: unknown }).packages)\n )\n return (value as { packages: string[] }).packages;\n return [];\n}\n\nexport function discover(\n root: string,\n { metadata, metadataKey = \"devkit\", containers = [\"apps\", \"packages\"] }: DiscoverOptions = {},\n): WorkspaceIndex {\n const manifest = JSON.parse(readFileSync(join(root, \"package.json\"), \"utf8\"));\n const findings: string[] = [];\n const workspaces: Workspace[] = [];\n for (const file of globSync(\n workspacePatterns(manifest).map((p) => `${p}/package.json`),\n { cwd: root },\n ).sort()) {\n const path = file.replaceAll(\"\\\\\", \"/\").slice(0, -13);\n const entry = JSON.parse(readFileSync(join(root, file), \"utf8\")) as Manifest;\n const workspaceMetadata =\n metadata === undefined\n ? (entry[metadataKey] as Metadata | undefined)\n : Object.hasOwn(metadata, path)\n ? metadata[path]\n : undefined;\n if (metadata !== undefined && workspaceMetadata === undefined)\n findings.push(`${path}: missing supplied workspace metadata`);\n let aliases: Record<string, string[]> = {};\n const config = join(root, path, \"tsconfig.json\");\n if (existsSync(config)) {\n try {\n aliases = JSON.parse(readFileSync(config, \"utf8\")).compilerOptions?.paths ?? {};\n } catch {\n findings.push(`${path}/tsconfig.json: expected valid JSON`);\n }\n }\n workspaces.push({\n path,\n manifest: entry,\n metadata: workspaceMetadata,\n aliases,\n });\n }\n const byName = new Map<string, Workspace>();\n for (const workspace of workspaces) {\n if (byName.has(workspace.manifest.name))\n findings.push(`duplicate workspace: ${workspace.manifest.name}`);\n byName.set(workspace.manifest.name, workspace);\n }\n if (metadata !== undefined) {\n const paths = new Set(workspaces.map((workspace) => workspace.path));\n for (const path of Object.keys(metadata).sort()) {\n if (!paths.has(path)) findings.push(`${path}: metadata supplied for unknown workspace`);\n }\n }\n for (const parent of containers) {\n if (!existsSync(join(root, parent))) continue;\n for (const child of readdirSync(join(root, parent), { withFileTypes: true })) {\n if (!child.isDirectory() || child.name.startsWith(\".\")) continue;\n const path = `${parent}/${child.name}`;\n if (!workspaces.some((w) => w.path === path))\n findings.push(`${path}: missing workspace manifest`);\n }\n }\n return {\n root,\n metadataKey,\n metadataSource: metadata === undefined ? \"manifest\" : \"options\",\n workspaces,\n byName,\n findings,\n };\n}\n\nexport function workspaceFor(index: WorkspaceIndex, file: string) {\n return index.workspaces.find((w) => file.startsWith(`${w.path}/`));\n}\n\nexport function sourceTarget(workspace: Workspace, file: string): Target {\n const relative = file.slice(workspace.path.length + 1);\n const scopes = Object.entries(workspace.metadata?.sourceTargets ?? {})\n .filter(([pattern]) => matches(pattern, relative))\n .sort(([a], [b]) => b.replaceAll(\"*\", \"\").length - a.replaceAll(\"*\", \"\").length);\n return scopes[0]?.[1] ?? workspace.metadata?.target ?? \"universal\";\n}\n\nexport function compatible(from: Target, to: Target): boolean {\n return to === \"universal\" || from === to || (from === \"bun\" && to === \"node\");\n}\n\nexport function exportPaths(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (value && typeof value === \"object\") return Object.values(value).flatMap(exportPaths);\n return [];\n}\n\nexport function resolveImport(\n index: WorkspaceIndex,\n from: Workspace,\n file: string,\n request: string,\n) {\n const name = request.startsWith(\"@\")\n ? request.split(\"/\").slice(0, 2).join(\"/\")\n : request.split(\"/\")[0]!;\n const target = index.byName.get(name);\n if (target) {\n const subpath = request === name ? \".\" : `.${request.slice(name.length)}`;\n const entry = Object.entries(target.manifest.exports ?? {}).find(([pattern]) =>\n matches(pattern, subpath),\n );\n const suffix = entry?.[0].includes(\"*\") ? subpath.slice(entry[0].split(\"*\")[0]!.length) : \"\";\n const source = entry && target.metadata?.sourceEntries?.[entry[0]];\n return {\n target,\n subpath,\n internalPath: !entry,\n paths: entry\n ? (source ? [source] : exportPaths(entry[1])).map((p) =>\n posix.join(target.path, p.replace(\"*\", suffix)),\n )\n : [],\n targetPlatform:\n target.metadata?.entryTargets?.[entry?.[0] ?? subpath] ??\n target.metadata?.target ??\n \"universal\",\n };\n }\n const alias = Object.entries(from.aliases).find(([pattern]) => matches(pattern, request));\n const internal = Object.entries(from.manifest.imports ?? {}).find(([pattern]) =>\n matches(pattern, request),\n );\n const pattern = internal?.[0] ?? alias?.[0];\n const mapped = internal?.[1] ?? alias?.[1][0];\n const suffix = pattern?.includes(\"*\") ? request.slice(pattern.split(\"*\")[0]!.length) : \"\";\n const path = request.startsWith(\".\")\n ? posix.join(posix.dirname(file), request)\n : mapped\n ? posix.join(from.path, mapped.replace(\"*\", suffix))\n : undefined;\n const owner = path ? workspaceFor(index, path) : undefined;\n return {\n target: owner,\n subpath: \".\",\n internalPath: !!owner && owner !== from,\n paths: path ? [path] : [],\n targetPlatform: owner ? sourceTarget(owner, path!) : (\"universal\" as Target),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspaces.mjs","names":[],"sources":["../src/workspaces.ts"],"sourcesContent":["import { existsSync, globSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, posix } from \"node:path\";\n\nexport const targets = [\"universal\", \"browser\", \"native\", \"node\", \"bun\"] as const;\nexport type Target = (typeof targets)[number];\nexport const kinds = [\"app\", \"library\", \"tooling\"] as const;\nexport type Kind = (typeof kinds)[number];\n\n/** Per-workspace boundary metadata, supplied explicitly or read from package.json. */\nexport interface Metadata {\n kind: Kind;\n target: Target;\n entryTargets?: Record<string, Target>;\n sourceTargets?: Record<string, Target>;\n /** Maintained source behind an export whose published target is generated. */\n sourceEntries?: Record<string, string>;\n /** Development dependencies explicitly bundled into runtime; internal workspaces require app/tooling. */\n bundledDependencies?: string[];\n}\nexport interface Manifest {\n name: string;\n private?: boolean;\n type?: string;\n exports?: Record<string, unknown>;\n imports?: Record<string, string>;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\nexport interface Workspace {\n path: string;\n manifest: Manifest;\n metadata: Metadata | undefined;\n aliases: Record<string, string[]>;\n}\nexport interface WorkspaceIndex {\n root: string;\n metadataKey: string;\n /** Origin of workspace metadata; omitted legacy indexes use the manifest. */\n metadataSource?: \"manifest\" | \"options\";\n workspaces: Workspace[];\n byName: Map<string, Workspace>;\n findings: string[];\n}\nexport interface DiscoverOptions {\n /** Complete metadata by exact workspace-relative path; never merged with manifests. */\n metadata?: Readonly<Record<string, Metadata>>;\n /** The package.json field holding {@link Metadata}, used only when metadata is omitted. */\n metadataKey?: string;\n /** Directories whose children must each be a workspace. */\n containers?: readonly string[];\n}\n\n/** Matches package export, import-map and tsconfig path patterns, including `**`. */\nexport function matches(pattern: string, value: string): boolean {\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === \"*\" && pattern[i + 1] === \"*\") {\n if (pattern[i + 2] === \"/\") {\n regex += \"(?:.*/)?\";\n i += 2;\n } else {\n regex += \".*\";\n i++;\n }\n } else if (char === \"*\") regex += \"[^/]*\";\n else regex += char.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(`${regex}$`).test(value);\n}\n\n/** Reads workspace patterns from the array or Bun/Yarn object form of `workspaces`. */\nexport function workspacePatterns(manifest: { workspaces?: unknown }): string[] {\n const value = manifest.workspaces;\n if (Array.isArray(value)) return value as string[];\n if (\n value &&\n typeof value === \"object\" &&\n Array.isArray((value as { packages?: unknown }).packages)\n )\n return (value as { packages: string[] }).packages;\n return [];\n}\n\nexport function discover(\n root: string,\n { metadata, metadataKey = \"devkit\", containers = [\"apps\", \"packages\"] }: DiscoverOptions = {},\n): WorkspaceIndex {\n const manifest = JSON.parse(readFileSync(join(root, \"package.json\"), \"utf8\"));\n const findings: string[] = [];\n const workspaces: Workspace[] = [];\n for (const file of globSync(\n workspacePatterns(manifest).map((p) => `${p}/package.json`),\n { cwd: root },\n ).sort()) {\n const path = file.replaceAll(\"\\\\\", \"/\").slice(0, -13);\n const entry = JSON.parse(readFileSync(join(root, file), \"utf8\")) as Manifest;\n const workspaceMetadata =\n metadata === undefined\n ? (entry[metadataKey] as Metadata | undefined)\n : Object.hasOwn(metadata, path)\n ? metadata[path]\n : undefined;\n if (metadata !== undefined && workspaceMetadata === undefined)\n findings.push(`${path}: missing supplied workspace metadata`);\n let aliases: Record<string, string[]> = {};\n const config = join(root, path, \"tsconfig.json\");\n if (existsSync(config)) {\n try {\n aliases = JSON.parse(readFileSync(config, \"utf8\")).compilerOptions?.paths ?? {};\n } catch {\n findings.push(`${path}/tsconfig.json: expected valid JSON`);\n }\n }\n workspaces.push({\n path,\n manifest: entry,\n metadata: workspaceMetadata,\n aliases,\n });\n }\n const byName = new Map<string, Workspace>();\n for (const workspace of workspaces) {\n if (byName.has(workspace.manifest.name))\n findings.push(`duplicate workspace: ${workspace.manifest.name}`);\n byName.set(workspace.manifest.name, workspace);\n }\n if (metadata !== undefined) {\n const paths = new Set(workspaces.map((workspace) => workspace.path));\n for (const path of Object.keys(metadata).sort()) {\n if (!paths.has(path)) findings.push(`${path}: metadata supplied for unknown workspace`);\n }\n }\n for (const parent of containers) {\n if (!existsSync(join(root, parent))) continue;\n for (const child of readdirSync(join(root, parent), { withFileTypes: true })) {\n if (!child.isDirectory() || child.name.startsWith(\".\")) continue;\n const path = `${parent}/${child.name}`;\n if (!workspaces.some((w) => w.path === path))\n findings.push(`${path}: missing workspace manifest`);\n }\n }\n return {\n root,\n metadataKey,\n metadataSource: metadata === undefined ? \"manifest\" : \"options\",\n workspaces,\n byName,\n findings,\n };\n}\n\nexport function workspaceFor(index: WorkspaceIndex, file: string) {\n return index.workspaces.find((w) => file.startsWith(`${w.path}/`));\n}\n\nexport function sourceTarget(workspace: Workspace, file: string): Target {\n const relative = file.slice(workspace.path.length + 1);\n const scopes = Object.entries(workspace.metadata?.sourceTargets ?? {})\n .filter(([pattern]) => matches(pattern, relative))\n .sort(([a], [b]) => b.replaceAll(\"*\", \"\").length - a.replaceAll(\"*\", \"\").length);\n return scopes[0]?.[1] ?? workspace.metadata?.target ?? \"universal\";\n}\n\nexport function compatible(from: Target, to: Target): boolean {\n return to === \"universal\" || from === to || (from === \"bun\" && to === \"node\");\n}\n\nexport function exportPaths(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (value && typeof value === \"object\") return Object.values(value).flatMap(exportPaths);\n return [];\n}\n\nexport function resolveImport(\n index: WorkspaceIndex,\n from: Workspace,\n file: string,\n request: string,\n) {\n const name = request.startsWith(\"@\")\n ? request.split(\"/\").slice(0, 2).join(\"/\")\n : request.split(\"/\")[0]!;\n const target = index.byName.get(name);\n if (target) {\n const subpath = request === name ? \".\" : `.${request.slice(name.length)}`;\n const entry = Object.entries(target.manifest.exports ?? {}).find(([pattern]) =>\n matches(pattern, subpath),\n );\n const suffix = entry?.[0].includes(\"*\") ? subpath.slice(entry[0].split(\"*\")[0]!.length) : \"\";\n const source = entry && target.metadata?.sourceEntries?.[entry[0]];\n return {\n target,\n subpath,\n internalPath: !entry,\n paths: entry\n ? (source ? [source] : exportPaths(entry[1])).map((p) =>\n posix.join(target.path, p.replace(\"*\", suffix)),\n )\n : [],\n targetPlatform:\n target.metadata?.entryTargets?.[entry?.[0] ?? subpath] ??\n target.metadata?.target ??\n \"universal\",\n };\n }\n const alias = Object.entries(from.aliases).find(([pattern]) => matches(pattern, request));\n const internal = Object.entries(from.manifest.imports ?? {}).find(([pattern]) =>\n matches(pattern, request),\n );\n const pattern = internal?.[0] ?? alias?.[0];\n const mapped = internal?.[1] ?? alias?.[1][0];\n const suffix = pattern?.includes(\"*\") ? request.slice(pattern.split(\"*\")[0]!.length) : \"\";\n const path = request.startsWith(\".\")\n ? posix.join(posix.dirname(file), request)\n : mapped\n ? posix.join(from.path, mapped.replace(\"*\", suffix))\n : undefined;\n const owner = path ? workspaceFor(index, path) : undefined;\n return {\n target: owner,\n subpath: \".\",\n internalPath: !!owner && owner !== from,\n paths: path ? [path] : [],\n targetPlatform: owner ? sourceTarget(owner, path!) : (\"universal\" as Target),\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@raypx-kit/devkit",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.1",
|
|
4
4
|
"description": "Monorepo maintenance checks: workspace boundaries, toolchain pins, static catalogs, artifacts and task helpers.",
|
|
5
5
|
"homepage": "https://github.com/raypx/raypx-kit/tree/canary/packages/devkit",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -63,10 +63,10 @@
|
|
|
63
63
|
"test:coverage": "bun --bun vp test --run --passWithNoTests --coverage --coverage.reporter=text --coverage.reporter=json --coverage.reporter=lcov",
|
|
64
64
|
"build": "tsdown",
|
|
65
65
|
"dev": "tsdown --watch",
|
|
66
|
-
"pack:check": "bun pm pack --dry-run
|
|
66
|
+
"pack:check": "bun pm pack --dry-run"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@dotenvx/dotenvx": "^2.38.
|
|
69
|
+
"@dotenvx/dotenvx": "^2.38.2",
|
|
70
70
|
"confbox": "^0.3.1",
|
|
71
71
|
"oxc-parser": "^0.155.0"
|
|
72
72
|
},
|
|
@@ -74,6 +74,6 @@
|
|
|
74
74
|
"@vitest/coverage-v8": "^5.0.5"
|
|
75
75
|
},
|
|
76
76
|
"engines": {
|
|
77
|
-
"node": ">=22.
|
|
77
|
+
"node": ">=22.21"
|
|
78
78
|
}
|
|
79
79
|
}
|