@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.
- package/README.md +8 -0
- package/dist/commands/check/check.test.d.ts +1 -0
- package/dist/commands/check/check.test.js +151 -0
- package/dist/commands/check/check.test.js.map +1 -0
- package/dist/commands/check/index.d.ts +15 -0
- package/dist/commands/check/index.js +186 -0
- package/dist/commands/check/index.js.map +1 -0
- package/dist/commands/explain/explain.test.d.ts +1 -0
- package/dist/commands/explain/explain.test.js +57 -0
- package/dist/commands/explain/explain.test.js.map +1 -0
- package/dist/commands/explain/index.d.ts +12 -0
- package/dist/commands/explain/index.js +37 -0
- package/dist/commands/explain/index.js.map +1 -0
- package/dist/commands/explain/topics.d.ts +3 -0
- package/dist/commands/explain/topics.js +138 -0
- package/dist/commands/explain/topics.js.map +1 -0
- package/dist/commands/generate/index.d.ts +6 -0
- package/dist/commands/generate/index.js +100 -0
- package/dist/commands/generate/index.js.map +1 -0
- package/dist/commands/init/index.d.ts +29 -0
- package/dist/commands/init/index.js +157 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/migrate/classifier.d.ts +22 -0
- package/dist/commands/migrate/classifier.js +48 -0
- package/dist/commands/migrate/classifier.js.map +1 -0
- package/dist/commands/migrate/index.d.ts +8 -0
- package/dist/commands/migrate/index.js +33 -0
- package/dist/commands/migrate/index.js.map +1 -0
- package/dist/commands/migrate/migrate.test.d.ts +1 -0
- package/dist/commands/migrate/migrate.test.js +176 -0
- package/dist/commands/migrate/migrate.test.js.map +1 -0
- package/dist/commands/migrate/plan-builder.d.ts +27 -0
- package/dist/commands/migrate/plan-builder.js +106 -0
- package/dist/commands/migrate/plan-builder.js.map +1 -0
- package/dist/commands/migrate/printer.d.ts +6 -0
- package/dist/commands/migrate/printer.js +46 -0
- package/dist/commands/migrate/printer.js.map +1 -0
- package/dist/commands/validate/index.d.ts +26 -0
- package/dist/commands/validate/index.js +122 -0
- package/dist/commands/validate/index.js.map +1 -0
- package/dist/commands/validate/validate.test.d.ts +1 -0
- package/dist/commands/validate/validate.test.js +163 -0
- package/dist/commands/validate/validate.test.js.map +1 -0
- package/dist/index.js +54 -10
- package/dist/index.js.map +1 -1
- package/dist/shared/format.d.ts +26 -0
- package/dist/shared/format.js +40 -0
- package/dist/shared/format.js.map +1 -0
- package/dist/templates/files.d.ts +1 -1
- package/dist/templates/files.js +61 -9
- package/dist/templates/files.js.map +1 -1
- package/dist/templates/files.test.d.ts +1 -0
- package/dist/templates/files.test.js +174 -0
- package/dist/templates/files.test.js.map +1 -0
- package/dist/types/folder-tree.d.ts +31 -2
- package/dist/types/folder-tree.js +18 -0
- package/dist/types/folder-tree.js.map +1 -1
- package/dist/utils/config.d.ts +19 -6
- package/dist/utils/config.js +76 -14
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/config.test.d.ts +1 -0
- package/dist/utils/config.test.js +117 -0
- package/dist/utils/config.test.js.map +1 -0
- package/dist/utils/template-resolver.d.ts +1 -1
- package/dist/utils/template-resolver.js +1 -1
- package/dist/utils/template-resolver.js.map +1 -1
- package/dist/utils/template-resolver.test.d.ts +1 -0
- package/dist/utils/template-resolver.test.js +86 -0
- package/dist/utils/template-resolver.test.js.map +1 -0
- package/package.json +13 -5
|
@@ -0,0 +1,174 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.test.js","sourceRoot":"","sources":["../../src/templates/files.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,14 +10,28 @@ export type Architecture = 'fsd' | 'modular';
|
|
|
10
10
|
*/
|
|
11
11
|
export type SliceType = 'feature' | 'entity' | 'widget' | 'page' | 'component' | 'module';
|
|
12
12
|
/**
|
|
13
|
-
* Project config
|
|
13
|
+
* Project config — written by `init`, read by all commands.
|
|
14
|
+
*
|
|
15
|
+
* Can live in:
|
|
16
|
+
* - forge.config.ts (recommended — full TypeScript + IntelliSense)
|
|
17
|
+
* - .component-forge.json (legacy — still supported for backwards compatibility)
|
|
18
|
+
*
|
|
19
|
+
* @example forge.config.ts
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { defineConfig } from '@xanahlight/component-forge'
|
|
22
|
+
*
|
|
23
|
+
* export default defineConfig({
|
|
24
|
+
* architecture: 'fsd',
|
|
25
|
+
* srcDir: 'src',
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
14
28
|
*/
|
|
15
29
|
export interface ProjectConfig {
|
|
16
30
|
architecture: Architecture;
|
|
17
31
|
srcDir: string;
|
|
18
32
|
/**
|
|
19
33
|
* Optional path to a directory containing custom Handlebars (.hbs) templates.
|
|
20
|
-
* Resolved relative to the project root
|
|
34
|
+
* Resolved relative to the project root.
|
|
21
35
|
*
|
|
22
36
|
* Directory structure must mirror the built-in layout:
|
|
23
37
|
* <templatesDir>/<sliceType>/<file>.hbs
|
|
@@ -28,3 +42,18 @@ export interface ProjectConfig {
|
|
|
28
42
|
*/
|
|
29
43
|
templates?: string;
|
|
30
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Type-safe config helper — provides IntelliSense and compile-time validation
|
|
47
|
+
* in forge.config.ts.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* import { defineConfig } from '@xanahlight/component-forge'
|
|
52
|
+
*
|
|
53
|
+
* export default defineConfig({
|
|
54
|
+
* architecture: 'fsd',
|
|
55
|
+
* srcDir: 'src',
|
|
56
|
+
* })
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function defineConfig(config: ProjectConfig): ProjectConfig;
|
|
@@ -1,3 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineConfig = defineConfig;
|
|
4
|
+
/**
|
|
5
|
+
* Type-safe config helper — provides IntelliSense and compile-time validation
|
|
6
|
+
* in forge.config.ts.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { defineConfig } from '@xanahlight/component-forge'
|
|
11
|
+
*
|
|
12
|
+
* export default defineConfig({
|
|
13
|
+
* architecture: 'fsd',
|
|
14
|
+
* srcDir: 'src',
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
function defineConfig(config) {
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
3
21
|
//# sourceMappingURL=folder-tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder-tree.js","sourceRoot":"","sources":["../../src/types/folder-tree.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"folder-tree.js","sourceRoot":"","sources":["../../src/types/folder-tree.ts"],"names":[],"mappings":";;AAoEA,oCAEC;AAhBD;;;;;;;;;;;;;GAaG;AACH,SAAgB,YAAY,CAAC,MAAqB;IAChD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -1,11 +1,24 @@
|
|
|
1
|
-
import { ProjectConfig } from '../types/folder-tree';
|
|
2
|
-
export declare const
|
|
1
|
+
import type { ProjectConfig } from '../types/folder-tree';
|
|
2
|
+
export declare const CONFIG_FILENAMES: {
|
|
3
|
+
readonly ts: "forge.config.ts";
|
|
4
|
+
readonly js: "forge.config.js";
|
|
5
|
+
readonly json: ".component-forge.json";
|
|
6
|
+
};
|
|
3
7
|
/**
|
|
4
|
-
* Reads and returns the project config
|
|
5
|
-
*
|
|
8
|
+
* Reads and returns the project config.
|
|
9
|
+
*
|
|
10
|
+
* Resolution order:
|
|
11
|
+
* 1. forge.config.ts
|
|
12
|
+
* 2. forge.config.js
|
|
13
|
+
* 3. .component-forge.json (legacy)
|
|
14
|
+
*
|
|
15
|
+
* Exits with a user-friendly error if no config is found.
|
|
6
16
|
*/
|
|
7
|
-
export declare function loadProjectConfig(): ProjectConfig;
|
|
17
|
+
export declare function loadProjectConfig(projectRoot?: string): ProjectConfig;
|
|
8
18
|
/**
|
|
9
|
-
* Writes the project config to .component-forge.json.
|
|
19
|
+
* Writes the project config to .component-forge.json (legacy format).
|
|
20
|
+
* Used by the `init` command when scaffolding a new project.
|
|
21
|
+
*
|
|
22
|
+
* Note: users can migrate to forge.config.ts at any time for better DX.
|
|
10
23
|
*/
|
|
11
24
|
export declare function writeProjectConfig(config: ProjectConfig, projectRoot: string): void;
|
package/dist/utils/config.js
CHANGED
|
@@ -3,31 +3,93 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.CONFIG_FILENAMES = void 0;
|
|
7
7
|
exports.loadProjectConfig = loadProjectConfig;
|
|
8
8
|
exports.writeProjectConfig = writeProjectConfig;
|
|
9
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
+
const jiti_1 = require("jiti");
|
|
11
12
|
const logger_1 = require("./logger");
|
|
12
|
-
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Config file resolution order
|
|
15
|
+
//
|
|
16
|
+
// 1. forge.config.ts ← recommended (TypeScript, IntelliSense)
|
|
17
|
+
// 2. forge.config.js ← for projects that prefer plain JS
|
|
18
|
+
// 3. .component-forge.json ← legacy (backwards compat)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
exports.CONFIG_FILENAMES = {
|
|
21
|
+
ts: 'forge.config.ts',
|
|
22
|
+
js: 'forge.config.js',
|
|
23
|
+
json: '.component-forge.json',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Attempts to load forge.config.ts / forge.config.js via jiti (zero-config TS runner).
|
|
27
|
+
* Returns the default export, or null if the file does not exist.
|
|
28
|
+
*/
|
|
29
|
+
function loadTsConfig(projectRoot) {
|
|
30
|
+
for (const filename of [exports.CONFIG_FILENAMES.ts, exports.CONFIG_FILENAMES.js]) {
|
|
31
|
+
const configPath = node_path_1.default.join(projectRoot, filename);
|
|
32
|
+
if (!fs_extra_1.default.existsSync(configPath))
|
|
33
|
+
continue;
|
|
34
|
+
try {
|
|
35
|
+
// jiti executes TypeScript on-the-fly — no build step needed
|
|
36
|
+
const jiti = (0, jiti_1.createJiti)(__filename, { interopDefault: true });
|
|
37
|
+
const mod = jiti(configPath);
|
|
38
|
+
const config = mod.default ?? mod;
|
|
39
|
+
if (!config || typeof config !== 'object') {
|
|
40
|
+
logger_1.logger.error(`${filename} must export a default config object.`);
|
|
41
|
+
logger_1.logger.info(`Use defineConfig({ architecture: 'fsd', srcDir: 'src' }) as the default export.`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
return config;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
logger_1.logger.error(`Failed to load ${filename}: ${err.message}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
13
53
|
/**
|
|
14
|
-
* Reads and returns the project config
|
|
15
|
-
*
|
|
54
|
+
* Reads and returns the project config.
|
|
55
|
+
*
|
|
56
|
+
* Resolution order:
|
|
57
|
+
* 1. forge.config.ts
|
|
58
|
+
* 2. forge.config.js
|
|
59
|
+
* 3. .component-forge.json (legacy)
|
|
60
|
+
*
|
|
61
|
+
* Exits with a user-friendly error if no config is found.
|
|
16
62
|
*/
|
|
17
|
-
function loadProjectConfig() {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
63
|
+
function loadProjectConfig(projectRoot = process.cwd()) {
|
|
64
|
+
// 1 & 2 — TypeScript / JS config
|
|
65
|
+
const tsConfig = loadTsConfig(projectRoot);
|
|
66
|
+
if (tsConfig)
|
|
67
|
+
return tsConfig;
|
|
68
|
+
// 3 — Legacy JSON config
|
|
69
|
+
const jsonPath = node_path_1.default.join(projectRoot, exports.CONFIG_FILENAMES.json);
|
|
70
|
+
if (fs_extra_1.default.existsSync(jsonPath)) {
|
|
71
|
+
return fs_extra_1.default.readJsonSync(jsonPath);
|
|
23
72
|
}
|
|
24
|
-
|
|
73
|
+
// Nothing found
|
|
74
|
+
logger_1.logger.error(`No forge.config.ts (or ${exports.CONFIG_FILENAMES.json}) found.`);
|
|
75
|
+
logger_1.logger.info('Run "component-forge init" to create a config, or create forge.config.ts manually:');
|
|
76
|
+
logger_1.logger.info('');
|
|
77
|
+
logger_1.logger.info(" import { defineConfig } from '@xanahlight/component-forge'");
|
|
78
|
+
logger_1.logger.info('');
|
|
79
|
+
logger_1.logger.info(" export default defineConfig({");
|
|
80
|
+
logger_1.logger.info(" architecture: 'fsd',");
|
|
81
|
+
logger_1.logger.info(" srcDir: 'src',");
|
|
82
|
+
logger_1.logger.info(" })");
|
|
83
|
+
process.exit(1);
|
|
25
84
|
}
|
|
26
85
|
/**
|
|
27
|
-
* Writes the project config to .component-forge.json.
|
|
86
|
+
* Writes the project config to .component-forge.json (legacy format).
|
|
87
|
+
* Used by the `init` command when scaffolding a new project.
|
|
88
|
+
*
|
|
89
|
+
* Note: users can migrate to forge.config.ts at any time for better DX.
|
|
28
90
|
*/
|
|
29
91
|
function writeProjectConfig(config, projectRoot) {
|
|
30
|
-
const configPath = node_path_1.default.join(projectRoot, exports.
|
|
92
|
+
const configPath = node_path_1.default.join(projectRoot, exports.CONFIG_FILENAMES.json);
|
|
31
93
|
fs_extra_1.default.writeJsonSync(configPath, config, { spaces: 2 });
|
|
32
94
|
}
|
|
33
95
|
//# sourceMappingURL=config.js.map
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -4,9 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.resolveSliceFiles = resolveSliceFiles;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
8
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
9
|
const handlebars_1 = __importDefault(require("handlebars"));
|
|
9
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const files_1 = require("../templates/files");
|
|
11
11
|
/** "auth" → "Auth", "userProfile" → "UserProfile" */
|
|
12
12
|
function toPascalCase(str) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-resolver.js","sourceRoot":"","sources":["../../src/utils/template-resolver.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"template-resolver.js","sourceRoot":"","sources":["../../src/utils/template-resolver.ts"],"names":[],"mappings":";;;;;AA+DA,8CAsCC;AArGD,0DAA4B;AAE5B,wDAAyB;AACzB,4DAAmC;AAEnC,8CAAkD;AA8BlD,qDAAqD;AACrD,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,OAAe,EAAE,OAAwB;IAC3D,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,kBAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,oBAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAC/B,SAAoB,EACpB,IAAY,EACZ,YAAqB;IAErB,+BAA+B;IAC/B,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAE9C,uDAAuD;IACvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IAEpD,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,OAAO,GAAoB;QAC/B,IAAI;QACJ,IAAI,EAAE,YAAY,CAAC,mBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,SAAS;KACV,CAAA;IAED,6DAA6D;IAC7D,MAAM,QAAQ,GAA2B,EAAE,GAAG,OAAO,EAAE,CAAA;IAEvD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,MAAM,CAAC,CAAA;QACtD,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAElD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,CAAA;QACnC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|