@candidstartup/infinisheet-types 0.12.0 → 0.13.1

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
@@ -250,6 +250,13 @@ type QueryError = InfinisheetRangeError | StorageError;
250
250
  type TruncateError = InfinisheetRangeError | StorageError;
251
251
  /** Errors that can be returned by {@link EventLog} `setMetadata` method */
252
252
  type MetadataError = InfinisheetRangeError | StorageError;
253
+ /** Value of a snapshot stored at a specific sequence id in the log */
254
+ interface SnapshotValue {
255
+ /** Sequence id of log entry that stores this snapshot */
256
+ sequenceId: SequenceId;
257
+ /** Content of snapshot in the `BlobStore` */
258
+ blobId: BlobId;
259
+ }
253
260
  /** A range of {@link LogEntry} values returned by querying an {@link EventLog} */
254
261
  interface QueryValue<T extends LogEntry> {
255
262
  /** Sequence id corresponding to the first entry in `entries`
@@ -272,9 +279,24 @@ interface QueryValue<T extends LogEntry> {
272
279
  * from `nextSequenceId`.
273
280
  */
274
281
  isComplete: boolean;
282
+ /** Most recent snapshot
283
+ *
284
+ * Returned if query includes `snapshotId` argument and
285
+ * most recent snapshot is different.
286
+ */
287
+ lastSnapshot?: SnapshotValue | undefined;
275
288
  /** The {@link LogEntry} records returned by the query */
276
289
  entries: T[];
277
290
  }
291
+ /** Result of calling {@link EventLog.addEntry} */
292
+ interface AddEntryValue {
293
+ /** Most recent snapshot
294
+ *
295
+ * Returned if query includes `snapshotId` argument and
296
+ * most recent snapshot is different.
297
+ */
298
+ lastSnapshot?: SnapshotValue | undefined;
299
+ }
278
300
  /** Abstract interface representing an event log
279
301
  *
280
302
  *
@@ -283,11 +305,16 @@ interface EventLog<T extends LogEntry> {
283
305
  /**
284
306
  * Add an entry to the log with the given sequence id
285
307
  *
286
- * The `sequenceId` must be the next available sequence id in the log. This is returned as `endSequenceId` when
287
- * making a query for the `last` entry in the log. Returns a {@link ConflictError} if not the next available id.
308
+ * @param sequenceId - The next available sequence id in the log.
309
+ * This is returned as `endSequenceId` when making a query for the `last` entry in the log.
310
+ * Returns a {@link ConflictError} if not the next available id.
311
+ *
312
+ * @param snapshotId - The sequence id for the most recent snapshot that the client is aware of.
313
+ * If there's a more recent snapshot, it's id will be returned in `AddEntryValue`.
314
+ *
288
315
  * Any other problem with serializing the entry will return a {@link StorageError}.
289
316
  */
290
- addEntry(entry: T, sequenceId: SequenceId): ResultAsync<void, AddEntryError>;
317
+ addEntry(entry: T, sequenceId: SequenceId, snapshotId?: SequenceId): ResultAsync<AddEntryValue, AddEntryError>;
291
318
  /**
292
319
  * Set some or all of a log entry's metadata fields
293
320
  *
@@ -305,11 +332,141 @@ interface EventLog<T extends LogEntry> {
305
332
  * @param end - `SequenceId` one after the last entry to return.
306
333
  * Use `'end'` to query everything to the end of the log.
307
334
  */
308
- query(start: SequenceId | 'snapshot' | 'start', end: SequenceId | 'end'): ResultAsync<QueryValue<T>, QueryError>;
335
+ query(start: SequenceId | 'snapshot' | 'start', end: SequenceId | 'end', snapshotId?: SequenceId): ResultAsync<QueryValue<T>, QueryError>;
309
336
  /** All entries prior to `start` are removed from the log. */
310
337
  truncate(start: SequenceId): ResultAsync<void, TruncateError>;
311
338
  }
312
339
 
340
+ /**
341
+ * Name of a blob or directory within a {@link BlobDir}
342
+ *
343
+ * Names MUST NOT be longer than 100 characters
344
+ */
345
+ type BlobName = string;
346
+ /**
347
+ * Invalid {@link BlobName} error
348
+ *
349
+ * Occurs when trying to pass a `BlobName` that is too long or contains invalid characters
350
+ */
351
+ interface InvalidBlobNameError extends InfinisheetError {
352
+ /** Discriminated union tag */
353
+ type: 'InvalidBlobNameError';
354
+ }
355
+ declare function invalidBlobNameError(message?: string): InvalidBlobNameError;
356
+ /**
357
+ * Error when trying to access a blob as a directory or vice versa
358
+ *
359
+ * Occurs when trying to access a blob/directory with a
360
+ * {@link BlobName} that refers to a directory/blob
361
+ */
362
+ interface BlobWrongKindError extends InfinisheetError {
363
+ /** Discriminated union tag */
364
+ type: 'BlobWrongKindError';
365
+ }
366
+ declare function notBlobError(): BlobWrongKindError;
367
+ declare function notBlobDirError(): BlobWrongKindError;
368
+ /**
369
+ * Invalid {@link BlobName} error
370
+ *
371
+ * Occurs when trying to pass a `BlobName` that is too long or contains invalid characters
372
+ */
373
+ interface NoContinuationError extends InfinisheetError {
374
+ /** Discriminated union tag */
375
+ type: 'NoContinuationError';
376
+ }
377
+ declare function noContinuationError(message?: string): NoContinuationError;
378
+ /** Errors that can be returned by {@link BlobDir.readBlob} */
379
+ type ReadBlobError = BlobWrongKindError | InvalidBlobNameError | StorageError;
380
+ /** Errors that can be returned by {@link BlobDir.writeBlob} */
381
+ type WriteBlobError = BlobWrongKindError | InvalidBlobNameError | StorageError;
382
+ /** Errors that can be returned by {@link BlobDir.removeBlob} */
383
+ type RemoveBlobError = BlobWrongKindError | InvalidBlobNameError | StorageError;
384
+ /** Errors that can be returned by {@link BlobDir.getDir} */
385
+ type GetDirError = BlobWrongKindError | InvalidBlobNameError | StorageError;
386
+ /** Errors that can be returned by {@link BlobDir.query} */
387
+ type DirQueryError = StorageError | NoContinuationError;
388
+ /** Errors that can be returned by {@link BlobDir.removeAll} */
389
+ type RemoveAllBlobDirError = StorageError;
390
+ interface BlobDirEntries<ContinuationT> {
391
+ /** Names of blobs returned by {@link BlobDir.query} */
392
+ blobs: BlobName[];
393
+ /** Names of directories returned by {@link BlobDir.query} */
394
+ dirs: BlobName[];
395
+ /** Continuation token to pass to {@link BlobDir.query} if there are more entries to retrieve */
396
+ continuation?: ContinuationT | undefined;
397
+ }
398
+ /**
399
+ * Directory that contains blobs and other directories within a {@link BlobStore}
400
+ */
401
+ interface BlobDir<ContinuationT> {
402
+ /** Read the content of a blob with the specified name.
403
+ *
404
+ * The returned content array is read only and immutable.
405
+ */
406
+ readBlob(name: BlobName): ResultAsync<Uint8Array, ReadBlobError>;
407
+ /** Write the specified content to a blob with the specified name.
408
+ *
409
+ * Any existing blob with that name is overwritten, otherwise a new blob is created.
410
+ * The content array is treated as read only and must be immutable until the operation completes.
411
+ */
412
+ writeBlob(name: BlobName, content: Uint8Array): ResultAsync<void, WriteBlobError>;
413
+ /** Remove blob with the specified name. */
414
+ removeBlob(name: BlobName): ResultAsync<void, RemoveBlobError>;
415
+ /** Get a {@link BlobDir} corresponding to the subdirectory with the specified name
416
+ *
417
+ * Subdirectories are "created" on demand
418
+ */
419
+ getDir(name: BlobName): ResultAsync<BlobDir<ContinuationT>, GetDirError>;
420
+ /** Query for blobs and sub-directories within this directory
421
+ *
422
+ * The order of entries returned is undefined.
423
+ *
424
+ * Can optionally pass a continuation token returned by the previous call to retrieve additional entries.
425
+ */
426
+ query(continuation?: ContinuationT): ResultAsync<BlobDirEntries<ContinuationT>, DirQueryError>;
427
+ /** Remove this directory and it's contents, recursively */
428
+ removeAll(): ResultAsync<void, RemoveAllBlobDirError>;
429
+ }
430
+ /** Errors that can be returned by {@link BlobStore.getRootDir} */
431
+ type GetRootDirError = StorageError;
432
+ /** Abstract interface representing a Blob store
433
+ *
434
+ * Modeled as a hierarchy of directories and blobs
435
+ */
436
+ interface BlobStore<ContinuationT> {
437
+ /** Returns the root {@link BlobDir} for the store*/
438
+ getRootDir(): ResultAsync<BlobDir<ContinuationT>, GetRootDirError>;
439
+ }
440
+
441
+ interface WorkerMessage {
442
+ /** Used as a discriminated union tag by implementations */
443
+ type: string;
444
+ }
445
+ interface PendingWorkflowMessage extends WorkerMessage {
446
+ type: "PendingWorkflowMessage";
447
+ /** Workflow requested */
448
+ workflow: WorkflowId;
449
+ /** Sequence id of log entry that requested workflow */
450
+ sequenceId: SequenceId;
451
+ }
452
+ /** Type of handler function for {@link InfiniSheetWorker.onReceiveMessage} */
453
+ type MessageHandler<MessageT extends WorkerMessage> = (message: MessageT) => ResultAsync<void, InfinisheetError>;
454
+ interface WorkerHost<MessageT extends WorkerMessage> {
455
+ /**
456
+ * Place holder until we have some real implementation. Need something concrete
457
+ * to stop TypeScript moaning about the unused generic parameter and implementations
458
+ * without any properties in common with the interface they're implementing.
459
+ * @internal
460
+ */
461
+ isHost(): this is WorkerHost<MessageT>;
462
+ }
463
+ interface PostMessageWorkerHost<MessageT extends WorkerMessage> extends WorkerHost<MessageT> {
464
+ postMessage(message: MessageT): void;
465
+ }
466
+ interface InfiniSheetWorker<MessageT extends WorkerMessage> {
467
+ onReceiveMessage: MessageHandler<MessageT> | undefined;
468
+ }
469
+
313
470
  /**
314
471
  * Interface used to determine the size and positioning offset for items in a single dimension.
315
472
  */
