@nielspeter/eess-ts 0.6.0 → 0.8.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/README.md +1 -1
- package/dist/builders/class-rule-builder.d.ts +0 -7
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +27 -1
- package/dist/builders/class-rule-builder.js.map +1 -1
- package/dist/builders/cross-layer-builder.d.ts.map +1 -1
- package/dist/builders/cross-layer-builder.js +6 -8
- package/dist/builders/cross-layer-builder.js.map +1 -1
- package/dist/builders/slice-rule-builder.d.ts.map +1 -1
- package/dist/builders/slice-rule-builder.js +7 -1
- package/dist/builders/slice-rule-builder.js.map +1 -1
- package/dist/conditions/body-analysis-module.d.ts.map +1 -1
- package/dist/conditions/body-analysis-module.js +37 -4
- package/dist/conditions/body-analysis-module.js.map +1 -1
- package/dist/conditions/call.d.ts +4 -3
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +40 -17
- package/dist/conditions/call.js.map +1 -1
- package/dist/conditions/function.d.ts.map +1 -1
- package/dist/conditions/function.js +22 -8
- package/dist/conditions/function.js.map +1 -1
- package/dist/conditions/reverse-dependency.d.ts.map +1 -1
- package/dist/conditions/reverse-dependency.js +16 -14
- package/dist/conditions/reverse-dependency.js.map +1 -1
- package/dist/conditions/structural.d.ts.map +1 -1
- package/dist/conditions/structural.js +28 -11
- package/dist/conditions/structural.js.map +1 -1
- package/dist/core/disk-set.d.ts.map +1 -1
- package/dist/core/disk-set.js +37 -2
- package/dist/core/disk-set.js.map +1 -1
- package/dist/core/object-literal-functions.d.ts +4 -1
- package/dist/core/object-literal-functions.d.ts.map +1 -1
- package/dist/core/object-literal-functions.js +27 -5
- package/dist/core/object-literal-functions.js.map +1 -1
- package/dist/core/project-relative.d.ts +108 -0
- package/dist/core/project-relative.d.ts.map +1 -1
- package/dist/core/project-relative.js +179 -2
- package/dist/core/project-relative.js.map +1 -1
- package/dist/core/through-wrappers.d.ts +24 -0
- package/dist/core/through-wrappers.d.ts.map +1 -0
- package/dist/core/through-wrappers.js +36 -0
- package/dist/core/through-wrappers.js.map +1 -0
- package/dist/core/vacuity-diagnosis.d.ts.map +1 -1
- package/dist/core/vacuity-diagnosis.js +11 -3
- package/dist/core/vacuity-diagnosis.js.map +1 -1
- package/dist/helpers/body-traversal.d.ts +14 -14
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +111 -35
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/callback-extractor.d.ts +6 -1
- package/dist/helpers/callback-extractor.d.ts.map +1 -1
- package/dist/helpers/callback-extractor.js +45 -10
- package/dist/helpers/callback-extractor.js.map +1 -1
- package/dist/helpers/global-binding.d.ts +11 -0
- package/dist/helpers/global-binding.d.ts.map +1 -0
- package/dist/helpers/global-binding.js +232 -0
- package/dist/helpers/global-binding.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/models/arch-function.d.ts +2 -2
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +138 -41
- package/dist/models/arch-function.js.map +1 -1
- package/dist/models/slice.d.ts.map +1 -1
- package/dist/models/slice.js +20 -16
- package/dist/models/slice.js.map +1 -1
- package/dist/predicates/identity.d.ts +2 -1
- package/dist/predicates/identity.d.ts.map +1 -1
- package/dist/predicates/identity.js +37 -38
- package/dist/predicates/identity.js.map +1 -1
- package/dist/presets/agent-guardrails.d.ts.map +1 -1
- package/dist/presets/agent-guardrails.js +65 -14
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/presets/boundaries.js +58 -16
- package/dist/presets/boundaries.js.map +1 -1
- package/dist/presets/recommended.d.ts +29 -6
- package/dist/presets/recommended.d.ts.map +1 -1
- package/dist/presets/recommended.js +30 -11
- package/dist/presets/recommended.js.map +1 -1
- package/dist/rules/errors.d.ts +17 -0
- package/dist/rules/errors.d.ts.map +1 -1
- package/dist/rules/errors.js +48 -8
- package/dist/rules/errors.js.map +1 -1
- package/dist/rules/security.d.ts +6 -0
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +59 -5
- package/dist/rules/security.js.map +1 -1
- package/dist/smells/duplicate-bodies.d.ts +1 -1
- package/dist/smells/duplicate-bodies.d.ts.map +1 -1
- package/dist/smells/duplicate-bodies.js +12 -11
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/sibling-files.d.ts.map +1 -1
- package/dist/smells/sibling-files.js +16 -7
- package/dist/smells/sibling-files.js.map +1 -1
- package/dist/smells/smell-builder.d.ts.map +1 -1
- package/dist/smells/smell-builder.js +15 -1
- package/dist/smells/smell-builder.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/conditions/function.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/conditions/function.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-dependency.d.ts","sourceRoot":"","sources":["../../src/conditions/reverse-dependency.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reverse-dependency.d.ts","sourceRoot":"","sources":["../../src/conditions/reverse-dependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAiD,MAAM,UAAU,CAAA;AACzF,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAqFnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAiF3E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,CA0BlD;AAqFD,wBAAgB,mBAAmB,IAAI,SAAS,CAAC,UAAU,CAAC,CAW3D"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import picomatch from 'picomatch';
|
|
2
1
|
import { Node } from 'ts-morph';
|
|
3
2
|
import { moduleEdges } from '../core/module-edges.js';
|
|
4
3
|
import { recordEdgeCoverage } from '@nielspeter/eess/internal';
|
|
5
4
|
import { globAnyOf } from '@nielspeter/eess';
|
|
6
|
-
import { relativeToRoot } from '../core/project-relative.js';
|
|
5
|
+
import { anyMatchesPath, pathGlobMatchers, relativeToRoot } from '../core/project-relative.js';
|
|
7
6
|
const graphCache = new WeakMap();
|
|
8
7
|
/**
|
|
9
8
|
* Build or retrieve the reverse import graph for a project.
|
|
@@ -96,7 +95,7 @@ function getReverseImportGraph(sourceFiles) {
|
|
|
96
95
|
* would be wrong here.
|
|
97
96
|
*/
|
|
98
97
|
export function onlyBeImportedVia(...globs) {
|
|
99
|
-
const matchers = globs
|
|
98
|
+
const matchers = pathGlobMatchers(globs);
|
|
100
99
|
const quotedGlobs = globs.map((g) => `"${g}"`).join(', ');
|
|
101
100
|
return {
|
|
102
101
|
// `file-path`, NOT `import-target` — and this is the row to get right. The glob
|
|
@@ -123,16 +122,14 @@ export function onlyBeImportedVia(...globs) {
|
|
|
123
122
|
for (const importer of importers) {
|
|
124
123
|
tested++;
|
|
125
124
|
const importerPath = importer.getFilePath();
|
|
126
|
-
// Also the importer's path named from the project root — bug 0036
|
|
127
|
-
// This glob is matched against
|
|
128
|
-
// project-relative one could never match and
|
|
129
|
-
// reported: measured,
|
|
130
|
-
//
|
|
131
|
-
// shape as bug 0037
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
(fromRoot !== undefined && matchers.some((m) => m(fromRoot)));
|
|
135
|
-
if (!matched) {
|
|
125
|
+
// Also the importer's path named from the project root — bug 0036,
|
|
126
|
+
// through the shared helper since 0339. This glob is matched against
|
|
127
|
+
// an ABSOLUTE path, so a project-relative one could never match and
|
|
128
|
+
// every importer was reported: measured,
|
|
129
|
+
// `onlyBeImportedVia('src/**')` produced 5 violations where
|
|
130
|
+
// `'**/src/**'` produced none. A false red, the same shape as bug 0037
|
|
131
|
+
// one layer over.
|
|
132
|
+
if (!anyMatchesPath(matchers, importer, importerPath)) {
|
|
136
133
|
violations.push({
|
|
137
134
|
rule: context.rule,
|
|
138
135
|
element: sf.getBaseName(),
|
|
@@ -161,7 +158,12 @@ export function onlyBeImportedVia(...globs) {
|
|
|
161
158
|
// exact-string message exclusion, which surfaces as an unused-pattern warning
|
|
162
159
|
// rather than failing open — the acceptable direction, and stated in the
|
|
163
160
|
// upgrading row.
|
|
164
|
-
|
|
161
|
+
// The root-relative form when there is one, computed here rather
|
|
162
|
+
// than taken from the matcher: `hashViolation` hashes this message,
|
|
163
|
+
// so the preference is held exactly as it was, and a shorter path
|
|
164
|
+
// here is readability while a changed one silently invalidates
|
|
165
|
+
// every baselined finding of this rule.
|
|
166
|
+
message: `${sf.getBaseName()} is imported by ${relativeToRoot(importer, importerPath) ?? importerPath} which does not match [${globs.join(', ')}]`,
|
|
165
167
|
because: context.because,
|
|
166
168
|
});
|
|
167
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reverse-dependency.js","sourceRoot":"","sources":["../../src/conditions/reverse-dependency.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"reverse-dependency.js","sourceRoot":"","sources":["../../src/conditions/reverse-dependency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../../src/conditions/structural.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../../src/conditions/structural.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAQnE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAyBvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAqBzE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAM5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAyBzD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAavD"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Node } from 'ts-morph';
|
|
2
|
-
import picomatch from 'picomatch';
|
|
3
2
|
import { createViolation, getElementFile, getElementName } from '../core/violation.js';
|
|
4
3
|
import { elementCondition } from './helpers.js';
|
|
5
4
|
import { globNode } from '@nielspeter/eess';
|
|
6
5
|
import { marksAssertsCardinality } from '@nielspeter/eess/internal';
|
|
6
|
+
import { isProjectRelative, matchesPath, pathGlobMatcher } from '../core/project-relative.js';
|
|
7
7
|
/**
|
|
8
8
|
* Elements must reside in a file matching the glob pattern.
|
|
9
9
|
*
|
|
@@ -14,14 +14,25 @@ import { marksAssertsCardinality } from '@nielspeter/eess/internal';
|
|
|
14
14
|
* .should(resideInFile('** /repositories/*.ts'))
|
|
15
15
|
*/
|
|
16
16
|
export function resideInFile(glob) {
|
|
17
|
-
const
|
|
18
|
-
return elementCondition(`reside in file matching '${glob}'`, (element) =>
|
|
17
|
+
const matcher = pathGlobMatcher(glob);
|
|
18
|
+
return elementCondition(`reside in file matching '${glob}'`, (element) => matchesPath(matcher, element.getSourceFile(), getElementFile(element)), (element) => `${getElementName(element)} resides in '${getElementFile(element)}' which does not match '${glob}'`,
|
|
19
19
|
// The generic element twin of `function.ts`'s condition and of the
|
|
20
|
-
// `identity.ts
|
|
21
|
-
// 0073's table listed only the `function.ts` pair; these two
|
|
22
|
-
// `index.ts:86` and used by the class, module and type
|
|
23
|
-
// the more reachable half of the hole.
|
|
24
|
-
|
|
20
|
+
// `identity.ts` predicate — same path, so the same kind and the same
|
|
21
|
+
// `base`. Plan 0073's table listed only the `function.ts` pair; these two
|
|
22
|
+
// are exported from `index.ts:86` and used by the class, module and type
|
|
23
|
+
// builders, so they were the more reachable half of the hole.
|
|
24
|
+
//
|
|
25
|
+
// The base declared, and the path named from the root actually read, since
|
|
26
|
+
// bug 0339 — when the census in `tests/matrix/path-glob-surfaces.ts` was
|
|
27
|
+
// measured against behaviour for the first time. It had this file classified
|
|
28
|
+
// `'normalized'` while the matcher read the absolute path alone, so a
|
|
29
|
+
// project-relative glob was reported dead here AND every subject was
|
|
30
|
+
// reported as a violation from a project path holding a dot-segment.
|
|
31
|
+
globNode({
|
|
32
|
+
glob,
|
|
33
|
+
kind: 'file-path',
|
|
34
|
+
base: isProjectRelative(glob) ? 'normalized' : 'absolute',
|
|
35
|
+
}));
|
|
25
36
|
}
|
|
26
37
|
/**
|
|
27
38
|
* Elements must reside in a folder matching the glob pattern.
|
|
@@ -34,16 +45,22 @@ export function resideInFile(glob) {
|
|
|
34
45
|
* .should(resideInFolder('** /services'))
|
|
35
46
|
*/
|
|
36
47
|
export function resideInFolder(glob) {
|
|
37
|
-
const
|
|
48
|
+
const matcher = pathGlobMatcher(glob);
|
|
38
49
|
return elementCondition(`reside in folder matching '${glob}'`, (element) => {
|
|
39
50
|
const filePath = getElementFile(element);
|
|
40
51
|
const folder = filePath.substring(0, filePath.lastIndexOf('/'));
|
|
41
|
-
return
|
|
52
|
+
return matchesPath(matcher, element.getSourceFile(), folder);
|
|
42
53
|
}, (element) => {
|
|
43
54
|
const filePath = getElementFile(element);
|
|
44
55
|
const folder = filePath.substring(0, filePath.lastIndexOf('/'));
|
|
45
56
|
return `${getElementName(element)} resides in folder '${folder}' which does not match '${glob}'`;
|
|
46
|
-
},
|
|
57
|
+
},
|
|
58
|
+
// See `resideInFile` above (bug 0339).
|
|
59
|
+
globNode({
|
|
60
|
+
glob,
|
|
61
|
+
kind: 'parent-dir',
|
|
62
|
+
base: isProjectRelative(glob) ? 'normalized' : 'absolute',
|
|
63
|
+
}));
|
|
47
64
|
}
|
|
48
65
|
/**
|
|
49
66
|
* Elements must have a name matching the regex pattern.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural.js","sourceRoot":"","sources":["../../src/conditions/structural.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"structural.js","sourceRoot":"","sources":["../../src/conditions/structural.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-set.d.ts","sourceRoot":"","sources":["../../src/core/disk-set.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"disk-set.d.ts","sourceRoot":"","sources":["../../src/core/disk-set.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAmD/C;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,MAAM,GAAG,kBAAkB,GAAG,eAAe,GAAG,QAAQ,GAAG,gBAAgB,CAAA;AAEvF;;;;;;;GAOG;AACH,MAAM,WAAW,OAAO;IACtB,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAC/B;AAID;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAMrD;AAED;;;;;;;;GAQG;AAEH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,SAAe,GAAG,OAAO,CAEtF"}
|
package/dist/core/disk-set.js
CHANGED
|
@@ -2,6 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import picomatch from 'picomatch';
|
|
4
4
|
import { discoverIdentityRoot } from '@nielspeter/eess/internal';
|
|
5
|
+
import { readsRootRelativePath, rootFromTsConfigPath } from './project-relative.js';
|
|
5
6
|
/**
|
|
6
7
|
* Directories never worth walking.
|
|
7
8
|
*
|
|
@@ -190,15 +191,49 @@ function build(project, budgetLimit) {
|
|
|
190
191
|
// Exactly the confidently-wrong cause ADR-009 rule 2 forbids.
|
|
191
192
|
const everything = [...everyFile, ...dirs];
|
|
192
193
|
const typeScript = new Set(files);
|
|
194
|
+
// TWO prefixes, not one. The walk starts at `discoverIdentityRoot(...)` — the
|
|
195
|
+
// `.git`/workspace root — while every rule-facing matcher names its second
|
|
196
|
+
// view from `rootOf(sourceFile)`, the **tsconfig's** directory. In a monorepo
|
|
197
|
+
// package those differ, and using the walk root alone left this producer
|
|
198
|
+
// answering `absent` for a `'src/**'` the runtime matcher selects: the same
|
|
199
|
+
// two-derivations-disagree failure bug 0339 is about, surviving in the one
|
|
200
|
+
// place that states a fact about the filesystem. Reported in review, and the
|
|
201
|
+
// pinning test below now carries a fixture where the two roots differ.
|
|
202
|
+
//
|
|
203
|
+
// The absolute candidate is what stays in `matched`: `holdsTypeScript` and
|
|
204
|
+
// `typeScript` are keyed by absolute path, and a second spelling in the set
|
|
205
|
+
// would be a second key for one directory.
|
|
206
|
+
const prefixes = [root, rootFromTsConfigPath(project.tsConfigPath)]
|
|
207
|
+
.filter((r) => r !== undefined)
|
|
208
|
+
.map((r) => (r === '/' ? '/' : `${r.replaceAll('\\', '/')}/`));
|
|
209
|
+
const namedFromARoot = (candidate) => prefixes
|
|
210
|
+
.filter((prefix) => candidate.startsWith(prefix))
|
|
211
|
+
.map((prefix) => candidate.slice(prefix.length));
|
|
193
212
|
return {
|
|
194
213
|
classify(glob) {
|
|
195
214
|
const isMatch = picomatch(glob);
|
|
215
|
+
// Both views of each path, as every rule-facing matcher does since bug
|
|
216
|
+
// 0339 — and here it is a claim about the FILESYSTEM, which makes getting
|
|
217
|
+
// it wrong worse than a missed match. Under a project path holding a
|
|
218
|
+
// dot-segment, picomatch's default `dot: false` stops `**` crossing it, so
|
|
219
|
+
// a `'**\/src/**'` whose directory exists and is merely excluded by the
|
|
220
|
+
// tsconfig was classified `absent` — and `absent`'s advice says no such
|
|
221
|
+
// path was found and a segment must be misspelled. Confidently wrong about
|
|
222
|
+
// a fact, which is the one thing this producer exists not to be.
|
|
223
|
+
const readsRootRelative = readsRootRelativePath(glob);
|
|
224
|
+
const hits = (candidate) => {
|
|
225
|
+
if (isMatch(candidate))
|
|
226
|
+
return true;
|
|
227
|
+
if (!readsRootRelative)
|
|
228
|
+
return false;
|
|
229
|
+
return namedFromARoot(candidate).some((named) => isMatch(named));
|
|
230
|
+
};
|
|
196
231
|
// Never `everything.some(isMatch)` — picomatch reads the array index as
|
|
197
232
|
// its second argument and returns a truthy object from index 1 onwards.
|
|
198
|
-
const matched = everything.filter((candidate) =>
|
|
233
|
+
const matched = everything.filter((candidate) => hits(candidate));
|
|
199
234
|
if (matched.length === 0) {
|
|
200
235
|
// Not seen is not the same as not there.
|
|
201
|
-
return pruned.some((dir) =>
|
|
236
|
+
return pruned.some((dir) => hits(dir) || glob.includes(dir.slice(root.length + 1)))
|
|
202
237
|
? 'not-determined'
|
|
203
238
|
: 'absent';
|
|
204
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-set.js","sourceRoot":"","sources":["../../src/core/disk-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"disk-set.js","sourceRoot":"","sources":["../../src/core/disk-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEnF;;;;;;;;GAQG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;IACpB,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,KAAK;IACL,UAAU;IACV,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;CACT,CAAC,CAAA;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAAG,MAAM,CAAA;AAE3B,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,0EAA0E;AAC1E,kBAAkB;AAClB,MAAM,OAAO,GAAG,eAAe,CAAA;AA+B/B,MAAM,KAAK,GAAG,IAAI,OAAO,EAAwB,CAAA;AAEjD;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,OAAoB;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC1C,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACzB,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,4JAA4J;AAC5J,MAAM,UAAU,YAAY,CAAC,OAAoB,EAAE,WAAW,GAAG,YAAY;IAC3E,OAAO,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,KAAK,CAAC,OAAoB,EAAE,WAAmB;IACtD,6EAA6E;IAC7E,wEAAwE;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,6EAA6E;IAC7E,uEAAuE;IACvE,6EAA6E;IAC7E,8EAA8E;IAC9E,kEAAkE;IAClE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,YAAY,CAAA;IAC/D,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;IACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAA;IAE7C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,sFAAsF;IACtF,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB;;;;;;;;OAQG;IACH,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,MAAM,GAAG,WAAW,CAAA;IACxB,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,IAAI,SAAS;YAAE,OAAM;QACrB,IAAI,OAAoB,CAAA;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,CAAA,CAAC,uDAAuD;YAChE,OAAM;QACR,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;QACxB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAA;YAChB,OAAM;QACR,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAC7D,0DAA0D;YAC1D,EAAE;YACF,8JAA8J;YAC9J,gEAAgE;YAChE,mEAAmE;YACnE,wEAAwE;YACxE,uEAAuE;YACvE,oEAAoE;YACpE,sEAAsE;YACtE,gCAAgC;YAChC,EAAE;YACF,qEAAqE;YACrE,qDAAqD;YACrD,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACjB,SAAQ;YACV,CAAC;YACD,uEAAuE;YACvE,qEAAqE;YACrE,uCAAuC;YACvC,EAAE;YACF,yEAAyE;YACzE,0EAA0E;YAC1E,0EAA0E;YAC1E,0EAA0E;YAC1E,cAAc;YACd,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACf,IAAI,CAAC,IAAI,CAAC,CAAA;YACZ,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;IAChC,IAAI,SAAS;QAAE,OAAO,YAAY,CAAA;IAElC,yEAAyE;IACzE,yEAAyE;IACzE,6EAA6E;IAC7E,qEAAqE;IACrE,6EAA6E;IAC7E,YAAY;IACZ,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B,OAAO,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAChC,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAK;YACzB,GAAG,GAAG,MAAM,CAAA;QACd,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,4EAA4E;IAC5E,wEAAwE;IACxE,oEAAoE;IACpE,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,CAAA;IAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IACjC,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAC9E,yEAAyE;IACzE,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,uEAAuE;IACvE,EAAE;IACF,2EAA2E;IAC3E,4EAA4E;IAC5E,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SAChE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAY,EAAE,CACrD,QAAQ;SACL,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACpD,OAAO;QACL,QAAQ,CAAC,IAAY;YACnB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAC/B,uEAAuE;YACvE,0EAA0E;YAC1E,qEAAqE;YACrE,2EAA2E;YAC3E,wEAAwE;YACxE,wEAAwE;YACxE,2EAA2E;YAC3E,iEAAiE;YACjE,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;YACrD,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAW,EAAE;gBAC1C,IAAI,OAAO,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAI,CAAA;gBACnC,IAAI,CAAC,iBAAiB;oBAAE,OAAO,KAAK,CAAA;gBACpC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;YAClE,CAAC,CAAA;YACD,wEAAwE;YACxE,wEAAwE;YACxE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,yCAAyC;gBACzC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjF,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,QAAQ,CAAA;YACd,CAAC;YACD,mEAAmE;YACnE,yEAAyE;YACzE,uEAAuE;YACvE,8CAA8C;YAC9C,OAAO,OAAO,CAAC,IAAI,CACjB,CAAC,SAAS,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAC3E;gBACC,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,eAAe,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,YAAY,GAAY;IAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB;CACjC,CAAA"}
|
|
@@ -38,5 +38,8 @@ export interface ObjectLiteralFunction {
|
|
|
38
38
|
* Only descends into nested object-literal property values, never into function
|
|
39
39
|
* bodies. Returns `[]` when `node` is not an object literal.
|
|
40
40
|
*/
|
|
41
|
-
export declare function collectObjectLiteralFunctions(node: Node,
|
|
41
|
+
export declare function collectObjectLiteralFunctions(node: Node, options?: {
|
|
42
|
+
includeAccessors?: boolean;
|
|
43
|
+
maxDepth?: number;
|
|
44
|
+
}): ObjectLiteralFunction[];
|
|
42
45
|
//# sourceMappingURL=object-literal-functions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-literal-functions.d.ts","sourceRoot":"","sources":["../../src/core/object-literal-functions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"object-literal-functions.d.ts","sourceRoot":"","sources":["../../src/core/object-literal-functions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAI/B;;;GAGG;AAEH,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAKD;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D,qBAAqB,EAAE,CAWzB"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* both `models → core` and `helpers → core` are permitted directions.
|
|
19
19
|
*/
|
|
20
20
|
import { Node } from 'ts-morph';
|
|
21
|
+
import { throughWrappers } from './through-wrappers.js';
|
|
21
22
|
/** Default recursion depth into nested object literals (matches the callback path). */
|
|
22
23
|
const MAX_OBJECT_LITERAL_DEPTH = 3;
|
|
23
24
|
/**
|
|
@@ -30,12 +31,12 @@ const MAX_OBJECT_LITERAL_DEPTH = 3;
|
|
|
30
31
|
* Only descends into nested object-literal property values, never into function
|
|
31
32
|
* bodies. Returns `[]` when `node` is not an object literal.
|
|
32
33
|
*/
|
|
33
|
-
export function collectObjectLiteralFunctions(node,
|
|
34
|
+
export function collectObjectLiteralFunctions(node, options = {}) {
|
|
34
35
|
const out = [];
|
|
35
|
-
walk(node, [], 0, maxDepth, out);
|
|
36
|
+
walk(node, [], 0, options.maxDepth ?? MAX_OBJECT_LITERAL_DEPTH, out, options.includeAccessors ?? false);
|
|
36
37
|
return out;
|
|
37
38
|
}
|
|
38
|
-
function walk(node, keyPath, depth, maxDepth, out) {
|
|
39
|
+
function walk(node, keyPath, depth, maxDepth, out, includeAccessors) {
|
|
39
40
|
if (!Node.isObjectLiteralExpression(node))
|
|
40
41
|
return;
|
|
41
42
|
if (depth >= maxDepth)
|
|
@@ -46,9 +47,30 @@ function walk(node, keyPath, depth, maxDepth, out) {
|
|
|
46
47
|
out.push({ node: prop, keyPath: [...keyPath, keyOf(prop)] });
|
|
47
48
|
continue;
|
|
48
49
|
}
|
|
50
|
+
// An accessor is a function the object defines — the object-literal counterpart of the class
|
|
51
|
+
// accessors bug 0315 collected — so the FUNCTION collection reads it (bug 0321). The callback
|
|
52
|
+
// path does not: whether a rule about callbacks should read a function that runs on access
|
|
53
|
+
// rather than on call is an open ruling, recorded as bug 0331. Hence the option: one traversal,
|
|
54
|
+
// and the difference declared at the call site rather than discovered.
|
|
55
|
+
if (Node.isGetAccessorDeclaration(prop) || Node.isSetAccessorDeclaration(prop)) {
|
|
56
|
+
if (includeAccessors) {
|
|
57
|
+
out.push({
|
|
58
|
+
node: prop,
|
|
59
|
+
keyPath: [
|
|
60
|
+
...keyPath,
|
|
61
|
+
`${Node.isGetAccessorDeclaration(prop) ? 'get' : 'set'} ${prop.getName()}`,
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
49
67
|
if (!Node.isPropertyAssignment(prop))
|
|
50
68
|
continue;
|
|
51
|
-
|
|
69
|
+
// Read through parentheses, `as`, `<T>`, `satisfies` and `!`: `{ handler: (() => …) as H }`
|
|
70
|
+
// holds the same function as `{ handler: () => … }`, and the callback extractor unwraps the
|
|
71
|
+
// ARGUMENT with the same list. Measured with the two copies apart: the wrapped property value
|
|
72
|
+
// was read by neither reader (the enforcement review of bug 0324).
|
|
73
|
+
const init = throughWrappers(prop.getInitializer());
|
|
52
74
|
if (!init)
|
|
53
75
|
continue;
|
|
54
76
|
const key = keyOf(prop);
|
|
@@ -59,7 +81,7 @@ function walk(node, keyPath, depth, maxDepth, out) {
|
|
|
59
81
|
}
|
|
60
82
|
// Nested object literal — recurse (depth-limited).
|
|
61
83
|
if (Node.isObjectLiteralExpression(init)) {
|
|
62
|
-
walk(init, [...keyPath, key], depth + 1, maxDepth, out);
|
|
84
|
+
walk(init, [...keyPath, key], depth + 1, maxDepth, out, includeAccessors);
|
|
63
85
|
}
|
|
64
86
|
}
|
|
65
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-literal-functions.js","sourceRoot":"","sources":["../../src/core/object-literal-functions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"object-literal-functions.js","sourceRoot":"","sources":["../../src/core/object-literal-functions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAcvD,uFAAuF;AACvF,MAAM,wBAAwB,GAAG,CAAC,CAAA;AAElC;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAC3C,IAAU,EACV,UAA6D,EAAE;IAE/D,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,IAAI,CACF,IAAI,EACJ,EAAE,EACF,CAAC,EACD,OAAO,CAAC,QAAQ,IAAI,wBAAwB,EAC5C,GAAG,EACH,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAClC,CAAA;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,IAAI,CACX,IAAU,EACV,OAA0B,EAC1B,KAAa,EACb,QAAgB,EAChB,GAA4B,EAC5B,gBAAyB;IAEzB,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;QAAE,OAAM;IACjD,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAM;IAE7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACxC,yCAAyC;QACzC,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;YAC5D,SAAQ;QACV,CAAC;QACD,6FAA6F;QAC7F,8FAA8F;QAC9F,2FAA2F;QAC3F,gGAAgG;QAChG,uEAAuE;QACvE,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/E,IAAI,gBAAgB,EAAE,CAAC;gBACrB,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE;wBACP,GAAG,OAAO;wBACV,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;qBAC3E;iBACF,CAAC,CAAA;YACJ,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAQ;QAC9C,4FAA4F;QAC5F,4FAA4F;QAC5F,8FAA8F;QAC9F,mEAAmE;QACnE,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;QACnD,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,8CAA8C;QAC9C,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;YACpD,SAAQ;QACV,CAAC;QACD,mDAAmD;QACnD,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,SAAS,KAAK,CAAC,IAA4C;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QAAE,OAAO,YAAY,CAAA;IAC9D,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,eAAe,EAAE,CAAA;IACrE,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAA;AAC3B,CAAC"}
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
* the glob keeps its absolute-only meaning rather than being matched against
|
|
41
41
|
* something invented.
|
|
42
42
|
*/
|
|
43
|
+
import picomatch from 'picomatch';
|
|
43
44
|
import type { Project as TsMorphProject, SourceFile } from 'ts-morph';
|
|
44
45
|
/**
|
|
45
46
|
* Whether a glob can already match an absolute path, so the `**\/` hint would
|
|
@@ -95,4 +96,111 @@ export declare function rootOf(sourceFile: SourceFile, fallbackTsConfigPath?: st
|
|
|
95
96
|
* `path-universe.ts` documents avoiding for the same reason.
|
|
96
97
|
*/
|
|
97
98
|
export declare function relativeToRoot(sourceFile: SourceFile, absolutePath: string, fallbackTsConfigPath?: string): string | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Is this glob matched against the path named from the project root, as well as
|
|
101
|
+
* the absolute path?
|
|
102
|
+
*
|
|
103
|
+
* ## The case that was missing — bug 0339
|
|
104
|
+
*
|
|
105
|
+
* This used to be `isProjectRelative` alone, so `'**\/src/**'` — the one
|
|
106
|
+
* spelling `FAULT_ADVICE` tells the author to write — was the one spelling that
|
|
107
|
+
* never got the second view. picomatch's default `dot: false` stops `**`
|
|
108
|
+
* crossing a segment that begins with `.`, and these globs are matched against
|
|
109
|
+
* an ABSOLUTE path, so a checkout under `~/.tool/worktrees/app` (a worktree
|
|
110
|
+
* manager's layout, a cache directory, some CI workspaces) selected **nothing**
|
|
111
|
+
* for every rule. Measured on 0.7.0 over one fixture copied to two paths:
|
|
112
|
+
* `resideInFile('**\/src/**')` examined 0 subjects under a dot-segment and 1
|
|
113
|
+
* beside it, and ADR-010's guard then reported correct rules as enforcing
|
|
114
|
+
* nothing — with a remedy that says to widen the selector or declare it empty.
|
|
115
|
+
*
|
|
116
|
+
* It was also the last disagreement with the DIAGNOSIS: `viewsFor` takes
|
|
117
|
+
* satisfiability against the **union** of the absolute and tsconfig-relative
|
|
118
|
+
* views, unconditionally. So a `'**\/src/**'` under a dot-directory was live to
|
|
119
|
+
* `isDeadSite` and dead at runtime — two derivations disagreeing about one glob,
|
|
120
|
+
* which is the failure this file spends most of its guards on.
|
|
121
|
+
*
|
|
122
|
+
* ## Why this is not simply "every glob"
|
|
123
|
+
*
|
|
124
|
+
* Removing the gate outright was tried, and this repository's own controls
|
|
125
|
+
* refused it — both exclusions `isProjectRelative` makes are load-bearing, and
|
|
126
|
+
* neither is about anchoring:
|
|
127
|
+
*
|
|
128
|
+
* - a `./` segment stays excluded, because `syntacticFault` reports
|
|
129
|
+
* `dot-segment` for it. picomatch matches `'./src/domain/**'` against
|
|
130
|
+
* `src/domain`, so offering the view reinstates exactly the split verdict
|
|
131
|
+
* `isProjectRelative`'s own comment records: 3 subjects selected AND a dead
|
|
132
|
+
* selector reported, in one run. `../` is excluded alongside it and is a
|
|
133
|
+
* DIFFERENT fault — `syntacticFault`'s dot-segment test is `/(?:^|\/)\.\//`,
|
|
134
|
+
* which `'../src/**'` does not match, so it is reported `unanchored` instead.
|
|
135
|
+
* The exclusion is right either way (nothing above the root has a second view,
|
|
136
|
+
* so no match is forged); it is the fault name that differs, and this comment
|
|
137
|
+
* claimed one rule for two shapes.
|
|
138
|
+
* - `'*\/x/**'` stays excluded, because it is the last reachable `unanchored`
|
|
139
|
+
* fault for a path glob. Normalizing it made the anchor advice and the whole
|
|
140
|
+
* `ANCHOR_ADVICE` grouping unreachable — measured as seven failures in
|
|
141
|
+
* `tests/builders/slice-rule-builder.test.ts`, whose subject is that each
|
|
142
|
+
* remedy is TRUE.
|
|
143
|
+
*
|
|
144
|
+
* `'/abs/x'` and a drive-absolute `'C:/x'` are excluded too, and there it makes
|
|
145
|
+
* no behavioural difference — neither can match a relative path — but the
|
|
146
|
+
* declaration stays honest about what is tried.
|
|
147
|
+
*
|
|
148
|
+
* So the rule is: the root-relative view is offered to a glob that names a
|
|
149
|
+
* location relative to the root, and to one that says "anywhere". Both readings
|
|
150
|
+
* are location-independent, which is the property the bug was about.
|
|
151
|
+
*/
|
|
152
|
+
export declare function readsRootRelativePath(glob: string): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* A compiled path glob: the matcher, and whether it reads the root-relative
|
|
155
|
+
* view.
|
|
156
|
+
*
|
|
157
|
+
* Both together, because the decision is a function of the glob and the sites
|
|
158
|
+
* that match several globs at once would otherwise carry a parallel array of
|
|
159
|
+
* booleans. Deciding it once per glob rather than once per path also keeps
|
|
160
|
+
* `picomatch()` and `readsRootRelativePath()` off the per-element path.
|
|
161
|
+
*/
|
|
162
|
+
export interface PathGlobMatcher {
|
|
163
|
+
readonly glob: string;
|
|
164
|
+
readonly isMatch: picomatch.Matcher;
|
|
165
|
+
readonly readsRootRelative: boolean;
|
|
166
|
+
}
|
|
167
|
+
/** Compile one path glob. */
|
|
168
|
+
export declare function pathGlobMatcher(glob: string): PathGlobMatcher;
|
|
169
|
+
/** Compile several path globs, in order. */
|
|
170
|
+
export declare function pathGlobMatchers(globs: readonly string[]): PathGlobMatcher[];
|
|
171
|
+
/**
|
|
172
|
+
* Does this glob match this path — absolutely, or named from the project root?
|
|
173
|
+
*
|
|
174
|
+
* The one place a path glob meets a path **where a `SourceFile` is in hand**.
|
|
175
|
+
* `disk-set.ts` reimplements the decision inline over walked disk paths, which
|
|
176
|
+
* have no `SourceFile` and are named from a root of their own — that copy is
|
|
177
|
+
* deliberate and is marked as such there, so this is not "the only place" and
|
|
178
|
+
* saying so would leave the next reader trusting a claim with a second copy
|
|
179
|
+
* behind it.
|
|
180
|
+
*
|
|
181
|
+
* Every site that matched a file path against a glob had its own copy of this
|
|
182
|
+
* three-line decision and they disagreed. Over the ten that carry a sabotage row
|
|
183
|
+
* in bug 0339, measured at 0.7.0: **three** offered the second view only for a
|
|
184
|
+
* project-relative glob (`predicates/identity.ts`, `cross-layer-builder.ts`,
|
|
185
|
+
* `slice.ts`'s `resolveByDefinition`), **one** offered it always
|
|
186
|
+
* (`duplicate-bodies.ts`), and **six** never offered it at all. Bug 0339 was in
|
|
187
|
+
* the last group's shape and bug 0036 in the first's.
|
|
188
|
+
* `conditions/reverse-dependency.ts` also offered it always and needed no
|
|
189
|
+
* change, so it has no row.
|
|
190
|
+
*
|
|
191
|
+
* `undefined` from `relativeToRoot` (no root known, or a file above the root) is
|
|
192
|
+
* a genuine "there is no second view" and yields the absolute answer rather than
|
|
193
|
+
* an invented one.
|
|
194
|
+
*/
|
|
195
|
+
export declare function matchesPath(matcher: PathGlobMatcher, sourceFile: SourceFile, absolutePath: string, fallbackTsConfigPath?: string): boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Does ANY of these globs match this path?
|
|
198
|
+
*
|
|
199
|
+
* Never `matchers.some(isMatch)` at a call site: picomatch takes the array index
|
|
200
|
+
* as its second argument and returns a truthy object from index 1 onwards, so
|
|
201
|
+
* the shorthand reports a match for every path in a list of two or more. Four
|
|
202
|
+
* files in `src/` carry a comment warning about it; this is the version that
|
|
203
|
+
* cannot be written the other way.
|
|
204
|
+
*/
|
|
205
|
+
export declare function anyMatchesPath(matchers: readonly PathGlobMatcher[], sourceFile: SourceFile, absolutePath: string, fallbackTsConfigPath?: string): boolean;
|
|
98
206
|
//# sourceMappingURL=project-relative.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-relative.d.ts","sourceRoot":"","sources":["../../src/core/project-relative.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErE;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;
|
|
1
|
+
{"version":3,"file":"project-relative.d.ts","sourceRoot":"","sources":["../../src/core/project-relative.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErE;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgCvD;AA+BD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,IAAI,CAKN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY7E;AAOD,wBAAgB,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqChG;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC;AAED,6BAA6B;AAC7B,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,EAAE,CAE5E;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAKT;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAIT"}
|