@vielzeug/sourcerer 1.0.2

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 (118) hide show
  1. package/README.md +86 -0
  2. package/dist/_dev.d.ts +2 -0
  3. package/dist/_dev.d.ts.map +1 -0
  4. package/dist/_utils.cjs +2 -0
  5. package/dist/_utils.cjs.map +1 -0
  6. package/dist/_utils.d.ts +8 -0
  7. package/dist/_utils.d.ts.map +1 -0
  8. package/dist/_utils.js +7 -0
  9. package/dist/_utils.js.map +1 -0
  10. package/dist/applyQuery.cjs +2 -0
  11. package/dist/applyQuery.cjs.map +1 -0
  12. package/dist/applyQuery.d.ts +20 -0
  13. package/dist/applyQuery.d.ts.map +1 -0
  14. package/dist/applyQuery.js +8 -0
  15. package/dist/applyQuery.js.map +1 -0
  16. package/dist/asyncSource.cjs +2 -0
  17. package/dist/asyncSource.cjs.map +1 -0
  18. package/dist/asyncSource.d.ts +62 -0
  19. package/dist/asyncSource.d.ts.map +1 -0
  20. package/dist/asyncSource.js +40 -0
  21. package/dist/asyncSource.js.map +1 -0
  22. package/dist/codecs.cjs +2 -0
  23. package/dist/codecs.cjs.map +1 -0
  24. package/dist/codecs.d.ts +30 -0
  25. package/dist/codecs.d.ts.map +1 -0
  26. package/dist/codecs.js +36 -0
  27. package/dist/codecs.js.map +1 -0
  28. package/dist/core.cjs +2 -0
  29. package/dist/core.cjs.map +1 -0
  30. package/dist/core.d.ts +47 -0
  31. package/dist/core.d.ts.map +1 -0
  32. package/dist/core.js +59 -0
  33. package/dist/core.js.map +1 -0
  34. package/dist/cursorSource.cjs +2 -0
  35. package/dist/cursorSource.cjs.map +1 -0
  36. package/dist/cursorSource.d.ts +4 -0
  37. package/dist/cursorSource.d.ts.map +1 -0
  38. package/dist/cursorSource.js +135 -0
  39. package/dist/cursorSource.js.map +1 -0
  40. package/dist/derive.cjs +2 -0
  41. package/dist/derive.cjs.map +1 -0
  42. package/dist/derive.d.ts +28 -0
  43. package/dist/derive.d.ts.map +1 -0
  44. package/dist/derive.js +40 -0
  45. package/dist/derive.js.map +1 -0
  46. package/dist/errors.cjs +2 -0
  47. package/dist/errors.cjs.map +1 -0
  48. package/dist/errors.d.ts +62 -0
  49. package/dist/errors.d.ts.map +1 -0
  50. package/dist/errors.js +29 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/fetchManager.cjs +2 -0
  53. package/dist/fetchManager.cjs.map +1 -0
  54. package/dist/fetchManager.d.ts +27 -0
  55. package/dist/fetchManager.d.ts.map +1 -0
  56. package/dist/fetchManager.js +41 -0
  57. package/dist/fetchManager.js.map +1 -0
  58. package/dist/index.cjs +1 -0
  59. package/dist/index.d.ts +16 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +14 -0
  62. package/dist/infiniteSource.cjs +2 -0
  63. package/dist/infiniteSource.cjs.map +1 -0
  64. package/dist/infiniteSource.d.ts +4 -0
  65. package/dist/infiniteSource.d.ts.map +1 -0
  66. package/dist/infiniteSource.js +135 -0
  67. package/dist/infiniteSource.js.map +1 -0
  68. package/dist/localSource.cjs +2 -0
  69. package/dist/localSource.cjs.map +1 -0
  70. package/dist/localSource.d.ts +24 -0
  71. package/dist/localSource.d.ts.map +1 -0
  72. package/dist/localSource.js +130 -0
  73. package/dist/localSource.js.map +1 -0
  74. package/dist/merge.cjs +2 -0
  75. package/dist/merge.cjs.map +1 -0
  76. package/dist/merge.d.ts +30 -0
  77. package/dist/merge.d.ts.map +1 -0
  78. package/dist/merge.js +34 -0
  79. package/dist/merge.js.map +1 -0
  80. package/dist/pagination.cjs +2 -0
  81. package/dist/pagination.cjs.map +1 -0
  82. package/dist/pagination.d.ts +31 -0
  83. package/dist/pagination.d.ts.map +1 -0
  84. package/dist/pagination.js +34 -0
  85. package/dist/pagination.js.map +1 -0
  86. package/dist/prefetch.cjs +2 -0
  87. package/dist/prefetch.cjs.map +1 -0
  88. package/dist/prefetch.d.ts +32 -0
  89. package/dist/prefetch.d.ts.map +1 -0
  90. package/dist/prefetch.js +38 -0
  91. package/dist/prefetch.js.map +1 -0
  92. package/dist/presets.cjs +2 -0
  93. package/dist/presets.cjs.map +1 -0
  94. package/dist/presets.d.ts +12 -0
  95. package/dist/presets.d.ts.map +1 -0
  96. package/dist/presets.js +24 -0
  97. package/dist/presets.js.map +1 -0
  98. package/dist/remoteSource.cjs +2 -0
  99. package/dist/remoteSource.cjs.map +1 -0
  100. package/dist/remoteSource.d.ts +4 -0
  101. package/dist/remoteSource.d.ts.map +1 -0
  102. package/dist/remoteSource.js +175 -0
  103. package/dist/remoteSource.js.map +1 -0
  104. package/dist/sourcerer.cjs +2 -0
  105. package/dist/sourcerer.cjs.map +1 -0
  106. package/dist/sourcerer.iife.js +2 -0
  107. package/dist/sourcerer.iife.js.map +1 -0
  108. package/dist/sourcerer.js +2 -0
  109. package/dist/sourcerer.js.map +1 -0
  110. package/dist/state.cjs +2 -0
  111. package/dist/state.cjs.map +1 -0
  112. package/dist/state.d.ts +23 -0
  113. package/dist/state.d.ts.map +1 -0
  114. package/dist/state.js +14 -0
  115. package/dist/state.js.map +1 -0
  116. package/dist/types.d.ts +374 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/package.json +43 -0
