@bitcobblers/wod-wiki-engine 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.
@@ -0,0 +1,273 @@
1
+ import { IDialect, AnalyticsDataPoint, Note, NoteSegment, BlockIndexRow, WorkoutResult, StoredOutputStatement, WorkoutResults, ICodeStatement, IOutputStatement } from '@bitcobblers/wod-wiki-core';
2
+ export * from '@bitcobblers/wod-wiki-core';
3
+ import { IRealtimeProcessor, ISummaryProcessor, IEffort, IScript, INowProvider } from '@bitcobblers/wod-wiki-lang';
4
+ export { AnalyticsContext, AnalyticsEngine, AnalyticsResult, AnalyticsTransformer, BUILTIN_CALCS, BUNDLED_EFFORT_COUNT, BehaviorContext, BlockContext, CONSUMED_HINTS, CalcDefinition, CalcEngine, CalcOrigin, CalcScope, CalculateBlockProcessor, CalculationRegistry, CardioDialect, ClimbDialect, ClimbMetricType, CrossFitDialect, DEFAULT_RESOLVER_OPTIONS, DEFAULT_UNRESOLVED_EFFORT_MET, DIM_LENGTH, DIM_MASS, DIM_TIME, DIM_ZERO, DialectStack, EFFORT_REGISTRY_ORIGINS, EffortBaseAttributes, EffortDerivation, EffortRegistrySource, EffortResolutionOptions, EffortResolver, EffortResolverOptions, EventBus, ExecutionContext, HabitsDialect, IAnalyticsEngine, IAnalyticsProcessorDescriptor, IAnalyticsProfile, IEffortRegistry, IEffortResolver, ILookupTable, INTENSITY_TIERS, INowProvider, IRealtimeProcessor, IRuntimeBlockStrategy, IScript, ISummaryProcessor, InMemoryEffortRegistry, IntensityTier, JitCompiler, LookupRegistry, MdTimerRuntime, NextEvent, OutputEmitter, PRODUCTION_STRATEGIES, Registry, ResolvedEffort, ResolvedEffortData, RuntimeBlock, RuntimeBlockOptions, RuntimeClock, RuntimeController, RuntimeFactory, RuntimeLogger, RuntimeMemory, RuntimeStack, STORE_CALCS, ScriptRuntime, SegmentWithMetadata, SnapshotClock, StandardAnalyticsProfile, StartSessionAction, StartSessionOptions, TwoPassEffortResolutionProcess, UnitsDialect, WhiteboardScript, WodDialect, YogaDialect, bundledEfforts, createAnalyticsEngineForBlock, createCalcEngine, createCompiler, createDialectStack, createMockClock, createParser, dialectRegistry, dialectStack, evaluate, evaluateCalculateDefinitions, extractMetrics, extractStatements, findBestFuzzyMatch, frozenNow, getAnalyticsFromLogs, getHints, hintsToContainer, isWithinThreshold, levenshteinDistance, normalizeForFuzzy, parseCalcLine, parseCalculateBlock, parseExpression, parseScript, realtimeProcessorRegistry, strategyRegistry, summaryProcessorRegistry, toStoredOutputStatement, wallClockNow } from '@bitcobblers/wod-wiki-lang';
5
+ import { FactQueryStore, QueryResult, RowsQueryResult, FindQueryResult } from '@bitcobblers/wod-wiki-wql';
6
+ export { Aggregator, AnyParsedQuery, BlockQueryStore, ComparisonOp, DASHBOARD_GRID_MAX_COLS, DASHBOARD_WIDGET_TYPES, DEFAULT_DASHBOARD_TITLE, DashboardDocument, DashboardMeta, DashboardToken, DashboardWidget, EffortQueryStore, FactQueryStore, FindOptions, FindPredicate, FindQueryResult, MetricPredicate, NoteQueryStore, PLANNED_WIDGET_TYPES, ParsedFindQuery, ParsedQuery, ParsedRowsQuery, QueryOptions, QueryResult, QueryService, QueryServiceStores, QueryWidgetSuffix, ResultLogStore, RowsQueryResult, RowsRun, Series, SeriesPoint, TagFilter, TagValue, WQL_AGGREGATORS, WQL_CALC_TARGETS, WQL_COMPARISON_OPS, WQL_CONTENT_FILTER_KEYS, WQL_DISPLAY_UNITS, WQL_FIND_TARGETS, WQL_GRAINS, WQL_INTENSITY_TIERS, WQL_KEYWORDS, WQL_METRIC_AGGREGATES, WQL_METRIC_FAMILIES, WQL_ROLLUP_PERIODS, WQL_SOURCES, WQL_TAG_KEYS, WQL_VIRTUAL_DIMS, buildDashboardDocument, buildDashboardScaffold, dashboardSlug, defaultTokenValues, extractDashboardTokens, isDashboardMeta, isDashboardWidgetType, isFindQuery, isRowsQuery, parseQuery, parseQueryWidgetSuffix, parseWqlSuffixes, resolveWidgetType, splitAtWhere, splitWidgetBody, substituteTokens, unknownTokensMessage, unknownWidgetTypeMessage, wql, wqlLanguage, wqlParser, wqlTerms } from '@bitcobblers/wod-wiki-wql';
7
+
8
+ /**
9
+ * Language Pack API — umbrella sugar over per-package slices
10
+ *
11
+ * Implements docs/adr/language-pack-api.md.
12
+ * Provides defineLanguagePack() factory and registerLanguagePack() fan-out
13
+ * into core tag identity, lang dialect stack, and analytics registries.
14
+ */
15
+
16
+ interface LanguagePackIdentity {
17
+ id?: string;
18
+ name: string;
19
+ tags?: readonly string[];
20
+ aliases?: readonly string[];
21
+ runnable?: boolean;
22
+ }
23
+ interface LanguagePackLangSlice {
24
+ analyzer?: new () => IDialect;
25
+ analytics?: ReadonlyArray<new () => IRealtimeProcessor | ISummaryProcessor>;
26
+ }
27
+ interface LanguagePackUiSlice {
28
+ widgetBlock?: unknown;
29
+ }
30
+ interface LanguagePack {
31
+ identity?: LanguagePackIdentity;
32
+ lang?: LanguagePackLangSlice;
33
+ ui?: LanguagePackUiSlice;
34
+ }
35
+ declare function defineLanguagePack(pack: LanguagePack): LanguagePack;
36
+ declare function registerLanguagePack(pack: LanguagePack): void;
37
+ declare function unregisterLanguagePack(packOrId: LanguagePack | string): void;
38
+ declare function listLanguagePacks(): LanguagePack[];
39
+ declare function getRegisteredLanguagePacks(): LanguagePack[];
40
+
41
+ /**
42
+ * In-memory FactQueryStore over a golden IR fixture — the state-free store
43
+ * seam for QueryService and Storybook workbench.
44
+ *
45
+ * Implements FactQueryStore contract without database or browser dependencies.
46
+ */
47
+
48
+ declare function inMemoryFactStore(facts: readonly AnalyticsDataPoint[], noteTags?: Readonly<Record<string, readonly string[]>>): FactQueryStore;
49
+
50
+ /**
51
+ * Pure JSON Intermediate Representation (IR) Schemas & Envelope
52
+ *
53
+ * Implements wayfinder #955 and research asset `docs/research/json-ir-schemas-2026-08-17.md`.
54
+ * Freezes the existing result vocabulary (QueryResult, RowsQueryResult, FindQueryResult,
55
+ * StoredOutputStatement, AnalyticsDataPoint, WorkoutResult, StatementNode) in a
56
+ * versioned envelope safe for JSON round-trips.
57
+ */
58
+
59
+ type IrKind = 'fact-set' | 'result-set' | 'note-set' | 'corpus' | 'query-result' | 'find-result' | 'rows-result' | 'parse-tree' | 'execution-log';
60
+ /**
61
+ * Universal JSON envelope for all headless IR fixtures and output artifacts.
62
+ */
63
+ interface WodWikiIRFile<T> {
64
+ $schema: 'https://wod-wiki.dev/ir/v1.json';
65
+ kind: IrKind;
66
+ generatedAt: number;
67
+ source: string;
68
+ data: T;
69
+ }
70
+ declare function createIRFile<T>(kind: IrKind, data: T, optionsOrSource?: string | {
71
+ source?: string;
72
+ generatedAt?: number;
73
+ }, generatedAt?: number): WodWikiIRFile<T>;
74
+ declare function isIRFile<T = unknown>(obj: unknown): obj is WodWikiIRFile<T>;
75
+ interface MetricNode {
76
+ type: string;
77
+ image?: string;
78
+ value?: unknown;
79
+ origin?: string;
80
+ }
81
+ interface StatementNode {
82
+ id: number;
83
+ type: 'statement' | 'duration' | 'rounds' | 'rest' | 'segment' | 'root';
84
+ raw: string;
85
+ from: number;
86
+ to: number;
87
+ metrics: MetricNode[];
88
+ hints?: string[];
89
+ children?: StatementNode[];
90
+ }
91
+ declare function statementToNode(stmt: ICodeStatement, idMap: Map<number, ICodeStatement>): StatementNode;
92
+ /** Builds a StatementNode tree from a parsed WhiteboardScript. */
93
+ declare function buildStatementTree(script: IScript): StatementNode;
94
+ interface ExecutionLog {
95
+ results: WorkoutResults;
96
+ logs: StoredOutputStatement[];
97
+ statements?: StoredOutputStatement[];
98
+ blockKey?: string;
99
+ sourceScript?: string;
100
+ }
101
+ interface CorpusIRData {
102
+ notes?: Note[];
103
+ segments?: NoteSegment[];
104
+ blocks?: BlockIndexRow[];
105
+ results?: WorkoutResult[];
106
+ facts?: AnalyticsDataPoint[];
107
+ efforts?: IEffort[];
108
+ logs?: StoredOutputStatement[];
109
+ tags?: Record<string, string[]>;
110
+ }
111
+
112
+ /**
113
+ * Headless Parse Command Runner
114
+ *
115
+ * Parses Whiteboard Script source text and emits a versioned IR parse-tree envelope.
116
+ */
117
+
118
+ declare class ParseSyntaxError extends Error {
119
+ readonly errors: Array<{
120
+ message: string;
121
+ line?: number;
122
+ }>;
123
+ constructor(errors: Array<{
124
+ message: string;
125
+ line?: number;
126
+ }>, message?: string);
127
+ }
128
+ interface ParseOptions {
129
+ sport?: string;
130
+ sourceLabel?: string;
131
+ }
132
+ /**
133
+ * Parses Whiteboard Script source directly into a StatementNode IR envelope.
134
+ */
135
+ declare function runParse(source: string, options?: ParseOptions): WodWikiIRFile<StatementNode>;
136
+
137
+ /**
138
+ * Headless Execution Command Runner
139
+ *
140
+ * Executes Whiteboard Script through JIT compiler and runtime state machine,
141
+ * emitting a versioned execution-log IR envelope.
142
+ */
143
+
144
+ interface RunOptions {
145
+ sport?: string;
146
+ startTime?: number;
147
+ maxIterations?: number;
148
+ now?: INowProvider;
149
+ sourceLabel?: string;
150
+ }
151
+ declare function buildWorkoutResults(outputs: readonly IOutputStatement[], options: {
152
+ readonly startTime?: number;
153
+ readonly elapsedTime: number;
154
+ readonly completed: boolean;
155
+ readonly now: INowProvider;
156
+ }): WorkoutResults;
157
+ /**
158
+ * Runs a workout script to completion using headless state machine and Node clock.
159
+ */
160
+ declare function runExecution(source: string, options?: RunOptions): Promise<WodWikiIRFile<ExecutionLog>>;
161
+
162
+ /**
163
+ * Headless WQL Query Command Runner
164
+ *
165
+ * Evaluates WQL queries against in-memory stores sourced from --corpus,
166
+ * --stdin-log, or --stdin-facts, and emits a versioned IR envelope.
167
+ */
168
+
169
+ declare class WqlSyntaxError extends Error {
170
+ readonly query: string;
171
+ readonly syntaxError: string;
172
+ constructor(query: string, syntaxError: string);
173
+ }
174
+ interface QueryCliOptions {
175
+ corpusPath?: string;
176
+ stdinLog?: string;
177
+ stdinFacts?: string;
178
+ preferredUnit?: string;
179
+ sourceLabel?: string;
180
+ }
181
+ interface LoadedData {
182
+ facts: AnalyticsDataPoint[];
183
+ results: WorkoutResult[];
184
+ notes: Note[];
185
+ blocks: BlockIndexRow[];
186
+ efforts: IEffort[];
187
+ noteTags: Record<string, string[]>;
188
+ }
189
+ declare function loadQueryData(options: QueryCliOptions): LoadedData;
190
+ /**
191
+ * Runs a WQL query against the provided in-memory dataset and returns a versioned IR envelope.
192
+ */
193
+ declare function runQueryCli(wqlString: string, options?: QueryCliOptions): Promise<WodWikiIRFile<QueryResult | RowsQueryResult | FindQueryResult>>;
194
+
195
+ /**
196
+ * Dynamic Language Pack Loader
197
+ *
198
+ * Dynamically loads and registers Language Packs passed via `--pack <module-spec>`.
199
+ * Throws PackLoadError on failure, enabling exit code 3 handling.
200
+ */
201
+
202
+ declare class PackLoadError extends Error {
203
+ readonly spec: string;
204
+ readonly originalError: unknown;
205
+ constructor(spec: string, originalError: unknown);
206
+ }
207
+ /**
208
+ * Dynamically imports a Language Pack module and registers it.
209
+ *
210
+ * @param moduleSpec - Relative or absolute path, or package name.
211
+ */
212
+ declare function loadLanguagePack(moduleSpec: string): Promise<LanguagePack>;
213
+
214
+ /**
215
+ * CLI Output Formatters (JSON, ASCII Table, CSV)
216
+ *
217
+ * Implements presentation formatting for parse-tree, execution-log,
218
+ * and WQL query results across json, table, and csv formats.
219
+ */
220
+
221
+ type OutputFormat = 'json' | 'table' | 'csv';
222
+ /**
223
+ * Format StatementNode parse tree
224
+ */
225
+ declare function formatParseOutput(ir: WodWikiIRFile<StatementNode>, format: OutputFormat, pretty?: boolean): string;
226
+ /**
227
+ * Format ExecutionLog runtime output
228
+ */
229
+ declare function formatExecutionOutput(ir: WodWikiIRFile<ExecutionLog>, format: OutputFormat, pretty?: boolean): string;
230
+ /**
231
+ * Format QueryResult / RowsQueryResult / FindQueryResult
232
+ */
233
+ declare function formatQueryOutput(ir: WodWikiIRFile<QueryResult | RowsQueryResult | FindQueryResult>, format: OutputFormat, pretty?: boolean): string;
234
+
235
+ /**
236
+ * Unified `wod` CLI Runner
237
+ *
238
+ * Implements CLI command routing, argument parsing, pipe handling,
239
+ * and exit code conventions per wayfinder #962 and issue #967.
240
+ *
241
+ * Exit Codes:
242
+ * 0 - OK / Success (including empty query results)
243
+ * 1 - Runtime error (file missing, bad arguments, execution error)
244
+ * 2 - Parse / Syntax error (invalid Whiteboard Script or malformed WQL)
245
+ * 3 - Pack load error (failed to import or register --pack)
246
+ */
247
+
248
+ interface CliParsedArgs {
249
+ subcommand?: 'parse' | 'run' | 'query' | 'help' | 'version';
250
+ target?: string;
251
+ corpus?: string;
252
+ stdinLog?: boolean;
253
+ stdinFacts?: boolean;
254
+ format: OutputFormat;
255
+ output?: string;
256
+ packs: string[];
257
+ sport?: string;
258
+ unit?: string;
259
+ help?: boolean;
260
+ version?: boolean;
261
+ }
262
+ declare function parseCliArgs(args: string[]): CliParsedArgs;
263
+ declare function readStdin(): Promise<string>;
264
+ /**
265
+ * Main CLI entry point. Returns numeric exit code.
266
+ */
267
+ declare function cliMain(argv?: string[], io?: {
268
+ stdout?: (text: string) => void;
269
+ stderr?: (text: string) => void;
270
+ readStdinFn?: () => Promise<string>;
271
+ }): Promise<number>;
272
+
273
+ export { type CliParsedArgs, type CorpusIRData, type ExecutionLog, type IrKind, type LanguagePack, type LanguagePackIdentity, type LanguagePackLangSlice, type LanguagePackUiSlice, type MetricNode, type OutputFormat, PackLoadError, type ParseOptions, ParseSyntaxError, type QueryCliOptions, type RunOptions, type StatementNode, type WodWikiIRFile, WqlSyntaxError, buildStatementTree, buildWorkoutResults, cliMain, createIRFile, defineLanguagePack, formatExecutionOutput, formatParseOutput, formatQueryOutput, getRegisteredLanguagePacks, inMemoryFactStore, isIRFile, listLanguagePacks, loadLanguagePack, loadQueryData, parseCliArgs, readStdin, registerLanguagePack, runExecution, runParse, runQueryCli, statementToNode, unregisterLanguagePack };
package/dist/index.mjs ADDED
@@ -0,0 +1,17 @@
1
+ export { PackLoadError, ParseSyntaxError, WqlSyntaxError, buildStatementTree, buildWorkoutResults, cliMain, createIRFile, defineLanguagePack, formatExecutionOutput, formatParseOutput, formatQueryOutput, getRegisteredLanguagePacks, isIRFile, listLanguagePacks, loadLanguagePack, loadQueryData, parseCliArgs, readStdin, registerLanguagePack, runExecution, runParse, runQueryCli, statementToNode, unregisterLanguagePack } from './chunk-2LP6DUB5.mjs';
2
+ export * from '@bitcobblers/wod-wiki-core';
3
+ export { AnalyticsEngine, AnalyticsTransformer, BUILTIN_CALCS, BUNDLED_EFFORT_COUNT, CONSUMED_HINTS, CalcEngine, CalculationRegistry, CardioDialect, ClimbDialect, ClimbMetricType, CrossFitDialect, DEFAULT_RESOLVER_OPTIONS, DEFAULT_UNRESOLVED_EFFORT_MET, DIM_LENGTH, DIM_MASS, DIM_TIME, DIM_ZERO, DialectStack, EFFORT_REGISTRY_ORIGINS, EffortResolver, EventBus, HabitsDialect, INTENSITY_TIERS, InMemoryEffortRegistry, JitCompiler, LookupRegistry, MdTimerRuntime, NextEvent, OutputEmitter, PRODUCTION_STRATEGIES, Registry, RuntimeClock, RuntimeFactory, RuntimeMemory, RuntimeStack, STORE_CALCS, ScriptRuntime, SnapshotClock, StandardAnalyticsProfile, StartSessionAction, UnitsDialect, WhiteboardScript, WodDialect, YogaDialect, bundledEfforts, createAnalyticsEngineForBlock, createCalcEngine, createCompiler, createDialectStack, createMockClock, createParser, dialectRegistry, dialectStack, evaluate, evaluateCalculateDefinitions, extractMetrics, extractStatements, findBestFuzzyMatch, frozenNow, getAnalyticsFromLogs, getHints, hintsToContainer, isWithinThreshold, levenshteinDistance, normalizeForFuzzy, parseCalcLine, parseCalculateBlock, parseExpression, parseScript, realtimeProcessorRegistry, strategyRegistry, summaryProcessorRegistry, toStoredOutputStatement, wallClockNow } from '@bitcobblers/wod-wiki-lang';
4
+ export { DASHBOARD_GRID_MAX_COLS, DASHBOARD_WIDGET_TYPES, DEFAULT_DASHBOARD_TITLE, PLANNED_WIDGET_TYPES, QueryService, WQL_AGGREGATORS, WQL_CALC_TARGETS, WQL_COMPARISON_OPS, WQL_CONTENT_FILTER_KEYS, WQL_DISPLAY_UNITS, WQL_FIND_TARGETS, WQL_GRAINS, WQL_INTENSITY_TIERS, WQL_KEYWORDS, WQL_METRIC_AGGREGATES, WQL_METRIC_FAMILIES, WQL_ROLLUP_PERIODS, WQL_SOURCES, WQL_TAG_KEYS, WQL_VIRTUAL_DIMS, buildDashboardDocument, buildDashboardScaffold, dashboardSlug, defaultTokenValues, extractDashboardTokens, isDashboardMeta, isDashboardWidgetType, isFindQuery, isRowsQuery, parseQuery, parseQueryWidgetSuffix, parseWqlSuffixes, resolveWidgetType, splitAtWhere, splitWidgetBody, substituteTokens, unknownTokensMessage, unknownWidgetTypeMessage, wql, wqlLanguage, wqlParser, wqlTerms } from '@bitcobblers/wod-wiki-wql';
5
+
6
+ // src/store.ts
7
+ function inMemoryFactStore(facts, noteTags = {}) {
8
+ return {
9
+ getFactsByMetric: async (metricKey) => facts.filter((f) => f.metricKey === metricKey || f.type === metricKey),
10
+ getFactsByTimeRange: async (start, end) => facts.filter((f) => f.timestamp >= start && f.timestamp <= end),
11
+ getNoteTagLabels: async (noteId) => [...noteTags[noteId] ?? []]
12
+ };
13
+ }
14
+
15
+ export { inMemoryFactStore };
16
+ //# sourceMappingURL=index.mjs.map
17
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store.ts"],"names":[],"mappings":";;;;;;AASO,SAAS,iBAAA,CACd,KAAA,EACA,QAAA,GAAwD,EAAC,EACzC;AAChB,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,OAAO,SAAA,KACvB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA;AAAA,IACvE,mBAAA,EAAqB,OAAO,KAAA,EAAe,GAAA,KACzC,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,KAAA,IAAS,CAAA,CAAE,aAAa,GAAG,CAAA;AAAA,IAChE,gBAAA,EAAkB,OAAO,MAAA,KAAmB,CAAC,GAAI,QAAA,CAAS,MAAM,CAAA,IAAK,EAAG;AAAA,GAC1E;AACF","file":"index.mjs","sourcesContent":["/**\n * In-memory FactQueryStore over a golden IR fixture — the state-free store\n * seam for QueryService and Storybook workbench.\n *\n * Implements FactQueryStore contract without database or browser dependencies.\n */\nimport type { AnalyticsDataPoint } from '@bitcobblers/wod-wiki-core';\nimport type { FactQueryStore } from '@bitcobblers/wod-wiki-wql';\n\nexport function inMemoryFactStore(\n facts: readonly AnalyticsDataPoint[],\n noteTags: Readonly<Record<string, readonly string[]>> = {},\n): FactQueryStore {\n return {\n getFactsByMetric: async (metricKey: string) =>\n facts.filter((f) => f.metricKey === metricKey || f.type === metricKey),\n getFactsByTimeRange: async (start: number, end: number) =>\n facts.filter((f) => f.timestamp >= start && f.timestamp <= end),\n getNoteTagLabels: async (noteId: string) => [...(noteTags[noteId] ?? [])],\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@bitcobblers/wod-wiki-engine",
3
+ "version": "0.1.0",
4
+ "description": "Umbrella package for Whiteboard Language & WQL engine with CLI runner",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "wod": "./dist/bin/wod.mjs"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.mjs",
16
+ "require": "./dist/index.cjs"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "dependencies": {
26
+ "@bitcobblers/wod-wiki-core": "workspace:*",
27
+ "@bitcobblers/wod-wiki-lang": "workspace:*",
28
+ "@bitcobblers/wod-wiki-wql": "workspace:*"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "clean": "rm -rf dist",
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run"
35
+ }
36
+ }