@eventra_dev/eventra-cli 0.2.4 → 0.3.1

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.
Files changed (89) hide show
  1. package/README.md +154 -32
  2. package/dist/analysis/cache/evaluationCache.js +21 -0
  3. package/dist/analysis/cache/resolvedCallCache.js +21 -0
  4. package/dist/analysis/cache/resolvedExportCache.js +21 -0
  5. package/dist/analysis/cache/semanticDependencyGraph.js +25 -0
  6. package/dist/analysis/cache/symbolInvalidation.js +20 -0
  7. package/dist/analysis/extractor/extractor.js +47 -0
  8. package/dist/analysis/extractor/propagationExtractor.js +52 -0
  9. package/dist/analysis/pipeline/semanticPass.js +2 -0
  10. package/dist/analysis/resolver/callResolver.js +125 -0
  11. package/dist/analysis/resolver/exportResolver.js +75 -0
  12. package/dist/analysis/resolver/resolver.js +133 -0
  13. package/dist/analysis/scanner/analyzer/propagationAnalyzer.js +193 -0
  14. package/dist/analysis/scanner/analyzer/returnPropagationAnalyzer.js +105 -0
  15. package/dist/analysis/scanner/scanner.js +117 -0
  16. package/dist/analysis/scanner/sinkDetector.js +91 -0
  17. package/dist/analysis/shared/evaluationContext.js +9 -0
  18. package/dist/analysis/shared/propagation.js +3 -0
  19. package/dist/analysis/shared/returnPropagation.js +2 -0
  20. package/dist/analysis/shared/types.js +2 -0
  21. package/dist/analysis/shared/utils.js +62 -0
  22. package/dist/analysis/symbols/symbolUtils.js +68 -0
  23. package/dist/analysis/symbols/wrapperRegistry.js +55 -0
  24. package/dist/cli/check.js +73 -0
  25. package/dist/{commands → cli}/init.js +1 -1
  26. package/dist/{commands → cli}/send.js +1 -1
  27. package/dist/cli/sync.js +56 -0
  28. package/dist/{commands → cli}/watch.js +41 -25
  29. package/dist/compiler/compilerContext.js +204 -0
  30. package/dist/compiler/documentRegistry.js +78 -0
  31. package/dist/compiler/importGraph.js +83 -0
  32. package/dist/compiler/scheduler.js +29 -0
  33. package/dist/core/EventraEngine.js +234 -0
  34. package/dist/core/projectScanner.js +73 -0
  35. package/dist/{utils → filesystem}/getVirtualFile.js +1 -3
  36. package/dist/filesystem/processFile.js +38 -0
  37. package/dist/index.js +5 -5
  38. package/dist/shared/buildSyntheticTsx.js +20 -0
  39. package/dist/shared/templateExpressionExtractor.js +22 -0
  40. package/package.json +32 -9
  41. package/.github/workflows/release.yml +0 -43
  42. package/ARCHITECTURE.md +0 -88
  43. package/assets/eventra-icon-animated.svg +0 -19
  44. package/dist/commands/check.js +0 -78
  45. package/dist/commands/sync.js +0 -79
  46. package/dist/engine/boundary.js +0 -14
  47. package/dist/engine/callResolver.js +0 -58
  48. package/dist/engine/engine.js +0 -154
  49. package/dist/engine/exportResolver.js +0 -46
  50. package/dist/engine/functionAnalyzer.js +0 -71
  51. package/dist/engine/graph.js +0 -168
  52. package/dist/engine/languageService.js +0 -152
  53. package/dist/engine/resolver.js +0 -149
  54. package/dist/engine/scanner.js +0 -230
  55. package/dist/utils/processFile.js +0 -28
  56. package/dist/utils/universal.js +0 -190
  57. package/src/commands/check.ts +0 -91
  58. package/src/commands/init.ts +0 -174
  59. package/src/commands/send.ts +0 -213
  60. package/src/commands/sync.ts +0 -106
  61. package/src/commands/watch.ts +0 -144
  62. package/src/engine/boundary.ts +0 -12
  63. package/src/engine/callResolver.ts +0 -65
  64. package/src/engine/engine.ts +0 -227
  65. package/src/engine/exportResolver.ts +0 -56
  66. package/src/engine/functionAnalyzer.ts +0 -81
  67. package/src/engine/graph.ts +0 -193
  68. package/src/engine/hash.ts +0 -5
  69. package/src/engine/languageService.ts +0 -197
  70. package/src/engine/resolver.ts +0 -177
  71. package/src/engine/scanner.ts +0 -298
  72. package/src/index.ts +0 -49
  73. package/src/types.ts +0 -35
  74. package/src/utils/config.ts +0 -53
  75. package/src/utils/getVirtualFile.ts +0 -5
  76. package/src/utils/processFile.ts +0 -29
  77. package/src/utils/universal.ts +0 -249
  78. package/tests/fixtures/backend/express/app.ts +0 -233
  79. package/tests/fixtures/backend/nest/service.ts +0 -70
  80. package/tests/fixtures/backend/node/index.ts +0 -63
  81. package/tests/fixtures/frontend/next/page.tsx +0 -101
  82. package/tests/fixtures/frontend/react/App.tsx +0 -104
  83. package/tests/fixtures/frontend/vue/App.vue +0 -83
  84. package/tests/fixtures/wrappers/component/test.tsx +0 -62
  85. package/tests/fixtures/wrappers/function/test.ts +0 -60
  86. package/tests/run.ts +0 -106
  87. package/tsconfig.json +0 -14
  88. /package/dist/{utils → config}/config.js +0 -0
  89. /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,3 @@
1
+ "use strict";
2
+ // src/analysis/shared/propagation.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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("../utils/config");
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("../utils/config");
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() {
@@ -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("../utils/config");
13
- const engine_1 = require("../engine/engine");
14
- const processFile_1 = require("../utils/processFile");
15
- const getVirtualFile_1 = require("../utils/getVirtualFile");
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 engine_1.EventraEngine(process.cwd());
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).replace(/\\/g, "/");
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.deps.map(d => normalize(d))));
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 = engine.getAllEvents().sort();
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([...files.map(normalize), ...watchedDeps], { ignoreInitial: true });
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) ?? new Set();
62
- const nextDeps = new Set(parsed.deps.map(d => normalize(d)));
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().sort();
84
- config.events = next;
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
- timer = setTimeout(run, 200);
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().sort();
102
- config.events = next;
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
  });