@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
package/README.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# afh - AgenticFlow Handler CLI
|
|
2
|
+
|
|
3
|
+
CLI tool for developing, testing, and building AgenticFlow handlers.
|
|
4
|
+
|
|
5
|
+
> ⚠️ **Beta Release** - Publishing to marketplace is under development.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @agenticflow/cli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Create a new handler
|
|
17
|
+
afh init my-handler --yes
|
|
18
|
+
cd my-handler
|
|
19
|
+
|
|
20
|
+
# Start development server
|
|
21
|
+
npm install
|
|
22
|
+
afh dev
|
|
23
|
+
|
|
24
|
+
# Build package
|
|
25
|
+
afh build
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
29
|
+
|
|
30
|
+
### `afh init <name>`
|
|
31
|
+
|
|
32
|
+
Create a new handler project from template.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
afh init my-stripe-handler
|
|
36
|
+
afh init my-handler --stateful
|
|
37
|
+
afh init my-handler --yes # Skip prompts
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Options:**
|
|
41
|
+
- `--stateful` - Create a stateful handler (supports checkpoints)
|
|
42
|
+
- `--yes, -y` - Skip prompts and use defaults
|
|
43
|
+
- `--category <cat>` - Handler category (ai, data, external, control, utility)
|
|
44
|
+
|
|
45
|
+
### `afh dev`
|
|
46
|
+
|
|
47
|
+
Start development server with hot-reload and web UI.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
afh dev
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Opens a browser-based development environment with:
|
|
54
|
+
- **Test Tab** - Execute handlers with test values
|
|
55
|
+
- **Inspector Tab** - View handler inputs and metadata
|
|
56
|
+
- **Trace Tab** - Debug execution flow
|
|
57
|
+
- **Docs Tab** - Preview documentation
|
|
58
|
+
- **Build Tab** - Build and package for distribution
|
|
59
|
+
|
|
60
|
+
### `afh test`
|
|
61
|
+
|
|
62
|
+
Run unit tests for your handler.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
afh test
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### `afh build`
|
|
69
|
+
|
|
70
|
+
Package handler for distribution.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
afh build
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Creates a `.afh` package file ready for publishing.
|
|
77
|
+
|
|
78
|
+
## Handler Structure
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
my-handler/
|
|
82
|
+
├── manifest.json # Handler metadata
|
|
83
|
+
├── package.json # Dependencies
|
|
84
|
+
├── src/
|
|
85
|
+
│ ├── index.ts # Main handler code
|
|
86
|
+
│ └── utils.ts # Development utilities
|
|
87
|
+
├── docs/
|
|
88
|
+
│ └── README.md # Documentation
|
|
89
|
+
├── assets/
|
|
90
|
+
│ └── icon.png # Handler icon (256x256)
|
|
91
|
+
└── .env # Local secrets (gitignored)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Development with @TestValue
|
|
95
|
+
|
|
96
|
+
Use the `@TestValue` decorator to provide test values during development:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { Handler, Input, StatelessHandler, StepResult } from '@flowmonkey/core';
|
|
100
|
+
import { TestValue } from './utils';
|
|
101
|
+
|
|
102
|
+
@Handler({
|
|
103
|
+
type: 'my-handler',
|
|
104
|
+
name: 'My Handler',
|
|
105
|
+
category: 'utility',
|
|
106
|
+
})
|
|
107
|
+
export class MyHandler extends StatelessHandler<Input, Output> {
|
|
108
|
+
@Input({ type: 'string', source: 'vault', required: true })
|
|
109
|
+
@TestValue(process.env.API_KEY!) // Stripped at build time
|
|
110
|
+
apiKey!: string;
|
|
111
|
+
|
|
112
|
+
async execute(): Promise<StepResult<Output>> {
|
|
113
|
+
// Your handler logic
|
|
114
|
+
return this.success({ result: 'done' });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default new MyHandler();
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`@TestValue` decorators are automatically stripped from production builds.
|
|
122
|
+
|
|
123
|
+
## License
|
|
124
|
+
|
|
125
|
+
MIT
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Technical Debt & Known Issues
|
|
2
|
+
|
|
3
|
+
This document tracks technical debt, workarounds, and proposed fixes for the `@agenticflow/cli` package.
|
|
4
|
+
|
|
5
|
+
## Resolved Issues
|
|
6
|
+
|
|
7
|
+
### 1. `.npmignore` Stripping Nested `src/` Directories (FIXED in beta.7)
|
|
8
|
+
|
|
9
|
+
**Problem:** `.npmignore` with `src/` pattern was stripping ALL directories named `src/`, including:
|
|
10
|
+
- `dist/templates/stateless/src/`
|
|
11
|
+
- `dist/templates/stateful/src/`
|
|
12
|
+
- `dist/templates/_shared/src/`
|
|
13
|
+
- `dist/dev/ui/src/`
|
|
14
|
+
|
|
15
|
+
**Root Cause:** In `.gitignore`/`.npmignore`, patterns without a leading `/` match anywhere in the tree.
|
|
16
|
+
|
|
17
|
+
**Fix:** Changed `.npmignore` from `src/` to `/src/`:
|
|
18
|
+
- `src/` - matches ANY directory named `src` anywhere (wrong)
|
|
19
|
+
- `/src/` - matches only the TOP-LEVEL `src` directory (correct)
|
|
20
|
+
|
|
21
|
+
**Lesson:** Always use leading `/` for patterns that should only match at the root level.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### 2. `init copy.js` Artifact in Published Package
|
|
26
|
+
|
|
27
|
+
**Problem:** An old backup file `src/cli/init copy.ts` was accidentally included in builds.
|
|
28
|
+
|
|
29
|
+
**Status:** Source file deleted, but `dist/cli/init copy.js` may still exist in older published versions.
|
|
30
|
+
|
|
31
|
+
**Fix:** Clean `dist/` before each build to prevent stale files.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Proposed Improvements
|
|
36
|
+
|
|
37
|
+
### 1. Switch to `package.json` `files` Field
|
|
38
|
+
|
|
39
|
+
Instead of `.npmignore`, use explicit inclusion in `package.json`:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"files": [
|
|
44
|
+
"dist/",
|
|
45
|
+
"README.md"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This is more predictable and doesn't have the recursive pattern issues.
|
|
51
|
+
|
|
52
|
+
### 2. Add Pre-publish Validation
|
|
53
|
+
|
|
54
|
+
Add a script that verifies the package contents before publishing:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm run prepublish:check
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
This should verify:
|
|
61
|
+
- All template files exist in `dist/templates/`
|
|
62
|
+
- UI source files exist in `dist/dev/ui/_src_/`
|
|
63
|
+
- No `.env` or secret files are included
|
|
64
|
+
- Package size is within expected bounds
|
|
65
|
+
|
|
66
|
+
### 3. Add Automated Tests
|
|
67
|
+
|
|
68
|
+
Create tests that:
|
|
69
|
+
- Mock `afh init` and verify all expected files are created
|
|
70
|
+
- Verify template processing works correctly
|
|
71
|
+
- Test the `_src_` → `src` mapping
|
|
72
|
+
- Test the build security scanner
|
|
73
|
+
|
|
74
|
+
### 4. CI/CD Pipeline
|
|
75
|
+
|
|
76
|
+
Add GitHub Actions to:
|
|
77
|
+
- Run tests on PR
|
|
78
|
+
- Build and verify package contents
|
|
79
|
+
- Publish to npm on release tags
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Version History of Fixes
|
|
84
|
+
|
|
85
|
+
| Version | Fix |
|
|
86
|
+
|---------|-----|
|
|
87
|
+
| beta.1 | Initial release |
|
|
88
|
+
| beta.2 | Branding updates (FlowMonkey → AgenticFlow) |
|
|
89
|
+
| beta.3 | Attempted template path resolution fix |
|
|
90
|
+
| beta.4 | `_src_` workaround for template directories |
|
|
91
|
+
| beta.5 | `_src_` workaround for UI directory |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Testing Checklist
|
|
96
|
+
|
|
97
|
+
Before publishing a new version, verify on a **fresh machine** (or clean npm cache):
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Install globally
|
|
101
|
+
npm install -g @agenticflow/cli@latest
|
|
102
|
+
|
|
103
|
+
# Test init
|
|
104
|
+
afh init test-handler --yes
|
|
105
|
+
cd test-handler
|
|
106
|
+
|
|
107
|
+
# Verify files exist
|
|
108
|
+
ls -la src/ # Should have index.ts and utils.ts
|
|
109
|
+
cat src/index.ts # Should have handler code
|
|
110
|
+
|
|
111
|
+
# Test dev server
|
|
112
|
+
npm install
|
|
113
|
+
afh dev # Should start API server and UI
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Notes
|
|
119
|
+
|
|
120
|
+
- The `@flowmonkey/core` package references should remain unchanged - that's the actual npm package name for the handler runtime
|
|
121
|
+
- `afh/dev` import in handlers is a local re-export from `utils.ts`, not an npm package
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface BundleResult {
|
|
2
|
+
code: string;
|
|
3
|
+
map?: string;
|
|
4
|
+
errors: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Simple bundler that compiles TypeScript and concatenates files
|
|
9
|
+
* For a production implementation, you'd use esbuild, rollup, or webpack
|
|
10
|
+
*/
|
|
11
|
+
export declare function bundleHandler(projectDir: string, strippedSrcDir: string): Promise<BundleResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Minify JavaScript code (basic implementation)
|
|
14
|
+
* For production, use terser
|
|
15
|
+
*/
|
|
16
|
+
export declare function minifyCode(code: string): string;
|
|
17
|
+
//# sourceMappingURL=bundler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../src/builder/bundler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,CAAC,CAqHvB;AAkCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe/C"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as ts from 'typescript';
|
|
4
|
+
/**
|
|
5
|
+
* Simple bundler that compiles TypeScript and concatenates files
|
|
6
|
+
* For a production implementation, you'd use esbuild, rollup, or webpack
|
|
7
|
+
*/
|
|
8
|
+
export async function bundleHandler(projectDir, strippedSrcDir) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const warnings = [];
|
|
11
|
+
// Read tsconfig if exists, or use defaults
|
|
12
|
+
let compilerOptions = {
|
|
13
|
+
target: ts.ScriptTarget.ES2020,
|
|
14
|
+
module: ts.ModuleKind.ES2020,
|
|
15
|
+
moduleResolution: ts.ModuleResolutionKind.Node10,
|
|
16
|
+
declaration: false,
|
|
17
|
+
sourceMap: false,
|
|
18
|
+
strict: true,
|
|
19
|
+
esModuleInterop: true,
|
|
20
|
+
skipLibCheck: true,
|
|
21
|
+
experimentalDecorators: true,
|
|
22
|
+
emitDecoratorMetadata: true,
|
|
23
|
+
};
|
|
24
|
+
const tsconfigPath = path.join(projectDir, 'tsconfig.json');
|
|
25
|
+
if (fs.existsSync(tsconfigPath)) {
|
|
26
|
+
try {
|
|
27
|
+
const tsconfigContent = fs.readFileSync(tsconfigPath, 'utf-8');
|
|
28
|
+
const tsconfig = JSON.parse(tsconfigContent);
|
|
29
|
+
if (tsconfig.compilerOptions) {
|
|
30
|
+
// Merge with our defaults
|
|
31
|
+
compilerOptions = { ...compilerOptions, ...parseCompilerOptions(tsconfig.compilerOptions) };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
warnings.push(`Failed to parse tsconfig.json: ${err}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Find all TypeScript files
|
|
39
|
+
const sourceFiles = [];
|
|
40
|
+
function findTsFiles(dir) {
|
|
41
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const fullPath = path.join(dir, entry.name);
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
findTsFiles(fullPath);
|
|
46
|
+
}
|
|
47
|
+
else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts')) {
|
|
48
|
+
sourceFiles.push(fullPath);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
findTsFiles(strippedSrcDir);
|
|
53
|
+
if (sourceFiles.length === 0) {
|
|
54
|
+
return {
|
|
55
|
+
code: '',
|
|
56
|
+
errors: ['No TypeScript files found'],
|
|
57
|
+
warnings
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Compile TypeScript
|
|
61
|
+
const program = ts.createProgram(sourceFiles, compilerOptions);
|
|
62
|
+
const emitResult = program.emit();
|
|
63
|
+
// Collect diagnostics
|
|
64
|
+
const diagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
|
|
65
|
+
for (const diagnostic of diagnostics) {
|
|
66
|
+
const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
|
|
67
|
+
if (diagnostic.file) {
|
|
68
|
+
const { line } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
|
|
69
|
+
const fileName = path.relative(projectDir, diagnostic.file.fileName);
|
|
70
|
+
if (diagnostic.category === ts.DiagnosticCategory.Error) {
|
|
71
|
+
errors.push(`${fileName}:${line + 1}: ${message}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
warnings.push(`${fileName}:${line + 1}: ${message}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (diagnostic.category === ts.DiagnosticCategory.Error) {
|
|
79
|
+
errors.push(message);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
warnings.push(message);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// If there are errors, return early
|
|
87
|
+
if (errors.length > 0) {
|
|
88
|
+
return { code: '', errors, warnings };
|
|
89
|
+
}
|
|
90
|
+
// For a simple bundler, we'll compile each file and concatenate
|
|
91
|
+
// In production, you'd want to use a proper bundler like esbuild
|
|
92
|
+
let bundledCode = '';
|
|
93
|
+
// Add a simple module wrapper
|
|
94
|
+
bundledCode += '// Handler Bundle - Generated by afh build\n';
|
|
95
|
+
bundledCode += '// Do not edit this file directly\n\n';
|
|
96
|
+
// Transpile each file
|
|
97
|
+
for (const sourceFile of sourceFiles) {
|
|
98
|
+
const source = fs.readFileSync(sourceFile, 'utf-8');
|
|
99
|
+
const relativePath = path.relative(strippedSrcDir, sourceFile);
|
|
100
|
+
const result = ts.transpileModule(source, {
|
|
101
|
+
compilerOptions: {
|
|
102
|
+
...compilerOptions,
|
|
103
|
+
module: ts.ModuleKind.ES2020,
|
|
104
|
+
},
|
|
105
|
+
fileName: sourceFile,
|
|
106
|
+
});
|
|
107
|
+
bundledCode += `// --- ${relativePath} ---\n`;
|
|
108
|
+
bundledCode += result.outputText;
|
|
109
|
+
bundledCode += '\n\n';
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
code: bundledCode,
|
|
113
|
+
errors,
|
|
114
|
+
warnings
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse compiler options from tsconfig format to ts.CompilerOptions
|
|
119
|
+
*/
|
|
120
|
+
function parseCompilerOptions(options) {
|
|
121
|
+
const result = {};
|
|
122
|
+
if (options.target) {
|
|
123
|
+
const targetMap = {
|
|
124
|
+
'ES5': ts.ScriptTarget.ES5,
|
|
125
|
+
'ES6': ts.ScriptTarget.ES2015,
|
|
126
|
+
'ES2015': ts.ScriptTarget.ES2015,
|
|
127
|
+
'ES2016': ts.ScriptTarget.ES2016,
|
|
128
|
+
'ES2017': ts.ScriptTarget.ES2017,
|
|
129
|
+
'ES2018': ts.ScriptTarget.ES2018,
|
|
130
|
+
'ES2019': ts.ScriptTarget.ES2019,
|
|
131
|
+
'ES2020': ts.ScriptTarget.ES2020,
|
|
132
|
+
'ES2021': ts.ScriptTarget.ES2021,
|
|
133
|
+
'ES2022': ts.ScriptTarget.ES2022,
|
|
134
|
+
'ESNext': ts.ScriptTarget.ESNext,
|
|
135
|
+
};
|
|
136
|
+
result.target = targetMap[options.target.toUpperCase()] || ts.ScriptTarget.ES2020;
|
|
137
|
+
}
|
|
138
|
+
if (options.strict !== undefined)
|
|
139
|
+
result.strict = options.strict;
|
|
140
|
+
if (options.esModuleInterop !== undefined)
|
|
141
|
+
result.esModuleInterop = options.esModuleInterop;
|
|
142
|
+
if (options.skipLibCheck !== undefined)
|
|
143
|
+
result.skipLibCheck = options.skipLibCheck;
|
|
144
|
+
if (options.experimentalDecorators !== undefined)
|
|
145
|
+
result.experimentalDecorators = options.experimentalDecorators;
|
|
146
|
+
if (options.emitDecoratorMetadata !== undefined)
|
|
147
|
+
result.emitDecoratorMetadata = options.emitDecoratorMetadata;
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Minify JavaScript code (basic implementation)
|
|
152
|
+
* For production, use terser
|
|
153
|
+
*/
|
|
154
|
+
export function minifyCode(code) {
|
|
155
|
+
// Basic minification - remove comments and extra whitespace
|
|
156
|
+
// In production, you'd use terser for proper minification
|
|
157
|
+
return code
|
|
158
|
+
// Remove single-line comments (but not URLs)
|
|
159
|
+
.replace(/(?<!:)\/\/(?!\/).*$/gm, '')
|
|
160
|
+
// Remove multi-line comments
|
|
161
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
162
|
+
// Collapse multiple newlines
|
|
163
|
+
.replace(/\n\s*\n\s*\n/g, '\n\n')
|
|
164
|
+
// Remove leading/trailing whitespace from lines
|
|
165
|
+
.split('\n')
|
|
166
|
+
.map(line => line.trim())
|
|
167
|
+
.filter(line => line.length > 0)
|
|
168
|
+
.join('\n');
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=bundler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/builder/bundler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { stripDevCode, stripDevCodeFromDirectory } from './stripper.js';
|
|
2
|
+
export { validateManifest, validateProjectFiles, validateTypeScript, validateProject } from './validator.js';
|
|
3
|
+
export { scanFile, scanDirectory, scanBundledCode } from './security.js';
|
|
4
|
+
export { bundleHandler, minifyCode } from './bundler.js';
|
|
5
|
+
export { createPackage, verifyPackage, getPackageInfo, formatSize } from './packager.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { stripDevCode, stripDevCodeFromDirectory } from './stripper.js';
|
|
2
|
+
export { validateManifest, validateProjectFiles, validateTypeScript, validateProject } from './validator.js';
|
|
3
|
+
export { scanFile, scanDirectory, scanBundledCode } from './security.js';
|
|
4
|
+
export { bundleHandler, minifyCode } from './bundler.js';
|
|
5
|
+
export { createPackage, verifyPackage, getPackageInfo, formatSize } from './packager.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface PackageContents {
|
|
2
|
+
'handler.bundle.js': string;
|
|
3
|
+
'manifest.json': string;
|
|
4
|
+
'README.md'?: string;
|
|
5
|
+
'LICENSE'?: string;
|
|
6
|
+
'icon.png'?: Buffer;
|
|
7
|
+
}
|
|
8
|
+
export interface PackageInfo {
|
|
9
|
+
id: string;
|
|
10
|
+
version: string;
|
|
11
|
+
name: string;
|
|
12
|
+
size: number;
|
|
13
|
+
checksum: string;
|
|
14
|
+
files: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a .afh package file (zip format)
|
|
18
|
+
*/
|
|
19
|
+
export declare function createPackage(projectDir: string, bundledCode: string, outputPath: string): Promise<PackageInfo>;
|
|
20
|
+
/**
|
|
21
|
+
* Extract and verify a .afh package
|
|
22
|
+
*/
|
|
23
|
+
export declare function verifyPackage(packagePath: string): Promise<{
|
|
24
|
+
valid: boolean;
|
|
25
|
+
manifest?: any;
|
|
26
|
+
files: string[];
|
|
27
|
+
errors: string[];
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Get package info without extracting
|
|
31
|
+
*/
|
|
32
|
+
export declare function getPackageInfo(packagePath: string): {
|
|
33
|
+
size: number;
|
|
34
|
+
checksum: string;
|
|
35
|
+
filename: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Format file size for display
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatSize(bytes: number): string;
|
|
41
|
+
//# sourceMappingURL=packager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../src/builder/packager.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAsFtB;AAUD;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAuCD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAOA;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as crypto from 'crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Create a .afh package file (zip format)
|
|
6
|
+
*/
|
|
7
|
+
export async function createPackage(projectDir, bundledCode, outputPath) {
|
|
8
|
+
// Dynamic import archiver
|
|
9
|
+
const archiver = (await import('archiver')).default;
|
|
10
|
+
const manifestPath = path.join(projectDir, 'manifest.json');
|
|
11
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
12
|
+
const packageName = `${manifest.id}-${manifest.version}.afh`;
|
|
13
|
+
const packagePath = path.join(outputPath, packageName);
|
|
14
|
+
// Ensure output directory exists
|
|
15
|
+
fs.mkdirSync(outputPath, { recursive: true });
|
|
16
|
+
// Create write stream
|
|
17
|
+
const output = fs.createWriteStream(packagePath);
|
|
18
|
+
const archive = archiver('zip', {
|
|
19
|
+
zlib: { level: 9 } // Maximum compression
|
|
20
|
+
});
|
|
21
|
+
const files = [];
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
output.on('close', () => {
|
|
24
|
+
const stats = fs.statSync(packagePath);
|
|
25
|
+
const checksum = calculateChecksum(packagePath);
|
|
26
|
+
resolve({
|
|
27
|
+
id: manifest.id,
|
|
28
|
+
version: manifest.version,
|
|
29
|
+
name: manifest.name,
|
|
30
|
+
size: stats.size,
|
|
31
|
+
checksum,
|
|
32
|
+
files
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
archive.on('error', (err) => {
|
|
36
|
+
reject(err);
|
|
37
|
+
});
|
|
38
|
+
archive.pipe(output);
|
|
39
|
+
// Add bundled handler code
|
|
40
|
+
archive.append(bundledCode, { name: 'handler.bundle.js' });
|
|
41
|
+
files.push('handler.bundle.js');
|
|
42
|
+
// Add manifest
|
|
43
|
+
archive.file(manifestPath, { name: 'manifest.json' });
|
|
44
|
+
files.push('manifest.json');
|
|
45
|
+
// Add README if exists
|
|
46
|
+
const readmePaths = [
|
|
47
|
+
path.join(projectDir, 'docs', 'README.md'),
|
|
48
|
+
path.join(projectDir, 'README.md')
|
|
49
|
+
];
|
|
50
|
+
for (const readmePath of readmePaths) {
|
|
51
|
+
if (fs.existsSync(readmePath)) {
|
|
52
|
+
archive.file(readmePath, { name: 'README.md' });
|
|
53
|
+
files.push('README.md');
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Add LICENSE if exists
|
|
58
|
+
const licensePath = path.join(projectDir, 'LICENSE');
|
|
59
|
+
if (fs.existsSync(licensePath)) {
|
|
60
|
+
archive.file(licensePath, { name: 'LICENSE' });
|
|
61
|
+
files.push('LICENSE');
|
|
62
|
+
}
|
|
63
|
+
// Add icon if exists
|
|
64
|
+
const iconPath = path.join(projectDir, 'assets', 'icon.png');
|
|
65
|
+
if (fs.existsSync(iconPath)) {
|
|
66
|
+
archive.file(iconPath, { name: 'assets/icon.png' });
|
|
67
|
+
files.push('assets/icon.png');
|
|
68
|
+
}
|
|
69
|
+
// Add preview image if exists
|
|
70
|
+
const previewPath = path.join(projectDir, 'assets', 'preview.png');
|
|
71
|
+
if (fs.existsSync(previewPath)) {
|
|
72
|
+
archive.file(previewPath, { name: 'assets/preview.png' });
|
|
73
|
+
files.push('assets/preview.png');
|
|
74
|
+
}
|
|
75
|
+
archive.finalize();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Calculate SHA256 checksum of a file
|
|
80
|
+
*/
|
|
81
|
+
function calculateChecksum(filePath) {
|
|
82
|
+
const content = fs.readFileSync(filePath);
|
|
83
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Extract and verify a .afh package
|
|
87
|
+
*/
|
|
88
|
+
export async function verifyPackage(packagePath) {
|
|
89
|
+
const errors = [];
|
|
90
|
+
const files = [];
|
|
91
|
+
let manifest = null;
|
|
92
|
+
try {
|
|
93
|
+
const unzipper = await import('unzipper');
|
|
94
|
+
const directory = await unzipper.Open.file(packagePath);
|
|
95
|
+
for (const entry of directory.files) {
|
|
96
|
+
files.push(entry.path);
|
|
97
|
+
if (entry.path === 'manifest.json') {
|
|
98
|
+
const content = await entry.buffer();
|
|
99
|
+
manifest = JSON.parse(content.toString());
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Check required files
|
|
103
|
+
if (!files.includes('handler.bundle.js')) {
|
|
104
|
+
errors.push('Missing handler.bundle.js');
|
|
105
|
+
}
|
|
106
|
+
if (!files.includes('manifest.json')) {
|
|
107
|
+
errors.push('Missing manifest.json');
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
valid: errors.length === 0,
|
|
111
|
+
manifest,
|
|
112
|
+
files,
|
|
113
|
+
errors
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return {
|
|
118
|
+
valid: false,
|
|
119
|
+
files: [],
|
|
120
|
+
errors: [`Failed to open package: ${err}`]
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get package info without extracting
|
|
126
|
+
*/
|
|
127
|
+
export function getPackageInfo(packagePath) {
|
|
128
|
+
const stats = fs.statSync(packagePath);
|
|
129
|
+
return {
|
|
130
|
+
size: stats.size,
|
|
131
|
+
checksum: calculateChecksum(packagePath),
|
|
132
|
+
filename: path.basename(packagePath)
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Format file size for display
|
|
137
|
+
*/
|
|
138
|
+
export function formatSize(bytes) {
|
|
139
|
+
if (bytes < 1024)
|
|
140
|
+
return `${bytes} B`;
|
|
141
|
+
if (bytes < 1024 * 1024)
|
|
142
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
143
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=packager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/builder/packager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAsBjC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,WAAmB,EACnB,UAAkB;IAElB,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAEpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,MAAM,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAEvD,iCAAiC;IACjC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,sBAAsB;IACtB,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE;QAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,sBAAsB;KAC1C,CAAC,CAAC;IAEH,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAEhD,OAAO,CAAC;gBACN,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ;gBACR,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,2BAA2B;QAC3B,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEhC,eAAe;QACf,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE5B,uBAAuB;QACvB,MAAM,WAAW,GAAG;YAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;SACnC,CAAC;QACF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,CAAC;QAED,8BAA8B;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACnE,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IAMrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAQ,IAAI,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,QAAQ;YACR,KAAK;YACL,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC,2BAA2B,GAAG,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAKhD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,iBAAiB,CAAC,WAAW,CAAC;QACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC"}
|