@input/pen-types 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/dist/index.mjs ADDED
@@ -0,0 +1,394 @@
1
+ // src/types/ops.ts
2
+ var MUTATION_GROUP_METADATA_KEY = "mutation-group";
3
+
4
+ // src/types/stream.ts
5
+ var PEN_STREAM_PROTOCOL_VERSION = 1;
6
+
7
+ // src/types/schema.ts
8
+ function isNestedContent(content) {
9
+ return Array.isArray(content);
10
+ }
11
+
12
+ // src/types/editor.ts
13
+ var HOOK_PRIORITY_AUTH = 100;
14
+ var HOOK_PRIORITY_SUGGEST = 200;
15
+ var HOOK_PRIORITY_INPUT_RULE = 300;
16
+ var HOOK_PRIORITY_DEFAULT = 500;
17
+
18
+ // src/types/tools.ts
19
+ function isScopedSelectionTarget(target) {
20
+ return target.kind === "scoped-range";
21
+ }
22
+ function isAsyncIterable(value) {
23
+ return value != null && typeof value === "object" && Symbol.asyncIterator in value;
24
+ }
25
+
26
+ // src/types/aiRequest.ts
27
+ var AI_REQUEST_REFUSED_CODE = "ai-request-refused";
28
+ var AI_EGRESS_INVENTORY_CODE = "ai-egress-inventory";
29
+
30
+ // src/types/a11y.ts
31
+ function isA11yLabelledBy(value) {
32
+ return typeof value === "object" && value !== null && "labelledBy" in value;
33
+ }
34
+
35
+ // src/types/messages.ts
36
+ var DEFAULT_MESSAGE_CATALOG = {
37
+ "pen.a11y.blockConverted": "Converted to {blockType}",
38
+ "pen.a11y.undoApplied": "Undid {hint}",
39
+ "pen.a11y.redoApplied": "Redid {hint}",
40
+ "pen.a11y.blockSelectionEntered": {
41
+ one: "{count} block selected",
42
+ other: "{count} blocks selected"
43
+ },
44
+ "pen.a11y.blockSelectionChanged": {
45
+ one: "{count} block selected",
46
+ other: "{count} blocks selected"
47
+ },
48
+ "pen.a11y.cellSelectionChanged": "{rows} by {columns} cells selected",
49
+ "pen.a11y.suggestionAppeared": "Suggestion appeared",
50
+ "pen.a11y.suggestionAccepted": "Suggestion accepted",
51
+ "pen.a11y.suggestionRejected": "Suggestion rejected",
52
+ "pen.a11y.streamingStarted": "Streaming started",
53
+ "pen.a11y.streamingFinished": "Streaming finished",
54
+ "pen.a11y.findMatches": {
55
+ one: "{count} match",
56
+ other: "{count} matches"
57
+ },
58
+ "pen.a11y.atomSelected": "{atomType} selected",
59
+ "pen.a11y.collaboratorJoined": "{name} joined",
60
+ "pen.a11y.collaboratorEditing": "{name} is editing",
61
+ "pen.selection.blocksSelected": {
62
+ one: "{count} block selected",
63
+ other: "{count} blocks selected"
64
+ },
65
+ "pen.ai.review.accept": "Accept",
66
+ "pen.schema.paragraph.title": "Paragraph",
67
+ "pen.schema.paragraph.description": "Plain text paragraph",
68
+ "pen.schema.paragraph.placeholder": "Text",
69
+ "pen.schema.heading.title": "Heading",
70
+ "pen.schema.heading.placeholder": "Heading",
71
+ "pen.display.group.basic": "Basic",
72
+ "pen.display.group.lists": "Lists",
73
+ "pen.display.group.other": "Other",
74
+ "pen.schema.document.emptyPlaceholder": "Start writing...",
75
+ "pen.editor.label": "Editor",
76
+ "pen.toolbar.formatting": "Formatting",
77
+ "pen.drag.reorderBlock": "Drag to reorder block",
78
+ "pen.blockHandle.reorder": "Reorder block",
79
+ "pen.blockHandle.moveUp": "Move up",
80
+ "pen.blockHandle.moveDown": "Move down",
81
+ "pen.search.input.placeholder": "Search...",
82
+ "pen.search.input.label": "Find in document",
83
+ "pen.search.replace.placeholder": "Replace...",
84
+ "pen.search.replace.label": "Replace with",
85
+ "pen.search.results.label": "Search results",
86
+ "pen.search.results.none": "No matches",
87
+ "pen.search.results.count": {
88
+ one: "{current} of {count} matches",
89
+ other: "{current} of {count} matches"
90
+ },
91
+ "pen.search.next": "Next match",
92
+ "pen.search.previous": "Previous match",
93
+ "pen.search.replaceMatch": "Replace match",
94
+ "pen.search.replaceAll": "Replace all matches",
95
+ "pen.search.toggle.caseSensitive": "Toggle case-sensitive search",
96
+ "pen.search.toggle.regex": "Toggle regular expression search",
97
+ "pen.search.toggle.wholeWord": "Toggle whole-word search",
98
+ "pen.slash.input.placeholder": "Search blocks...",
99
+ "pen.slash.list.label": "Slash menu",
100
+ "pen.suggestion.list.label": "Suggestions",
101
+ "pen.table.addColumn": "Add column",
102
+ "pen.table.addRow": "Add row",
103
+ "pen.table.columnPlaceholder": "Column {index}",
104
+ "pen.table.columnMenu.label": "{title} column",
105
+ "pen.table.columnMenu.type": "Type",
106
+ "pen.table.columnMenu.insertLeft": "\u2190 Insert left",
107
+ "pen.table.columnMenu.insertRight": "Insert right \u2192",
108
+ "pen.table.columnMenu.delete": "Delete column",
109
+ "pen.table.columnType.text": "Text",
110
+ "pen.table.columnType.number": "Number",
111
+ "pen.table.columnType.select": "Select",
112
+ "pen.table.columnType.checkbox": "Checkbox",
113
+ "pen.table.columnType.date": "Date",
114
+ "pen.table.columnType.url": "URL",
115
+ "pen.table.columnType.email": "Email",
116
+ "pen.toggle.collapse": "Collapse toggle",
117
+ "pen.toggle.expand": "Expand toggle",
118
+ "pen.toggle.empty": "Empty toggle. Click to add a block.",
119
+ "pen.checklist.toggle": "Toggle checkbox",
120
+ "pen.ai.suggestion.previous": "Previous suggestion",
121
+ "pen.ai.suggestion.next": "Next suggestion",
122
+ "pen.ai.suggestion.count": {
123
+ one: "{current} of {count}",
124
+ other: "{current} of {count}"
125
+ },
126
+ "pen.ai.suggestion.groupPrevious": "Previous suggestion group",
127
+ "pen.ai.suggestion.groupNext": "Next suggestion group",
128
+ "pen.ai.prompt.placeholder": "Edit selection",
129
+ "pen.ai.turn.pending": {
130
+ one: "{count} pending",
131
+ other: "{count} pending"
132
+ },
133
+ "pen.ai.turn.working": "Working",
134
+ "pen.ai.turn.accepted": "Accepted",
135
+ "pen.ai.turn.rejected": "Rejected",
136
+ "pen.ai.turn.error": "Error",
137
+ "pen.ai.turn.done": "Done",
138
+ "pen.ai.review.reject": "Reject",
139
+ "pen.ai.session.inlineEdit": "Inline edit",
140
+ "pen.ai.session.selectedRange": "Selected range",
141
+ "pen.ai.session.selectedText": "Selected text",
142
+ "pen.ai.session.targetActive": "AI target is active",
143
+ "pen.ai.session.targetPinned": "Pinned to the original selection",
144
+ "pen.ai.session.followUp": "Add follow-up",
145
+ "pen.ai.session.runEdit": "Run edit",
146
+ "pen.ai.commandMenu.placeholder": "Search AI commands",
147
+ "pen.ai.commandMenu.label": "AI command menu",
148
+ "pen.ai.command.rewrite": "Rewrite",
149
+ "pen.ai.command.rewrite.description": "Rewrite the selected text",
150
+ "pen.ai.command.continue": "Continue writing",
151
+ "pen.ai.command.continue.description": "Continue writing from the current position",
152
+ "pen.ai.command.summarize": "Summarize",
153
+ "pen.ai.command.summarize.description": "Summarize the selected text",
154
+ "pen.ai.command.fixGrammar": "Fix grammar",
155
+ "pen.ai.command.fixGrammar.description": "Fix grammar and spelling",
156
+ "pen.ai.command.simplify": "Simplify",
157
+ "pen.ai.command.simplify.description": "Make the text simpler and more concise",
158
+ "pen.ai.command.expand": "Expand",
159
+ "pen.ai.command.expand.description": "Expand the text with more detail",
160
+ "pen.ai.command.translate": "Translate",
161
+ "pen.ai.command.translate.description": "Translate to another language",
162
+ "pen.ai.shortcut.undoInline": "Undo AI inline turn",
163
+ "pen.ai.shortcut.redoInline": "Redo AI inline turn",
164
+ "pen.ai.suggestion.keep": "Keep",
165
+ "pen.ai.suggestion.undo": "Undo",
166
+ "pen.ai.suggestion.heading": "Suggestion",
167
+ "pen.ai.suggestion.applyHint": "Apply to accept this edit.",
168
+ "pen.ai.suggestion.dismiss": "Dismiss",
169
+ "pen.ai.suggestion.apply": "Apply",
170
+ "pen.ai.suggestion.kind.spelling": "Spelling",
171
+ "pen.ai.suggestion.kind.grammar": "Grammar",
172
+ "pen.ai.suggestion.kind.clarity": "Clarity",
173
+ "pen.ai.suggestion.kind.rephrase": "Rephrase",
174
+ "pen.ai.suggestion.kind.other": "Suggestion",
175
+ "pen.ai.review.section.content": "Content changes",
176
+ "pen.ai.review.section.block": "Block changes",
177
+ "pen.ai.review.section.row": "Row changes",
178
+ "pen.ai.review.section.cell": "Cell changes",
179
+ "pen.ai.review.section.schema": "Schema changes",
180
+ "pen.ai.review.section.view": "View changes",
181
+ "pen.ai.review.kind.added": "Added",
182
+ "pen.ai.review.kind.removed": "Removed",
183
+ "pen.ai.review.kind.updated": "Updated",
184
+ "pen.ai.review.kind.moved": "Moved",
185
+ "pen.ai.review.subgroup.content.added": "Content additions",
186
+ "pen.ai.review.subgroup.content.removed": "Content removals",
187
+ "pen.ai.review.subgroup.content.updated": "Content updates",
188
+ "pen.ai.review.subgroup.content.moved": "Content moves",
189
+ "pen.ai.review.subgroup.block.added": "Block additions",
190
+ "pen.ai.review.subgroup.block.removed": "Block removals",
191
+ "pen.ai.review.subgroup.block.updated": "Block updates",
192
+ "pen.ai.review.subgroup.block.moved": "Block moves",
193
+ "pen.ai.review.subgroup.row.added": "Row additions",
194
+ "pen.ai.review.subgroup.row.removed": "Row removals",
195
+ "pen.ai.review.subgroup.row.updated": "Row updates",
196
+ "pen.ai.review.subgroup.row.moved": "Row moves",
197
+ "pen.ai.review.subgroup.cell.added": "Cell additions",
198
+ "pen.ai.review.subgroup.cell.removed": "Cell removals",
199
+ "pen.ai.review.subgroup.cell.updated": "Cell updates",
200
+ "pen.ai.review.subgroup.cell.moved": "Cell moves",
201
+ "pen.ai.review.subgroup.schema.added": "Schema additions",
202
+ "pen.ai.review.subgroup.schema.removed": "Schema removals",
203
+ "pen.ai.review.subgroup.schema.updated": "Schema updates",
204
+ "pen.ai.review.subgroup.schema.moved": "Schema moves",
205
+ "pen.ai.review.subgroup.view.added": "View additions",
206
+ "pen.ai.review.subgroup.view.removed": "View removals",
207
+ "pen.ai.review.subgroup.view.updated": "View updates",
208
+ "pen.ai.review.subgroup.view.moved": "View moves",
209
+ "pen.ai.review.action.insert": "Insert",
210
+ "pen.ai.review.action.delete": "Delete",
211
+ "pen.ai.review.action.move": "Move",
212
+ "pen.ai.review.action.convert": "Convert",
213
+ "pen.ai.review.action.change": "Change",
214
+ "pen.ai.review.blockSuggestion.insert": "Insert {blockType}",
215
+ "pen.ai.review.blockSuggestion.delete": "Delete {blockType}",
216
+ "pen.ai.review.blockSuggestion.move": "Move {blockType}",
217
+ "pen.ai.review.blockSuggestion.convert": "Convert {blockType}",
218
+ "pen.ai.review.blockType.fallback": "block",
219
+ "pen.ai.review.acceptGroup": "Accept group",
220
+ "pen.ai.review.rejectGroup": "Reject group",
221
+ "pen.ai.review.acceptSubgroup": "Accept subgroup",
222
+ "pen.ai.review.rejectSubgroup": "Reject subgroup",
223
+ "pen.ai.review.expand": "Expand",
224
+ "pen.ai.review.collapse": "Collapse",
225
+ "pen.ai.review.structuralSuggestion": "(structural suggestion)",
226
+ "pen.ai.review.noPendingChanges": "No pending changes.",
227
+ "pen.ai.session.close": "Close"
228
+ };
229
+ function isMessageKey(value) {
230
+ return Object.prototype.hasOwnProperty.call(DEFAULT_MESSAGE_CATALOG, value);
231
+ }
232
+ function isPluralMessage(value) {
233
+ return typeof value === "object" && value !== null && typeof value.other === "string";
234
+ }
235
+
236
+ // src/types/format.ts
237
+ var PEN_DOCUMENT_FORMAT = 3;
238
+ var PEN_FORMAT_METADATA_KEY = "penFormat";
239
+ var DOCUMENT_PROFILE_METADATA_KEY = "documentProfile";
240
+ var MIGRATION_LEDGER_METADATA_KEY = "penMigrations";
241
+ var RESERVED_METADATA_KEYS = Object.freeze([
242
+ PEN_FORMAT_METADATA_KEY,
243
+ DOCUMENT_PROFILE_METADATA_KEY,
244
+ MIGRATION_LEDGER_METADATA_KEY
245
+ ]);
246
+ var IMPLICIT_V1_FORMAT_STAMP = Object.freeze({
247
+ format: 1,
248
+ minReader: 1,
249
+ writer: "unknown"
250
+ });
251
+
252
+ // src/constants/decorations.ts
253
+ var INLINE_COMPLETION_VISIBLE_BLOCK_ATTRIBUTE = "data-pen-inline-completion-visible";
254
+
255
+ // src/constants/reviewSurface.ts
256
+ var REVIEW_SURFACE_CLASSES = Object.freeze({
257
+ /** Inserted text in a proposed edit. */
258
+ suggestionInsert: "pen-suggestion-insert",
259
+ /** Deleted text in a proposed edit, including in-flight originals. */
260
+ suggestionDelete: "pen-suggestion-delete",
261
+ /** Text still arriving, shown before anything is written. */
262
+ preview: "pen-ai-review-preview",
263
+ /** Selection context kept visible around an edit under review. */
264
+ context: "pen-ai-review-context",
265
+ /** The range an edit under review affects. */
266
+ affectedRange: "pen-ai-affected-range",
267
+ /** A block carrying a proposed structural change. */
268
+ blockSuggestion: "pen-block-suggestion"
269
+ });
270
+ var REVIEW_SURFACE_BLOCK_SUGGESTION_CLASSES = Object.freeze({
271
+ "insert-block": "pen-block-suggestion-insert-block",
272
+ "delete-block": "pen-block-suggestion-delete-block",
273
+ "move-block": "pen-block-suggestion-move-block",
274
+ "convert-block": "pen-block-suggestion-convert-block",
275
+ "split-block": "pen-block-suggestion-split-block",
276
+ "format-text": "pen-block-suggestion-format-text"
277
+ });
278
+ var REVIEW_SURFACE_CUSTOM_PROPERTIES = Object.freeze({
279
+ insertColor: "--pen-ai-review-insert-color",
280
+ insertBackground: "--pen-ai-review-insert-background",
281
+ deleteColor: "--pen-ai-review-delete-color",
282
+ contextBackground: "--pen-ai-review-context-background",
283
+ contextBoxShadow: "--pen-ai-review-context-box-shadow",
284
+ borderRadius: "--pen-ai-review-border-radius",
285
+ inlinePaddingBlock: "--pen-ai-review-inline-padding-block",
286
+ inlineMarginBlock: "--pen-ai-review-inline-margin-block"
287
+ });
288
+
289
+ // src/types/decorations.ts
290
+ var DECORATION_OMIT_FROM_RENDER_ATTRIBUTE = "data-pen-omit-from-render";
291
+
292
+ // src/types/clipboard.ts
293
+ var PEN_CLIPBOARD_PAYLOAD_VERSION = 1;
294
+ var PEN_CLIPBOARD_JSON_MIME = "application/x-pen-blocks+json";
295
+ var PEN_CLIPBOARD_JSON_MIME_LEGACY = "application/x-pen-blocks";
296
+
297
+ // src/utils/generateId.ts
298
+ var HEX_DIGITS = "0123456789abcdef";
299
+ var UUID_DASH_POSITIONS = /* @__PURE__ */ new Set([3, 5, 7, 9]);
300
+ function formatUuidV4(bytes) {
301
+ bytes[6] = bytes[6] & 15 | 64;
302
+ bytes[8] = bytes[8] & 63 | 128;
303
+ let id = "";
304
+ for (let index = 0; index < 16; index++) {
305
+ const byte = bytes[index];
306
+ id += HEX_DIGITS[byte >> 4] + HEX_DIGITS[byte & 15];
307
+ if (UUID_DASH_POSITIONS.has(index)) {
308
+ id += "-";
309
+ }
310
+ }
311
+ return id;
312
+ }
313
+ function generateId() {
314
+ const webCrypto = typeof crypto === "undefined" ? void 0 : crypto;
315
+ if (typeof webCrypto?.randomUUID === "function") {
316
+ return webCrypto.randomUUID();
317
+ }
318
+ if (typeof webCrypto?.getRandomValues === "function") {
319
+ return formatUuidV4(webCrypto.getRandomValues(new Uint8Array(16)));
320
+ }
321
+ const bytes = new Uint8Array(16);
322
+ for (let index = 0; index < bytes.length; index++) {
323
+ bytes[index] = Math.floor(Math.random() * 256);
324
+ }
325
+ return formatUuidV4(bytes);
326
+ }
327
+
328
+ // src/constants/slots.ts
329
+ var FIELD_EDITOR_SLOT_KEY = "field-editor";
330
+ var COLLECT_KEY_BINDINGS_SLOT_KEY = "core:collect-key-bindings";
331
+ var AWAIT_EXTENSION_LIFECYCLE_SLOT_KEY = "core:await-extension-lifecycle";
332
+ var INPUT_RULES_ENGINE_SLOT_KEY = "input-rules:engine";
333
+ var UNDO_HISTORY_RESTORE_SLOT_KEY = "undo:history-restore";
334
+ var UNDO_HISTORY_METADATA_CONTROLLER_SLOT_KEY = "undo:history-metadata-controller";
335
+ var INLINE_COMPLETION_SLOT = "ai:inline-completion";
336
+ var AI_CONTROLLER_SLOT = "ai:controller";
337
+ var AI_INLINE_HISTORY_SLOT = "ai:inline-history";
338
+ var AI_REVIEW_CONTROLLER_SLOT = "ai:review";
339
+ var AI_AUTOCOMPLETE_CONTROLLER_SLOT = "ai-autocomplete:controller";
340
+ var AI_SUGGESTIONS_CONTROLLER_SLOT = "ai-suggestions:controller";
341
+ var SEARCH_CONTROLLER_SLOT = "search:controller";
342
+ var MULTIPLAYER_CONTROLLER_SLOT = "multiplayer:controller";
343
+ var SNAPSHOTS_CONTROLLER_SLOT = "snapshots:controller";
344
+ var ANNOUNCER_SLOT_KEY = "pen.announcer";
345
+ var HISTORY_ORIGIN_TAG = "__pen_history__";
346
+ export {
347
+ AI_AUTOCOMPLETE_CONTROLLER_SLOT,
348
+ AI_CONTROLLER_SLOT,
349
+ AI_EGRESS_INVENTORY_CODE,
350
+ AI_INLINE_HISTORY_SLOT,
351
+ AI_REQUEST_REFUSED_CODE,
352
+ AI_REVIEW_CONTROLLER_SLOT,
353
+ AI_SUGGESTIONS_CONTROLLER_SLOT,
354
+ ANNOUNCER_SLOT_KEY,
355
+ AWAIT_EXTENSION_LIFECYCLE_SLOT_KEY,
356
+ COLLECT_KEY_BINDINGS_SLOT_KEY,
357
+ DECORATION_OMIT_FROM_RENDER_ATTRIBUTE,
358
+ DEFAULT_MESSAGE_CATALOG,
359
+ DOCUMENT_PROFILE_METADATA_KEY,
360
+ FIELD_EDITOR_SLOT_KEY,
361
+ HISTORY_ORIGIN_TAG,
362
+ HOOK_PRIORITY_AUTH,
363
+ HOOK_PRIORITY_DEFAULT,
364
+ HOOK_PRIORITY_INPUT_RULE,
365
+ HOOK_PRIORITY_SUGGEST,
366
+ IMPLICIT_V1_FORMAT_STAMP,
367
+ INLINE_COMPLETION_SLOT,
368
+ INLINE_COMPLETION_VISIBLE_BLOCK_ATTRIBUTE,
369
+ INPUT_RULES_ENGINE_SLOT_KEY,
370
+ MIGRATION_LEDGER_METADATA_KEY,
371
+ MULTIPLAYER_CONTROLLER_SLOT,
372
+ MUTATION_GROUP_METADATA_KEY,
373
+ PEN_CLIPBOARD_JSON_MIME,
374
+ PEN_CLIPBOARD_JSON_MIME_LEGACY,
375
+ PEN_CLIPBOARD_PAYLOAD_VERSION,
376
+ PEN_DOCUMENT_FORMAT,
377
+ PEN_FORMAT_METADATA_KEY,
378
+ PEN_STREAM_PROTOCOL_VERSION,
379
+ RESERVED_METADATA_KEYS,
380
+ REVIEW_SURFACE_BLOCK_SUGGESTION_CLASSES,
381
+ REVIEW_SURFACE_CLASSES,
382
+ REVIEW_SURFACE_CUSTOM_PROPERTIES,
383
+ SEARCH_CONTROLLER_SLOT,
384
+ SNAPSHOTS_CONTROLLER_SLOT,
385
+ UNDO_HISTORY_METADATA_CONTROLLER_SLOT_KEY,
386
+ UNDO_HISTORY_RESTORE_SLOT_KEY,
387
+ generateId,
388
+ isA11yLabelledBy,
389
+ isAsyncIterable,
390
+ isMessageKey,
391
+ isNestedContent,
392
+ isPluralMessage,
393
+ isScopedSelectionTarget
394
+ };
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@input/pen-types",
3
+ "version": "0.1.0",
4
+ "description": "Type definitions and lightweight runtime helpers for Pen",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/input-systems/pen#readme",
7
+ "bugs": {
8
+ "url": "https://github.com/input-systems/pen/issues"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/input-systems/pen.git",
13
+ "directory": "packages/types"
14
+ },
15
+ "type": "module",
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "registry": "https://registry.npmjs.org/"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "import": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.mjs"
25
+ },
26
+ "require": {
27
+ "types": "./dist/index.d.cts",
28
+ "default": "./dist/index.cjs"
29
+ }
30
+ },
31
+ "./package.json": "./package.json"
32
+ },
33
+ "main": "./dist/index.cjs",
34
+ "module": "./dist/index.mjs",
35
+ "types": "./dist/index.d.ts",
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE.md"
40
+ ],
41
+ "engines": {
42
+ "node": ">=22"
43
+ },
44
+ "sideEffects": false,
45
+ "devDependencies": {
46
+ "tsup": "^8.4.0",
47
+ "typescript": "^5.7.3",
48
+ "vitest": "^3.2.7"
49
+ },
50
+ "scripts": {
51
+ "build": "tsup",
52
+ "typecheck": "tsc --noEmit",
53
+ "lint": "eslint .",
54
+ "test": "vitest run",
55
+ "clean": "rm -rf dist *.tsbuildinfo"
56
+ }
57
+ }