@xanahlight/component-forge 0.1.0 → 1.4.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 (70) hide show
  1. package/README.md +8 -0
  2. package/dist/commands/check/check.test.d.ts +1 -0
  3. package/dist/commands/check/check.test.js +151 -0
  4. package/dist/commands/check/check.test.js.map +1 -0
  5. package/dist/commands/check/index.d.ts +15 -0
  6. package/dist/commands/check/index.js +186 -0
  7. package/dist/commands/check/index.js.map +1 -0
  8. package/dist/commands/explain/explain.test.d.ts +1 -0
  9. package/dist/commands/explain/explain.test.js +57 -0
  10. package/dist/commands/explain/explain.test.js.map +1 -0
  11. package/dist/commands/explain/index.d.ts +12 -0
  12. package/dist/commands/explain/index.js +37 -0
  13. package/dist/commands/explain/index.js.map +1 -0
  14. package/dist/commands/explain/topics.d.ts +3 -0
  15. package/dist/commands/explain/topics.js +138 -0
  16. package/dist/commands/explain/topics.js.map +1 -0
  17. package/dist/commands/generate/index.d.ts +6 -0
  18. package/dist/commands/generate/index.js +100 -0
  19. package/dist/commands/generate/index.js.map +1 -0
  20. package/dist/commands/init/index.d.ts +29 -0
  21. package/dist/commands/init/index.js +157 -0
  22. package/dist/commands/init/index.js.map +1 -0
  23. package/dist/commands/migrate/classifier.d.ts +22 -0
  24. package/dist/commands/migrate/classifier.js +48 -0
  25. package/dist/commands/migrate/classifier.js.map +1 -0
  26. package/dist/commands/migrate/index.d.ts +8 -0
  27. package/dist/commands/migrate/index.js +33 -0
  28. package/dist/commands/migrate/index.js.map +1 -0
  29. package/dist/commands/migrate/migrate.test.d.ts +1 -0
  30. package/dist/commands/migrate/migrate.test.js +176 -0
  31. package/dist/commands/migrate/migrate.test.js.map +1 -0
  32. package/dist/commands/migrate/plan-builder.d.ts +27 -0
  33. package/dist/commands/migrate/plan-builder.js +106 -0
  34. package/dist/commands/migrate/plan-builder.js.map +1 -0
  35. package/dist/commands/migrate/printer.d.ts +6 -0
  36. package/dist/commands/migrate/printer.js +46 -0
  37. package/dist/commands/migrate/printer.js.map +1 -0
  38. package/dist/commands/validate/index.d.ts +26 -0
  39. package/dist/commands/validate/index.js +122 -0
  40. package/dist/commands/validate/index.js.map +1 -0
  41. package/dist/commands/validate/validate.test.d.ts +1 -0
  42. package/dist/commands/validate/validate.test.js +163 -0
  43. package/dist/commands/validate/validate.test.js.map +1 -0
  44. package/dist/index.js +54 -10
  45. package/dist/index.js.map +1 -1
  46. package/dist/shared/format.d.ts +26 -0
  47. package/dist/shared/format.js +40 -0
  48. package/dist/shared/format.js.map +1 -0
  49. package/dist/templates/files.d.ts +1 -1
  50. package/dist/templates/files.js +61 -9
  51. package/dist/templates/files.js.map +1 -1
  52. package/dist/templates/files.test.d.ts +1 -0
  53. package/dist/templates/files.test.js +174 -0
  54. package/dist/templates/files.test.js.map +1 -0
  55. package/dist/types/folder-tree.d.ts +31 -2
  56. package/dist/types/folder-tree.js +18 -0
  57. package/dist/types/folder-tree.js.map +1 -1
  58. package/dist/utils/config.d.ts +19 -6
  59. package/dist/utils/config.js +76 -14
  60. package/dist/utils/config.js.map +1 -1
  61. package/dist/utils/config.test.d.ts +1 -0
  62. package/dist/utils/config.test.js +117 -0
  63. package/dist/utils/config.test.js.map +1 -0
  64. package/dist/utils/template-resolver.d.ts +1 -1
  65. package/dist/utils/template-resolver.js +1 -1
  66. package/dist/utils/template-resolver.js.map +1 -1
  67. package/dist/utils/template-resolver.test.d.ts +1 -0
  68. package/dist/utils/template-resolver.test.js +86 -0
  69. package/dist/utils/template-resolver.test.js.map +1 -0
  70. package/package.json +13 -5
