@mmnto/totem 0.32.0 → 0.33.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/index.d.ts CHANGED
@@ -14,6 +14,7 @@ export { detectDrift, extractFileReferences, parseLessonsFile, rewriteLessonsFil
14
14
  export { lessonFileName, readAllLessons, writeLessonFile, writeLessonFileAsync, } from './lesson-io.js';
15
15
  export type { AstContext, CompiledRule, CompiledRulesFile, CompilerOutput, DiffAddition, Violation, } from './compiler.js';
16
16
  export { applyRules, applyRulesToAdditions, CompiledRuleSchema, CompiledRulesFileSchema, CompilerOutputSchema, extractAddedLines, hashLesson, loadCompiledRules, matchesGlob, parseCompilerResponse, type RegexValidation, saveCompiledRules, validateRegex, } from './compiler.js';
17
+ export { loadFixtures, parseFixture, type RuleTestFixture, type RuleTestResult, type RuleTestSummary, runRuleTests, testRule, } from './rule-tester.js';
17
18
  export type { SupportedLanguage } from './ast-classifier.js';
18
19
  export { classifyLines, extensionToLanguage } from './ast-classifier.js';
19
20
  export type { AstGateOptions } from './ast-gate.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,6 +9,8 @@ export { detectDrift, extractFileReferences, parseLessonsFile, rewriteLessonsFil
9
9
  // Lesson I/O (directory-based)
10
10
  export { lessonFileName, readAllLessons, writeLessonFile, writeLessonFileAsync, } from './lesson-io.js';
11
11
  export { applyRules, applyRulesToAdditions, CompiledRuleSchema, CompiledRulesFileSchema, CompilerOutputSchema, extractAddedLines, hashLesson, loadCompiledRules, matchesGlob, parseCompilerResponse, saveCompiledRules, validateRegex, } from './compiler.js';
12
+ // Rule testing
13
+ export { loadFixtures, parseFixture, runRuleTests, testRule, } from './rule-tester.js';
12
14
  export { classifyLines, extensionToLanguage } from './ast-classifier.js';
13
15
  export { enrichWithAstContext } from './ast-gate.js';
14
16
  // Exporter
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAItF,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EAErB,iBAAiB,EACjB,aAAa,GACd,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,WAAW;AACX,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAItF,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EAErB,iBAAiB,EACjB,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,eAAe;AACf,OAAO,EACL,YAAY,EACZ,YAAY,EAIZ,YAAY,EACZ,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,WAAW;AACX,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { CompiledRule } from './compiler.js';
2
+ export interface RuleTestFixture {
3
+ /** lessonHash of the rule to test */
4
+ ruleHash: string;
5
+ /** Virtual file path for glob matching (e.g., "src/example.ts") */
6
+ filePath: string;
7
+ /** Lines that SHOULD trigger the rule */
8
+ failLines: string[];
9
+ /** Lines that should NOT trigger the rule */
10
+ passLines: string[];
11
+ /** Source file path of the fixture */
12
+ fixturePath: string;
13
+ }
14
+ export interface RuleTestResult {
15
+ ruleHash: string;
16
+ ruleHeading: string;
17
+ fixturePath: string;
18
+ /** Lines from fail section that did NOT trigger (false negatives) */
19
+ missedFails: string[];
20
+ /** Lines from pass section that DID trigger (false positives) */
21
+ falsePositives: string[];
22
+ /** Whether the test passed (no missed fails AND no false positives) */
23
+ passed: boolean;
24
+ }
25
+ export interface RuleTestSummary {
26
+ total: number;
27
+ passed: number;
28
+ failed: number;
29
+ results: RuleTestResult[];
30
+ }
31
+ export declare function parseFixture(content: string, fixturePath: string): RuleTestFixture | null;
32
+ export declare function testRule(rule: CompiledRule, fixture: RuleTestFixture): RuleTestResult;
33
+ export declare function loadFixtures(testsDir: string): RuleTestFixture[];
34
+ export declare function runRuleTests(rulesPath: string, testsDir: string): RuleTestSummary;
35
+ //# sourceMappingURL=rule-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-tester.d.ts","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAKhE,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iEAAiE;IACjE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AASD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAoBzF;AAaD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,cAAc,CA8BrF;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAchE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAmCjF"}
@@ -0,0 +1,109 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { applyRulesToAdditions, loadCompiledRules } from './compiler.js';
4
+ // ─── Fixture parsing ─────────────────────────────────
5
+ const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---/;
6
+ const FAIL_SECTION_RE = /##\s*[Ss]hould\s+fail\s*\n+```[^\n]*\n([\s\S]*?)```/;
7
+ const PASS_SECTION_RE = /##\s*[Ss]hould\s+pass\s*\n+```[^\n]*\n([\s\S]*?)```/;
8
+ // totem-ignore-next-line — .exec() calls below are for trusted local fixture parsing, not security-sensitive
9
+ export function parseFixture(content, fixturePath) {
10
+ const frontmatter = FRONTMATTER_RE.exec(content); // totem-ignore
11
+ if (!frontmatter)
12
+ return null;
13
+ const meta = frontmatter[1];
14
+ const ruleMatch = /rule:\s*(.+)/.exec(meta); // totem-ignore
15
+ const fileMatch = /file:\s*(.+)/.exec(meta); // totem-ignore
16
+ if (!ruleMatch)
17
+ return null;
18
+ const ruleHash = ruleMatch[1].trim();
19
+ const filePath = fileMatch ? fileMatch[1].trim() : 'src/example.ts'; // totem-ignore — default fixture path
20
+ const failMatch = FAIL_SECTION_RE.exec(content); // totem-ignore
21
+ const passMatch = PASS_SECTION_RE.exec(content); // totem-ignore
22
+ const failLines = failMatch ? failMatch[1].split('\n').filter((l) => l.trim().length > 0) : [];
23
+ const passLines = passMatch ? passMatch[1].split('\n').filter((l) => l.trim().length > 0) : [];
24
+ return { ruleHash, filePath, failLines, passLines, fixturePath };
25
+ }
26
+ // ─── Test execution ──────────────────────────────────
27
+ function linesToAdditions(lines, filePath) {
28
+ return lines.map((line, i) => ({
29
+ file: filePath,
30
+ line,
31
+ lineNumber: i + 1,
32
+ precedingLine: i > 0 ? lines[i - 1] : null,
33
+ }));
34
+ }
35
+ export function testRule(rule, fixture) {
36
+ const result = {
37
+ ruleHash: rule.lessonHash,
38
+ ruleHeading: rule.lessonHeading,
39
+ fixturePath: fixture.fixturePath,
40
+ missedFails: [],
41
+ falsePositives: [],
42
+ passed: true,
43
+ };
44
+ // Test fail lines — each should produce at least one violation
45
+ for (const line of fixture.failLines) {
46
+ const additions = linesToAdditions([line], fixture.filePath);
47
+ const violations = applyRulesToAdditions([rule], additions);
48
+ if (violations.length === 0) {
49
+ result.missedFails.push(line);
50
+ }
51
+ }
52
+ // Test pass lines — none should produce violations
53
+ for (const line of fixture.passLines) {
54
+ const additions = linesToAdditions([line], fixture.filePath);
55
+ const violations = applyRulesToAdditions([rule], additions);
56
+ if (violations.length > 0) {
57
+ result.falsePositives.push(line);
58
+ }
59
+ }
60
+ result.passed = result.missedFails.length === 0 && result.falsePositives.length === 0;
61
+ return result;
62
+ }
63
+ // ─── Runner ──────────────────────────────────────────
64
+ export function loadFixtures(testsDir) {
65
+ if (!fs.existsSync(testsDir))
66
+ return [];
67
+ const files = fs.readdirSync(testsDir).filter((f) => f.endsWith('.md'));
68
+ const fixtures = [];
69
+ for (const file of files) {
70
+ const filePath = path.join(testsDir, file);
71
+ const content = fs.readFileSync(filePath, 'utf-8');
72
+ const fixture = parseFixture(content, filePath);
73
+ if (fixture)
74
+ fixtures.push(fixture);
75
+ }
76
+ return fixtures;
77
+ }
78
+ export function runRuleTests(rulesPath, testsDir) {
79
+ const rules = loadCompiledRules(rulesPath);
80
+ const fixtures = loadFixtures(testsDir);
81
+ if (fixtures.length === 0) {
82
+ return { total: 0, passed: 0, failed: 0, results: [] };
83
+ }
84
+ const ruleMap = new Map(rules.map((r) => [r.lessonHash, r]));
85
+ const results = [];
86
+ for (const fixture of fixtures) {
87
+ const rule = ruleMap.get(fixture.ruleHash);
88
+ if (!rule) {
89
+ results.push({
90
+ ruleHash: fixture.ruleHash,
91
+ ruleHeading: `(unknown — hash ${fixture.ruleHash} not found in compiled rules)`,
92
+ fixturePath: fixture.fixturePath,
93
+ missedFails: fixture.failLines,
94
+ falsePositives: [],
95
+ passed: false,
96
+ });
97
+ continue;
98
+ }
99
+ results.push(testRule(rule, fixture));
100
+ }
101
+ const passed = results.filter((r) => r.passed).length;
102
+ return {
103
+ total: results.length,
104
+ passed,
105
+ failed: results.length - passed,
106
+ results,
107
+ };
108
+ }
109
+ //# sourceMappingURL=rule-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-tester.js","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rule-tester.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-tester.test.d.ts","sourceRoot":"","sources":["../src/rule-tester.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parseFixture, testRule } from './rule-tester.js';
3
+ const MOCK_RULE = {
4
+ lessonHash: 'abc123',
5
+ lessonHeading: 'Never use eval()',
6
+ pattern: '\\beval\\s*\\(',
7
+ message: 'Do not use eval() — it is a security risk.',
8
+ engine: 'regex',
9
+ compiledAt: '2026-01-01T00:00:00Z',
10
+ };
11
+ describe('parseFixture', () => {
12
+ it('parses a valid fixture with frontmatter and code blocks', () => {
13
+ const content = `---
14
+ rule: abc123
15
+ file: src/app.ts
16
+ ---
17
+
18
+ ## Should fail
19
+
20
+ \`\`\`ts
21
+ const result = eval('1 + 1');
22
+ \`\`\`
23
+
24
+ ## Should pass
25
+
26
+ \`\`\`ts
27
+ const result = safeEval('1 + 1');
28
+ \`\`\`
29
+ `;
30
+ const fixture = parseFixture(content, 'test.md');
31
+ expect(fixture).not.toBeNull();
32
+ expect(fixture.ruleHash).toBe('abc123');
33
+ expect(fixture.filePath).toBe('src/app.ts');
34
+ expect(fixture.failLines).toHaveLength(1);
35
+ expect(fixture.passLines).toHaveLength(1);
36
+ });
37
+ it('defaults filePath to src/example.ts when not specified', () => {
38
+ const content = `---
39
+ rule: abc123
40
+ ---
41
+
42
+ ## Should fail
43
+
44
+ \`\`\`ts
45
+ eval('code');
46
+ \`\`\`
47
+ `;
48
+ const fixture = parseFixture(content, 'test.md');
49
+ expect(fixture.filePath).toBe('src/example.ts');
50
+ });
51
+ it('returns null for missing frontmatter', () => {
52
+ const fixture = parseFixture('no frontmatter here', 'test.md');
53
+ expect(fixture).toBeNull();
54
+ });
55
+ it('returns null for missing rule hash', () => {
56
+ const content = `---
57
+ file: src/app.ts
58
+ ---
59
+
60
+ ## Should fail
61
+ `;
62
+ const fixture = parseFixture(content, 'test.md');
63
+ expect(fixture).toBeNull();
64
+ });
65
+ });
66
+ describe('testRule', () => {
67
+ it('passes when fail lines trigger and pass lines do not', () => {
68
+ const result = testRule(MOCK_RULE, {
69
+ ruleHash: 'abc123',
70
+ filePath: 'src/app.ts',
71
+ failLines: ["const x = eval('code');"],
72
+ passLines: ['const x = safeEval(code);'],
73
+ fixturePath: 'test.md',
74
+ });
75
+ expect(result.passed).toBe(true);
76
+ expect(result.missedFails).toHaveLength(0);
77
+ expect(result.falsePositives).toHaveLength(0);
78
+ });
79
+ it('fails when a fail line does not trigger the rule', () => {
80
+ const result = testRule(MOCK_RULE, {
81
+ ruleHash: 'abc123',
82
+ filePath: 'src/app.ts',
83
+ failLines: ['const x = safeEval(code);'], // should not match
84
+ passLines: [],
85
+ fixturePath: 'test.md',
86
+ });
87
+ expect(result.passed).toBe(false);
88
+ expect(result.missedFails).toHaveLength(1);
89
+ });
90
+ it('fails when a pass line triggers the rule (false positive)', () => {
91
+ const result = testRule(MOCK_RULE, {
92
+ ruleHash: 'abc123',
93
+ filePath: 'src/app.ts',
94
+ failLines: [],
95
+ passLines: ["const x = eval('code');"], // should not pass
96
+ fixturePath: 'test.md',
97
+ });
98
+ expect(result.passed).toBe(false);
99
+ expect(result.falsePositives).toHaveLength(1);
100
+ });
101
+ it('respects fileGlobs — rule does not fire on non-matching files', () => {
102
+ const ruleWithGlobs = {
103
+ ...MOCK_RULE,
104
+ fileGlobs: ['*.py'],
105
+ };
106
+ const result = testRule(ruleWithGlobs, {
107
+ ruleHash: 'abc123',
108
+ filePath: 'src/app.ts', // not a .py file
109
+ failLines: ["eval('code');"],
110
+ passLines: [],
111
+ fixturePath: 'test.md',
112
+ });
113
+ // The fail line won't trigger because fileGlobs doesn't match .ts
114
+ expect(result.passed).toBe(false);
115
+ expect(result.missedFails).toHaveLength(1);
116
+ });
117
+ });
118
+ //# sourceMappingURL=rule-tester.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-tester.test.js","sourceRoot":"","sources":["../src/rule-tester.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/totem",
3
- "version": "0.32.0",
3
+ "version": "0.33.0",
4
4
  "description": "Persistent memory and context layer for AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",