@@ -0,0 +1,374 @@
1
+ import type { SourcererError } from './errors';
2
+ export type Predicate<T> = (value: T, index: number, array: readonly T[]) => boolean;
3
+ export type Sorter<T> = (a: T, b: T) => number;
4
+ export type QueryParamsInput = Record<string, string | string[] | undefined>;
5
+ export type QueryParams = Record<string, string>;
6
+ /** Configures automatic retry on fetch failure. */
7
+ export type RetryConfig = Readonly<{
8
+ /** Number of retry attempts after the first failure. Default: 0 (no retries). */
9
+ attempts?: number;
10
+ /** Returns the delay in ms before the nth retry (1-indexed). Default: exponential backoff. */
11
+ delay?: (attempt: number) => number;
12
+ }>;
13
+ export type SourceQuery = Readonly<{
14
+ limit: number;
15
+ page: number;
16
+ /**
17
+ * The active search string. Absent (or empty string) when no search is active.
18
+ * Both representations are equivalent — treat `''` and `undefined` identically.
19
+ * `encodeQuery` omits this field when falsy; `decodeQuery` returns it only when present in the URL.
20
+ */
21
+ search?: string;
22
+ }>;
23
+ export type RemoteSourceQuery<TFilter = unknown, TSort = unknown> = Readonly<{
24
+ filter?: TFilter;
25
+ limit: number;
26
+ page: number;
27
+ search?: string;
28
+ sort?: TSort;
29
+ }>;
30
+ export type CursorSourceQuery<TCursor = string> = Readonly<{
31
+ after?: TCursor;
32
+ before?: TCursor;
33
+ limit: number;
34
+ search?: string;
35
+ }>;
36
+ export type InfiniteSourceQuery = Readonly<{
37
+ limit: number;
38
+ page: number;
39
+ search?: string;
40
+ }>;
41
+ export { SourceDisposedError, SourcererError, SourceTimeoutError } from './errors';
42
+ export type { SourcererErrorContext } from './errors';
43
+ /**
44
+ * Event emitted by the `onFetch` callback after each fetch attempt settles.
45
+ * Carries the full `SourcererError` on failure for rich diagnostics.
46
+ */
47
+ export type FetchEvent<TQuery = unknown> = Readonly<{
48
+ /** Total time in ms from issuing the request to receiving a response (includes retries). */
49
+ durationMs: number;
50
+ /** Structured error when `status` is `'error'`. */
51
+ error?: SourcererError;
52
+ /** The query object that was fetched. */
53
+ query: TQuery;
54
+ status: 'error' | 'success';
55
+ }>;
56
+ /**
57
+ * Metadata snapshot describing the current pagination and loading state of a source.
58
+ * Use `itemRange(meta)` to compute display-level start/end item numbers.
59
+ */
60
+ export type SourceMeta = Readonly<{
61
+ /** Structured error from the most recent failed fetch. `null` when healthy. */
62
+ error: SourcererError | null;
63
+ isLoading: boolean;
64
+ isSearchPending: boolean;
65
+ pageCount: number;
66
+ pageNumber: number;
67
+ pageSize: number;
68
+ totalItems: number;
69
+ }>;
70
+ /**
71
+ * A serializable point-in-time snapshot of a remote source's loaded state.
72
+ * Safe to embed in HTML or pass over the network.
73
+ */
74
+ export type SourceSnapshot<T> = Readonly<{
75
+ items: readonly T[];
76
+ page?: number;
77
+ search?: string;
78
+ total: number;
79
+ }>;
80
+ /**
81
+ * Discriminated union describing the current state of any reactive source.
82
+ * Use `sourceState(source)` to derive this without manual branching on meta fields.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * const state = sourceState(source);
87
+ * if (state.status === 'loading') return <Spinner />;
88
+ * if (state.status === 'error') return <Error message={state.error.message} />;
89
+ * return <List items={state.items} />;
90
+ * ```
91
+ */
92
+ export type SourceState<T> = {
93
+ readonly error: SourcererError;
94
+ readonly status: 'error';
95
+ } | {
96
+ readonly items: readonly T[];
97
+ readonly status: 'success';
98
+ } | {
99
+ readonly status: 'loading';
100
+ };
101
+ /**
102
+ * Minimal observable interface shared by all source and derived source types.
103
+ * Framework adapters should target this interface for maximum portability.
104
+ */
105
+ export type ReactiveSource<T, TMeta = SourceMeta> = {
106
+ [Symbol.dispose](): void;
107
+ readonly current: readonly T[];
108
+ readonly disposalSignal: AbortSignal;
109
+ dispose(): void;
110
+ readonly disposed: boolean;
111
+ readonly meta: TMeta;
112
+ subscribe(listener: () => void): () => void;
113
+ };
114
+ /**
115
+ * Read-only reactive projection derived from a parent source.
116
+ * Returned by `deriveSource()`.
117
+ */
118
+ export type DerivedSource<T, TMeta = SourceMeta> = ReactiveSource<T, TMeta>;
119
+ /**
120
+ * Read-only reactive view combining multiple sources.
121
+ * Returned by `mergeSource()` when sources have incompatible meta shapes.
122
+ */
123
+ export type MergedSource<T> = {
124
+ [Symbol.dispose](): void;
125
+ readonly current: readonly T[];
126
+ readonly disposalSignal: AbortSignal;
127
+ dispose(): void;
128
+ readonly disposed: boolean;
129
+ subscribe(listener: () => void): () => void;
130
+ };
131
+ /** Options for the `search()` method on all source types. */
132
+ export type SearchOptions = Readonly<{
133
+ /** When `true`, cancels any pending debounce and fetches immediately. Default: `false`. */
134
+ immediate?: boolean;
135
+ }>;
136
+ /** Shared navigation interface for all page-based source types (local and remote). */
137
+ export type PageNavigator<T> = ReactiveSource<T, SourceMeta> & {
138
+ goTo(page: number): Promise<void>;
139
+ goToLast(): Promise<void>;
140
+ next(): Promise<void>;
141
+ /**
142
+ * Applies one or more query changes atomically — a single fetch for any combination
143
+ * of limit, page, and search updates.
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * // Change limit and search in one fetch
148
+ * await source.patch({ limit: 20, search: 'hello' });
149
+ * ```
150
+ */
151
+ patch(changes: Partial<SourceQuery>): Promise<void>;
152
+ prev(): Promise<void>;
153
+ /**
154
+ * The current query state — limit, page, and optional search string.
155
+ * Use `encodeQuery(source.query)` to serialize to URL params.
156
+ */
157
+ readonly query: SourceQuery;
158
+ /**
159
+ * Resolves when the source is idle (no pending async computation).
160
+ * Rejects with `SourceTimeoutError` after `timeout` ms if still busy.
161
+ */
162
+ ready(timeout?: number): Promise<void>;
163
+ reset(): Promise<void>;
164
+ /**
165
+ * Updates the search query. Debounced by default.
166
+ * Always returns a `Promise<void>` that resolves when the triggered fetch completes.
167
+ * Pass `{ immediate: true }` to skip the debounce window.
168
+ */
169
+ search(query: string, opts?: SearchOptions): Promise<void>;
170
+ };
171
+ /** Full set of fields patchable in one atomic recompute on a local source. */
172
+ export type LocalSourceQuery<T> = Partial<{
173
+ filter: Predicate<T> | undefined;
174
+ limit: number;
175
+ page: number;
176
+ search: string;
177
+ sort: Sorter<T> | undefined;
178
+ }>;
179
+ /**
180
+ * Full interface for in-memory page-based sources.
181
+ * Synchronous when no async ops are configured; supports async filter/sort
182
+ * pipelines (e.g. Web Worker offloading) when `filterAsync`/`sortAsync` are set.
183
+ */
184
+ export type LocalSource<T> = Omit<PageNavigator<T>, 'patch'> & {
185
+ /**
186
+ * Applies one or more query changes atomically — a single recompute for any combination
187
+ * of limit, page, search, filter, and sort updates.
188
+ *
189
+ * @example
190
+ * ```ts
191
+ * // Change filter and search in one recompute
192
+ * await source.patch({ filter: (u) => u.active, search: 'ada', limit: 5 });
193
+ * ```
194
+ */
195
+ patch(changes: LocalSourceQuery<T>): Promise<void>;
196
+ setData(data: readonly T[]): Promise<void>;
197
+ };
198
+ /**
199
+ * Full interface for remote page-based sources.
200
+ * `optimisticUpdate(mutator)` throws if a concurrent update is already pending.
201
+ */
202
+ export type RemoteSource<T, TFilter = unknown, TSort = unknown> = Omit<PageNavigator<T>, 'patch' | 'query'> & {
203
+ /**
204
+ * Applies an optimistic update immediately before a fetch settles.
205
+ * Returns a rollback function. The optimistic state is automatically cleared
206
+ * on the next successful fetch, or rolled back on failure.
207
+ *
208
+ * @throws {Error} If an optimistic update is already active.
209
+ */
210
+ optimisticUpdate(mutator: (current: readonly T[]) => readonly T[], options?: {
211
+ total?: number;
212
+ }): () => void;
213
+ /**
214
+ * Applies one or more query changes atomically — a single fetch for any combination
215
+ * of limit, page, search, filter, and sort updates.
216
+ */
217
+ patch(changes: Partial<RemoteSourceQuery<TFilter, TSort>>): Promise<void>;
218
+ /**
219
+ * The current query state. Use `encodeQuery(source.query)` to serialize to URL params.
220
+ */
221
+ readonly query: RemoteSourceQuery<TFilter, TSort>;
222
+ ready(timeout?: number): Promise<void>;
223
+ refresh(): Promise<void>;
224
+ };
225
+ export type LocalSourceConfig<T> = Readonly<{
226
+ debounceMs?: number;
227
+ filter?: Predicate<T>;
228
+ /**
229
+ * Async filter applied after the sync `filter`, enabling Web Worker offloading
230
+ * via `@vielzeug/familiar`. Sets `meta.isLoading` to `true` during computation.
231
+ * The signal is aborted when a new computation supersedes this one.
232
+ */
233
+ filterAsync?: (items: readonly T[], signal: AbortSignal) => Promise<readonly T[]>;
234
+ /** Initial data to populate the source. When provided, pass `[]` as the first arg. */
235
+ initialData?: readonly T[];
236
+ limit?: number;
237
+ /**
238
+ * Custom search function. Default: case-insensitive JSON substring match.
239
+ * Provide a domain-specific function for better relevance on large datasets.
240
+ */
241
+ searchFn?: (items: readonly T[], query: string) => readonly T[];
242
+ sort?: Sorter<T>;
243
+ /**
244
+ * Async sort applied after the sync `sort`. Sets `meta.isLoading` to `true`
245
+ * during computation, enabling Web Worker offloading.
246
+ */
247
+ sortAsync?: (items: readonly T[], signal: AbortSignal) => Promise<readonly T[]>;
248
+ }>;
249
+ export type RemoteConfig<T, TFilter = unknown, TSort = unknown> = Readonly<{
250
+ /** Automatically fetch on construction. Default: `true`. */
251
+ autoFetch?: boolean;
252
+ /** Debounce delay in ms for `search()` calls. Default: `300`. */
253
+ debounceMs?: number;
254
+ fetch: (q: RemoteSourceQuery<TFilter, TSort>, signal: AbortSignal) => Promise<Readonly<{
255
+ items: readonly T[];
256
+ total: number;
257
+ }>>;
258
+ filter?: TFilter;
259
+ limit?: number;
260
+ /**
261
+ * Called after each fetch attempt settles (success or failure).
262
+ * Useful for logging, telemetry, and debugging.
263
+ */
264
+ onFetch?: (event: FetchEvent<RemoteSourceQuery<TFilter, TSort>>) => void;
265
+ queryKey?: (q: RemoteSourceQuery<TFilter, TSort>) => string;
266
+ /**
267
+ * Automatically re-fetch at this interval in ms. The timer is cancelled on `dispose()`.
268
+ * Useful for live dashboards and real-time data displays.
269
+ */
270
+ refreshInterval?: number;
271
+ retry?: RetryConfig;
272
+ /**
273
+ * Pre-populate the source with server-fetched data (SSR / prefetch).
274
+ * The source starts in a loaded state — no initial loading flash.
275
+ * Set `autoFetch: false` to suppress the background re-fetch when the snapshot is fresh.
276
+ */
277
+ snapshot?: SourceSnapshot<T>;
278
+ sort?: TSort;
279
+ /**
280
+ * Skip re-fetching if the last successful fetch was within this many ms.
281
+ * Returns cached data immediately. Combine with `refreshInterval` for
282
+ * stale-while-revalidate behaviour.
283
+ * Default: `0` (always re-fetch).
284
+ */
285
+ staleTime?: number;
286
+ }>;
287
+ export type CursorMeta = Readonly<{
288
+ error: SourcererError | null;
289
+ hasNextPage: boolean;
290
+ hasPrevPage: boolean;
291
+ isLoading: boolean;
292
+ isSearchPending: boolean;
293
+ pageSize: number;
294
+ totalItems: number;
295
+ }>;
296
+ export type CursorSource<T, TCursor = string> = ReactiveSource<T, CursorMeta> & {
297
+ next(): Promise<void>;
298
+ /**
299
+ * Applies one or more query changes atomically — a single fetch for any combination
300
+ * of limit and search updates.
301
+ */
302
+ patch(changes: Partial<Pick<CursorSourceQuery<TCursor>, 'limit' | 'search'>>): Promise<void>;
303
+ prev(): Promise<void>;
304
+ /** The current query state. Use `encodeQuery(source.query)` to serialize to URL params. */
305
+ readonly query: CursorSourceQuery<TCursor>;
306
+ ready(timeout?: number): Promise<void>;
307
+ refresh(): Promise<void>;
308
+ reset(): Promise<void>;
309
+ search(query: string, opts?: SearchOptions): Promise<void>;
310
+ };
311
+ export type CursorConfig<T, TCursor = string> = Readonly<{
312
+ autoFetch?: boolean;
313
+ debounceMs?: number;
314
+ fetch: (q: CursorSourceQuery<TCursor>, signal: AbortSignal) => Promise<Readonly<{
315
+ items: readonly T[];
316
+ nextCursor?: TCursor;
317
+ prevCursor?: TCursor;
318
+ total?: number;
319
+ }>>;
320
+ limit?: number;
321
+ /** Called after each fetch attempt settles. Useful for logging and telemetry. */
322
+ onFetch?: (event: FetchEvent<CursorSourceQuery<TCursor>>) => void;
323
+ queryKey?: (q: CursorSourceQuery<TCursor>) => string;
324
+ /** Automatically re-fetch at this interval in ms. Cancelled on `dispose()`. */
325
+ refreshInterval?: number;
326
+ retry?: RetryConfig;
327
+ }>;
328
+ export type InfiniteMeta = Readonly<{
329
+ error: SourcererError | null;
330
+ hasMore: boolean;
331
+ isLoading: boolean;
332
+ /** `true` only during `loadMore()` fetches — distinct from the initial load. */
333
+ isLoadingMore: boolean;
334
+ isSearchPending: boolean;
335
+ /** Number of pages appended so far. Resets to 0 on `reset()` or `search()`. */
336
+ loadedPages: number;
337
+ pageSize: number;
338
+ totalItems: number;
339
+ }>;
340
+ export type InfiniteSource<T> = ReactiveSource<T, InfiniteMeta> & {
341
+ /** Appends the next page of results to `current`. No-op when `meta.hasMore` is false. */
342
+ loadMore(): Promise<void>;
343
+ /**
344
+ * Applies one or more query changes atomically — a single fetch for any combination
345
+ * of limit and search updates. Resets accumulated pages.
346
+ */
347
+ patch(changes: Partial<Pick<InfiniteSourceQuery, 'limit' | 'search'>>): Promise<void>;
348
+ /** The current query state. Use `encodeQuery(source.query)` to serialize to URL params. */
349
+ readonly query: InfiniteSourceQuery;
350
+ /**
351
+ * Resolves when no fetch is in progress (including `loadMore` fetches).
352
+ * Rejects after `timeout` ms if still loading.
353
+ */
354
+ ready(timeout?: number): Promise<void>;
355
+ reset(): Promise<void>;
356
+ search(query: string, opts?: SearchOptions): Promise<void>;
357
+ };
358
+ export type InfiniteConfig<T> = Readonly<{
359
+ autoFetch?: boolean;
360
+ debounceMs?: number;
361
+ fetch: (q: InfiniteSourceQuery, signal: AbortSignal) => Promise<Readonly<{
362
+ items: readonly T[];
363
+ total: number;
364
+ }>>;
365
+ limit?: number;
366
+ /** Called after each fetch attempt settles. Useful for logging and telemetry. */
367
+ onFetch?: (event: FetchEvent<InfiniteSourceQuery>) => void;
368
+ /** Custom cache key function. Used to deduplicate in-flight requests. Default: stable JSON stringify. */
369
+ queryKey?: (q: InfiniteSourceQuery) => string;
370
+ /** Automatically re-fetch (reset to page 1) at this interval in ms. Cancelled on `dispose()`. */
371
+ refreshInterval?: number;
372
+ retry?: RetryConfig;
373
+ }>;
374
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@vielzeug/sourcerer",
3
+ "version": "1.0.2",
4
+ "description": "Typed data-source adapter — pagination, filtering, sorting, search, and cursor-based infinite scroll",
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/index.cjs",
10
+ "module": "./dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "source": "./src/index.ts",
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "build": "vite build && pnpm run build:bundle && pnpm run build:types",
22
+ "build:types": "tsc -p tsconfig.declarations.json",
23
+ "fix": "eslint --fix src",
24
+ "lint": "eslint src",
25
+ "prepublishOnly": "pnpm run build",
26
+ "preview": "vite preview",
27
+ "test": "vitest",
28
+ "build:bundle": "vite build --config vite.bundle.config.ts"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org/"
33
+ },
34
+ "dependencies": {
35
+ "@vielzeug/arsenal": "workspace:*"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^26.1.0",
39
+ "typescript": "~6.0.3",
40
+ "vite": "^8.1.3",
41
+ "vitest": "^4.1.9"
42
+ }
43
+ }