@@ -0,0 +1,163 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../../src/commands/validate/validate.test.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,26 +2,34 @@
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
- const init_1 = require("./commands/init");
5
+ const check_1 = require("./commands/check");
6
+ const explain_1 = require("./commands/explain");
6
7
  const generate_1 = require("./commands/generate");
8
+ const init_1 = require("./commands/init");
9
+ const migrate_1 = require("./commands/migrate");
7
10
  const validate_1 = require("./commands/validate");
8
11
  const program = new commander_1.Command();
9
12
  program
10
13
  .name('component-forge')
11
14
  .description('Architecture-first CLI for scalable React projects')
12
- .version('0.1.0');
15
+ .version('1.2.0');
16
+ // ---------------------------------------------------------------------------
17
+ // init
18
+ // ---------------------------------------------------------------------------
13
19
  program
14
20
  .command('init')
15
- .description('Initialize project structure')
16
- .argument('<architecture>', 'Architecture type (fsd | modular)', (value) => {
17
- if (!['fsd', 'modular'].includes(value)) {
18
- throw new Error('Architecture must be fsd or modular');
19
- }
20
- return value;
21
- })
21
+ .description('Initialize project structure (interactive if no architecture provided)')
22
+ .argument('[architecture]', 'Architecture type: fsd | modular (optional prompts if omitted)')
22
23
  .action((architecture) => {
24
+ if (architecture !== undefined && !['fsd', 'modular'].includes(architecture)) {
25
+ console.error(`error: architecture must be "fsd" or "modular", got "${architecture}"`);
26
+ process.exit(1);
27
+ }
23
28
  (0, init_1.initCommand)(architecture);
24
29
  });
30
+ // ---------------------------------------------------------------------------
31
+ // generate
32
+ // ---------------------------------------------------------------------------
25
33
  const SLICE_TYPES = ['feature', 'entity', 'widget', 'page', 'component', 'module'];
26
34
  program
27
35
  .command('generate')
@@ -33,16 +41,52 @@ program
33
41
  }
34
42
  return value;
35
43
  })
36
- .argument('<name>', 'Slice name')
44
+ .argument('<name>', 'Slice name (supports nested paths, e.g. forms/Input)')
37
45
  .option('--dry-run', 'Preview files that would be generated without writing them')
38
46
  .action((type, name, options) => {
39
47
  (0, generate_1.generateCommand)(type, name, { dryRun: options.dryRun });
40
48
  });
49
+ // ---------------------------------------------------------------------------
50
+ // validate
51
+ // ---------------------------------------------------------------------------
41
52
  program
42
53
  .command('validate')
43
54
  .description('Validate project structure against the configured architecture')
44
55
  .action(() => {
45
56
  (0, validate_1.validateCommand)();
46
57
  });
