@config-bound/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-format$colon$ci.log +6 -0
- package/.turbo/turbo-lint$colon$ci.log +4 -0
- package/.turbo/turbo-test.log +19 -0
- package/CHANGELOG.md +15 -0
- package/README.md +66 -0
- package/bin/configbound.js +3 -0
- package/dist/cli.module.d.ts +3 -0
- package/dist/cli.module.d.ts.map +1 -0
- package/dist/cli.module.js +29 -0
- package/dist/cli.module.js.map +1 -0
- package/dist/commands/export.command.d.ts +30 -0
- package/dist/commands/export.command.d.ts.map +1 -0
- package/dist/commands/export.command.js +226 -0
- package/dist/commands/export.command.js.map +1 -0
- package/dist/commands/list.command.d.ts +13 -0
- package/dist/commands/list.command.d.ts.map +1 -0
- package/dist/commands/list.command.js +93 -0
- package/dist/commands/list.command.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +17 -0
- package/dist/main.js.map +1 -0
- package/dist/services/config-discovery.service.d.ts +15 -0
- package/dist/services/config-discovery.service.d.ts.map +1 -0
- package/dist/services/config-discovery.service.js +191 -0
- package/dist/services/config-discovery.service.js.map +1 -0
- package/dist/services/config-discovery.service.spec.d.ts +2 -0
- package/dist/services/config-discovery.service.spec.d.ts.map +1 -0
- package/dist/services/config-discovery.service.spec.js +137 -0
- package/dist/services/config-discovery.service.spec.js.map +1 -0
- package/dist/services/config-loader.service.d.ts +13 -0
- package/dist/services/config-loader.service.d.ts.map +1 -0
- package/dist/services/config-loader.service.js +241 -0
- package/dist/services/config-loader.service.js.map +1 -0
- package/dist/services/file-writer.service.d.ts +6 -0
- package/dist/services/file-writer.service.d.ts.map +1 -0
- package/dist/services/file-writer.service.js +38 -0
- package/dist/services/file-writer.service.js.map +1 -0
- package/dist/services/file-writer.service.spec.d.ts +2 -0
- package/dist/services/file-writer.service.spec.d.ts.map +1 -0
- package/dist/services/file-writer.service.spec.js +98 -0
- package/dist/services/file-writer.service.spec.js.map +1 -0
- package/dist/services/schema-export.service.d.ts +14 -0
- package/dist/services/schema-export.service.d.ts.map +1 -0
- package/dist/services/schema-export.service.js +58 -0
- package/dist/services/schema-export.service.js.map +1 -0
- package/dist/services/schema-export.service.spec.d.ts +2 -0
- package/dist/services/schema-export.service.spec.d.ts.map +1 -0
- package/dist/services/schema-export.service.spec.js +69 -0
- package/dist/services/schema-export.service.spec.js.map +1 -0
- package/eslint.config.mjs +5 -0
- package/jest.config.js +39 -0
- package/package.json +62 -0
- package/src/cli.module.ts +21 -0
- package/src/commands/export.command.ts +253 -0
- package/src/commands/list.command.ts +108 -0
- package/src/main.ts +19 -0
- package/src/services/config-discovery.service.spec.ts +209 -0
- package/src/services/config-discovery.service.ts +237 -0
- package/src/services/config-loader.service.ts +379 -0
- package/src/services/file-writer.service.spec.ts +139 -0
- package/src/services/file-writer.service.ts +32 -0
- package/src/services/schema-export.service.spec.ts +124 -0
- package/src/services/schema-export.service.ts +85 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable } from '@nestjs/common';
|
|
8
|
+
import { Project, Node, SyntaxKind } from 'ts-morph';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import { ensureError } from '@config-bound/config-bound/utilities';
|
|
12
|
+
let ConfigDiscoveryService = class ConfigDiscoveryService {
|
|
13
|
+
async discoverConfigs(searchPath, recursive = true) {
|
|
14
|
+
const tsFiles = this.findTypeScriptFiles(searchPath, recursive);
|
|
15
|
+
const discovered = [];
|
|
16
|
+
const project = new Project({
|
|
17
|
+
skipAddingFilesFromTsConfig: true,
|
|
18
|
+
compilerOptions: {
|
|
19
|
+
allowJs: false,
|
|
20
|
+
skipLibCheck: true
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
for (const filePath of tsFiles) {
|
|
24
|
+
try {
|
|
25
|
+
project.addSourceFileAtPath(filePath);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.warn(`skipping ${filePath}: ${ensureError(error).message}`);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const sourceFile of project.getSourceFiles()) {
|
|
33
|
+
try {
|
|
34
|
+
const configs = this.extractConfigsFromFile(sourceFile);
|
|
35
|
+
discovered.push(...configs);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.warn(`skipping ${sourceFile}: ${ensureError(error).message}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return discovered;
|
|
43
|
+
}
|
|
44
|
+
extractConfigsFromFile(sourceFile) {
|
|
45
|
+
const discovered = [];
|
|
46
|
+
const filePath = sourceFile.getFilePath();
|
|
47
|
+
const variableStatements = sourceFile.getVariableStatements();
|
|
48
|
+
for (const statement of variableStatements) {
|
|
49
|
+
const declarations = statement.getDeclarations();
|
|
50
|
+
for (const declaration of declarations) {
|
|
51
|
+
const initializer = declaration.getInitializer();
|
|
52
|
+
if (!initializer)
|
|
53
|
+
continue;
|
|
54
|
+
if (this.isConfigBoundCreateConfig(initializer)) {
|
|
55
|
+
const isExported = statement
|
|
56
|
+
.getModifiers()
|
|
57
|
+
.some((mod) => mod.getKind() === SyntaxKind.ExportKeyword);
|
|
58
|
+
if (isExported) {
|
|
59
|
+
const exportName = declaration.getName();
|
|
60
|
+
const configName = this.extractConfigName(initializer);
|
|
61
|
+
discovered.push({
|
|
62
|
+
filePath,
|
|
63
|
+
exportName,
|
|
64
|
+
isDefault: false,
|
|
65
|
+
configName,
|
|
66
|
+
lineNumber: declaration.getStartLineNumber()
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const defaultExport = sourceFile.getDefaultExportSymbol();
|
|
73
|
+
if (defaultExport) {
|
|
74
|
+
const declarations = defaultExport.getDeclarations();
|
|
75
|
+
for (const declaration of declarations) {
|
|
76
|
+
if (Node.isExportAssignment(declaration)) {
|
|
77
|
+
const expression = declaration.getExpression();
|
|
78
|
+
if (this.isConfigBoundCreateConfig(expression)) {
|
|
79
|
+
const configName = this.extractConfigName(expression);
|
|
80
|
+
discovered.push({
|
|
81
|
+
filePath,
|
|
82
|
+
exportName: 'default',
|
|
83
|
+
isDefault: true,
|
|
84
|
+
configName,
|
|
85
|
+
lineNumber: declaration.getStartLineNumber()
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return discovered;
|
|
92
|
+
}
|
|
93
|
+
isConfigBoundCreateConfig(node) {
|
|
94
|
+
if (!Node.isCallExpression(node))
|
|
95
|
+
return false;
|
|
96
|
+
const expression = node.getExpression();
|
|
97
|
+
if (Node.isPropertyAccessExpression(expression)) {
|
|
98
|
+
const obj = expression.getExpression();
|
|
99
|
+
const prop = expression.getName();
|
|
100
|
+
if (Node.isIdentifier(obj) &&
|
|
101
|
+
obj.getText() === 'ConfigBound' &&
|
|
102
|
+
prop === 'createConfig') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (Node.isIdentifier(expression)) {
|
|
107
|
+
if (expression.getText() === 'createConfig') {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
extractConfigName(node) {
|
|
114
|
+
if (!Node.isCallExpression(node))
|
|
115
|
+
return undefined;
|
|
116
|
+
const args = node.getArguments();
|
|
117
|
+
if (args.length === 0)
|
|
118
|
+
return undefined;
|
|
119
|
+
const firstArg = args[0];
|
|
120
|
+
if (Node.isObjectLiteralExpression(firstArg)) {
|
|
121
|
+
const nameProperty = firstArg
|
|
122
|
+
.getProperties()
|
|
123
|
+
.find((prop) => Node.isPropertyAssignment(prop) && prop.getName() === 'name');
|
|
124
|
+
if (nameProperty && Node.isPropertyAssignment(nameProperty)) {
|
|
125
|
+
const initializer = nameProperty.getInitializer();
|
|
126
|
+
if (initializer && Node.isStringLiteral(initializer)) {
|
|
127
|
+
return initializer.getLiteralValue();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
findTypeScriptFiles(searchPath, recursive) {
|
|
134
|
+
const files = [];
|
|
135
|
+
const excludedDirs = new Set([
|
|
136
|
+
'node_modules',
|
|
137
|
+
'dist',
|
|
138
|
+
'build',
|
|
139
|
+
'coverage',
|
|
140
|
+
'.git',
|
|
141
|
+
'.next',
|
|
142
|
+
'.nuxt',
|
|
143
|
+
'out',
|
|
144
|
+
'public',
|
|
145
|
+
'static',
|
|
146
|
+
'__pycache__',
|
|
147
|
+
'venv',
|
|
148
|
+
'env'
|
|
149
|
+
]);
|
|
150
|
+
function traverse(dir) {
|
|
151
|
+
let entries;
|
|
152
|
+
try {
|
|
153
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
for (const entry of entries) {
|
|
159
|
+
const fullPath = path.join(dir, entry.name);
|
|
160
|
+
if (entry.isDirectory()) {
|
|
161
|
+
if (excludedDirs.has(entry.name) || entry.name.startsWith('.')) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (recursive) {
|
|
165
|
+
traverse(fullPath);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else if (entry.isFile() && entry.name.endsWith('.ts')) {
|
|
169
|
+
if (!entry.name.endsWith('.spec.ts') &&
|
|
170
|
+
!entry.name.endsWith('.test.ts') &&
|
|
171
|
+
!entry.name.endsWith('.d.ts')) {
|
|
172
|
+
files.push(fullPath);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const stats = fs.statSync(searchPath);
|
|
178
|
+
if (stats.isDirectory()) {
|
|
179
|
+
traverse(searchPath);
|
|
180
|
+
}
|
|
181
|
+
else if (stats.isFile() && searchPath.endsWith('.ts')) {
|
|
182
|
+
files.push(searchPath);
|
|
183
|
+
}
|
|
184
|
+
return files;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
ConfigDiscoveryService = __decorate([
|
|
188
|
+
Injectable()
|
|
189
|
+
], ConfigDiscoveryService);
|
|
190
|
+
export { ConfigDiscoveryService };
|
|
191
|
+
//# sourceMappingURL=config-discovery.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-discovery.service.js","sourceRoot":"","sources":["../../src/services/config-discovery.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-discovery.service.spec.d.ts","sourceRoot":"","sources":["../../src/services/config-discovery.service.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Test } from '@nestjs/testing';
|
|
2
|
+
import { ConfigDiscoveryService } from './config-discovery.service.js';
|
|
3
|
+
import { describe, beforeEach, afterEach, it, expect } from '@jest/globals';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as os from 'os';
|
|
7
|
+
describe('ConfigDiscoveryService', () => {
|
|
8
|
+
let service;
|
|
9
|
+
let tempDir;
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
const module = await Test.createTestingModule({
|
|
12
|
+
providers: [ConfigDiscoveryService]
|
|
13
|
+
}).compile();
|
|
14
|
+
service = module.get(ConfigDiscoveryService);
|
|
15
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'configbound-test-'));
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
if (fs.existsSync(tempDir)) {
|
|
19
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
function createTempFile(relativePath, content) {
|
|
23
|
+
const filePath = path.join(tempDir, relativePath);
|
|
24
|
+
const dir = path.dirname(filePath);
|
|
25
|
+
if (!fs.existsSync(dir)) {
|
|
26
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
29
|
+
return filePath;
|
|
30
|
+
}
|
|
31
|
+
it('should be defined', () => {
|
|
32
|
+
expect(service).toBeDefined();
|
|
33
|
+
});
|
|
34
|
+
it('should discover named export with ConfigBound.createConfig', async () => {
|
|
35
|
+
createTempFile('config.ts', `
|
|
36
|
+
import { ConfigBound } from '@config-bound/config-bound';
|
|
37
|
+
|
|
38
|
+
export const appConfig = ConfigBound.createConfig({
|
|
39
|
+
name: 'MyApp',
|
|
40
|
+
sections: {}
|
|
41
|
+
});
|
|
42
|
+
`);
|
|
43
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
44
|
+
expect(configs).toHaveLength(1);
|
|
45
|
+
expect(configs[0].exportName).toBe('appConfig');
|
|
46
|
+
expect(configs[0].configName).toBe('MyApp');
|
|
47
|
+
expect(configs[0].isDefault).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it('should discover named export with createConfig from named import', async () => {
|
|
50
|
+
createTempFile('config.ts', `
|
|
51
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
52
|
+
|
|
53
|
+
export const dbConfig = createConfig({
|
|
54
|
+
name: 'Database',
|
|
55
|
+
sections: {}
|
|
56
|
+
});
|
|
57
|
+
`);
|
|
58
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
59
|
+
expect(configs).toHaveLength(1);
|
|
60
|
+
expect(configs[0].exportName).toBe('dbConfig');
|
|
61
|
+
expect(configs[0].configName).toBe('Database');
|
|
62
|
+
});
|
|
63
|
+
it('should discover default export', async () => {
|
|
64
|
+
createTempFile('config.ts', `
|
|
65
|
+
import { ConfigBound } from '@config-bound/config-bound';
|
|
66
|
+
|
|
67
|
+
export default ConfigBound.createConfig({
|
|
68
|
+
name: 'DefaultConfig',
|
|
69
|
+
sections: {}
|
|
70
|
+
});
|
|
71
|
+
`);
|
|
72
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
73
|
+
expect(configs).toHaveLength(1);
|
|
74
|
+
expect(configs[0].exportName).toBe('default');
|
|
75
|
+
expect(configs[0].isDefault).toBe(true);
|
|
76
|
+
expect(configs[0].configName).toBe('DefaultConfig');
|
|
77
|
+
});
|
|
78
|
+
it('should discover multiple exports in same file', async () => {
|
|
79
|
+
createTempFile('configs.ts', `
|
|
80
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
81
|
+
|
|
82
|
+
export const config1 = createConfig({ name: 'Config1', sections: {} });
|
|
83
|
+
export const config2 = createConfig({ name: 'Config2', sections: {} });
|
|
84
|
+
`);
|
|
85
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
86
|
+
expect(configs).toHaveLength(2);
|
|
87
|
+
expect(configs.map((c) => c.exportName).sort()).toEqual(['config1', 'config2']);
|
|
88
|
+
});
|
|
89
|
+
it('should discover configs recursively', async () => {
|
|
90
|
+
createTempFile('config1.ts', `
|
|
91
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
92
|
+
export const config1 = createConfig({ name: 'Config1', sections: {} });
|
|
93
|
+
`);
|
|
94
|
+
createTempFile('subdir/config2.ts', `
|
|
95
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
96
|
+
export const config2 = createConfig({ name: 'Config2', sections: {} });
|
|
97
|
+
`);
|
|
98
|
+
const configs = await service.discoverConfigs(tempDir, true);
|
|
99
|
+
expect(configs).toHaveLength(2);
|
|
100
|
+
});
|
|
101
|
+
it('should not discover configs when recursive is false', async () => {
|
|
102
|
+
createTempFile('config1.ts', `
|
|
103
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
104
|
+
export const config1 = createConfig({ name: 'Config1', sections: {} });
|
|
105
|
+
`);
|
|
106
|
+
createTempFile('subdir/config2.ts', `
|
|
107
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
108
|
+
export const config2 = createConfig({ name: 'Config2', sections: {} });
|
|
109
|
+
`);
|
|
110
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
111
|
+
expect(configs).toHaveLength(1);
|
|
112
|
+
});
|
|
113
|
+
it('should skip non-exported configs', async () => {
|
|
114
|
+
createTempFile('config.ts', `
|
|
115
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
116
|
+
const privateConfig = createConfig({ name: 'Private', sections: {} });
|
|
117
|
+
`);
|
|
118
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
119
|
+
expect(configs).toHaveLength(0);
|
|
120
|
+
});
|
|
121
|
+
it('should skip test files', async () => {
|
|
122
|
+
createTempFile('config.spec.ts', `
|
|
123
|
+
import { createConfig } from '@config-bound/config-bound';
|
|
124
|
+
export const testConfig = createConfig({ name: 'Test', sections: {} });
|
|
125
|
+
`);
|
|
126
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
127
|
+
expect(configs).toHaveLength(0);
|
|
128
|
+
});
|
|
129
|
+
it('should handle files without configs', async () => {
|
|
130
|
+
createTempFile('other.ts', `
|
|
131
|
+
export const someValue = 42;
|
|
132
|
+
`);
|
|
133
|
+
const configs = await service.discoverConfigs(tempDir, false);
|
|
134
|
+
expect(configs).toHaveLength(0);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=config-discovery.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-discovery.service.spec.js","sourceRoot":"","sources":["../../src/services/config-discovery.service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Section } from '@config-bound/config-bound/section';
|
|
2
|
+
import { ConfigBound, TypedConfigBound, ConfigSchema } from '@config-bound/config-bound';
|
|
3
|
+
export interface LoadedConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
sections: Section[];
|
|
6
|
+
instance: ConfigBound | TypedConfigBound<ConfigSchema>;
|
|
7
|
+
}
|
|
8
|
+
export declare class ConfigLoaderService {
|
|
9
|
+
loadConfig(filePath: string, exportName?: string): Promise<LoadedConfig>;
|
|
10
|
+
loadConfigs(filePath: string): Promise<Map<string, LoadedConfig>>;
|
|
11
|
+
private isConfigBoundInstance;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=config-loader.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.service.d.ts","sourceRoot":"","sources":["../../src/services/config-loader.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EAUb,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;CACxD;AAED,qBACa,mBAAmB;IACxB,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAiNlB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IA6HvE,OAAO,CAAC,qBAAqB;CAa9B"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable } from '@nestjs/common';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import { pathToFileURL } from 'url';
|
|
11
|
+
import { ConfigLoaderException, ConfigFileNotFoundException, ConfigFileIsDirectoryException, ExportNotFoundException, NoConfigBoundInstancesException, MultipleConfigBoundInstancesException, InvalidConfigBoundInstanceException, ConfigFileParseException, MissingDependencyException } from '@config-bound/config-bound';
|
|
12
|
+
let ConfigLoaderService = class ConfigLoaderService {
|
|
13
|
+
async loadConfig(filePath, exportName) {
|
|
14
|
+
const absolutePath = path.resolve(filePath);
|
|
15
|
+
if (!fs.existsSync(absolutePath)) {
|
|
16
|
+
const parentDir = path.dirname(absolutePath);
|
|
17
|
+
const parentExists = fs.existsSync(parentDir);
|
|
18
|
+
let similarFiles;
|
|
19
|
+
if (parentExists) {
|
|
20
|
+
const fileName = path.basename(absolutePath);
|
|
21
|
+
const dirFiles = fs.readdirSync(parentDir);
|
|
22
|
+
similarFiles = dirFiles.filter((file) => file.toLowerCase().includes(fileName.toLowerCase().slice(0, 3)));
|
|
23
|
+
}
|
|
24
|
+
throw new ConfigFileNotFoundException(absolutePath, parentDir, parentExists, similarFiles);
|
|
25
|
+
}
|
|
26
|
+
const stat = fs.statSync(absolutePath);
|
|
27
|
+
if (stat.isDirectory()) {
|
|
28
|
+
throw new ConfigFileIsDirectoryException(absolutePath);
|
|
29
|
+
}
|
|
30
|
+
const isTypeScript = absolutePath.endsWith('.ts') || absolutePath.endsWith('.tsx');
|
|
31
|
+
let fileToLoad = absolutePath;
|
|
32
|
+
const parseExceptionBaseMessage = `TypeScript file found but no compiled .js file exists. Please compile the file first (e.g., run 'tsc' or 'npm run build').`;
|
|
33
|
+
if (isTypeScript) {
|
|
34
|
+
const jsPath = absolutePath.replace(/\.tsx?$/, '.js');
|
|
35
|
+
if (fs.existsSync(jsPath)) {
|
|
36
|
+
fileToLoad = jsPath;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const srcMatch = absolutePath.match(/^(.*[/\\])src([/\\].+)$/);
|
|
40
|
+
if (srcMatch) {
|
|
41
|
+
const distPath = srcMatch[1] + 'dist' + srcMatch[2].replace(/\.tsx?$/, '.js');
|
|
42
|
+
if (fs.existsSync(distPath)) {
|
|
43
|
+
fileToLoad = distPath;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
throw new ConfigFileParseException(filePath, `${parseExceptionBaseMessage} Checked: ${jsPath} and ${distPath}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new ConfigFileParseException(filePath, `${parseExceptionBaseMessage} Expected compiled file at: ${jsPath}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const fileURL = pathToFileURL(fileToLoad).href;
|
|
56
|
+
const module = await import(fileURL);
|
|
57
|
+
let configInstance;
|
|
58
|
+
if (exportName && exportName !== 'default') {
|
|
59
|
+
configInstance = module[exportName];
|
|
60
|
+
if (!configInstance) {
|
|
61
|
+
const allExports = Object.keys(module).filter((key) => key !== '__esModule');
|
|
62
|
+
const namedExports = allExports.filter((key) => key !== 'default');
|
|
63
|
+
const hasDefault = allExports.includes('default');
|
|
64
|
+
const exportValue = module[exportName];
|
|
65
|
+
throw new ExportNotFoundException(exportName, filePath, namedExports, hasDefault, exportValue);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (exportName === 'default' || !exportName) {
|
|
69
|
+
const defaultExport = module.default;
|
|
70
|
+
if (defaultExport && this.isConfigBoundInstance(defaultExport)) {
|
|
71
|
+
configInstance = defaultExport;
|
|
72
|
+
}
|
|
73
|
+
else if (!exportName) {
|
|
74
|
+
const allExports = Object.entries(module).filter(([key]) => key !== '__esModule');
|
|
75
|
+
const configExports = allExports
|
|
76
|
+
.filter(([key]) => key !== 'default')
|
|
77
|
+
.filter(([, value]) => this.isConfigBoundInstance(value));
|
|
78
|
+
if (configExports.length === 0) {
|
|
79
|
+
const nonConfigExports = allExports
|
|
80
|
+
.filter(([key]) => key !== 'default')
|
|
81
|
+
.filter(([, value]) => !this.isConfigBoundInstance(value))
|
|
82
|
+
.map(([key, value]) => [key, typeof value]);
|
|
83
|
+
const hasDefault = allExports.some(([key]) => key === 'default');
|
|
84
|
+
throw new NoConfigBoundInstancesException(filePath, nonConfigExports, hasDefault);
|
|
85
|
+
}
|
|
86
|
+
if (configExports.length > 1) {
|
|
87
|
+
const exportNames = configExports.map(([key]) => key);
|
|
88
|
+
throw new MultipleConfigBoundInstancesException(filePath, exportNames);
|
|
89
|
+
}
|
|
90
|
+
configInstance = configExports[0][1];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
configInstance = defaultExport;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (!configInstance) {
|
|
97
|
+
const targetExport = exportName || 'default';
|
|
98
|
+
const allExports = Object.keys(module).filter((key) => key !== '__esModule');
|
|
99
|
+
const namedExports = allExports.filter((key) => key !== 'default');
|
|
100
|
+
const hasDefault = allExports.includes('default');
|
|
101
|
+
throw new ExportNotFoundException(targetExport, filePath, namedExports, hasDefault, module[targetExport]);
|
|
102
|
+
}
|
|
103
|
+
if (!this.isConfigBoundInstance(configInstance)) {
|
|
104
|
+
const targetExport = exportName || 'default';
|
|
105
|
+
const exportValue = module[targetExport];
|
|
106
|
+
const valueType = typeof exportValue;
|
|
107
|
+
const valueDetails = exportValue === null
|
|
108
|
+
? 'null'
|
|
109
|
+
: exportValue === undefined
|
|
110
|
+
? 'undefined'
|
|
111
|
+
: valueType === 'object'
|
|
112
|
+
? `${valueType} (missing required properties: name, sections)`
|
|
113
|
+
: valueType;
|
|
114
|
+
throw new InvalidConfigBoundInstanceException(targetExport, filePath, valueDetails);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
name: configInstance.name,
|
|
118
|
+
sections: configInstance.sections,
|
|
119
|
+
instance: configInstance
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof ConfigLoaderException) {
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
if (error instanceof Error) {
|
|
127
|
+
if (error.message.includes('Cannot find module')) {
|
|
128
|
+
const moduleMatch = error.message.match(/Cannot find module ['"]([^'"]+)['"]/);
|
|
129
|
+
const missingModule = moduleMatch ? moduleMatch[1] : 'unknown';
|
|
130
|
+
throw new MissingDependencyException(filePath, missingModule, error.message);
|
|
131
|
+
}
|
|
132
|
+
if (error.message.includes('SyntaxError') ||
|
|
133
|
+
error.message.includes('parse') ||
|
|
134
|
+
error.message.includes('Unexpected token')) {
|
|
135
|
+
throw new ConfigFileParseException(filePath, error.message);
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
throw new Error(`Failed to load config file: ${filePath}. Unexpected error: ${String(error)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async loadConfigs(filePath) {
|
|
143
|
+
const absolutePath = path.resolve(filePath);
|
|
144
|
+
if (!fs.existsSync(absolutePath)) {
|
|
145
|
+
const parentDir = path.dirname(absolutePath);
|
|
146
|
+
const parentExists = fs.existsSync(parentDir);
|
|
147
|
+
let similarFiles;
|
|
148
|
+
if (parentExists) {
|
|
149
|
+
const fileName = path.basename(absolutePath);
|
|
150
|
+
const dirFiles = fs.readdirSync(parentDir);
|
|
151
|
+
similarFiles = dirFiles.filter((file) => file.toLowerCase().includes(fileName.toLowerCase().slice(0, 3)));
|
|
152
|
+
}
|
|
153
|
+
throw new ConfigFileNotFoundException(absolutePath, parentDir, parentExists, similarFiles);
|
|
154
|
+
}
|
|
155
|
+
const stat = fs.statSync(absolutePath);
|
|
156
|
+
if (stat.isDirectory()) {
|
|
157
|
+
throw new ConfigFileIsDirectoryException(absolutePath);
|
|
158
|
+
}
|
|
159
|
+
const isTypeScript = absolutePath.endsWith('.ts') || absolutePath.endsWith('.tsx');
|
|
160
|
+
let fileToLoad = absolutePath;
|
|
161
|
+
if (isTypeScript) {
|
|
162
|
+
const jsPath = absolutePath.replace(/\.tsx?$/, '.js');
|
|
163
|
+
if (fs.existsSync(jsPath)) {
|
|
164
|
+
fileToLoad = jsPath;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const srcMatch = absolutePath.match(/^(.*[/\\])src([/\\].+)$/);
|
|
168
|
+
if (srcMatch) {
|
|
169
|
+
const distPath = srcMatch[1] + 'dist' + srcMatch[2].replace(/\.tsx?$/, '.js');
|
|
170
|
+
if (fs.existsSync(distPath)) {
|
|
171
|
+
fileToLoad = distPath;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
throw new ConfigFileParseException(filePath, `TypeScript file found but no compiled .js file exists. Please compile the file first (e.g., run 'tsc' or 'npm run build'). Checked: ${jsPath} and ${distPath}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
throw new ConfigFileParseException(filePath, `TypeScript file found but no compiled .js file exists. Please compile the file first (e.g., run 'tsc' or 'npm run build'). Expected compiled file at: ${jsPath}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const fileURL = pathToFileURL(fileToLoad).href;
|
|
184
|
+
const module = await import(fileURL);
|
|
185
|
+
const configs = new Map();
|
|
186
|
+
if (module.default && this.isConfigBoundInstance(module.default)) {
|
|
187
|
+
configs.set('default', {
|
|
188
|
+
name: module.default.name,
|
|
189
|
+
sections: module.default.sections,
|
|
190
|
+
instance: module.default
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
for (const [exportName, exportValue] of Object.entries(module)) {
|
|
194
|
+
if (exportName !== '__esModule' &&
|
|
195
|
+
exportName !== 'default' &&
|
|
196
|
+
this.isConfigBoundInstance(exportValue)) {
|
|
197
|
+
const typedValue = exportValue;
|
|
198
|
+
configs.set(exportName, {
|
|
199
|
+
name: typedValue.name,
|
|
200
|
+
sections: typedValue.sections,
|
|
201
|
+
instance: typedValue
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return configs;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (error instanceof ConfigLoaderException) {
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
if (error instanceof Error) {
|
|
212
|
+
if (error.message.includes('Cannot find module')) {
|
|
213
|
+
const moduleMatch = error.message.match(/Cannot find module ['"]([^'"]+)['"]/);
|
|
214
|
+
const missingModule = moduleMatch ? moduleMatch[1] : 'unknown';
|
|
215
|
+
throw new MissingDependencyException(filePath, missingModule, error.message);
|
|
216
|
+
}
|
|
217
|
+
if (error.message.includes('SyntaxError') ||
|
|
218
|
+
error.message.includes('parse') ||
|
|
219
|
+
error.message.includes('Unexpected token')) {
|
|
220
|
+
throw new ConfigFileParseException(filePath, error.message);
|
|
221
|
+
}
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
throw new Error(`Failed to load config file: ${filePath}. Unexpected error: ${String(error)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
isConfigBoundInstance(value) {
|
|
228
|
+
return (value !== null &&
|
|
229
|
+
value !== undefined &&
|
|
230
|
+
typeof value === 'object' &&
|
|
231
|
+
'name' in value &&
|
|
232
|
+
'sections' in value &&
|
|
233
|
+
typeof value.name === 'string' &&
|
|
234
|
+
typeof value.sections === 'object');
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
ConfigLoaderService = __decorate([
|
|
238
|
+
Injectable()
|
|
239
|
+
], ConfigLoaderService);
|
|
240
|
+
export { ConfigLoaderService };
|
|
241
|
+
//# sourceMappingURL=config-loader.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.service.js","sourceRoot":"","sources":["../../src/services/config-loader.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-writer.service.d.ts","sourceRoot":"","sources":["../../src/services/file-writer.service.ts"],"names":[],"mappings":"AAIA,qBACa,iBAAiB;IAC5B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWpD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;CAOlD"}
|