@xanahlight/component-forge 1.4.0 → 1.5.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 (36) hide show
  1. package/dist/commands/check/index.d.ts +15 -0
  2. package/dist/commands/check/index.js +73 -4
  3. package/dist/commands/check/index.js.map +1 -1
  4. package/dist/index.js +54 -2
  5. package/dist/index.js.map +1 -1
  6. package/package.json +2 -2
  7. package/dist/commands/check/check.test.d.ts +0 -1
  8. package/dist/commands/check/check.test.js +0 -151
  9. package/dist/commands/check/check.test.js.map +0 -1
  10. package/dist/commands/explain/explain.test.d.ts +0 -1
  11. package/dist/commands/explain/explain.test.js +0 -57
  12. package/dist/commands/explain/explain.test.js.map +0 -1
  13. package/dist/commands/generate.d.ts +0 -6
  14. package/dist/commands/generate.js +0 -91
  15. package/dist/commands/generate.js.map +0 -1
  16. package/dist/commands/init.d.ts +0 -10
  17. package/dist/commands/init.js +0 -54
  18. package/dist/commands/init.js.map +0 -1
  19. package/dist/commands/migrate/migrate.test.d.ts +0 -1
  20. package/dist/commands/migrate/migrate.test.js +0 -176
  21. package/dist/commands/migrate/migrate.test.js.map +0 -1
  22. package/dist/commands/validate/validate.test.d.ts +0 -1
  23. package/dist/commands/validate/validate.test.js +0 -163
  24. package/dist/commands/validate/validate.test.js.map +0 -1
  25. package/dist/commands/validate.d.ts +0 -1
  26. package/dist/commands/validate.js +0 -119
  27. package/dist/commands/validate.js.map +0 -1
  28. package/dist/templates/files.test.d.ts +0 -1
  29. package/dist/templates/files.test.js +0 -174
  30. package/dist/templates/files.test.js.map +0 -1
  31. package/dist/utils/config.test.d.ts +0 -1
  32. package/dist/utils/config.test.js +0 -117
  33. package/dist/utils/config.test.js.map +0 -1
  34. package/dist/utils/template-resolver.test.d.ts +0 -1
  35. package/dist/utils/template-resolver.test.js +0 -86
  36. package/dist/utils/template-resolver.test.js.map +0 -1
