@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,119 +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.validateCommand = validateCommand;
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 layerRulesByArchitecture = {
12
- fsd: {
13
- required: ['app', 'shared'],
14
- allowed: ['app', 'processes', 'pages', 'widgets', 'features', 'entities', 'shared'],
15
- },
16
- modular: {
17
- required: ['shared', 'core'],
18
- allowed: ['modules', 'shared', 'core'],
19
- },
20
- };
21
- // ---------------------------------------------------------------------------
22
- // Validation rules
23
- // ---------------------------------------------------------------------------
24
- /**
25
- * Checks that all required layers exist under srcDir
26
- */
27
- function checkRequiredLayers(srcPath, rule, srcDir) {
28
- return rule.required
29
- .filter((layer) => !fs_extra_1.default.existsSync(node_path_1.default.join(srcPath, layer)))
30
- .map((layer) => ({
31
- severity: 'error',
32
- message: `Missing required layer: ${srcDir}/${layer}`,
33
- }));
34
- }
35
- /**
36
- * Checks that no unknown (forbidden) directories exist directly under srcDir
37
- */
38
- function checkUnknownLayers(srcPath, rule, architecture, srcDir) {
39
- if (!fs_extra_1.default.existsSync(srcPath))
40
- return [];
41
- return fs_extra_1.default
42
- .readdirSync(srcPath, { withFileTypes: true })
43
- .filter((entry) => entry.isDirectory())
44
- .filter((entry) => !rule.allowed.includes(entry.name))
45
- .map((entry) => ({
46
- severity: 'warning',
47
- message: `"${srcDir}/${entry.name}" is not a recognised layer in ${architecture.toUpperCase()} architecture`,
48
- }));
49
- }
50
- /**
51
- * Checks each slice for a public API index.ts file
52
- */
53
- function checkPublicApiFiles(srcPath, rule, srcDir) {
54
- const issues = [];
55
- const sliceLayers = rule.allowed.filter((l) => l !== 'app' && l !== 'shared' && l !== 'core');
56
- for (const layer of sliceLayers) {
57
- const layerPath = node_path_1.default.join(srcPath, layer);
58
- if (!fs_extra_1.default.existsSync(layerPath))
59
- continue;
60
- const slices = fs_extra_1.default
61
- .readdirSync(layerPath, { withFileTypes: true })
62
- .filter((e) => e.isDirectory());
63
- for (const slice of slices) {
64
- const indexPath = node_path_1.default.join(layerPath, slice.name, 'index.ts');
65
- if (!fs_extra_1.default.existsSync(indexPath)) {
66
- issues.push({
67
- severity: 'warning',
68
- message: `Missing public API: ${srcDir}/${layer}/${slice.name}/index.ts`,
69
- });
70
- }
71
- }
72
- }
73
- return issues;
74
- }
75
- // ---------------------------------------------------------------------------
76
- // Output formatting
77
- // ---------------------------------------------------------------------------
78
- function printIssues(issues) {
79
- const errors = issues.filter((i) => i.severity === 'error');
80
- const warnings = issues.filter((i) => i.severity === 'warning');
81
- // Print errors first — they are blocking
82
- for (const issue of errors) {
83
- logger_1.logger.error(issue.message);
84
- }
85
- for (const issue of warnings) {
86
- logger_1.logger.warning(issue.message);
87
- }
88
- const parts = [];
89
- if (errors.length > 0)
90
- parts.push(`${errors.length} error(s)`);
91
- if (warnings.length > 0)
92
- parts.push(`${warnings.length} warning(s)`);
93
- logger_1.logger.info(`Found ${parts.join(', ')}.`);
94
- }
95
- // ---------------------------------------------------------------------------
96
- // Command entry point
97
- // ---------------------------------------------------------------------------
98
- function validateCommand() {
99
- const config = (0, config_1.loadProjectConfig)();
100
- const { architecture, srcDir } = config;
101
- const srcPath = node_path_1.default.join(process.cwd(), srcDir);
102
- const rule = layerRulesByArchitecture[architecture];
103
- logger_1.logger.info(`Validating ${architecture.toUpperCase()} architecture…`);
104
- const issues = [
105
- ...checkRequiredLayers(srcPath, rule, srcDir),
106
- ...checkUnknownLayers(srcPath, rule, architecture, srcDir),
107
- ...checkPublicApiFiles(srcPath, rule, srcDir),
108
- ];
109
- if (issues.length === 0) {
110
- logger_1.logger.success('Architecture is valid. No issues found.');
111
- return;
112
- }
113
- printIssues(issues);
114
- const hasErrors = issues.some((i) => i.severity === 'error');
115
- if (hasErrors) {
116
- process.exit(1);
117
- }
118
- }
119
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,174 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const files_1 = require("./files");
5
- // ---------------------------------------------------------------------------
6
- // getSliceFiles — smart templates
7
- //
8
- // feature → index + ui/ + model/ + api/ (full vertical slice)
9
- // entity → index + model/ + api/ (data layer, no UI)
10
- // widget → index + ui/ + model/ (composite UI, no api)
11
- // page → index + ui/*Page.tsx (route shell, thin)
12
- // component → index + flat *.tsx (pure UI atom)
13
- // module → index + ui/ + model/ + api/ (modular vertical slice)
14
- // ---------------------------------------------------------------------------
15
- (0, vitest_1.describe)('getSliceFiles', () => {
16
- // -------------------------------------------------------------------------
17
- // feature — full vertical slice (FSD)
18
- // -------------------------------------------------------------------------
19
- (0, vitest_1.describe)('feature', () => {
20
- (0, vitest_1.it)('returns index + ui + model + api', () => {
21
- const files = (0, files_1.getSliceFiles)('feature', 'auth');
22
- (0, vitest_1.expect)(Object.keys(files)).toEqual([
23
- 'index.ts',
24
- 'ui/Auth.tsx',
25
- 'model/index.ts',
26
- 'api/index.ts',
27
- ]);
28
- });
29
- (0, vitest_1.it)('uses PascalCase for component filename', () => {
30
- const files = (0, files_1.getSliceFiles)('feature', 'userProfile');
31
- (0, vitest_1.expect)(files).toHaveProperty('ui/UserProfile.tsx');
32
- });
33
- (0, vitest_1.it)('index.ts re-exports the ui component and its props type', () => {
34
- const files = (0, files_1.getSliceFiles)('feature', 'auth');
35
- (0, vitest_1.expect)(files['index.ts']).toContain("export { Auth } from './ui/Auth'");
36
- (0, vitest_1.expect)(files['index.ts']).toContain("export type { AuthProps } from './ui/Auth'");
37
- });
38
- (0, vitest_1.it)('component file contains a React function component', () => {
39
- const files = (0, files_1.getSliceFiles)('feature', 'auth');
40
- (0, vitest_1.expect)(files['ui/Auth.tsx']).toContain('export function Auth');
41
- (0, vitest_1.expect)(files['ui/Auth.tsx']).toContain('export interface AuthProps');
42
- });
43
- (0, vitest_1.it)('model/index.ts contains state interface', () => {
44
- const files = (0, files_1.getSliceFiles)('feature', 'auth');
45
- (0, vitest_1.expect)(files['model/index.ts']).toContain('export interface AuthState');
46
- });
47
- (0, vitest_1.it)('api/index.ts contains fetch function', () => {
48
- const files = (0, files_1.getSliceFiles)('feature', 'auth');
49
- (0, vitest_1.expect)(files['api/index.ts']).toContain('export async function fetchAuth');
50
- });
51
- });
52
- // -------------------------------------------------------------------------
53
- // entity — data-layer slice (FSD)
54
- // NO UI — model + api only
55
- // -------------------------------------------------------------------------
56
- (0, vitest_1.describe)('entity', () => {
57
- (0, vitest_1.it)('returns index + model + api — no ui directory', () => {
58
- const files = (0, files_1.getSliceFiles)('entity', 'user');
59
- (0, vitest_1.expect)(Object.keys(files)).toEqual([
60
- 'index.ts',
61
- 'model/index.ts',
62
- 'api/index.ts',
63
- ]);
64
- });
65
- (0, vitest_1.it)('does NOT generate a ui/ component', () => {
66
- const files = (0, files_1.getSliceFiles)('entity', 'user');
67
- const keys = Object.keys(files);
68
- (0, vitest_1.expect)(keys.some((k) => k.startsWith('ui/'))).toBe(false);
69
- });
70
- (0, vitest_1.it)('index.ts re-exports model type and fetch function', () => {
71
- const files = (0, files_1.getSliceFiles)('entity', 'user');
72
- (0, vitest_1.expect)(files['index.ts']).toContain('export type { UserState }');
73
- (0, vitest_1.expect)(files['index.ts']).toContain("export { fetchUser } from './api'");
74
- });
75
- (0, vitest_1.it)('model/index.ts contains state interface', () => {
76
- const files = (0, files_1.getSliceFiles)('entity', 'user');
77
- (0, vitest_1.expect)(files['model/index.ts']).toContain('export interface UserState');
78
- });
79
- (0, vitest_1.it)('api/index.ts contains fetch function', () => {
80
- const files = (0, files_1.getSliceFiles)('entity', 'user');
81
- (0, vitest_1.expect)(files['api/index.ts']).toContain('export async function fetchUser');
82
- });
83
- });
84
- // -------------------------------------------------------------------------
85
- // widget — composite UI block (FSD)
86
- // Has UI + model state; does NOT own server calls
87
- // -------------------------------------------------------------------------
88
- (0, vitest_1.describe)('widget', () => {
89
- (0, vitest_1.it)('returns index + ui + model — no api', () => {
90
- const files = (0, files_1.getSliceFiles)('widget', 'header');
91
- (0, vitest_1.expect)(Object.keys(files)).toEqual([
92
- 'index.ts',
93
- 'ui/Header.tsx',
94
- 'model/index.ts',
95
- ]);
96
- });
97
- (0, vitest_1.it)('does NOT generate api/index.ts', () => {
98
- const files = (0, files_1.getSliceFiles)('widget', 'header');
99
- (0, vitest_1.expect)(files).not.toHaveProperty('api/index.ts');
100
- });
101
- (0, vitest_1.it)('index.ts re-exports the ui component', () => {
102
- const files = (0, files_1.getSliceFiles)('widget', 'header');
103
- (0, vitest_1.expect)(files['index.ts']).toContain("export { Header } from './ui/Header'");
104
- });
105
- });
106
- // -------------------------------------------------------------------------
107
- // page — route-level shell (FSD)
108
- // Thin composition layer — no model/api
109
- // -------------------------------------------------------------------------
110
- (0, vitest_1.describe)('page', () => {
111
- (0, vitest_1.it)('returns index and a Page-suffixed component only', () => {
112
- const files = (0, files_1.getSliceFiles)('page', 'dashboard');
113
- (0, vitest_1.expect)(Object.keys(files)).toEqual(['index.ts', 'ui/DashboardPage.tsx']);
114
- });
115
- (0, vitest_1.it)('component filename has Page suffix', () => {
116
- const files = (0, files_1.getSliceFiles)('page', 'dashboard');
117
- (0, vitest_1.expect)(files).toHaveProperty('ui/DashboardPage.tsx');
118
- });
119
- (0, vitest_1.it)('does NOT generate model or api', () => {
120
- const files = (0, files_1.getSliceFiles)('page', 'dashboard');
121
- (0, vitest_1.expect)(files).not.toHaveProperty('model/index.ts');
122
- (0, vitest_1.expect)(files).not.toHaveProperty('api/index.ts');
123
- });
124
- (0, vitest_1.it)('index.ts re-exports the Page component', () => {
125
- const files = (0, files_1.getSliceFiles)('page', 'dashboard');
126
- (0, vitest_1.expect)(files['index.ts']).toContain('DashboardPage');
127
- });
128
- });
129
- // -------------------------------------------------------------------------
130
- // component — pure UI atom (shared/ui)
131
- // Stateless, flat structure — no sub-directories
132
- // -------------------------------------------------------------------------
133
- (0, vitest_1.describe)('component', () => {
134
- (0, vitest_1.it)('returns index and a flat component file only', () => {
135
- const files = (0, files_1.getSliceFiles)('component', 'button');
136
- (0, vitest_1.expect)(Object.keys(files)).toEqual(['index.ts', 'Button.tsx']);
137
- });
138
- (0, vitest_1.it)('component is flat — no ui/ subdirectory', () => {
139
- const files = (0, files_1.getSliceFiles)('component', 'button');
140
- (0, vitest_1.expect)(files).toHaveProperty('Button.tsx');
141
- (0, vitest_1.expect)(files).not.toHaveProperty('ui/Button.tsx');
142
- });
143
- (0, vitest_1.it)('does NOT generate model or api', () => {
144
- const files = (0, files_1.getSliceFiles)('component', 'button');
145
- (0, vitest_1.expect)(files).not.toHaveProperty('model/index.ts');
146
- (0, vitest_1.expect)(files).not.toHaveProperty('api/index.ts');
147
- });
148
- (0, vitest_1.it)('index.ts re-exports the component and its props type', () => {
149
- const files = (0, files_1.getSliceFiles)('component', 'button');
150
- (0, vitest_1.expect)(files['index.ts']).toContain("export { Button } from './Button'");
151
- (0, vitest_1.expect)(files['index.ts']).toContain("export type { ButtonProps } from './Button'");
152
- });
153
- });
154
- // -------------------------------------------------------------------------
155
- // module — full vertical slice (Modular architecture)
156
- // Equivalent to feature in FSD
157
- // -------------------------------------------------------------------------
158
- (0, vitest_1.describe)('module', () => {
159
- (0, vitest_1.it)('returns index + ui + model + api (same shape as feature)', () => {
160
- const files = (0, files_1.getSliceFiles)('module', 'auth');
161
- (0, vitest_1.expect)(Object.keys(files)).toEqual([
162
- 'index.ts',
163
- 'ui/Auth.tsx',
164
- 'model/index.ts',
165
- 'api/index.ts',
166
- ]);
167
- });
168
- (0, vitest_1.it)('index.ts re-exports the ui component', () => {
169
- const files = (0, files_1.getSliceFiles)('module', 'auth');
170
- (0, vitest_1.expect)(files['index.ts']).toContain("export { Auth } from './ui/Auth'");
171
- });
172
- });
173
- });
174
- //# sourceMappingURL=files.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.test.js","sourceRoot":"","sources":["../../src/templates/files.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,mCAAuC;AAEvC,8EAA8E;AAC9E,kCAAkC;AAClC,EAAE;AACF,mEAAmE;AACnE,kEAAkE;AAClE,qEAAqE;AACrE,kEAAkE;AAClE,6DAA6D;AAC7D,uEAAuE;AACvE,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,4EAA4E;IAC5E,sCAAsC;IACtC,4EAA4E;IAC5E,IAAA,iBAAQ,EAAC,SAAS,EAAE,GAAG,EAAE;QACvB,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjC,UAAU;gBACV,aAAa;gBACb,gBAAgB;gBAChB,cAAc;aACf,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,aAAa,CAAC,CAAA;YACrD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;YACvE,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAA;QACnF,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAA,eAAM,EAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAA;YAC9D,IAAA,eAAM,EAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAA,eAAM,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAA,eAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,kCAAkC;IAClC,2BAA2B;IAC3B,4EAA4E;IAC5E,IAAA,iBAAQ,EAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjC,UAAU;gBACV,gBAAgB;gBAChB,cAAc;aACf,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/B,IAAA,eAAM,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;YAChE,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,IAAA,eAAM,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,IAAA,eAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,oCAAoC;IACpC,kDAAkD;IAClD,4EAA4E;IAC5E,IAAA,iBAAQ,EAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC/C,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjC,UAAU;gBACV,eAAe;gBACf,gBAAgB;aACjB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC/C,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC/C,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAA;QAC7E,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,iCAAiC;IACjC,wCAAwC;IACxC,4EAA4E;IAC5E,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,MAAM,EAAE,WAAW,CAAC,CAAA;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAA;QAC1E,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,MAAM,EAAE,WAAW,CAAC,CAAA;YAChD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,MAAM,EAAE,WAAW,CAAC,CAAA;YAChD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAA;YAClD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,MAAM,EAAE,WAAW,CAAC,CAAA;YAChD,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,uCAAuC;IACvC,iDAAiD;IACjD,4EAA4E;IAC5E,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;QACzB,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAClD,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAClD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;YAC1C,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAClD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAA;YAClD,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAClD,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;YACxE,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,6CAA6C,CAAC,CAAA;QACpF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,sDAAsD;IACtD,+BAA+B;IAC/B,4EAA4E;IAC5E,IAAA,iBAAQ,EAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjC,UAAU;gBACV,aAAa;gBACb,gBAAgB;gBAChB,cAAc;aACf,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7C,IAAA,eAAM,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,117 +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 config_1 = require("./config");
11
- // ---------------------------------------------------------------------------
12
- // Helpers
13
- // ---------------------------------------------------------------------------
14
- function makeTmpDir() {
15
- return fs_extra_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'forge-config-test-'));
16
- }
17
- // ---------------------------------------------------------------------------
18
- // loadProjectConfig
19
- // ---------------------------------------------------------------------------
20
- (0, vitest_1.describe)('loadProjectConfig', () => {
21
- let tmpDir;
22
- (0, vitest_1.beforeEach)(() => {
23
- tmpDir = makeTmpDir();
24
- });
25
- (0, vitest_1.afterEach)(() => {
26
- fs_extra_1.default.removeSync(tmpDir);
27
- });
28
- // -------------------------------------------------------------------------
29
- // Legacy JSON — backwards compatibility
30
- // -------------------------------------------------------------------------
31
- (0, vitest_1.describe)('legacy .component-forge.json', () => {
32
- (0, vitest_1.it)('loads config from JSON file', () => {
33
- fs_extra_1.default.writeJsonSync(node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.json), {
34
- architecture: 'fsd',
35
- srcDir: 'src',
36
- });
37
- const config = (0, config_1.loadProjectConfig)(tmpDir);
38
- (0, vitest_1.expect)(config.architecture).toBe('fsd');
39
- (0, vitest_1.expect)(config.srcDir).toBe('src');
40
- });
41
- (0, vitest_1.it)('loads modular architecture from JSON', () => {
42
- fs_extra_1.default.writeJsonSync(node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.json), {
43
- architecture: 'modular',
44
- srcDir: 'app',
45
- });
46
- const config = (0, config_1.loadProjectConfig)(tmpDir);
47
- (0, vitest_1.expect)(config.architecture).toBe('modular');
48
- (0, vitest_1.expect)(config.srcDir).toBe('app');
49
- });
50
- (0, vitest_1.it)('preserves optional templates field', () => {
51
- fs_extra_1.default.writeJsonSync(node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.json), {
52
- architecture: 'fsd',
53
- srcDir: 'src',
54
- templates: '.forge-templates',
55
- });
56
- const config = (0, config_1.loadProjectConfig)(tmpDir);
57
- (0, vitest_1.expect)(config.templates).toBe('.forge-templates');
58
- });
59
- });
60
- // -------------------------------------------------------------------------
61
- // forge.config.ts — TypeScript config
62
- // -------------------------------------------------------------------------
63
- (0, vitest_1.describe)('forge.config.ts', () => {
64
- (0, vitest_1.it)('loads config from TypeScript file and prefers it over JSON', () => {
65
- // Write both — TS should win
66
- fs_extra_1.default.writeJsonSync(node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.json), {
67
- architecture: 'modular',
68
- srcDir: 'legacy',
69
- });
70
- fs_extra_1.default.writeFileSync(node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.ts), `const config = { architecture: 'fsd', srcDir: 'src' }; module.exports = config;`);
71
- const config = (0, config_1.loadProjectConfig)(tmpDir);
72
- (0, vitest_1.expect)(config.architecture).toBe('fsd');
73
- (0, vitest_1.expect)(config.srcDir).toBe('src');
74
- });
75
- (0, vitest_1.it)('loads config from forge.config.ts with default export', () => {
76
- fs_extra_1.default.writeFileSync(node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.ts), [
77
- `const config = { architecture: 'modular', srcDir: 'app' };`,
78
- `module.exports = { default: config };`,
79
- ].join('\n'));
80
- const config = (0, config_1.loadProjectConfig)(tmpDir);
81
- (0, vitest_1.expect)(config.architecture).toBe('modular');
82
- (0, vitest_1.expect)(config.srcDir).toBe('app');
83
- });
84
- });
85
- // -------------------------------------------------------------------------
86
- // Error cases
87
- // -------------------------------------------------------------------------
88
- (0, vitest_1.describe)('error handling', () => {
89
- (0, vitest_1.it)('exits with code 1 when no config file exists', () => {
90
- (0, vitest_1.expect)(() => (0, config_1.loadProjectConfig)(tmpDir)).toThrow();
91
- });
92
- });
93
- });
94
- // ---------------------------------------------------------------------------
95
- // writeProjectConfig
96
- // ---------------------------------------------------------------------------
97
- (0, vitest_1.describe)('writeProjectConfig', () => {
98
- let tmpDir;
99
- (0, vitest_1.beforeEach)(() => {
100
- tmpDir = makeTmpDir();
101
- });
102
- (0, vitest_1.afterEach)(() => {
103
- fs_extra_1.default.removeSync(tmpDir);
104
- });
105
- (0, vitest_1.it)('writes .component-forge.json', () => {
106
- (0, config_1.writeProjectConfig)({ architecture: 'fsd', srcDir: 'src' }, tmpDir);
107
- const jsonPath = node_path_1.default.join(tmpDir, config_1.CONFIG_FILENAMES.json);
108
- (0, vitest_1.expect)(fs_extra_1.default.existsSync(jsonPath)).toBe(true);
109
- });
110
- (0, vitest_1.it)('written JSON is readable back', () => {
111
- (0, config_1.writeProjectConfig)({ architecture: 'modular', srcDir: 'app' }, tmpDir);
112
- const config = (0, config_1.loadProjectConfig)(tmpDir);
113
- (0, vitest_1.expect)(config.architecture).toBe('modular');
114
- (0, vitest_1.expect)(config.srcDir).toBe('app');
115
- });
116
- });
117
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/utils/config.test.ts"],"names":[],"mappings":";;;;;AAAA,sDAAwB;AACxB,0DAA4B;AAE5B,wDAAyB;AACzB,mCAAoE;AAEpE,qCAAkF;AAElF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,UAAU;IACjB,OAAO,kBAAE,CAAC,WAAW,CAAC,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAA;AACrE,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,MAAc,CAAA;IAElB,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,MAAM,GAAG,UAAU,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,kBAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,wCAAwC;IACxC,4EAA4E;IAE5E,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,kBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,IAAI,CAAC,EAAE;gBACzD,YAAY,EAAE,KAAK;gBACnB,MAAM,EAAE,KAAK;aACd,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;YACxC,IAAA,eAAM,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvC,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,kBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,IAAI,CAAC,EAAE;gBACzD,YAAY,EAAE,SAAS;gBACvB,MAAM,EAAE,KAAK;aACd,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;YACxC,IAAA,eAAM,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,kBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,IAAI,CAAC,EAAE;gBACzD,YAAY,EAAE,KAAK;gBACnB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,kBAAkB;aAC9B,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;YACxC,IAAA,eAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,sCAAsC;IACtC,4EAA4E;IAE5E,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,6BAA6B;YAC7B,kBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,IAAI,CAAC,EAAE;gBACzD,YAAY,EAAE,SAAS;gBACvB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;YAEF,kBAAE,CAAC,aAAa,CACd,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,EAAE,CAAC,EACtC,iFAAiF,CAClF,CAAA;YAED,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;YACxC,IAAA,eAAM,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACvC,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,kBAAE,CAAC,aAAa,CACd,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,EAAE,CAAC,EACtC;gBACE,4DAA4D;gBAC5D,uCAAuC;aACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;YAED,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;YACxC,IAAA,eAAM,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,MAAc,CAAA;IAElB,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,MAAM,GAAG,UAAU,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,kBAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,IAAA,2BAAkB,EAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAgB,CAAC,IAAI,CAAC,CAAA;QACzD,IAAA,eAAM,EAAC,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,IAAA,2BAAkB,EAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;QACtE,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;QACxC,IAAA,eAAM,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,86 +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 template_resolver_1 = require("./template-resolver");
11
- // ---------------------------------------------------------------------------
12
- // Helpers
13
- // ---------------------------------------------------------------------------
14
- function makeTempDir() {
15
- return fs_extra_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'cf-test-'));
16
- }
17
- // ---------------------------------------------------------------------------
18
- // resolveSliceFiles
19
- // ---------------------------------------------------------------------------
20
- (0, vitest_1.describe)('resolveSliceFiles', () => {
21
- let tmpDir;
22
- (0, vitest_1.beforeEach)(() => {
23
- tmpDir = makeTempDir();
24
- });
25
- (0, vitest_1.afterEach)(() => {
26
- fs_extra_1.default.removeSync(tmpDir);
27
- });
28
- (0, vitest_1.describe)('without custom templates', () => {
29
- (0, vitest_1.it)('returns built-in files when no templatesDir is provided', () => {
30
- const files = (0, template_resolver_1.resolveSliceFiles)('feature', 'auth');
31
- (0, vitest_1.expect)(Object.keys(files)).toEqual([
32
- 'index.ts',
33
- 'ui/Auth.tsx',
34
- 'model/index.ts',
35
- 'api/index.ts',
36
- ]);
37
- });
38
- (0, vitest_1.it)('returns built-in files when templatesDir does not exist', () => {
39
- const files = (0, template_resolver_1.resolveSliceFiles)('feature', 'auth', '/non/existent/path');
40
- (0, vitest_1.expect)(files['index.ts']).toContain("export { Auth } from './ui/Auth'");
41
- });
42
- (0, vitest_1.it)('returns built-in files when sliceType subdir is missing', () => {
43
- // tmpDir exists but has no 'feature' subdirectory
44
- const files = (0, template_resolver_1.resolveSliceFiles)('feature', 'auth', tmpDir);
45
- (0, vitest_1.expect)(files['index.ts']).toContain("export { Auth } from './ui/Auth'");
46
- });
47
- });
48
- (0, vitest_1.describe)('with custom templates', () => {
49
- (0, vitest_1.it)('overrides a single file with a custom .hbs template', () => {
50
- const customDir = node_path_1.default.join(tmpDir, 'feature');
51
- fs_extra_1.default.ensureDirSync(customDir);
52
- fs_extra_1.default.writeFileSync(node_path_1.default.join(customDir, 'index.ts.hbs'), '// custom: {{sliceType}} {{Name}}\nexport { {{Name}} } from "./ui/{{Name}}"\n');
53
- const files = (0, template_resolver_1.resolveSliceFiles)('feature', 'auth', tmpDir);
54
- (0, vitest_1.expect)(files['index.ts']).toBe('// custom: feature Auth\nexport { Auth } from "./ui/Auth"\n');
55
- // Other files must fall back to built-ins
56
- (0, vitest_1.expect)(files['ui/Auth.tsx']).toContain('export function Auth');
57
- });
58
- (0, vitest_1.it)('injects {{name}} (raw) and {{Name}} (PascalCase) correctly', () => {
59
- const customDir = node_path_1.default.join(tmpDir, 'component');
60
- fs_extra_1.default.ensureDirSync(customDir);
61
- fs_extra_1.default.writeFileSync(node_path_1.default.join(customDir, 'index.ts.hbs'), 'export { {{Name}} } from "./{{Name}}"\n// raw: {{name}}\n');
62
- const files = (0, template_resolver_1.resolveSliceFiles)('component', 'button', tmpDir);
63
- (0, vitest_1.expect)(files['index.ts']).toContain('export { Button } from "./Button"');
64
- (0, vitest_1.expect)(files['index.ts']).toContain('// raw: button');
65
- });
66
- (0, vitest_1.it)('injects {{Name}} as PascalCase for nested names', () => {
67
- const customDir = node_path_1.default.join(tmpDir, 'component');
68
- fs_extra_1.default.ensureDirSync(customDir);
69
- fs_extra_1.default.writeFileSync(node_path_1.default.join(customDir, 'index.ts.hbs'), 'export { {{Name}} } from "./{{Name}}"\n');
70
- // "forms/Input" → Name should be "Input" (basename)
71
- const files = (0, template_resolver_1.resolveSliceFiles)('component', 'forms/Input', tmpDir);
72
- (0, vitest_1.expect)(files['index.ts']).toContain('export { Input } from "./Input"');
73
- });
74
- (0, vitest_1.it)('falls back to built-in when .hbs file is missing for that path', () => {
75
- const customDir = node_path_1.default.join(tmpDir, 'feature');
76
- fs_extra_1.default.ensureDirSync(customDir);
77
- // Only override index.ts — all other files should be built-in
78
- fs_extra_1.default.writeFileSync(node_path_1.default.join(customDir, 'index.ts.hbs'), '// custom index\n');
79
- const files = (0, template_resolver_1.resolveSliceFiles)('feature', 'auth', tmpDir);
80
- (0, vitest_1.expect)(files['index.ts']).toBe('// custom index\n');
81
- (0, vitest_1.expect)(files['model/index.ts']).toContain('export interface AuthState');
82
- (0, vitest_1.expect)(files['api/index.ts']).toContain('export async function fetchAuth');
83
- });
84
- });
85
- });
86
- //# sourceMappingURL=template-resolver.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-resolver.test.js","sourceRoot":"","sources":["../../src/utils/template-resolver.test.ts"],"names":[],"mappings":"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"}