devcache-hub 0.1.3 ā 0.3.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/dist/analyzers/ArchitectureAnalyzer.d.ts +17 -0
- package/dist/analyzers/ArchitectureAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/ArchitectureAnalyzer.js +217 -0
- package/dist/analyzers/ArchitectureAnalyzer.js.map +1 -0
- package/dist/analyzers/FeaturesAnalyzer.d.ts +18 -0
- package/dist/analyzers/FeaturesAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/FeaturesAnalyzer.js +258 -0
- package/dist/analyzers/FeaturesAnalyzer.js.map +1 -0
- package/dist/analyzers/ImpactAnalyzer.d.ts +16 -0
- package/dist/analyzers/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/ImpactAnalyzer.js +165 -0
- package/dist/analyzers/ImpactAnalyzer.js.map +1 -0
- package/dist/analyzers/ProjectAnalyzer.d.ts +14 -0
- package/dist/analyzers/ProjectAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/ProjectAnalyzer.js +142 -0
- package/dist/analyzers/ProjectAnalyzer.js.map +1 -0
- package/dist/analyzers/StackAnalyzer.d.ts +28 -0
- package/dist/analyzers/StackAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/StackAnalyzer.js +320 -0
- package/dist/analyzers/StackAnalyzer.js.map +1 -0
- package/dist/analyzers/base/BaseAnalyzer.d.ts +39 -0
- package/dist/analyzers/base/BaseAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/base/BaseAnalyzer.js +64 -0
- package/dist/analyzers/base/BaseAnalyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +7 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +23 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +32 -19
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +89 -19
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +81 -10
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/orchestrator/FileSystemHandler.d.ts +35 -0
- package/dist/orchestrator/FileSystemHandler.d.ts.map +1 -0
- package/dist/orchestrator/FileSystemHandler.js +138 -0
- package/dist/orchestrator/FileSystemHandler.js.map +1 -0
- package/dist/orchestrator/Orchestrator.d.ts +31 -0
- package/dist/orchestrator/Orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/Orchestrator.js +141 -0
- package/dist/orchestrator/Orchestrator.js.map +1 -0
- package/dist/orchestrator/TemplateManager.d.ts +35 -0
- package/dist/orchestrator/TemplateManager.d.ts.map +1 -0
- package/dist/orchestrator/TemplateManager.js +116 -0
- package/dist/orchestrator/TemplateManager.js.map +1 -0
- package/dist/orchestrator/index.d.ts +4 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +20 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/supabase/client.d.ts +54 -0
- package/dist/supabase/client.d.ts.map +1 -0
- package/dist/supabase/client.js +181 -0
- package/dist/supabase/client.js.map +1 -0
- package/dist/supabase/index.d.ts +3 -0
- package/dist/supabase/index.d.ts.map +1 -0
- package/dist/supabase/index.js +19 -0
- package/dist/supabase/index.js.map +1 -0
- package/dist/supabase/oauth.d.ts +25 -0
- package/dist/supabase/oauth.d.ts.map +1 -0
- package/dist/supabase/oauth.js +218 -0
- package/dist/supabase/oauth.js.map +1 -0
- package/dist/supabase/storage.d.ts +46 -0
- package/dist/supabase/storage.d.ts.map +1 -0
- package/dist/supabase/storage.js +179 -0
- package/dist/supabase/storage.js.map +1 -0
- package/dist/types/analyzers.d.ts +51 -0
- package/dist/types/analyzers.d.ts.map +1 -0
- package/dist/types/analyzers.js +3 -0
- package/dist/types/analyzers.js.map +1 -0
- package/dist/types/config.d.ts +27 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +20 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/templates.d.ts +18 -0
- package/dist/types/templates.d.ts.map +1 -0
- package/dist/types/templates.js +3 -0
- package/dist/types/templates.js.map +1 -0
- package/dist/utils/config.d.ts +17 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +46 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fileParser.d.ts +28 -0
- package/dist/utils/fileParser.d.ts.map +1 -0
- package/dist/utils/fileParser.js +111 -0
- package/dist/utils/fileParser.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +13 -12
- package/templates/general/project-impact.yaml +34 -0
- package/templates/general/project-overview.yaml +34 -0
- package/templates/tech/architecture-project.yaml +42 -0
- package/templates/tech/features.yaml +38 -0
- package/templates/tech/stack-project.yaml +42 -0
|
@@ -6,33 +6,103 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.loginCommand = loginCommand;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const client_1 = require("../../supabase/client");
|
|
11
|
+
const oauth_1 = require("../../supabase/oauth");
|
|
12
|
+
const utils_1 = require("../../utils");
|
|
13
|
+
const DEFAULT_APP_URL = 'https://devcache.vercel.app'; // Your production URL
|
|
9
14
|
async function loginCommand() {
|
|
10
15
|
console.log(chalk_1.default.blue.bold('\nš DevCache Login\n'));
|
|
11
16
|
try {
|
|
12
|
-
|
|
17
|
+
// Initialize Supabase client
|
|
18
|
+
const supabase = (0, client_1.getSupabaseClient)();
|
|
19
|
+
await supabase.initialize();
|
|
20
|
+
// Check if already logged in
|
|
21
|
+
const existingSession = await supabase.getSession();
|
|
22
|
+
if (existingSession) {
|
|
23
|
+
const { relogin } = await inquirer_1.default.prompt([
|
|
24
|
+
{
|
|
25
|
+
type: 'confirm',
|
|
26
|
+
name: 'relogin',
|
|
27
|
+
message: `Already logged in as ${existingSession.email}. Login with different account?`,
|
|
28
|
+
default: false,
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
if (!relogin) {
|
|
32
|
+
utils_1.Logger.success('Already authenticated');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await supabase.clearSession();
|
|
36
|
+
}
|
|
37
|
+
// Ask for authentication method
|
|
38
|
+
const { method } = await inquirer_1.default.prompt([
|
|
13
39
|
{
|
|
14
|
-
type: '
|
|
15
|
-
name: '
|
|
16
|
-
message: '
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
40
|
+
type: 'list',
|
|
41
|
+
name: 'method',
|
|
42
|
+
message: 'Choose authentication method:',
|
|
43
|
+
choices: [
|
|
44
|
+
{ name: 'Browser (OAuth) - Recommended', value: 'oauth' },
|
|
45
|
+
{ name: 'Email & Password', value: 'password' },
|
|
46
|
+
],
|
|
47
|
+
default: 'oauth',
|
|
22
48
|
},
|
|
23
|
-
{
|
|
24
|
-
type: 'password',
|
|
25
|
-
name: 'password',
|
|
26
|
-
message: 'Password:',
|
|
27
|
-
mask: '*'
|
|
28
|
-
}
|
|
29
49
|
]);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
50
|
+
if (method === 'oauth') {
|
|
51
|
+
// OAuth flow
|
|
52
|
+
console.log(chalk_1.default.gray('\nOpening browser for authentication...'));
|
|
53
|
+
console.log(chalk_1.default.gray('If browser doesn\'t open, copy the URL from the terminal.\n'));
|
|
54
|
+
const oauth = new oauth_1.OAuthFlow();
|
|
55
|
+
const appUrl = process.env.NEXT_PUBLIC_APP_URL || DEFAULT_APP_URL;
|
|
56
|
+
const spinner = (0, ora_1.default)('Waiting for authentication...').start();
|
|
57
|
+
try {
|
|
58
|
+
const session = await oauth.startFlow(appUrl);
|
|
59
|
+
// Save session
|
|
60
|
+
await supabase.saveOAuthSession(session);
|
|
61
|
+
spinner.succeed(chalk_1.default.green('Login successful!'));
|
|
62
|
+
console.log(chalk_1.default.gray(`\nLogged in as: ${session.email}`));
|
|
63
|
+
console.log(chalk_1.default.gray('Session stored locally\n'));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
spinner.fail('Authentication failed');
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Password flow
|
|
72
|
+
const answers = await inquirer_1.default.prompt([
|
|
73
|
+
{
|
|
74
|
+
type: 'input',
|
|
75
|
+
name: 'email',
|
|
76
|
+
message: 'Email:',
|
|
77
|
+
validate: (input) => {
|
|
78
|
+
if (input.includes('@'))
|
|
79
|
+
return true;
|
|
80
|
+
return 'Please enter a valid email address';
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: 'password',
|
|
85
|
+
name: 'password',
|
|
86
|
+
message: 'Password:',
|
|
87
|
+
mask: '*',
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
const spinner = (0, ora_1.default)('Authenticating...').start();
|
|
91
|
+
// Authenticate
|
|
92
|
+
const session = await supabase.login(answers.email, answers.password);
|
|
93
|
+
spinner.succeed(chalk_1.default.green('Login successful!'));
|
|
94
|
+
console.log(chalk_1.default.gray(`\nLogged in as: ${session.email}`));
|
|
95
|
+
console.log(chalk_1.default.gray('Session stored locally\n'));
|
|
96
|
+
}
|
|
33
97
|
}
|
|
34
98
|
catch (error) {
|
|
35
|
-
|
|
99
|
+
utils_1.Logger.error(`Login failed: ${error.message}`);
|
|
100
|
+
if (error.message.includes('timeout')) {
|
|
101
|
+
console.log(chalk_1.default.yellow('\nAuthentication timed out. Please try again.'));
|
|
102
|
+
}
|
|
103
|
+
else if (error.message.includes('credentials')) {
|
|
104
|
+
console.log(chalk_1.default.yellow('\nPlease check your email and password and try again.'));
|
|
105
|
+
}
|
|
36
106
|
process.exit(1);
|
|
37
107
|
}
|
|
38
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,kBA6GhC"}
|
|
@@ -6,24 +6,95 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.pushCommand = pushCommand;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
11
|
+
const client_1 = require("../../supabase/client");
|
|
12
|
+
const storage_1 = require("../../supabase/storage");
|
|
13
|
+
const utils_1 = require("../../utils");
|
|
9
14
|
async function pushCommand() {
|
|
10
|
-
const spinner = (0, ora_1.default)('
|
|
15
|
+
const spinner = (0, ora_1.default)('Initializing...').start();
|
|
11
16
|
try {
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
await
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
// Initialize Supabase client
|
|
18
|
+
const supabase = (0, client_1.getSupabaseClient)();
|
|
19
|
+
await supabase.initialize();
|
|
20
|
+
// Check authentication
|
|
21
|
+
spinner.text = 'Checking authentication...';
|
|
22
|
+
const session = await supabase.getSession();
|
|
23
|
+
if (!session) {
|
|
24
|
+
spinner.fail('Not authenticated');
|
|
25
|
+
console.log(chalk_1.default.yellow('\nPlease run'), chalk_1.default.cyan('devcache-hub login'), chalk_1.default.yellow('first.'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
utils_1.Logger.debug(`Authenticated as: ${session.email}`);
|
|
29
|
+
// Load configuration
|
|
30
|
+
spinner.text = 'Loading configuration...';
|
|
31
|
+
const config = await utils_1.ConfigManager.readConfig();
|
|
32
|
+
// Check if documentation exists
|
|
33
|
+
const projectPath = path_1.default.join(process.cwd(), config.outputDir, config.projectName);
|
|
34
|
+
try {
|
|
35
|
+
await promises_1.default.access(projectPath);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
spinner.fail('No documentation found');
|
|
39
|
+
console.log(chalk_1.default.yellow('\nPlease run'), chalk_1.default.cyan('devcache-hub generate'), chalk_1.default.yellow('first.'));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
// Read index.md file
|
|
43
|
+
spinner.text = 'Reading documentation files...';
|
|
44
|
+
const indexPath = path_1.default.join(projectPath, 'index.md');
|
|
45
|
+
let indexContent;
|
|
46
|
+
try {
|
|
47
|
+
indexContent = await promises_1.default.readFile(indexPath, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
spinner.fail('index.md not found');
|
|
51
|
+
console.log(chalk_1.default.yellow('\nPlease run'), chalk_1.default.cyan('devcache-hub generate'), chalk_1.default.yellow('to create documentation.'));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
// Read all documentation files
|
|
55
|
+
const files = [];
|
|
56
|
+
const categories = ['general', 'tech'];
|
|
57
|
+
for (const category of categories) {
|
|
58
|
+
const categoryPath = path_1.default.join(projectPath, category);
|
|
59
|
+
try {
|
|
60
|
+
const fileNames = await promises_1.default.readdir(categoryPath);
|
|
61
|
+
for (const filename of fileNames) {
|
|
62
|
+
if (filename.endsWith('.md')) {
|
|
63
|
+
const filePath = path_1.default.join(categoryPath, filename);
|
|
64
|
+
const content = await promises_1.default.readFile(filePath, 'utf-8');
|
|
65
|
+
files.push({ category, filename, content });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
utils_1.Logger.warn(`Category folder not found: ${category}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (files.length === 0) {
|
|
74
|
+
spinner.fail('No documentation files found');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
utils_1.Logger.debug(`Found ${files.length} documentation files + index.md`);
|
|
78
|
+
// Upload to Supabase
|
|
79
|
+
spinner.text = 'Uploading to Supabase...';
|
|
80
|
+
const storage = new storage_1.StorageManager(supabase);
|
|
81
|
+
const projectId = await storage.uploadDocumentation(config.projectName, files, indexContent, config.description);
|
|
19
82
|
spinner.succeed(chalk_1.default.green('Documentation pushed successfully!'));
|
|
83
|
+
// Get project URL
|
|
84
|
+
const appUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://devcache.vercel.app';
|
|
20
85
|
console.log(chalk_1.default.blue('\n⨠View your project at:'));
|
|
21
|
-
console.log(chalk_1.default.cyan(
|
|
86
|
+
console.log(chalk_1.default.cyan(` ${appUrl}/dashboard/projects/file/${projectId}`));
|
|
22
87
|
console.log();
|
|
23
88
|
}
|
|
24
89
|
catch (error) {
|
|
25
90
|
spinner.fail(chalk_1.default.red('Push failed'));
|
|
26
|
-
|
|
91
|
+
utils_1.Logger.error(error.message);
|
|
92
|
+
if (error.message.includes('not initialized')) {
|
|
93
|
+
console.log(chalk_1.default.yellow('\nRun'), chalk_1.default.cyan('devcache-hub init'), chalk_1.default.yellow('first to initialize the project.'));
|
|
94
|
+
}
|
|
95
|
+
else if (error.message.includes('Not authenticated')) {
|
|
96
|
+
console.log(chalk_1.default.yellow('\nRun'), chalk_1.default.cyan('devcache-hub login'), chalk_1.default.yellow('to authenticate.'));
|
|
97
|
+
}
|
|
27
98
|
process.exit(1);
|
|
28
99
|
}
|
|
29
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare class FileSystemHandler {
|
|
2
|
+
/**
|
|
3
|
+
* Create output directory structure with project name
|
|
4
|
+
*/
|
|
5
|
+
createOutputDirectory(outputPath: string, projectName: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Write documentation file inside project folder
|
|
8
|
+
*/
|
|
9
|
+
writeDocumentation(outputPath: string, projectName: string, category: 'general' | 'tech', filename: string, content: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Write index.md file with project map
|
|
12
|
+
*/
|
|
13
|
+
writeIndexFile(outputPath: string, projectName: string, projectDescription: string, files: Array<{
|
|
14
|
+
category: string;
|
|
15
|
+
filename: string;
|
|
16
|
+
description: string;
|
|
17
|
+
}>): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if file exists
|
|
20
|
+
*/
|
|
21
|
+
fileExists(filePath: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Read file content
|
|
24
|
+
*/
|
|
25
|
+
readFile(filePath: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* List files in directory
|
|
28
|
+
*/
|
|
29
|
+
listFiles(dirPath: string): Promise<string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete directory recursively
|
|
32
|
+
*/
|
|
33
|
+
deleteDirectory(dirPath: string): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=FileSystemHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystemHandler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/FileSystemHandler.ts"],"names":[],"mappings":"AAIA,qBAAa,iBAAiB;IAC5B;;OAEG;IACG,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnF;;OAEG;IACG,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,SAAS,GAAG,MAAM,EAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,GACxE,OAAO,CAAC,IAAI,CAAC;IA+ChB;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjD;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWnD;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQtD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FileSystemHandler = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
class FileSystemHandler {
|
|
11
|
+
/**
|
|
12
|
+
* Create output directory structure with project name
|
|
13
|
+
*/
|
|
14
|
+
async createOutputDirectory(outputPath, projectName) {
|
|
15
|
+
try {
|
|
16
|
+
// Create main output directory
|
|
17
|
+
await promises_1.default.mkdir(outputPath, { recursive: true });
|
|
18
|
+
// Create project-specific directory
|
|
19
|
+
const projectDir = path_1.default.join(outputPath, projectName);
|
|
20
|
+
await promises_1.default.mkdir(projectDir, { recursive: true });
|
|
21
|
+
// Create category directories inside project folder
|
|
22
|
+
await promises_1.default.mkdir(path_1.default.join(projectDir, 'general'), { recursive: true });
|
|
23
|
+
await promises_1.default.mkdir(path_1.default.join(projectDir, 'tech'), { recursive: true });
|
|
24
|
+
utils_1.Logger.debug(`Created output directory structure: ${projectDir}`);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new Error(`Failed to create output directory: ${error}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write documentation file inside project folder
|
|
32
|
+
*/
|
|
33
|
+
async writeDocumentation(outputPath, projectName, category, filename, content) {
|
|
34
|
+
const filePath = path_1.default.join(outputPath, projectName, category, filename);
|
|
35
|
+
try {
|
|
36
|
+
await promises_1.default.writeFile(filePath, content, 'utf-8');
|
|
37
|
+
utils_1.Logger.debug(`Written file: ${filePath}`);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new Error(`Failed to write file ${filePath}: ${error}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write index.md file with project map
|
|
45
|
+
*/
|
|
46
|
+
async writeIndexFile(outputPath, projectName, projectDescription, files) {
|
|
47
|
+
const indexPath = path_1.default.join(outputPath, projectName, 'index.md');
|
|
48
|
+
let content = `# ${projectName}\n\n`;
|
|
49
|
+
content += `${projectDescription}\n\n`;
|
|
50
|
+
content += `---\n\n`;
|
|
51
|
+
content += `## š Documentation Structure\n\n`;
|
|
52
|
+
content += `This documentation is organized into the following categories:\n\n`;
|
|
53
|
+
// Group by category
|
|
54
|
+
const general = files.filter(f => f.category === 'general');
|
|
55
|
+
const tech = files.filter(f => f.category === 'tech');
|
|
56
|
+
if (general.length > 0) {
|
|
57
|
+
content += `### š General\n\n`;
|
|
58
|
+
content += `High-level overview and project context:\n\n`;
|
|
59
|
+
for (const file of general) {
|
|
60
|
+
content += `- **[${file.filename}](./general/${file.filename})** - ${file.description}\n`;
|
|
61
|
+
}
|
|
62
|
+
content += `\n`;
|
|
63
|
+
}
|
|
64
|
+
if (tech.length > 0) {
|
|
65
|
+
content += `### š§ Technical\n\n`;
|
|
66
|
+
content += `Technical details and implementation:\n\n`;
|
|
67
|
+
for (const file of tech) {
|
|
68
|
+
content += `- **[${file.filename}](./tech/${file.filename})** - ${file.description}\n`;
|
|
69
|
+
}
|
|
70
|
+
content += `\n`;
|
|
71
|
+
}
|
|
72
|
+
content += `---\n\n`;
|
|
73
|
+
content += `## š Quick Navigation\n\n`;
|
|
74
|
+
content += `- Start with **General** documentation to understand the project's purpose\n`;
|
|
75
|
+
content += `- Dive into **Technical** documentation for implementation details\n`;
|
|
76
|
+
content += `- Each document is self-contained and can be read independently\n\n`;
|
|
77
|
+
content += `---\n\n`;
|
|
78
|
+
content += `*Generated by DevCache on ${new Date().toISOString()}*\n`;
|
|
79
|
+
try {
|
|
80
|
+
await promises_1.default.writeFile(indexPath, content, 'utf-8');
|
|
81
|
+
utils_1.Logger.debug(`Written index file: ${indexPath}`);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
throw new Error(`Failed to write index file: ${error}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if file exists
|
|
89
|
+
*/
|
|
90
|
+
async fileExists(filePath) {
|
|
91
|
+
try {
|
|
92
|
+
await promises_1.default.access(filePath);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Read file content
|
|
101
|
+
*/
|
|
102
|
+
async readFile(filePath) {
|
|
103
|
+
try {
|
|
104
|
+
return await promises_1.default.readFile(filePath, 'utf-8');
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new Error(`Failed to read file ${filePath}: ${error}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* List files in directory
|
|
112
|
+
*/
|
|
113
|
+
async listFiles(dirPath) {
|
|
114
|
+
try {
|
|
115
|
+
const entries = await promises_1.default.readdir(dirPath, { withFileTypes: true });
|
|
116
|
+
return entries
|
|
117
|
+
.filter((entry) => entry.isFile())
|
|
118
|
+
.map((entry) => entry.name);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(`Failed to list files in ${dirPath}: ${error}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Delete directory recursively
|
|
126
|
+
*/
|
|
127
|
+
async deleteDirectory(dirPath) {
|
|
128
|
+
try {
|
|
129
|
+
await promises_1.default.rm(dirPath, { recursive: true, force: true });
|
|
130
|
+
utils_1.Logger.debug(`Deleted directory: ${dirPath}`);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw new Error(`Failed to delete directory ${dirPath}: ${error}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.FileSystemHandler = FileSystemHandler;
|
|
138
|
+
//# sourceMappingURL=FileSystemHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystemHandler.js","sourceRoot":"","sources":["../../src/orchestrator/FileSystemHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BaseAnalyzer } from '../analyzers/base/BaseAnalyzer';
|
|
2
|
+
import { AnalysisResult } from '../types';
|
|
3
|
+
export declare class Orchestrator {
|
|
4
|
+
private analyzers;
|
|
5
|
+
private templateManager;
|
|
6
|
+
private fsHandler;
|
|
7
|
+
private config;
|
|
8
|
+
private rootPath;
|
|
9
|
+
constructor(rootPath?: string);
|
|
10
|
+
/**
|
|
11
|
+
* Initialize orchestrator
|
|
12
|
+
*/
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Register an analyzer
|
|
16
|
+
*/
|
|
17
|
+
registerAnalyzer(analyzer: BaseAnalyzer): void;
|
|
18
|
+
/**
|
|
19
|
+
* Main analysis workflow
|
|
20
|
+
*/
|
|
21
|
+
analyze(): Promise<AnalysisResult[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Scan project and build context
|
|
24
|
+
*/
|
|
25
|
+
private scanProject;
|
|
26
|
+
/**
|
|
27
|
+
* Get analysis summary
|
|
28
|
+
*/
|
|
29
|
+
getSummary(results: AnalysisResult[]): string;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=Orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/Orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAI9D,OAAO,EAAkB,cAAc,EAAkB,MAAM,UAAU,CAAC;AAE1E,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAAsB;IAO5C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAK9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAoF1C;;OAEG;YACW,WAAW;IA6BzB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM;CAmB9C"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Orchestrator = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const TemplateManager_1 = require("./TemplateManager");
|
|
9
|
+
const FileSystemHandler_1 = require("./FileSystemHandler");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
class Orchestrator {
|
|
12
|
+
constructor(rootPath = process.cwd()) {
|
|
13
|
+
this.analyzers = new Map();
|
|
14
|
+
this.rootPath = rootPath;
|
|
15
|
+
this.templateManager = new TemplateManager_1.TemplateManager();
|
|
16
|
+
this.fsHandler = new FileSystemHandler_1.FileSystemHandler();
|
|
17
|
+
this.config = {}; // Will be loaded in initialize()
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize orchestrator
|
|
21
|
+
*/
|
|
22
|
+
async initialize() {
|
|
23
|
+
utils_1.Logger.debug('Initializing orchestrator...');
|
|
24
|
+
// Load configuration
|
|
25
|
+
this.config = await utils_1.ConfigManager.readConfig(this.rootPath);
|
|
26
|
+
// Load templates
|
|
27
|
+
await this.templateManager.loadTemplates();
|
|
28
|
+
utils_1.Logger.debug('Orchestrator initialized');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Register an analyzer
|
|
32
|
+
*/
|
|
33
|
+
registerAnalyzer(analyzer) {
|
|
34
|
+
this.analyzers.set(analyzer.name, analyzer);
|
|
35
|
+
utils_1.Logger.debug(`Registered analyzer: ${analyzer.name}`);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Main analysis workflow
|
|
39
|
+
*/
|
|
40
|
+
async analyze() {
|
|
41
|
+
utils_1.Logger.section('š Analyzing Project');
|
|
42
|
+
// Step 1: Scan project
|
|
43
|
+
const context = await this.scanProject();
|
|
44
|
+
utils_1.Logger.success(`Scanned ${context.files.length} files`);
|
|
45
|
+
// Step 2: Create output directory with project name
|
|
46
|
+
const outputPath = path_1.default.join(this.rootPath, this.config.outputDir);
|
|
47
|
+
await this.fsHandler.createOutputDirectory(outputPath, this.config.projectName);
|
|
48
|
+
// Step 3: Run analyzers
|
|
49
|
+
const results = [];
|
|
50
|
+
const fileDescriptions = [];
|
|
51
|
+
for (const [name, analyzer] of this.analyzers) {
|
|
52
|
+
try {
|
|
53
|
+
utils_1.Logger.info(`Running ${name}...`);
|
|
54
|
+
const output = await analyzer.analyze(context);
|
|
55
|
+
const template = this.templateManager.getTemplate(name);
|
|
56
|
+
if (!template) {
|
|
57
|
+
throw new Error(`Template not found for analyzer: ${name}`);
|
|
58
|
+
}
|
|
59
|
+
// Render markdown
|
|
60
|
+
const markdown = this.templateManager.renderTemplate(template, output);
|
|
61
|
+
// Write to file (now includes project name in path)
|
|
62
|
+
await this.fsHandler.writeDocumentation(outputPath, this.config.projectName, analyzer.category, template.outputFile, markdown);
|
|
63
|
+
// Store file description for index
|
|
64
|
+
fileDescriptions.push({
|
|
65
|
+
category: analyzer.category,
|
|
66
|
+
filename: template.outputFile,
|
|
67
|
+
description: template.description,
|
|
68
|
+
});
|
|
69
|
+
results.push({
|
|
70
|
+
analyzer: name,
|
|
71
|
+
outputPath: path_1.default.join(outputPath, this.config.projectName, analyzer.category, template.outputFile),
|
|
72
|
+
category: analyzer.category,
|
|
73
|
+
content: markdown,
|
|
74
|
+
success: true,
|
|
75
|
+
});
|
|
76
|
+
utils_1.Logger.success(`Generated ${template.outputFile}`);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
utils_1.Logger.error(`Failed to run ${name}: ${error}`);
|
|
80
|
+
results.push({
|
|
81
|
+
analyzer: name,
|
|
82
|
+
outputPath: '',
|
|
83
|
+
category: analyzer.category,
|
|
84
|
+
content: '',
|
|
85
|
+
success: false,
|
|
86
|
+
error: String(error),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Step 4: Create index.md file
|
|
91
|
+
const projectDescription = this.config.description ||
|
|
92
|
+
`Comprehensive documentation for ${this.config.projectName} project.`;
|
|
93
|
+
await this.fsHandler.writeIndexFile(outputPath, this.config.projectName, projectDescription, fileDescriptions);
|
|
94
|
+
utils_1.Logger.success('Created index.md');
|
|
95
|
+
return results;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Scan project and build context
|
|
99
|
+
*/
|
|
100
|
+
async scanProject() {
|
|
101
|
+
utils_1.Logger.debug('Scanning project structure...');
|
|
102
|
+
// Scan files
|
|
103
|
+
const files = await utils_1.FileParser.scanProject(this.rootPath, this.config.analysis.includePatterns, this.config.analysis.excludePatterns);
|
|
104
|
+
// Read package.json
|
|
105
|
+
const packageJson = await utils_1.FileParser.readPackageJson(this.rootPath);
|
|
106
|
+
// Read README
|
|
107
|
+
const readme = await utils_1.FileParser.readReadme(this.rootPath);
|
|
108
|
+
// Detect framework
|
|
109
|
+
const framework = utils_1.FileParser.detectFramework(packageJson);
|
|
110
|
+
return {
|
|
111
|
+
rootPath: this.rootPath,
|
|
112
|
+
config: this.config,
|
|
113
|
+
files,
|
|
114
|
+
packageJson: packageJson || undefined,
|
|
115
|
+
readme: readme || undefined,
|
|
116
|
+
framework,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get analysis summary
|
|
121
|
+
*/
|
|
122
|
+
getSummary(results) {
|
|
123
|
+
const successful = results.filter((r) => r.success).length;
|
|
124
|
+
const failed = results.filter((r) => !r.success).length;
|
|
125
|
+
let summary = '\nš Analysis Summary\n\n';
|
|
126
|
+
summary += `ā Successful: ${successful}\n`;
|
|
127
|
+
summary += `ā Failed: ${failed}\n\n`;
|
|
128
|
+
summary += 'Generated files:\n';
|
|
129
|
+
for (const result of results) {
|
|
130
|
+
if (result.success) {
|
|
131
|
+
summary += ` ā ${result.outputPath}\n`;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
summary += ` ā ${result.analyzer} - ${result.error}\n`;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return summary;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.Orchestrator = Orchestrator;
|
|
141
|
+
//# sourceMappingURL=Orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Orchestrator.js","sourceRoot":"","sources":["../../src/orchestrator/Orchestrator.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAAoD;AACpD,2DAAwD;AACxD,oCAA6D;AAG7D,MAAa,YAAY;IAOvB,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QANpC,cAAS,GAA8B,IAAI,GAAG,EAAE,CAAC;QAOvD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,iCAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,qCAAiB,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,EAAoB,CAAC,CAAC,iCAAiC;IACvE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,cAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAE7C,qBAAqB;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,qBAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5D,iBAAiB;QACjB,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QAE3C,cAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAsB;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,cAAM,CAAC,KAAK,CAAC,wBAAwB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,cAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEvC,uBAAuB;QACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,cAAM,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAExD,oDAAoD;QACpD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEhF,wBAAwB;QACxB,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAuE,EAAE,CAAC;QAEhG,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,cAAM,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;gBAElC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAExD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAED,kBAAkB;gBAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAEvE,oDAAoD;gBACpD,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACrC,UAAU,EACV,IAAI,CAAC,MAAM,CAAC,WAAW,EACvB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CACT,CAAC;gBAEF,mCAAmC;gBACnC,gBAAgB,CAAC,IAAI,CAAC;oBACpB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,QAAQ,EAAE,QAAQ,CAAC,UAAU;oBAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;iBAClC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC;oBAClG,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,OAAO,EAAE,QAAQ;oBACjB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,cAAM,CAAC,OAAO,CAAC,aAAa,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;gBAEhD,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE,EAAE;oBACd,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;YAChD,mCAAmC,IAAI,CAAC,MAAM,CAAC,WAAW,WAAW,CAAC;QAExE,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CACjC,UAAU,EACV,IAAI,CAAC,MAAM,CAAC,WAAW,EACvB,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;QAEF,cAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW;QACvB,cAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAE9C,aAAa;QACb,MAAM,KAAK,GAAG,MAAM,kBAAU,CAAC,WAAW,CACxC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CACrC,CAAC;QAEF,oBAAoB;QACpB,MAAM,WAAW,GAAG,MAAM,kBAAU,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpE,cAAc;QACd,MAAM,MAAM,GAAG,MAAM,kBAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1D,mBAAmB;QACnB,MAAM,SAAS,GAAG,kBAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAE1D,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK;YACL,WAAW,EAAE,WAAW,IAAI,SAAS;YACrC,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAyB;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAExD,IAAI,OAAO,GAAG,2BAA2B,CAAC;QAC1C,OAAO,IAAI,iBAAiB,UAAU,IAAI,CAAC;QAC3C,OAAO,IAAI,aAAa,MAAM,MAAM,CAAC;QAErC,OAAO,IAAI,oBAAoB,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,IAAI,OAAO,MAAM,CAAC,UAAU,IAAI,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,OAAO,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,KAAK,IAAI,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAlLD,oCAkLC"}
|