@@ -383,6 +540,30 @@ interface CellError {
383
540
  * explicitly marked as empty.
384
541
  */
385
542
  type CellValue = string | number | boolean | null | undefined | CellError;
543
+ /** Format of cell typically used when displaying numbers */
544
+ type CellFormat = string | undefined;
545
+ /** Data stored in a spreadsheet cell */
546
+ interface CellData {
547
+ /** Value of cell */
548
+ value: CellValue;
549
+ /** Format of cell */
550
+ format?: CellFormat;
551
+ }
552
+ /** A viewport onto the spreadsheet. Usually the portion of the spreadsheet visible on-screen. */
553
+ interface SpreadsheetViewport {
554
+ /** Offset down the rows to the start of the viewport (using {@link ItemOffsetMapping} offsets) */
555
+ rowMinOffset: number;
556
+ /** Offset along the columns to the start of the viewport (using {@link ItemOffsetMapping} offsets) */
557
+ columnMinOffset: number;
558
+ /** Viewport width */
559
+ width: number;
560
+ /** Viewport height */
561
+ height: number;
562
+ }
563
+ /** Are two viewports equal by value? */
564
+ declare function equalViewports(a: SpreadsheetViewport | undefined, b: SpreadsheetViewport | undefined): boolean;
565
+ /** Creates an empty viewport */
566
+ declare function emptyViewport(): SpreadsheetViewport;
386
567
  /** Types of error that can be returned by {@link SpreadsheetData} methods */
387
568
  type SpreadsheetDataError = ValidationError | StorageError;
388
569
  /**
@@ -418,19 +599,31 @@ interface SpreadsheetData<Snapshot> {
418
599
  /** Value of specified cell using 0-based row and column indexes */
419
600
  getCellValue(snapshot: Snapshot, row: number, column: number): CellValue;
420
601
  /** Format of specified cell using 0-based row and column indexes */
421
- getCellFormat(snapshot: Snapshot, row: number, column: number): string | undefined;
602
+ getCellFormat(snapshot: Snapshot, row: number, column: number): CellFormat;
422
603
  /** Set value and format of specified cell
423
604
  *
424
605
  * @returns `Ok` if the change was successfully applied
425
606
  */
426
- setCellValueAndFormat(row: number, column: number, value: CellValue, format: string | undefined): ResultAsync<void, SpreadsheetDataError>;
607
+ setCellValueAndFormat(row: number, column: number, value: CellValue, format: CellFormat): ResultAsync<void, SpreadsheetDataError>;
427
608
  /** Check whether value and format are valid to set for specified cell
428
609
  *
429
610
  * @returns `Ok` if the value and format are valid
430
611
  */
431
- isValidCellValueAndFormat(row: number, column: number, value: CellValue, format: string | undefined): Result<void, ValidationError>;
612
+ isValidCellValueAndFormat(row: number, column: number, value: CellValue, format: CellFormat): Result<void, ValidationError>;
613
+ /** Set viewport of interest
614
+ *
615
+ * Can be used by `SpreadsheetData` implementations to optimize data retrieval and memory usage.
616
+ * Queries for cells outside the viewport *may* return `undefined`. Clients should not rely on any particular behavior
617
+ * for queries outside the viewport.
618
+ *
619
+ * Set to undefined (the default) if the client needs access to the entire spreadsheet
620
+ */
621
+ setViewport(viewport: SpreadsheetViewport | undefined): void;
622
+ /** Return the viewport in force (if any) */
623
+ getViewport(snapshot: Snapshot): SpreadsheetViewport | undefined;
432
624
  }
433
625
  declare class EmptySpreadsheetData implements SpreadsheetData<number> {
626
+ constructor();
434
627
  subscribe(_onDataChange: () => void): () => void;
435
628
  getSnapshot(): number;
436
629
  getLoadStatus(_snapshot: number): Result<boolean, StorageError>;
@@ -440,8 +633,11 @@ declare class EmptySpreadsheetData implements SpreadsheetData<number> {
440
633
  getColumnItemOffsetMapping(_snapshot: number): ItemOffsetMapping;
441
634
  getCellValue(_snapshot: number, _row: number, _column: number): CellValue;
442
635
  getCellFormat(_snapshot: number, _row: number, _column: number): string | undefined;
443
- setCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: string | undefined): ResultAsync<void, SpreadsheetDataError>;
444
- isValidCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: string | undefined): Result<void, ValidationError>;
636
+ setCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: CellFormat): ResultAsync<void, SpreadsheetDataError>;
637
+ isValidCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: CellFormat): Result<void, ValidationError>;
638
+ setViewport(viewport: SpreadsheetViewport | undefined): void;
639
+ getViewport(_snapshot: number): SpreadsheetViewport | undefined;
640
+ private viewport;
445
641
  }
446
642
 
447
643
  /** Classic Spreadsheet reference to Column (e.g "A") */
@@ -461,5 +657,5 @@ declare function rowColRefToCoords(ref: RowColRef): RowColCoords;
461
657
  /** Converts {@link RowColCoords} to a {@link RowColRef} */
462
658
  declare function rowColCoordsToRef(row: number | undefined, col: number | undefined): RowColRef;
463
659
 
464
- export { EmptySpreadsheetData, FixedSizeItemOffsetMapping, ResultAsync, VariableSizeItemOffsetMapping, colRefToIndex, conflictError, err, errAsync, indexToColRef, infinisheetRangeError, ok, okAsync, rowColCoordsToRef, rowColRefToCoords, splitRowColRef, storageError, validationError };
465
- export type { AddEntryError, BlobId, CellError, CellErrorValue, CellValue, ColRef, ConflictError, Err, EventLog, InfinisheetError, InfinisheetRangeError, ItemOffsetMapping, LogEntry, LogMetadata, MetadataError, Ok, QueryError, QueryValue, Result, RowColCoords, RowColRef, SequenceId, SpreadsheetData, SpreadsheetDataError, StorageError, TruncateError, ValidationError, WorkflowId };
660
+ export { EmptySpreadsheetData, FixedSizeItemOffsetMapping, ResultAsync, VariableSizeItemOffsetMapping, colRefToIndex, conflictError, emptyViewport, equalViewports, err, errAsync, indexToColRef, infinisheetRangeError, invalidBlobNameError, noContinuationError, notBlobDirError, notBlobError, ok, okAsync, rowColCoordsToRef, rowColRefToCoords, splitRowColRef, storageError, validationError };
661
+ export type { AddEntryError, AddEntryValue, BlobDir, BlobDirEntries, BlobId, BlobName, BlobStore, BlobWrongKindError, CellData, CellError, CellErrorValue, CellFormat, CellValue, ColRef, ConflictError, DirQueryError, Err, EventLog, GetDirError, GetRootDirError, InfiniSheetWorker, InfinisheetError, InfinisheetRangeError, InvalidBlobNameError, ItemOffsetMapping, LogEntry, LogMetadata, MessageHandler, MetadataError, NoContinuationError, Ok, PendingWorkflowMessage, PostMessageWorkerHost, QueryError, QueryValue, ReadBlobError, RemoveAllBlobDirError, RemoveBlobError, Result, RowColCoords, RowColRef, SequenceId, SnapshotValue, SpreadsheetData, SpreadsheetDataError, SpreadsheetViewport, StorageError, TruncateError, ValidationError, WorkerHost, WorkerMessage, WorkflowId, WriteBlobError };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ok as ok$1, err as err$1, ResultAsync as ResultAsync$1, okAsync as okAsync$1, errAsync as errAsync$1 } from 'neverthrow';
1
+ import { ok as ok$1, err as err$1, ResultAsync as ResultAsync$1, errAsync as errAsync$1, okAsync as okAsync$1 } from 'neverthrow';
2
2
 
