@astrale-os/sdk 0.4.11 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/authenticate.d.ts +1 -1
- package/dist/auth/authenticate.d.ts.map +1 -1
- package/dist/auth/authenticate.js +2 -2
- package/dist/auth/authenticate.js.map +1 -1
- package/dist/auth/check.js +1 -1
- package/dist/auth/check.js.map +1 -1
- package/dist/auth/function-context.d.ts +1 -1
- package/dist/auth/function-context.d.ts.map +1 -1
- package/dist/auth/function-context.js +3 -3
- package/dist/auth/function-context.js.map +1 -1
- package/dist/auth/index.d.ts +15 -15
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +10 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/issuer-mint.d.ts +1 -1
- package/dist/auth/issuer-mint.d.ts.map +1 -1
- package/dist/auth/issuer-mint.js +2 -2
- package/dist/auth/issuer-mint.js.map +1 -1
- package/dist/auth/kernel-client.d.ts +1 -1
- package/dist/auth/kernel-client.d.ts.map +1 -1
- package/dist/auth/kernel-client.js +2 -2
- package/dist/auth/kernel-client.js.map +1 -1
- package/dist/auth/resolve.d.ts +2 -2
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +2 -2
- package/dist/auth/resolve.js.map +1 -1
- package/dist/auth/verify.d.ts +1 -1
- package/dist/auth/verify.d.ts.map +1 -1
- package/dist/auth/verify.js +2 -2
- package/dist/auth/verify.js.map +1 -1
- package/dist/cli/bin.js +1 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/publish.js +1 -1
- package/dist/cli/publish.js.map +1 -1
- package/dist/cli/run.d.ts +9 -3
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +55 -5
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/spec.d.ts +1 -1
- package/dist/cli/spec.d.ts.map +1 -1
- package/dist/cli/spec.js +1 -1
- package/dist/cli/spec.js.map +1 -1
- package/dist/config/define-domain.d.ts +2 -2
- package/dist/config/define-domain.d.ts.map +1 -1
- package/dist/config/deploy.d.ts +2 -2
- package/dist/config/deploy.d.ts.map +1 -1
- package/dist/config/index.d.ts +6 -6
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -3
- package/dist/config/index.js.map +1 -1
- package/dist/define/index.d.ts +4 -4
- package/dist/define/index.d.ts.map +1 -1
- package/dist/define/index.js +2 -2
- package/dist/define/index.js.map +1 -1
- package/dist/define/remote-function.d.ts +7 -5
- package/dist/define/remote-function.d.ts.map +1 -1
- package/dist/define/remote-function.js.map +1 -1
- package/dist/define/view.d.ts +3 -3
- package/dist/define/view.d.ts.map +1 -1
- package/dist/deploy/check.d.ts +1 -1
- package/dist/deploy/check.d.ts.map +1 -1
- package/dist/deploy/check.js +1 -1
- package/dist/deploy/check.js.map +1 -1
- package/dist/deploy/index.d.ts +2 -2
- package/dist/deploy/index.d.ts.map +1 -1
- package/dist/deploy/index.js +2 -2
- package/dist/deploy/index.js.map +1 -1
- package/dist/dispatch/authorize.js +1 -1
- package/dist/dispatch/authorize.js.map +1 -1
- package/dist/dispatch/dispatcher.d.ts +11 -21
- package/dist/dispatch/dispatcher.d.ts.map +1 -1
- package/dist/dispatch/dispatcher.js +66 -65
- package/dist/dispatch/dispatcher.js.map +1 -1
- package/dist/dispatch/execute.d.ts +7 -6
- package/dist/dispatch/execute.d.ts.map +1 -1
- package/dist/dispatch/execute.js +1 -0
- package/dist/dispatch/execute.js.map +1 -1
- package/dist/dispatch/identity.d.ts +2 -2
- package/dist/dispatch/identity.d.ts.map +1 -1
- package/dist/dispatch/index.d.ts +6 -6
- package/dist/dispatch/index.d.ts.map +1 -1
- package/dist/dispatch/index.js +6 -6
- package/dist/dispatch/index.js.map +1 -1
- package/dist/dispatch/resolve.d.ts +1 -1
- package/dist/dispatch/resolve.d.ts.map +1 -1
- package/dist/dispatch/self.d.ts +1 -1
- package/dist/dispatch/self.d.ts.map +1 -1
- package/dist/domain/build-spec.d.ts +1 -1
- package/dist/domain/build-spec.d.ts.map +1 -1
- package/dist/domain/build-spec.js +2 -2
- package/dist/domain/build-spec.js.map +1 -1
- package/dist/domain/contract.d.ts +1 -1
- package/dist/domain/contract.d.ts.map +1 -1
- package/dist/domain/define.d.ts +4 -4
- package/dist/domain/define.d.ts.map +1 -1
- package/dist/domain/define.js +2 -2
- package/dist/domain/define.js.map +1 -1
- package/dist/domain/extend-functions.d.ts +1 -1
- package/dist/domain/extend-functions.d.ts.map +1 -1
- package/dist/domain/extend-functions.js +1 -1
- package/dist/domain/extend-functions.js.map +1 -1
- package/dist/domain/extend-views.d.ts +1 -1
- package/dist/domain/extend-views.d.ts.map +1 -1
- package/dist/domain/extend-views.js +1 -1
- package/dist/domain/extend-views.js.map +1 -1
- package/dist/domain/index.d.ts +4 -4
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +3 -3
- package/dist/domain/index.js.map +1 -1
- package/dist/index.d.ts +19 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/linter/analyze.d.ts +6 -0
- package/dist/linter/analyze.d.ts.map +1 -0
- package/dist/linter/analyze.js +12 -0
- package/dist/linter/analyze.js.map +1 -0
- package/dist/linter/diagnostic.d.ts +32 -0
- package/dist/linter/diagnostic.d.ts.map +1 -0
- package/dist/linter/diagnostic.js +35 -0
- package/dist/linter/diagnostic.js.map +1 -0
- package/dist/linter/index.d.ts +10 -0
- package/dist/linter/index.d.ts.map +1 -0
- package/dist/linter/index.js +6 -0
- package/dist/linter/index.js.map +1 -0
- package/dist/linter/lint.d.ts +8 -0
- package/dist/linter/lint.d.ts.map +1 -0
- package/dist/linter/lint.js +26 -0
- package/dist/linter/lint.js.map +1 -0
- package/dist/linter/oxlint/config.d.ts +14 -0
- package/dist/linter/oxlint/config.d.ts.map +1 -0
- package/dist/linter/oxlint/config.js +18 -0
- package/dist/linter/oxlint/config.js.map +1 -0
- package/dist/linter/oxlint/plugin.d.ts +13 -0
- package/dist/linter/oxlint/plugin.d.ts.map +1 -0
- package/dist/linter/oxlint/plugin.js +14 -0
- package/dist/linter/oxlint/plugin.js.map +1 -0
- package/dist/linter/oxlint/run.d.ts +7 -0
- package/dist/linter/oxlint/run.d.ts.map +1 -0
- package/dist/linter/oxlint/run.js +122 -0
- package/dist/linter/oxlint/run.js.map +1 -0
- package/dist/linter/preflight.d.ts +2 -0
- package/dist/linter/preflight.d.ts.map +1 -0
- package/dist/linter/preflight.js +162 -0
- package/dist/linter/preflight.js.map +1 -0
- package/dist/linter/project.d.ts +12 -0
- package/dist/linter/project.d.ts.map +1 -0
- package/dist/linter/project.js +88 -0
- package/dist/linter/project.js.map +1 -0
- package/dist/linter/report.d.ts +4 -0
- package/dist/linter/report.d.ts.map +1 -0
- package/dist/linter/report.js +22 -0
- package/dist/linter/report.js.map +1 -0
- package/dist/linter/rules/catalog.d.ts +56 -0
- package/dist/linter/rules/catalog.d.ts.map +1 -0
- package/dist/linter/rules/catalog.js +53 -0
- package/dist/linter/rules/catalog.js.map +1 -0
- package/dist/linter/rules/core-has-no-async.d.ts +3 -0
- package/dist/linter/rules/core-has-no-async.d.ts.map +1 -0
- package/dist/linter/rules/core-has-no-async.js +43 -0
- package/dist/linter/rules/core-has-no-async.js.map +1 -0
- package/dist/linter/rules/core-is-pure.d.ts +3 -0
- package/dist/linter/rules/core-is-pure.d.ts.map +1 -0
- package/dist/linter/rules/core-is-pure.js +74 -0
- package/dist/linter/rules/core-is-pure.js.map +1 -0
- package/dist/linter/rules/no-nested-steps.d.ts +3 -0
- package/dist/linter/rules/no-nested-steps.d.ts.map +1 -0
- package/dist/linter/rules/no-nested-steps.js +32 -0
- package/dist/linter/rules/no-nested-steps.js.map +1 -0
- package/dist/linter/rules/no-read-inside-mutate.d.ts +3 -0
- package/dist/linter/rules/no-read-inside-mutate.d.ts.map +1 -0
- package/dist/linter/rules/no-read-inside-mutate.js +64 -0
- package/dist/linter/rules/no-read-inside-mutate.js.map +1 -0
- package/dist/linter/rules/one-remote-definition-per-file.d.ts +3 -0
- package/dist/linter/rules/one-remote-definition-per-file.d.ts.map +1 -0
- package/dist/linter/rules/one-remote-definition-per-file.js +23 -0
- package/dist/linter/rules/one-remote-definition-per-file.js.map +1 -0
- package/dist/linter/rules/oxlint-ast.d.ts +30 -0
- package/dist/linter/rules/oxlint-ast.d.ts.map +1 -0
- package/dist/linter/rules/oxlint-ast.js +104 -0
- package/dist/linter/rules/oxlint-ast.js.map +1 -0
- package/dist/linter/rules/oxlint-rule.d.ts +45 -0
- package/dist/linter/rules/oxlint-rule.d.ts.map +1 -0
- package/dist/linter/rules/oxlint-rule.js +2 -0
- package/dist/linter/rules/oxlint-rule.js.map +1 -0
- package/dist/linter/rules/project-rule.d.ts +10 -0
- package/dist/linter/rules/project-rule.d.ts.map +1 -0
- package/dist/linter/rules/project-rule.js +24 -0
- package/dist/linter/rules/project-rule.js.map +1 -0
- package/dist/linter/rules/thin-schema-composition-root.d.ts +3 -0
- package/dist/linter/rules/thin-schema-composition-root.d.ts.map +1 -0
- package/dist/linter/rules/thin-schema-composition-root.js +23 -0
- package/dist/linter/rules/thin-schema-composition-root.js.map +1 -0
- package/dist/linter/source.d.ts +24 -0
- package/dist/linter/source.d.ts.map +1 -0
- package/dist/linter/source.js +279 -0
- package/dist/linter/source.js.map +1 -0
- package/dist/linter/suppression.d.ts +3 -0
- package/dist/linter/suppression.d.ts.map +1 -0
- package/dist/linter/suppression.js +11 -0
- package/dist/linter/suppression.js.map +1 -0
- package/dist/method/class.d.ts +3 -3
- package/dist/method/class.d.ts.map +1 -1
- package/dist/method/context.d.ts +6 -4
- package/dist/method/context.d.ts.map +1 -1
- package/dist/method/index.d.ts +5 -5
- package/dist/method/index.d.ts.map +1 -1
- package/dist/method/index.js +2 -2
- package/dist/method/index.js.map +1 -1
- package/dist/method/single.d.ts +2 -2
- package/dist/method/single.d.ts.map +1 -1
- package/dist/server/auxiliary-routes.d.ts +3 -3
- package/dist/server/auxiliary-routes.d.ts.map +1 -1
- package/dist/server/auxiliary-routes.js +11 -11
- package/dist/server/auxiliary-routes.js.map +1 -1
- package/dist/server/config.d.ts +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/create.d.ts +2 -2
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +11 -11
- package/dist/server/create.js.map +1 -1
- package/dist/server/domain-entry.d.ts +5 -5
- package/dist/server/domain-entry.d.ts.map +1 -1
- package/dist/server/domain-entry.js +2 -2
- package/dist/server/domain-entry.js.map +1 -1
- package/dist/server/index.d.ts +11 -11
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +7 -7
- package/dist/server/index.js.map +1 -1
- package/dist/server/start.d.ts +1 -1
- package/dist/server/start.d.ts.map +1 -1
- package/dist/server/start.js.map +1 -1
- package/dist/server/worker-entry.d.ts +1 -1
- package/dist/server/worker-entry.d.ts.map +1 -1
- package/dist/server/worker-entry.js +3 -3
- package/dist/server/worker-entry.js.map +1 -1
- package/dist/step/index.d.ts +4 -4
- package/dist/step/index.d.ts.map +1 -1
- package/dist/step/index.js +2 -2
- package/dist/step/index.js.map +1 -1
- package/dist/step/inline.d.ts +1 -1
- package/dist/step/inline.d.ts.map +1 -1
- package/dist/step/inline.js +1 -1
- package/dist/step/inline.js.map +1 -1
- package/package.json +29 -8
- package/src/auth/authenticate.ts +3 -3
- package/src/auth/check.ts +1 -1
- package/src/auth/function-context.ts +4 -4
- package/src/auth/index.ts +15 -15
- package/src/auth/issuer-mint.ts +3 -3
- package/src/auth/kernel-client.ts +3 -3
- package/src/auth/resolve.ts +4 -4
- package/src/auth/verify.ts +3 -3
- package/src/cli/bin.ts +1 -1
- package/src/cli/index.ts +2 -2
- package/src/cli/publish.ts +1 -1
- package/src/cli/run.ts +59 -8
- package/src/cli/spec.ts +3 -3
- package/src/config/define-domain.ts +2 -2
- package/src/config/deploy.ts +2 -2
- package/src/config/index.ts +6 -6
- package/src/define/index.ts +4 -4
- package/src/define/remote-function.ts +7 -5
- package/src/define/view.ts +3 -3
- package/src/deploy/check.ts +2 -2
- package/src/deploy/index.ts +2 -2
- package/src/dispatch/authorize.ts +1 -1
- package/src/dispatch/dispatcher.ts +76 -83
- package/src/dispatch/execute.ts +8 -6
- package/src/dispatch/identity.ts +2 -2
- package/src/dispatch/index.ts +6 -6
- package/src/dispatch/resolve.ts +1 -1
- package/src/dispatch/self.ts +1 -1
- package/src/domain/build-spec.ts +4 -4
- package/src/domain/contract.ts +1 -1
- package/src/domain/define.ts +6 -6
- package/src/domain/extend-functions.ts +2 -2
- package/src/domain/extend-views.ts +2 -2
- package/src/domain/index.ts +4 -4
- package/src/index.ts +20 -20
- package/src/linter/analyze.ts +17 -0
- package/src/linter/diagnostic.ts +68 -0
- package/src/linter/docs/DIAGNOSTICS.md +47 -0
- package/src/linter/docs/JUDGMENT.md +81 -0
- package/src/linter/docs/PRINCIPLES.md +97 -0
- package/src/linter/docs/README.md +38 -0
- package/src/linter/docs/RULE-AUTHORING.md +144 -0
- package/src/linter/docs/RULES.md +153 -0
- package/src/linter/index.ts +14 -0
- package/src/linter/lint.ts +32 -0
- package/src/linter/oxlint/astrale-ox.d.ts +5 -0
- package/src/linter/oxlint/config.ts +19 -0
- package/src/linter/oxlint/plugin.js +16 -0
- package/src/linter/oxlint/run.ts +162 -0
- package/src/linter/preflight.ts +181 -0
- package/src/linter/project.ts +108 -0
- package/src/linter/report.ts +25 -0
- package/src/linter/rules/catalog.ts +67 -0
- package/src/linter/rules/core-has-no-async.js +43 -0
- package/src/linter/rules/core-is-pure.ts +103 -0
- package/src/linter/rules/no-nested-steps.js +37 -0
- package/src/linter/rules/no-read-inside-mutate.js +72 -0
- package/src/linter/rules/one-remote-definition-per-file.ts +29 -0
- package/src/linter/rules/oxlint-ast.js +110 -0
- package/src/linter/rules/oxlint-rule.ts +35 -0
- package/src/linter/rules/project-rule.ts +37 -0
- package/src/linter/rules/thin-schema-composition-root.ts +26 -0
- package/src/linter/source.ts +323 -0
- package/src/linter/suppression.ts +11 -0
- package/src/method/class.ts +3 -3
- package/src/method/context.ts +6 -4
- package/src/method/index.ts +5 -5
- package/src/method/single.ts +2 -2
- package/src/server/auxiliary-routes.ts +22 -17
- package/src/server/config.ts +1 -1
- package/src/server/create.ts +15 -15
- package/src/server/domain-entry.ts +7 -7
- package/src/server/index.ts +11 -11
- package/src/server/start.ts +3 -2
- package/src/server/worker-entry.ts +4 -4
- package/src/step/index.ts +4 -4
- package/src/step/inline.ts +2 -2
- package/dist/defer/index.d.ts +0 -24
- package/dist/defer/index.d.ts.map +0 -1
- package/dist/defer/index.js +0 -42
- package/dist/defer/index.js.map +0 -1
- package/src/defer/index.ts +0 -64
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile, realpath } from 'node:fs/promises';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { dirname, join, relative, resolve } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { LinterToolError } from './diagnostic.js';
|
|
7
|
+
const brandedPackages = [
|
|
8
|
+
'@astrale-os/kernel-client',
|
|
9
|
+
'@astrale-os/kernel-core',
|
|
10
|
+
'@astrale-os/kernel-dsl',
|
|
11
|
+
];
|
|
12
|
+
const conventionalMembers = ['client', 'frontend', 'schema', 'worker'];
|
|
13
|
+
export async function assertSingleTypeUniverse(root) {
|
|
14
|
+
const manifests = await collectConsumerManifests(root);
|
|
15
|
+
const consumers = [
|
|
16
|
+
...manifests.map((path) => ({ label: relative(root, dirname(path)) || '.', path })),
|
|
17
|
+
{ label: '@astrale-os/sdk/linter', path: fileURLPackageJson() },
|
|
18
|
+
];
|
|
19
|
+
for (const packageName of brandedPackages) {
|
|
20
|
+
const resolutions = [];
|
|
21
|
+
for (const consumer of consumers) {
|
|
22
|
+
const resolved = await resolvePackageRoot(packageName, consumer.path);
|
|
23
|
+
if (resolved)
|
|
24
|
+
resolutions.push({ consumer: consumer.label, path: resolved });
|
|
25
|
+
}
|
|
26
|
+
const paths = new Set(resolutions.map((resolution) => resolution.path));
|
|
27
|
+
if (paths.size <= 1)
|
|
28
|
+
continue;
|
|
29
|
+
const detail = formatResolutions(resolutions);
|
|
30
|
+
throw new LinterToolError(`Multiple physical installations of ${packageName} would create incompatible Astrale types.\n` +
|
|
31
|
+
`${detail}\nReinstall the workspace so every member resolves one compatible package instance.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function formatResolutions(resolutions) {
|
|
35
|
+
const byPath = new Map();
|
|
36
|
+
for (const resolution of resolutions) {
|
|
37
|
+
const consumers = byPath.get(resolution.path) ?? [];
|
|
38
|
+
consumers.push(resolution.consumer);
|
|
39
|
+
byPath.set(resolution.path, consumers);
|
|
40
|
+
}
|
|
41
|
+
return [...byPath]
|
|
42
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
43
|
+
.map(([path, consumers]) => {
|
|
44
|
+
const sorted = [...new Set(consumers)].sort();
|
|
45
|
+
const shown = sorted.slice(0, 4).join(', ');
|
|
46
|
+
const omitted = sorted.length > 4 ? ` (+${sorted.length - 4} more)` : '';
|
|
47
|
+
return ` ${path}\n from: ${shown}${omitted}`;
|
|
48
|
+
})
|
|
49
|
+
.join('\n');
|
|
50
|
+
}
|
|
51
|
+
async function collectConsumerManifests(root) {
|
|
52
|
+
const rootManifest = join(root, 'package.json');
|
|
53
|
+
if (!existsSync(rootManifest))
|
|
54
|
+
return [];
|
|
55
|
+
const manifests = new Set([rootManifest]);
|
|
56
|
+
const packageJson = await readPackageJson(rootManifest);
|
|
57
|
+
const workspaces = Array.isArray(packageJson?.workspaces)
|
|
58
|
+
? packageJson.workspaces
|
|
59
|
+
: packageJson?.workspaces?.packages;
|
|
60
|
+
for (const workspace of workspaces ?? []) {
|
|
61
|
+
if (typeof workspace !== 'string' || hasGlob(workspace))
|
|
62
|
+
continue;
|
|
63
|
+
addManifestWithinRoot(manifests, root, workspace);
|
|
64
|
+
}
|
|
65
|
+
for (const member of conventionalMembers)
|
|
66
|
+
addManifestWithinRoot(manifests, root, member);
|
|
67
|
+
await addDomainContractDependencyManifests(manifests);
|
|
68
|
+
return [...manifests].sort();
|
|
69
|
+
}
|
|
70
|
+
async function readPackageJson(manifest) {
|
|
71
|
+
try {
|
|
72
|
+
return JSON.parse(await readFile(manifest, 'utf8'));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function addDomainContractDependencyManifests(manifests) {
|
|
79
|
+
const pending = [...manifests];
|
|
80
|
+
for (let index = 0; index < pending.length; index++) {
|
|
81
|
+
const consumer = pending[index];
|
|
82
|
+
const packageJson = await readPackageJson(consumer);
|
|
83
|
+
const dependencies = {
|
|
84
|
+
...packageJson?.optionalDependencies,
|
|
85
|
+
...packageJson?.dependencies,
|
|
86
|
+
};
|
|
87
|
+
for (const packageName of Object.keys(dependencies).sort()) {
|
|
88
|
+
if (!isDomainContractPackage(packageName))
|
|
89
|
+
continue;
|
|
90
|
+
const manifest = await resolveDependencyManifest(packageName, consumer);
|
|
91
|
+
if (!manifest || manifests.has(manifest))
|
|
92
|
+
continue;
|
|
93
|
+
manifests.add(manifest);
|
|
94
|
+
pending.push(manifest);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function resolveDependencyManifest(packageName, consumerManifest) {
|
|
99
|
+
const require = createRequire(consumerManifest);
|
|
100
|
+
try {
|
|
101
|
+
return await realpath(require.resolve(`${packageName}/package.json`));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
try {
|
|
105
|
+
let directory = dirname(await realpath(require.resolve(packageName)));
|
|
106
|
+
for (;;) {
|
|
107
|
+
const manifest = join(directory, 'package.json');
|
|
108
|
+
if (existsSync(manifest)) {
|
|
109
|
+
const packageJson = await readPackageJson(manifest);
|
|
110
|
+
if (packageJson?.name === packageName)
|
|
111
|
+
return await realpath(manifest);
|
|
112
|
+
}
|
|
113
|
+
const parent = dirname(directory);
|
|
114
|
+
if (parent === directory)
|
|
115
|
+
return undefined;
|
|
116
|
+
directory = parent;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function addManifestWithinRoot(manifests, root, member) {
|
|
125
|
+
const manifest = resolve(root, member, 'package.json');
|
|
126
|
+
const parent = relative(root, manifest);
|
|
127
|
+
if (parent.startsWith('..') || parent === '')
|
|
128
|
+
return;
|
|
129
|
+
if (existsSync(manifest))
|
|
130
|
+
manifests.add(manifest);
|
|
131
|
+
}
|
|
132
|
+
function hasGlob(path) {
|
|
133
|
+
return /[*?[\]{}!]/u.test(path);
|
|
134
|
+
}
|
|
135
|
+
function isDomainContractPackage(packageName) {
|
|
136
|
+
return packageName.startsWith('@astrale-domains/');
|
|
137
|
+
}
|
|
138
|
+
async function resolvePackageRoot(packageName, manifest) {
|
|
139
|
+
if (!existsSync(manifest))
|
|
140
|
+
return undefined;
|
|
141
|
+
try {
|
|
142
|
+
const resolved = createRequire(manifest).resolve(`${packageName}/package.json`);
|
|
143
|
+
return await realpath(dirname(resolved));
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function fileURLPackageJson() {
|
|
150
|
+
let directory = dirname(fileURLToPath(import.meta.url));
|
|
151
|
+
for (;;) {
|
|
152
|
+
const candidate = join(directory, 'package.json');
|
|
153
|
+
if (existsSync(candidate))
|
|
154
|
+
return candidate;
|
|
155
|
+
const parent = dirname(directory);
|
|
156
|
+
if (parent === directory)
|
|
157
|
+
break;
|
|
158
|
+
directory = parent;
|
|
159
|
+
}
|
|
160
|
+
return join(directory, 'package.json');
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/linter/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,eAAe,GAAG;IACtB,2BAA2B;IAC3B,yBAAyB;IACzB,wBAAwB;CAChB,CAAA;AAEV,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAA;AAc/E,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY;IACzD,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG;QAChB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE;KAChE,CAAA;IAED,KAAK,MAAM,WAAW,IAAI,eAAe,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAiB,EAAE,CAAA;QACpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;YACrE,IAAI,QAAQ;gBAAE,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC9E,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACvE,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC;YAAE,SAAQ;QAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAA;QAC7C,MAAM,IAAI,eAAe,CACvB,sCAAsC,WAAW,6CAA6C;YAC5F,GAAG,MAAM,qFAAqF,CACjG,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAkC;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACnD,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC;SACf,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QACxE,OAAO,KAAK,IAAI,eAAe,KAAK,GAAG,OAAO,EAAE,CAAA;IAClD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,IAAY;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAA;IAExC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;IACzC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;QACvD,CAAC,CAAC,WAAW,CAAC,UAAU;QACxB,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAA;IAErC,KAAK,MAAM,SAAS,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;YAAE,SAAQ;QACjE,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,mBAAmB;QAAE,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACxF,MAAM,oCAAoC,CAAC,SAAS,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,CAAA;AAC9B,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oCAAoC,CAAC,SAAsB;IACxE,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAE,CAAA;QAChC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAA;QACnD,MAAM,YAAY,GAAG;YACnB,GAAG,WAAW,EAAE,oBAAoB;YACpC,GAAG,WAAW,EAAE,YAAY;SAC7B,CAAA;QACD,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC;gBAAE,SAAQ;YACnD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YACvE,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAQ;YAClD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,WAAmB,EACnB,gBAAwB;IAExB,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW,eAAe,CAAC,CAAC,CAAA;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,IAAI,SAAS,GAAG,OAAO,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;YACrE,SAAS,CAAC;gBACR,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;gBAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAA;oBACnD,IAAI,WAAW,EAAE,IAAI,KAAK,WAAW;wBAAE,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBACxE,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;gBACjC,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAA;gBAC1C,SAAS,GAAG,MAAM,CAAA;YACpB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAsB,EAAE,IAAY,EAAE,MAAc;IACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAA;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACvC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,EAAE;QAAE,OAAM;IACpD,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAmB;IAClD,OAAO,WAAW,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;AACpD,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,WAA6C,EAC7C,QAAgB;IAEhB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,WAAW,eAAe,CAAC,CAAA;QAC/E,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QACjD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,MAAM,KAAK,SAAS;YAAE,MAAK;QAC/B,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type SourceFile } from './source.js';
|
|
2
|
+
export type DomainProject = {
|
|
3
|
+
root: string;
|
|
4
|
+
files: readonly SourceFile[];
|
|
5
|
+
filesByPath: ReadonlyMap<string, SourceFile>;
|
|
6
|
+
};
|
|
7
|
+
export declare function discoverProject(root: string): Promise<DomainProject>;
|
|
8
|
+
export declare function normalizePath(path: string): string;
|
|
9
|
+
export declare function isProductionSource(relativePath: string): boolean;
|
|
10
|
+
export declare function isProductionCore(relativePath: string): boolean;
|
|
11
|
+
export declare function resolveProjectImport(project: DomainProject, importer: SourceFile, specifier: string): SourceFile | undefined;
|
|
12
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/linter/project.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAkBzD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;IAC5B,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CAC7C,CAAA;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiB1E;AAmBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAOhE;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,SAAS,CAQxB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readdir, readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import { dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { scanSource } from './source.js';
|
|
4
|
+
const ignoredDirectories = new Set([
|
|
5
|
+
'.astrale',
|
|
6
|
+
'.dist',
|
|
7
|
+
'.domain-studio',
|
|
8
|
+
'.git',
|
|
9
|
+
'.output',
|
|
10
|
+
'.turbo',
|
|
11
|
+
'.wrangler',
|
|
12
|
+
'coverage',
|
|
13
|
+
'dist',
|
|
14
|
+
'dist-client',
|
|
15
|
+
'node_modules',
|
|
16
|
+
]);
|
|
17
|
+
const sourceExtensions = new Set(['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx']);
|
|
18
|
+
export async function discoverProject(root) {
|
|
19
|
+
const projectRoot = await realpath(resolve(root));
|
|
20
|
+
const paths = [];
|
|
21
|
+
await collectSourcePaths(projectRoot, paths);
|
|
22
|
+
paths.sort();
|
|
23
|
+
const files = await Promise.all(paths.map(async (path) => {
|
|
24
|
+
const text = await readFile(path, 'utf8');
|
|
25
|
+
return scanSource(path, normalizePath(relative(projectRoot, path)), text);
|
|
26
|
+
}));
|
|
27
|
+
return {
|
|
28
|
+
root: projectRoot,
|
|
29
|
+
files,
|
|
30
|
+
filesByPath: new Map(files.map((file) => [file.path, file])),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function collectSourcePaths(directory, result) {
|
|
34
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
35
|
+
await Promise.all(entries.map(async (entry) => {
|
|
36
|
+
if (entry.isSymbolicLink())
|
|
37
|
+
return;
|
|
38
|
+
const path = join(directory, entry.name);
|
|
39
|
+
if (entry.isDirectory()) {
|
|
40
|
+
if (!ignoredDirectories.has(entry.name))
|
|
41
|
+
await collectSourcePaths(path, result);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!entry.isFile() || !sourceExtensions.has(extname(entry.name)))
|
|
45
|
+
return;
|
|
46
|
+
if (entry.name.endsWith('.d.ts') || entry.name.includes('.gen.'))
|
|
47
|
+
return;
|
|
48
|
+
result.push(path);
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
export function normalizePath(path) {
|
|
52
|
+
return sep === '/' ? path : path.split(sep).join('/');
|
|
53
|
+
}
|
|
54
|
+
export function isProductionSource(relativePath) {
|
|
55
|
+
const normalized = normalizePath(relativePath);
|
|
56
|
+
return (!normalized.split('/').includes('__tests__') &&
|
|
57
|
+
!/\.(?:test|spec|bench|perf)\.[cm]?[jt]sx?$/.test(normalized) &&
|
|
58
|
+
!normalized.includes('.gen.'));
|
|
59
|
+
}
|
|
60
|
+
export function isProductionCore(relativePath) {
|
|
61
|
+
const normalized = normalizePath(relativePath);
|
|
62
|
+
return (normalized === 'core' || normalized.startsWith('core/')) && isProductionSource(normalized);
|
|
63
|
+
}
|
|
64
|
+
export function resolveProjectImport(project, importer, specifier) {
|
|
65
|
+
if (!specifier.startsWith('.'))
|
|
66
|
+
return undefined;
|
|
67
|
+
const unresolved = resolve(dirname(importer.path), specifier);
|
|
68
|
+
for (const candidate of importCandidates(unresolved)) {
|
|
69
|
+
const file = project.filesByPath.get(candidate);
|
|
70
|
+
if (file)
|
|
71
|
+
return file;
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
function importCandidates(path) {
|
|
76
|
+
const extension = extname(path);
|
|
77
|
+
const candidates = [path];
|
|
78
|
+
if (extension === '.js' || extension === '.jsx' || extension === '.mjs' || extension === '.cjs') {
|
|
79
|
+
const stem = path.slice(0, -extension.length);
|
|
80
|
+
candidates.push(`${stem}.ts`, `${stem}.tsx`, `${stem}.mts`, `${stem}.cts`);
|
|
81
|
+
}
|
|
82
|
+
if (!extension) {
|
|
83
|
+
candidates.push(`${path}.ts`, `${path}.tsx`, `${path}.mts`, `${path}.cts`);
|
|
84
|
+
candidates.push(join(path, 'index.ts'), join(path, 'index.tsx'));
|
|
85
|
+
}
|
|
86
|
+
return candidates.map((candidate) => (isAbsolute(candidate) ? candidate : resolve(candidate)));
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/linter/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/linter/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAA;AAEjD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAE,gBAA4B,GAAG,MAAM,CAoBjG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function formatLintResult(result, format = 'stylish') {
|
|
2
|
+
if (format === 'json')
|
|
3
|
+
return `${JSON.stringify(result, null, 2)}\n`;
|
|
4
|
+
const lines = [];
|
|
5
|
+
for (const diagnostic of result.diagnostics) {
|
|
6
|
+
const location = diagnostic.location
|
|
7
|
+
? `${diagnostic.location.path}:${diagnostic.location.line}:${diagnostic.location.column}`
|
|
8
|
+
: result.root;
|
|
9
|
+
lines.push(`${location} ${diagnostic.severity} ${diagnostic.id} ${diagnostic.message}`);
|
|
10
|
+
if (diagnostic.help)
|
|
11
|
+
lines.push(` ${diagnostic.help}`);
|
|
12
|
+
}
|
|
13
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.severity === 'error').length;
|
|
14
|
+
const warnings = result.diagnostics.length - errors;
|
|
15
|
+
if (lines.length > 0)
|
|
16
|
+
lines.push('');
|
|
17
|
+
lines.push(errors === 0
|
|
18
|
+
? `\u2713 ${result.files} files linted in ${result.durationMs}ms${warnings ? ` (${warnings} warnings)` : ''}`
|
|
19
|
+
: `\u2717 ${errors} ${errors === 1 ? 'error' : 'errors'}, ${warnings} ${warnings === 1 ? 'warning' : 'warnings'} in ${result.durationMs}ms`);
|
|
20
|
+
return `${lines.join('\n')}\n`;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/linter/report.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,MAAM,GAAqB,SAAS;IACvF,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IACpE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ;YAClC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE;YACzF,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;QACzF,IAAI,UAAU,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAA;IAChG,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,MAAM,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpC,KAAK,CAAC,IAAI,CACR,MAAM,KAAK,CAAC;QACV,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,oBAAoB,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7G,CAAC,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,OAAO,MAAM,CAAC,UAAU,IAAI,CAC9I,CAAA;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type RuleOwner = 'analyzer' | 'oxlint' | 'sdk';
|
|
2
|
+
export type RuleInfo = {
|
|
3
|
+
slug: string;
|
|
4
|
+
owner: RuleOwner;
|
|
5
|
+
message: string;
|
|
6
|
+
help: string;
|
|
7
|
+
url: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const ruleCatalog: {
|
|
10
|
+
readonly 'thin-schema-composition-root': {
|
|
11
|
+
readonly slug: 'thin-schema-composition-root';
|
|
12
|
+
readonly owner: 'analyzer';
|
|
13
|
+
readonly message: 'The schema composition root defines a schema member inline.';
|
|
14
|
+
readonly help: 'Move this member definition to its bounded-context module and import it here.';
|
|
15
|
+
readonly url: string;
|
|
16
|
+
};
|
|
17
|
+
readonly 'one-remote-definition-per-file': {
|
|
18
|
+
readonly slug: 'one-remote-definition-per-file';
|
|
19
|
+
readonly owner: 'analyzer';
|
|
20
|
+
readonly message: 'This file defines more than one Astrale remote callable.';
|
|
21
|
+
readonly help: 'Keep one remoteMethod or defineRemoteFunction definition per implementation file.';
|
|
22
|
+
readonly url: string;
|
|
23
|
+
};
|
|
24
|
+
readonly 'core-is-pure': {
|
|
25
|
+
readonly slug: 'core-is-pure';
|
|
26
|
+
readonly owner: 'analyzer';
|
|
27
|
+
readonly message: 'Pure core code depends on an effectful or runtime-only module.';
|
|
28
|
+
readonly help: 'Move I/O orchestration to runtime or integrations and pass pure data into core.';
|
|
29
|
+
readonly url: string;
|
|
30
|
+
};
|
|
31
|
+
readonly 'core-has-no-async': {
|
|
32
|
+
readonly slug: 'core-has-no-async';
|
|
33
|
+
readonly owner: 'oxlint';
|
|
34
|
+
readonly message: 'Production core code contains asynchronous syntax.';
|
|
35
|
+
readonly help: 'Keep core deterministic and synchronous; perform asynchronous work in runtime or integrations.';
|
|
36
|
+
readonly url: string;
|
|
37
|
+
};
|
|
38
|
+
readonly 'no-nested-steps': {
|
|
39
|
+
readonly slug: 'no-nested-steps';
|
|
40
|
+
readonly owner: 'oxlint';
|
|
41
|
+
readonly message: 'A durable step directly contains another durable step.';
|
|
42
|
+
readonly help: 'Give each stage one step boundary and call helper-owned steps outside another step callback.';
|
|
43
|
+
readonly url: string;
|
|
44
|
+
};
|
|
45
|
+
readonly 'no-read-inside-mutate': {
|
|
46
|
+
readonly slug: 'no-read-inside-mutate';
|
|
47
|
+
readonly owner: 'oxlint';
|
|
48
|
+
readonly message: 'A graph mutation builder performs a read or is asynchronous.';
|
|
49
|
+
readonly help: 'Read before mutate, then keep the mutation callback synchronous and limited to patch construction.';
|
|
50
|
+
readonly url: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type ImplementedRuleSlug = keyof typeof ruleCatalog;
|
|
54
|
+
export declare function ruleId(slug: ImplementedRuleSlug): `astrale/${ImplementedRuleSlug}`;
|
|
55
|
+
export declare function ruleInfo(id: string): RuleInfo | undefined;
|
|
56
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAA;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAID,eAAO,MAAM,WAAW;;iBAEpB,IAAI,EAAE,8BAA8B;iBACpC,KAAK,EAAE,UAAU;iBACjB,OAAO,EAAE,6DAA6D;iBACtE,IAAI,EAAE,+EAA+E;iBACrF,GAAG;;;iBAGH,IAAI,EAAE,gCAAgC;iBACtC,KAAK,EAAE,UAAU;iBACjB,OAAO,EAAE,0DAA0D;iBACnE,IAAI,EAAE,mFAAmF;iBACzF,GAAG;;;iBAGH,IAAI,EAAE,cAAc;iBACpB,KAAK,EAAE,UAAU;iBACjB,OAAO,EAAE,gEAAgE;iBACzE,IAAI,EAAE,iFAAiF;iBACvF,GAAG;;;iBAGH,IAAI,EAAE,mBAAmB;iBACzB,KAAK,EAAE,QAAQ;iBACf,OAAO,EAAE,oDAAoD;iBAC7D,IAAI,EAAE,gGAAgG;iBACtG,GAAG;;;iBAGH,IAAI,EAAE,iBAAiB;iBACvB,KAAK,EAAE,QAAQ;iBACf,OAAO,EAAE,wDAAwD;iBACjE,IAAI,EAAE,8FAA8F;iBACpG,GAAG;;;iBAGH,IAAI,EAAE,uBAAuB;iBAC7B,KAAK,EAAE,QAAQ;iBACf,OAAO,EAAE,8DAA8D;iBACvE,IAAI,EAAE,oGAAoG;iBAC1G,GAAG;;CAEsC,CAAA;AAE7C,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,WAAW,CAAA;AAE1D,wBAAgB,MAAM,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,mBAAmB,EAAE,CAElF;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAGzD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const ruleDocsUrl = (slug) => `https://docs.astrale.ai/linter/rules/${slug}`;
|
|
2
|
+
export const ruleCatalog = {
|
|
3
|
+
'thin-schema-composition-root': {
|
|
4
|
+
slug: 'thin-schema-composition-root',
|
|
5
|
+
owner: 'analyzer',
|
|
6
|
+
message: 'The schema composition root defines a schema member inline.',
|
|
7
|
+
help: 'Move this member definition to its bounded-context module and import it here.',
|
|
8
|
+
url: ruleDocsUrl('thin-schema-composition-root'),
|
|
9
|
+
},
|
|
10
|
+
'one-remote-definition-per-file': {
|
|
11
|
+
slug: 'one-remote-definition-per-file',
|
|
12
|
+
owner: 'analyzer',
|
|
13
|
+
message: 'This file defines more than one Astrale remote callable.',
|
|
14
|
+
help: 'Keep one remoteMethod or defineRemoteFunction definition per implementation file.',
|
|
15
|
+
url: ruleDocsUrl('one-remote-definition-per-file'),
|
|
16
|
+
},
|
|
17
|
+
'core-is-pure': {
|
|
18
|
+
slug: 'core-is-pure',
|
|
19
|
+
owner: 'analyzer',
|
|
20
|
+
message: 'Pure core code depends on an effectful or runtime-only module.',
|
|
21
|
+
help: 'Move I/O orchestration to runtime or integrations and pass pure data into core.',
|
|
22
|
+
url: ruleDocsUrl('core-is-pure'),
|
|
23
|
+
},
|
|
24
|
+
'core-has-no-async': {
|
|
25
|
+
slug: 'core-has-no-async',
|
|
26
|
+
owner: 'oxlint',
|
|
27
|
+
message: 'Production core code contains asynchronous syntax.',
|
|
28
|
+
help: 'Keep core deterministic and synchronous; perform asynchronous work in runtime or integrations.',
|
|
29
|
+
url: ruleDocsUrl('core-has-no-async'),
|
|
30
|
+
},
|
|
31
|
+
'no-nested-steps': {
|
|
32
|
+
slug: 'no-nested-steps',
|
|
33
|
+
owner: 'oxlint',
|
|
34
|
+
message: 'A durable step directly contains another durable step.',
|
|
35
|
+
help: 'Give each stage one step boundary and call helper-owned steps outside another step callback.',
|
|
36
|
+
url: ruleDocsUrl('no-nested-steps'),
|
|
37
|
+
},
|
|
38
|
+
'no-read-inside-mutate': {
|
|
39
|
+
slug: 'no-read-inside-mutate',
|
|
40
|
+
owner: 'oxlint',
|
|
41
|
+
message: 'A graph mutation builder performs a read or is asynchronous.',
|
|
42
|
+
help: 'Read before mutate, then keep the mutation callback synchronous and limited to patch construction.',
|
|
43
|
+
url: ruleDocsUrl('no-read-inside-mutate'),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
export function ruleId(slug) {
|
|
47
|
+
return `astrale/${slug}`;
|
|
48
|
+
}
|
|
49
|
+
export function ruleInfo(id) {
|
|
50
|
+
const slug = id.startsWith('astrale/') ? id.slice('astrale/'.length) : id;
|
|
51
|
+
return ruleCatalog[slug];
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/linter/rules/catalog.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,wCAAwC,IAAI,EAAE,CAAA;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,8BAA8B,EAAE;QAC9B,IAAI,EAAE,8BAA8B;QACpC,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,6DAA6D;QACtE,IAAI,EAAE,+EAA+E;QACrF,GAAG,EAAE,WAAW,CAAC,8BAA8B,CAAC;KACjD;IACD,gCAAgC,EAAE;QAChC,IAAI,EAAE,gCAAgC;QACtC,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,0DAA0D;QACnE,IAAI,EAAE,mFAAmF;QACzF,GAAG,EAAE,WAAW,CAAC,gCAAgC,CAAC;KACnD;IACD,cAAc,EAAE;QACd,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,gEAAgE;QACzE,IAAI,EAAE,iFAAiF;QACvF,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC;KACjC;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,oDAAoD;QAC7D,IAAI,EAAE,gGAAgG;QACtG,GAAG,EAAE,WAAW,CAAC,mBAAmB,CAAC;KACtC;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,wDAAwD;QACjE,IAAI,EAAE,8FAA8F;QACpG,GAAG,EAAE,WAAW,CAAC,iBAAiB,CAAC;KACpC;IACD,uBAAuB,EAAE;QACvB,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,8DAA8D;QACvE,IAAI,EAAE,oGAAoG;QAC1G,GAAG,EAAE,WAAW,CAAC,uBAAuB,CAAC;KAC1C;CAC0C,CAAA;AAI7C,MAAM,UAAU,MAAM,CAAC,IAAyB;IAC9C,OAAO,WAAW,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,OAAO,WAAW,CAAC,IAA2B,CAAC,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-has-no-async.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/core-has-no-async.js"],"names":[],"mappings":"AAMA,oDAAoD;AACpD,eAAO,MAAM,cAAc,EADhB,OAAO,kBAAkB,EAAE,UAoCrC,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { isProductionCoreFile, nearestFunction, reportUnlessSuppressed } from './oxlint-ast.js';
|
|
3
|
+
const id = 'astrale/core-has-no-async';
|
|
4
|
+
/** @type {import('./oxlint-rule.js').OxlintRule} */
|
|
5
|
+
export const coreHasNoAsync = {
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'problem',
|
|
8
|
+
docs: {
|
|
9
|
+
description: 'Production core code contains asynchronous syntax.',
|
|
10
|
+
url: 'https://docs.astrale.ai/linter/rules/core-has-no-async',
|
|
11
|
+
},
|
|
12
|
+
messages: {
|
|
13
|
+
asyncFunction: 'Production core functions must be synchronous.',
|
|
14
|
+
topLevelAwait: 'Production core modules must not use top-level await.',
|
|
15
|
+
},
|
|
16
|
+
schema: [],
|
|
17
|
+
},
|
|
18
|
+
create(context) {
|
|
19
|
+
if (!isProductionCoreFile(context))
|
|
20
|
+
return {};
|
|
21
|
+
/** @param {import('./oxlint-rule.js').AstNode} node */
|
|
22
|
+
const reportFunction = (node) => {
|
|
23
|
+
if (node.async)
|
|
24
|
+
reportUnlessSuppressed(context, node, id, 'asyncFunction');
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
FunctionDeclaration: reportFunction,
|
|
28
|
+
FunctionExpression: reportFunction,
|
|
29
|
+
ArrowFunctionExpression: reportFunction,
|
|
30
|
+
AwaitExpression(node) {
|
|
31
|
+
if (!nearestFunction(node.parent)) {
|
|
32
|
+
reportUnlessSuppressed(context, node, id, 'topLevelAwait');
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
ForOfStatement(node) {
|
|
36
|
+
if (node.await && !nearestFunction(node.parent)) {
|
|
37
|
+
reportUnlessSuppressed(context, node, id, 'topLevelAwait');
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=core-has-no-async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-has-no-async.js","sourceRoot":"","sources":["../../../src/linter/rules/core-has-no-async.js"],"names":[],"mappings":"AAAA,YAAY;AAEZ,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAE/F,MAAM,EAAE,GAAG,2BAA2B,CAAA;AAEtC,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,oDAAoD;YACjE,GAAG,EAAE,wDAAwD;SAC9D;QACD,QAAQ,EAAE;YACR,aAAa,EAAE,gDAAgD;YAC/D,aAAa,EAAE,uDAAuD;SACvE;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAA;QAC7C,uDAAuD;QACvD,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,IAAI,CAAC,KAAK;gBAAE,sBAAsB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,CAAC,CAAA;QAC5E,CAAC,CAAA;QACD,OAAO;YACL,mBAAmB,EAAE,cAAc;YACnC,kBAAkB,EAAE,cAAc;YAClC,uBAAuB,EAAE,cAAc;YACvC,eAAe,CAAC,IAAI;gBAClB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClC,sBAAsB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;YACD,cAAc,CAAC,IAAI;gBACjB,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChD,sBAAsB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-is-pure.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/core-is-pure.ts"],"names":[],"mappings":"AASA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA2BzE,eAAO,MAAM,UAAU,EAAE,YA0CxB,CAAA"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { isProductionCore, isProductionSource, resolveProjectImport, } from '../project.js';
|
|
2
|
+
import { analyzerDiagnostic } from './project-rule.js';
|
|
3
|
+
const forbiddenPackages = new Set([
|
|
4
|
+
'@astrale-os/adapter-astrale',
|
|
5
|
+
'@astrale-os/adapter-cloudflare',
|
|
6
|
+
'@astrale-os/kernel-api',
|
|
7
|
+
'@astrale-os/kernel-client',
|
|
8
|
+
'@astrale-os/kernel-server',
|
|
9
|
+
'@astrale-os/kernel-test',
|
|
10
|
+
'@astrale-os/sdk',
|
|
11
|
+
'node:child_process',
|
|
12
|
+
'node:cluster',
|
|
13
|
+
'node:dgram',
|
|
14
|
+
'node:dns',
|
|
15
|
+
'node:fs',
|
|
16
|
+
'node:fs/promises',
|
|
17
|
+
'node:http',
|
|
18
|
+
'node:http2',
|
|
19
|
+
'node:https',
|
|
20
|
+
'node:net',
|
|
21
|
+
'node:tls',
|
|
22
|
+
'node:worker_threads',
|
|
23
|
+
]);
|
|
24
|
+
const forbiddenRoots = new Set(['client', 'functions', 'integrations', 'runtime', 'simulation']);
|
|
25
|
+
const forbiddenRootFiles = new Set(['astrale.config.ts', 'deps.ts', 'domain.ts', 'env.ts']);
|
|
26
|
+
export const coreIsPure = {
|
|
27
|
+
slug: 'core-is-pure',
|
|
28
|
+
analyze(project) {
|
|
29
|
+
const diagnostics = [];
|
|
30
|
+
const visited = new Set();
|
|
31
|
+
const pending = project.files.filter((file) => isProductionCore(file.relativePath));
|
|
32
|
+
while (pending.length > 0) {
|
|
33
|
+
const file = pending.pop();
|
|
34
|
+
if (visited.has(file.path))
|
|
35
|
+
continue;
|
|
36
|
+
visited.add(file.path);
|
|
37
|
+
for (const sourceImport of file.imports) {
|
|
38
|
+
const forbiddenPackage = forbiddenPackageName(sourceImport.specifier);
|
|
39
|
+
if (forbiddenPackage) {
|
|
40
|
+
pushDiagnostic(diagnostics, this.slug, file, sourceImport, `Import ${forbiddenPackage} crosses the pure-core boundary.`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const dependency = resolveProjectImport(project, file, sourceImport.specifier);
|
|
44
|
+
if (!dependency || !isProductionSource(dependency.relativePath))
|
|
45
|
+
continue;
|
|
46
|
+
if (isForbiddenProjectLayer(dependency.relativePath)) {
|
|
47
|
+
pushDiagnostic(diagnostics, this.slug, file, sourceImport, `Import ${sourceImport.specifier} reaches ${dependency.relativePath}.`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
pending.push(dependency);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return diagnostics;
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
function forbiddenPackageName(specifier) {
|
|
57
|
+
if (forbiddenPackages.has(specifier))
|
|
58
|
+
return specifier;
|
|
59
|
+
for (const name of forbiddenPackages) {
|
|
60
|
+
if (specifier.startsWith(`${name}/`))
|
|
61
|
+
return name;
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
function isForbiddenProjectLayer(relativePath) {
|
|
66
|
+
const [root] = relativePath.split('/');
|
|
67
|
+
return forbiddenRoots.has(root ?? '') || forbiddenRootFiles.has(relativePath);
|
|
68
|
+
}
|
|
69
|
+
function pushDiagnostic(diagnostics, slug, file, sourceImport, detail) {
|
|
70
|
+
const diagnostic = analyzerDiagnostic(slug, file, sourceImport.token, detail);
|
|
71
|
+
if (diagnostic)
|
|
72
|
+
diagnostics.push(diagnostic);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=core-is-pure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-is-pure.js","sourceRoot":"","sources":["../../../src/linter/rules/core-is-pure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-nested-steps.d.ts","sourceRoot":"","sources":["../../../src/linter/rules/no-nested-steps.js"],"names":[],"mappings":"AAYA,oDAAoD;AACpD,eAAO,MAAM,aAAa,EADf,OAAO,kBAAkB,EAAE,UAwBrC,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { callbackCall, isProductionFile, isStepRun, nearestFunction, reportUnlessSuppressed, } from './oxlint-ast.js';
|
|
3
|
+
const id = 'astrale/no-nested-steps';
|
|
4
|
+
/** @type {import('./oxlint-rule.js').OxlintRule} */
|
|
5
|
+
export const noNestedSteps = {
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'problem',
|
|
8
|
+
docs: {
|
|
9
|
+
description: 'A durable step directly contains another durable step.',
|
|
10
|
+
url: 'https://docs.astrale.ai/linter/rules/no-nested-steps',
|
|
11
|
+
},
|
|
12
|
+
messages: {
|
|
13
|
+
nested: 'A step.run callback must not directly invoke another step.run.',
|
|
14
|
+
},
|
|
15
|
+
schema: [],
|
|
16
|
+
},
|
|
17
|
+
create(context) {
|
|
18
|
+
if (!isProductionFile(context))
|
|
19
|
+
return {};
|
|
20
|
+
return {
|
|
21
|
+
CallExpression(node) {
|
|
22
|
+
if (!isStepRun(node))
|
|
23
|
+
return;
|
|
24
|
+
const containingFunction = nearestFunction(node.parent);
|
|
25
|
+
if (!containingFunction || !isStepRun(callbackCall(containingFunction)))
|
|
26
|
+
return;
|
|
27
|
+
reportUnlessSuppressed(context, node, id, 'nested');
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=no-nested-steps.js.map
|