58
+ // ---------------------------------------------------------------------------
59
+ // check
60
+ // ---------------------------------------------------------------------------
61
+ program
62
+ .command('check')
63
+ .description('Check that imports do not violate architecture layer boundaries')
64
+ .action(() => {
65
+ (0, check_1.checkCommand)();
66
+ });
67
+ // ---------------------------------------------------------------------------
68
+ // migrate
69
+ // ---------------------------------------------------------------------------
70
+ program
71
+ .command('migrate')
72
+ .description('Analyse current project structure and propose a migration plan')
73
+ .requiredOption('--to <architecture>', 'Target architecture: fsd | modular')
74
+ .action((options) => {
75
+ if (!['fsd', 'modular'].includes(options.to)) {
76
+ console.error(`error: --to must be "fsd" or "modular", got "${options.to}"`);
77
+ process.exit(1);
78
+ }
79
+ (0, migrate_1.migrateCommand)(options.to);
80
+ });
81
+ // ---------------------------------------------------------------------------
82
+ // explain
83
+ // ---------------------------------------------------------------------------
84
+ program
85
+ .command('explain')
86
+ .description('Print architecture documentation in the terminal')
87
+ .argument('<topic>', `Topic to explain: ${explain_1.AVAILABLE_TOPICS.join(' | ')}`)
88
+ .action((topic) => {
89
+ (0, explain_1.explainCommand)(topic);
90
+ });
47
91
  program.parse(process.argv);
48
92
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAmC;AAEnC,0CAA6C;AAC7C,kDAAgE;AAChE,kDAAqD;AAErD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,gBAAgB,EAAE,mCAAmC,EAAE,CAAC,KAAK,EAAE,EAAE;IACzE,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAC;KACD,MAAM,CAAC,CAAC,YAA+B,EAAE,EAAE;IAC1C,IAAA,kBAAW,EAAC,YAAY,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEJ,MAAM,WAAW,GAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;AAE/F,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,QAAQ,EAAE,eAAe,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;IACvE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAkB,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,KAAkB,CAAA;AAC3B,CAAC,CAAC;KACD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,WAAW,EAAE,4DAA4D,CAAC;KACjF,MAAM,CAAC,CAAC,IAAe,EAAE,IAAY,EAAE,OAA6B,EAAE,EAAE;IACvE,IAAA,0BAAe,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,0BAAe,GAAE,CAAA;AACnB,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare const fmt: {
2
+ /** Bold white section heading */
3
+ readonly h1: (text: string) => string;
4
+ /** Bold cyan sub-heading */
5
+ readonly h2: (text: string) => string;
6
+ /** Dim horizontal rule (58 chars) */
7
+ readonly rule: () => string;
8
+ /** Indent a line by two spaces */
9
+ readonly line: (text: string) => string;
10
+ /** Dim / secondary text */
11
+ readonly dim: (text: string) => string;
12
+ /** Inline tag badge (cyan background) */
13
+ readonly tag: (text: string) => string;
14
+ /** Green checkmark item */
15
+ readonly ok: (text: string) => string;
16
+ /** Red cross item */
17
+ readonly no: (text: string) => string;
18
+ /**
19
+ * Renders a layer import-direction row.
20
+ *
21
+ * @param from source layer name
22
+ * @param to target layer name
23
+ * @param allowed true → green arrow, false → red cross
24
+ */
25
+ readonly arrow: (from: string, to: string, allowed: boolean) => string;
26
+ };
@@ -0,0 +1,40 @@
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.fmt = void 0;
7
+ /**
8
+ * Shared chalk formatting helpers used across CLI output.
9
+ *
10
+ * Keeping these in one place ensures visual consistency and
11
+ * makes it easy to restyle the entire CLI from a single file.
12
+ */
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ exports.fmt = {
15
+ /** Bold white section heading */
16
+ h1: (text) => chalk_1.default.bold.white(`\n ${text}\n`),
17
+ /** Bold cyan sub-heading */
18
+ h2: (text) => chalk_1.default.bold.cyan(`\n ${text}`),
19
+ /** Dim horizontal rule (58 chars) */
20
+ rule: () => chalk_1.default.gray(` ${'─'.repeat(58)}`),
21
+ /** Indent a line by two spaces */
22
+ line: (text) => ` ${text}`,
23
+ /** Dim / secondary text */
24
+ dim: (text) => chalk_1.default.gray(text),
25
+ /** Inline tag badge (cyan background) */
26
+ tag: (text) => chalk_1.default.bgCyan.black(` ${text} `),
27
+ /** Green checkmark item */
28
+ ok: (text) => ` ${chalk_1.default.green('✓')} ${text}`,
29
+ /** Red cross item */
30
+ no: (text) => ` ${chalk_1.default.red('✗')} ${text}`,
31
+ /**
32
+ * Renders a layer import-direction row.
33
+ *
34
+ * @param from source layer name
35
+ * @param to target layer name
36
+ * @param allowed true → green arrow, false → red cross
37
+ */
38
+ arrow: (from, to, allowed) => ` ${chalk_1.default.cyan(from.padEnd(12))} ${allowed ? chalk_1.default.green('→') : chalk_1.default.red('✗')} ${chalk_1.default.white(to)}`,
39
+ };
40
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/shared/format.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;GAKG;AACH,kDAAyB;AAEZ,QAAA,GAAG,GAAG;IACjB,iCAAiC;IACjC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;IAEvD,4BAA4B;IAC5B,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAEpD,qCAAqC;IACrC,IAAI,EAAE,GAAG,EAAE,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAE7C,kCAAkC;IAClC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;IAEnC,2BAA2B;IAC3B,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAEvC,yCAAyC;IACzC,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,eAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;IAEtD,2BAA2B;IAC3B,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IAErD,qBAAqB;IACrB,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IAEnD;;;;;;OAMG;IACH,KAAK,EAAE,CAAC,IAAY,EAAE,EAAU,EAAE,OAAgB,EAAE,EAAE,CACpD,KAAK,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;CAC9F,CAAA"}
@@ -1,4 +1,4 @@
1
- import { SliceType } from '../types/folder-tree';
1
+ import type { SliceType } from '../types/folder-tree';
2
2
  type SliceFileMap = Record<string, string>;
