@agenticflow/cli 0.0.1-beta.13
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 +125 -0
- package/TECHNICAL_DEBT.md +121 -0
- package/dist/builder/bundler.d.ts +17 -0
- package/dist/builder/bundler.d.ts.map +1 -0
- package/dist/builder/bundler.js +170 -0
- package/dist/builder/bundler.js.map +1 -0
- package/dist/builder/index.d.ts +6 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +6 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/packager.d.ts +41 -0
- package/dist/builder/packager.d.ts.map +1 -0
- package/dist/builder/packager.js +145 -0
- package/dist/builder/packager.js.map +1 -0
- package/dist/builder/security.d.ts +26 -0
- package/dist/builder/security.d.ts.map +1 -0
- package/dist/builder/security.js +204 -0
- package/dist/builder/security.js.map +1 -0
- package/dist/builder/stripper.d.ts +19 -0
- package/dist/builder/stripper.d.ts.map +1 -0
- package/dist/builder/stripper.js +100 -0
- package/dist/builder/stripper.js.map +1 -0
- package/dist/builder/validator.d.ts +33 -0
- package/dist/builder/validator.d.ts.map +1 -0
- package/dist/builder/validator.js +150 -0
- package/dist/builder/validator.js.map +1 -0
- package/dist/cli/build.d.ts +3 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +167 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/categories.d.ts +40 -0
- package/dist/cli/categories.d.ts.map +1 -0
- package/dist/cli/categories.js +101 -0
- package/dist/cli/categories.js.map +1 -0
- package/dist/cli/dev.d.ts +3 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +226 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/handler-types.d.ts +34 -0
- package/dist/cli/handler-types.d.ts.map +1 -0
- package/dist/cli/handler-types.js +67 -0
- package/dist/cli/handler-types.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +24 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +264 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/login.d.ts +3 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +10 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/publish.d.ts +5 -0
- package/dist/cli/publish.d.ts.map +1 -0
- package/dist/cli/publish.js +120 -0
- package/dist/cli/publish.js.map +1 -0
- package/dist/cli/template-processor.d.ts +35 -0
- package/dist/cli/template-processor.d.ts.map +1 -0
- package/dist/cli/template-processor.js +82 -0
- package/dist/cli/template-processor.js.map +1 -0
- package/dist/cli/test.d.ts +3 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +12 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/dev/decorators.d.ts +10 -0
- package/dist/dev/decorators.d.ts.map +1 -0
- package/dist/dev/decorators.js +26 -0
- package/dist/dev/decorators.js.map +1 -0
- package/dist/dev/executor.d.ts +22 -0
- package/dist/dev/executor.d.ts.map +1 -0
- package/dist/dev/executor.js +243 -0
- package/dist/dev/executor.js.map +1 -0
- package/dist/dev/extractor.d.ts +15 -0
- package/dist/dev/extractor.d.ts.map +1 -0
- package/dist/dev/extractor.js +224 -0
- package/dist/dev/extractor.js.map +1 -0
- package/dist/dev/index.d.ts +3 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +4 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/server.d.ts +91 -0
- package/dist/dev/server.d.ts.map +1 -0
- package/dist/dev/server.js +507 -0
- package/dist/dev/server.js.map +1 -0
- package/dist/dev/ui-dist/assets/index-BkKxvzfq.js +246 -0
- package/dist/dev/ui-dist/assets/index-DTO1qt7B.css +1 -0
- package/dist/dev/ui-dist/index.html +14 -0
- package/dist/dev/ui-dist/monkey.svg +3 -0
- package/dist/dev/ui-dist/package.json +27 -0
- package/dist/templates/_shared/.env.template +16 -0
- package/dist/templates/_shared/.gitignore.template +46 -0
- package/dist/templates/_shared/LICENSE.template +21 -0
- package/dist/templates/_shared/src/utils.ts.template +29 -0
- package/dist/templates/_shared/tsconfig.json.template +23 -0
- package/dist/templates/stateful/manifest.json.template +63 -0
- package/dist/templates/stateful/package.json.template +23 -0
- package/dist/templates/stateful/src/index.ts.template +147 -0
- package/dist/templates/stateless/docs/README.md.template +102 -0
- package/dist/templates/stateless/manifest.json.template +63 -0
- package/dist/templates/stateless/package.json.template +23 -0
- package/dist/templates/stateless/src/index.ts.template +103 -0
- package/package.json +51 -0
- package/vitest.config.ts +15 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface SecurityCheckResult {
|
|
2
|
+
passed: boolean;
|
|
3
|
+
errors: string[];
|
|
4
|
+
warnings: string[];
|
|
5
|
+
matches: SecurityMatch[];
|
|
6
|
+
}
|
|
7
|
+
export interface SecurityMatch {
|
|
8
|
+
pattern: string;
|
|
9
|
+
file: string;
|
|
10
|
+
line: number;
|
|
11
|
+
match: string;
|
|
12
|
+
severity: 'error' | 'warning';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Scan a file for security issues
|
|
16
|
+
*/
|
|
17
|
+
export declare function scanFile(filePath: string, content: string): SecurityMatch[];
|
|
18
|
+
/**
|
|
19
|
+
* Scan all files in a directory for security issues
|
|
20
|
+
*/
|
|
21
|
+
export declare function scanDirectory(dir: string, extensions?: string[]): SecurityCheckResult;
|
|
22
|
+
/**
|
|
23
|
+
* Scan bundled code for security issues
|
|
24
|
+
*/
|
|
25
|
+
export declare function scanBundledCode(code: string, filename?: string): SecurityCheckResult;
|
|
26
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/builder/security.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AA0GD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CA4B3E;AAYD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAA4B,GAAG,mBAAmB,CA2C9G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAoB,GAAG,mBAAmB,CAoBjG"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
// Patterns that indicate leaked secrets or dev code
|
|
4
|
+
const SECURITY_PATTERNS = [
|
|
5
|
+
// API Keys
|
|
6
|
+
{
|
|
7
|
+
name: 'Stripe Live Key',
|
|
8
|
+
pattern: /sk_live_[a-zA-Z0-9]{24,}/g,
|
|
9
|
+
severity: 'error',
|
|
10
|
+
message: 'Stripe live API key detected'
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'Stripe Test Key',
|
|
14
|
+
pattern: /sk_test_[a-zA-Z0-9]{24,}/g,
|
|
15
|
+
severity: 'warning',
|
|
16
|
+
message: 'Stripe test API key detected'
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'SendGrid Key',
|
|
20
|
+
pattern: /SG\.[a-zA-Z0-9_-]{22,}\.[a-zA-Z0-9_-]{22,}/g,
|
|
21
|
+
severity: 'error',
|
|
22
|
+
message: 'SendGrid API key detected'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'OpenAI Key',
|
|
26
|
+
pattern: /sk-[a-zA-Z0-9]{32,}/g,
|
|
27
|
+
severity: 'error',
|
|
28
|
+
message: 'OpenAI API key detected'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'AWS Access Key',
|
|
32
|
+
pattern: /AKIA[0-9A-Z]{16}/g,
|
|
33
|
+
severity: 'error',
|
|
34
|
+
message: 'AWS Access Key ID detected'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'AWS Secret Key',
|
|
38
|
+
pattern: /[a-zA-Z0-9/+=]{40}/g,
|
|
39
|
+
severity: 'warning',
|
|
40
|
+
message: 'Possible AWS Secret Access Key detected'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'GitHub Token',
|
|
44
|
+
pattern: /ghp_[a-zA-Z0-9]{36}/g,
|
|
45
|
+
severity: 'error',
|
|
46
|
+
message: 'GitHub Personal Access Token detected'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Generic API Key',
|
|
50
|
+
pattern: /api[_-]?key\s*[:=]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,
|
|
51
|
+
severity: 'warning',
|
|
52
|
+
message: 'Possible hardcoded API key detected'
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'Generic Secret',
|
|
56
|
+
pattern: /secret\s*[:=]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,
|
|
57
|
+
severity: 'warning',
|
|
58
|
+
message: 'Possible hardcoded secret detected'
|
|
59
|
+
},
|
|
60
|
+
// Dev code leakage
|
|
61
|
+
{
|
|
62
|
+
name: '@TestValue Decorator',
|
|
63
|
+
pattern: /@TestValue\s*\(/g,
|
|
64
|
+
severity: 'error',
|
|
65
|
+
message: '@TestValue decorator found in production code'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'afh/dev Import',
|
|
69
|
+
pattern: /from\s+['"]afh\/dev['"]/g,
|
|
70
|
+
severity: 'error',
|
|
71
|
+
message: 'afh/dev import found in production code'
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'TestValue Import',
|
|
75
|
+
pattern: /import\s+\{[^}]*TestValue[^}]*\}/g,
|
|
76
|
+
severity: 'error',
|
|
77
|
+
message: 'TestValue import found in production code'
|
|
78
|
+
},
|
|
79
|
+
// Common mistakes
|
|
80
|
+
{
|
|
81
|
+
name: 'Console.log',
|
|
82
|
+
pattern: /console\.(log|debug|info)\s*\(/g,
|
|
83
|
+
severity: 'warning',
|
|
84
|
+
message: 'console.log statement found - consider removing for production'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'TODO Comment',
|
|
88
|
+
pattern: /\/\/\s*TODO/gi,
|
|
89
|
+
severity: 'warning',
|
|
90
|
+
message: 'TODO comment found'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'FIXME Comment',
|
|
94
|
+
pattern: /\/\/\s*FIXME/gi,
|
|
95
|
+
severity: 'warning',
|
|
96
|
+
message: 'FIXME comment found'
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
/**
|
|
100
|
+
* Scan a file for security issues
|
|
101
|
+
*/
|
|
102
|
+
export function scanFile(filePath, content) {
|
|
103
|
+
const matches = [];
|
|
104
|
+
const lines = content.split('\n');
|
|
105
|
+
for (const { name, pattern, severity, message } of SECURITY_PATTERNS) {
|
|
106
|
+
// Reset regex lastIndex
|
|
107
|
+
pattern.lastIndex = 0;
|
|
108
|
+
let lineNumber = 0;
|
|
109
|
+
for (const line of lines) {
|
|
110
|
+
lineNumber++;
|
|
111
|
+
pattern.lastIndex = 0;
|
|
112
|
+
let match;
|
|
113
|
+
while ((match = pattern.exec(line)) !== null) {
|
|
114
|
+
// Mask the match for display
|
|
115
|
+
const maskedMatch = maskSecret(match[0]);
|
|
116
|
+
matches.push({
|
|
117
|
+
pattern: name,
|
|
118
|
+
file: filePath,
|
|
119
|
+
line: lineNumber,
|
|
120
|
+
match: maskedMatch,
|
|
121
|
+
severity
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return matches;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Mask a secret for safe display
|
|
130
|
+
*/
|
|
131
|
+
function maskSecret(secret) {
|
|
132
|
+
if (secret.length <= 8)
|
|
133
|
+
return '***';
|
|
134
|
+
const prefix = secret.slice(0, 4);
|
|
135
|
+
const suffix = secret.slice(-4);
|
|
136
|
+
return `${prefix}...${suffix}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Scan all files in a directory for security issues
|
|
140
|
+
*/
|
|
141
|
+
export function scanDirectory(dir, extensions = ['.ts', '.js', '.json']) {
|
|
142
|
+
const allMatches = [];
|
|
143
|
+
const errors = [];
|
|
144
|
+
const warnings = [];
|
|
145
|
+
function processDir(currentDir) {
|
|
146
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
149
|
+
const relativePath = path.relative(dir, fullPath);
|
|
150
|
+
if (entry.isDirectory()) {
|
|
151
|
+
// Skip common non-code directories
|
|
152
|
+
if (!['node_modules', '.git', 'dist', '.afh'].includes(entry.name)) {
|
|
153
|
+
processDir(fullPath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (extensions.some(ext => entry.name.endsWith(ext))) {
|
|
157
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
158
|
+
const matches = scanFile(relativePath, content);
|
|
159
|
+
allMatches.push(...matches);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
processDir(dir);
|
|
164
|
+
// Categorize matches into errors and warnings
|
|
165
|
+
for (const match of allMatches) {
|
|
166
|
+
const message = `${match.file}:${match.line} - ${match.pattern}: ${match.match}`;
|
|
167
|
+
if (match.severity === 'error') {
|
|
168
|
+
errors.push(message);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
warnings.push(message);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
passed: errors.length === 0,
|
|
176
|
+
errors,
|
|
177
|
+
warnings,
|
|
178
|
+
matches: allMatches
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Scan bundled code for security issues
|
|
183
|
+
*/
|
|
184
|
+
export function scanBundledCode(code, filename = 'bundle.js') {
|
|
185
|
+
const matches = scanFile(filename, code);
|
|
186
|
+
const errors = [];
|
|
187
|
+
const warnings = [];
|
|
188
|
+
for (const match of matches) {
|
|
189
|
+
const message = `${match.file}:${match.line} - ${match.pattern}: ${match.match}`;
|
|
190
|
+
if (match.severity === 'error') {
|
|
191
|
+
errors.push(message);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
warnings.push(message);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
passed: errors.length === 0,
|
|
199
|
+
errors,
|
|
200
|
+
warnings,
|
|
201
|
+
matches
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/builder/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface StripResult {
|
|
2
|
+
code: string;
|
|
3
|
+
strippedDecorators: string[];
|
|
4
|
+
strippedImports: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Strip @TestValue decorators and afh/dev imports from TypeScript source
|
|
8
|
+
* Uses TypeScript Compiler API for accurate AST manipulation
|
|
9
|
+
*/
|
|
10
|
+
export declare function stripDevCode(sourcePath: string): StripResult;
|
|
11
|
+
/**
|
|
12
|
+
* Strip dev code from all TypeScript files in a directory
|
|
13
|
+
*/
|
|
14
|
+
export declare function stripDevCodeFromDirectory(srcDir: string, outDir: string): {
|
|
15
|
+
files: string[];
|
|
16
|
+
totalDecorators: number;
|
|
17
|
+
totalImports: number;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=stripper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripper.d.ts","sourceRoot":"","sources":["../../src/builder/stripper.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAmF5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA6BpE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Strip @TestValue decorators and afh/dev imports from TypeScript source
|
|
6
|
+
* Uses TypeScript Compiler API for accurate AST manipulation
|
|
7
|
+
*/
|
|
8
|
+
export function stripDevCode(sourcePath) {
|
|
9
|
+
const sourceCode = fs.readFileSync(sourcePath, 'utf-8');
|
|
10
|
+
const sourceFile = ts.createSourceFile(sourcePath, sourceCode, ts.ScriptTarget.Latest, true);
|
|
11
|
+
const strippedDecorators = [];
|
|
12
|
+
const strippedImports = [];
|
|
13
|
+
// Transformer to remove @TestValue decorators and afh/dev imports
|
|
14
|
+
const transformer = (context) => {
|
|
15
|
+
return (rootNode) => {
|
|
16
|
+
function visit(node) {
|
|
17
|
+
// Remove imports from 'afh/dev' or './utils' (local TestValue re-export)
|
|
18
|
+
if (ts.isImportDeclaration(node)) {
|
|
19
|
+
const moduleSpecifier = node.moduleSpecifier;
|
|
20
|
+
if (ts.isStringLiteral(moduleSpecifier)) {
|
|
21
|
+
const moduleName = moduleSpecifier.text;
|
|
22
|
+
if (moduleName === 'afh/dev' ||
|
|
23
|
+
moduleName === './utils' ||
|
|
24
|
+
moduleName.includes('afh/dev')) {
|
|
25
|
+
strippedImports.push(moduleName);
|
|
26
|
+
return undefined; // Remove this import
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Remove @TestValue decorators from properties
|
|
31
|
+
if (ts.isPropertyDeclaration(node) && node.modifiers) {
|
|
32
|
+
const filteredModifiers = node.modifiers.filter(modifier => {
|
|
33
|
+
if (ts.isDecorator(modifier)) {
|
|
34
|
+
const expression = modifier.expression;
|
|
35
|
+
if (ts.isCallExpression(expression)) {
|
|
36
|
+
const callee = expression.expression;
|
|
37
|
+
if (ts.isIdentifier(callee) && callee.text === 'TestValue') {
|
|
38
|
+
strippedDecorators.push(node.name.getText());
|
|
39
|
+
return false; // Remove this decorator
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (ts.isIdentifier(expression) && expression.text === 'TestValue') {
|
|
43
|
+
strippedDecorators.push(node.name.getText());
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
if (filteredModifiers.length !== node.modifiers.length) {
|
|
50
|
+
return ts.factory.updatePropertyDeclaration(node, filteredModifiers.length > 0 ? filteredModifiers : undefined, node.name, node.questionToken || node.exclamationToken, node.type, node.initializer);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return ts.visitEachChild(node, visit, context);
|
|
54
|
+
}
|
|
55
|
+
return ts.visitNode(rootNode, visit);
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
// Apply transformation
|
|
59
|
+
const result = ts.transform(sourceFile, [transformer]);
|
|
60
|
+
const transformedSourceFile = result.transformed[0];
|
|
61
|
+
// Print the transformed code
|
|
62
|
+
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
|
|
63
|
+
const code = printer.printFile(transformedSourceFile);
|
|
64
|
+
result.dispose();
|
|
65
|
+
return {
|
|
66
|
+
code,
|
|
67
|
+
strippedDecorators,
|
|
68
|
+
strippedImports
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Strip dev code from all TypeScript files in a directory
|
|
73
|
+
*/
|
|
74
|
+
export function stripDevCodeFromDirectory(srcDir, outDir) {
|
|
75
|
+
const files = [];
|
|
76
|
+
let totalDecorators = 0;
|
|
77
|
+
let totalImports = 0;
|
|
78
|
+
function processDirectory(dir, relativePath = '') {
|
|
79
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
const srcPath = path.join(dir, entry.name);
|
|
82
|
+
const outPath = path.join(outDir, relativePath, entry.name);
|
|
83
|
+
if (entry.isDirectory()) {
|
|
84
|
+
fs.mkdirSync(outPath, { recursive: true });
|
|
85
|
+
processDirectory(srcPath, path.join(relativePath, entry.name));
|
|
86
|
+
}
|
|
87
|
+
else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.test.ts')) {
|
|
88
|
+
const result = stripDevCode(srcPath);
|
|
89
|
+
fs.writeFileSync(outPath, result.code);
|
|
90
|
+
files.push(path.join(relativePath, entry.name));
|
|
91
|
+
totalDecorators += result.strippedDecorators.length;
|
|
92
|
+
totalImports += result.strippedImports.length;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
97
|
+
processDirectory(srcDir);
|
|
98
|
+
return { files, totalDecorators, totalImports };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=stripper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripper.js","sourceRoot":"","sources":["../../src/builder/stripper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface ValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
errors: string[];
|
|
4
|
+
warnings: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ManifestValidation {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
errors: string[];
|
|
9
|
+
warnings: string[];
|
|
10
|
+
manifest?: any;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validate manifest.json structure and required fields
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateManifest(projectDir: string): ManifestValidation;
|
|
16
|
+
/**
|
|
17
|
+
* Validate required project files exist
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateProjectFiles(projectDir: string): ValidationResult;
|
|
20
|
+
/**
|
|
21
|
+
* Check for TypeScript compilation errors
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateTypeScript(projectDir: string): Promise<ValidationResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Full project validation
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateProject(projectDir: string): Promise<{
|
|
28
|
+
valid: boolean;
|
|
29
|
+
manifest: ManifestValidation;
|
|
30
|
+
files: ValidationResult;
|
|
31
|
+
typescript: ValidationResult;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/builder/validator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAwDvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAuCzE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCtF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,gBAAgB,CAAC;CAC9B,CAAC,CAWD"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Validate manifest.json structure and required fields
|
|
5
|
+
*/
|
|
6
|
+
export function validateManifest(projectDir) {
|
|
7
|
+
const manifestPath = path.join(projectDir, 'manifest.json');
|
|
8
|
+
const errors = [];
|
|
9
|
+
const warnings = [];
|
|
10
|
+
if (!fs.existsSync(manifestPath)) {
|
|
11
|
+
return { valid: false, errors: ['manifest.json not found'], warnings: [] };
|
|
12
|
+
}
|
|
13
|
+
let manifest;
|
|
14
|
+
try {
|
|
15
|
+
manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return { valid: false, errors: ['manifest.json is not valid JSON'], warnings: [] };
|
|
19
|
+
}
|
|
20
|
+
// Required fields
|
|
21
|
+
if (!manifest.id)
|
|
22
|
+
errors.push('manifest.id is required');
|
|
23
|
+
if (!manifest.version)
|
|
24
|
+
errors.push('manifest.version is required');
|
|
25
|
+
if (!manifest.name)
|
|
26
|
+
errors.push('manifest.name is required');
|
|
27
|
+
if (!manifest.description)
|
|
28
|
+
errors.push('manifest.description is required');
|
|
29
|
+
// Validate version format
|
|
30
|
+
if (manifest.version && !/^\d+\.\d+\.\d+/.test(manifest.version)) {
|
|
31
|
+
warnings.push('manifest.version should follow semver (e.g., 1.0.0)');
|
|
32
|
+
}
|
|
33
|
+
// Handler configuration
|
|
34
|
+
if (!manifest.handler) {
|
|
35
|
+
errors.push('manifest.handler is required');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (!manifest.handler.type)
|
|
39
|
+
errors.push('manifest.handler.type is required');
|
|
40
|
+
if (!manifest.handler.category)
|
|
41
|
+
errors.push('manifest.handler.category is required');
|
|
42
|
+
}
|
|
43
|
+
// Author info
|
|
44
|
+
if (!manifest.author) {
|
|
45
|
+
warnings.push('manifest.author is recommended');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (!manifest.author.name)
|
|
49
|
+
warnings.push('manifest.author.name is recommended');
|
|
50
|
+
}
|
|
51
|
+
// Inputs/Outputs
|
|
52
|
+
if (!manifest.inputs || !Array.isArray(manifest.inputs)) {
|
|
53
|
+
warnings.push('manifest.inputs should be an array');
|
|
54
|
+
}
|
|
55
|
+
if (!manifest.outputs || !Array.isArray(manifest.outputs)) {
|
|
56
|
+
warnings.push('manifest.outputs should be an array');
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
valid: errors.length === 0,
|
|
60
|
+
errors,
|
|
61
|
+
warnings,
|
|
62
|
+
manifest
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate required project files exist
|
|
67
|
+
*/
|
|
68
|
+
export function validateProjectFiles(projectDir) {
|
|
69
|
+
const errors = [];
|
|
70
|
+
const warnings = [];
|
|
71
|
+
// Required files
|
|
72
|
+
const requiredFiles = [
|
|
73
|
+
{ path: 'manifest.json', name: 'Manifest' },
|
|
74
|
+
{ path: 'src/index.ts', name: 'Source file' },
|
|
75
|
+
];
|
|
76
|
+
for (const file of requiredFiles) {
|
|
77
|
+
if (!fs.existsSync(path.join(projectDir, file.path))) {
|
|
78
|
+
errors.push(`${file.name} not found: ${file.path}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Recommended files
|
|
82
|
+
const recommendedFiles = [
|
|
83
|
+
{ path: 'assets/icon.png', name: 'Icon' },
|
|
84
|
+
{ path: 'docs/README.md', name: 'Documentation' },
|
|
85
|
+
{ path: 'LICENSE', name: 'License file' },
|
|
86
|
+
];
|
|
87
|
+
for (const file of recommendedFiles) {
|
|
88
|
+
if (!fs.existsSync(path.join(projectDir, file.path))) {
|
|
89
|
+
warnings.push(`${file.name} not found: ${file.path}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Check for .env file (should NOT be included in package)
|
|
93
|
+
if (fs.existsSync(path.join(projectDir, '.env'))) {
|
|
94
|
+
warnings.push('.env file found - will not be included in package');
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
valid: errors.length === 0,
|
|
98
|
+
errors,
|
|
99
|
+
warnings
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check for TypeScript compilation errors
|
|
104
|
+
*/
|
|
105
|
+
export async function validateTypeScript(projectDir) {
|
|
106
|
+
const errors = [];
|
|
107
|
+
const warnings = [];
|
|
108
|
+
// Check if tsconfig exists
|
|
109
|
+
const tsconfigPath = path.join(projectDir, 'tsconfig.json');
|
|
110
|
+
if (!fs.existsSync(tsconfigPath)) {
|
|
111
|
+
warnings.push('tsconfig.json not found - using default settings');
|
|
112
|
+
}
|
|
113
|
+
// Check for basic syntax errors by trying to parse
|
|
114
|
+
const srcIndex = path.join(projectDir, 'src', 'index.ts');
|
|
115
|
+
if (fs.existsSync(srcIndex)) {
|
|
116
|
+
try {
|
|
117
|
+
const ts = await import('typescript');
|
|
118
|
+
const source = fs.readFileSync(srcIndex, 'utf-8');
|
|
119
|
+
const result = ts.createSourceFile('index.ts', source, ts.ScriptTarget.Latest, true);
|
|
120
|
+
// Check for parse errors
|
|
121
|
+
const parseErrors = result.parseDiagnostics || [];
|
|
122
|
+
for (const diag of parseErrors) {
|
|
123
|
+
errors.push(`TypeScript parse error: ${diag.messageText}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
errors.push(`Failed to parse TypeScript: ${err}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
valid: errors.length === 0,
|
|
132
|
+
errors,
|
|
133
|
+
warnings
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Full project validation
|
|
138
|
+
*/
|
|
139
|
+
export async function validateProject(projectDir) {
|
|
140
|
+
const manifest = validateManifest(projectDir);
|
|
141
|
+
const files = validateProjectFiles(projectDir);
|
|
142
|
+
const typescript = await validateTypeScript(projectDir);
|
|
143
|
+
return {
|
|
144
|
+
valid: manifest.valid && files.valid && typescript.valid,
|
|
145
|
+
manifest,
|
|
146
|
+
files,
|
|
147
|
+
typescript
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/builder/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,YAAY,SAsLrB,CAAC"}
|