3
3
  function ok(value) {
4
4
  return ok$1(value);
@@ -48,6 +48,15 @@ function conflictError(message, nextSequenceId) {
48
48
  return { type: 'ConflictError', message, nextSequenceId };
49
49
  }
50
50
 
51
+ function invalidBlobNameError(message) {
52
+ return { type: 'InvalidBlobNameError', message: message ? message : "Invalid Blob Name" };
53
+ }
54
+ function notBlobError() { return { type: 'BlobWrongKindError', message: "Not a blob" }; }
55
+ function notBlobDirError() { return { type: 'BlobWrongKindError', message: "Not a blob dir" }; }
56
+ function noContinuationError(message) {
57
+ return { type: 'NoContinuationError', message: message ? message : "Can't continue query, start again" };
58
+ }
59
+
51
60
  /**
52
61
  * Implementation of {@link ItemOffsetMapping} for use when all items have a fixed size
53
62
  */
@@ -119,9 +128,27 @@ class VariableSizeItemOffsetMapping {
119
128
  sizes;
120
129
  }
121
130
 
131
+ /** Are two viewports equal by value? */
132
+ function equalViewports(a, b) {
133
+ if (a === b)
134
+ return true;
135
+ if (!a || !b)
136
+ return false;
137
+ return a.rowMinOffset === b.rowMinOffset &&
138
+ a.columnMinOffset === b.columnMinOffset &&
139
+ a.width === b.width &&
140
+ a.height === b.height;
141
+ }
142
+ /** Creates an empty viewport */
143
+ function emptyViewport() {
144
+ return { rowMinOffset: 0, columnMinOffset: 0, width: 0, height: 0 };
145
+ }
122
146
  const rowItemOffsetMapping = new FixedSizeItemOffsetMapping(30);
123
147
  const columnItemOffsetMapping = new FixedSizeItemOffsetMapping(100);
124
148
  class EmptySpreadsheetData {
149
+ constructor() {
150
+ this.viewport = undefined;
151
+ }
125
152
  subscribe(_onDataChange) { return () => { }; }
126
153
  getSnapshot() { return 0; }
127
154
  getLoadStatus(_snapshot) { return ok(true); }
@@ -133,6 +160,9 @@ class EmptySpreadsheetData {
133
160
  getCellFormat(_snapshot, _row, _column) { return undefined; }
134
161
  setCellValueAndFormat(_row, _column, _value, _format) { return errAsync(storageError("Not implemented", 501)); }
135
162
  isValidCellValueAndFormat(_row, _column, _value, _format) { return ok(); }
163
+ setViewport(viewport) { this.viewport = viewport; }
164
+ getViewport(_snapshot) { return this.viewport; }
165
+ viewport;
136
166
  }
137
167
 
138
168
  /** Converts a {@link ColRef} to the 0-based index of the column */
@@ -190,5 +220,5 @@ function rowColCoordsToRef(row, col) {
190
220
  }
191
221
  }
192
222
 
193
- export { EmptySpreadsheetData, FixedSizeItemOffsetMapping, ResultAsync, VariableSizeItemOffsetMapping, colRefToIndex, conflictError, err, errAsync, indexToColRef, infinisheetRangeError, ok, okAsync, rowColCoordsToRef, rowColRefToCoords, splitRowColRef, storageError, validationError };
223
+ export { EmptySpreadsheetData, FixedSizeItemOffsetMapping, ResultAsync, VariableSizeItemOffsetMapping, colRefToIndex, conflictError, emptyViewport, equalViewports, err, errAsync, indexToColRef, infinisheetRangeError, invalidBlobNameError, noContinuationError, notBlobDirError, notBlobError, ok, okAsync, rowColCoordsToRef, rowColRefToCoords, splitRowColRef, storageError, validationError };
194
224
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/Result.ts","../src/ResultAsync.ts","../src/Error.ts","../src/EventLog.ts","../src/FixedSizeItemOffsetMapping.ts","../src/VariableSizeItemOffsetMapping.ts","../src/SpreadsheetData.ts","../src/RowColRef.ts"],"sourcesContent":["import type { Ok as neverthrow_Ok, Err as neverthrow_Err } from \"neverthrow\";\nimport { err as neverthrow_err, ok as neverthrow_ok } from \"neverthrow\";\n\n/**\n * An `Ok` instance is the *successful* variant of the {@link Result} type, \n * representing a successful outcome from an operation which may fail.\n * \n * Implemented using [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n */\nexport interface Ok<T,E> extends neverthrow_Ok<T,E> {}\n\n/**\n * An `Err` instance is the failure variant of the {@link Result} type, \n * representing a failure outcome from an operation which may fail.\n * \n * Implemented using [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n */\nexport interface Err<T,E> extends neverthrow_Err<T,E> {}\n\n/**\n * A `Result` represents success ({@link Ok}) or failure ({@link Err}).\n * \n * Compatible with [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n */\nexport type Result<T,E> = Ok<T,E> | Err<T,E>;\n\n/**\n * Create an instance of {@link Ok}.\n *\n * If you need to create an instance with a specific type (as you do whenever you\n * are not constructing immediately for a function return or as an argument to a\n * function), you can use a type parameter:\n *\n * ```ts\n * const yayNumber = ok<number, string>(12);\n * ```\n *\n * Note: passing nothing will produce a `Result<void, E>`, passing `undefined` will\n * produce a `Result<undefined, E>` which is compatible with `Result<void, E>`.\n *\n * ```ts\n * const normalResult = ok<number, string>(42);\n * const explicitUndefined = ok<undefined, string>(undefined);\n * const implicitVoid = ok<void, string>();\n * ```\n *\n * In the context of an immediate function return, or an arrow function with a\n * single expression value, you do not have to specify the types, so this can be\n * quite convenient.\n *\n * ```ts\n * const arrowValidate = (data: SomeData): Result<void, string> =>\n * isValid(data) ? ok() : err('something was wrong!');\n *\n * function fnValidate(data: someData): Result<void, string> {\n * return isValid(data) ? ok() : err('something was wrong');\n * }\n * ```\n *\n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n * @param value - The value to wrap in a `Result.Ok`.\n */\nexport function ok<T, E = never>(value: T): Ok<T, E>\nexport function ok<_T extends void = void, E = never>(value: void): Ok<void, E>\nexport function ok<T, E = never>(value: T): Ok<T, E> {\n return neverthrow_ok<T,E>(value); \n}\n\n/**\n * Create an instance of {@link Err}.\n *\n * If you need to create an instance with a specific type (as you do whenever you\n * are not constructing immediately for a function return or as an argument to a\n * function), you can use a type parameter:\n *\n * ```ts\n * const notString = err<number, string>('something went wrong');\n * ```\n *\n * Note: passing nothing will produce a `Result<T, void>`, passing `undefined` will\n * produce a `Result<T, undefined>` which is compatible with `Result<T, void>`.\n *\n * ```ts\n * const normalResult = err<number, string>('oh no');\n * const explicitUndefined = err<number, undefined>(undefined);\n * const implicitVoid = err<number, void>();\n * ```\n *\n * In the context of an immediate function return, or an arrow function with a\n * single expression value, you do not have to specify the types, so this can be\n * quite convenient.\n *\n * ```ts\n * const arrowValidate = (data: SomeData): Result<number, string> =>\n * isValid(data) ? ok(42) : err('something went wrong');\n *\n * function fnValidate(data: someData): Result<number, string> {\n * return isValid(data) ? ok(42) : err('something went wrong');\n * }\n * ```\n *\n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n * @param err - The value to wrap in a `Result.Err`.\n */\nexport function err<T = never, E extends string = string>(err: E): Err<T, E>\nexport function err<T = never, E = unknown>(err: E): Err<T, E>\nexport function err<T = never, _E extends void = void>(err: void): Err<T, void>\nexport function err<T = never, E = unknown>(err: E): Err<T, E> {\n return neverthrow_err<T,E>(err)\n}\n","import { errAsync as neverthrow_errAsync, okAsync as neverthrow_okAsync, ResultAsync as neverthrow_ResultAsync } from \"neverthrow\";\n\n// Needed for Intellisense links\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { Result, Ok, Err } from \"./Result\"\n\n/**\n * `ResultAsync` allows you to work with asynchronous Results in a type safe way\n * \n * `ResultAsync<T,E>` is a wrapper around `Promise<Result<T,E>>` which provides the same methods for chaining different\n * `Result` and `ResultAsync` together as {@link Result}, while also chaining the asynchronous operations together using\n * `Promise.then`.\n * \n * `ResultAsync` is *thenable* (implements `PromiseLike<T>`) so can be used in most places that a `Promise` can, including with `await`.\n * \n * Compatible with [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `ResultAsync` for the success case\n * @typeParam E - The type of the error contained in the `ResultAsync` for the failure case\n */\nexport class ResultAsync<T,E> extends neverthrow_ResultAsync<T,E> {}\n\n/**\n * Create an instance of `ResultAsync` containing an {@link Ok} variant of {@link Result}\n *\n * Equivalent to `new ResultAsync(Promise.resolve(new Ok(value)))`\n *\n * @typeParam T - The type of the value contained in the `ResultAsync` for the success case\n * @typeParam E - The type of the error contained in the `ResultAsync` for the failure case\n * @param value - The value to wrap in a `Result.Ok`.\n */\nexport function okAsync<T, E = never>(value: T): ResultAsync<T, E>\nexport function okAsync<_T extends void = void, E = never>(value: void): ResultAsync<void, E>\nexport function okAsync<T, E = never>(value: T): ResultAsync<T, E> {\n return neverthrow_okAsync(value);\n}\n\n/**\n * Create an instance of `ResultAsync` containing an {@link Err} variant of {@link Result}\n *\n * Equivalent to `new ResultAsync(Promise.resolve(new Err(err)))`\n *\n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n * @param err - The value to wrap in a `Result.Err`.\n */\nexport function errAsync<T = never, E = unknown>(err: E): ResultAsync<T, E>\nexport function errAsync<T = never, _E extends void = void>(err: void): ResultAsync<T, void>\nexport function errAsync<T = never, E = unknown>(err: E): ResultAsync<T, E> {\n return neverthrow_errAsync<T,E>(err)\n}\n","/** Common properties for Infinisheet errors */\nexport interface InfinisheetError {\n /** Discriminated union tag */\n type: string,\n\n /** End user message describing the problem */\n message: string,\n}\n\n/** \n * Attempt to access data that is outside the available range\n * \n */\nexport interface InfinisheetRangeError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'InfinisheetRangeError',\n\n};\n\n/** Convenience method that creates an {@link InfinisheetRangeError} */\nexport function infinisheetRangeError(message: string): InfinisheetRangeError {\n return { type: 'InfinisheetRangeError', message };\n}\n\n/** Type that represents an error when validating data passed to an API */\nexport interface ValidationError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'ValidationError'\n};\n\n/** Convenience method that creates a {@link ValidationError} */\nexport function validationError(message: string): ValidationError {\n return { type: 'ValidationError', message };\n}\n\n/** Type that represents an error when accessing data in persistent storage */\nexport interface StorageError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'StorageError',\n\n /** HTTP style status code\n * \n * Describes the type of problem encountered. Expected to be a 4XX or 5XX code.\n */\n statusCode?: number | undefined,\n};\n\n/** Convenience method that creates a {@link StorageError} */\nexport function storageError(message: string, statusCode?: number): StorageError {\n return { type: 'StorageError', message, statusCode };\n}","import { ResultAsync } from \"./ResultAsync\";\nimport { StorageError, InfinisheetError, InfinisheetRangeError } from \"./Error\"\n\n/** Identifier for a blob of data in a blob store */\nexport type BlobId = string;\n\n/** Identifier for a workflow triggered writing to {@link LogMetadata.pending} */\nexport type WorkflowId = string;\n\n/** \n * Identifier for an entry in an {@link EventLog}.\n * \n * Incrementing integer.\n*/\nexport type SequenceId = bigint;\n\n/**\n * Metadata stored in an {@link EventLog} entry\n */\nexport interface LogMetadata {\n /** Stores a reference to a snapshot of the complete log up to and including this entry */\n snapshot?: BlobId | undefined;\n\n /** Stores a reference to an external history of the event log up to and including the previous entry */\n history?: BlobId | undefined;\n\n /** Indicates that a background workflow is pending */\n pending?: WorkflowId | undefined;\n}\n\n/** \n * Type that represents an entry in an {@link EventLog}\n * \n * Base interface that clients will typically implement multiple times.\n * Each concrete implementation will define its own data properties that\n * need to be serialized into the event log.\n * \n * Properties defined here are common metadata which require special handling\n * by any `EventLog` implementation.\n * \n * All data properties are immutable once an entry has been added to the log. Metadata\n * properties (apart from `type`) may change over time.\n */\nexport interface LogEntry extends LogMetadata {\n /** Used as a discriminated union tag by implementations */\n type: string;\n};\n\n/** \n * Type that represents a consistency conflict when adding a {@link LogEntry} to an {@link EventLog}\n * \n * Occurs when an attempt is made to add an entry with a sequence id that is not\n * the next available in the log.\n * \n * Typically happens when another client makes a change since you last read the log.\n * Sync with the additional log entries and then try again.\n */\nexport interface ConflictError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'ConflictError',\n\n /** Next available sequence id */\n nextSequenceId: SequenceId;\n};\n\n/** Convenience method that creates a {@link ConflictError} */\nexport function conflictError(message: string, nextSequenceId: SequenceId): ConflictError {\n return { type: 'ConflictError', message, nextSequenceId };\n}\n\n/** Errors that can be returned by {@link EventLog} `addEntry` method */\nexport type AddEntryError = ConflictError | StorageError;\n\n/** Errors that can be returned by {@link EventLog} `query` method */\nexport type QueryError = InfinisheetRangeError | StorageError;\n\n/** Errors that can be returned by {@link EventLog} `truncate` method */\nexport type TruncateError = InfinisheetRangeError | StorageError;\n\n/** Errors that can be returned by {@link EventLog} `setMetadata` method */\nexport type MetadataError = InfinisheetRangeError | StorageError;\n\n/** A range of {@link LogEntry} values returned by querying an {@link EventLog} */\nexport interface QueryValue<T extends LogEntry> {\n /** Sequence id corresponding to the first entry in `entries`\n * \n * All other entries have consecutive ascending sequence ids\n */\n startSequenceId: SequenceId;\n\n /** \n * Sequence id after the final entry in `entries`\n * \n * If query was up to the `end` sequence id AND\n * `isComplete` is true, this is the next available\n * sequence id for `addEntry`. \n */\n endSequenceId: SequenceId;\n\n /** True if all the requested entries have been returned\n * \n * Queries may return fewer entries than requested. If \n * `isComplete` is `false`, repeat the query starting\n * from `nextSequenceId`.\n */\n isComplete: boolean;\n\n /** The {@link LogEntry} records returned by the query */\n entries: T[];\n}\n\n/** Abstract interface representing an event log\n * \n * \n */\nexport interface EventLog<T extends LogEntry> {\n /** \n * Add an entry to the log with the given sequence id\n * \n * The `sequenceId` must be the next available sequence id in the log. This is returned as `endSequenceId` when\n * making a query for the `last` entry in the log. Returns a {@link ConflictError} if not the next available id.\n * Any other problem with serializing the entry will return a {@link StorageError}.\n */\n addEntry(entry: T, sequenceId: SequenceId): ResultAsync<void,AddEntryError>;\n\n /**\n * Set some or all of a log entry's metadata fields\n *\n * Changes are atomic. Either all of the specified fields are updated or none are.\n */\n setMetadata(sequenceId: SequenceId, metaData: LogMetadata): ResultAsync<void,MetadataError>;\n\n /** Return a range of entries from `first` to `last` inclusive \n * \n * The event log may return fewer entries than requested. If so, repeat the query starting from `nextSequenceId`.\n * \n * @param start - `SequenceId` of first entry to return. \n * Use `'start'` to query from the first entry in the log. \n * Use `'snapshot'` to query from the most recent entry with a snapshot, or the first if no snapshot is defined.\n * \n * @param end - `SequenceId` one after the last entry to return.\n * Use `'end'` to query everything to the end of the log.\n */\n query(start: SequenceId | 'snapshot' | 'start', end: SequenceId | 'end'): ResultAsync<QueryValue<T>,QueryError>;\n\n /** All entries prior to `start` are removed from the log. */\n truncate(start: SequenceId): ResultAsync<void,TruncateError>\n}","import type { ItemOffsetMapping } from './ItemOffsetMapping';\n\n/**\n * Implementation of {@link ItemOffsetMapping} for use when all items have a fixed size\n */\nexport class FixedSizeItemOffsetMapping implements ItemOffsetMapping {\n /**\n * @param itemSize - Size to use for all items\n */\n constructor (itemSize: number) {\n this.fixedItemSize = itemSize;\n }\n\n itemSize(_itemIndex: number): number {\n return this.fixedItemSize;\n }\n\n itemOffset(itemIndex: number): number {\n return itemIndex * this.fixedItemSize;\n }\n\n offsetToItem(offset: number): [itemIndex: number, startOffset: number] {\n const itemIndex = Math.floor(offset / this.fixedItemSize);\n const startOffset = itemIndex * this.fixedItemSize;\n\n return [itemIndex, startOffset];\n }\n\n private fixedItemSize: number;\n}\n\n","import type { ItemOffsetMapping } from './ItemOffsetMapping';\n\n/**\n * Implementation of {@link ItemOffsetMapping} for use when initial items have variable sizes.\n */\nexport class VariableSizeItemOffsetMapping implements ItemOffsetMapping {\n /**\n * @param defaultItemSize - Size to use for all other items\n * @param sizes - Array of sizes to use for the initial items, one size per item\n */\n constructor (defaultItemSize: number, sizes: number[]) {\n this.defaultItemSize = defaultItemSize;\n this.sizes = sizes;\n }\n\n itemSize(itemIndex: number): number {\n return (itemIndex < this.sizes.length) ? this.sizes[itemIndex]! : this.defaultItemSize;\n }\n\n itemOffset(itemIndex: number): number {\n let offset = 0;\n let length = this.sizes.length;\n if (itemIndex > length) {\n const numDefaultSize = itemIndex - length;\n offset = numDefaultSize * this.defaultItemSize;\n } else {\n length = itemIndex;\n }\n \n for (let i = 0; i < length; i ++)\n {\n offset += this.sizes[i]!;\n }\n\n return offset;\n }\n\n offsetToItem(offset: number): [itemIndex: number, startOffset: number] {\n let startOffset = 0;\n for (const [i,size] of this.sizes.entries()) {\n if (startOffset + size > offset) {\n return [i, startOffset];\n }\n startOffset += size;\n }\n\n const itemIndex = Math.floor((offset - startOffset) / this.defaultItemSize);\n startOffset += itemIndex * this.defaultItemSize;\n\n const length = this.sizes.length;\n return [itemIndex+length, startOffset];\n }\n\n private defaultItemSize: number;\n private sizes: number[];\n}\n","import type { ItemOffsetMapping } from \"./ItemOffsetMapping\";\nimport { FixedSizeItemOffsetMapping } from \"./FixedSizeItemOffsetMapping\";\nimport { Result, ok } from \"./Result\";\nimport { ResultAsync, errAsync } from \"./ResultAsync\";\nimport { ValidationError, StorageError, storageError } from \"./Error\";\n\n/** Possible spreadsheet error values\n * \n * Includes those that can be returned by `ERROR.TYPE` and additional values\n * introduced by more recent versions of Excel.\n*/\nexport type CellErrorValue = '#NULL!' | \n '#DIV/0!' |\n '#VALUE!' |\n '#REF!' |\n '#NAME?' |\n '#NUM!' |\n '#N/A' |\n '#GETTING_DATA' |\n '#SPILL!' |\n '#UNKNOWN!' |\n '#FIELD!' |\n '#CALC!';\n\n/** Type that represents an error value stored in a cell\n * \n * Defined as a discriminated union so that additional cell value types\n * can be added in future.\n */\nexport interface CellError {\n /** Discriminated union tag */\n type: 'CellError',\n\n /** {@link CellErrorValue | Error Value} */\n value: CellErrorValue;\n};\n\n/** Possible types for a cell value \n * \n * The native JavaScript types string, number and boolean represent the *Text*, *Number* and *Logical*\n * spreadsheet data types. {@link CellError} represents an *Error Value*.\n * \n * Undefined is used to represent a cell with no defined value. Null represents a cell that has been\n * explicitly marked as empty. \n*/\nexport type CellValue = string | number | boolean | null | undefined | CellError\n\n/** Types of error that can be returned by {@link SpreadsheetData} methods */\nexport type SpreadsheetDataError = ValidationError | StorageError;\n\n/**\n * Interface used to access the data in a spreadsheet\n * \n * The data exposed through the interface may change over time outside of any changes made through the interface. The caller\n * can use the {@link subscribe} method to be notified when the data changes. When reading data, the caller must first request\n * a snapshot using {@link getSnapshot}. All values returned by gettors are relative to a specified snapshot. The values will be\n * consistent with each other as long as the same snapshot is used.\n * \n * @typeParam Snapshot - Type of snapshot. Implementations are free to use whatever type makes sense for them.\n */\nexport interface SpreadsheetData<Snapshot> {\n /** Subscribe to data changes */\n subscribe(onDataChange: () => void): () => void,\n\n /** Return a snapshot to use when accessing values at a consistent point in time */\n getSnapshot(): Snapshot,\n\n /** \n * Return load status at the time the snapshot was created \n * \n * On Success returns true if load has completed, false if still in progress\n * On Err returns most recent error reported by the storage system\n */\n getLoadStatus(snapshot: Snapshot): Result<boolean,StorageError>,\n\n /** Number of rows in the spreadsheet */\n getRowCount(snapshot: Snapshot): number,\n\n /** {@link ItemOffsetMapping} which describes sizes and offsets to start of rows */\n getRowItemOffsetMapping(snapshot: Snapshot): ItemOffsetMapping,\n\n /** Number of columns in the spreadsheet */\n getColumnCount(snapshot: Snapshot): number,\n\n /** {@link ItemOffsetMapping} which describes sizes and offsets to start of columns */\n getColumnItemOffsetMapping(snapshot: Snapshot): ItemOffsetMapping,\n\n /** Value of specified cell using 0-based row and column indexes */\n getCellValue(snapshot: Snapshot, row: number, column: number): CellValue;\n\n /** Format of specified cell using 0-based row and column indexes */\n getCellFormat(snapshot: Snapshot, row: number, column: number): string | undefined;\n\n /** Set value and format of specified cell\n * \n * @returns `Ok` if the change was successfully applied\n */\n setCellValueAndFormat(row: number, column: number, value: CellValue, format: string | undefined): ResultAsync<void,SpreadsheetDataError>\n\n /** Check whether value and format are valid to set for specified cell\n * \n * @returns `Ok` if the value and format are valid\n */\n isValidCellValueAndFormat(row: number, column: number, value: CellValue, format: string | undefined): Result<void,ValidationError>\n}\n\nconst rowItemOffsetMapping = new FixedSizeItemOffsetMapping(30);\nconst columnItemOffsetMapping = new FixedSizeItemOffsetMapping(100);\n\nexport class EmptySpreadsheetData implements SpreadsheetData<number> {\n subscribe(_onDataChange: () => void) { return () => {}; }\n getSnapshot() { return 0; }\n \n getLoadStatus(_snapshot: number): Result<boolean,StorageError> { return ok(true); }\n getRowCount(_snapshot: number) { return 0; }\n getRowItemOffsetMapping(_snapshot: number): ItemOffsetMapping { return rowItemOffsetMapping; }\n getColumnCount(_snapshot: number) { return 0; }\n getColumnItemOffsetMapping(_snapshot: number): ItemOffsetMapping { return columnItemOffsetMapping; }\n getCellValue(_snapshot: number, _row: number, _column: number): CellValue { return null; }\n getCellFormat(_snapshot: number, _row: number, _column: number): string|undefined { return undefined; }\n setCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: string | undefined): ResultAsync<void,SpreadsheetDataError> \n { return errAsync(storageError(\"Not implemented\", 501)); }\n isValidCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: string | undefined): Result<void,ValidationError> \n { return ok(); }\n}\n\n","/** Classic Spreadsheet reference to Column (e.g \"A\") */\nexport type ColRef = string;\n\n/** Classic Spreadsheet reference to Cell (e.g. \"A1\"), Row (e.g. \"1\") or Column (e.g \"A\") */\nexport type RowColRef = string;\n\n/** Equivalent to {@link RowColRef} as coordinate pair. \"A1\" has coords [0,0], \"1\" is [0,undefined] and \"A\" is [undefined,0] */\nexport type RowColCoords = [row: number|undefined, col: number|undefined];\n\n/** Converts a {@link ColRef} to the 0-based index of the column */\nexport function colRefToIndex(col: ColRef): number {\n let n = 0;\n for (let i = 0; i < col.length; i ++) {\n n = col.charCodeAt(i) - 64 + n * 26;\n }\n return n-1;\n}\n\n/** Converts a 0-based column index to a {@link ColRef} */\nexport function indexToColRef(index: number): ColRef {\n let ret = \"\";\n index ++;\n while (index > 0) {\n index --;\n const remainder = index % 26;\n index = Math.floor(index / 26);\n ret = String.fromCharCode(65+remainder) + ret;\n }\n return ret;\n}\n\n/** Splits a RowColRef into a 0-based row index and a {@link ColRef} */\nexport function splitRowColRef(ref: RowColRef): [row: number|undefined, col: ColRef|undefined] {\n const re = /^([A-Z]*)(\\d*)$/;\n const found = ref.match(re);\n if (!found)\n return [undefined,undefined];\n\n const col = found[1];\n const row = found[2] ? parseInt(found[2]) : 0;\n return [(row>0) ? row-1 : undefined, col ? col : undefined];\n}\n\n/** Converts a {@link RowColRef} to {@link RowColCoords} */\nexport function rowColRefToCoords(ref: RowColRef): RowColCoords {\n const [row,col] = splitRowColRef(ref);\n return [row, col ? colRefToIndex(col) : undefined];\n}\n\n/** Converts {@link RowColCoords} to a {@link RowColRef} */\nexport function rowColCoordsToRef(row: number|undefined, col: number|undefined): RowColRef {\n if (row !== undefined) {\n if (col !== undefined) {\n return indexToColRef(col) + (row+1);\n } else {\n return (row+1).toString();\n }\n } else {\n if (col !== undefined) {\n return indexToColRef(col);\n } else {\n return \"\";\n }\n }\n}"],"names":["neverthrow_ok","neverthrow_err","neverthrow_ResultAsync","neverthrow_okAsync","neverthrow_errAsync"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/Result.ts","../src/ResultAsync.ts","../src/Error.ts","../src/EventLog.ts","../src/BlobStore.ts","../src/FixedSizeItemOffsetMapping.ts","../src/VariableSizeItemOffsetMapping.ts","../src/SpreadsheetData.ts","../src/RowColRef.ts"],"sourcesContent":["import type { Ok as neverthrow_Ok, Err as neverthrow_Err } from \"neverthrow\";\nimport { err as neverthrow_err, ok as neverthrow_ok } from \"neverthrow\";\n\n/**\n * An `Ok` instance is the *successful* variant of the {@link Result} type, \n * representing a successful outcome from an operation which may fail.\n * \n * Implemented using [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n */\nexport interface Ok<T,E> extends neverthrow_Ok<T,E> {}\n\n/**\n * An `Err` instance is the failure variant of the {@link Result} type, \n * representing a failure outcome from an operation which may fail.\n * \n * Implemented using [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n */\nexport interface Err<T,E> extends neverthrow_Err<T,E> {}\n\n/**\n * A `Result` represents success ({@link Ok}) or failure ({@link Err}).\n * \n * Compatible with [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n */\nexport type Result<T,E> = Ok<T,E> | Err<T,E>;\n\n/**\n * Create an instance of {@link Ok}.\n *\n * If you need to create an instance with a specific type (as you do whenever you\n * are not constructing immediately for a function return or as an argument to a\n * function), you can use a type parameter:\n *\n * ```ts\n * const yayNumber = ok<number, string>(12);\n * ```\n *\n * Note: passing nothing will produce a `Result<void, E>`, passing `undefined` will\n * produce a `Result<undefined, E>` which is compatible with `Result<void, E>`.\n *\n * ```ts\n * const normalResult = ok<number, string>(42);\n * const explicitUndefined = ok<undefined, string>(undefined);\n * const implicitVoid = ok<void, string>();\n * ```\n *\n * In the context of an immediate function return, or an arrow function with a\n * single expression value, you do not have to specify the types, so this can be\n * quite convenient.\n *\n * ```ts\n * const arrowValidate = (data: SomeData): Result<void, string> =>\n * isValid(data) ? ok() : err('something was wrong!');\n *\n * function fnValidate(data: someData): Result<void, string> {\n * return isValid(data) ? ok() : err('something was wrong');\n * }\n * ```\n *\n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n * @param value - The value to wrap in a `Result.Ok`.\n */\nexport function ok<T, E = never>(value: T): Ok<T, E>\nexport function ok<_T extends void = void, E = never>(value: void): Ok<void, E>\nexport function ok<T, E = never>(value: T): Ok<T, E> {\n return neverthrow_ok<T,E>(value); \n}\n\n/**\n * Create an instance of {@link Err}.\n *\n * If you need to create an instance with a specific type (as you do whenever you\n * are not constructing immediately for a function return or as an argument to a\n * function), you can use a type parameter:\n *\n * ```ts\n * const notString = err<number, string>('something went wrong');\n * ```\n *\n * Note: passing nothing will produce a `Result<T, void>`, passing `undefined` will\n * produce a `Result<T, undefined>` which is compatible with `Result<T, void>`.\n *\n * ```ts\n * const normalResult = err<number, string>('oh no');\n * const explicitUndefined = err<number, undefined>(undefined);\n * const implicitVoid = err<number, void>();\n * ```\n *\n * In the context of an immediate function return, or an arrow function with a\n * single expression value, you do not have to specify the types, so this can be\n * quite convenient.\n *\n * ```ts\n * const arrowValidate = (data: SomeData): Result<number, string> =>\n * isValid(data) ? ok(42) : err('something went wrong');\n *\n * function fnValidate(data: someData): Result<number, string> {\n * return isValid(data) ? ok(42) : err('something went wrong');\n * }\n * ```\n *\n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n * @param err - The value to wrap in a `Result.Err`.\n */\nexport function err<T = never, E extends string = string>(err: E): Err<T, E>\nexport function err<T = never, E = unknown>(err: E): Err<T, E>\nexport function err<T = never, _E extends void = void>(err: void): Err<T, void>\nexport function err<T = never, E = unknown>(err: E): Err<T, E> {\n return neverthrow_err<T,E>(err)\n}\n","import { errAsync as neverthrow_errAsync, okAsync as neverthrow_okAsync, ResultAsync as neverthrow_ResultAsync } from \"neverthrow\";\n\n// Needed for Intellisense links\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { Result, Ok, Err } from \"./Result\"\n\n/**\n * `ResultAsync` allows you to work with asynchronous Results in a type safe way\n * \n * `ResultAsync<T,E>` is a wrapper around `Promise<Result<T,E>>` which provides the same methods for chaining different\n * `Result` and `ResultAsync` together as {@link Result}, while also chaining the asynchronous operations together using\n * `Promise.then`.\n * \n * `ResultAsync` is *thenable* (implements `PromiseLike<T>`) so can be used in most places that a `Promise` can, including with `await`.\n * \n * Compatible with [`neverthrow`](https://github.com/supermacro/neverthrow)\n * \n * @typeParam T - The type of the value contained in the `ResultAsync` for the success case\n * @typeParam E - The type of the error contained in the `ResultAsync` for the failure case\n */\nexport class ResultAsync<T,E> extends neverthrow_ResultAsync<T,E> {}\n\n/**\n * Create an instance of `ResultAsync` containing an {@link Ok} variant of {@link Result}\n *\n * Equivalent to `new ResultAsync(Promise.resolve(new Ok(value)))`\n *\n * @typeParam T - The type of the value contained in the `ResultAsync` for the success case\n * @typeParam E - The type of the error contained in the `ResultAsync` for the failure case\n * @param value - The value to wrap in a `Result.Ok`.\n */\nexport function okAsync<T, E = never>(value: T): ResultAsync<T, E>\nexport function okAsync<_T extends void = void, E = never>(value: void): ResultAsync<void, E>\nexport function okAsync<T, E = never>(value: T): ResultAsync<T, E> {\n return neverthrow_okAsync(value);\n}\n\n/**\n * Create an instance of `ResultAsync` containing an {@link Err} variant of {@link Result}\n *\n * Equivalent to `new ResultAsync(Promise.resolve(new Err(err)))`\n *\n * @typeParam T - The type of the value contained in the `Result` for the success case\n * @typeParam E - The type of the error contained in the `Result` for the failure case\n * @param err - The value to wrap in a `Result.Err`.\n */\nexport function errAsync<T = never, E = unknown>(err: E): ResultAsync<T, E>\nexport function errAsync<T = never, _E extends void = void>(err: void): ResultAsync<T, void>\nexport function errAsync<T = never, E = unknown>(err: E): ResultAsync<T, E> {\n return neverthrow_errAsync<T,E>(err)\n}\n","/** Common properties for Infinisheet errors */\nexport interface InfinisheetError {\n /** Discriminated union tag */\n type: string,\n\n /** End user message describing the problem */\n message: string,\n}\n\n/** \n * Attempt to access data that is outside the available range\n * \n */\nexport interface InfinisheetRangeError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'InfinisheetRangeError',\n\n};\n\n/** Convenience method that creates an {@link InfinisheetRangeError} */\nexport function infinisheetRangeError(message: string): InfinisheetRangeError {\n return { type: 'InfinisheetRangeError', message };\n}\n\n/** Type that represents an error when validating data passed to an API */\nexport interface ValidationError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'ValidationError'\n};\n\n/** Convenience method that creates a {@link ValidationError} */\nexport function validationError(message: string): ValidationError {\n return { type: 'ValidationError', message };\n}\n\n/** Type that represents an error when accessing data in persistent storage */\nexport interface StorageError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'StorageError',\n\n /** HTTP style status code\n * \n * Describes the type of problem encountered. Expected to be a 4XX or 5XX code.\n */\n statusCode?: number | undefined,\n};\n\n/** Convenience method that creates a {@link StorageError} */\nexport function storageError(message: string, statusCode?: number): StorageError {\n return { type: 'StorageError', message, statusCode };\n}","import { ResultAsync } from \"./ResultAsync\";\nimport { StorageError, InfinisheetError, InfinisheetRangeError } from \"./Error\"\n\n/** Identifier for a blob of data in a blob store */\nexport type BlobId = string;\n\n/** Identifier for a workflow triggered writing to {@link LogMetadata.pending} */\nexport type WorkflowId = string;\n\n/** \n * Identifier for an entry in an {@link EventLog}.\n * \n * Incrementing integer.\n*/\nexport type SequenceId = bigint;\n\n/**\n * Metadata stored in an {@link EventLog} entry\n */\nexport interface LogMetadata {\n /** Stores a reference to a snapshot of the complete log up to and including this entry */\n snapshot?: BlobId | undefined;\n\n /** Stores a reference to an external history of the event log up to and including the previous entry */\n history?: BlobId | undefined;\n\n /** Indicates that a background workflow is pending */\n pending?: WorkflowId | undefined;\n}\n\n/** \n * Type that represents an entry in an {@link EventLog}\n * \n * Base interface that clients will typically implement multiple times.\n * Each concrete implementation will define its own data properties that\n * need to be serialized into the event log.\n * \n * Properties defined here are common metadata which require special handling\n * by any `EventLog` implementation.\n * \n * All data properties are immutable once an entry has been added to the log. Metadata\n * properties (apart from `type`) may change over time.\n */\nexport interface LogEntry extends LogMetadata {\n /** Used as a discriminated union tag by implementations */\n type: string;\n};\n\n/** \n * Type that represents a consistency conflict when adding a {@link LogEntry} to an {@link EventLog}\n * \n * Occurs when an attempt is made to add an entry with a sequence id that is not\n * the next available in the log.\n * \n * Typically happens when another client makes a change since you last read the log.\n * Sync with the additional log entries and then try again.\n */\nexport interface ConflictError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'ConflictError',\n\n /** Next available sequence id */\n nextSequenceId: SequenceId;\n};\n\n/** Convenience method that creates a {@link ConflictError} */\nexport function conflictError(message: string, nextSequenceId: SequenceId): ConflictError {\n return { type: 'ConflictError', message, nextSequenceId };\n}\n\n/** Errors that can be returned by {@link EventLog} `addEntry` method */\nexport type AddEntryError = ConflictError | StorageError;\n\n/** Errors that can be returned by {@link EventLog} `query` method */\nexport type QueryError = InfinisheetRangeError | StorageError;\n\n/** Errors that can be returned by {@link EventLog} `truncate` method */\nexport type TruncateError = InfinisheetRangeError | StorageError;\n\n/** Errors that can be returned by {@link EventLog} `setMetadata` method */\nexport type MetadataError = InfinisheetRangeError | StorageError;\n\n/** Value of a snapshot stored at a specific sequence id in the log */\nexport interface SnapshotValue {\n /** Sequence id of log entry that stores this snapshot */\n sequenceId: SequenceId;\n\n /** Content of snapshot in the `BlobStore` */\n blobId: BlobId;\n}\n\n/** A range of {@link LogEntry} values returned by querying an {@link EventLog} */\nexport interface QueryValue<T extends LogEntry> {\n /** Sequence id corresponding to the first entry in `entries`\n * \n * All other entries have consecutive ascending sequence ids\n */\n startSequenceId: SequenceId;\n\n /** \n * Sequence id after the final entry in `entries`\n * \n * If query was up to the `end` sequence id AND\n * `isComplete` is true, this is the next available\n * sequence id for `addEntry`. \n */\n endSequenceId: SequenceId;\n\n /** True if all the requested entries have been returned\n * \n * Queries may return fewer entries than requested. If \n * `isComplete` is `false`, repeat the query starting\n * from `nextSequenceId`.\n */\n isComplete: boolean;\n\n /** Most recent snapshot\n * \n * Returned if query includes `snapshotId` argument and\n * most recent snapshot is different. \n */\n lastSnapshot?: SnapshotValue | undefined;\n\n /** The {@link LogEntry} records returned by the query */\n entries: T[];\n}\n\n/** Result of calling {@link EventLog.addEntry} */\nexport interface AddEntryValue {\n /** Most recent snapshot\n * \n * Returned if query includes `snapshotId` argument and\n * most recent snapshot is different. \n */\n lastSnapshot?: SnapshotValue | undefined;\n}\n\n/** Abstract interface representing an event log\n * \n * \n */\nexport interface EventLog<T extends LogEntry> {\n /** \n * Add an entry to the log with the given sequence id\n * \n * @param sequenceId - The next available sequence id in the log. \n * This is returned as `endSequenceId` when making a query for the `last` entry in the log. \n * Returns a {@link ConflictError} if not the next available id.\n * \n * @param snapshotId - The sequence id for the most recent snapshot that the client is aware of.\n * If there's a more recent snapshot, it's id will be returned in `AddEntryValue`. \n * \n * Any other problem with serializing the entry will return a {@link StorageError}.\n */\n addEntry(entry: T, sequenceId: SequenceId, snapshotId?: SequenceId): ResultAsync<AddEntryValue,AddEntryError>;\n\n /**\n * Set some or all of a log entry's metadata fields\n *\n * Changes are atomic. Either all of the specified fields are updated or none are.\n */\n setMetadata(sequenceId: SequenceId, metaData: LogMetadata): ResultAsync<void,MetadataError>;\n\n /** Return a range of entries from `first` to `last` inclusive \n * \n * The event log may return fewer entries than requested. If so, repeat the query starting from `nextSequenceId`.\n * \n * @param start - `SequenceId` of first entry to return. \n * Use `'start'` to query from the first entry in the log. \n * Use `'snapshot'` to query from the most recent entry with a snapshot, or the first if no snapshot is defined.\n * \n * @param end - `SequenceId` one after the last entry to return.\n * Use `'end'` to query everything to the end of the log.\n */\n query(start: SequenceId | 'snapshot' | 'start', end: SequenceId | 'end', snapshotId?: SequenceId): ResultAsync<QueryValue<T>,QueryError>;\n\n /** All entries prior to `start` are removed from the log. */\n truncate(start: SequenceId): ResultAsync<void,TruncateError>\n}","import { ResultAsync } from \"./ResultAsync\";\nimport { StorageError, InfinisheetError } from \"./Error\"\n\n/** \n * Name of a blob or directory within a {@link BlobDir}\n * \n * Names MUST NOT be longer than 100 characters\n */\nexport type BlobName = string;\n\n/** \n * Invalid {@link BlobName} error\n * \n * Occurs when trying to pass a `BlobName` that is too long or contains invalid characters\n */\nexport interface InvalidBlobNameError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'InvalidBlobNameError',\n};\n\nexport function invalidBlobNameError(message?: string): InvalidBlobNameError { \n return { type: 'InvalidBlobNameError', message: message ? message : \"Invalid Blob Name\" }; \n}\n\n/** \n * Error when trying to access a blob as a directory or vice versa\n * \n * Occurs when trying to access a blob/directory with a\n * {@link BlobName} that refers to a directory/blob\n */\nexport interface BlobWrongKindError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'BlobWrongKindError',\n};\n\nexport function notBlobError(): BlobWrongKindError { return { type: 'BlobWrongKindError', message: \"Not a blob\"} }\nexport function notBlobDirError(): BlobWrongKindError { return { type: 'BlobWrongKindError', message: \"Not a blob dir\"} }\n\n/** \n * Invalid {@link BlobName} error\n * \n * Occurs when trying to pass a `BlobName` that is too long or contains invalid characters\n */\nexport interface NoContinuationError extends InfinisheetError {\n /** Discriminated union tag */\n type: 'NoContinuationError',\n};\n\nexport function noContinuationError(message?: string): NoContinuationError { \n return { type: 'NoContinuationError', message: message ? message : \"Can't continue query, start again\" }; \n}\n\n/** Errors that can be returned by {@link BlobDir.readBlob} */\nexport type ReadBlobError = BlobWrongKindError | InvalidBlobNameError | StorageError;\n\n/** Errors that can be returned by {@link BlobDir.writeBlob} */\nexport type WriteBlobError = BlobWrongKindError | InvalidBlobNameError | StorageError;\n\n/** Errors that can be returned by {@link BlobDir.removeBlob} */\nexport type RemoveBlobError = BlobWrongKindError | InvalidBlobNameError | StorageError;\n\n/** Errors that can be returned by {@link BlobDir.getDir} */\nexport type GetDirError = BlobWrongKindError | InvalidBlobNameError | StorageError;\n\n/** Errors that can be returned by {@link BlobDir.query} */\nexport type DirQueryError = StorageError | NoContinuationError;\n\n/** Errors that can be returned by {@link BlobDir.removeAll} */\nexport type RemoveAllBlobDirError = StorageError;\n\nexport interface BlobDirEntries<ContinuationT> {\n /** Names of blobs returned by {@link BlobDir.query} */\n blobs: BlobName[];\n\n /** Names of directories returned by {@link BlobDir.query} */\n dirs: BlobName[];\n\n /** Continuation token to pass to {@link BlobDir.query} if there are more entries to retrieve */\n continuation?: ContinuationT | undefined;\n}\n\n/**\n * Directory that contains blobs and other directories within a {@link BlobStore}\n */\nexport interface BlobDir<ContinuationT> {\n /** Read the content of a blob with the specified name. \n * \n * The returned content array is read only and immutable. \n */\n readBlob(name: BlobName): ResultAsync<Uint8Array,ReadBlobError>;\n\n /** Write the specified content to a blob with the specified name. \n * \n * Any existing blob with that name is overwritten, otherwise a new blob is created.\n * The content array is treated as read only and must be immutable until the operation completes.\n */\n writeBlob(name: BlobName, content: Uint8Array): ResultAsync<void,WriteBlobError>;\n\n /** Remove blob with the specified name. */\n removeBlob(name: BlobName): ResultAsync<void,RemoveBlobError>;\n\n /** Get a {@link BlobDir} corresponding to the subdirectory with the specified name \n * \n * Subdirectories are \"created\" on demand\n */\n getDir(name: BlobName): ResultAsync<BlobDir<ContinuationT>,GetDirError>;\n\n /** Query for blobs and sub-directories within this directory \n * \n * The order of entries returned is undefined. \n * \n * Can optionally pass a continuation token returned by the previous call to retrieve additional entries.\n */\n query(continuation?: ContinuationT): ResultAsync<BlobDirEntries<ContinuationT>,DirQueryError>;\n\n /** Remove this directory and it's contents, recursively */\n removeAll(): ResultAsync<void,RemoveAllBlobDirError>;\n}\n\n/** Errors that can be returned by {@link BlobStore.getRootDir} */\nexport type GetRootDirError = StorageError;\n\n/** Abstract interface representing a Blob store\n * \n * Modeled as a hierarchy of directories and blobs\n */\nexport interface BlobStore<ContinuationT> {\n /** Returns the root {@link BlobDir} for the store*/\n getRootDir(): ResultAsync<BlobDir<ContinuationT>,GetRootDirError>;\n}\n","import type { ItemOffsetMapping } from './ItemOffsetMapping';\n\n/**\n * Implementation of {@link ItemOffsetMapping} for use when all items have a fixed size\n */\nexport class FixedSizeItemOffsetMapping implements ItemOffsetMapping {\n /**\n * @param itemSize - Size to use for all items\n */\n constructor (itemSize: number) {\n this.fixedItemSize = itemSize;\n }\n\n itemSize(_itemIndex: number): number {\n return this.fixedItemSize;\n }\n\n itemOffset(itemIndex: number): number {\n return itemIndex * this.fixedItemSize;\n }\n\n offsetToItem(offset: number): [itemIndex: number, startOffset: number] {\n const itemIndex = Math.floor(offset / this.fixedItemSize);\n const startOffset = itemIndex * this.fixedItemSize;\n\n return [itemIndex, startOffset];\n }\n\n private fixedItemSize: number;\n}\n\n","import type { ItemOffsetMapping } from './ItemOffsetMapping';\n\n/**\n * Implementation of {@link ItemOffsetMapping} for use when initial items have variable sizes.\n */\nexport class VariableSizeItemOffsetMapping implements ItemOffsetMapping {\n /**\n * @param defaultItemSize - Size to use for all other items\n * @param sizes - Array of sizes to use for the initial items, one size per item\n */\n constructor (defaultItemSize: number, sizes: number[]) {\n this.defaultItemSize = defaultItemSize;\n this.sizes = sizes;\n }\n\n itemSize(itemIndex: number): number {\n return (itemIndex < this.sizes.length) ? this.sizes[itemIndex]! : this.defaultItemSize;\n }\n\n itemOffset(itemIndex: number): number {\n let offset = 0;\n let length = this.sizes.length;\n if (itemIndex > length) {\n const numDefaultSize = itemIndex - length;\n offset = numDefaultSize * this.defaultItemSize;\n } else {\n length = itemIndex;\n }\n \n for (let i = 0; i < length; i ++)\n {\n offset += this.sizes[i]!;\n }\n\n return offset;\n }\n\n offsetToItem(offset: number): [itemIndex: number, startOffset: number] {\n let startOffset = 0;\n for (const [i,size] of this.sizes.entries()) {\n if (startOffset + size > offset) {\n return [i, startOffset];\n }\n startOffset += size;\n }\n\n const itemIndex = Math.floor((offset - startOffset) / this.defaultItemSize);\n startOffset += itemIndex * this.defaultItemSize;\n\n const length = this.sizes.length;\n return [itemIndex+length, startOffset];\n }\n\n private defaultItemSize: number;\n private sizes: number[];\n}\n","import type { ItemOffsetMapping } from \"./ItemOffsetMapping\";\nimport { FixedSizeItemOffsetMapping } from \"./FixedSizeItemOffsetMapping\";\nimport { Result, ok } from \"./Result\";\nimport { ResultAsync, errAsync } from \"./ResultAsync\";\nimport { ValidationError, StorageError, storageError } from \"./Error\";\n\n/** Possible spreadsheet error values\n * \n * Includes those that can be returned by `ERROR.TYPE` and additional values\n * introduced by more recent versions of Excel.\n*/\nexport type CellErrorValue = '#NULL!' | \n '#DIV/0!' |\n '#VALUE!' |\n '#REF!' |\n '#NAME?' |\n '#NUM!' |\n '#N/A' |\n '#GETTING_DATA' |\n '#SPILL!' |\n '#UNKNOWN!' |\n '#FIELD!' |\n '#CALC!';\n\n/** Type that represents an error value stored in a cell\n * \n * Defined as a discriminated union so that additional cell value types\n * can be added in future.\n */\nexport interface CellError {\n /** Discriminated union tag */\n type: 'CellError',\n\n /** {@link CellErrorValue | Error Value} */\n value: CellErrorValue;\n};\n\n/** Possible types for a cell value \n * \n * The native JavaScript types string, number and boolean represent the *Text*, *Number* and *Logical*\n * spreadsheet data types. {@link CellError} represents an *Error Value*.\n * \n * Undefined is used to represent a cell with no defined value. Null represents a cell that has been\n * explicitly marked as empty. \n*/\nexport type CellValue = string | number | boolean | null | undefined | CellError\n\n/** Format of cell typically used when displaying numbers */\nexport type CellFormat = string | undefined;\n\n/** Data stored in a spreadsheet cell */\nexport interface CellData {\n /** Value of cell */\n value: CellValue;\n\n /** Format of cell */\n format?: CellFormat;\n}\n\n/** A viewport onto the spreadsheet. Usually the portion of the spreadsheet visible on-screen. */\nexport interface SpreadsheetViewport {\n /** Offset down the rows to the start of the viewport (using {@link ItemOffsetMapping} offsets) */\n rowMinOffset: number,\n\n /** Offset along the columns to the start of the viewport (using {@link ItemOffsetMapping} offsets) */\n columnMinOffset: number,\n\n /** Viewport width */\n width: number,\n\n /** Viewport height */\n height: number\n}\n\n/** Are two viewports equal by value? */\nexport function equalViewports(a: SpreadsheetViewport | undefined, b: SpreadsheetViewport | undefined): boolean {\n if (a === b)\n return true;\n\n if (!a || !b)\n return false;\n\n return a.rowMinOffset === b.rowMinOffset &&\n a.columnMinOffset === b.columnMinOffset &&\n a.width === b.width &&\n a.height === b.height;\n}\n\n/** Creates an empty viewport */\nexport function emptyViewport(): SpreadsheetViewport {\n return { rowMinOffset: 0, columnMinOffset: 0, width: 0, height: 0 }\n}\n\n/** Types of error that can be returned by {@link SpreadsheetData} methods */\nexport type SpreadsheetDataError = ValidationError | StorageError;\n\n/**\n * Interface used to access the data in a spreadsheet\n * \n * The data exposed through the interface may change over time outside of any changes made through the interface. The caller\n * can use the {@link subscribe} method to be notified when the data changes. When reading data, the caller must first request\n * a snapshot using {@link getSnapshot}. All values returned by gettors are relative to a specified snapshot. The values will be\n * consistent with each other as long as the same snapshot is used.\n * \n * @typeParam Snapshot - Type of snapshot. Implementations are free to use whatever type makes sense for them.\n */\nexport interface SpreadsheetData<Snapshot> {\n /** Subscribe to data changes */\n subscribe(onDataChange: () => void): () => void\n\n /** Return a snapshot to use when accessing values at a consistent point in time */\n getSnapshot(): Snapshot\n\n /** \n * Return load status at the time the snapshot was created \n * \n * On Success returns true if load has completed, false if still in progress\n * On Err returns most recent error reported by the storage system\n */\n getLoadStatus(snapshot: Snapshot): Result<boolean,StorageError>\n\n /** Number of rows in the spreadsheet */\n getRowCount(snapshot: Snapshot): number\n\n /** {@link ItemOffsetMapping} which describes sizes and offsets to start of rows */\n getRowItemOffsetMapping(snapshot: Snapshot): ItemOffsetMapping\n\n /** Number of columns in the spreadsheet */\n getColumnCount(snapshot: Snapshot): number\n\n /** {@link ItemOffsetMapping} which describes sizes and offsets to start of columns */\n getColumnItemOffsetMapping(snapshot: Snapshot): ItemOffsetMapping\n\n /** Value of specified cell using 0-based row and column indexes */\n getCellValue(snapshot: Snapshot, row: number, column: number): CellValue\n\n /** Format of specified cell using 0-based row and column indexes */\n getCellFormat(snapshot: Snapshot, row: number, column: number): CellFormat\n\n /** Set value and format of specified cell\n * \n * @returns `Ok` if the change was successfully applied\n */\n setCellValueAndFormat(row: number, column: number, value: CellValue, format: CellFormat): ResultAsync<void,SpreadsheetDataError>\n\n /** Check whether value and format are valid to set for specified cell\n * \n * @returns `Ok` if the value and format are valid\n */\n isValidCellValueAndFormat(row: number, column: number, value: CellValue, format: CellFormat): Result<void,ValidationError>\n\n /** Set viewport of interest\n * \n * Can be used by `SpreadsheetData` implementations to optimize data retrieval and memory usage.\n * Queries for cells outside the viewport *may* return `undefined`. Clients should not rely on any particular behavior\n * for queries outside the viewport.\n * \n * Set to undefined (the default) if the client needs access to the entire spreadsheet\n */\n setViewport(viewport: SpreadsheetViewport | undefined): void\n\n /** Return the viewport in force (if any) */\n getViewport(snapshot: Snapshot): SpreadsheetViewport | undefined\n}\n\nconst rowItemOffsetMapping = new FixedSizeItemOffsetMapping(30);\nconst columnItemOffsetMapping = new FixedSizeItemOffsetMapping(100);\n\nexport class EmptySpreadsheetData implements SpreadsheetData<number> {\n constructor() {\n this.viewport = undefined;\n }\n\n subscribe(_onDataChange: () => void) { return () => {}; }\n getSnapshot() { return 0; }\n \n getLoadStatus(_snapshot: number): Result<boolean,StorageError> { return ok(true); }\n getRowCount(_snapshot: number) { return 0; }\n getRowItemOffsetMapping(_snapshot: number): ItemOffsetMapping { return rowItemOffsetMapping; }\n getColumnCount(_snapshot: number) { return 0; }\n getColumnItemOffsetMapping(_snapshot: number): ItemOffsetMapping { return columnItemOffsetMapping; }\n getCellValue(_snapshot: number, _row: number, _column: number): CellValue { return null; }\n getCellFormat(_snapshot: number, _row: number, _column: number): string|undefined { return undefined; }\n setCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: CellFormat): ResultAsync<void,SpreadsheetDataError> \n { return errAsync(storageError(\"Not implemented\", 501)); }\n isValidCellValueAndFormat(_row: number, _column: number, _value: CellValue, _format: CellFormat): Result<void,ValidationError> \n { return ok(); }\n\n setViewport(viewport: SpreadsheetViewport | undefined): void { this.viewport = viewport; }\n getViewport(_snapshot: number): SpreadsheetViewport | undefined { return this.viewport }\n\n private viewport: SpreadsheetViewport | undefined;\n}\n\n","/** Classic Spreadsheet reference to Column (e.g \"A\") */\nexport type ColRef = string;\n\n/** Classic Spreadsheet reference to Cell (e.g. \"A1\"), Row (e.g. \"1\") or Column (e.g \"A\") */\nexport type RowColRef = string;\n\n/** Equivalent to {@link RowColRef} as coordinate pair. \"A1\" has coords [0,0], \"1\" is [0,undefined] and \"A\" is [undefined,0] */\nexport type RowColCoords = [row: number|undefined, col: number|undefined];\n\n/** Converts a {@link ColRef} to the 0-based index of the column */\nexport function colRefToIndex(col: ColRef): number {\n let n = 0;\n for (let i = 0; i < col.length; i ++) {\n n = col.charCodeAt(i) - 64 + n * 26;\n }\n return n-1;\n}\n\n/** Converts a 0-based column index to a {@link ColRef} */\nexport function indexToColRef(index: number): ColRef {\n let ret = \"\";\n index ++;\n while (index > 0) {\n index --;\n const remainder = index % 26;\n index = Math.floor(index / 26);\n ret = String.fromCharCode(65+remainder) + ret;\n }\n return ret;\n}\n\n/** Splits a RowColRef into a 0-based row index and a {@link ColRef} */\nexport function splitRowColRef(ref: RowColRef): [row: number|undefined, col: ColRef|undefined] {\n const re = /^([A-Z]*)(\\d*)$/;\n const found = ref.match(re);\n if (!found)\n return [undefined,undefined];\n\n const col = found[1];\n const row = found[2] ? parseInt(found[2]) : 0;\n return [(row>0) ? row-1 : undefined, col ? col : undefined];\n}\n\n/** Converts a {@link RowColRef} to {@link RowColCoords} */\nexport function rowColRefToCoords(ref: RowColRef): RowColCoords {\n const [row,col] = splitRowColRef(ref);\n return [row, col ? colRefToIndex(col) : undefined];\n}\n\n/** Converts {@link RowColCoords} to a {@link RowColRef} */\nexport function rowColCoordsToRef(row: number|undefined, col: number|undefined): RowColRef {\n if (row !== undefined) {\n if (col !== undefined) {\n return indexToColRef(col) + (row+1);\n } else {\n return (row+1).toString();\n }\n } else {\n if (col !== undefined) {\n return indexToColRef(col);\n } else {\n return \"\";\n }\n }\n}"],"names":["neverthrow_ok","neverthrow_err","neverthrow_ResultAsync","neverthrow_okAsync","neverthrow_errAsync"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@candidstartup/infinisheet-types",
3
3
  "private": false,
4
- "version": "0.12.0",
4
+ "version": "0.13.1",
5
5
  "description": "Common types for the InfiniSheet packages",
6
6
  "author": "Tim Wiegand <tim.wiegand@thecandidstartup.org>",
7
7
  "license": "BSD-3-Clause",
@@ -34,23 +34,22 @@
34
34
  "import": "./dist/index.js"
35
35
  }
