shokupan 0.14.1 → 0.15.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/{ast-analyzer-worker-C3jrQ8VR.js → ast-analyzer-worker-RU6WIe1O.js} +2 -3
- package/dist/ast-analyzer-worker-RU6WIe1O.js.map +1 -0
- package/dist/{ast-analyzer-worker-D_uYkqmY.cjs → ast-analyzer-worker-qaMC79uL.cjs} +3 -3
- package/dist/ast-analyzer-worker-qaMC79uL.cjs.map +1 -0
- package/dist/{index-CKT0nD1S.cjs → index-46Z4ASUY.cjs} +405 -198
- package/dist/index-46Z4ASUY.cjs.map +1 -0
- package/dist/{index-BKinKXSN.js → index-MDmdOQNV.js} +439 -232
- package/dist/index-MDmdOQNV.js.map +1 -0
- package/dist/index.cjs +4 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +42 -39
- package/dist/{knex-YdTmzgwv.js → knex-BbK40SH3.js} +2 -2
- package/dist/{knex-YdTmzgwv.js.map → knex-BbK40SH3.js.map} +1 -1
- package/dist/{knex-C6Pn6L06.cjs → knex-CIS1IT0Y.cjs} +2 -2
- package/dist/{knex-C6Pn6L06.cjs.map → knex-CIS1IT0Y.cjs.map} +1 -1
- package/dist/{level-a8XImJWW.cjs → level-B0zBSwWA.cjs} +2 -2
- package/dist/{level-a8XImJWW.cjs.map → level-B0zBSwWA.cjs.map} +1 -1
- package/dist/{level-Ct6tP4Y_.js → level-Dhm9CiBU.js} +2 -2
- package/dist/{level-Ct6tP4Y_.js.map → level-Dhm9CiBU.js.map} +1 -1
- package/dist/plugins/application/auth.d.ts +1 -1
- package/dist/plugins/application/dashboard/metrics-collector.d.ts +1 -1
- package/dist/plugins/application/dashboard/plugin.d.ts +1 -0
- package/dist/plugins/application/dashboard/static/charts.js +3 -1
- package/dist/plugins/application/dashboard/static/client.js +3 -9
- package/dist/plugins/application/dashboard/static/init_controls.js +12 -0
- package/dist/plugins/application/dashboard/static/replay.js +366 -0
- package/dist/plugins/application/dashboard/static/requests.js +249 -454
- package/dist/plugins/application/dashboard/static/tables.js +34 -9
- package/dist/plugins/application/dashboard/static/tabs.js +73 -24
- package/dist/plugins/application/dashboard/static/timeline.js +201 -0
- package/dist/plugins/middleware/static.d.ts +29 -0
- package/dist/router.d.ts +8 -0
- package/dist/shokupan.d.ts +1 -1
- package/dist/{sqlite-Di9SQxwg.js → sqlite-CY-WyaJ5.js} +2 -2
- package/dist/{sqlite-Di9SQxwg.js.map → sqlite-CY-WyaJ5.js.map} +1 -1
- package/dist/{sqlite-X-xYWVWV.cjs → sqlite-sfDxgiji.cjs} +2 -2
- package/dist/{sqlite-X-xYWVWV.cjs.map → sqlite-sfDxgiji.cjs.map} +1 -1
- package/dist/{surreal-BQORt8OM.js → surreal-D1txBCZb.js} +2 -2
- package/dist/{surreal-BQORt8OM.js.map → surreal-D1txBCZb.js.map} +1 -1
- package/dist/{surreal-iyhfSEbm.cjs → surreal-DiEl_VJL.cjs} +2 -2
- package/dist/{surreal-iyhfSEbm.cjs.map → surreal-DiEl_VJL.cjs.map} +1 -1
- package/dist/util/adapter/h3.d.ts +7 -2
- package/dist/util/symbol.d.ts +2 -0
- package/dist/util/types.d.ts +6 -0
- package/package.json +1 -1
- package/dist/ast-analyzer-worker-C3jrQ8VR.js.map +0 -1
- package/dist/ast-analyzer-worker-D_uYkqmY.cjs.map +0 -1
- package/dist/index-BKinKXSN.js.map +0 -1
- package/dist/index-CKT0nD1S.cjs.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { EventEmitter } from "events";
|
|
2
|
-
import path from "path";
|
|
3
2
|
import { Worker } from "worker_threads";
|
|
4
3
|
class ASTAnalyzerWorker extends EventEmitter {
|
|
5
4
|
state = "idle";
|
|
@@ -81,7 +80,7 @@ class ASTAnalyzerWorker extends EventEmitter {
|
|
|
81
80
|
this.state = "analyzing";
|
|
82
81
|
this.startTime = Date.now();
|
|
83
82
|
this.emit("started");
|
|
84
|
-
const workerPath =
|
|
83
|
+
const workerPath = new URL("data:video/mp2t;base64,aW1wb3J0IHsgcGFyZW50UG9ydCwgd29ya2VyRGF0YSB9IGZyb20gJ3dvcmtlcl90aHJlYWRzJzsKCi8qKgogKiBXb3JrZXIgdGhyZWFkIHNjcmlwdCBmb3IgQVNUIGFuYWx5c2lzLgogKiBUaGlzIHJ1bnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIG1haW4gZXZlbnQgbG9vcC4KICovCmFzeW5jIGZ1bmN0aW9uIHJ1bkFuYWx5c2lzKCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCB7IHJvb3REaXIsIGVudHJ5cG9pbnQgfSA9IHdvcmtlckRhdGE7CgogICAgICAgIC8vIFNlbmQgcHJvZ3Jlc3MgdXBkYXRlCiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBtZXNzYWdlOiAnU3RhcnRpbmcgQVNUIGFuYWx5c2lzLi4uJyB9KTsKCiAgICAgICAgLy8gRHluYW1pY2FsbHkgaW1wb3J0IHRoZSBhbmFseXplciBpbXBsZW1lbnRhdGlvbgogICAgICAgIGNvbnN0IHsgT3BlbkFQSUFuYWx5emVyIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3BsdWdpbnMvYXBwbGljYXRpb24vb3BlbmFwaS9hbmFseXplcicpOwoKICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZSh7IHR5cGU6ICdwcm9ncmVzcycsIG1lc3NhZ2U6ICdJbml0aWFsaXppbmcgVHlwZVNjcmlwdCBjb21waWxlci4uLicgfSk7CgogICAgICAgIC8vIENyZWF0ZSBhbmFseXplciBpbnN0YW5jZQogICAgICAgIGNvbnN0IGFuYWx5emVyID0gbmV3IE9wZW5BUElBbmFseXplcihyb290RGlyLCBlbnRyeXBvaW50KTsKCiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBtZXNzYWdlOiAnQW5hbHl6aW5nIHNvdXJjZSBmaWxlcy4uLicgfSk7CgogICAgICAgIC8vIFJ1biBhbmFseXNpcwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVyLmFuYWx5emUoKTsKCiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBtZXNzYWdlOiAnQW5hbHlzaXMgY29tcGxldGUhJyB9KTsKCiAgICAgICAgLy8gU2VuZCByZXN1bHQgYmFjayB0byBtYWluIHRocmVhZAogICAgICAgIHBhcmVudFBvcnQ/LnBvc3RNZXNzYWdlKHsgdHlwZTogJ3Jlc3VsdCcsIGRhdGE6IHJlc3VsdCB9KTsKICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHsKICAgICAgICAvLyBTZW5kIGVycm9yIGJhY2sgdG8gbWFpbiB0aHJlYWQKICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCiAgICAgICAgICAgIGVycm9yOiB7CiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLAogICAgICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLAogICAgICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgfQp9CgovLyBTdGFydCBhbmFseXNpcwpydW5BbmFseXNpcygpOwo=", import.meta.url).pathname;
|
|
85
84
|
this.worker = new Worker(workerPath, {
|
|
86
85
|
workerData: {
|
|
87
86
|
rootDir: this.rootDir,
|
|
@@ -181,4 +180,4 @@ export {
|
|
|
181
180
|
ASTAnalyzerWorker,
|
|
182
181
|
getGlobalAnalyzer
|
|
183
182
|
};
|
|
184
|
-
//# sourceMappingURL=ast-analyzer-worker-
|
|
183
|
+
//# sourceMappingURL=ast-analyzer-worker-RU6WIe1O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-analyzer-worker-RU6WIe1O.js","sources":["../src/util/ast-analyzer-worker.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { Worker } from 'worker_threads';\n\nexport type ASTAnalyzerState = 'idle' | 'analyzing' | 'completed' | 'failed';\n\nexport interface ASTAnalyzerResult {\n applications: any[];\n}\n\nexport interface ASTAnalyzerEvents {\n 'started': () => void;\n 'completed': (result: ASTAnalyzerResult) => void;\n 'failed': (error: Error) => void;\n 'progress': (message: string) => void;\n}\n\n/**\n * Worker-based AST analyzer that runs TypeScript analysis in a separate thread.\n * This prevents blocking the main event loop during intensive AST parsing.\n */\nexport class ASTAnalyzerWorker extends EventEmitter {\n private state: ASTAnalyzerState = 'idle';\n private result: ASTAnalyzerResult | null = null;\n private error: Error | null = null;\n private worker: Worker | null = null;\n private analysisPromise: Promise<ASTAnalyzerResult> | null = null;\n private rootDir: string;\n private entrypoint?: string;\n private timeout: number;\n private startTime: number = 0;\n\n constructor(rootDir: string, entrypoint?: string, timeout: number = 30000) {\n super();\n this.rootDir = rootDir;\n this.entrypoint = entrypoint;\n this.timeout = timeout;\n }\n\n /**\n * Get the current state of the analyzer.\n */\n public getState(): ASTAnalyzerState {\n return this.state;\n }\n\n /**\n * Get the cached result if analysis completed successfully.\n */\n public getResult(): ASTAnalyzerResult | null {\n return this.result;\n }\n\n /**\n * Get the error if analysis failed.\n */\n public getError(): Error | null {\n return this.error;\n }\n\n /**\n * Check if analysis is currently running.\n */\n public isAnalyzing(): boolean {\n return this.state === 'analyzing';\n }\n\n /**\n * Check if analysis has completed successfully.\n */\n public isCompleted(): boolean {\n return this.state === 'completed';\n }\n\n /**\n * Check if analysis has failed.\n */\n public isFailed(): boolean {\n return this.state === 'failed';\n }\n\n /**\n * Get analysis duration in milliseconds (if completed or failed).\n */\n public getDuration(): number | null {\n if (this.state === 'idle' || this.state === 'analyzing') {\n return null;\n }\n return Date.now() - this.startTime;\n }\n\n /**\n * Start AST analysis in a worker thread.\n * Returns immediately and emits events as analysis progresses.\n */\n public async analyze(): Promise<ASTAnalyzerResult> {\n // If already analyzing, return the existing promise\n if (this.analysisPromise) {\n return this.analysisPromise;\n }\n\n // If already completed, return cached result\n if (this.state === 'completed' && this.result) {\n return Promise.resolve(this.result);\n }\n\n // If previously failed, reset state for retry\n if (this.state === 'failed') {\n this.state = 'idle';\n this.error = null;\n }\n\n this.analysisPromise = new Promise<ASTAnalyzerResult>((resolve, reject) => {\n this.state = 'analyzing';\n this.startTime = Date.now();\n this.emit('started');\n\n // Create worker thread\n const workerPath = new URL('./ast-worker-thread.js', import.meta.url).pathname;\n\n this.worker = new Worker(workerPath, {\n workerData: {\n rootDir: this.rootDir,\n entrypoint: this.entrypoint\n }\n });\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n const timeoutError = new Error(`AST analysis timed out after ${this.timeout}ms`);\n this.state = 'failed';\n this.error = timeoutError;\n this.emit('failed', timeoutError);\n reject(timeoutError);\n }, this.timeout);\n\n // Handle worker messages\n this.worker.on('message', (message: any) => {\n if (message.type === 'progress') {\n this.emit('progress', message.message);\n } else if (message.type === 'result') {\n clearTimeout(timeoutId);\n this.state = 'completed';\n this.result = message.data;\n this.emit('completed', this.result!);\n resolve(this.result!);\n\n // Clean up worker\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n }\n });\n\n // Handle worker errors\n this.worker.on('error', (err: Error) => {\n clearTimeout(timeoutId);\n this.state = 'failed';\n this.error = err;\n this.emit('failed', err);\n reject(err);\n\n // Clean up worker\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n });\n\n // Handle worker exit\n this.worker.on('exit', (code) => {\n if (code !== 0 && this.state === 'analyzing') {\n clearTimeout(timeoutId);\n const exitError = new Error(`Worker exited with code ${code}`);\n this.state = 'failed';\n this.error = exitError;\n this.emit('failed', exitError);\n reject(exitError);\n }\n });\n });\n\n return this.analysisPromise;\n }\n\n /**\n * Wait for analysis to complete (if it's running) or return immediately if already done.\n */\n public async waitForCompletion(): Promise<ASTAnalyzerResult> {\n if (this.state === 'completed' && this.result) {\n return this.result;\n }\n\n if (this.state === 'failed' && this.error) {\n throw this.error;\n }\n\n if (this.state === 'analyzing' && this.analysisPromise) {\n return this.analysisPromise;\n }\n\n // Not started yet, start it\n return this.analyze();\n }\n\n /**\n * Terminate the worker thread if running.\n */\n public terminate(): void {\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n if (this.state === 'analyzing') {\n this.state = 'idle';\n }\n }\n}\n\n// Singleton instance for shared use across plugins\nlet globalAnalyzer: ASTAnalyzerWorker | null = null;\n\n/**\n * Get or create the global AST analyzer instance.\n * This ensures all plugins share the same analysis results.\n */\nexport function getGlobalAnalyzer(rootDir?: string, entrypoint?: string, timeout?: number): ASTAnalyzerWorker {\n if (!globalAnalyzer) {\n globalAnalyzer = new ASTAnalyzerWorker(\n rootDir || process.cwd(),\n entrypoint,\n timeout\n );\n }\n return globalAnalyzer;\n}\n\n/**\n * Reset the global analyzer instance (useful for testing).\n */\nexport function resetGlobalAnalyzer(): void {\n if (globalAnalyzer) {\n globalAnalyzer.terminate();\n globalAnalyzer = null;\n }\n}\n"],"names":[],"mappings":";;AAoBO,MAAM,0BAA0B,aAAa;AAAA,EACxC,QAA0B;AAAA,EAC1B,SAAmC;AAAA,EACnC,QAAsB;AAAA,EACtB,SAAwB;AAAA,EACxB,kBAAqD;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAoB;AAAA,EAE5B,YAAY,SAAiB,YAAqB,UAAkB,KAAO;AACvE,UAAA;AACA,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKO,WAA6B;AAChC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,YAAsC;AACzC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,WAAyB;AAC5B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,cAAuB;AAC1B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,cAAuB;AAC1B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,WAAoB;AACvB,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,cAA6B;AAChC,QAAI,KAAK,UAAU,UAAU,KAAK,UAAU,aAAa;AACrD,aAAO;AAAA,IACX;AACA,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,UAAsC;AAE/C,QAAI,KAAK,iBAAiB;AACtB,aAAO,KAAK;AAAA,IAChB;AAGA,QAAI,KAAK,UAAU,eAAe,KAAK,QAAQ;AAC3C,aAAO,QAAQ,QAAQ,KAAK,MAAM;AAAA,IACtC;AAGA,QAAI,KAAK,UAAU,UAAU;AACzB,WAAK,QAAQ;AACb,WAAK,QAAQ;AAAA,IACjB;AAEA,SAAK,kBAAkB,IAAI,QAA2B,CAAC,SAAS,WAAW;AACvE,WAAK,QAAQ;AACb,WAAK,YAAY,KAAK,IAAA;AACtB,WAAK,KAAK,SAAS;AAGnB,YAAM,aAAa,IAAA,IAAA,+8DAAA,YAAA,GAAA,EAAmD;AAEtE,WAAK,SAAS,IAAI,OAAO,YAAY;AAAA,QACjC,YAAY;AAAA,UACR,SAAS,KAAK;AAAA,UACd,YAAY,KAAK;AAAA,QAAA;AAAA,MACrB,CACH;AAGD,YAAM,YAAY,WAAW,MAAM;AAC/B,YAAI,KAAK,QAAQ;AACb,eAAK,OAAO,UAAA;AACZ,eAAK,SAAS;AAAA,QAClB;AACA,cAAM,eAAe,IAAI,MAAM,gCAAgC,KAAK,OAAO,IAAI;AAC/E,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,KAAK,UAAU,YAAY;AAChC,eAAO,YAAY;AAAA,MACvB,GAAG,KAAK,OAAO;AAGf,WAAK,OAAO,GAAG,WAAW,CAAC,YAAiB;AACxC,YAAI,QAAQ,SAAS,YAAY;AAC7B,eAAK,KAAK,YAAY,QAAQ,OAAO;AAAA,QACzC,WAAW,QAAQ,SAAS,UAAU;AAClC,uBAAa,SAAS;AACtB,eAAK,QAAQ;AACb,eAAK,SAAS,QAAQ;AACtB,eAAK,KAAK,aAAa,KAAK,MAAO;AACnC,kBAAQ,KAAK,MAAO;AAGpB,cAAI,KAAK,QAAQ;AACb,iBAAK,OAAO,UAAA;AACZ,iBAAK,SAAS;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ,CAAC;AAGD,WAAK,OAAO,GAAG,SAAS,CAAC,QAAe;AACpC,qBAAa,SAAS;AACtB,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,KAAK,UAAU,GAAG;AACvB,eAAO,GAAG;AAGV,YAAI,KAAK,QAAQ;AACb,eAAK,OAAO,UAAA;AACZ,eAAK,SAAS;AAAA,QAClB;AAAA,MACJ,CAAC;AAGD,WAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AAC7B,YAAI,SAAS,KAAK,KAAK,UAAU,aAAa;AAC1C,uBAAa,SAAS;AACtB,gBAAM,YAAY,IAAI,MAAM,2BAA2B,IAAI,EAAE;AAC7D,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,eAAK,KAAK,UAAU,SAAS;AAC7B,iBAAO,SAAS;AAAA,QACpB;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAED,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAgD;AACzD,QAAI,KAAK,UAAU,eAAe,KAAK,QAAQ;AAC3C,aAAO,KAAK;AAAA,IAChB;AAEA,QAAI,KAAK,UAAU,YAAY,KAAK,OAAO;AACvC,YAAM,KAAK;AAAA,IACf;AAEA,QAAI,KAAK,UAAU,eAAe,KAAK,iBAAiB;AACpD,aAAO,KAAK;AAAA,IAChB;AAGA,WAAO,KAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,YAAkB;AACrB,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,UAAA;AACZ,WAAK,SAAS;AAAA,IAClB;AACA,QAAI,KAAK,UAAU,aAAa;AAC5B,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AACJ;AAGA,IAAI,iBAA2C;AAMxC,SAAS,kBAAkB,SAAkB,YAAqB,SAAqC;AAC1G,MAAI,CAAC,gBAAgB;AACjB,qBAAiB,IAAI;AAAA,MACjB,WAAW,QAAQ,IAAA;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AACA,SAAO;AACX;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const events = require("events");
|
|
4
|
-
const path = require("path");
|
|
5
4
|
const worker_threads = require("worker_threads");
|
|
5
|
+
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
6
6
|
class ASTAnalyzerWorker extends events.EventEmitter {
|
|
7
7
|
state = "idle";
|
|
8
8
|
result = null;
|
|
@@ -83,7 +83,7 @@ class ASTAnalyzerWorker extends events.EventEmitter {
|
|
|
83
83
|
this.state = "analyzing";
|
|
84
84
|
this.startTime = Date.now();
|
|
85
85
|
this.emit("started");
|
|
86
|
-
const workerPath =
|
|
86
|
+
const workerPath = new URL("data:video/mp2t;base64,aW1wb3J0IHsgcGFyZW50UG9ydCwgd29ya2VyRGF0YSB9IGZyb20gJ3dvcmtlcl90aHJlYWRzJzsKCi8qKgogKiBXb3JrZXIgdGhyZWFkIHNjcmlwdCBmb3IgQVNUIGFuYWx5c2lzLgogKiBUaGlzIHJ1bnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIG1haW4gZXZlbnQgbG9vcC4KICovCmFzeW5jIGZ1bmN0aW9uIHJ1bkFuYWx5c2lzKCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCB7IHJvb3REaXIsIGVudHJ5cG9pbnQgfSA9IHdvcmtlckRhdGE7CgogICAgICAgIC8vIFNlbmQgcHJvZ3Jlc3MgdXBkYXRlCiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBtZXNzYWdlOiAnU3RhcnRpbmcgQVNUIGFuYWx5c2lzLi4uJyB9KTsKCiAgICAgICAgLy8gRHluYW1pY2FsbHkgaW1wb3J0IHRoZSBhbmFseXplciBpbXBsZW1lbnRhdGlvbgogICAgICAgIGNvbnN0IHsgT3BlbkFQSUFuYWx5emVyIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3BsdWdpbnMvYXBwbGljYXRpb24vb3BlbmFwaS9hbmFseXplcicpOwoKICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZSh7IHR5cGU6ICdwcm9ncmVzcycsIG1lc3NhZ2U6ICdJbml0aWFsaXppbmcgVHlwZVNjcmlwdCBjb21waWxlci4uLicgfSk7CgogICAgICAgIC8vIENyZWF0ZSBhbmFseXplciBpbnN0YW5jZQogICAgICAgIGNvbnN0IGFuYWx5emVyID0gbmV3IE9wZW5BUElBbmFseXplcihyb290RGlyLCBlbnRyeXBvaW50KTsKCiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBtZXNzYWdlOiAnQW5hbHl6aW5nIHNvdXJjZSBmaWxlcy4uLicgfSk7CgogICAgICAgIC8vIFJ1biBhbmFseXNpcwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVyLmFuYWx5emUoKTsKCiAgICAgICAgcGFyZW50UG9ydD8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBtZXNzYWdlOiAnQW5hbHlzaXMgY29tcGxldGUhJyB9KTsKCiAgICAgICAgLy8gU2VuZCByZXN1bHQgYmFjayB0byBtYWluIHRocmVhZAogICAgICAgIHBhcmVudFBvcnQ/LnBvc3RNZXNzYWdlKHsgdHlwZTogJ3Jlc3VsdCcsIGRhdGE6IHJlc3VsdCB9KTsKICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHsKICAgICAgICAvLyBTZW5kIGVycm9yIGJhY2sgdG8gbWFpbiB0aHJlYWQKICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCiAgICAgICAgICAgIGVycm9yOiB7CiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLAogICAgICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLAogICAgICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgfQp9CgovLyBTdGFydCBhbmFseXNpcwpydW5BbmFseXNpcygpOwo=", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("ast-analyzer-worker-qaMC79uL.cjs", document.baseURI).href).pathname;
|
|
87
87
|
this.worker = new worker_threads.Worker(workerPath, {
|
|
88
88
|
workerData: {
|
|
89
89
|
rootDir: this.rootDir,
|
|
@@ -181,4 +181,4 @@ function getGlobalAnalyzer(rootDir, entrypoint, timeout) {
|
|
|
181
181
|
}
|
|
182
182
|
exports.ASTAnalyzerWorker = ASTAnalyzerWorker;
|
|
183
183
|
exports.getGlobalAnalyzer = getGlobalAnalyzer;
|
|
184
|
-
//# sourceMappingURL=ast-analyzer-worker-
|
|
184
|
+
//# sourceMappingURL=ast-analyzer-worker-qaMC79uL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-analyzer-worker-qaMC79uL.cjs","sources":["../src/util/ast-analyzer-worker.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { Worker } from 'worker_threads';\n\nexport type ASTAnalyzerState = 'idle' | 'analyzing' | 'completed' | 'failed';\n\nexport interface ASTAnalyzerResult {\n applications: any[];\n}\n\nexport interface ASTAnalyzerEvents {\n 'started': () => void;\n 'completed': (result: ASTAnalyzerResult) => void;\n 'failed': (error: Error) => void;\n 'progress': (message: string) => void;\n}\n\n/**\n * Worker-based AST analyzer that runs TypeScript analysis in a separate thread.\n * This prevents blocking the main event loop during intensive AST parsing.\n */\nexport class ASTAnalyzerWorker extends EventEmitter {\n private state: ASTAnalyzerState = 'idle';\n private result: ASTAnalyzerResult | null = null;\n private error: Error | null = null;\n private worker: Worker | null = null;\n private analysisPromise: Promise<ASTAnalyzerResult> | null = null;\n private rootDir: string;\n private entrypoint?: string;\n private timeout: number;\n private startTime: number = 0;\n\n constructor(rootDir: string, entrypoint?: string, timeout: number = 30000) {\n super();\n this.rootDir = rootDir;\n this.entrypoint = entrypoint;\n this.timeout = timeout;\n }\n\n /**\n * Get the current state of the analyzer.\n */\n public getState(): ASTAnalyzerState {\n return this.state;\n }\n\n /**\n * Get the cached result if analysis completed successfully.\n */\n public getResult(): ASTAnalyzerResult | null {\n return this.result;\n }\n\n /**\n * Get the error if analysis failed.\n */\n public getError(): Error | null {\n return this.error;\n }\n\n /**\n * Check if analysis is currently running.\n */\n public isAnalyzing(): boolean {\n return this.state === 'analyzing';\n }\n\n /**\n * Check if analysis has completed successfully.\n */\n public isCompleted(): boolean {\n return this.state === 'completed';\n }\n\n /**\n * Check if analysis has failed.\n */\n public isFailed(): boolean {\n return this.state === 'failed';\n }\n\n /**\n * Get analysis duration in milliseconds (if completed or failed).\n */\n public getDuration(): number | null {\n if (this.state === 'idle' || this.state === 'analyzing') {\n return null;\n }\n return Date.now() - this.startTime;\n }\n\n /**\n * Start AST analysis in a worker thread.\n * Returns immediately and emits events as analysis progresses.\n */\n public async analyze(): Promise<ASTAnalyzerResult> {\n // If already analyzing, return the existing promise\n if (this.analysisPromise) {\n return this.analysisPromise;\n }\n\n // If already completed, return cached result\n if (this.state === 'completed' && this.result) {\n return Promise.resolve(this.result);\n }\n\n // If previously failed, reset state for retry\n if (this.state === 'failed') {\n this.state = 'idle';\n this.error = null;\n }\n\n this.analysisPromise = new Promise<ASTAnalyzerResult>((resolve, reject) => {\n this.state = 'analyzing';\n this.startTime = Date.now();\n this.emit('started');\n\n // Create worker thread\n const workerPath = new URL('./ast-worker-thread.js', import.meta.url).pathname;\n\n this.worker = new Worker(workerPath, {\n workerData: {\n rootDir: this.rootDir,\n entrypoint: this.entrypoint\n }\n });\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n const timeoutError = new Error(`AST analysis timed out after ${this.timeout}ms`);\n this.state = 'failed';\n this.error = timeoutError;\n this.emit('failed', timeoutError);\n reject(timeoutError);\n }, this.timeout);\n\n // Handle worker messages\n this.worker.on('message', (message: any) => {\n if (message.type === 'progress') {\n this.emit('progress', message.message);\n } else if (message.type === 'result') {\n clearTimeout(timeoutId);\n this.state = 'completed';\n this.result = message.data;\n this.emit('completed', this.result!);\n resolve(this.result!);\n\n // Clean up worker\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n }\n });\n\n // Handle worker errors\n this.worker.on('error', (err: Error) => {\n clearTimeout(timeoutId);\n this.state = 'failed';\n this.error = err;\n this.emit('failed', err);\n reject(err);\n\n // Clean up worker\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n });\n\n // Handle worker exit\n this.worker.on('exit', (code) => {\n if (code !== 0 && this.state === 'analyzing') {\n clearTimeout(timeoutId);\n const exitError = new Error(`Worker exited with code ${code}`);\n this.state = 'failed';\n this.error = exitError;\n this.emit('failed', exitError);\n reject(exitError);\n }\n });\n });\n\n return this.analysisPromise;\n }\n\n /**\n * Wait for analysis to complete (if it's running) or return immediately if already done.\n */\n public async waitForCompletion(): Promise<ASTAnalyzerResult> {\n if (this.state === 'completed' && this.result) {\n return this.result;\n }\n\n if (this.state === 'failed' && this.error) {\n throw this.error;\n }\n\n if (this.state === 'analyzing' && this.analysisPromise) {\n return this.analysisPromise;\n }\n\n // Not started yet, start it\n return this.analyze();\n }\n\n /**\n * Terminate the worker thread if running.\n */\n public terminate(): void {\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n if (this.state === 'analyzing') {\n this.state = 'idle';\n }\n }\n}\n\n// Singleton instance for shared use across plugins\nlet globalAnalyzer: ASTAnalyzerWorker | null = null;\n\n/**\n * Get or create the global AST analyzer instance.\n * This ensures all plugins share the same analysis results.\n */\nexport function getGlobalAnalyzer(rootDir?: string, entrypoint?: string, timeout?: number): ASTAnalyzerWorker {\n if (!globalAnalyzer) {\n globalAnalyzer = new ASTAnalyzerWorker(\n rootDir || process.cwd(),\n entrypoint,\n timeout\n );\n }\n return globalAnalyzer;\n}\n\n/**\n * Reset the global analyzer instance (useful for testing).\n */\nexport function resetGlobalAnalyzer(): void {\n if (globalAnalyzer) {\n globalAnalyzer.terminate();\n globalAnalyzer = null;\n }\n}\n"],"names":["EventEmitter","Worker"],"mappings":";;;;;AAoBO,MAAM,0BAA0BA,OAAAA,aAAa;AAAA,EACxC,QAA0B;AAAA,EAC1B,SAAmC;AAAA,EACnC,QAAsB;AAAA,EACtB,SAAwB;AAAA,EACxB,kBAAqD;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAoB;AAAA,EAE5B,YAAY,SAAiB,YAAqB,UAAkB,KAAO;AACvE,UAAA;AACA,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKO,WAA6B;AAChC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,YAAsC;AACzC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,WAAyB;AAC5B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,cAAuB;AAC1B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,cAAuB;AAC1B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,WAAoB;AACvB,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,cAA6B;AAChC,QAAI,KAAK,UAAU,UAAU,KAAK,UAAU,aAAa;AACrD,aAAO;AAAA,IACX;AACA,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,UAAsC;AAE/C,QAAI,KAAK,iBAAiB;AACtB,aAAO,KAAK;AAAA,IAChB;AAGA,QAAI,KAAK,UAAU,eAAe,KAAK,QAAQ;AAC3C,aAAO,QAAQ,QAAQ,KAAK,MAAM;AAAA,IACtC;AAGA,QAAI,KAAK,UAAU,UAAU;AACzB,WAAK,QAAQ;AACb,WAAK,QAAQ;AAAA,IACjB;AAEA,SAAK,kBAAkB,IAAI,QAA2B,CAAC,SAAS,WAAW;AACvE,WAAK,QAAQ;AACb,WAAK,YAAY,KAAK,IAAA;AACtB,WAAK,KAAK,SAAS;AAGnB,YAAM,aAAa,IAAA,IAAA,+8DAAA,OAAA,aAAA,cAAA,QAAA,KAAA,EAAA,cAAA,UAAA,EAAA,OAAA,0BAAA,uBAAA,QAAA,YAAA,MAAA,YAAA,uBAAA,OAAA,IAAA,IAAA,oCAAA,SAAA,OAAA,EAAA,IAAA,EAAmD;AAEtE,WAAK,SAAS,IAAIC,eAAAA,OAAO,YAAY;AAAA,QACjC,YAAY;AAAA,UACR,SAAS,KAAK;AAAA,UACd,YAAY,KAAK;AAAA,QAAA;AAAA,MACrB,CACH;AAGD,YAAM,YAAY,WAAW,MAAM;AAC/B,YAAI,KAAK,QAAQ;AACb,eAAK,OAAO,UAAA;AACZ,eAAK,SAAS;AAAA,QAClB;AACA,cAAM,eAAe,IAAI,MAAM,gCAAgC,KAAK,OAAO,IAAI;AAC/E,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,KAAK,UAAU,YAAY;AAChC,eAAO,YAAY;AAAA,MACvB,GAAG,KAAK,OAAO;AAGf,WAAK,OAAO,GAAG,WAAW,CAAC,YAAiB;AACxC,YAAI,QAAQ,SAAS,YAAY;AAC7B,eAAK,KAAK,YAAY,QAAQ,OAAO;AAAA,QACzC,WAAW,QAAQ,SAAS,UAAU;AAClC,uBAAa,SAAS;AACtB,eAAK,QAAQ;AACb,eAAK,SAAS,QAAQ;AACtB,eAAK,KAAK,aAAa,KAAK,MAAO;AACnC,kBAAQ,KAAK,MAAO;AAGpB,cAAI,KAAK,QAAQ;AACb,iBAAK,OAAO,UAAA;AACZ,iBAAK,SAAS;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ,CAAC;AAGD,WAAK,OAAO,GAAG,SAAS,CAAC,QAAe;AACpC,qBAAa,SAAS;AACtB,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,KAAK,UAAU,GAAG;AACvB,eAAO,GAAG;AAGV,YAAI,KAAK,QAAQ;AACb,eAAK,OAAO,UAAA;AACZ,eAAK,SAAS;AAAA,QAClB;AAAA,MACJ,CAAC;AAGD,WAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AAC7B,YAAI,SAAS,KAAK,KAAK,UAAU,aAAa;AAC1C,uBAAa,SAAS;AACtB,gBAAM,YAAY,IAAI,MAAM,2BAA2B,IAAI,EAAE;AAC7D,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,eAAK,KAAK,UAAU,SAAS;AAC7B,iBAAO,SAAS;AAAA,QACpB;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAED,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAgD;AACzD,QAAI,KAAK,UAAU,eAAe,KAAK,QAAQ;AAC3C,aAAO,KAAK;AAAA,IAChB;AAEA,QAAI,KAAK,UAAU,YAAY,KAAK,OAAO;AACvC,YAAM,KAAK;AAAA,IACf;AAEA,QAAI,KAAK,UAAU,eAAe,KAAK,iBAAiB;AACpD,aAAO,KAAK;AAAA,IAChB;AAGA,WAAO,KAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,YAAkB;AACrB,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,UAAA;AACZ,WAAK,SAAS;AAAA,IAClB;AACA,QAAI,KAAK,UAAU,aAAa;AAC5B,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AACJ;AAGA,IAAI,iBAA2C;AAMxC,SAAS,kBAAkB,SAAkB,YAAqB,SAAqC;AAC1G,MAAI,CAAC,gBAAgB;AACjB,qBAAiB,IAAI;AAAA,MACjB,WAAW,QAAQ,IAAA;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAAA,EAER;AACA,SAAO;AACX;;;"}
|