@fyuld/pano 0.1.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.
Files changed (65) hide show
  1. package/dist/src/assessments/classes/index.d.ts +15 -0
  2. package/dist/src/assessments/classes/index.d.ts.map +1 -0
  3. package/dist/src/assessments/classes/index.js +112 -0
  4. package/dist/src/assessments/classes/index.js.map +1 -0
  5. package/dist/src/assessments/index-files/index.d.ts +13 -0
  6. package/dist/src/assessments/index-files/index.d.ts.map +1 -0
  7. package/dist/src/assessments/index-files/index.js +91 -0
  8. package/dist/src/assessments/index-files/index.js.map +1 -0
  9. package/dist/src/assessments/throws/index.d.ts +16 -0
  10. package/dist/src/assessments/throws/index.d.ts.map +1 -0
  11. package/dist/src/assessments/throws/index.js +110 -0
  12. package/dist/src/assessments/throws/index.js.map +1 -0
  13. package/dist/src/assessments/types/index.d.ts +14 -0
  14. package/dist/src/assessments/types/index.d.ts.map +1 -0
  15. package/dist/src/assessments/types/index.js +96 -0
  16. package/dist/src/assessments/types/index.js.map +1 -0
  17. package/dist/src/fitness-tests/barrel-purity/index.d.ts +11 -0
  18. package/dist/src/fitness-tests/barrel-purity/index.d.ts.map +1 -0
  19. package/dist/src/fitness-tests/barrel-purity/index.js +84 -0
  20. package/dist/src/fitness-tests/barrel-purity/index.js.map +1 -0
  21. package/dist/src/fitness-tests/datamodel-encapsulation/index.d.ts +10 -0
  22. package/dist/src/fitness-tests/datamodel-encapsulation/index.d.ts.map +1 -0
  23. package/dist/src/fitness-tests/datamodel-encapsulation/index.js +99 -0
  24. package/dist/src/fitness-tests/datamodel-encapsulation/index.js.map +1 -0
  25. package/dist/src/fitness-tests/error-factories/index.d.ts +17 -0
  26. package/dist/src/fitness-tests/error-factories/index.d.ts.map +1 -0
  27. package/dist/src/fitness-tests/error-factories/index.js +97 -0
  28. package/dist/src/fitness-tests/error-factories/index.js.map +1 -0
  29. package/dist/src/fitness-tests/unhelpful-errors/index.d.ts +11 -0
  30. package/dist/src/fitness-tests/unhelpful-errors/index.d.ts.map +1 -0
  31. package/dist/src/fitness-tests/unhelpful-errors/index.js +87 -0
  32. package/dist/src/fitness-tests/unhelpful-errors/index.js.map +1 -0
  33. package/dist/src/format.d.ts +3 -0
  34. package/dist/src/format.d.ts.map +1 -0
  35. package/dist/src/format.js +11 -0
  36. package/dist/src/format.js.map +1 -0
  37. package/dist/src/fpou-cli.d.ts +3 -0
  38. package/dist/src/fpou-cli.d.ts.map +1 -0
  39. package/dist/src/fpou-cli.js +235 -0
  40. package/dist/src/fpou-cli.js.map +1 -0
  41. package/dist/src/languages/gherkin/index.d.ts +2 -0
  42. package/dist/src/languages/gherkin/index.d.ts.map +1 -0
  43. package/dist/src/languages/gherkin/index.js +18 -0
  44. package/dist/src/languages/gherkin/index.js.map +1 -0
  45. package/dist/src/languages/gherkin/parser.d.ts +3 -0
  46. package/dist/src/languages/gherkin/parser.d.ts.map +1 -0
  47. package/dist/src/languages/gherkin/parser.js +11 -0
  48. package/dist/src/languages/gherkin/parser.js.map +1 -0
  49. package/dist/src/languages/typescript/comment-classification.d.ts +9 -0
  50. package/dist/src/languages/typescript/comment-classification.d.ts.map +1 -0
  51. package/dist/src/languages/typescript/comment-classification.js +45 -0
  52. package/dist/src/languages/typescript/comment-classification.js.map +1 -0
  53. package/dist/src/languages/typescript/comments.d.ts +12 -0
  54. package/dist/src/languages/typescript/comments.d.ts.map +1 -0
  55. package/dist/src/languages/typescript/comments.js +77 -0
  56. package/dist/src/languages/typescript/comments.js.map +1 -0
  57. package/dist/src/languages/typescript/index.d.ts +4 -0
  58. package/dist/src/languages/typescript/index.d.ts.map +1 -0
  59. package/dist/src/languages/typescript/index.js +20 -0
  60. package/dist/src/languages/typescript/index.js.map +1 -0
  61. package/dist/src/languages/typescript/parser.d.ts +4 -0
  62. package/dist/src/languages/typescript/parser.d.ts.map +1 -0
  63. package/dist/src/languages/typescript/parser.js +52 -0
  64. package/dist/src/languages/typescript/parser.js.map +1 -0
  65. package/package.json +51 -0
