@eventra_dev/eventra-cli 0.2.4 → 0.3.2
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 +143 -32
- package/dist/analysis/cache/evaluationCache.js +21 -0
- package/dist/analysis/cache/resolvedCallCache.js +21 -0
- package/dist/analysis/cache/resolvedExportCache.js +21 -0
- package/dist/analysis/cache/semanticDependencyGraph.js +25 -0
- package/dist/analysis/cache/symbolInvalidation.js +20 -0
- package/dist/analysis/extractor/extractor.js +47 -0
- package/dist/analysis/extractor/propagationExtractor.js +52 -0
- package/dist/analysis/pipeline/semanticPass.js +2 -0
- package/dist/analysis/resolver/callResolver.js +125 -0
- package/dist/analysis/resolver/exportResolver.js +75 -0
- package/dist/analysis/resolver/resolver.js +133 -0
- package/dist/analysis/scanner/analyzer/propagationAnalyzer.js +193 -0
- package/dist/analysis/scanner/analyzer/returnPropagationAnalyzer.js +105 -0
- package/dist/analysis/scanner/scanner.js +117 -0
- package/dist/analysis/scanner/sinkDetector.js +91 -0
- package/dist/analysis/shared/evaluationContext.js +9 -0
- package/dist/analysis/shared/propagation.js +3 -0
- package/dist/analysis/shared/returnPropagation.js +2 -0
- package/dist/analysis/shared/types.js +2 -0
- package/dist/analysis/shared/utils.js +62 -0
- package/dist/analysis/symbols/symbolUtils.js +68 -0
- package/dist/analysis/symbols/wrapperRegistry.js +55 -0
- package/dist/cli/check.js +73 -0
- package/dist/{commands → cli}/init.js +1 -1
- package/dist/{commands → cli}/send.js +1 -1
- package/dist/cli/sync.js +56 -0
- package/dist/{commands → cli}/watch.js +41 -25
- package/dist/compiler/compilerContext.js +204 -0
- package/dist/compiler/documentRegistry.js +78 -0
- package/dist/compiler/importGraph.js +83 -0
- package/dist/compiler/scheduler.js +29 -0
- package/dist/core/EventraEngine.js +234 -0
- package/dist/core/projectScanner.js +73 -0
- package/dist/{utils → filesystem}/getVirtualFile.js +1 -3
- package/dist/filesystem/processFile.js +38 -0
- package/dist/index.js +5 -5
- package/dist/shared/buildSyntheticTsx.js +20 -0
- package/dist/shared/templateExpressionExtractor.js +22 -0
- package/package.json +32 -9
- package/.github/workflows/release.yml +0 -43
- package/ARCHITECTURE.md +0 -88
- package/assets/eventra-icon-animated.svg +0 -19
- package/dist/commands/check.js +0 -78
- package/dist/commands/sync.js +0 -79
- package/dist/engine/boundary.js +0 -14
- package/dist/engine/callResolver.js +0 -58
- package/dist/engine/engine.js +0 -154
- package/dist/engine/exportResolver.js +0 -46
- package/dist/engine/functionAnalyzer.js +0 -71
- package/dist/engine/graph.js +0 -168
- package/dist/engine/languageService.js +0 -152
- package/dist/engine/resolver.js +0 -149
- package/dist/engine/scanner.js +0 -230
- package/dist/utils/processFile.js +0 -28
- package/dist/utils/universal.js +0 -190
- package/src/commands/check.ts +0 -91
- package/src/commands/init.ts +0 -174
- package/src/commands/send.ts +0 -213
- package/src/commands/sync.ts +0 -106
- package/src/commands/watch.ts +0 -144
- package/src/engine/boundary.ts +0 -12
- package/src/engine/callResolver.ts +0 -65
- package/src/engine/engine.ts +0 -227
- package/src/engine/exportResolver.ts +0 -56
- package/src/engine/functionAnalyzer.ts +0 -81
- package/src/engine/graph.ts +0 -193
- package/src/engine/hash.ts +0 -5
- package/src/engine/languageService.ts +0 -197
- package/src/engine/resolver.ts +0 -177
- package/src/engine/scanner.ts +0 -298
- package/src/index.ts +0 -49
- package/src/types.ts +0 -35
- package/src/utils/config.ts +0 -53
- package/src/utils/getVirtualFile.ts +0 -5
- package/src/utils/processFile.ts +0 -29
- package/src/utils/universal.ts +0 -249
- package/tests/fixtures/backend/express/app.ts +0 -233
- package/tests/fixtures/backend/nest/service.ts +0 -70
- package/tests/fixtures/backend/node/index.ts +0 -63
- package/tests/fixtures/frontend/next/page.tsx +0 -101
- package/tests/fixtures/frontend/react/App.tsx +0 -104
- package/tests/fixtures/frontend/vue/App.vue +0 -83
- package/tests/fixtures/wrappers/component/test.tsx +0 -62
- package/tests/fixtures/wrappers/function/test.ts +0 -60
- package/tests/run.ts +0 -106
- package/tsconfig.json +0 -14
- /package/dist/{utils → config}/config.js +0 -0
- /package/dist/{engine → shared}/hash.js +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/analysis/scanner/sinkDetector.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.detectTrackSink = detectTrackSink;
|
|
8
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
9
|
+
function isElementTrackProperty(expr) {
|
|
10
|
+
return (typescript_1.default.isElementAccessExpression(expr)
|
|
11
|
+
&& expr.argumentExpression
|
|
12
|
+
&& typescript_1.default.isStringLiteral(expr.argumentExpression)
|
|
13
|
+
&& expr.argumentExpression.text
|
|
14
|
+
=== "track");
|
|
15
|
+
}
|
|
16
|
+
function isTrackIdentifier(expr) {
|
|
17
|
+
return (typescript_1.default.isIdentifier(expr)
|
|
18
|
+
&& expr.text === "track");
|
|
19
|
+
}
|
|
20
|
+
function isTrackProperty(expr) {
|
|
21
|
+
return (typescript_1.default.isPropertyAccessExpression(expr)
|
|
22
|
+
&& expr.name.text
|
|
23
|
+
=== "track");
|
|
24
|
+
}
|
|
25
|
+
function isOptionalTrackProperty(expr) {
|
|
26
|
+
return (typescript_1.default.isPropertyAccessChain(expr)
|
|
27
|
+
&& expr.name.text
|
|
28
|
+
=== "track");
|
|
29
|
+
}
|
|
30
|
+
function extractTrackedArguments(call) {
|
|
31
|
+
const result = [];
|
|
32
|
+
if (call.arguments.length
|
|
33
|
+
=== 0) {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
//
|
|
37
|
+
// ONLY FIRST ARGUMENT
|
|
38
|
+
// IS EVENT SINK
|
|
39
|
+
//
|
|
40
|
+
// track(name, payload)
|
|
41
|
+
// ^^^^
|
|
42
|
+
//
|
|
43
|
+
const first = call.arguments[0];
|
|
44
|
+
//
|
|
45
|
+
// track({
|
|
46
|
+
// event: "signup"
|
|
47
|
+
// })
|
|
48
|
+
//
|
|
49
|
+
if (typescript_1.default.isObjectLiteralExpression(first)) {
|
|
50
|
+
for (const property of first.properties) {
|
|
51
|
+
if (!typescript_1.default.isPropertyAssignment(property)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const name = property.name
|
|
55
|
+
.getText();
|
|
56
|
+
if (name !== "event"
|
|
57
|
+
&& name !== "name"
|
|
58
|
+
&& name !== "type") {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
result.push({
|
|
62
|
+
index: 0,
|
|
63
|
+
propertyPath: [
|
|
64
|
+
name,
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
//
|
|
71
|
+
// track(name)
|
|
72
|
+
//
|
|
73
|
+
result.push({
|
|
74
|
+
index: 0,
|
|
75
|
+
propertyPath: [],
|
|
76
|
+
});
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function detectTrackSink(call) {
|
|
80
|
+
const expression = call.expression;
|
|
81
|
+
if (!isTrackIdentifier(expression)
|
|
82
|
+
&& !isTrackProperty(expression)
|
|
83
|
+
&& !isOptionalTrackProperty(expression)
|
|
84
|
+
&& !isElementTrackProperty(expression)) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
call,
|
|
89
|
+
trackedArguments: extractTrackedArguments(call),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/analysis/shared/evaluationContext.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.createEvaluationContext = createEvaluationContext;
|
|
5
|
+
function createEvaluationContext() {
|
|
6
|
+
return {
|
|
7
|
+
parameterBindings: new Map(),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/analysis/shared/utils.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getCallName = getCallName;
|
|
8
|
+
exports.getFunctionName = getFunctionName;
|
|
9
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
10
|
+
function getCallName(expression) {
|
|
11
|
+
//
|
|
12
|
+
// track()
|
|
13
|
+
//
|
|
14
|
+
if (typescript_1.default.isIdentifier(expression)) {
|
|
15
|
+
return expression.text;
|
|
16
|
+
}
|
|
17
|
+
//
|
|
18
|
+
// analytics.track()
|
|
19
|
+
//
|
|
20
|
+
if (typescript_1.default.isPropertyAccessExpression(expression)) {
|
|
21
|
+
return expression.name.text;
|
|
22
|
+
}
|
|
23
|
+
//
|
|
24
|
+
// analytics?.track()
|
|
25
|
+
//
|
|
26
|
+
if (typescript_1.default.isPropertyAccessChain(expression)) {
|
|
27
|
+
return expression.name.text;
|
|
28
|
+
}
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
function getFunctionName(node) {
|
|
32
|
+
//
|
|
33
|
+
// function foo()
|
|
34
|
+
//
|
|
35
|
+
if (typescript_1.default.isFunctionDeclaration(node)
|
|
36
|
+
&& node.name) {
|
|
37
|
+
return node.name.text;
|
|
38
|
+
}
|
|
39
|
+
//
|
|
40
|
+
// class method()
|
|
41
|
+
//
|
|
42
|
+
if (typescript_1.default.isMethodDeclaration(node)
|
|
43
|
+
&& typescript_1.default.isIdentifier(node.name)) {
|
|
44
|
+
return node.name.text;
|
|
45
|
+
}
|
|
46
|
+
//
|
|
47
|
+
// const foo = () => {}
|
|
48
|
+
//
|
|
49
|
+
const parent = node.parent;
|
|
50
|
+
if (typescript_1.default.isVariableDeclaration(parent)
|
|
51
|
+
&& typescript_1.default.isIdentifier(parent.name)) {
|
|
52
|
+
return parent.name.text;
|
|
53
|
+
}
|
|
54
|
+
//
|
|
55
|
+
// class field = () => {}
|
|
56
|
+
//
|
|
57
|
+
if (typescript_1.default.isPropertyDeclaration(parent)
|
|
58
|
+
&& typescript_1.default.isIdentifier(parent.name)) {
|
|
59
|
+
return parent.name.text;
|
|
60
|
+
}
|
|
61
|
+
return "anonymous";
|
|
62
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/analysis/symbols/symbolUtils.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getFunctionSymbol = getFunctionSymbol;
|
|
8
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
9
|
+
function getFunctionSymbol(node, checker) {
|
|
10
|
+
//
|
|
11
|
+
// function foo() {}
|
|
12
|
+
//
|
|
13
|
+
if (typescript_1.default.isFunctionDeclaration(node)
|
|
14
|
+
&& node.name) {
|
|
15
|
+
return checker.getSymbolAtLocation(node.name);
|
|
16
|
+
}
|
|
17
|
+
//
|
|
18
|
+
// class method() {}
|
|
19
|
+
//
|
|
20
|
+
if (typescript_1.default.isMethodDeclaration(node)
|
|
21
|
+
&& typescript_1.default.isIdentifier(node.name)) {
|
|
22
|
+
return checker.getSymbolAtLocation(node.name);
|
|
23
|
+
}
|
|
24
|
+
//
|
|
25
|
+
// object literal method
|
|
26
|
+
//
|
|
27
|
+
// const obj = {
|
|
28
|
+
// foo() {}
|
|
29
|
+
// }
|
|
30
|
+
//
|
|
31
|
+
if (typescript_1.default.isMethodDeclaration(node)
|
|
32
|
+
&& typescript_1.default.isComputedPropertyName(node.name)) {
|
|
33
|
+
return checker.getSymbolAtLocation(node.name.expression);
|
|
34
|
+
}
|
|
35
|
+
//
|
|
36
|
+
// const foo = () => {}
|
|
37
|
+
//
|
|
38
|
+
const parent = node.parent;
|
|
39
|
+
if (typescript_1.default.isVariableDeclaration(parent)
|
|
40
|
+
&& typescript_1.default.isIdentifier(parent.name)) {
|
|
41
|
+
return checker.getSymbolAtLocation(parent.name);
|
|
42
|
+
}
|
|
43
|
+
//
|
|
44
|
+
// class field = () => {}
|
|
45
|
+
//
|
|
46
|
+
if (typescript_1.default.isPropertyDeclaration(parent)
|
|
47
|
+
&& typescript_1.default.isIdentifier(parent.name)) {
|
|
48
|
+
return checker.getSymbolAtLocation(parent.name);
|
|
49
|
+
}
|
|
50
|
+
//
|
|
51
|
+
// object property
|
|
52
|
+
//
|
|
53
|
+
// const x = {
|
|
54
|
+
// foo: () => {}
|
|
55
|
+
// }
|
|
56
|
+
//
|
|
57
|
+
if (typescript_1.default.isPropertyAssignment(parent)
|
|
58
|
+
&& typescript_1.default.isIdentifier(parent.name)) {
|
|
59
|
+
return checker.getSymbolAtLocation(parent.name);
|
|
60
|
+
}
|
|
61
|
+
//
|
|
62
|
+
// export default function() {}
|
|
63
|
+
//
|
|
64
|
+
if (typescript_1.default.isExportAssignment(parent)) {
|
|
65
|
+
return checker.getSymbolAtLocation(node);
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
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.WrapperRegistry = void 0;
|
|
7
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
8
|
+
const exportResolver_1 = require("../resolver/exportResolver");
|
|
9
|
+
function isSymbol(value) {
|
|
10
|
+
return "flags" in value;
|
|
11
|
+
}
|
|
12
|
+
class WrapperRegistry {
|
|
13
|
+
wrappers = new WeakMap();
|
|
14
|
+
normalize(symbol, checker, exportCache) {
|
|
15
|
+
return ((0, exportResolver_1.resolveExportedSymbol)(symbol, checker, exportCache)
|
|
16
|
+
?? symbol);
|
|
17
|
+
}
|
|
18
|
+
set(semantic, checker, exportCache) {
|
|
19
|
+
this.wrappers.set(this.normalize(semantic.symbol, checker, exportCache), semantic);
|
|
20
|
+
}
|
|
21
|
+
get(target, checker, exportCache) {
|
|
22
|
+
if (isSymbol(target)) {
|
|
23
|
+
return this.wrappers.get(this.normalize(target, checker, exportCache));
|
|
24
|
+
}
|
|
25
|
+
let symbol;
|
|
26
|
+
if (typescript_1.default.isFunctionDeclaration(target)
|
|
27
|
+
&& target.name) {
|
|
28
|
+
symbol =
|
|
29
|
+
checker.getSymbolAtLocation(target.name);
|
|
30
|
+
}
|
|
31
|
+
else if (typescript_1.default.isMethodDeclaration(target)
|
|
32
|
+
&& typescript_1.default.isIdentifier(target.name)) {
|
|
33
|
+
symbol =
|
|
34
|
+
checker.getSymbolAtLocation(target.name);
|
|
35
|
+
}
|
|
36
|
+
else if (target.parent
|
|
37
|
+
&& typescript_1.default.isVariableDeclaration(target.parent)
|
|
38
|
+
&& typescript_1.default.isIdentifier(target.parent.name)) {
|
|
39
|
+
symbol =
|
|
40
|
+
checker.getSymbolAtLocation(target.parent.name);
|
|
41
|
+
}
|
|
42
|
+
if (!symbol) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return this.wrappers.get(this.normalize(symbol, checker, exportCache));
|
|
46
|
+
}
|
|
47
|
+
has(symbol, checker, exportCache) {
|
|
48
|
+
return this.wrappers.has(this.normalize(symbol, checker, exportCache));
|
|
49
|
+
}
|
|
50
|
+
clear() {
|
|
51
|
+
this.wrappers =
|
|
52
|
+
new WeakMap();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.WrapperRegistry = WrapperRegistry;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/commands/check.ts
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.check = check;
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const config_1 = require("../config/config");
|
|
43
|
+
const projectScanner_1 = require("../core/projectScanner");
|
|
44
|
+
async function check({ fix = false }) {
|
|
45
|
+
const config = await (0, config_1.loadConfig)();
|
|
46
|
+
if (!config) {
|
|
47
|
+
console.log(chalk_1.default.red("eventra.json not found"));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk_1.default.blue("Checking events..."));
|
|
51
|
+
const { engine } = await (0, projectScanner_1.scanProject)(config);
|
|
52
|
+
const found = new Set(engine.getAllEvents());
|
|
53
|
+
const known = new Set(config.events ?? []);
|
|
54
|
+
const added = [...found]
|
|
55
|
+
.filter(e => !known.has(e));
|
|
56
|
+
const removed = [...known]
|
|
57
|
+
.filter(e => !found.has(e));
|
|
58
|
+
if (fix) {
|
|
59
|
+
config.events =
|
|
60
|
+
[...found].sort();
|
|
61
|
+
const { saveConfig } = await Promise.resolve().then(() => __importStar(require("../config/config")));
|
|
62
|
+
await saveConfig(config);
|
|
63
|
+
console.log(chalk_1.default.green("Synced"));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (added.length
|
|
67
|
+
|| removed.length) {
|
|
68
|
+
added.forEach(e => console.log(chalk_1.default.red(`+ ${e}`)));
|
|
69
|
+
removed.forEach(e => console.log(chalk_1.default.yellow(`- ${e}`)));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
console.log(chalk_1.default.green("All good"));
|
|
73
|
+
}
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.init = init;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
|
-
const config_1 = require("../
|
|
9
|
+
const config_1 = require("../config/config");
|
|
10
10
|
async function init() {
|
|
11
11
|
console.log(chalk_1.default.blue("Initializing Eventra..."));
|
|
12
12
|
// API KEY ENDPOINT
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.send = send;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
|
-
const config_1 = require("../
|
|
9
|
+
const config_1 = require("../config/config");
|
|
10
10
|
const package_json_1 = __importDefault(require("../../package.json"));
|
|
11
11
|
const CLI_VERSION = package_json_1.default.version;
|
|
12
12
|
async function send() {
|
package/dist/cli/sync.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/commands/sync.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.sync = sync;
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const config_1 = require("../config/config");
|
|
10
|
+
const projectScanner_1 = require("../core/projectScanner");
|
|
11
|
+
async function sync() {
|
|
12
|
+
const config = await (0, config_1.loadConfig)();
|
|
13
|
+
if (!config) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
console.log(chalk_1.default.blue("Scanning..."));
|
|
17
|
+
const { engine, results, } = await (0, projectScanner_1.scanProject)(config);
|
|
18
|
+
const detectedFn = new Set();
|
|
19
|
+
const detectedCmp = new Map();
|
|
20
|
+
for (const result of results.values()) {
|
|
21
|
+
result
|
|
22
|
+
.detectedFunctionWrappers
|
|
23
|
+
.forEach(w => detectedFn.add(w));
|
|
24
|
+
result
|
|
25
|
+
.detectedComponentWrappers
|
|
26
|
+
.forEach((v, k) => detectedCmp.set(k, v));
|
|
27
|
+
}
|
|
28
|
+
const events = engine
|
|
29
|
+
.getAllEvents()
|
|
30
|
+
.sort();
|
|
31
|
+
config.events =
|
|
32
|
+
events;
|
|
33
|
+
config.functionWrappers =
|
|
34
|
+
mergeUnique(config.functionWrappers
|
|
35
|
+
?? [], [...detectedFn]
|
|
36
|
+
.map(name => ({
|
|
37
|
+
name
|
|
38
|
+
})), w => w.name);
|
|
39
|
+
config.wrappers =
|
|
40
|
+
mergeUnique(config.wrappers
|
|
41
|
+
?? [], [...detectedCmp.entries()]
|
|
42
|
+
.map(([name, prop]) => ({
|
|
43
|
+
name,
|
|
44
|
+
prop,
|
|
45
|
+
})), w => `${w.name}:${w.prop}`);
|
|
46
|
+
await (0, config_1.saveConfig)(config);
|
|
47
|
+
console.log(chalk_1.default.green(`Found ${events.length} events`));
|
|
48
|
+
}
|
|
49
|
+
function mergeUnique(a, b, key) {
|
|
50
|
+
const map = new Map();
|
|
51
|
+
[...b, ...a]
|
|
52
|
+
.forEach(item => map.set(key(item), item));
|
|
53
|
+
return [
|
|
54
|
+
...map.values()
|
|
55
|
+
];
|
|
56
|
+
}
|
|
@@ -9,20 +9,22 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
9
9
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
10
|
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
11
11
|
const path_1 = __importDefault(require("path"));
|
|
12
|
-
const config_1 = require("../
|
|
13
|
-
const
|
|
14
|
-
const processFile_1 = require("../
|
|
15
|
-
const getVirtualFile_1 = require("../
|
|
12
|
+
const config_1 = require("../config/config");
|
|
13
|
+
const EventraEngine_1 = require("../core/EventraEngine");
|
|
14
|
+
const processFile_1 = require("../filesystem/processFile");
|
|
15
|
+
const getVirtualFile_1 = require("../filesystem/getVirtualFile");
|
|
16
16
|
async function watch() {
|
|
17
17
|
const config = await (0, config_1.loadConfig)();
|
|
18
|
-
if (!config)
|
|
18
|
+
if (!config) {
|
|
19
19
|
return;
|
|
20
|
+
}
|
|
20
21
|
console.log(chalk_1.default.blue("Watching...\n"));
|
|
21
|
-
const engine = new
|
|
22
|
+
const engine = new EventraEngine_1.EventraEngine(process.cwd());
|
|
22
23
|
const fileDeps = new Map();
|
|
23
24
|
const cache = new Map();
|
|
24
25
|
const watchedDeps = new Set();
|
|
25
|
-
const normalize = (f) => path_1.default.resolve(f)
|
|
26
|
+
const normalize = (f) => path_1.default.resolve(f)
|
|
27
|
+
.replace(/\\/g, "/");
|
|
26
28
|
// INITIAL LOAD
|
|
27
29
|
const files = await (0, fast_glob_1.default)(config.sync.include, {
|
|
28
30
|
ignore: config.sync.exclude,
|
|
@@ -32,19 +34,26 @@ async function watch() {
|
|
|
32
34
|
try {
|
|
33
35
|
const abs = normalize(file);
|
|
34
36
|
const raw = await promises_1.default.readFile(abs, "utf-8");
|
|
35
|
-
const parsed = (0, processFile_1.processFile)(abs, raw);
|
|
37
|
+
const parsed = await (0, processFile_1.processFile)(abs, raw);
|
|
36
38
|
cache.set(abs, parsed);
|
|
37
|
-
engine.preloadFile((0, getVirtualFile_1.getVirtualFile)(abs), parsed.content);
|
|
38
|
-
engine.updateFile((0, getVirtualFile_1.getVirtualFile)(abs), parsed.content, config);
|
|
39
|
-
fileDeps.set(abs, new Set(parsed.
|
|
39
|
+
await engine.preloadFile((0, getVirtualFile_1.getVirtualFile)(abs), parsed.content);
|
|
40
|
+
await engine.updateFile((0, getVirtualFile_1.getVirtualFile)(abs), parsed.content, config);
|
|
41
|
+
fileDeps.set(abs, new Set(parsed.dependencies.map(d => normalize(d))));
|
|
40
42
|
}
|
|
41
43
|
catch { }
|
|
42
44
|
}
|
|
43
|
-
config.events =
|
|
45
|
+
config.events =
|
|
46
|
+
engine.getAllEvents()
|
|
47
|
+
.sort();
|
|
44
48
|
await (0, config_1.saveConfig)(config);
|
|
45
49
|
console.log(chalk_1.default.gray(`Initial: ${config.events.length}\n`));
|
|
46
50
|
// WATCHER
|
|
47
|
-
const watcher = chokidar_1.default.watch([
|
|
51
|
+
const watcher = chokidar_1.default.watch([
|
|
52
|
+
...files.map(normalize),
|
|
53
|
+
...watchedDeps,
|
|
54
|
+
], {
|
|
55
|
+
ignoreInitial: true
|
|
56
|
+
});
|
|
48
57
|
const queue = new Map();
|
|
49
58
|
let timer = null;
|
|
50
59
|
const run = async () => {
|
|
@@ -53,13 +62,14 @@ async function watch() {
|
|
|
53
62
|
for (const file of batch) {
|
|
54
63
|
try {
|
|
55
64
|
const raw = await promises_1.default.readFile(file, "utf-8");
|
|
56
|
-
const parsed = (0, processFile_1.processFile)(file, raw);
|
|
65
|
+
const parsed = await (0, processFile_1.processFile)(file, raw);
|
|
57
66
|
cache.set(file, parsed);
|
|
58
|
-
engine.updateFile((0, getVirtualFile_1.getVirtualFile)(file), parsed.content, config);
|
|
59
|
-
//dependency diff
|
|
67
|
+
await engine.updateFile((0, getVirtualFile_1.getVirtualFile)(file), parsed.content, config);
|
|
68
|
+
// dependency diff
|
|
60
69
|
const abs = normalize(file);
|
|
61
|
-
const prevDeps = fileDeps.get(abs)
|
|
62
|
-
|
|
70
|
+
const prevDeps = fileDeps.get(abs)
|
|
71
|
+
?? new Set();
|
|
72
|
+
const nextDeps = new Set(parsed.dependencies.map(d => normalize(d)));
|
|
63
73
|
// add new deps
|
|
64
74
|
for (const dep of nextDeps) {
|
|
65
75
|
if (!prevDeps.has(dep)) {
|
|
@@ -80,26 +90,32 @@ async function watch() {
|
|
|
80
90
|
console.log(chalk_1.default.gray(`skip: ${file}`));
|
|
81
91
|
}
|
|
82
92
|
}
|
|
83
|
-
const next = engine.getAllEvents()
|
|
84
|
-
|
|
93
|
+
const next = engine.getAllEvents()
|
|
94
|
+
.sort();
|
|
95
|
+
config.events =
|
|
96
|
+
next;
|
|
85
97
|
await (0, config_1.saveConfig)(config);
|
|
86
98
|
console.log(chalk_1.default.green(`Updated: ${next.length}`));
|
|
87
99
|
};
|
|
88
100
|
const schedule = (file) => {
|
|
89
101
|
const abs = normalize(file);
|
|
90
102
|
queue.set(abs, true);
|
|
91
|
-
if (timer)
|
|
103
|
+
if (timer) {
|
|
92
104
|
clearTimeout(timer);
|
|
93
|
-
|
|
105
|
+
}
|
|
106
|
+
timer =
|
|
107
|
+
setTimeout(run, 200);
|
|
94
108
|
};
|
|
95
109
|
watcher
|
|
96
110
|
.on("change", schedule)
|
|
97
111
|
.on("add", schedule)
|
|
98
112
|
.on("unlink", async (file) => {
|
|
99
113
|
const abs = normalize(file);
|
|
100
|
-
engine.removeFile((0, getVirtualFile_1.getVirtualFile)(abs), config);
|
|
101
|
-
const next = engine.getAllEvents()
|
|
102
|
-
|
|
114
|
+
await engine.removeFile((0, getVirtualFile_1.getVirtualFile)(abs), config);
|
|
115
|
+
const next = engine.getAllEvents()
|
|
116
|
+
.sort();
|
|
117
|
+
config.events =
|
|
118
|
+
next;
|
|
103
119
|
await (0, config_1.saveConfig)(config);
|
|
104
120
|
console.log(chalk_1.default.red(`Removed → ${next.length}`));
|
|
105
121
|
});
|