36
36
  },
37
+ "main": "index.js",
38
+ "dependencies": {
39
+ "neverthrow": "^8.2.0"
40
+ },
37
41
  "scripts": {
38
42
  "dev": "vite",
39
43
  "clean": "rimraf {dist,temp}",
40
- "prebuild": "npm run clean",
44
+ "prebuild": "pnpm run clean",
41
45
  "typecheck": "tsc -p tsconfig.json",
42
46
  "build-tsc": "tsc -p tsconfig.build.json",
43
47
  "build-rollup": "rollup -c ../rollup.config.mjs",
44
- "build": "npm run build-rollup",
48
+ "build": "pnpm run build-rollup",
45
49
  "lint": "eslint . --report-unused-disable-directives --max-warnings 0",
46
50
  "devapi": "api-extractor run --local",
47
51
  "prodapi": "api-extractor run",
48
- "devbuild": "npm run build && npm run lint && npm run devapi",
52
+ "devbuild": "pnpm run build && pnpm run lint && pnpm run devapi",
49
53
  "test": "vitest"
50
- },
51
- "main": "index.js",
52
- "dependencies": {
53
- "neverthrow": "^8.2.0"
54
- },
55
- "gitHead": "03b639807d367f0c167dc5b6653b3935412cbde8"
56
- }
54
+ }
55
+ }