@levu/snap 0.1.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/.github/workflows/ci.yml +26 -0
- package/README.md +49 -0
- package/dist/cli/help-command.d.ts +1 -0
- package/dist/cli/help-command.js +1 -0
- package/dist/cli-entry.d.ts +1 -0
- package/dist/cli-entry.js +80 -0
- package/dist/core/contracts/action-contract.d.ts +25 -0
- package/dist/core/contracts/action-contract.js +1 -0
- package/dist/core/contracts/help-contract.d.ts +18 -0
- package/dist/core/contracts/help-contract.js +1 -0
- package/dist/core/contracts/module-contract.d.ts +6 -0
- package/dist/core/contracts/module-contract.js +1 -0
- package/dist/core/errors/framework-errors.d.ts +19 -0
- package/dist/core/errors/framework-errors.js +26 -0
- package/dist/core/registry/action-registry.d.ts +16 -0
- package/dist/core/registry/action-registry.js +52 -0
- package/dist/help/help-command.d.ts +8 -0
- package/dist/help/help-command.js +21 -0
- package/dist/help/help-model.d.ts +9 -0
- package/dist/help/help-model.js +1 -0
- package/dist/help/help-renderer.d.ts +2 -0
- package/dist/help/help-renderer.js +16 -0
- package/dist/help/hierarchy-resolver.d.ts +3 -0
- package/dist/help/hierarchy-resolver.js +43 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -0
- package/dist/modules/sample-content/module.d.ts +3 -0
- package/dist/modules/sample-content/module.js +61 -0
- package/dist/modules/sample-system/module.d.ts +3 -0
- package/dist/modules/sample-system/module.js +71 -0
- package/dist/runtime/dispatch.d.ts +11 -0
- package/dist/runtime/dispatch.js +47 -0
- package/dist/runtime/engine.d.ts +13 -0
- package/dist/runtime/engine.js +44 -0
- package/dist/runtime/mode-resolver.d.ts +8 -0
- package/dist/runtime/mode-resolver.js +8 -0
- package/dist/runtime/resume-store.d.ts +13 -0
- package/dist/runtime/resume-store.js +45 -0
- package/dist/runtime/runtime-context.d.ts +9 -0
- package/dist/runtime/runtime-context.js +1 -0
- package/dist/runtime/state-machine.d.ts +32 -0
- package/dist/runtime/state-machine.js +50 -0
- package/dist/src/cli/help-command.d.ts +1 -0
- package/dist/src/cli/help-command.js +1 -0
- package/dist/src/cli-entry.d.ts +1 -0
- package/dist/src/cli-entry.js +80 -0
- package/dist/src/core/contracts/action-contract.d.ts +25 -0
- package/dist/src/core/contracts/action-contract.js +1 -0
- package/dist/src/core/contracts/help-contract.d.ts +18 -0
- package/dist/src/core/contracts/help-contract.js +1 -0
- package/dist/src/core/contracts/module-contract.d.ts +6 -0
- package/dist/src/core/contracts/module-contract.js +1 -0
- package/dist/src/core/errors/framework-errors.d.ts +19 -0
- package/dist/src/core/errors/framework-errors.js +26 -0
- package/dist/src/core/registry/action-registry.d.ts +16 -0
- package/dist/src/core/registry/action-registry.js +52 -0
- package/dist/src/help/help-command.d.ts +8 -0
- package/dist/src/help/help-command.js +21 -0
- package/dist/src/help/help-model.d.ts +9 -0
- package/dist/src/help/help-model.js +1 -0
- package/dist/src/help/help-renderer.d.ts +2 -0
- package/dist/src/help/help-renderer.js +16 -0
- package/dist/src/help/hierarchy-resolver.d.ts +3 -0
- package/dist/src/help/hierarchy-resolver.js +43 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +8 -0
- package/dist/src/modules/sample-content/module.d.ts +3 -0
- package/dist/src/modules/sample-content/module.js +61 -0
- package/dist/src/modules/sample-system/module.d.ts +3 -0
- package/dist/src/modules/sample-system/module.js +71 -0
- package/dist/src/runtime/dispatch.d.ts +11 -0
- package/dist/src/runtime/dispatch.js +47 -0
- package/dist/src/runtime/engine.d.ts +13 -0
- package/dist/src/runtime/engine.js +44 -0
- package/dist/src/runtime/mode-resolver.d.ts +8 -0
- package/dist/src/runtime/mode-resolver.js +8 -0
- package/dist/src/runtime/resume-store.d.ts +13 -0
- package/dist/src/runtime/resume-store.js +45 -0
- package/dist/src/runtime/runtime-context.d.ts +9 -0
- package/dist/src/runtime/runtime-context.js +1 -0
- package/dist/src/runtime/state-machine.d.ts +32 -0
- package/dist/src/runtime/state-machine.js +50 -0
- package/dist/src/tui/accessibility-footer.d.ts +7 -0
- package/dist/src/tui/accessibility-footer.js +4 -0
- package/dist/src/tui/component-adapters/confirm.d.ts +5 -0
- package/dist/src/tui/component-adapters/confirm.js +3 -0
- package/dist/src/tui/component-adapters/group.d.ts +5 -0
- package/dist/src/tui/component-adapters/group.js +7 -0
- package/dist/src/tui/component-adapters/multiselect.d.ts +10 -0
- package/dist/src/tui/component-adapters/multiselect.js +9 -0
- package/dist/src/tui/component-adapters/select.d.ts +10 -0
- package/dist/src/tui/component-adapters/select.js +7 -0
- package/dist/src/tui/component-adapters/text.d.ts +6 -0
- package/dist/src/tui/component-adapters/text.js +7 -0
- package/dist/src/tui/interrupt-handlers.d.ts +7 -0
- package/dist/src/tui/interrupt-handlers.js +7 -0
- package/dist/tests/e2e/cli-smoke.e2e.test.d.ts +1 -0
- package/dist/tests/e2e/cli-smoke.e2e.test.js +16 -0
- package/dist/tests/integration/runtime-dispatch.integration.test.d.ts +1 -0
- package/dist/tests/integration/runtime-dispatch.integration.test.js +20 -0
- package/dist/tests/transcript/help.transcript.test.d.ts +1 -0
- package/dist/tests/transcript/help.transcript.test.js +18 -0
- package/dist/tests/unit/state-machine.test.d.ts +1 -0
- package/dist/tests/unit/state-machine.test.js +20 -0
- package/dist/tui/accessibility-footer.d.ts +7 -0
- package/dist/tui/accessibility-footer.js +4 -0
- package/dist/tui/component-adapters/confirm.d.ts +5 -0
- package/dist/tui/component-adapters/confirm.js +3 -0
- package/dist/tui/component-adapters/group.d.ts +5 -0
- package/dist/tui/component-adapters/group.js +7 -0
- package/dist/tui/component-adapters/multiselect.d.ts +10 -0
- package/dist/tui/component-adapters/multiselect.js +9 -0
- package/dist/tui/component-adapters/select.d.ts +10 -0
- package/dist/tui/component-adapters/select.js +7 -0
- package/dist/tui/component-adapters/text.d.ts +6 -0
- package/dist/tui/component-adapters/text.js +7 -0
- package/dist/tui/interrupt-handlers.d.ts +7 -0
- package/dist/tui/interrupt-handlers.js +7 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +7 -0
- package/docs/help-contract-spec.md +29 -0
- package/docs/module-authoring-guide.md +52 -0
- package/package.json +20 -0
- package/plans/260209-1547-hub-dual-runtime-framework/phase-01-foundation-and-contracts.md +71 -0
- package/plans/260209-1547-hub-dual-runtime-framework/phase-02-runtime-and-state-machine.md +76 -0
- package/plans/260209-1547-hub-dual-runtime-framework/phase-03-tui-components-and-policies.md +71 -0
- package/plans/260209-1547-hub-dual-runtime-framework/phase-04-help-system-and-ai-readability.md +69 -0
- package/plans/260209-1547-hub-dual-runtime-framework/phase-05-testing-and-quality-gates.md +79 -0
- package/plans/260209-1547-hub-dual-runtime-framework/phase-06-sample-modules-and-adoption.md +75 -0
- package/plans/260209-1547-hub-dual-runtime-framework/plan.md +105 -0
- package/plans/260209-1547-hub-dual-runtime-framework/reports/planner-report.md +27 -0
- package/plans/260209-1547-hub-dual-runtime-framework/research/researcher-01-report.md +166 -0
- package/plans/260209-1547-hub-dual-runtime-framework/research/researcher-02-report.md +87 -0
- package/plans/260209-1547-hub-dual-runtime-framework/scout/scout-01-report.md +24 -0
- package/src/cli/help-command.ts +1 -0
- package/src/cli-entry.ts +83 -0
- package/src/core/contracts/action-contract.ts +30 -0
- package/src/core/contracts/help-contract.ts +20 -0
- package/src/core/contracts/module-contract.ts +7 -0
- package/src/core/errors/framework-errors.ts +26 -0
- package/src/core/registry/action-registry.ts +94 -0
- package/src/help/help-command.ts +32 -0
- package/src/help/help-model.ts +10 -0
- package/src/help/help-renderer.ts +21 -0
- package/src/help/hierarchy-resolver.ts +54 -0
- package/src/index.ts +10 -0
- package/src/modules/sample-content/module.ts +66 -0
- package/src/modules/sample-system/module.ts +74 -0
- package/src/runtime/dispatch.ts +64 -0
- package/src/runtime/engine.ts +59 -0
- package/src/runtime/mode-resolver.ts +18 -0
- package/src/runtime/resume-store.ts +53 -0
- package/src/runtime/runtime-context.ts +10 -0
- package/src/runtime/state-machine.ts +77 -0
- package/src/tui/accessibility-footer.ts +11 -0
- package/src/tui/component-adapters/confirm.ts +8 -0
- package/src/tui/component-adapters/group.ts +12 -0
- package/src/tui/component-adapters/multiselect.ts +22 -0
- package/src/tui/component-adapters/select.ts +18 -0
- package/src/tui/component-adapters/text.ts +13 -0
- package/src/tui/interrupt-handlers.ts +15 -0
- package/tests/e2e/cli-smoke.e2e.test.ts +19 -0
- package/tests/integration/runtime-dispatch.integration.test.ts +23 -0
- package/tests/transcript/help.transcript.test.ts +20 -0
- package/tests/unit/state-machine.test.ts +22 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type StateTransitionType = 'next' | 'back' | 'jump' | 'exit';
|
|
2
|
+
|
|
3
|
+
export interface WorkflowNode {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface WorkflowCheckpoint {
|
|
9
|
+
workflowId: string;
|
|
10
|
+
nodeId: string;
|
|
11
|
+
cursor: number;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface StateTransition {
|
|
16
|
+
type: StateTransitionType;
|
|
17
|
+
targetNodeId?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface StateMachineSnapshot {
|
|
21
|
+
workflowId: string;
|
|
22
|
+
nodes: WorkflowNode[];
|
|
23
|
+
cursor: number;
|
|
24
|
+
exited: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class StateMachine {
|
|
28
|
+
private cursor = 0;
|
|
29
|
+
private exited = false;
|
|
30
|
+
|
|
31
|
+
constructor(
|
|
32
|
+
private readonly workflowId: string,
|
|
33
|
+
private readonly nodes: WorkflowNode[],
|
|
34
|
+
initialNodeId?: string
|
|
35
|
+
) {
|
|
36
|
+
if (initialNodeId) {
|
|
37
|
+
const index = nodes.findIndex((node) => node.id === initialNodeId);
|
|
38
|
+
if (index >= 0) this.cursor = index;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
transition(transition: StateTransition): StateMachineSnapshot {
|
|
43
|
+
if (this.exited) return this.snapshot();
|
|
44
|
+
|
|
45
|
+
if (transition.type === 'next') this.cursor = Math.min(this.cursor + 1, this.nodes.length - 1);
|
|
46
|
+
if (transition.type === 'back') this.cursor = Math.max(this.cursor - 1, 0);
|
|
47
|
+
if (transition.type === 'jump' && transition.targetNodeId) {
|
|
48
|
+
const index = this.nodes.findIndex((node) => node.id === transition.targetNodeId);
|
|
49
|
+
if (index >= 0) this.cursor = index;
|
|
50
|
+
}
|
|
51
|
+
if (transition.type === 'exit') this.exited = true;
|
|
52
|
+
|
|
53
|
+
return this.snapshot();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
currentNode(): WorkflowNode {
|
|
57
|
+
return this.nodes[this.cursor];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
checkpoint(): WorkflowCheckpoint {
|
|
61
|
+
return {
|
|
62
|
+
workflowId: this.workflowId,
|
|
63
|
+
nodeId: this.currentNode().id,
|
|
64
|
+
cursor: this.cursor,
|
|
65
|
+
timestamp: new Date().toISOString()
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
snapshot(): StateMachineSnapshot {
|
|
70
|
+
return {
|
|
71
|
+
workflowId: this.workflowId,
|
|
72
|
+
nodes: this.nodes,
|
|
73
|
+
cursor: this.cursor,
|
|
74
|
+
exited: this.exited
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface AccessibilityFooterInput {
|
|
2
|
+
moduleId: string;
|
|
3
|
+
actionId: string;
|
|
4
|
+
nodeId: string;
|
|
5
|
+
keybindings: string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const renderAccessibilityFooter = (input: AccessibilityFooterInput): string => {
|
|
9
|
+
const keys = input.keybindings.join(' | ');
|
|
10
|
+
return `[ctx module=${input.moduleId} action=${input.actionId} node=${input.nodeId}] [keys ${keys}]`;
|
|
11
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface GroupStep<T = unknown> {
|
|
2
|
+
key: string;
|
|
3
|
+
run: () => Promise<T>;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export const runGroupPrompt = async <T = unknown>(steps: GroupStep<T>[]): Promise<Record<string, T>> => {
|
|
7
|
+
const result: Record<string, T> = {};
|
|
8
|
+
for (const step of steps) {
|
|
9
|
+
result[step.key] = await step.run();
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface MultiSelectOption {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface MultiSelectPromptInput {
|
|
7
|
+
message: string;
|
|
8
|
+
options: MultiSelectOption[];
|
|
9
|
+
initialValues?: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const runMultiSelectPrompt = async (input: MultiSelectPromptInput): Promise<string[]> => {
|
|
13
|
+
if (input.options.length === 0) {
|
|
14
|
+
throw new Error(`No options available for multiselect prompt: ${input.message}`);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (input.initialValues && input.initialValues.length > 0) {
|
|
18
|
+
return input.initialValues.filter((value) => input.options.some((option) => option.value === value));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return [input.options[0].value];
|
|
22
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SelectOption {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface SelectPromptInput {
|
|
7
|
+
message: string;
|
|
8
|
+
options: SelectOption[];
|
|
9
|
+
initialValue?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const runSelectPrompt = async (input: SelectPromptInput): Promise<string> => {
|
|
13
|
+
const selected = input.initialValue ?? input.options[0]?.value;
|
|
14
|
+
if (!selected) {
|
|
15
|
+
throw new Error(`No options available for select prompt: ${input.message}`);
|
|
16
|
+
}
|
|
17
|
+
return selected;
|
|
18
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface TextPromptInput {
|
|
2
|
+
message: string;
|
|
3
|
+
initialValue?: string;
|
|
4
|
+
required?: boolean;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const runTextPrompt = async (input: TextPromptInput): Promise<string> => {
|
|
8
|
+
const value = input.initialValue ?? '';
|
|
9
|
+
if (input.required && value.trim().length === 0) {
|
|
10
|
+
throw new Error(`Required text value missing: ${input.message}`);
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExitCode } from '../core/errors/framework-errors.js';
|
|
2
|
+
|
|
3
|
+
export type InterruptSignal = 'SIGINT' | 'ESC' | 'TIMEOUT';
|
|
4
|
+
|
|
5
|
+
export interface InterruptResult {
|
|
6
|
+
exitCode: ExitCode;
|
|
7
|
+
reason: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const handleInterrupt = (signal: InterruptSignal): InterruptResult => {
|
|
11
|
+
if (signal === 'TIMEOUT') {
|
|
12
|
+
return { exitCode: ExitCode.VALIDATION_ERROR, reason: 'Workflow timed out' };
|
|
13
|
+
}
|
|
14
|
+
return { exitCode: ExitCode.INTERRUPTED, reason: `Interrupted by ${signal}` };
|
|
15
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
|
|
5
|
+
describe('e2e cli smoke', () => {
|
|
6
|
+
it('prints help output from cli entry', () => {
|
|
7
|
+
const projectRoot = resolve(__dirname, '../..');
|
|
8
|
+
const tsxCli = resolve(projectRoot, 'node_modules/tsx/dist/cli.mjs');
|
|
9
|
+
const cliEntry = resolve(projectRoot, 'src/cli-entry.ts');
|
|
10
|
+
|
|
11
|
+
const result = spawnSync(process.execPath, [tsxCli, cliEntry, '-h'], {
|
|
12
|
+
cwd: projectRoot,
|
|
13
|
+
encoding: 'utf8'
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
expect(result.status).toBe(0);
|
|
17
|
+
expect(result.stdout).toContain('# HELP');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createRegistry } from '../../src/index.js';
|
|
3
|
+
import sampleContentModule from '../../src/modules/sample-content/module.js';
|
|
4
|
+
import sampleSystemModule from '../../src/modules/sample-system/module.js';
|
|
5
|
+
import { dispatchAction } from '../../src/runtime/dispatch.js';
|
|
6
|
+
|
|
7
|
+
describe('integration dispatch runtime', () => {
|
|
8
|
+
it('dispatches commandline action with required args', async () => {
|
|
9
|
+
const registry = createRegistry([sampleContentModule, sampleSystemModule]);
|
|
10
|
+
|
|
11
|
+
const result = await dispatchAction({
|
|
12
|
+
registry,
|
|
13
|
+
moduleId: 'content',
|
|
14
|
+
actionId: 'slugify',
|
|
15
|
+
args: { text: 'Hello Integration Test' },
|
|
16
|
+
isTTY: true
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
expect(result.ok).toBe(true);
|
|
20
|
+
expect(result.mode).toBe('commandline');
|
|
21
|
+
expect(result.data).toBe('hello-integration-test');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { renderHelp } from '../../src/help/help-renderer.js';
|
|
3
|
+
import { resolveHelpHierarchy } from '../../src/help/hierarchy-resolver.js';
|
|
4
|
+
import sampleContentModule from '../../src/modules/sample-content/module.js';
|
|
5
|
+
|
|
6
|
+
describe('transcript help output', () => {
|
|
7
|
+
it('renders deterministic action help transcript', () => {
|
|
8
|
+
const views = resolveHelpHierarchy([sampleContentModule], 'content', 'slugify');
|
|
9
|
+
const output = renderHelp(views);
|
|
10
|
+
|
|
11
|
+
expect(output).toContain('# HELP');
|
|
12
|
+
expect(output).toContain('MODULE: content');
|
|
13
|
+
expect(output).toContain('ACTION: slugify');
|
|
14
|
+
expect(output).toContain('## SUMMARY');
|
|
15
|
+
expect(output).toContain('## ARGS');
|
|
16
|
+
expect(output).toContain('## EXAMPLES');
|
|
17
|
+
expect(output).toContain('## USE-CASES');
|
|
18
|
+
expect(output).toContain('## KEYBINDINGS');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { StateMachine } from '../../src/runtime/state-machine.js';
|
|
3
|
+
|
|
4
|
+
describe('state-machine', () => {
|
|
5
|
+
it('supports next/back/jump/exit transitions', () => {
|
|
6
|
+
const machine = new StateMachine('wf', [
|
|
7
|
+
{ id: 'a', label: 'A' },
|
|
8
|
+
{ id: 'b', label: 'B' },
|
|
9
|
+
{ id: 'c', label: 'C' }
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
expect(machine.currentNode().id).toBe('a');
|
|
13
|
+
machine.transition({ type: 'next' });
|
|
14
|
+
expect(machine.currentNode().id).toBe('b');
|
|
15
|
+
machine.transition({ type: 'jump', targetNodeId: 'c' });
|
|
16
|
+
expect(machine.currentNode().id).toBe('c');
|
|
17
|
+
machine.transition({ type: 'back' });
|
|
18
|
+
expect(machine.currentNode().id).toBe('b');
|
|
19
|
+
machine.transition({ type: 'exit' });
|
|
20
|
+
expect(machine.snapshot().exited).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"forceConsistentCasingInFileNames": true,
|
|
10
|
+
"declaration": true,
|
|
11
|
+
"outDir": "dist",
|
|
12
|
+
"rootDir": ".",
|
|
13
|
+
"types": ["node", "vitest/globals"]
|
|
14
|
+
},
|
|
15
|
+
"include": ["src/**/*.ts", "tests/**/*.ts", "vitest.config.ts"],
|
|
16
|
+
"exclude": ["dist", "node_modules"]
|
|
17
|
+
}
|