@@ -1,91 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateCommand = generateCommand;
7
- const fs_extra_1 = __importDefault(require("fs-extra"));
8
- const node_path_1 = __importDefault(require("node:path"));
9
- const config_1 = require("../utils/config");
10
- const logger_1 = require("../utils/logger");
11
- const template_resolver_1 = require("../utils/template-resolver");
12
- const placementByArchitecture = {
13
- fsd: {
14
- feature: 'features',
15
- entity: 'entities',
16
- widget: 'widgets',
17
- page: 'pages',
18
- component: 'shared/ui',
19
- },
20
- modular: {
21
- module: 'modules',
22
- component: 'shared/ui',
23
- },
24
- };
25
- // ---------------------------------------------------------------------------
26
- // Path resolution
27
- // ---------------------------------------------------------------------------
28
- /**
29
- * Resolves the absolute path for the slice being generated.
30
- * Supports nested names like "forms/Input" → src/shared/ui/forms/Input
31
- */
32
- function resolveSlicePath(config, sliceType, sliceName) {
33
- const placement = placementByArchitecture[config.architecture][sliceType];
34
- if (!placement) {
35
- const available = Object.keys(placementByArchitecture[config.architecture]).join(', ');
36
- logger_1.logger.error(`Slice type "${sliceType}" is not supported for ${config.architecture} architecture.`);
37
- logger_1.logger.info(`Available types for ${config.architecture}: ${available}`);
38
- process.exit(1);
39
- }
40
- return node_path_1.default.join(process.cwd(), config.srcDir, placement, sliceName);
41
- }
42
- // ---------------------------------------------------------------------------
43
- // File I/O
44
- // ---------------------------------------------------------------------------
45
- function writeFile(filePath, content) {
46
- fs_extra_1.default.ensureDirSync(node_path_1.default.dirname(filePath));
47
- fs_extra_1.default.writeFileSync(filePath, content);
48
- logger_1.logger.success(`Created: ${node_path_1.default.relative(process.cwd(), filePath)}`);
49
- }
50
- function printDryRun(filePath) {
51
- logger_1.logger.info(`Would create: ${node_path_1.default.relative(process.cwd(), filePath)}`);
52
- }
53
- function generateCommand(sliceType, sliceName, options = {}) {
54
- const { dryRun = false } = options;
55
- const config = (0, config_1.loadProjectConfig)();
56
- const slicePath = resolveSlicePath(config, sliceType, sliceName);
57
- if (!dryRun && fs_extra_1.default.existsSync(slicePath)) {
58
- logger_1.logger.error(`Already exists: ${node_path_1.default.relative(process.cwd(), slicePath)}`);
59
- process.exit(1);
60
- }
61
- // Resolve templates directory (absolute path) if configured
62
- const templatesDir = config.templates
63
- ? node_path_1.default.resolve(process.cwd(), config.templates)
64
- : undefined;
65
- // Derive the bare name for use in templates (e.g. "forms/Input" → "Input")
66
- const sliceBaseName = node_path_1.default.basename(sliceName);
67
- const files = (0, template_resolver_1.resolveSliceFiles)(sliceType, sliceBaseName, templatesDir);
68
- if (dryRun) {
69
- logger_1.logger.info(`Dry run — no files will be written.\n`);
70
- printDryRun(slicePath + '/');
71
- for (const relativePath of Object.keys(files)) {
72
- printDryRun(node_path_1.default.join(slicePath, relativePath));
73
- }
74
- logger_1.logger.info(`\nDry run complete. Run without --dry-run to generate.`);
75
- return;
76
- }
77
- // Create slice root
78
- fs_extra_1.default.ensureDirSync(slicePath);
79
- logger_1.logger.success(`Created: ${node_path_1.default.relative(process.cwd(), slicePath)}`);
80
- // Write files from templates
81
- for (const [relativePath, content] of Object.entries(files)) {
82
- writeFile(node_path_1.default.join(slicePath, relativePath), content);
83
- }
84
- if (templatesDir) {
85
- logger_1.logger.info(`Generated ${sliceType} "${sliceName}" successfully (custom templates).`);
86
- }
87
- else {
88
- logger_1.logger.info(`Generated ${sliceType} "${sliceName}" successfully.`);
89
- }
90
- }
91
- //# sourceMappingURL=generate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import { Architecture } from '../types/folder-tree';
2
- import { CONFIG_FILENAME, loadProjectConfig } from '../utils/config';
3
- export { Architecture };
4
- export { CONFIG_FILENAME };
5
- /**
6
- * Initialises the project folder structure for the given architecture
7
- * and writes .component-forge.json so subsequent commands know the architecture.
8
- */
9
- export declare function initCommand(architecture: Architecture): void;
10
- export { loadProjectConfig };
@@ -1,54 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.loadProjectConfig = exports.CONFIG_FILENAME = void 0;
7
- exports.initCommand = initCommand;
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
- const node_path_1 = __importDefault(require("node:path"));
10
- const fsd_1 = require("../templates/fsd");
11
- const modular_1 = require("../templates/modular");
12
- const config_1 = require("../utils/config");
13
- Object.defineProperty(exports, "CONFIG_FILENAME", { enumerable: true, get: function () { return config_1.CONFIG_FILENAME; } });
14
- Object.defineProperty(exports, "loadProjectConfig", { enumerable: true, get: function () { return config_1.loadProjectConfig; } });
15
- const logger_1 = require("../utils/logger");
16
- /**
17
- * Template registry — maps architecture → folder tree definition
18
- */
19
- const templates = {
20
- fsd: fsd_1.fsdTemplate,
21
- modular: modular_1.modularTemplate,
22
- };
23
- /**
24
- * Recursively creates folder structure from a FolderTree definition
25
- */
26
- function createStructure(tree, basePath) {
27
- for (const [folderName, children] of Object.entries(tree)) {
28
- const folderPath = node_path_1.default.join(basePath, folderName);
29
- fs_extra_1.default.ensureDirSync(folderPath);
30
- logger_1.logger.success(`Created: ${node_path_1.default.relative(process.cwd(), folderPath)}`);
31
- createStructure(children, folderPath);
32
- }
33
- }
34
- /**
35
- * Initialises the project folder structure for the given architecture
36
- * and writes .component-forge.json so subsequent commands know the architecture.
37
- */
38
- function initCommand(architecture) {
39
- const template = templates[architecture];
40
- const projectRoot = process.cwd();
41
- const configPath = node_path_1.default.join(projectRoot, config_1.CONFIG_FILENAME);
42
- if (fs_extra_1.default.existsSync(configPath)) {
43
- logger_1.logger.error(`Project already initialised (${config_1.CONFIG_FILENAME} exists).`);
44
- logger_1.logger.info('Remove it manually if you want to reinitialise.');
45
- process.exit(1);
46
- }
47
- logger_1.logger.info(`Initialising ${architecture.toUpperCase()} architecture…`);
48
- createStructure(template, projectRoot);
49
- const config = { architecture, srcDir: 'src' };
50
- (0, config_1.writeProjectConfig)(config, projectRoot);
51
- logger_1.logger.success(`Created: ${config_1.CONFIG_FILENAME}`);
52
- logger_1.logger.success('Project structure successfully created.');
53
- }
54
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;AAyCA,kCAoBC;AA7DD,wDAAyB;AACzB,0DAA4B;AAE5B,0CAA8C;AAC9C,kDAAsD;AAEtD,4CAAwF;AAO/E,gGAPA,wBAAe,OAOA;AAmDf,kGA1DiB,0BAAiB,OA0DjB;AAzD1B,4CAAwC;AAQxC;;GAEG;AACH,MAAM,SAAS,GAAqC;IAClD,GAAG,EAAE,iBAAW;IAChB,OAAO,EAAE,yBAAe;CACzB,CAAA;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAgB,EAAE,QAAgB;IACzD,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QAElD,kBAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QAC5B,eAAM,CAAC,OAAO,CAAC,YAAY,mBAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;QAEtE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACvC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,YAA0B;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,CAAA;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACjC,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,wBAAe,CAAC,CAAA;IAE1D,IAAI,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,eAAM,CAAC,KAAK,CAAC,gCAAgC,wBAAe,WAAW,CAAC,CAAA;QACxE,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,gBAAgB,YAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IAEvE,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAEtC,MAAM,MAAM,GAAkB,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC7D,IAAA,2BAAkB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACvC,eAAM,CAAC,OAAO,CAAC,YAAY,wBAAe,EAAE,CAAC,CAAA;IAE7C,eAAM,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAA;AAC3D,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,176 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_os_1 = __importDefault(require("node:os"));
7
- const node_path_1 = __importDefault(require("node:path"));
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
- const vitest_1 = require("vitest");
10
- const index_1 = require("./index");
11
- // ---------------------------------------------------------------------------
12
- // Helpers
13
- // ---------------------------------------------------------------------------
14
- let tmpDir;
15
- function mkdir(relPath) {
16
- fs_extra_1.default.ensureDirSync(node_path_1.default.join(tmpDir, relPath));
17
- }
18
- (0, vitest_1.beforeEach)(() => {
19
- tmpDir = fs_extra_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'cf-migrate-'));
20
- });
21
- (0, vitest_1.afterEach)(() => {
22
- fs_extra_1.default.removeSync(tmpDir);
23
- });
24
- // ---------------------------------------------------------------------------
25
- // scanTopLevelDirs
26
- // ---------------------------------------------------------------------------
27
- (0, vitest_1.describe)('scanTopLevelDirs', () => {
28
- (0, vitest_1.it)('returns only directory names, not files', () => {
29
- mkdir('components');
30
- mkdir('utils');
31
- fs_extra_1.default.writeFileSync(node_path_1.default.join(tmpDir, 'index.ts'), '');
32
- const dirs = (0, index_1.scanTopLevelDirs)(tmpDir);
33
- (0, vitest_1.expect)(dirs).toContain('components');
34
- (0, vitest_1.expect)(dirs).toContain('utils');
35
- (0, vitest_1.expect)(dirs).not.toContain('index.ts');
36
- });
37
- (0, vitest_1.it)('returns empty array for non-existent path', () => {
38
- (0, vitest_1.expect)((0, index_1.scanTopLevelDirs)('/non/existent/path')).toEqual([]);
39
- });
40
- (0, vitest_1.it)('returns empty array for empty directory', () => {
41
- (0, vitest_1.expect)((0, index_1.scanTopLevelDirs)(tmpDir)).toEqual([]);
42
- });
43
- });
44
- // ---------------------------------------------------------------------------
45
- // classifyDir
46
- // ---------------------------------------------------------------------------
47
- (0, vitest_1.describe)('classifyDir', () => {
48
- (0, vitest_1.it)('classifies "components" as shared/ui', () => {
49
- const result = (0, index_1.classifyDir)('components');
50
- (0, vitest_1.expect)(result).not.toBeNull();
51
- (0, vitest_1.expect)(result.layer).toBe('shared');
52
- (0, vitest_1.expect)(result.subdir).toBe('ui');
53
- });
54
- (0, vitest_1.it)('classifies "utils" as shared', () => {
55
- const result = (0, index_1.classifyDir)('utils');
56
- (0, vitest_1.expect)(result).not.toBeNull();
57
- (0, vitest_1.expect)(result.layer).toBe('shared');
58
- });
59
- (0, vitest_1.it)('classifies "pages" as pages', () => {
60
- const result = (0, index_1.classifyDir)('pages');
61
- (0, vitest_1.expect)(result).not.toBeNull();
62
- (0, vitest_1.expect)(result.layer).toBe('pages');
63
- });
64
- (0, vitest_1.it)('classifies "views" as pages', () => {
65
- const result = (0, index_1.classifyDir)('views');
66
- (0, vitest_1.expect)(result).not.toBeNull();
67
- (0, vitest_1.expect)(result.layer).toBe('pages');
68
- });
69
- (0, vitest_1.it)('classifies "store" as app', () => {
70
- const result = (0, index_1.classifyDir)('store');
71
- (0, vitest_1.expect)(result).not.toBeNull();
72
- (0, vitest_1.expect)(result.layer).toBe('app');
73
- });
74
- (0, vitest_1.it)('classifies "api" as shared/api', () => {
75
- const result = (0, index_1.classifyDir)('api');
76
- (0, vitest_1.expect)(result).not.toBeNull();
77
- (0, vitest_1.expect)(result.layer).toBe('shared');
78
- (0, vitest_1.expect)(result.subdir).toBe('api');
79
- });
80
- (0, vitest_1.it)('classifies "hooks" as shared/hooks', () => {
81
- const result = (0, index_1.classifyDir)('hooks');
82
- (0, vitest_1.expect)(result).not.toBeNull();
83
- (0, vitest_1.expect)(result.layer).toBe('shared');
84
- (0, vitest_1.expect)(result.subdir).toBe('hooks');
85
- });
86
- (0, vitest_1.it)('returns null for unrecognised directory', () => {
87
- (0, vitest_1.expect)((0, index_1.classifyDir)('my-weird-custom-dir')).toBeNull();
88
- });
89
- });
90
- // ---------------------------------------------------------------------------
91
- // buildMigrationPlan — FSD target
92
- // ---------------------------------------------------------------------------
93
- (0, vitest_1.describe)('buildMigrationPlan → fsd', () => {
94
- (0, vitest_1.it)('proposes moves for standard React project structure', () => {
95
- mkdir('components');
96
- mkdir('pages');
97
- mkdir('utils');
98
- mkdir('api');
99
- mkdir('hooks');
100
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'fsd');
101
- // pages is already an FSD layer — should be skipped
102
- const froms = plan.proposals.map((p) => p.from);
103
- (0, vitest_1.expect)(froms).not.toContain('pages');
104
- // components, utils, api, hooks should get proposals
105
- (0, vitest_1.expect)(froms).toContain('components');
106
- (0, vitest_1.expect)(froms).toContain('utils');
107
- (0, vitest_1.expect)(froms).toContain('api');
108
- (0, vitest_1.expect)(froms).toContain('hooks');
109
- });
110
- (0, vitest_1.it)('skips directories already in correct FSD layers', () => {
111
- mkdir('features');
112
- mkdir('entities');
113
- mkdir('shared');
114
- mkdir('widgets');
115
- mkdir('pages');
116
- mkdir('app');
117
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'fsd');
118
- (0, vitest_1.expect)(plan.proposals).toHaveLength(0);
119
- });
120
- (0, vitest_1.it)('puts unrecognised dirs in unknownFiles', () => {
121
- mkdir('super-weird-module');
122
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'fsd');
123
- (0, vitest_1.expect)(plan.unknownFiles).toContain('super-weird-module');
124
- (0, vitest_1.expect)(plan.proposals).toHaveLength(0);
125
- });
126
- (0, vitest_1.it)('proposal has correct from/to/reason shape', () => {
127
- mkdir('components');
128
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'fsd');
129
- const proposal = plan.proposals.find((p) => p.from === 'components');
130
- (0, vitest_1.expect)(proposal).toBeDefined();
131
- (0, vitest_1.expect)(proposal.to).toContain('shared');
132
- (0, vitest_1.expect)(proposal.to).toContain('ui');
133
- (0, vitest_1.expect)(proposal.reason).toContain('shared');
134
- });
135
- (0, vitest_1.it)('summary reflects proposal count', () => {
136
- mkdir('components');
137
- mkdir('utils');
138
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'fsd');
139
- (0, vitest_1.expect)(plan.summary).toMatch(/\d+ director/);
140
- });
141
- (0, vitest_1.it)('summary says no changes when already FSD', () => {
142
- mkdir('features');
143
- mkdir('shared');
144
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'fsd');
145
- (0, vitest_1.expect)(plan.summary).toContain('No changes needed');
146
- });
147
- });
148
- // ---------------------------------------------------------------------------
149
- // buildMigrationPlan — modular target
150
- // ---------------------------------------------------------------------------
151
- (0, vitest_1.describe)('buildMigrationPlan → modular', () => {
152
- (0, vitest_1.it)('wraps unknown dirs as modules/', () => {
153
- mkdir('auth');
154
- mkdir('cart');
155
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'modular');
156
- const froms = plan.proposals.map((p) => p.from);
157
- (0, vitest_1.expect)(froms).toContain('auth');
158
- (0, vitest_1.expect)(froms).toContain('cart');
159
- const authProp = plan.proposals.find((p) => p.from === 'auth');
160
- (0, vitest_1.expect)(authProp.to).toMatch(/^modules/);
161
- });
162
- (0, vitest_1.it)('puts utils-like dirs under shared/', () => {
163
- mkdir('utils');
164
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'modular');
165
- const utilsProp = plan.proposals.find((p) => p.from === 'utils');
166
- (0, vitest_1.expect)(utilsProp.to).toMatch(/^shared/);
167
- });
168
- (0, vitest_1.it)('skips already-correct modular dirs', () => {
169
- mkdir('modules');
170
- mkdir('shared');
171
- mkdir('core');
172
- const plan = (0, index_1.buildMigrationPlan)(tmpDir, 'modular');
173
- (0, vitest_1.expect)(plan.proposals).toHaveLength(0);
174
- });
175
- });
176
- //# sourceMappingURL=migrate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../../src/commands/migrate/migrate.test.ts"],"names":[],"mappings":";;;;;AAAA,sDAAwB;AACxB,0DAA4B;AAE5B,wDAAyB;AACzB,mCAAoE;AAEpE,mCAA2E;AAE3E,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,IAAI,MAAc,CAAA;AAElB,SAAS,KAAK,CAAC,OAAe;IAC5B,kBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,IAAA,mBAAU,EAAC,GAAG,EAAE;IACd,MAAM,GAAG,kBAAE,CAAC,WAAW,CAAC,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;AAChE,CAAC,CAAC,CAAA;AAEF,IAAA,kBAAS,EAAC,GAAG,EAAE;IACb,kBAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,KAAK,CAAC,YAAY,CAAC,CAAA;QACnB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,kBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;QAEnD,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC,MAAM,CAAC,CAAA;QACrC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,IAAA,wBAAgB,EAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,eAAM,EAAC,IAAA,wBAAgB,EAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,YAAY,CAAC,CAAA;QACxC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAA,eAAM,EAAC,MAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAA;QACjC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAA,eAAM,EAAC,MAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAA,eAAM,EAAC,MAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAA,eAAM,EAAC,MAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,eAAM,EAAC,IAAA,mBAAW,EAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACvD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,KAAK,CAAC,YAAY,CAAC,CAAA;QACnB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,KAAK,CAAC,KAAK,CAAC,CAAA;QACZ,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAE9C,oDAAoD;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAEpC,qDAAqD;QACrD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACrC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,KAAK,CAAC,UAAU,CAAC,CAAA;QACjB,KAAK,CAAC,UAAU,CAAC,CAAA;QACjB,KAAK,CAAC,QAAQ,CAAC,CAAA;QACf,KAAK,CAAC,SAAS,CAAC,CAAA;QAChB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,KAAK,CAAC,KAAK,CAAC,CAAA;QAEZ,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,IAAA,eAAM,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAE3B,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,IAAA,eAAM,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QACzD,IAAA,eAAM,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,KAAK,CAAC,YAAY,CAAC,CAAA;QAEnB,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAE,CAAA;QAErE,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9B,IAAA,eAAM,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAA,eAAM,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACnC,IAAA,eAAM,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,KAAK,CAAC,YAAY,CAAC,CAAA;QACnB,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,IAAA,eAAM,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,CAAC,UAAU,CAAC,CAAA;QACjB,KAAK,CAAC,QAAQ,CAAC,CAAA;QAEf,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC9C,IAAA,eAAM,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,KAAK,CAAC,MAAM,CAAC,CAAA;QACb,KAAK,CAAC,MAAM,CAAC,CAAA;QAEb,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAC/B,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAE,CAAA;QAC/D,IAAA,eAAM,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAE,CAAA;QACjE,IAAA,eAAM,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,KAAK,CAAC,SAAS,CAAC,CAAA;QAChB,KAAK,CAAC,QAAQ,CAAC,CAAA;QACf,KAAK,CAAC,MAAM,CAAC,CAAA;QAEb,MAAM,IAAI,GAAG,IAAA,0BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAClD,IAAA,eAAM,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,163 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_os_1 = __importDefault(require("node:os"));
7
- const node_path_1 = __importDefault(require("node:path"));
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
- const vitest_1 = require("vitest");
10
- const index_1 = require("./index");
11
- // ---------------------------------------------------------------------------
12
- // Shared layer rule fixtures
13
- // ---------------------------------------------------------------------------
14
- const fsdRule = {
15
- required: ['app', 'shared'],
16
- allowed: ['app', 'processes', 'pages', 'widgets', 'features', 'entities', 'shared'],
17
- };
18
- const modularRule = {
19
- required: ['shared', 'core'],
20
- allowed: ['modules', 'shared', 'core'],
21
- };
22
- // ---------------------------------------------------------------------------
23
- // Helpers
24
- // ---------------------------------------------------------------------------
25
- function makeTempDir() {
26
- return fs_extra_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'cf-validate-test-'));
27
- }
28
- function mkdir(base, ...segments) {
29
- const p = node_path_1.default.join(base, ...segments);
30
- fs_extra_1.default.ensureDirSync(p);
31
- return p;
32
- }
33
- function touch(base, ...segments) {
34
- const p = node_path_1.default.join(base, ...segments);
35
- fs_extra_1.default.ensureDirSync(node_path_1.default.dirname(p));
36
- fs_extra_1.default.writeFileSync(p, '');
37
- }
38
- // ---------------------------------------------------------------------------
39
- // checkRequiredLayers
40
- // ---------------------------------------------------------------------------
41
- (0, vitest_1.describe)('checkRequiredLayers', () => {
42
- let tmpDir;
43
- (0, vitest_1.beforeEach)(() => { tmpDir = makeTempDir(); });
44
- (0, vitest_1.afterEach)(() => { fs_extra_1.default.removeSync(tmpDir); });
45
- (0, vitest_1.it)('returns no issues when all required layers exist', () => {
46
- mkdir(tmpDir, 'app');
47
- mkdir(tmpDir, 'shared');
48
- const issues = (0, index_1.checkRequiredLayers)(tmpDir, fsdRule, 'src');
49
- (0, vitest_1.expect)(issues).toHaveLength(0);
50
- });
51
- (0, vitest_1.it)('returns an error for each missing required layer', () => {
52
- // Neither app nor shared exist
53
- const issues = (0, index_1.checkRequiredLayers)(tmpDir, fsdRule, 'src');
54
- (0, vitest_1.expect)(issues).toHaveLength(2);
55
- (0, vitest_1.expect)(issues.every((i) => i.severity === 'error')).toBe(true);
56
- });
57
- (0, vitest_1.it)('message contains the missing layer path', () => {
58
- mkdir(tmpDir, 'app');
59
- // shared is missing
60
- const issues = (0, index_1.checkRequiredLayers)(tmpDir, fsdRule, 'src');
61
- (0, vitest_1.expect)(issues[0].message).toBe('Missing required layer: src/shared');
62
- });
63
- (0, vitest_1.it)('works for modular architecture', () => {
64
- mkdir(tmpDir, 'shared');
65
- // core is missing
66
- const issues = (0, index_1.checkRequiredLayers)(tmpDir, modularRule, 'src');
67
- (0, vitest_1.expect)(issues).toHaveLength(1);
68
- (0, vitest_1.expect)(issues[0].message).toBe('Missing required layer: src/core');
69
- });
70
- });
71
- // ---------------------------------------------------------------------------
72
- // checkUnknownLayers
73
- // ---------------------------------------------------------------------------
74
- (0, vitest_1.describe)('checkUnknownLayers', () => {
75
- let tmpDir;
76
- (0, vitest_1.beforeEach)(() => { tmpDir = makeTempDir(); });
77
- (0, vitest_1.afterEach)(() => { fs_extra_1.default.removeSync(tmpDir); });
78
- (0, vitest_1.it)('returns no issues when all dirs are allowed', () => {
79
- mkdir(tmpDir, 'app');
80
- mkdir(tmpDir, 'features');
81
- mkdir(tmpDir, 'shared');
82
- const issues = (0, index_1.checkUnknownLayers)(tmpDir, fsdRule, 'fsd', 'src');
83
- (0, vitest_1.expect)(issues).toHaveLength(0);
84
- });
85
- (0, vitest_1.it)('returns a warning for each unknown directory', () => {
86
- mkdir(tmpDir, 'app');
87
- mkdir(tmpDir, 'shared');
88
- mkdir(tmpDir, 'unknown-layer');
89
- const issues = (0, index_1.checkUnknownLayers)(tmpDir, fsdRule, 'fsd', 'src');
90
- (0, vitest_1.expect)(issues).toHaveLength(1);
91
- (0, vitest_1.expect)(issues[0].severity).toBe('warning');
92
- });
93
- (0, vitest_1.it)('message contains the dir name and architecture', () => {
94
- mkdir(tmpDir, 'random');
95
- const issues = (0, index_1.checkUnknownLayers)(tmpDir, fsdRule, 'fsd', 'src');
96
- (0, vitest_1.expect)(issues[0].message).toContain('"src/random"');
97
- (0, vitest_1.expect)(issues[0].message).toContain('FSD');
98
- });
99
- (0, vitest_1.it)('ignores files (only checks directories)', () => {
100
- touch(tmpDir, 'some-file.ts');
101
- const issues = (0, index_1.checkUnknownLayers)(tmpDir, fsdRule, 'fsd', 'src');
102
- (0, vitest_1.expect)(issues).toHaveLength(0);
103
- });
104
- (0, vitest_1.it)('returns empty array when srcPath does not exist', () => {
105
- const issues = (0, index_1.checkUnknownLayers)('/non/existent', fsdRule, 'fsd', 'src');
106
- (0, vitest_1.expect)(issues).toHaveLength(0);
107
- });
108
- (0, vitest_1.it)('reports correct architecture name for modular', () => {
109
- mkdir(tmpDir, 'alien-dir');
110
- const issues = (0, index_1.checkUnknownLayers)(tmpDir, modularRule, 'modular', 'src');
111
- (0, vitest_1.expect)(issues[0].message).toContain('MODULAR');
112
- });
113
- });
114
- // ---------------------------------------------------------------------------
115
- // checkPublicApiFiles
116
- // ---------------------------------------------------------------------------
117
- (0, vitest_1.describe)('checkPublicApiFiles', () => {
118
- let tmpDir;
119
- (0, vitest_1.beforeEach)(() => { tmpDir = makeTempDir(); });
120
- (0, vitest_1.afterEach)(() => { fs_extra_1.default.removeSync(tmpDir); });
121
- (0, vitest_1.it)('returns no issues when all slices have index.ts', () => {
122
- touch(tmpDir, 'features', 'auth', 'index.ts');
123
- touch(tmpDir, 'features', 'profile', 'index.ts');
124
- const issues = (0, index_1.checkPublicApiFiles)(tmpDir, fsdRule, 'src');
125
- (0, vitest_1.expect)(issues).toHaveLength(0);
126
- });
127
- (0, vitest_1.it)('returns a warning for each slice missing index.ts', () => {
128
- mkdir(tmpDir, 'features', 'auth'); // no index.ts
129
- const issues = (0, index_1.checkPublicApiFiles)(tmpDir, fsdRule, 'src');
130
- (0, vitest_1.expect)(issues).toHaveLength(1);
131
- (0, vitest_1.expect)(issues[0].severity).toBe('warning');
132
- (0, vitest_1.expect)(issues[0].message).toBe('Missing public API: src/features/auth/index.ts');
133
- });
134
- (0, vitest_1.it)('skips app, shared, and core layers (they are not slice layers)', () => {
135
- // Even if app/shared have no index.ts, no warning should be produced
136
- mkdir(tmpDir, 'app', 'some-dir');
137
- mkdir(tmpDir, 'shared', 'some-dir');
138
- const issues = (0, index_1.checkPublicApiFiles)(tmpDir, fsdRule, 'src');
139
- (0, vitest_1.expect)(issues).toHaveLength(0);
140
- });
141
- (0, vitest_1.it)('skips layers that do not exist on disk', () => {
142
- // features dir does not exist — should not throw
143
- const issues = (0, index_1.checkPublicApiFiles)(tmpDir, fsdRule, 'src');
144
- (0, vitest_1.expect)(issues).toHaveLength(0);
145
- });
146
- (0, vitest_1.it)('detects missing index.ts across multiple slice layers', () => {
147
- mkdir(tmpDir, 'features', 'auth'); // missing index.ts
148
- mkdir(tmpDir, 'entities', 'user'); // missing index.ts
149
- touch(tmpDir, 'pages', 'home', 'index.ts'); // OK
150
- const issues = (0, index_1.checkPublicApiFiles)(tmpDir, fsdRule, 'src');
151
- (0, vitest_1.expect)(issues).toHaveLength(2);
152
- const messages = issues.map((i) => i.message);
153
- (0, vitest_1.expect)(messages).toContain('Missing public API: src/features/auth/index.ts');
154
- (0, vitest_1.expect)(messages).toContain('Missing public API: src/entities/user/index.ts');
155
- });
156
- (0, vitest_1.it)('works for modular architecture — checks modules layer', () => {
157
- mkdir(tmpDir, 'modules', 'auth'); // missing index.ts
158
- const issues = (0, index_1.checkPublicApiFiles)(tmpDir, modularRule, 'src');
159
- (0, vitest_1.expect)(issues).toHaveLength(1);
160
- (0, vitest_1.expect)(issues[0].message).toBe('Missing public API: src/modules/auth/index.ts');
161
- });
162
- });
163
- //# sourceMappingURL=validate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../../src/commands/validate/validate.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare function validateCommand(): void;