@@ -0,0 +1,15 @@
1
+ import { PlainTextFileFormats } from '@fyuld/ldm';
2
+ export type ConstructorVisibility = 'public' | 'private' | 'protected';
3
+ export type ClassEntry = {
4
+ file: string;
5
+ line: number;
6
+ name: string;
7
+ constructorVisibility?: ConstructorVisibility;
8
+ };
9
+ export type ClassesReport = {
10
+ classes: ClassEntry[];
11
+ };
12
+ export declare const runClassesAssessment: (files: string[], formats: PlainTextFileFormats[], outDir: string) => {
13
+ report: ClassesReport;
14
+ };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/assessments/classes/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGjD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;AAEtE,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB,CAAA;AA4ED,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EAAE,EACf,SAAS,oBAAoB,EAAE,EAC/B,QAAQ,MAAM,KACb;IAAE,MAAM,EAAE,aAAa,CAAA;CAUzB,CAAA"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runClassesAssessment = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const ts = __importStar(require("typescript"));
40
+ const typescript_1 = require("../../languages/typescript");
41
+ const visibilityFromConstructor = (cls) => {
42
+ for (const member of cls.members) {
43
+ if (!ts.isConstructorDeclaration(member))
44
+ continue;
45
+ const mods = ts.canHaveModifiers(member)
46
+ ? ts.getModifiers(member)
47
+ : undefined;
48
+ if (!mods)
49
+ return 'public';
50
+ for (const mod of mods) {
51
+ if (mod.kind === ts.SyntaxKind.PrivateKeyword)
52
+ return 'private';
53
+ if (mod.kind === ts.SyntaxKind.ProtectedKeyword)
54
+ return 'protected';
55
+ if (mod.kind === ts.SyntaxKind.PublicKeyword)
56
+ return 'public';
57
+ }
58
+ return 'public';
59
+ }
60
+ return undefined;
61
+ };
62
+ const collectClasses = (sourceFile, filePath) => {
63
+ const out = [];
64
+ const visit = (node) => {
65
+ if (ts.isClassDeclaration(node) && node.name) {
66
+ const line = sourceFile.getLineAndCharacterOfPosition(node.name.getStart(sourceFile))
67
+ .line + 1;
68
+ out.push({
69
+ file: filePath,
70
+ line,
71
+ name: node.name.text,
72
+ constructorVisibility: visibilityFromConstructor(node),
73
+ });
74
+ }
75
+ node.forEachChild(visit);
76
+ };
77
+ visit(sourceFile);
78
+ return out;
79
+ };
80
+ const renderJson = (report) => JSON.stringify(report, null, 2) + '\n';
81
+ const renderCsv = (classes) => [
82
+ 'name,file,line,constructorVisibility',
83
+ ...classes.map((c) => `${c.name},${c.file},${c.line},${c.constructorVisibility ?? ''}`),
84
+ ].join('\n') + '\n';
85
+ const writeReport = (report, formats, outDir) => {
86
+ fs.mkdirSync(outDir, { recursive: true });
87
+ for (const format of formats) {
88
+ const f = format;
89
+ if (f === 'Json') {
90
+ fs.writeFileSync(path.join(outDir, 'classes.json'), renderJson(report));
91
+ }
92
+ else if (f === 'Csv') {
93
+ fs.writeFileSync(path.join(outDir, 'classes.csv'), renderCsv(report.classes));
94
+ }
95
+ else {
96
+ throw new Error(`Unknown assessment format: ${f}`);
97
+ }
98
+ }
99
+ };
100
+ const runClassesAssessment = (files, formats, outDir) => {
101
+ const all = [];
102
+ for (const file of files) {
103
+ const source = fs.readFileSync(file, 'utf-8');
104
+ const sourceFile = (0, typescript_1.parseTypeScript)(source, file);
105
+ all.push(...collectClasses(sourceFile, path.relative(process.cwd(), file)));
106
+ }
107
+ const report = { classes: all };
108
+ writeReport(report, formats, outDir);
109
+ return { report };
110
+ };
111
+ exports.runClassesAssessment = runClassesAssessment;
112
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/assessments/classes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { PlainTextFileFormats } from '@fyuld/ldm';
2
+ export type IndexFileEntry = {
3
+ file: string;
4
+ impureStatementCount: number;
5
+ };
6
+ export type IndexFilesReport = {
7
+ totalIndexFiles: number;
8
+ violations: IndexFileEntry[];
9
+ };
10
+ export declare const runIndexFilesAssessment: (files: string[], formats: PlainTextFileFormats[], outDir: string) => {
11
+ report: IndexFilesReport;
12
+ };
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/assessments/index-files/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGjD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,oBAAoB,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,cAAc,EAAE,CAAA;CAC7B,CAAA;AA2CD,eAAO,MAAM,uBAAuB,GAClC,OAAO,MAAM,EAAE,EACf,SAAS,oBAAoB,EAAE,EAC/B,QAAQ,MAAM,KACb;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAmB5B,CAAA"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runIndexFilesAssessment = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const ts = __importStar(require("typescript"));
40
+ const typescript_1 = require("../../languages/typescript");
41
+ const countImpureStatements = (sourceFile) => {
42
+ let n = 0;
43
+ for (const stmt of sourceFile.statements) {
44
+ if (!ts.isExportDeclaration(stmt))
45
+ n++;
46
+ }
47
+ return n;
48
+ };
49
+ const renderJson = (report) => JSON.stringify(report, null, 2) + '\n';
50
+ const renderCsv = (entries) => [
51
+ 'file,impureStatementCount',
52
+ ...entries.map((e) => `${e.file},${e.impureStatementCount}`),
53
+ ].join('\n') + '\n';
54
+ const writeReport = (report, formats, outDir) => {
55
+ fs.mkdirSync(outDir, { recursive: true });
56
+ for (const format of formats) {
57
+ const f = format;
58
+ if (f === 'Json') {
59
+ fs.writeFileSync(path.join(outDir, 'index-files.json'), renderJson(report));
60
+ }
61
+ else if (f === 'Csv') {
62
+ fs.writeFileSync(path.join(outDir, 'index-files.csv'), renderCsv(report.violations));
63
+ }
64
+ else {
65
+ throw new Error(`Unknown assessment format: ${f}`);
66
+ }
67
+ }
68
+ };
69
+ const runIndexFilesAssessment = (files, formats, outDir) => {
70
+ const violations = [];
71
+ let totalIndexFiles = 0;
72
+ for (const file of files) {
73
+ if (path.basename(file) !== 'index.ts')
74
+ continue;
75
+ totalIndexFiles++;
76
+ const source = fs.readFileSync(file, 'utf-8');
77
+ const sourceFile = (0, typescript_1.parseTypeScript)(source, file);
78
+ const impureStatementCount = countImpureStatements(sourceFile);
79
+ if (impureStatementCount > 0) {
80
+ violations.push({
81
+ file: path.relative(process.cwd(), file),
82
+ impureStatementCount,
83
+ });
84
+ }
85
+ }
86
+ const report = { totalIndexFiles, violations };
87
+ writeReport(report, formats, outDir);
88
+ return { report };
89
+ };
90
+ exports.runIndexFilesAssessment = runIndexFilesAssessment;
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/assessments/index-files/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { PlainTextFileFormats } from '@fyuld/ldm';
2
+ export type ThrowKind = 'new' | 'literal' | 'rethrow' | 'other';
3
+ export type ThrowEntry = {
4
+ file: string;
5
+ line: number;
6
+ kind: ThrowKind;
7
+ className?: string;
8
+ };
9
+ export type ThrowsReport = {
10
+ totalThrows: number;
11
+ throws: ThrowEntry[];
12
+ };
13
+ export declare const runThrowsAssessment: (files: string[], formats: PlainTextFileFormats[], outDir: string) => {
14
+ report: ThrowsReport;
15
+ };
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/assessments/throws/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGjD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AA6ED,eAAO,MAAM,mBAAmB,GAC9B,OAAO,MAAM,EAAE,EACf,SAAS,oBAAoB,EAAE,EAC/B,QAAQ,MAAM,KACb;IAAE,MAAM,EAAE,YAAY,CAAA;CAUxB,CAAA"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runThrowsAssessment = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const ts = __importStar(require("typescript"));
40
+ const typescript_1 = require("../../languages/typescript");
41
+ const classifyThrow = (node) => {
42
+ const expr = node.expression;
43
+ if (ts.isNewExpression(expr)) {
44
+ let className;
45
+ if (ts.isIdentifier(expr.expression)) {
46
+ className = expr.expression.text;
47
+ }
48
+ else if (ts.isPropertyAccessExpression(expr.expression)) {
49
+ className = expr.expression.name.text;
50
+ }
51
+ return { kind: 'new', className };
52
+ }
53
+ if (ts.isIdentifier(expr))
54
+ return { kind: 'rethrow' };
55
+ if (ts.isStringLiteral(expr) ||
56
+ ts.isNumericLiteral(expr) ||
57
+ ts.isObjectLiteralExpression(expr) ||
58
+ ts.isNoSubstitutionTemplateLiteral(expr) ||
59
+ ts.isTemplateExpression(expr)) {
60
+ return { kind: 'literal' };
61
+ }
62
+ return { kind: 'other' };
63
+ };
64
+ const collectThrows = (sourceFile, filePath) => {
65
+ const out = [];
66
+ const visit = (node) => {
67
+ if (ts.isThrowStatement(node)) {
68
+ const { kind, className } = classifyThrow(node);
69
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))
70
+ .line + 1;
71
+ out.push({ file: filePath, line, kind, className });
72
+ }
73
+ node.forEachChild(visit);
74
+ };
75
+ visit(sourceFile);
76
+ return out;
77
+ };
78
+ const renderJson = (report) => JSON.stringify(report, null, 2) + '\n';
79
+ const renderCsv = (throws) => [
80
+ 'file,line,kind,className',
81
+ ...throws.map((t) => `${t.file},${t.line},${t.kind},${t.className ?? ''}`),
82
+ ].join('\n') + '\n';
83
+ const writeReport = (report, formats, outDir) => {
84
+ fs.mkdirSync(outDir, { recursive: true });
85
+ for (const format of formats) {
86
+ const f = format;
87
+ if (f === 'Json') {
88
+ fs.writeFileSync(path.join(outDir, 'throws.json'), renderJson(report));
89
+ }
90
+ else if (f === 'Csv') {
91
+ fs.writeFileSync(path.join(outDir, 'throws.csv'), renderCsv(report.throws));
92
+ }
93
+ else {
94
+ throw new Error(`Unknown assessment format: ${f}`);
95
+ }
96
+ }
97
+ };
98
+ const runThrowsAssessment = (files, formats, outDir) => {
99
+ const all = [];
100
+ for (const file of files) {
101
+ const source = fs.readFileSync(file, 'utf-8');
102
+ const sourceFile = (0, typescript_1.parseTypeScript)(source, file);
103
+ all.push(...collectThrows(sourceFile, path.relative(process.cwd(), file)));
104
+ }
105
+ const report = { totalThrows: all.length, throws: all };
106
+ writeReport(report, formats, outDir);
107
+ return { report };
108
+ };
109
+ exports.runThrowsAssessment = runThrowsAssessment;
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/assessments/throws/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import * as ts from 'typescript';
2
+ import { PlainTextFileFormats } from '@fyuld/ldm';
3
+ export type TypeKind = 'enum' | 'type' | 'union' | 'class' | 'interface' | 'function';
4
+ export type TypeEntry = {
5
+ name: string;
6
+ file: string;
7
+ line: number;
8
+ kind: TypeKind;
9
+ };
10
+ export declare const collectTypes: (sourceFile: ts.SourceFile, filePath: string) => TypeEntry[];
11
+ export declare const runTypesAssessment: (files: string[], formats: PlainTextFileFormats[], outDir: string) => {
12
+ entries: TypeEntry[];
13
+ };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/assessments/types/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGjD,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,WAAW,GACX,UAAU,CAAA;AAEd,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,eAAO,MAAM,YAAY,GACvB,YAAY,EAAE,CAAC,UAAU,EACzB,UAAU,MAAM,KACf,SAAS,EAmBX,CAAA;AAgCD,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,EAAE,EACf,SAAS,oBAAoB,EAAE,EAC/B,QAAQ,MAAM,KACb;IAAE,OAAO,EAAE,SAAS,EAAE,CAAA;CAWxB,CAAA"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runTypesAssessment = exports.collectTypes = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const ts = __importStar(require("typescript"));
40
+ const typescript_1 = require("../../languages/typescript");
41
+ const collectTypes = (sourceFile, filePath) => {
42
+ const out = [];
43
+ const push = (name, kind) => {
44
+ const startPos = name.getStart(sourceFile);
45
+ const line = sourceFile.getLineAndCharacterOfPosition(startPos).line + 1;
46
+ out.push({ name: name.text, file: filePath, line, kind });
47
+ };
48
+ const visit = (node) => {
49
+ if (ts.isEnumDeclaration(node))
50
+ push(node.name, 'enum');
51
+ else if (ts.isTypeAliasDeclaration(node))
52
+ push(node.name, ts.isUnionTypeNode(node.type) ? 'union' : 'type');
53
+ else if (ts.isClassDeclaration(node) && node.name)
54
+ push(node.name, 'class');
55
+ else if (ts.isInterfaceDeclaration(node))
56
+ push(node.name, 'interface');
57
+ else if (ts.isFunctionDeclaration(node) && node.name)
58
+ push(node.name, 'function');
59
+ node.forEachChild(visit);
60
+ };
61
+ visit(sourceFile);
62
+ return out;
63
+ };
64
+ exports.collectTypes = collectTypes;
65
+ const renderTypesJson = (entries) => JSON.stringify(entries, null, 2) + '\n';
66
+ const renderTypesCsv = (entries) => [
67
+ 'name,file,line,kind',
68
+ ...entries.map((e) => `${e.name},${e.file},${e.line},${e.kind}`),
69
+ ].join('\n') + '\n';
70
+ const writeTypeReport = (entries, formats, outDir) => {
71
+ fs.mkdirSync(outDir, { recursive: true });
72
+ for (const format of formats) {
73
+ const f = format;
74
+ if (f === 'Json') {
75
+ fs.writeFileSync(path.join(outDir, 'types.json'), renderTypesJson(entries));
76
+ }
77
+ else if (f === 'Csv') {
78
+ fs.writeFileSync(path.join(outDir, 'types.csv'), renderTypesCsv(entries));
79
+ }
80
+ else {
81
+ throw new Error(`Unknown assessment format: ${f}`);
82
+ }
83
+ }
84
+ };
85
+ const runTypesAssessment = (files, formats, outDir) => {
86
+ const entries = [];
87
+ for (const file of files) {
88
+ const source = fs.readFileSync(file, 'utf-8');
89
+ const sourceFile = (0, typescript_1.parseTypeScript)(source, file);
90
+ entries.push(...(0, exports.collectTypes)(sourceFile, path.relative(process.cwd(), file)));
91
+ }
92
+ writeTypeReport(entries, formats, outDir);
93
+ return { entries };
94
+ };
95
+ exports.runTypesAssessment = runTypesAssessment;
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/assessments/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BarrelPurityCriterion, Criterion } from '@fyuld/pandm';
2
+ import { IndexFileEntry } from '../../assessments/index-files';
3
+ export type BarrelPurityResult = {
4
+ absoluteScore: number;
5
+ proportionalScore: number;
6
+ rendered: string;
7
+ violations: IndexFileEntry[];
8
+ };
9
+ export declare const runBarrelPurity: (criterion: BarrelPurityCriterion, indexFilesJson: string, objectiveMarkdown?: string) => BarrelPurityResult;
10
+ export declare const isBarrelPurityCriterion: (c: Criterion) => c is BarrelPurityCriterion;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fitness-tests/barrel-purity/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAiB,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAoB,MAAM,+BAA+B,CAAA;AAGhF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,cAAc,EAAE,CAAA;CAC7B,CAAA;AA0CD,eAAO,MAAM,eAAe,GAC1B,WAAW,qBAAqB,EAChC,gBAAgB,MAAM,EACtB,oBAAoB,MAAM,KACzB,kBAsBF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,GAAG,SAAS,KACX,CAAC,IAAI,qBAA8D,CAAA"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isBarrelPurityCriterion = exports.runBarrelPurity = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const pandm_1 = require("@fyuld/pandm");
40
+ const format_1 = require("../../format");
41
+ const isInExemptedDirectory = (filePath, dirs) => {
42
+ const normalized = filePath.split(path.sep).join('/');
43
+ return dirs.some((d) => {
44
+ const dn = d.replace(/^\.\//, '').replace(/\/$/, '');
45
+ return normalized === dn || normalized.startsWith(`${dn}/`);
46
+ });
47
+ };
48
+ const interpolate = (template, vars) => template.replace(/\{\{(\w+)\}\}/g, (_, key) => vars[key] ?? `{{${key}}}`);
49
+ const render = (criterion, violations, proportionalScore, objectiveMarkdown) => {
50
+ const detailsRendered = interpolate(criterion.details, {});
51
+ const lines = [];
52
+ lines.push((0, format_1.styled)('30;47', criterion.title));
53
+ lines.push(detailsRendered);
54
+ if (objectiveMarkdown) {
55
+ lines.push('');
56
+ lines.push(objectiveMarkdown.trimEnd());
57
+ }
58
+ lines.push('');
59
+ lines.push(`Found ${violations.length} impure barrel file${violations.length === 1 ? '' : 's'}:`);
60
+ for (const v of violations) {
61
+ lines.push(` - ${v.file} (${v.impureStatementCount} impure statement${v.impureStatementCount === 1 ? '' : 's'})`);
62
+ }
63
+ lines.push('');
64
+ lines.push(`Absolute Score: ${violations.length}`);
65
+ lines.push(`Proportional Score: ${(proportionalScore * 100).toFixed(2)}%`);
66
+ return lines.join('\n');
67
+ };
68
+ const runBarrelPurity = (criterion, indexFilesJson, objectiveMarkdown) => {
69
+ const report = JSON.parse(fs.readFileSync(indexFilesJson, 'utf-8'));
70
+ const violations = report.violations.filter((e) => !isInExemptedDirectory(e.file, criterion.exemptedDirectories));
71
+ const proportionalScore = report.totalIndexFiles === 0
72
+ ? 0
73
+ : violations.length / report.totalIndexFiles;
74
+ return {
75
+ absoluteScore: violations.length,
76
+ proportionalScore,
77
+ rendered: render(criterion, violations, proportionalScore, objectiveMarkdown),
78
+ violations,
79
+ };
80
+ };
81
+ exports.runBarrelPurity = runBarrelPurity;
82
+ const isBarrelPurityCriterion = (c) => c.kind === pandm_1.CriterionKind.BarrelPurity;
83
+ exports.isBarrelPurityCriterion = isBarrelPurityCriterion;
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fitness-tests/barrel-purity/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Criterion, DatamodelEncapsulationCriterion } from '@fyuld/pandm';
2
+ import { TypeEntry } from '../../assessments/types';
3
+ export type DatamodelEncapsulationResult = {
4
+ absoluteScore: number;
5
+ rendered: string;
6
+ violations: TypeEntry[];
7
+ };
8
+ export declare const runDatamodelEncapsulation: (criterion: DatamodelEncapsulationCriterion, typesFile: string, objectiveMarkdown?: string) => DatamodelEncapsulationResult;
9
+ export declare const isDatamodelEncapsulationCriterion: (c: Criterion) => c is DatamodelEncapsulationCriterion;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fitness-tests/datamodel-encapsulation/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EAET,+BAA+B,EAEhC,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGnD,MAAM,MAAM,4BAA4B,GAAG;IACzC,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,SAAS,EAAE,CAAA;CACxB,CAAA;AAuDD,eAAO,MAAM,yBAAyB,GACpC,WAAW,+BAA+B,EAC1C,WAAW,MAAM,EACjB,oBAAoB,MAAM,KACzB,4BAeF,CAAA;AAED,eAAO,MAAM,iCAAiC,GAC5C,GAAG,SAAS,KACX,CAAC,IAAI,+BACyC,CAAA"}