3
3
  /**
4
4
  * Returns a map of { relativeFilePath: fileContent } for a given slice type.
@@ -9,9 +9,10 @@ function toPascalCase(name) {
9
9
  return name.charAt(0).toUpperCase() + name.slice(1);
10
10
  }
11
11
  // ---------------------------------------------------------------------------
12
- // Individual file templates
12
+ // Shared file templates
13
13
  // ---------------------------------------------------------------------------
14
- const indexTemplate = (name) => {
14
+ /** Public barrel re-exports ui component + its props type */
15
+ const uiBarrelTemplate = (name) => {
15
16
  const pascal = toPascalCase(name);
16
17
  return [
17
18
  `export { ${pascal} } from './ui/${pascal}'`,
@@ -19,7 +20,22 @@ const indexTemplate = (name) => {
19
20
  '',
20
21
  ].join('\n');
21
22
  };
22
- const componentIndexTemplate = (name) => {
23
+ /** Public barrel for entity — re-exports model types and api */
24
+ const entityBarrelTemplate = (name) => {
25
+ const pascal = toPascalCase(name);
26
+ return [
27
+ `export type { ${pascal}State } from './model'`,
28
+ `export { fetch${pascal} } from './api'`,
29
+ '',
30
+ ].join('\n');
31
+ };
32
+ /** Public barrel for page — re-exports Page component */
33
+ const pageBarrelTemplate = (name) => {
34
+ const pascal = toPascalCase(name);
35
+ return [`export { ${pascal}Page } from './ui/${pascal}Page'`, ''].join('\n');
36
+ };
37
+ /** Public barrel for flat component */
38
+ const componentBarrelTemplate = (name) => {
23
39
  const pascal = toPascalCase(name);
24
40
  return [
25
41
  `export { ${pascal} } from './${pascal}'`,
@@ -27,6 +43,7 @@ const componentIndexTemplate = (name) => {
27
43
  '',
28
44
  ].join('\n');
29
45
  };
46
+ /** React function component */
30
47
  const reactComponentTemplate = (name) => {
31
48
  const pascal = toPascalCase(name);
32
49
  return [
@@ -44,6 +61,7 @@ const reactComponentTemplate = (name) => {
44
61
  ``,
45
62
  ].join('\n');
46
63
  };
64
+ /** State / stores / hooks */
47
65
  const modelTemplate = (name) => {
48
66
  const pascal = toPascalCase(name);
49
67
  return [
@@ -55,6 +73,7 @@ const modelTemplate = (name) => {
55
73
  ``,
56
74
  ].join('\n');
57
75
  };
76
+ /** Data fetching / mutations */
58
77
  const apiTemplate = (name) => {
59
78
  const pascal = toPascalCase(name);
60
79
  return [
@@ -76,33 +95,66 @@ const apiTemplate = (name) => {
76
95
  function getSliceFiles(sliceType, name) {
77
96
  const pascal = toPascalCase(name);
78
97
  switch (sliceType) {
98
+ /**
99
+ * feature — full vertical slice (FSD)
100
+ * Owns its own UI, business logic (model) and server communication (api).
101
+ */
79
102
  case 'feature':
80
- case 'entity':
81
103
  return {
82
- 'index.ts': indexTemplate(name),
104
+ 'index.ts': uiBarrelTemplate(name),
83
105
  [`ui/${pascal}.tsx`]: reactComponentTemplate(name),
84
106
  'model/index.ts': modelTemplate(name),
85
107
  'api/index.ts': apiTemplate(name),
86
108
  };
109
+ /**
110
+ * entity — data-layer slice (FSD)
111
+ * Represents a domain object: model + api, no UI of its own.
112
+ * UI is assembled in features/widgets that consume the entity.
113
+ */
114
+ case 'entity':
115
+ return {
116
+ 'index.ts': entityBarrelTemplate(name),
117
+ 'model/index.ts': modelTemplate(name),
118
+ 'api/index.ts': apiTemplate(name),
119
+ };
120
+ /**
121
+ * widget — composite UI block (FSD)
122
+ * Combines multiple features/entities into a self-contained UI block.
123
+ * Has UI and may have local model state, but does NOT own server calls.
124
+ */
87
125
  case 'widget':
88
126
  return {
89
- 'index.ts': indexTemplate(name),
127
+ 'index.ts': uiBarrelTemplate(name),
90
128
  [`ui/${pascal}.tsx`]: reactComponentTemplate(name),
91
129
  'model/index.ts': modelTemplate(name),
92
130
  };
131
+ /**
132
+ * page — route-level shell (FSD)
133
+ * Thin composition layer: assembles widgets/features for a route.
134
+ * No model or api — those belong to the layers below.
135
+ */
93
136
  case 'page':
94
137
  return {
95
- 'index.ts': [`export { ${pascal}Page } from './ui/${pascal}Page'`, ''].join('\n'),
138
+ 'index.ts': pageBarrelTemplate(name),
96
139
  [`ui/${pascal}Page.tsx`]: reactComponentTemplate(`${pascal}Page`),
97
140
  };
141
+ /**
142
+ * component — pure UI atom (FSD shared/ui or Modular shared/ui)
143
+ * Stateless, presentational, reusable across the whole codebase.
144
+ * Flat structure — no sub-directories.
145
+ */
98
146
  case 'component':
99
147
  return {
100
- 'index.ts': componentIndexTemplate(name),
148
+ 'index.ts': componentBarrelTemplate(name),
101
149
  [`${pascal}.tsx`]: reactComponentTemplate(name),
102
150
  };
151
+ /**
152
+ * module — full vertical slice (Modular architecture)
153
+ * Equivalent to a feature in FSD: owns UI, model and api.
154
+ */
103
155
  case 'module':
104
156
  return {
105
- 'index.ts': indexTemplate(name),
157
+ 'index.ts': uiBarrelTemplate(name),
106
158
  [`ui/${pascal}.tsx`]: reactComponentTemplate(name),
107
159
  'model/index.ts': modelTemplate(name),
108
160
  'api/index.ts': apiTemplate(name),
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/templates/files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/templates/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};