archprint 0.13.1 → 0.15.0
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 +26 -0
- package/README.md +21 -12
- package/dist/cli/adopted-rules.d.ts +30 -2
- package/dist/cli/adopted-rules.d.ts.map +1 -1
- package/dist/cli/adopted-rules.js +158 -2
- package/dist/cli/adopted-rules.js.map +1 -1
- package/dist/cli/allow.d.ts.map +1 -1
- package/dist/cli/allow.js +21 -4
- package/dist/cli/allow.js.map +1 -1
- package/dist/cli/allowed-evidence.d.ts.map +1 -1
- package/dist/cli/allowed-evidence.js +183 -1
- package/dist/cli/allowed-evidence.js.map +1 -1
- package/dist/cli/check-evaluate.d.ts.map +1 -1
- package/dist/cli/check-evaluate.js +124 -0
- package/dist/cli/check-evaluate.js.map +1 -1
- package/dist/cli/generate.d.ts +4 -4
- package/dist/cli/generate.d.ts.map +1 -1
- package/dist/cli/generate.js +115 -42
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/layout.d.ts +5 -2
- package/dist/cli/layout.d.ts.map +1 -1
- package/dist/cli/layout.js +43 -10
- package/dist/cli/layout.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +1 -2
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +10 -6
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/recommend.d.ts +3 -0
- package/dist/cli/recommend.d.ts.map +1 -1
- package/dist/cli/recommend.js +28 -8
- package/dist/cli/recommend.js.map +1 -1
- package/dist/cli/report.js +1 -1
- package/dist/cli/report.js.map +1 -1
- package/dist/detector/cycle-detector.d.ts +5 -0
- package/dist/detector/cycle-detector.d.ts.map +1 -1
- package/dist/detector/cycle-detector.js +20 -0
- package/dist/detector/cycle-detector.js.map +1 -1
- package/dist/detector/dependency-internals-detector.d.ts.map +1 -1
- package/dist/detector/dependency-internals-detector.js +6 -20
- package/dist/detector/dependency-internals-detector.js.map +1 -1
- package/dist/detector/entry-purity-detector.d.ts +7 -0
- package/dist/detector/entry-purity-detector.d.ts.map +1 -1
- package/dist/detector/entry-purity-detector.js +21 -10
- package/dist/detector/entry-purity-detector.js.map +1 -1
- package/dist/detector/phantom-dependency-detector.d.ts +7 -0
- package/dist/detector/phantom-dependency-detector.d.ts.map +1 -1
- package/dist/detector/phantom-dependency-detector.js +18 -39
- package/dist/detector/phantom-dependency-detector.js.map +1 -1
- package/dist/detector/server-client-detector.d.ts +5 -0
- package/dist/detector/server-client-detector.d.ts.map +1 -1
- package/dist/detector/server-client-detector.js +8 -3
- package/dist/detector/server-client-detector.js.map +1 -1
- package/dist/generator/app-isolation-emitters.d.ts +1 -0
- package/dist/generator/app-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/app-isolation-emitters.js +2 -1
- package/dist/generator/app-isolation-emitters.js.map +1 -1
- package/dist/generator/depcruise-exempt.d.ts +4 -0
- package/dist/generator/depcruise-exempt.d.ts.map +1 -1
- package/dist/generator/depcruise-exempt.js +7 -0
- package/dist/generator/depcruise-exempt.js.map +1 -1
- package/dist/generator/dependency-internals-emitters.d.ts +2 -1
- package/dist/generator/dependency-internals-emitters.d.ts.map +1 -1
- package/dist/generator/dependency-internals-emitters.js +7 -3
- package/dist/generator/dependency-internals-emitters.js.map +1 -1
- package/dist/generator/entry-purity-emitters.d.ts +7 -3
- package/dist/generator/entry-purity-emitters.d.ts.map +1 -1
- package/dist/generator/entry-purity-emitters.js +19 -5
- package/dist/generator/entry-purity-emitters.js.map +1 -1
- package/dist/generator/env-access-emitters.d.ts +1 -0
- package/dist/generator/env-access-emitters.d.ts.map +1 -1
- package/dist/generator/env-access-emitters.js +1 -0
- package/dist/generator/env-access-emitters.js.map +1 -1
- package/dist/generator/eslint-app-emitter.d.ts +59 -0
- package/dist/generator/eslint-app-emitter.d.ts.map +1 -0
- package/dist/generator/eslint-app-emitter.js +275 -0
- package/dist/generator/eslint-app-emitter.js.map +1 -0
- package/dist/generator/eslint-preset-emitter.d.ts +2 -2
- package/dist/generator/eslint-preset-emitter.d.ts.map +1 -1
- package/dist/generator/eslint-preset-emitter.js +6 -6
- package/dist/generator/eslint-preset-emitter.js.map +1 -1
- package/dist/generator/feature-slice-emitters.d.ts +1 -0
- package/dist/generator/feature-slice-emitters.d.ts.map +1 -1
- package/dist/generator/feature-slice-emitters.js +2 -1
- package/dist/generator/feature-slice-emitters.js.map +1 -1
- package/dist/generator/layer-emitters.d.ts.map +1 -1
- package/dist/generator/layer-emitters.js +2 -6
- package/dist/generator/layer-emitters.js.map +1 -1
- package/dist/generator/phantom-dependency-emitters.d.ts +2 -1
- package/dist/generator/phantom-dependency-emitters.d.ts.map +1 -1
- package/dist/generator/phantom-dependency-emitters.js +7 -3
- package/dist/generator/phantom-dependency-emitters.js.map +1 -1
- package/dist/generator/role-layering-emitters.d.ts +2 -0
- package/dist/generator/role-layering-emitters.d.ts.map +1 -1
- package/dist/generator/role-layering-emitters.js +2 -1
- package/dist/generator/role-layering-emitters.js.map +1 -1
- package/dist/generator/server-client-emitters.d.ts +10 -3
- package/dist/generator/server-client-emitters.d.ts.map +1 -1
- package/dist/generator/server-client-emitters.js +23 -4
- package/dist/generator/server-client-emitters.js.map +1 -1
- package/dist/generator/stories-isolation-emitters.d.ts +1 -0
- package/dist/generator/stories-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/stories-isolation-emitters.js +2 -1
- package/dist/generator/stories-isolation-emitters.js.map +1 -1
- package/dist/generator/ui-data-isolation-emitters.d.ts +1 -0
- package/dist/generator/ui-data-isolation-emitters.d.ts.map +1 -1
- package/dist/generator/ui-data-isolation-emitters.js +2 -1
- package/dist/generator/ui-data-isolation-emitters.js.map +1 -1
- package/dist/generator/workspace-package-emitters.d.ts +1 -0
- package/dist/generator/workspace-package-emitters.d.ts.map +1 -1
- package/dist/generator/workspace-package-emitters.js +1 -0
- package/dist/generator/workspace-package-emitters.js.map +1 -1
- package/dist/scanner/directives.d.ts +6 -0
- package/dist/scanner/directives.d.ts.map +1 -0
- package/dist/scanner/directives.js +35 -0
- package/dist/scanner/directives.js.map +1 -0
- package/dist/scanner/package-name.d.ts +10 -0
- package/dist/scanner/package-name.d.ts.map +1 -0
- package/dist/scanner/package-name.js +37 -0
- package/dist/scanner/package-name.js.map +1 -0
- package/dist/scanner/resolve-import.d.ts +5 -0
- package/dist/scanner/resolve-import.d.ts.map +1 -1
- package/dist/scanner/resolve-import.js +22 -19
- package/dist/scanner/resolve-import.js.map +1 -1
- package/dist/scanner/role-classifier.d.ts +11 -2
- package/dist/scanner/role-classifier.d.ts.map +1 -1
- package/dist/scanner/role-classifier.js +13 -39
- package/dist/scanner/role-classifier.js.map +1 -1
- package/package.json +2 -2
- package/dist/generator/eslint-layer-emitter.d.ts +0 -29
- package/dist/generator/eslint-layer-emitter.d.ts.map +0 -1
- package/dist/generator/eslint-layer-emitter.js +0 -121
- package/dist/generator/eslint-layer-emitter.js.map +0 -1
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
import { layerRootOf, resolveImportPath } from '../detector/layer-paths.js';
|
|
3
|
-
import { ROLE_PATTERNS } from '../scanner/role-classifier.js';
|
|
4
|
-
import { isSkippedFolder, isSourceFileName } from '../scanner/source-paths.js';
|
|
5
|
-
import { LINTED_FILES } from './eslint-plugin-emitter.js';
|
|
6
|
-
import { layerRuleName } from './layer-emitters.js';
|
|
7
|
-
/** The given layer boundaries as ESLint rules, each exempting its known and allowed exceptions. */
|
|
8
|
-
export function buildEslintLayers(boundaries, app, allowedFor) {
|
|
9
|
-
const rules = boundaries.map((boundary) => {
|
|
10
|
-
const name = layerRuleName(boundary);
|
|
11
|
-
const exceptions = [
|
|
12
|
-
...boundary.violations.map((violation) => violation.file),
|
|
13
|
-
...allowedFor(name),
|
|
14
|
-
];
|
|
15
|
-
return {
|
|
16
|
-
name,
|
|
17
|
-
from: boundary.from,
|
|
18
|
-
to: boundary.to,
|
|
19
|
-
message: boundary.description,
|
|
20
|
-
ignore: [...new Set(exceptions)].sort(),
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
return rules.length === 0 ? null : { ...app, rules };
|
|
24
|
-
}
|
|
25
|
-
const LAYER_RULE_FUNCTIONS = `function isValueImport(node) {
|
|
26
|
-
return (
|
|
27
|
-
node.importKind !== 'type' &&
|
|
28
|
-
(node.specifiers.length === 0 ||
|
|
29
|
-
node.specifiers.some((specifier) => specifier.type !== 'ImportSpecifier' || specifier.importKind !== 'type'))
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function realPathOf(filename) {
|
|
34
|
-
try {
|
|
35
|
-
return realpathSync(filename);
|
|
36
|
-
} catch {
|
|
37
|
-
try {
|
|
38
|
-
return join(realpathSync(dirname(filename)), basename(filename));
|
|
39
|
-
} catch {
|
|
40
|
-
return filename;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function isScanned(file) {
|
|
46
|
-
const segments = file.split('/');
|
|
47
|
-
return (
|
|
48
|
-
isSourceFileName(segments.pop()) &&
|
|
49
|
-
!segments.some(isSkippedFolder) &&
|
|
50
|
-
!LAYERS.ignored.some((path) => file === path || file.startsWith(path + '/'))
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function appRelativePath(filename) {
|
|
55
|
-
const relativePath = relative(LAYER_APP_DIR, realPathOf(filename));
|
|
56
|
-
return relativePath.startsWith('..') || isAbsolute(relativePath)
|
|
57
|
-
? null
|
|
58
|
-
: relativePath.split(sep).join('/');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function makeLayerRule(spec) {
|
|
62
|
-
return {
|
|
63
|
-
meta: { type: 'problem', schema: [], messages: { forbidden: spec.message } },
|
|
64
|
-
create(context) {
|
|
65
|
-
const file = appRelativePath(context.physicalFilename);
|
|
66
|
-
if (file === null || !isScanned(file)) return {};
|
|
67
|
-
if (LAYER_TESTS.some((test) => test.test(file)) || spec.ignore.includes(file)) return {};
|
|
68
|
-
if (layerRootOf(file)?.layer !== spec.from) return {};
|
|
69
|
-
const check = (node, specifier) => {
|
|
70
|
-
const target = resolveImportPath(file, specifier, LAYERS.aliases);
|
|
71
|
-
if (target !== null && layerRootOf(target)?.layer === spec.to) {
|
|
72
|
-
context.report({ node, messageId: 'forbidden' });
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
return {
|
|
76
|
-
ImportDeclaration(node) {
|
|
77
|
-
if (node.parent.type === 'Program' && isValueImport(node)) check(node, node.source.value);
|
|
78
|
-
},
|
|
79
|
-
ImportExpression(node) {
|
|
80
|
-
if (node.source.type === 'Literal' && typeof node.source.value === 'string') {
|
|
81
|
-
check(node, node.source.value);
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
}`;
|
|
88
|
-
/** The pieces of the generated ESLint file that enforce layer boundaries, located relative to that file. */
|
|
89
|
-
export function renderEslintLayers(layers, outDir) {
|
|
90
|
-
const data = {
|
|
91
|
-
app: path.relative(outDir, layers.appDir).split(path.sep).join('/') || '.',
|
|
92
|
-
aliases: layers.aliases,
|
|
93
|
-
ignored: layers.ignored,
|
|
94
|
-
tests: (ROLE_PATTERNS.get('TEST') ?? []).map((pattern) => pattern.source),
|
|
95
|
-
rules: layers.rules,
|
|
96
|
-
};
|
|
97
|
-
return {
|
|
98
|
-
imports: [
|
|
99
|
-
"import { realpathSync } from 'node:fs';",
|
|
100
|
-
"import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';",
|
|
101
|
-
"import { fileURLToPath } from 'node:url';",
|
|
102
|
-
].join('\n'),
|
|
103
|
-
source: [
|
|
104
|
-
`const LAYERS = ${JSON.stringify(data, null, 2)};`,
|
|
105
|
-
'const LAYER_APP_DIR = realPathOf(resolve(dirname(fileURLToPath(import.meta.url)), LAYERS.app));',
|
|
106
|
-
'const LAYER_TESTS = LAYERS.tests.map((source) => new RegExp(source));',
|
|
107
|
-
layerRootOf.toString(),
|
|
108
|
-
resolveImportPath.toString(),
|
|
109
|
-
isSkippedFolder.toString(),
|
|
110
|
-
isSourceFileName.toString(),
|
|
111
|
-
LAYER_RULE_FUNCTIONS,
|
|
112
|
-
].join('\n\n'),
|
|
113
|
-
rules: 'LAYERS.rules.map((spec) => [spec.name, makeLayerRule(spec)])',
|
|
114
|
-
config: `{
|
|
115
|
-
files: ${LINTED_FILES},
|
|
116
|
-
plugins: { archprint: plugin },
|
|
117
|
-
rules: Object.fromEntries(LAYERS.rules.map((spec) => ['archprint/' + spec.name, 'error'])),
|
|
118
|
-
}`,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=eslint-layer-emitter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-layer-emitter.js","sourceRoot":"","sources":["../../src/generator/eslint-layer-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAmB,WAAW,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAqBpD,mGAAmG;AACnG,MAAM,UAAU,iBAAiB,CAC/B,UAAoC,EACpC,GAAa,EACb,UAAiD;IAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG;YACjB,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;YACzD,GAAG,UAAU,CAAC,IAAI,CAAC;SACpB,CAAC;QACF,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,OAAO,EAAE,QAAQ,CAAC,WAAW;YAC7B,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;SACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8D3B,CAAC;AASH,4GAA4G;AAC5G,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,MAAc;IACrE,MAAM,IAAI,GAAG;QACX,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG;QAC1E,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACzE,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IACF,OAAO;QACL,OAAO,EAAE;YACP,yCAAyC;YACzC,0FAA0F;YAC1F,2CAA2C;SAC5C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,MAAM,EAAE;YACN,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG;YAClD,iGAAiG;YACjG,uEAAuE;YACvE,WAAW,CAAC,QAAQ,EAAE;YACtB,iBAAiB,CAAC,QAAQ,EAAE;YAC5B,eAAe,CAAC,QAAQ,EAAE;YAC1B,gBAAgB,CAAC,QAAQ,EAAE;YAC3B,oBAAoB;SACrB,CAAC,IAAI,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,8DAA8D;QACrE,MAAM,EAAE;WACD,YAAY;;;EAGrB;KACC,CAAC;AACJ,CAAC"}
|