ddd-ts-kit 0.15.0 → 0.16.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 +3 -1
- package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
- package/dist/check/catalogue/architecture-rules.js +2 -0
- package/dist/check/catalogue/architecture-rules.js.map +1 -1
- package/dist/check/explain/domain-docs.d.ts +3 -0
- package/dist/check/explain/domain-docs.d.ts.map +1 -0
- package/dist/check/explain/domain-docs.js +30 -0
- package/dist/check/explain/domain-docs.js.map +1 -0
- package/dist/check/explain/rule-docs.d.ts.map +1 -1
- package/dist/check/explain/rule-docs.js +2 -0
- package/dist/check/explain/rule-docs.js.map +1 -1
- package/dist/check/fixtures/fixtures.d.ts.map +1 -1
- package/dist/check/fixtures/fixtures.js +4 -0
- package/dist/check/fixtures/fixtures.js.map +1 -1
- package/dist/check/fixtures/model-function-fixtures.d.ts +4 -0
- package/dist/check/fixtures/model-function-fixtures.d.ts.map +1 -0
- package/dist/check/fixtures/model-function-fixtures.js +52 -0
- package/dist/check/fixtures/model-function-fixtures.js.map +1 -0
- package/dist/check/fixtures/value-object-file-fixtures.d.ts +4 -0
- package/dist/check/fixtures/value-object-file-fixtures.d.ts.map +1 -0
- package/dist/check/fixtures/value-object-file-fixtures.js +54 -0
- package/dist/check/fixtures/value-object-file-fixtures.js.map +1 -0
- package/dist/check/fixtures/value-object-files.d.ts +34 -0
- package/dist/check/fixtures/value-object-files.d.ts.map +1 -0
- package/dist/check/fixtures/value-object-files.js +46 -0
- package/dist/check/fixtures/value-object-files.js.map +1 -0
- package/dist/check/rules/domain-value-object-class.d.ts +3 -0
- package/dist/check/rules/domain-value-object-class.d.ts.map +1 -0
- package/dist/check/rules/domain-value-object-class.js +21 -0
- package/dist/check/rules/domain-value-object-class.js.map +1 -0
- package/dist/check/structure/class-body-brace.d.ts +6 -0
- package/dist/check/structure/class-body-brace.d.ts.map +1 -0
- package/dist/check/structure/class-body-brace.js +22 -0
- package/dist/check/structure/class-body-brace.js.map +1 -0
- package/dist/check/structure/read-structure.d.ts.map +1 -1
- package/dist/check/structure/read-structure.js +3 -1
- package/dist/check/structure/read-structure.js.map +1 -1
- package/dist/check/values/answered-literals.d.ts +8 -0
- package/dist/check/values/answered-literals.d.ts.map +1 -0
- package/dist/check/values/answered-literals.js +20 -0
- package/dist/check/values/answered-literals.js.map +1 -0
- package/dist/check/values/arrow-body.d.ts +4 -0
- package/dist/check/values/arrow-body.d.ts.map +1 -0
- package/dist/check/values/arrow-body.js +52 -0
- package/dist/check/values/arrow-body.js.map +1 -0
- package/dist/check/values/entry-role.d.ts +10 -0
- package/dist/check/values/entry-role.d.ts.map +1 -0
- package/dist/check/values/entry-role.js +40 -0
- package/dist/check/values/entry-role.js.map +1 -0
- package/dist/check/values/exported-function-body.d.ts +9 -0
- package/dist/check/values/exported-function-body.d.ts.map +1 -0
- package/dist/check/values/exported-function-body.js +29 -0
- package/dist/check/values/exported-function-body.js.map +1 -0
- package/dist/check/values/exported-values.d.ts +9 -0
- package/dist/check/values/exported-values.d.ts.map +1 -0
- package/dist/check/values/exported-values.js +48 -0
- package/dist/check/values/exported-values.js.map +1 -0
- package/dist/check/values/extends-value-object.d.ts +9 -0
- package/dist/check/values/extends-value-object.d.ts.map +1 -0
- package/dist/check/values/extends-value-object.js +25 -0
- package/dist/check/values/extends-value-object.js.map +1 -0
- package/dist/check/values/function-body.d.ts +10 -0
- package/dist/check/values/function-body.d.ts.map +1 -0
- package/dist/check/values/function-body.js +2 -0
- package/dist/check/values/function-body.js.map +1 -0
- package/dist/check/values/generate-hint.d.ts +4 -0
- package/dist/check/values/generate-hint.d.ts.map +1 -0
- package/dist/check/values/generate-hint.js +8 -0
- package/dist/check/values/generate-hint.js.map +1 -0
- package/dist/check/values/initializer-of.d.ts +3 -0
- package/dist/check/values/initializer-of.d.ts.map +1 -0
- package/dist/check/values/initializer-of.js +15 -0
- package/dist/check/values/initializer-of.js.map +1 -0
- package/dist/check/values/is-model-file.d.ts +8 -0
- package/dist/check/values/is-model-file.d.ts.map +1 -0
- package/dist/check/values/is-model-file.js +15 -0
- package/dist/check/values/is-model-file.js.map +1 -0
- package/dist/check/values/is-value-object-file.d.ts +7 -0
- package/dist/check/values/is-value-object-file.d.ts.map +1 -0
- package/dist/check/values/is-value-object-file.js +14 -0
- package/dist/check/values/is-value-object-file.js.map +1 -0
- package/dist/check/values/javascript-globals.d.ts +3 -0
- package/dist/check/values/javascript-globals.d.ts.map +1 -0
- package/dist/check/values/javascript-globals.js +22 -0
- package/dist/check/values/javascript-globals.js.map +1 -0
- package/dist/check/values/literal-at.d.ts +3 -0
- package/dist/check/values/literal-at.d.ts.map +1 -0
- package/dist/check/values/literal-at.js +7 -0
- package/dist/check/values/literal-at.js.map +1 -0
- package/dist/check/values/local-declaration.d.ts +8 -0
- package/dist/check/values/local-declaration.d.ts.map +1 -0
- package/dist/check/values/local-declaration.js +31 -0
- package/dist/check/values/local-declaration.js.map +1 -0
- package/dist/check/values/nested-bodies.d.ts +8 -0
- package/dist/check/values/nested-bodies.d.ts.map +1 -0
- package/dist/check/values/nested-bodies.js +28 -0
- package/dist/check/values/nested-bodies.js.map +1 -0
- package/dist/check/values/plain-value-functions.d.ts +10 -0
- package/dist/check/values/plain-value-functions.d.ts.map +1 -0
- package/dist/check/values/plain-value-functions.js +33 -0
- package/dist/check/values/plain-value-functions.js.map +1 -0
- package/dist/check/values/returns-package-type.d.ts +9 -0
- package/dist/check/values/returns-package-type.d.ts.map +1 -0
- package/dist/check/values/returns-package-type.js +12 -0
- package/dist/check/values/returns-package-type.js.map +1 -0
- package/dist/check/values/stands-for-a-value.d.ts +9 -0
- package/dist/check/values/stands-for-a-value.d.ts.map +1 -0
- package/dist/check/values/stands-for-a-value.js +28 -0
- package/dist/check/values/stands-for-a-value.js.map +1 -0
- package/dist/check/values/value-object-file-findings.d.ts +5 -0
- package/dist/check/values/value-object-file-findings.d.ts.map +1 -0
- package/dist/check/values/value-object-file-findings.js +96 -0
- package/dist/check/values/value-object-file-findings.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/parse-stack.d.ts.map +1 -1
- package/dist/config/parse-stack.js +2 -1
- package/dist/config/parse-stack.js.map +1 -1
- package/dist/config/stack.d.ts +8 -0
- package/dist/config/stack.d.ts.map +1 -1
- package/dist/config/stack.js +1 -0
- package/dist/config/stack.js.map +1 -1
- package/dist/help/usage.d.ts +1 -1
- package/dist/help/usage.d.ts.map +1 -1
- package/dist/help/usage.js +1 -1
- package/dist/init/manifest/versions.js +24 -24
- package/dist/init/stack/resolve-stack.d.ts.map +1 -1
- package/dist/init/stack/resolve-stack.js +3 -1
- package/dist/init/stack/resolve-stack.js.map +1 -1
- package/dist/init/stack/stack-options.d.ts +2 -0
- package/dist/init/stack/stack-options.d.ts.map +1 -1
- package/dist/stack/stack-vars.js +2 -1
- package/dist/stack/stack-vars.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/templates/init/rules/domain.md.tpl +1 -1
- package/templates/pipeline/package-scripts.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrow-body.d.ts","sourceRoot":"","sources":["../../../src/check/values/arrow-body.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,4GAA4G;AAC5G,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAY9E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BRACKETS } from '../text/brackets.js';
|
|
2
|
+
import { matchingBracket } from '../text/matching-bracket.js';
|
|
3
|
+
/** What may stand before the arrow of an arrow function: its type parameters, its parameters and its return type. */
|
|
4
|
+
const PARAMETERS = /^(?:async\s*)?(?:<[\s\S]*>\s*)?(?:\([\s\S]*\)|[\w$]+)(?:\s*:[\s\S]*)?$/;
|
|
5
|
+
/** The body of the arrow function the expression at `from` is; undefined when the expression is not one. */
|
|
6
|
+
export function arrowBody(code, from) {
|
|
7
|
+
const arrow = arrowAtDepthZero(code, afterTypeParameters(code, from));
|
|
8
|
+
if (arrow === undefined || !PARAMETERS.test(code.slice(from, arrow).trim())) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const start = arrow + 2 + (/^\s*/.exec(code.slice(arrow + 2))?.[0].length ?? 0);
|
|
12
|
+
return code.charAt(start) === '{'
|
|
13
|
+
? { kind: 'block', open: start, close: matchingBracket(code, start) }
|
|
14
|
+
: { kind: 'expression', start };
|
|
15
|
+
}
|
|
16
|
+
/** Past the type parameters an arrow may open with, `<T,>` included, whose commas do not end the expression. */
|
|
17
|
+
function afterTypeParameters(code, from) {
|
|
18
|
+
const start = from + (/^(?:async\s*)?/.exec(code.slice(from))?.[0].length ?? 0);
|
|
19
|
+
let angles = 0;
|
|
20
|
+
for (let i = start; code.charAt(start) === '<' && i < code.length; i += 1) {
|
|
21
|
+
angles += code.charAt(i) === '<' ? 1 : 0;
|
|
22
|
+
angles -= code.charAt(i) === '>' && code.charAt(i - 1) !== '=' ? 1 : 0;
|
|
23
|
+
if (angles === 0) {
|
|
24
|
+
return i + 1;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return from;
|
|
28
|
+
}
|
|
29
|
+
/** The first `=>` outside any bracket before the expression ends. */
|
|
30
|
+
function arrowAtDepthZero(code, from) {
|
|
31
|
+
let depth = 0;
|
|
32
|
+
for (let i = from; i < code.length - 1 && depth >= 0; i += 1) {
|
|
33
|
+
const char = code.charAt(i);
|
|
34
|
+
if (depth === 0 && endsBefore(code, i)) {
|
|
35
|
+
return char === '=' ? i : undefined;
|
|
36
|
+
}
|
|
37
|
+
depth += depthChange(char);
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/** At depth zero: the arrow found, or the end of the expression without one. */
|
|
42
|
+
function endsBefore(code, at) {
|
|
43
|
+
const char = code.charAt(at);
|
|
44
|
+
return (char === '=' && code.charAt(at + 1) === '>') || char === ';' || char === ',';
|
|
45
|
+
}
|
|
46
|
+
function depthChange(char) {
|
|
47
|
+
if (BRACKETS.openers.includes(char)) {
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
return BRACKETS.closers.includes(char) ? -1 : 0;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=arrow-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrow-body.js","sourceRoot":"","sources":["../../../src/check/values/arrow-body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an entry of an object literal holds: `behaviour`, a function; `built`, what a call or
|
|
3
|
+
* `new` of the model built (`Money.of(1)`, `total.add(tax)`, `new Slot(..)`), a call of the
|
|
4
|
+
* language aside (`Math.round(..)`, `new Date(..)`); `data`, anything else: a literal, a
|
|
5
|
+
* parameter, an operation on them.
|
|
6
|
+
*/
|
|
7
|
+
export type EntryRole = 'behaviour' | 'built' | 'data';
|
|
8
|
+
/** The role of an expression, in blanked code; a name is read from its first declaration in `module`, found by name. */
|
|
9
|
+
export declare function expressionRole(expression: string, module: string, seen?: ReadonlySet<string>): EntryRole;
|
|
10
|
+
//# sourceMappingURL=entry-role.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-role.d.ts","sourceRoot":"","sources":["../../../src/check/values/entry-role.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAOvD,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,SAAS,CAenH"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { endAtDepthZero } from '../text/end-at-depth-zero.js';
|
|
2
|
+
import { escapeRegExp } from '../text/escape-reg-exp.js';
|
|
3
|
+
import { arrowBody } from './arrow-body.js';
|
|
4
|
+
import { JAVASCRIPT_GLOBALS } from './javascript-globals.js';
|
|
5
|
+
const FUNCTION_EXPRESSION = /^(?:async\s+)?function\b/;
|
|
6
|
+
const NEW = /^new\s+([A-Za-z_$][\w$]*)/;
|
|
7
|
+
const CALL = /^([A-Za-z_$][\w$]*)(?:\s*\??\.\s*[\w$]+|\s*!)*\s*(?:<[^()]*>)?\s*\(/;
|
|
8
|
+
const NAME = /^([A-Za-z_$][\w$]*)\s*!?\s*(?:(?:as|satisfies)\b[\s\S]*)?$/;
|
|
9
|
+
/** The role of an expression, in blanked code; a name is read from its first declaration in `module`, found by name. */
|
|
10
|
+
export function expressionRole(expression, module, seen = new Set()) {
|
|
11
|
+
const text = expression.trim();
|
|
12
|
+
if (FUNCTION_EXPRESSION.test(text) || arrowBody(text, 0) !== undefined) {
|
|
13
|
+
return 'behaviour';
|
|
14
|
+
}
|
|
15
|
+
const inner = text.replace(/^(?:\(\s*|await\s+)+/, '');
|
|
16
|
+
const built = NEW.exec(inner) ?? CALL.exec(inner);
|
|
17
|
+
if (built !== null) {
|
|
18
|
+
return JAVASCRIPT_GLOBALS.has(built[1] ?? '') ? 'data' : 'built';
|
|
19
|
+
}
|
|
20
|
+
return namedRole(inner, module, seen);
|
|
21
|
+
}
|
|
22
|
+
/** A name alone, `as` or `satisfies` a type: the role of what it binds; anything else is data. */
|
|
23
|
+
function namedRole(text, module, seen) {
|
|
24
|
+
const name = NAME.exec(text)?.[1];
|
|
25
|
+
return name === undefined || seen.has(name) ? 'data' : boundRole(module, name, new Set([...seen, name]));
|
|
26
|
+
}
|
|
27
|
+
/** The role of what the first declaration of `name` binds: a parameter, declared nowhere, is data. */
|
|
28
|
+
function boundRole(module, name, seen) {
|
|
29
|
+
const escaped = escapeRegExp(name);
|
|
30
|
+
const declared = new RegExp(`(?<![\\w$.])(?:(?:async\\s+)?function\\s*\\*?\\s*${escaped}(?![\\w$])|(?:const|let|var)\\s+${escaped}\\s*(?::[^;]*?)?=(?![=>]))`).exec(module);
|
|
31
|
+
if (declared === null) {
|
|
32
|
+
return 'data';
|
|
33
|
+
}
|
|
34
|
+
if (!/^(?:const|let|var)\b/.test(declared[0])) {
|
|
35
|
+
return 'behaviour';
|
|
36
|
+
}
|
|
37
|
+
const start = declared.index + declared[0].length;
|
|
38
|
+
return expressionRole(module.slice(start, endAtDepthZero(module, start, ';')), module, seen);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=entry-role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-role.js","sourceRoot":"","sources":["../../../src/check/values/entry-role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAU7D,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AACvD,MAAM,GAAG,GAAG,2BAA2B,CAAC;AACxC,MAAM,IAAI,GAAG,qEAAqE,CAAC;AACnF,MAAM,IAAI,GAAG,4DAA4D,CAAC;AAE1E,wHAAwH;AACxH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,MAAc,EAAE,IAAI,GAAwB,IAAI,GAAG,EAAE;IACtG,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACvE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,kGAAkG;AAClG,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc,EAAE,IAAyB;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,sGAAsG;AACtG,SAAS,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,IAAyB;IACxE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,IAAI,MAAM,CACzB,oDAAoD,OAAO,mCAAmC,OAAO,4BAA4B,CAClI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAElD,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Exported } from '../exports/exported.js';
|
|
2
|
+
import type { FunctionBody } from './function-body.js';
|
|
3
|
+
/**
|
|
4
|
+
* The body of an exported function, in the text of its declaration: a function declaration, or
|
|
5
|
+
* a constant bound to an arrow or a function expression. Undefined for anything else, and for an
|
|
6
|
+
* overload, which has no body.
|
|
7
|
+
*/
|
|
8
|
+
export declare function exportedFunctionBody({ kind, text, signature }: Exported): FunctionBody | undefined;
|
|
9
|
+
//# sourceMappingURL=exported-function-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exported-function-body.d.ts","sourceRoot":"","sources":["../../../src/check/values/exported-function-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CA0BlG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { signatureAt } from '../structure/signature-at.js';
|
|
2
|
+
import { arrowBody } from './arrow-body.js';
|
|
3
|
+
import { initializerOf } from './initializer-of.js';
|
|
4
|
+
const FUNCTION_EXPRESSION = /^(?:async\s+)?function\b[\s*]*(?:[\w$]+)?\s*(?:<[^()]*>)?\s*\(/;
|
|
5
|
+
/**
|
|
6
|
+
* The body of an exported function, in the text of its declaration: a function declaration, or
|
|
7
|
+
* a constant bound to an arrow or a function expression. Undefined for anything else, and for an
|
|
8
|
+
* overload, which has no body.
|
|
9
|
+
*/
|
|
10
|
+
export function exportedFunctionBody({ kind, text, signature }) {
|
|
11
|
+
if (kind === 'function') {
|
|
12
|
+
const open = signature.length;
|
|
13
|
+
return text.charAt(open) === '{' ? { kind: 'block', open, close: text.length - 1 } : undefined;
|
|
14
|
+
}
|
|
15
|
+
if (kind !== 'const') {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const start = initializerOf(text);
|
|
19
|
+
if (start === undefined) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const expression = FUNCTION_EXPRESSION.exec(text.slice(start));
|
|
23
|
+
if (expression === null) {
|
|
24
|
+
return arrowBody(text, start);
|
|
25
|
+
}
|
|
26
|
+
const body = signatureAt(text, start + expression[0].length - 1);
|
|
27
|
+
return body === undefined ? undefined : { kind: 'block', open: body.bodyOpen, close: body.bodyClose };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=exported-function-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exported-function-body.js","sourceRoot":"","sources":["../../../src/check/values/exported-function-body.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,mBAAmB,GAAG,gEAAgE,CAAC;AAE7F;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAY;IACtE,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;QAE9B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEjE,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Exported } from '../exports/exported.js';
|
|
2
|
+
import type { SourceFile } from '../model/source-file.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a file exports, as `fileExports` reads it, with the values it leaves unread: a constant
|
|
5
|
+
* exported by `export { money }` is read from its declaration, and `export default <expression>`
|
|
6
|
+
* is read as a constant named `default` (`export default money` as what `money` declares).
|
|
7
|
+
*/
|
|
8
|
+
export declare function exportedValues(file: SourceFile): Exported[];
|
|
9
|
+
//# sourceMappingURL=exported-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exported-values.d.ts","sourceRoot":"","sources":["../../../src/check/values/exported-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAY1D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,EAAE,CAoB3D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { fileExports } from '../exports/file-exports.js';
|
|
2
|
+
import { braceDepthAt } from '../text/brace-depth-at.js';
|
|
3
|
+
import { endAtDepthZero } from '../text/end-at-depth-zero.js';
|
|
4
|
+
import { localDeclaration } from './local-declaration.js';
|
|
5
|
+
const LOCAL_LIST = /(?<![\w$.])export\s*\{([^}]*)\}(?!\s*from\b)/g;
|
|
6
|
+
const DEFAULT_EXPRESSION = /(?<![\w$.])export\s+default\s+(?!(?:abstract\s+)?class\b|(?:async\s+)?function\b|interface\b)/g;
|
|
7
|
+
const IDENTIFIER = /^([A-Za-z_$][\w$]*)\s*(?:;|$)/;
|
|
8
|
+
/**
|
|
9
|
+
* What a file exports, as `fileExports` reads it, with the values it leaves unread: a constant
|
|
10
|
+
* exported by `export { money }` is read from its declaration, and `export default <expression>`
|
|
11
|
+
* is read as a constant named `default` (`export default money` as what `money` declares).
|
|
12
|
+
*/
|
|
13
|
+
export function exportedValues(file) {
|
|
14
|
+
const { code } = file.scan;
|
|
15
|
+
const known = fileExports(file).filter(({ kind, text }) => kind !== 'const' || text !== '');
|
|
16
|
+
const listed = [...code.matchAll(LOCAL_LIST)].flatMap((match) => (match[1] ?? '')
|
|
17
|
+
.split(',')
|
|
18
|
+
.map((part) => part.trim())
|
|
19
|
+
.filter((part) => part !== '' && !part.startsWith('type '))
|
|
20
|
+
.flatMap((part) => {
|
|
21
|
+
const [local = '', alias] = part.split(/\s+as\s+/);
|
|
22
|
+
const declared = localDeclaration(code, local);
|
|
23
|
+
return declared?.kind === 'const'
|
|
24
|
+
? [{ ...declared, name: alias ?? local, line: file.scan.lineAt(match.index) }]
|
|
25
|
+
: [];
|
|
26
|
+
}));
|
|
27
|
+
return [...known, ...listed, ...defaultExpressions(file)];
|
|
28
|
+
}
|
|
29
|
+
function defaultExpressions(file) {
|
|
30
|
+
const { code } = file.scan;
|
|
31
|
+
return [...code.matchAll(DEFAULT_EXPRESSION)]
|
|
32
|
+
.filter(({ index }) => braceDepthAt(code, index) === 0)
|
|
33
|
+
.flatMap(({ index, 0: keyword }) => {
|
|
34
|
+
const start = index + keyword.length;
|
|
35
|
+
const named = IDENTIFIER.exec(code.slice(start));
|
|
36
|
+
const line = file.scan.lineAt(index);
|
|
37
|
+
const declared = named === null ? undefined : localDeclaration(code, named[1] ?? '');
|
|
38
|
+
if (named !== null) {
|
|
39
|
+
// A class keeps its own name, as `export { Money }` gives it: the value object files read classes by name.
|
|
40
|
+
return declared === undefined
|
|
41
|
+
? []
|
|
42
|
+
: [{ ...declared, name: declared.kind === 'class' ? declared.name : 'default', line }];
|
|
43
|
+
}
|
|
44
|
+
const text = `default = ${code.slice(start, endAtDepthZero(code, start, ';'))}`;
|
|
45
|
+
return [{ name: 'default', kind: 'const', line, text, signature: text }];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=exported-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exported-values.js","sourceRoot":"","sources":["../../../src/check/values/exported-values.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SourceFile } from '../model/source-file.js';
|
|
2
|
+
import type { ClassShape } from '../structure/class-shape.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whether a class is a value object: it extends `ValueObject` of the kernel, a class of its own
|
|
5
|
+
* file that does, or a class imported from a value object file of the project, whose own file is
|
|
6
|
+
* judged on its own.
|
|
7
|
+
*/
|
|
8
|
+
export declare function extendsValueObject(file: SourceFile, shape: ClassShape, sharedKernelDir: string): boolean;
|
|
9
|
+
//# sourceMappingURL=extends-value-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extends-value-object.d.ts","sourceRoot":"","sources":["../../../src/check/values/extends-value-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAsBxG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { importedFrom } from '../support/imported-from.js';
|
|
2
|
+
import { isValueObjectFile } from './is-value-object-file.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whether a class is a value object: it extends `ValueObject` of the kernel, a class of its own
|
|
5
|
+
* file that does, or a class imported from a value object file of the project, whose own file is
|
|
6
|
+
* judged on its own.
|
|
7
|
+
*/
|
|
8
|
+
export function extendsValueObject(file, shape, sharedKernelDir) {
|
|
9
|
+
const seen = new Set();
|
|
10
|
+
let current = shape;
|
|
11
|
+
while (current?.superclass !== undefined && !seen.has(current.name)) {
|
|
12
|
+
const parent = current.superclass;
|
|
13
|
+
if (parent === 'ValueObject' || parent.endsWith('.ValueObject')) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const target = importedFrom(file, parent)?.target;
|
|
17
|
+
if (target?.kind === 'file') {
|
|
18
|
+
return isValueObjectFile(target.path, target.location, sharedKernelDir);
|
|
19
|
+
}
|
|
20
|
+
seen.add(current.name);
|
|
21
|
+
current = file.structure.classes.find(({ name, depth }) => name === parent && depth === 0);
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=extends-value-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extends-value-object.js","sourceRoot":"","sources":["../../../src/check/values/extends-value-object.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,KAAiB,EAAE,eAAuB;IAC7F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAA2B,KAAK,CAAC;IAE5C,OAAO,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAW,OAAO,CAAC,UAAU,CAAC;QAE1C,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAElD,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Where the body of a function lies in blanked code: a block between braces, or the expression an arrow answers. */
|
|
2
|
+
export type FunctionBody = {
|
|
3
|
+
readonly kind: 'block';
|
|
4
|
+
readonly open: number;
|
|
5
|
+
readonly close: number;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: 'expression';
|
|
8
|
+
readonly start: number;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=function-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-body.d.ts","sourceRoot":"","sources":["../../../src/check/values/function-body.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-body.js","sourceRoot":"","sources":["../../../src/check/values/function-body.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SourceFile } from '../model/source-file.js';
|
|
2
|
+
/** The command that writes a value object where the file is: in its context, or by hand in the shared kernel. */
|
|
3
|
+
export declare function generateHint(file: SourceFile, name?: string): string;
|
|
4
|
+
//# sourceMappingURL=generate-hint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-hint.d.ts","sourceRoot":"","sources":["../../../src/check/values/generate-hint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,iHAAiH;AACjH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,SAAW,GAAG,MAAM,CAMtE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The command that writes a value object where the file is: in its context, or by hand in the shared kernel. */
|
|
2
|
+
export function generateHint(file, name = '<Name>') {
|
|
3
|
+
const { location } = file;
|
|
4
|
+
return location.area === 'context'
|
|
5
|
+
? `\`npx ddd-ts-kit generate value-object ${location.context} ${name}\` writes one`
|
|
6
|
+
: '`npx ddd-ts-kit generate value-object <context> <Name>` writes one in a context, the model to follow here';
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=generate-hint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-hint.js","sourceRoot":"","sources":["../../../src/check/values/generate-hint.ts"],"names":[],"mappings":"AAEA,iHAAiH;AACjH,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,IAAI,GAAG,QAAQ;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE1B,OAAO,QAAQ,CAAC,IAAI,KAAK,SAAS;QAChC,CAAC,CAAC,0CAA0C,QAAQ,CAAC,OAAO,IAAI,IAAI,eAAe;QACnF,CAAC,CAAC,2GAA2G,CAAC;AAClH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initializer-of.d.ts","sourceRoot":"","sources":["../../../src/check/values/initializer-of.ts"],"names":[],"mappings":"AAEA,0HAA0H;AAC1H,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAe9D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BRACKETS } from '../text/brackets.js';
|
|
2
|
+
/** Where the value of `export const name: Type = value` starts: after the first `=` outside brackets that is not `=>`. */
|
|
3
|
+
export function initializerOf(text) {
|
|
4
|
+
let depth = 0;
|
|
5
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
6
|
+
const char = text.charAt(i);
|
|
7
|
+
if (depth === 0 && char === '=' && !'=>'.includes(text.charAt(i + 1)) && !'=!<>'.includes(text.charAt(i - 1))) {
|
|
8
|
+
return i + 1 + (/^\s*/.exec(text.slice(i + 1))?.[0].length ?? 0);
|
|
9
|
+
}
|
|
10
|
+
depth += BRACKETS.openers.includes(char) ? 1 : 0;
|
|
11
|
+
depth -= BRACKETS.closers.includes(char) ? 1 : 0;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=initializer-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initializer-of.js","sourceRoot":"","sources":["../../../src/check/values/initializer-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,0HAA0H;AAC1H,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE5B,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9G,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Location } from '../model/location.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where a value of the model may be written as a function and is looked for: `domain/` of a
|
|
4
|
+
* context, and the shared kernel outside its `presentation/`. Specs are never judged. Same table
|
|
5
|
+
* as the ESLint plugin.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isModelFile(file: string, location: Location, sharedKernelDir: string): boolean;
|
|
8
|
+
//# sourceMappingURL=is-model-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-model-file.d.ts","sourceRoot":"","sources":["../../../src/check/values/is-model-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAU9F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a value of the model may be written as a function and is looked for: `domain/` of a
|
|
3
|
+
* context, and the shared kernel outside its `presentation/`. Specs are never judged. Same table
|
|
4
|
+
* as the ESLint plugin.
|
|
5
|
+
*/
|
|
6
|
+
export function isModelFile(file, location, sharedKernelDir) {
|
|
7
|
+
if (/\.(?:spec|test)\.ts$/.test(file)) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (location.area === 'context') {
|
|
11
|
+
return location.layer === 'domain';
|
|
12
|
+
}
|
|
13
|
+
return location.area === 'shared-kernel' && !file.startsWith(`${sharedKernelDir}/presentation/`);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=is-model-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-model-file.js","sourceRoot":"","sources":["../../../src/check/values/is-model-file.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAkB,EAAE,eAAuB;IACnF,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,gBAAgB,CAAC,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Location } from '../model/location.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where a value object is declared: `domain/value-objects/` of a context, or a `*.vo.ts` of the
|
|
4
|
+
* shared kernel outside its `presentation/`. Specs are never one.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isValueObjectFile(file: string, location: Location, sharedKernelDir: string): boolean;
|
|
7
|
+
//# sourceMappingURL=is-value-object-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-value-object-file.d.ts","sourceRoot":"","sources":["../../../src/check/values/is-value-object-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAYpG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a value object is declared: `domain/value-objects/` of a context, or a `*.vo.ts` of the
|
|
3
|
+
* shared kernel outside its `presentation/`. Specs are never one.
|
|
4
|
+
*/
|
|
5
|
+
export function isValueObjectFile(file, location, sharedKernelDir) {
|
|
6
|
+
if (/\.(?:spec|test)\.ts$/.test(file)) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (location.area === 'context') {
|
|
10
|
+
return location.layer === 'domain' && location.inside[0] === 'value-objects';
|
|
11
|
+
}
|
|
12
|
+
return (location.area === 'shared-kernel' && file.endsWith('.vo.ts') && !file.startsWith(`${sharedKernelDir}/presentation/`));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=is-value-object-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-value-object-file.js","sourceRoot":"","sources":["../../../src/check/values/is-value-object-file.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAkB,EAAE,eAAuB;IACzF,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC;IAC/E,CAAC;IAED,OAAO,CACL,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,gBAAgB,CAAC,CACrH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript-globals.d.ts","sourceRoot":"","sources":["../../../src/check/values/javascript-globals.ts"],"names":[],"mappings":"AAAA,yIAAyI;AACzI,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAmBjD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** What a call of the language itself builds: a number, a string, a date, never a value of the model. Same list as the ESLint plugin. */
|
|
2
|
+
export const JAVASCRIPT_GLOBALS = new Set([
|
|
3
|
+
'Array',
|
|
4
|
+
'BigInt',
|
|
5
|
+
'Boolean',
|
|
6
|
+
'Date',
|
|
7
|
+
'Intl',
|
|
8
|
+
'JSON',
|
|
9
|
+
'Map',
|
|
10
|
+
'Math',
|
|
11
|
+
'Number',
|
|
12
|
+
'Object',
|
|
13
|
+
'RegExp',
|
|
14
|
+
'Set',
|
|
15
|
+
'String',
|
|
16
|
+
'Symbol',
|
|
17
|
+
'URL',
|
|
18
|
+
'parseFloat',
|
|
19
|
+
'parseInt',
|
|
20
|
+
'structuredClone',
|
|
21
|
+
]);
|
|
22
|
+
//# sourceMappingURL=javascript-globals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript-globals.js","sourceRoot":"","sources":["../../../src/check/values/javascript-globals.ts"],"names":[],"mappings":"AAAA,yIAAyI;AACzI,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,YAAY;IACZ,UAAU;IACV,iBAAiB;CAClB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal-at.d.ts","sourceRoot":"","sources":["../../../src/check/values/literal-at.ts"],"names":[],"mappings":"AAAA,6IAA6I;AAC7I,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The offset of the `{` of an object literal the expression starting at `from` is, through its parentheses; undefined for anything else. */
|
|
2
|
+
export function literalAt(code, from) {
|
|
3
|
+
const opening = /^[\s(]*/.exec(code.slice(from))?.[0].length ?? 0;
|
|
4
|
+
const at = from + opening;
|
|
5
|
+
return code.charAt(at) === '{' ? at : undefined;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=literal-at.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal-at.js","sourceRoot":"","sources":["../../../src/check/values/literal-at.ts"],"names":[],"mappings":"AAAA,6IAA6I;AAC7I,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY;IAClD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC;IAE1B,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Exported } from '../exports/exported.js';
|
|
2
|
+
/**
|
|
3
|
+
* The declaration of a name at the top of a module, read as an export would be: a function with
|
|
4
|
+
* its body, a constant up to its `;`, a class only by its kind. Undefined when the module does
|
|
5
|
+
* not declare it there.
|
|
6
|
+
*/
|
|
7
|
+
export declare function localDeclaration(code: string, name: string): Exported | undefined;
|
|
8
|
+
//# sourceMappingURL=local-declaration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-declaration.d.ts","sourceRoot":"","sources":["../../../src/check/values/local-declaration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAMvD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA+BjF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { signatureAt } from '../structure/signature-at.js';
|
|
2
|
+
import { braceDepthAt } from '../text/brace-depth-at.js';
|
|
3
|
+
import { endAtDepthZero } from '../text/end-at-depth-zero.js';
|
|
4
|
+
import { escapeRegExp } from '../text/escape-reg-exp.js';
|
|
5
|
+
/**
|
|
6
|
+
* The declaration of a name at the top of a module, read as an export would be: a function with
|
|
7
|
+
* its body, a constant up to its `;`, a class only by its kind. Undefined when the module does
|
|
8
|
+
* not declare it there.
|
|
9
|
+
*/
|
|
10
|
+
export function localDeclaration(code, name) {
|
|
11
|
+
const pattern = new RegExp(`(?<![\\w$.])(?:(?:async\\s+)?(function)\\s*\\*?\\s*|(const|let|var)\\s+|(class)\\s+)${escapeRegExp(name)}(?![\\w$])`, 'g');
|
|
12
|
+
const match = [...code.matchAll(pattern)].find(({ index }) => braceDepthAt(code, index) === 0);
|
|
13
|
+
if (match === undefined) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const at = match.index;
|
|
17
|
+
const afterName = at + match[0].length;
|
|
18
|
+
const base = { name, line: 0 };
|
|
19
|
+
if (match[3] !== undefined) {
|
|
20
|
+
return { ...base, kind: 'class', text: '', signature: '' };
|
|
21
|
+
}
|
|
22
|
+
if (match[2] !== undefined) {
|
|
23
|
+
const text = code.slice(at, endAtDepthZero(code, afterName, ';'));
|
|
24
|
+
return { ...base, kind: 'const', text, signature: text };
|
|
25
|
+
}
|
|
26
|
+
const body = signatureAt(code, code.indexOf('(', afterName));
|
|
27
|
+
return body === undefined
|
|
28
|
+
? undefined
|
|
29
|
+
: { ...base, kind: 'function', text: code.slice(at, body.bodyClose + 1), signature: code.slice(at, body.bodyOpen) };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=local-declaration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-declaration.js","sourceRoot":"","sources":["../../../src/check/values/local-declaration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAY;IACzD,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,uFAAuF,YAAY,CAAC,IAAI,CAAC,YAAY,EACrH,GAAG,CACJ,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAE/B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAElE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7D,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACxH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** A stretch of code between two braces. */
|
|
2
|
+
export type Span = readonly [open: number, close: number];
|
|
3
|
+
/**
|
|
4
|
+
* The bodies of the functions written between `from` and `to`: block arrows, function
|
|
5
|
+
* expressions and declarations, and methods of the object literals and classes found there.
|
|
6
|
+
*/
|
|
7
|
+
export declare function nestedBodies(code: string, from: number, to: number): Span[];
|
|
8
|
+
//# sourceMappingURL=nested-bodies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nested-bodies.d.ts","sourceRoot":"","sources":["../../../src/check/values/nested-bodies.ts"],"names":[],"mappings":"AAGA,4CAA4C;AAC5C,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAS1D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,CAoB3E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { signatureAt } from '../structure/signature-at.js';
|
|
2
|
+
import { matchingBracket } from '../text/matching-bracket.js';
|
|
3
|
+
const ARROW = /=>\s*\{/g;
|
|
4
|
+
const FUNCTION = /(?<![\w$.])function\b[\s*]*(?:[\w$]+)?\s*(?:<[^()]*>)?\s*\(/g;
|
|
5
|
+
const METHOD = /(?<![\w$.])([A-Za-z_$][\w$]*)\s*(?:<[^()]*>)?\s*\(/g;
|
|
6
|
+
/** Words a parenthesis follows without starting a method: `if (..) {` is a block, not a body. */
|
|
7
|
+
const KEYWORDS = new Set(['if', 'for', 'while', 'switch', 'catch', 'with', 'return', 'function', 'typeof', 'await']);
|
|
8
|
+
/**
|
|
9
|
+
* The bodies of the functions written between `from` and `to`: block arrows, function
|
|
10
|
+
* expressions and declarations, and methods of the object literals and classes found there.
|
|
11
|
+
*/
|
|
12
|
+
export function nestedBodies(code, from, to) {
|
|
13
|
+
const within = (index) => index > from && index < to;
|
|
14
|
+
const arrows = [...code.matchAll(ARROW)]
|
|
15
|
+
.filter(({ index }) => within(index))
|
|
16
|
+
.map(({ index, 0: arrow }) => {
|
|
17
|
+
const open = index + arrow.length - 1;
|
|
18
|
+
return [open, matchingBracket(code, open)];
|
|
19
|
+
});
|
|
20
|
+
const functions = [...code.matchAll(FUNCTION), ...code.matchAll(METHOD)]
|
|
21
|
+
.filter((match) => within(match.index) && !KEYWORDS.has(match[1] ?? ''))
|
|
22
|
+
.flatMap((match) => {
|
|
23
|
+
const signature = signatureAt(code, match.index + match[0].length - 1);
|
|
24
|
+
return signature === undefined ? [] : [[signature.bodyOpen, signature.bodyClose]];
|
|
25
|
+
});
|
|
26
|
+
return [...arrows, ...functions];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=nested-bodies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nested-bodies.js","sourceRoot":"","sources":["../../../src/check/values/nested-bodies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAK9D,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,QAAQ,GAAG,8DAA8D,CAAC;AAChF,MAAM,MAAM,GAAG,qDAAqD,CAAC;AAErE,iGAAiG;AACjG,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAErH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,EAAU;IACjE,MAAM,MAAM,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;IAEtE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACrC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAQ,EAAE;QACjC,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEL,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SACvE,OAAO,CAAC,CAAC,KAAK,EAAU,EAAE;QACzB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvE,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AACnC,CAAC"}
|