@cristianmpx/react-import-sheet-headless 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +148 -0
  3. package/dist/chunk-3O6T2NOG.js +2 -0
  4. package/dist/chunk-3O6T2NOG.js.map +1 -0
  5. package/dist/chunk-77DDFTT3.js +2 -0
  6. package/dist/chunk-77DDFTT3.js.map +1 -0
  7. package/dist/chunk-BCDDC5UG.js +2 -0
  8. package/dist/chunk-BCDDC5UG.js.map +1 -0
  9. package/dist/chunk-J2IHY56K.js +2 -0
  10. package/dist/chunk-J2IHY56K.js.map +1 -0
  11. package/dist/chunk-UCBBDF6X.js +2 -0
  12. package/dist/chunk-UCBBDF6X.js.map +1 -0
  13. package/dist/chunk-WLNB3X2R.js +2 -0
  14. package/dist/chunk-WLNB3X2R.js.map +1 -0
  15. package/dist/chunk-XTSACACJ.js +2 -0
  16. package/dist/chunk-XTSACACJ.js.map +1 -0
  17. package/dist/chunk-YETPLYYC.js +2 -0
  18. package/dist/chunk-YETPLYYC.js.map +1 -0
  19. package/dist/csv-parser-3IGEDABE.js +2 -0
  20. package/dist/csv-parser-3IGEDABE.js.map +1 -0
  21. package/dist/csv-parser-ML7A4LF4.js +2 -0
  22. package/dist/csv-parser-ML7A4LF4.js.map +1 -0
  23. package/dist/edit.worker.d.ts +5 -0
  24. package/dist/edit.worker.js +2 -0
  25. package/dist/edit.worker.js.map +1 -0
  26. package/dist/index.d.ts +403 -0
  27. package/dist/index.js +5 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/parser.worker.d.ts +2 -0
  30. package/dist/parser.worker.js +2 -0
  31. package/dist/parser.worker.js.map +1 -0
  32. package/dist/sanitizer.worker.d.ts +2 -0
  33. package/dist/sanitizer.worker.js +2 -0
  34. package/dist/sanitizer.worker.js.map +1 -0
  35. package/dist/transform.worker.d.ts +5 -0
  36. package/dist/transform.worker.js +2 -0
  37. package/dist/transform.worker.js.map +1 -0
  38. package/dist/validator.worker.d.ts +5 -0
  39. package/dist/validator.worker.js +2 -0
  40. package/dist/validator.worker.js.map +1 -0
  41. package/package.json +86 -0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cristian Marin.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,148 @@
1
+ # @cristianm/react-import-sheet-headless
2
+
3
+ Headless **React** library for **importing** and validating **Excel**/CSV sheet data. No built-in table UI—you bring your own components; the library provides the logic, **Web Worker** speed, and bulk validation.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@cristianm/react-import-sheet-headless.svg)](https://www.npmjs.com/package/@cristianm/react-import-sheet-headless) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @cristianm/react-import-sheet-headless
11
+ ```
12
+
13
+ **Peer dependencies:** React 18+ (`react` and `react-dom`).
14
+
15
+ ## Why Headless
16
+
17
+ Bring your own components; we provide the logic, Web Worker performance, and bulk validation. No prebuilt `<Table />`—you own the UI and the UX.
18
+
19
+ ## Pipeline
20
+
21
+ Data flows through a single pipeline. Heavy steps run in Web Workers so the main thread stays responsive.
22
+
23
+ ```mermaid
24
+ flowchart LR
25
+ A[Input File] --> B[Parser Worker]
26
+ B --> C[Convert]
27
+ C --> D[Sanitizer Worker]
28
+ D --> E[Validator Worker]
29
+ E --> F[Transform Worker]
30
+ F --> G[Sheet + Errors]
31
+ G -.-> H[Edit optional]
32
+ ```
33
+
34
+ **Order:** Input File → Parser (Worker) → Convert (main thread) → Sanitizer (Worker) → Validator (Worker) → Transform (Worker) → Result (sheet) + Errors. Optional: cell-level edit on the result.
35
+
36
+ ## Quick Start
37
+
38
+ ~10 lines to see the value: wrap with the provider, pick a file, read result and errors.
39
+
40
+ ```tsx
41
+ import {
42
+ ImporterProvider,
43
+ useImporter,
44
+ useSheetView,
45
+ } from '@cristianm/react-import-sheet-headless';
46
+
47
+ const myLayout = { name: 'my-sheet', version: 1, fields: {} };
48
+
49
+ function App() {
50
+ return (
51
+ <ImporterProvider>
52
+ <ImporterUI />
53
+ </ImporterProvider>
54
+ );
55
+ }
56
+
57
+ function ImporterUI() {
58
+ const { processFile } = useImporter({ layout: myLayout });
59
+ const { sheet, getPaginatedResult } = useSheetView({ defaultPageSize: 10 });
60
+
61
+ if (!sheet) {
62
+ return (
63
+ <input
64
+ type="file"
65
+ accept=".csv,.xlsx"
66
+ onChange={(e) => e.target.files?.[0] && processFile(e.target.files[0])}
67
+ />
68
+ );
69
+ }
70
+
71
+ const { rows } = getPaginatedResult(1, 10);
72
+ return (
73
+ <div>
74
+ <p>
75
+ Rows: {sheet.rows.length} | Errors: {sheet.errors.length}
76
+ </p>
77
+ {/* Your table component here, e.g. rows.map(...) */}
78
+ </div>
79
+ );
80
+ }
81
+ ```
82
+
83
+ For layout, custom validators, and step-by-step usage, see [How to / Usage](docs/how-to.md). For a documented example (layout, fields, sanitizers, validators, transforms) with comments, see [examples/ImportExample.md](examples/ImportExample.md).
84
+
85
+ ### Virtualization (e.g. react-window)
86
+
87
+ Use `totalRows` and `getRows(page, limit)` (page is 1-based) from `useSheetView()` to feed a virtual list without loading all rows into the DOM:
88
+
89
+ ```tsx
90
+ import { FixedSizeList as List } from 'react-window';
91
+ import { useSheetView } from '@cristianm/react-import-sheet-headless';
92
+
93
+ function VirtualizedTable() {
94
+ const { getRows, totalRows } = useSheetView({ filterMode: 'all' });
95
+ const pageSize = 50;
96
+
97
+ const Row = ({ index, style }: { index: number; style: React.CSSProperties }) => {
98
+ const page = Math.floor(index / pageSize) + 1;
99
+ const offset = index % pageSize;
100
+ const chunk = getRows(page, pageSize);
101
+ const row = chunk[offset];
102
+ return <div style={style}>{row ? `Row ${row.index}: ${JSON.stringify(row.cells)}` : null}</div>;
103
+ };
104
+
105
+ return (
106
+ <List height={400} itemCount={totalRows} itemSize={32} width="100%">
107
+ {Row}
108
+ </List>
109
+ );
110
+ }
111
+ ```
112
+
113
+ **Persistence:** When using `persist={true}`, call **clearPersistedState()** (from **useSheetView**) after the user has successfully submitted the import to your server, so data is not left in IndexedDB indefinitely. See [View / Persist](docs/how-to-view.md).
114
+
115
+ ## How to (usage)
116
+
117
+ Step-by-step usage and recipes (handling large files, real-time errors, session recovery): **[How to / Usage](docs/how-to.md)**.
118
+
119
+ Topic-specific guides: [Parser](docs/how-to-parser.md), [Convert](docs/how-to-convert.md), [Sanitizer](docs/how-to-sanitizer.md), [Validators](docs/how-to-validators.md), [Transformers](docs/how-to-transformers.md), [Edit](docs/how-to-edit.md), [View](docs/how-to-view.md), [Result — convert to your object for submit](docs/how-to-result.md).
120
+
121
+ ## Schema Docs
122
+
123
+ The sheet layout (`SheetLayout`) defines validators, sanitizers, and transformers by level (cell, row, sheet). Options and parameters are documented in:
124
+
125
+ | Type | Documentation |
126
+ | ------------ | ---------------------------------------------- |
127
+ | Validators | [Validators reference](docs/validators.md) |
128
+ | Sanitizers | [Sanitizers reference](docs/sanitizers.md) |
129
+ | Transformers | [Transformers reference](docs/transformers.md) |
130
+
131
+ **By level:**
132
+
133
+ - **Validators:** cell (per field), row, sheet — see [docs/validators.md](docs/validators.md).
134
+ - **Sanitizers:** cell, row, sheet — see [docs/sanitizers.md](docs/sanitizers.md).
135
+ - **Transformers:** cell, row, sheet — see [docs/transformers.md](docs/transformers.md).
136
+
137
+ To add or use controller modules (validators, sanitizers, transforms by context): [Controllers](src/utils/controller/README.md).
138
+
139
+ ## Contributing
140
+
141
+ - **Conventional Commits:** This project uses [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `docs:`, etc.). PRs that do not follow this convention may be asked to amend their commit messages.
142
+ - **Tests required:** All contributions must pass the test suite. Run `npm run test` before opening a PR. Vitest is used; coverage is maintained. Pre-push hooks may run tests.
143
+
144
+ ## License and links
145
+
146
+ - **License:** [MIT](https://opensource.org/licenses/MIT)
147
+ - **Repository:** (add your repo URL)
148
+ - **Documentation:** [docs/](docs/)
@@ -0,0 +1,2 @@
1
+ import{a as y}from"./chunk-YETPLYYC.js";var c="required";function R(e,t,o){return e==null||typeof e=="string"&&e.trim()===""?[{code:"REQUIRED",level:"error",params:{value:e}}]:null}function f(e){e(c,R,{type:"cell"})}var h=new y;f((e,t,o)=>{h.register(e,t,o)});function V(e){let t=h.get(e);if(!(!t||t.type!=="cell"))return t.fn}function g(e){}function w(e){}function x(){return{getCellValidator:V,getRowValidator:g,getTableValidator:w}}function d(e){return typeof e=="string"?{name:e}:{name:e.name,params:e.params}}function I(e,t,o,i){let n=o.validators;if(!n?.length)return[];let a=[];for(let p of n){let{name:u,params:s}=d(p),r=i(u);if(r){let l=r(e.value,t,s);if(l?.length&&(a.push(...l),l.some(S=>S.level==="fatal")))break}}return a}function A(e,t,o){let i=t.rowValidators;if(!i?.length)return[];let n=[];for(let a of i){let{name:p,params:u}=d(a),s=o(p);if(s){let r=s(e,u);if(r?.length&&(n.push(...r),r.some(m=>m.level==="fatal")))break}}return n}var E="EXTERNAL_VALIDATION_FAILED";function z(e){return e.map(t=>({error:t}))}async function G(e,t,o,i){let n=t.sheetValidators;if(!n?.length)return[];let a=[];for(let p of n){let{name:u,params:s}=d(p),r=o(u);if(r)try{let l=await Promise.resolve(r(e,s,i));l?.length&&a.push(...z(l))}catch{a.push({error:{code:E,level:"fatal",params:{reason:"network"}}})}}return a}export{I as a,A as b,G as c,x as d};
2
+ //# sourceMappingURL=chunk-3O6T2NOG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/controller/required/cell-required-validator.ts","../src/core/validator/worker/worker-registry.ts","../src/core/validator/runner/resolve-validator-ref.ts","../src/core/validator/runner/cell-validators.ts","../src/core/validator/runner/row-validators.ts","../src/core/validator/runner/run-table-validation.ts"],"sourcesContent":["import type { SheetError } from '../../../types/error.js';\nimport type { SanitizedSheetRow } from '../../../core/sanitizer/types/sanitized-sheet.js';\n\nexport const REQUIRED_VALIDATOR_ID = 'required';\n\nexport type CellValidatorFn = (\n value: unknown,\n row: SanitizedSheetRow,\n params?: Readonly<Record<string, unknown>>,\n) => readonly SheetError[] | null;\n\nexport function cellRequiredValidator(\n value: unknown,\n _row: SanitizedSheetRow,\n _params?: Readonly<Record<string, unknown>>,\n): readonly SheetError[] | null {\n const isEmpty =\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim() === '');\n if (isEmpty) {\n return [{ code: 'REQUIRED', level: 'error', params: { value } }];\n }\n return null;\n}\n\nexport function registerRequiredValidator(\n register: (name: string, fn: CellValidatorFn, options: { type: 'cell' }) => void,\n): void {\n register(REQUIRED_VALIDATOR_ID, cellRequiredValidator, { type: 'cell' });\n}\n\nexport const CellRequiredValidator = {\n id: REQUIRED_VALIDATOR_ID,\n validate: cellRequiredValidator,\n Register(registerFn?: (name: string, fn: CellValidatorFn, opts: { type: 'cell' }) => void): string {\n if (registerFn) registerRequiredValidator(registerFn);\n return REQUIRED_VALIDATOR_ID;\n },\n};\n","import { Registry } from '../../../shared/registry/index.js';\nimport { registerRequiredValidator } from '../../../utils/controller/required/cell-required-validator.js';\nimport type { SheetError } from '../../../types/error.js';\nimport type { SanitizedSheet, SanitizedSheetRow } from '../../sanitizer/types/sanitized-sheet.js';\n\ntype CellValidatorFn = (\n value: unknown,\n row: SanitizedSheetRow,\n p?: Readonly<Record<string, unknown>>,\n) => readonly SheetError[] | null;\n\ntype RowValidatorFn = (\n row: SanitizedSheetRow,\n p?: Readonly<Record<string, unknown>>,\n) => readonly SheetError[] | null;\n\ntype TableValidatorFn = (\n sheet: SanitizedSheet,\n p?: Readonly<Record<string, unknown>>,\n signal?: AbortSignal,\n) => readonly SheetError[] | null | Promise<readonly SheetError[] | null>;\n\nconst registry = new Registry<(...args: unknown[]) => unknown>();\n\nregisterRequiredValidator((name, fn, opts) => {\n registry.register(name, fn, opts);\n});\n\nfunction getCellValidator(name: string): CellValidatorFn | undefined {\n const entry = registry.get(name);\n if (!entry || entry.type !== 'cell') return undefined;\n return entry.fn as CellValidatorFn;\n}\n\nfunction getRowValidator(_name: string): RowValidatorFn | undefined {\n return undefined;\n}\n\nfunction getTableValidator(_name: string): TableValidatorFn | undefined {\n return undefined;\n}\n\nexport function getValidatorGetters(): {\n getCellValidator: (name: string) => CellValidatorFn | undefined;\n getRowValidator: (name: string) => RowValidatorFn | undefined;\n getTableValidator: (name: string) => TableValidatorFn | undefined;\n} {\n return { getCellValidator, getRowValidator, getTableValidator };\n}\n","import type { ValidatorOrWithParams } from '../../../types/sheet-layout.js';\n\nexport interface ResolvedValidatorRef {\n readonly name: string;\n readonly params?: Readonly<Record<string, unknown>>;\n}\n\nexport function resolveValidatorRef(ref: ValidatorOrWithParams): ResolvedValidatorRef {\n if (typeof ref === 'string') return { name: ref };\n return { name: ref.name, params: ref.params };\n}\n","import type { SheetLayoutField } from '../../../types/sheet-layout.js';\nimport type { SheetError } from '../../../types/error.js';\nimport type { SanitizedSheetCell, SanitizedSheetRow } from '../../sanitizer/types/sanitized-sheet.js';\nimport { resolveValidatorRef } from './resolve-validator-ref.js';\n\nexport type CellValidatorFn = (\n value: unknown,\n row: SanitizedSheetRow,\n params?: Readonly<Record<string, unknown>>,\n) => readonly SheetError[] | null;\n\nexport type GetCellValidator = (name: string) => CellValidatorFn | undefined;\n\nexport function runCellValidators(\n cell: SanitizedSheetCell,\n row: SanitizedSheetRow,\n field: SheetLayoutField,\n getValidator: GetCellValidator,\n): readonly SheetError[] {\n const list = field.validators;\n if (!list?.length) return [];\n const errors: SheetError[] = [];\n for (const ref of list) {\n const { name, params } = resolveValidatorRef(ref);\n const fn = getValidator(name);\n if (fn) {\n const result = fn(cell.value, row, params);\n if (result?.length) {\n errors.push(...result);\n const hasFatal = result.some((e) => e.level === 'fatal');\n if (hasFatal) break;\n }\n }\n }\n return errors;\n}\n","import type { SheetLayout } from '../../../types/sheet-layout.js';\nimport type { SheetError } from '../../../types/error.js';\nimport type { SanitizedSheetRow } from '../../sanitizer/types/sanitized-sheet.js';\nimport { resolveValidatorRef } from './resolve-validator-ref.js';\n\nexport type RowValidatorFn = (\n row: SanitizedSheetRow,\n params?: Readonly<Record<string, unknown>>,\n) => readonly SheetError[] | null;\n\nexport type GetRowValidator = (name: string) => RowValidatorFn | undefined;\n\nexport function runRowValidators(\n row: SanitizedSheetRow,\n sheetLayout: SheetLayout,\n getValidator: GetRowValidator,\n): readonly SheetError[] {\n const list = sheetLayout.rowValidators;\n if (!list?.length) return [];\n const errors: SheetError[] = [];\n for (const ref of list) {\n const { name, params } = resolveValidatorRef(ref);\n const fn = getValidator(name);\n if (fn) {\n const result = fn(row, params);\n if (result?.length) {\n errors.push(...result);\n const hasFatal = result.some((e) => e.level === 'fatal');\n if (hasFatal) break;\n }\n }\n }\n return errors;\n}\n","import type { SheetLayout } from '../../../types/sheet-layout.js';\nimport type { SheetError } from '../../../types/error.js';\nimport type { SanitizedSheet } from '../../sanitizer/types/sanitized-sheet.js';\nimport type { ValidatorErrorDeltaItem } from '../types/validator-delta.js';\nimport { resolveValidatorRef } from './resolve-validator-ref.js';\n\nexport const EXTERNAL_VALIDATION_FAILED = 'EXTERNAL_VALIDATION_FAILED';\n\nexport type TableValidatorFn = (\n sheet: SanitizedSheet,\n params?: Readonly<Record<string, unknown>>,\n signal?: AbortSignal,\n) => readonly SheetError[] | null | Promise<readonly SheetError[] | null>;\n\nexport type GetTableValidator = (name: string) => TableValidatorFn | undefined;\n\nfunction toSheetLevelItems(errors: readonly SheetError[]): ValidatorErrorDeltaItem[] {\n return errors.map((error) => ({ error }));\n}\n\nexport async function runTableValidation(\n sheet: SanitizedSheet,\n sheetLayout: SheetLayout,\n getValidator: GetTableValidator,\n signal?: AbortSignal,\n): Promise<ValidatorErrorDeltaItem[]> {\n const list = sheetLayout.sheetValidators;\n if (!list?.length) return [];\n const collected: ValidatorErrorDeltaItem[] = [];\n for (const ref of list) {\n const { name, params } = resolveValidatorRef(ref);\n const fn = getValidator(name);\n if (!fn) continue;\n try {\n const result = await Promise.resolve(fn(sheet, params, signal));\n if (result?.length) collected.push(...toSheetLevelItems(result));\n } catch {\n collected.push({\n error: {\n code: EXTERNAL_VALIDATION_FAILED,\n level: 'fatal',\n params: { reason: 'network' },\n },\n });\n }\n }\n return collected;\n}\n"],"mappings":"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","names":["REQUIRED_VALIDATOR_ID","cellRequiredValidator","value","_row","_params","registerRequiredValidator","register","registry","Registry","registerRequiredValidator","name","fn","opts","getCellValidator","entry","getRowValidator","_name","getTableValidator","getValidatorGetters","resolveValidatorRef","ref","runCellValidators","cell","row","field","getValidator","list","errors","ref","name","params","resolveValidatorRef","fn","result","e","runRowValidators","row","sheetLayout","getValidator","list","errors","ref","name","params","resolveValidatorRef","fn","result","e","EXTERNAL_VALIDATION_FAILED","toSheetLevelItems","errors","error","runTableValidation","sheet","sheetLayout","getValidator","signal","list","collected","ref","name","params","resolveValidatorRef","fn","result"]}
@@ -0,0 +1,2 @@
1
+ import{a as u}from"./chunk-YETPLYYC.js";var R="toUpperCase";function c(e,r,t,n){return typeof e!="string"?e:e.toUpperCase()}function y(e){e(R,c,{type:"cell"})}var T=new u;y((e,r,t)=>{T.register(e,r,t)});function w(e){let r=T.get(e);if(!(!r||r.type!=="cell"))return r.fn}function h(e){}function g(e){}function x(){return{getCellTransform:w,getRowTransform:h,getSheetTransform:g}}function m(e){return typeof e=="string"?{name:e}:{name:e.name,params:e.params}}function I(e,r,t,n){if(e.errors.length>0)return e.value;let o=t.transformations;if(!o?.length)return e.value;let a=e.value;for(let s of o){let{name:i,params:l}=m(s),f=n(i);f&&(a=f(a,e,r,l))}return a}function E(e,r,t){if(e.errors.length>0)return e;let n=r.rowTransformations;if(!n?.length)return e;let o=e;for(let a of n){let{name:s,params:i}=m(a),l=t(s);l&&(o=l(o,i))}return o}var S="EXTERNAL_TRANSFORM_FAILED";async function O(e,r,t,n){let o=r.sheetTransformations;if(!o?.length)return{deltas:[],errors:[]};let a=[],s=[];for(let i of o){let{name:l,params:f}=m(i),p=t(l);if(p)try{let d=await Promise.resolve(p(e,f,n));d?.length&&a.push(...d)}catch{s.push({code:S,level:"fatal",params:{reason:"network"}})}}return{deltas:a,errors:s}}function V(e,r,t,n){return e.map(o=>{if(o.index!==r)return o;let a=o.cells.map(s=>s.key===t?{...s,value:n}:s);return{...o,cells:a}})}function U(e,r){if(!r.deltas.length)return e;let t=[...e.rows];for(let n of r.deltas)n.row<0||(t=V(t,n.row,n.col,n.newValue));return{...e,rows:t}}export{I as a,E as b,O as c,U as d,x as e};
2
+ //# sourceMappingURL=chunk-77DDFTT3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/controller/string/cell-to-upper-transform.ts","../src/core/transform/worker/worker-registry.ts","../src/core/transform/runner/resolve-transform-ref.ts","../src/core/transform/runner/cell-transforms.ts","../src/core/transform/runner/row-transforms.ts","../src/core/transform/runner/sheet-transforms.ts","../src/core/transform/delta-applier.ts"],"sourcesContent":["import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const TO_UPPER_TRANSFORM_ID = 'toUpperCase';\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>,\n) => unknown;\n\nexport function cellToUpperTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>,\n): unknown {\n if (typeof value !== 'string') return value;\n return value.toUpperCase();\n}\n\nexport function registerToUpperTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void,\n): void {\n register(TO_UPPER_TRANSFORM_ID, cellToUpperTransform, { type: 'cell' });\n}\n\nexport const CellToUpperTransform = {\n id: TO_UPPER_TRANSFORM_ID,\n transform: cellToUpperTransform,\n Register(registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void): string {\n if (registerFn) registerToUpperTransform(registerFn);\n return TO_UPPER_TRANSFORM_ID;\n },\n};\n","import { Registry } from '../../../shared/registry/index.js';\nimport { registerToUpperTransform } from '../../../utils/controller/string/cell-to-upper-transform.js';\nimport type { Sheet } from '../../../types/sheet.js';\nimport type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\nimport type { TransformDeltaItem } from '../types/transform-delta.js';\nimport type { TransformGetters } from '../runner/run-transform.js';\n\ntype CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n p?: Readonly<Record<string, unknown>>,\n) => unknown;\n\ntype RowTransformFn = (\n row: ValidatedRow,\n p?: Readonly<Record<string, unknown>>,\n) => ValidatedRow;\n\ntype SheetTransformFn = (\n sheet: Sheet,\n p?: Readonly<Record<string, unknown>>,\n signal?: AbortSignal,\n) => readonly TransformDeltaItem[] | Promise<readonly TransformDeltaItem[]>;\n\nconst registry = new Registry<(...args: unknown[]) => unknown>();\n\nregisterToUpperTransform((name, fn, opts) => {\n registry.register(name, fn, opts);\n});\n\nfunction getCellTransform(name: string): CellTransformFn | undefined {\n const entry = registry.get(name);\n if (!entry || entry.type !== 'cell') return undefined;\n return entry.fn as CellTransformFn;\n}\n\nfunction getRowTransform(_name: string): RowTransformFn | undefined {\n return undefined;\n}\n\nfunction getSheetTransform(_name: string): SheetTransformFn | undefined {\n return undefined;\n}\n\nexport function getTransformGetters(): TransformGetters {\n return {\n getCellTransform,\n getRowTransform,\n getSheetTransform,\n };\n}\n","import type { ValidatorOrWithParams } from '../../../types/sheet-layout.js';\n\nexport interface ResolvedTransformRef {\n readonly name: string;\n readonly params?: Readonly<Record<string, unknown>>;\n}\n\nexport function resolveTransformRef(ref: ValidatorOrWithParams): ResolvedTransformRef {\n if (typeof ref === 'string') return { name: ref };\n return { name: ref.name, params: ref.params };\n}\n","import type { SheetLayoutField } from '../../../types/sheet-layout.js';\nimport type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\nimport { resolveTransformRef } from './resolve-transform-ref.js';\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>,\n) => unknown;\n\nexport type GetCellTransform = (name: string) => CellTransformFn | undefined;\n\nexport function runCellTransforms(\n cell: ValidatedCell,\n row: ValidatedRow,\n field: SheetLayoutField,\n getTransform: GetCellTransform,\n): unknown {\n if (cell.errors.length > 0) return cell.value;\n const list = field.transformations;\n if (!list?.length) return cell.value;\n let current: unknown = cell.value;\n for (const ref of list) {\n const { name, params } = resolveTransformRef(ref);\n const fn = getTransform(name);\n if (fn) current = fn(current, cell, row, params);\n }\n return current;\n}\n","import type { SheetLayout } from '../../../types/sheet-layout.js';\nimport type { ValidatedRow } from '../../../types/sheet.js';\nimport { resolveTransformRef } from './resolve-transform-ref.js';\n\nexport type RowTransformFn = (\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>,\n) => ValidatedRow;\n\nexport type GetRowTransform = (name: string) => RowTransformFn | undefined;\n\nexport function runRowTransforms(\n row: ValidatedRow,\n sheetLayout: SheetLayout,\n getTransform: GetRowTransform,\n): ValidatedRow {\n if (row.errors.length > 0) return row;\n const list = sheetLayout.rowTransformations;\n if (!list?.length) return row;\n let current: ValidatedRow = row;\n for (const ref of list) {\n const { name, params } = resolveTransformRef(ref);\n const fn = getTransform(name);\n if (fn) current = fn(current, params);\n }\n return current;\n}\n","import type { SheetError } from '../../../types/error.js';\nimport type { SheetLayout } from '../../../types/sheet-layout.js';\nimport type { Sheet } from '../../../types/sheet.js';\nimport type { TransformDeltaItem } from '../types/transform-delta.js';\nimport { resolveTransformRef } from './resolve-transform-ref.js';\n\nexport const EXTERNAL_TRANSFORM_FAILED = 'EXTERNAL_TRANSFORM_FAILED';\n\nexport type SheetTransformFn = (\n sheet: Sheet,\n params?: Readonly<Record<string, unknown>>,\n signal?: AbortSignal,\n) => readonly TransformDeltaItem[] | Promise<readonly TransformDeltaItem[]>;\n\nexport type GetSheetTransform = (name: string) => SheetTransformFn | undefined;\n\nexport interface SheetTransformOutput {\n readonly deltas: TransformDeltaItem[];\n readonly errors: SheetError[];\n}\n\nexport async function runSheetTransforms(\n sheet: Sheet,\n sheetLayout: SheetLayout,\n getTransform: GetSheetTransform,\n signal?: AbortSignal,\n): Promise<SheetTransformOutput> {\n const list = sheetLayout.sheetTransformations;\n if (!list?.length) return { deltas: [], errors: [] };\n const deltas: TransformDeltaItem[] = [];\n const errors: SheetError[] = [];\n for (const ref of list) {\n const { name, params } = resolveTransformRef(ref);\n const fn = getTransform(name);\n if (!fn) continue;\n try {\n const result = await Promise.resolve(fn(sheet, params, signal));\n if (result?.length) deltas.push(...result);\n } catch {\n errors.push({\n code: EXTERNAL_TRANSFORM_FAILED,\n level: 'fatal',\n params: { reason: 'network' },\n });\n }\n }\n return { deltas, errors };\n}\n","import type { Sheet, ValidatedCell, ValidatedRow } from '../../types/sheet.js';\nimport type { TransformDelta } from './types/transform-delta.js';\n\nfunction patchCellInRow(\n rows: ValidatedRow[],\n rowIndex: number,\n col: string,\n newValue: unknown,\n): ValidatedRow[] {\n return rows.map((row) => {\n if (row.index !== rowIndex) return row;\n const cells: ValidatedCell[] = row.cells.map((cell) =>\n cell.key === col ? { ...cell, value: newValue } : cell,\n );\n return { ...row, cells };\n });\n}\n\nexport function applyTransformDelta(sheet: Sheet, delta: TransformDelta): Sheet {\n if (!delta.deltas.length) return sheet;\n let rows = [...sheet.rows];\n for (const item of delta.deltas) {\n if (item.row < 0) continue;\n rows = patchCellInRow(rows, item.row, item.col, item.newValue);\n }\n return { ...sheet, rows };\n}\n"],"mappings":"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","names":["TO_UPPER_TRANSFORM_ID","cellToUpperTransform","value","_cell","_row","_params","registerToUpperTransform","register","registry","Registry","registerToUpperTransform","name","fn","opts","getCellTransform","entry","getRowTransform","_name","getSheetTransform","getTransformGetters","resolveTransformRef","ref","runCellTransforms","cell","row","field","getTransform","list","current","ref","name","params","resolveTransformRef","fn","runRowTransforms","row","sheetLayout","getTransform","list","current","ref","name","params","resolveTransformRef","fn","EXTERNAL_TRANSFORM_FAILED","runSheetTransforms","sheet","sheetLayout","getTransform","signal","list","deltas","errors","ref","name","params","resolveTransformRef","fn","result","patchCellInRow","rows","rowIndex","col","newValue","row","cells","cell","applyTransformDelta","sheet","delta","item"]}
@@ -0,0 +1,2 @@
1
+ function e(t){return t==null||t===""?null:typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t instanceof Date||typeof t=="object"&&t!==null&&"getTime"in t&&typeof t.getTime=="function"||typeof t=="number"&&Number.isFinite(t)?t:String(t)}export{e as a};
2
+ //# sourceMappingURL=chunk-BCDDC5UG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/parser/engines/normalize-cell.ts"],"sourcesContent":["import type { RawSheetCellValue } from '../../../../types/raw-sheet.js';\n\nexport function toRawSheetCellValue(value: unknown): RawSheetCellValue {\n if (value === null || value === undefined || value === '') return null;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value;\n if (value instanceof Date) return value;\n if (typeof value === 'object' && value !== null && 'getTime' in value && typeof (value as Date).getTime === 'function') {\n return value as Date;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return String(value);\n}\n"],"mappings":"AAEO,SAASA,EAAoBC,EAAmC,CACrE,OAAIA,GAAU,MAA+BA,IAAU,GAAW,KAC9D,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAAY,OAAOA,GAAU,WAC3EA,aAAiB,MACjB,OAAOA,GAAU,UAAYA,IAAU,MAAQ,YAAaA,GAAS,OAAQA,EAAe,SAAY,YAGxG,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EAAUA,EACzD,OAAOA,CAAK,CACrB","names":["toRawSheetCellValue","value"]}
@@ -0,0 +1,2 @@
1
+ function n(t){if(t==null||t==="")return null;if(typeof t=="string"||typeof t=="number"||typeof t=="boolean")return t;if(t instanceof Date&&!Number.isNaN(t.getTime()))return t.toISOString();if(typeof t=="object"&&t!==null&&"getTime"in t&&typeof t.getTime=="function"){let e=t.getTime();return Number.isNaN(e)?String(t):new Date(e).toISOString()}return typeof t=="number"&&Number.isFinite(t)?t:String(t)}export{n as a};
2
+ //# sourceMappingURL=chunk-J2IHY56K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/parser/engines/normalize-cell.ts"],"sourcesContent":["import type { RawSheetCellValue } from '../../../../types/raw-sheet.js';\n\nexport function toRawSheetCellValue(value: unknown): RawSheetCellValue {\n if (value === null || value === undefined || value === '') return null;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value;\n // Convert Date to ISO string so Comlink can serialize across worker boundary (Date has Symbol.toPrimitive)\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value.toISOString();\n if (typeof value === 'object' && value !== null && 'getTime' in value && typeof (value as Date).getTime === 'function') {\n const ms = (value as Date).getTime();\n return Number.isNaN(ms) ? String(value) : new Date(ms).toISOString();\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return String(value);\n}\n"],"mappings":"AAEO,SAASA,EAAoBC,EAAmC,CACrE,GAAIA,GAAU,MAA+BA,IAAU,GAAI,OAAO,KAClE,GAAI,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAAW,OAAOA,EAEjG,GAAIA,aAAiB,MAAQ,CAAC,OAAO,MAAMA,EAAM,QAAQ,CAAC,EAAG,OAAOA,EAAM,YAAY,EACtF,GAAI,OAAOA,GAAU,UAAYA,IAAU,MAAQ,YAAaA,GAAS,OAAQA,EAAe,SAAY,WAAY,CACtH,IAAMC,EAAMD,EAAe,QAAQ,EACnC,OAAO,OAAO,MAAMC,CAAE,EAAI,OAAOD,CAAK,EAAI,IAAI,KAAKC,CAAE,EAAE,YAAY,CACrE,CACA,OAAI,OAAOD,GAAU,UAAY,OAAO,SAASA,CAAK,EAAUA,EACzD,OAAOA,CAAK,CACrB","names":["toRawSheetCellValue","value","ms"]}
@@ -0,0 +1,2 @@
1
+ function i(e,t){return e.rows.find(o=>o.index===t)}function f(e,t){return e.cells.find(o=>o.key===t)}function R(e,t){if(!i(e,t))return e;let d=e.rows.filter(n=>n.index!==t).map((n,r)=>({...n,index:r}));return{...e,rows:d}}function V(e,t,o,d){let n=i(e,t);if(!n)return e;let r=n.cells.findIndex(l=>l.key===o);if(r<0)return e;let a={...n.cells[r],value:d,errors:[]},s=n.cells.map((l,u)=>u===r?a:l),w={...n,cells:s,errors:[]},c=e.rows.map(l=>l.index===t?w:l);return{...e,rows:c}}export{i as a,f as b,R as c,V as d};
2
+ //# sourceMappingURL=chunk-UCBBDF6X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/editor/resolve.ts","../src/core/editor/immutable-update.ts"],"sourcesContent":["import type { Sheet, ValidatedCell, ValidatedRow } from '../../types/sheet.js';\n\nexport function getRowByIndex(\n sheet: Sheet,\n rowIndex: number,\n): ValidatedRow | undefined {\n return sheet.rows.find((row) => row.index === rowIndex);\n}\n\nexport function getCellByKey(\n row: ValidatedRow,\n cellKey: string,\n): ValidatedCell | undefined {\n return row.cells.find((cell) => cell.key === cellKey);\n}\n","import type { Sheet, ValidatedCell, ValidatedRow } from '../../types/sheet.js';\nimport { getRowByIndex } from './resolve.js';\n\nexport function removeRow(sheet: Sheet, rowIndex: number): Sheet {\n const row = getRowByIndex(sheet, rowIndex);\n if (!row) return sheet;\n const newRows: ValidatedRow[] = sheet.rows\n .filter((r) => r.index !== rowIndex)\n .map((r, i) => ({ ...r, index: i }));\n return { ...sheet, rows: newRows };\n}\n\nexport function setCellValue(\n sheet: Sheet,\n rowIndex: number,\n cellKey: string,\n value: unknown\n): Sheet {\n const row = getRowByIndex(sheet, rowIndex);\n if (!row) return sheet;\n const cellIndex = row.cells.findIndex((c) => c.key === cellKey);\n if (cellIndex < 0) return sheet;\n const newCell: ValidatedCell = { ...row.cells[cellIndex]!, value, errors: [] };\n const newCells: ValidatedCell[] = row.cells.map((c, i) => (i === cellIndex ? newCell : c));\n const newRow: ValidatedRow = { ...row, cells: newCells, errors: [] };\n const newRows: ValidatedRow[] = sheet.rows.map((r) => (r.index === rowIndex ? newRow : r));\n return { ...sheet, rows: newRows };\n}\n"],"mappings":"AAEO,SAASA,EACdC,EACAC,EAC0B,CAC1B,OAAOD,EAAM,KAAK,KAAME,GAAQA,EAAI,QAAUD,CAAQ,CACxD,CAEO,SAASE,EACdD,EACAE,EAC2B,CAC3B,OAAOF,EAAI,MAAM,KAAMG,GAASA,EAAK,MAAQD,CAAO,CACtD,CCXO,SAASE,EAAUC,EAAcC,EAAyB,CAE/D,GAAI,CADQC,EAAcF,EAAOC,CAAQ,EAC/B,OAAOD,EACjB,IAAMG,EAA0BH,EAAM,KACnC,OAAQI,GAAMA,EAAE,QAAUH,CAAQ,EAClC,IAAI,CAACG,EAAGC,KAAO,CAAE,GAAGD,EAAG,MAAOC,CAAE,EAAE,EACrC,MAAO,CAAE,GAAGL,EAAO,KAAMG,CAAQ,CACnC,CAEO,SAASG,EACdN,EACAC,EACAM,EACAC,EACO,CACP,IAAMC,EAAMP,EAAcF,EAAOC,CAAQ,EACzC,GAAI,CAACQ,EAAK,OAAOT,EACjB,IAAMU,EAAYD,EAAI,MAAM,UAAWE,GAAMA,EAAE,MAAQJ,CAAO,EAC9D,GAAIG,EAAY,EAAG,OAAOV,EAC1B,IAAMY,EAAyB,CAAE,GAAGH,EAAI,MAAMC,CAAS,EAAI,MAAAF,EAAO,OAAQ,CAAC,CAAE,EACvEK,EAA4BJ,EAAI,MAAM,IAAI,CAACE,EAAGN,IAAOA,IAAMK,EAAYE,EAAUD,CAAE,EACnFG,EAAuB,CAAE,GAAGL,EAAK,MAAOI,EAAU,OAAQ,CAAC,CAAE,EAC7DV,EAA0BH,EAAM,KAAK,IAAKI,GAAOA,EAAE,QAAUH,EAAWa,EAASV,CAAE,EACzF,MAAO,CAAE,GAAGJ,EAAO,KAAMG,CAAQ,CACnC","names":["getRowByIndex","sheet","rowIndex","row","getCellByKey","cellKey","cell","removeRow","sheet","rowIndex","getRowByIndex","newRows","r","i","setCellValue","cellKey","value","row","cellIndex","c","newCell","newCells","newRow"]}
@@ -0,0 +1,2 @@
1
+ import{a as c}from"./chunk-YETPLYYC.js";var B="toUpperCase";function v(n,e,t,o){return typeof n!="string"?n:n.toUpperCase()}function g(n){n(B,v,{type:"cell"})}var $="toLowerCase";function G(n,e,t,o){return typeof n!="string"?n:n.toLowerCase()}function w(n){n($,G,{type:"cell"})}var Y="slice";function q(n,e,t,o){if(typeof n!="string")return n;let{start:r,end:l}=o??{},a=Number(r),s=Number(l);return Number.isNaN(a)&&Number.isNaN(s)?n:Number.isNaN(s)?n.slice(Number.isNaN(a)?void 0:a):n.slice(Number.isNaN(a)?void 0:a,s)}function T(n){n(Y,q,{type:"cell"})}var X="replace";function W(n,e,t,o){if(typeof n!="string")return n;let{search:r="",replacement:l=""}=o??{};return n.split(String(r)).join(String(l))}function y(n){n(X,W,{type:"cell"})}var H="replaceByRegex";function Q(n,e,t,o){if(typeof n!="string")return n;let{pattern:r="",flags:l="g",replacement:a=""}=o??{};if(!r)return n;try{let s=new RegExp(r,l);return n.replace(s,String(a))}catch{return n}}function R(n){n(H,Q,{type:"cell"})}var z="fillStart";function J(n,e,t,o){let r=typeof n=="string"?n:n==null?"":String(n),{length:l=0,fill:a=" "}=o??{},s=Math.max(0,Number(l)||0);return s>0?r.padStart(s,String(a)):r}function N(n){n(z,J,{type:"cell"})}var K="fillEnd";function Z(n,e,t,o){let r=typeof n=="string"?n:n==null?"":String(n),{length:l=0,fill:a=" "}=o??{},s=Math.max(0,Number(l)||0);return s>0?r.padEnd(s,String(a)):r}function b(n){n(K,Z,{type:"cell"})}var nn="extractByRegex";function en(n,e,t,o){let r=typeof n=="string"?n:n==null?"":String(n),{pattern:l="",flags:a="",group:s=0}=o??{};if(!l)return r;try{let i=new RegExp(l,a),u=r.match(i);if(!u)return"";let f=Math.max(0,Number(s)||0);return u[f]??u[0]??""}catch{return r}}function C(n){n(nn,en,{type:"cell"})}var rn="numberAdd";function tn(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function on(n,e,t,o){let r=tn(n);if(r===null)return n;let{value:l=0}=o??{},a=Number(l);return Number.isNaN(a)?n:r+a}function k(n){n(rn,on,{type:"cell"})}var an="numberMultiply";function ln(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function sn(n,e,t,o){let r=ln(n);if(r===null)return n;let{value:l=1}=o??{},a=Number(l);return Number.isNaN(a)?n:r*a}function V(n){n(an,sn,{type:"cell"})}var mn="numberDivide";function un(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function dn(n,e,t,o){let r=un(n);if(r===null)return n;let{value:l=1}=o??{},a=Number(l);return Number.isNaN(a)||a===0?n:r/a}function S(n){n(mn,dn,{type:"cell"})}var fn="numberSubtract";function pn(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function cn(n,e,t,o){let r=pn(n);if(r===null)return n;let{value:l=0}=o??{},a=Number(l);return Number.isNaN(a)?n:r-a}function x(n){n(fn,cn,{type:"cell"})}var gn="numberRound";function wn(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function Tn(n,e,t,o){let r=wn(n);if(r===null)return n;let{mode:l="round"}=o??{};return l==="ceil"?Math.ceil(r):l==="floor"?Math.floor(r):Math.round(r)}function D(n){n(gn,Tn,{type:"cell"})}var yn="numberAbs";function Rn(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function Nn(n,e,t,o){let r=Rn(n);return r===null?n:Math.abs(r)}function _(n){n(yn,Nn,{type:"cell"})}var bn="numberSqrt";function Cn(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function kn(n,e,t,o){let r=Cn(n);return r===null||r<0?n:Math.sqrt(r)}function h(n){n(bn,kn,{type:"cell"})}var Vn="numberLimit";function Sn(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function xn(n,e,t,o){let r=Sn(n);if(r===null)return n;let{min:l,max:a}=o??{},s=r,i=Number(l);!Number.isNaN(i)&&s<i&&(s=i);let u=Number(a);return!Number.isNaN(u)&&s>u&&(s=u),s}function F(n){n(Vn,xn,{type:"cell"})}var Dn="numberPercent";function _n(n){if(typeof n=="number"&&!Number.isNaN(n))return n;let e=Number(n);return Number.isNaN(e)?null:e}function hn(n,e,t,o){let r=_n(n);if(r===null)return n;let{total:l}=o??{},a=Number(l);return Number.isNaN(a)||a===0?n:r/a*100}function A(n){n(Dn,hn,{type:"cell"})}var Fn="dateToOnlyTime";function An(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)}function Mn(n){let e=String(n.getHours()).padStart(2,"0"),t=String(n.getMinutes()).padStart(2,"0"),o=String(n.getSeconds()).padStart(2,"0");return`${e}:${t}:${o}`}function On(n,e,t,o){let r=An(n);return r?Mn(r):n}function M(n){n(Fn,On,{type:"cell"})}var En="dateToOnlyDate";function In(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)}function Pn(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),o=String(n.getDate()).padStart(2,"0");return`${e}-${t}-${o}`}function Ln(n,e,t,o){let r=In(n);return r?Pn(r):n}function O(n){n(En,Ln,{type:"cell"})}var jn="dateToTimeDate";function Un(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)}function Bn(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),o=String(n.getDate()).padStart(2,"0");return`${e}-${t}-${o}`}function vn(n){let e=String(n.getHours()).padStart(2,"0"),t=String(n.getMinutes()).padStart(2,"0"),o=String(n.getSeconds()).padStart(2,"0");return`${e}:${t}:${o}`}function $n(n,e,t,o){let r=Un(n);return r?`${Bn(r)}T${vn(r)}`:n}function E(n){n(jn,$n,{type:"cell"})}var Gn="dateToUtc";function Yn(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)}function qn(n,e,t,o){let r=Yn(n);return r?r.toISOString():n}function I(n){n(Gn,qn,{type:"cell"})}var Xn="dateLimit";function Wn(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);if(!Number.isNaN(t))return new Date(t);let o=Number(n);return Number.isFinite(o)?new Date(o):null}function Hn(n,e,t,o){let r=Wn(n);if(!r)return n;let{min:l,max:a}=o??{},s=r.getTime();if(l!==void 0){let i=typeof l=="number"?new Date(l):new Date(String(l));!Number.isNaN(i.getTime())&&s<i.getTime()&&(s=i.getTime())}if(a!==void 0){let i=typeof a=="number"?new Date(a):new Date(String(a));!Number.isNaN(i.getTime())&&s>i.getTime()&&(s=i.getTime())}return new Date(s).toISOString()}function P(n){n(Xn,Hn,{type:"cell"})}var Qn="dateAdd";function zn(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)}function Jn(n,e){let t=new Date(n.getTime()),o=Number(e.ms)||0,r=Number(e.seconds)||0,l=Number(e.minutes)||0,a=Number(e.hours)||0,s=Number(e.days)||0;t.setTime(t.getTime()+o+r*1e3+l*6e4+a*36e5+s*864e5);let i=Number(e.months)||0,u=Number(e.years)||0;return(i||u)&&(t.setFullYear(t.getFullYear()+u),t.setMonth(t.getMonth()+i)),t}function Kn(n,e,t,o){let r=zn(n);return r?Jn(r,o??{}).toISOString():n}function L(n){n(Qn,Kn,{type:"cell"})}var Zn="dateSubtract";function ne(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(n==null)return null;let e=String(n).trim();if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)}function ee(n,e){let t=new Date(n.getTime()),o=Number(e.ms)||0,r=Number(e.seconds)||0,l=Number(e.minutes)||0,a=Number(e.hours)||0,s=Number(e.days)||0;t.setTime(t.getTime()-o-r*1e3-l*6e4-a*36e5-s*864e5);let i=Number(e.months)||0,u=Number(e.years)||0;return(i||u)&&(t.setFullYear(t.getFullYear()-u),t.setMonth(t.getMonth()-i)),t}function re(n,e,t,o){let r=ne(n);return r?ee(r,o??{}).toISOString():n}function j(n){n(Zn,re,{type:"cell"})}var U=new c;function m(n,e,t){U.register(n,e,t)}g(m);w(m);T(m);y(m);R(m);N(m);b(m);C(m);k(m);V(m);S(m);x(m);D(m);_(m);h(m);F(m);A(m);M(m);O(m);E(m);I(m);P(m);L(m);j(m);function te(n){let e=U.get(n);if(!(!e||e.type!=="cell"))return e.fn}function oe(n){}function ae(n){}function tr(){return{getCellTransform:te,getRowTransform:oe,getSheetTransform:ae}}function d(n){return typeof n=="string"?{name:n}:{name:n.name,params:n.params}}function sr(n,e,t,o){if(n.errors.length>0)return n.value;let r=t.transformations;if(!r?.length)return n.value;let l=n.value;for(let a of r){let{name:s,params:i}=d(a),u=o(s);u&&(l=u(l,n,e,i))}return l}function ur(n,e,t){if(n.errors.length>0)return n;let o=e.rowTransformations;if(!o?.length)return n;let r=n;for(let l of o){let{name:a,params:s}=d(l),i=t(a);i&&(r=i(r,s))}return r}var le="EXTERNAL_TRANSFORM_FAILED";async function pr(n,e,t,o){let r=e.sheetTransformations;if(!r?.length)return{deltas:[],errors:[]};let l=[],a=[];for(let s of r){let{name:i,params:u}=d(s),f=t(i);if(f)try{let p=await Promise.resolve(f(n,u,o));p?.length&&l.push(...p)}catch{a.push({code:le,level:"fatal",params:{reason:"network"}})}}return{deltas:l,errors:a}}function se(n,e,t,o){return n.map(r=>{if(r.index!==e)return r;let l=r.cells.map(a=>a.key===t?{...a,value:o}:a);return{...r,cells:l}})}function gr(n,e){if(!e.deltas.length)return n;let t=[...n.rows];for(let o of e.deltas)o.row<0||(t=se(t,o.row,o.col,o.newValue));return{...n,rows:t}}export{sr as a,ur as b,pr as c,gr as d,tr as e};
2
+ //# sourceMappingURL=chunk-WLNB3X2R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/controller/string/cell-to-upper-transform.ts","../src/utils/controller/string/cell-string-tolower-transform.ts","../src/utils/controller/string/cell-string-slice-transform.ts","../src/utils/controller/string/cell-string-replace-transform.ts","../src/utils/controller/string/cell-string-replace-regex-transform.ts","../src/utils/controller/string/cell-string-fill-start-transform.ts","../src/utils/controller/string/cell-string-fill-end-transform.ts","../src/utils/controller/string/cell-string-extract-regex-transform.ts","../src/utils/controller/number/cell-number-add-transform.ts","../src/utils/controller/number/cell-number-multiply-transform.ts","../src/utils/controller/number/cell-number-divide-transform.ts","../src/utils/controller/number/cell-number-subtract-transform.ts","../src/utils/controller/number/cell-number-round-transform.ts","../src/utils/controller/number/cell-number-abs-transform.ts","../src/utils/controller/number/cell-number-sqrt-transform.ts","../src/utils/controller/number/cell-number-limit-transform.ts","../src/utils/controller/number/cell-number-percent-transform.ts","../src/utils/controller/date/cell-date-to-only-time-transform.ts","../src/utils/controller/date/cell-date-to-only-date-transform.ts","../src/utils/controller/date/cell-date-to-time-date-transform.ts","../src/utils/controller/date/cell-date-to-utc-transform.ts","../src/utils/controller/date/cell-date-limit-transform.ts","../src/utils/controller/date/cell-date-add-transform.ts","../src/utils/controller/date/cell-date-subtract-transform.ts","../src/core/transform/worker/worker-registry.ts","../src/core/transform/runner/resolve-transform-ref.ts","../src/core/transform/runner/cell-transforms.ts","../src/core/transform/runner/row-transforms.ts","../src/core/transform/runner/sheet-transforms.ts","../src/core/transform/delta-applier.ts"],"sourcesContent":["import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const TO_UPPER_TRANSFORM_ID = 'toUpperCase';\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>,\n) => unknown;\n\nexport function cellToUpperTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>,\n): unknown {\n if (typeof value !== 'string') return value;\n return value.toUpperCase();\n}\n\nexport function registerToUpperTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void,\n): void {\n register(TO_UPPER_TRANSFORM_ID, cellToUpperTransform, { type: 'cell' });\n}\n\nexport const CellToUpperTransform = {\n id: TO_UPPER_TRANSFORM_ID,\n transform: cellToUpperTransform,\n Register(registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void): string {\n if (registerFn) registerToUpperTransform(registerFn);\n return TO_UPPER_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const TO_LOWER_TRANSFORM_ID = 'toLowerCase';\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringToLowerTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n if (typeof value !== 'string') return value;\n return value.toLowerCase();\n}\n\nexport function registerStringToLowerTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(TO_LOWER_TRANSFORM_ID, cellStringToLowerTransform, { type: 'cell' });\n}\n\nexport const CellStringToLowerTransform = {\n id: TO_LOWER_TRANSFORM_ID,\n transform: cellStringToLowerTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringToLowerTransform(registerFn);\n return TO_LOWER_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const SLICE_TRANSFORM_ID = 'slice';\n\ntype Params = { start?: number; end?: number };\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringSliceTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n if (typeof value !== 'string') return value;\n const { start, end } = (params ?? {}) as Params;\n const s = Number(start);\n const e = Number(end);\n if (Number.isNaN(s) && Number.isNaN(e)) return value;\n if (Number.isNaN(e)) return value.slice(Number.isNaN(s) ? undefined : s);\n return value.slice(Number.isNaN(s) ? undefined : s, e);\n}\n\nexport function registerStringSliceTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(SLICE_TRANSFORM_ID, cellStringSliceTransform, { type: 'cell' });\n}\n\nexport const CellStringSliceTransform = {\n id: SLICE_TRANSFORM_ID,\n transform: cellStringSliceTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringSliceTransform(registerFn);\n return SLICE_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const REPLACE_STR_TRANSFORM_ID = 'replace';\n\ntype Params = { search?: string; replacement?: string };\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringReplaceTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n if (typeof value !== 'string') return value;\n const { search = '', replacement = '' } = (params ?? {}) as Params;\n return value.split(String(search)).join(String(replacement));\n}\n\nexport function registerStringReplaceTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(REPLACE_STR_TRANSFORM_ID, cellStringReplaceTransform, { type: 'cell' });\n}\n\nexport const CellStringReplaceTransform = {\n id: REPLACE_STR_TRANSFORM_ID,\n transform: cellStringReplaceTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringReplaceTransform(registerFn);\n return REPLACE_STR_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const REPLACE_BY_REGEX_TRANSFORM_ID = 'replaceByRegex';\n\ntype Params = { pattern?: string; flags?: string; replacement?: string };\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringReplaceByRegexTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n if (typeof value !== 'string') return value;\n const { pattern = '', flags = 'g', replacement = '' } = (params ?? {}) as Params;\n if (!pattern) return value;\n try {\n const re = new RegExp(pattern, flags);\n return value.replace(re, String(replacement));\n } catch {\n return value;\n }\n}\n\nexport function registerStringReplaceByRegexTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(REPLACE_BY_REGEX_TRANSFORM_ID, cellStringReplaceByRegexTransform, { type: 'cell' });\n}\n\nexport const CellStringReplaceByRegexTransform = {\n id: REPLACE_BY_REGEX_TRANSFORM_ID,\n transform: cellStringReplaceByRegexTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringReplaceByRegexTransform(registerFn);\n return REPLACE_BY_REGEX_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const FILL_START_TRANSFORM_ID = 'fillStart';\n\ntype Params = { length?: number; fill?: string };\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringFillStartTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const s =\n typeof value === 'string' ? value : value === null || value === undefined ? '' : String(value);\n const { length = 0, fill = ' ' } = (params ?? {}) as Params;\n const safeLength = Math.max(0, Number(length) || 0);\n return safeLength > 0 ? s.padStart(safeLength, String(fill)) : s;\n}\n\nexport function registerStringFillStartTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(FILL_START_TRANSFORM_ID, cellStringFillStartTransform, { type: 'cell' });\n}\n\nexport const CellStringFillStartTransform = {\n id: FILL_START_TRANSFORM_ID,\n transform: cellStringFillStartTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringFillStartTransform(registerFn);\n return FILL_START_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const FILL_END_TRANSFORM_ID = 'fillEnd';\n\ntype Params = { length?: number; fill?: string };\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringFillEndTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const s =\n typeof value === 'string' ? value : value === null || value === undefined ? '' : String(value);\n const { length = 0, fill = ' ' } = (params ?? {}) as Params;\n const safeLength = Math.max(0, Number(length) || 0);\n return safeLength > 0 ? s.padEnd(safeLength, String(fill)) : s;\n}\n\nexport function registerStringFillEndTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(FILL_END_TRANSFORM_ID, cellStringFillEndTransform, { type: 'cell' });\n}\n\nexport const CellStringFillEndTransform = {\n id: FILL_END_TRANSFORM_ID,\n transform: cellStringFillEndTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringFillEndTransform(registerFn);\n return FILL_END_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const EXTRACT_BY_REGEX_TRANSFORM_ID = 'extractByRegex';\n\ntype Params = { pattern?: string; flags?: string; group?: number };\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellStringExtractByRegexTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const s =\n typeof value === 'string' ? value : value === null || value === undefined ? '' : String(value);\n const { pattern = '', flags = '', group = 0 } = (params ?? {}) as Params;\n if (!pattern) return s;\n try {\n const re = new RegExp(pattern, flags);\n const m = s.match(re);\n if (!m) return '';\n const g = Math.max(0, Number(group) || 0);\n return m[g] ?? m[0] ?? '';\n } catch {\n return s;\n }\n}\n\nexport function registerStringExtractByRegexTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(EXTRACT_BY_REGEX_TRANSFORM_ID, cellStringExtractByRegexTransform, { type: 'cell' });\n}\n\nexport const CellStringExtractByRegexTransform = {\n id: EXTRACT_BY_REGEX_TRANSFORM_ID,\n transform: cellStringExtractByRegexTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerStringExtractByRegexTransform(registerFn);\n return EXTRACT_BY_REGEX_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_ADD_TRANSFORM_ID = 'numberAdd';\n\ntype Params = { value?: number };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberAddTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { value: add = 0 } = (params ?? {}) as Params;\n const delta = Number(add);\n return Number.isNaN(delta) ? value : n + delta;\n}\n\nexport function registerNumberAddTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_ADD_TRANSFORM_ID, cellNumberAddTransform, { type: 'cell' });\n}\n\nexport const CellNumberAddTransform = {\n id: NUMBER_ADD_TRANSFORM_ID,\n transform: cellNumberAddTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberAddTransform(registerFn);\n return NUMBER_ADD_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_MULTIPLY_TRANSFORM_ID = 'numberMultiply';\n\ntype Params = { value?: number };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberMultiplyTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { value: factor = 1 } = (params ?? {}) as Params;\n const f = Number(factor);\n return Number.isNaN(f) ? value : n * f;\n}\n\nexport function registerNumberMultiplyTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_MULTIPLY_TRANSFORM_ID, cellNumberMultiplyTransform, { type: 'cell' });\n}\n\nexport const CellNumberMultiplyTransform = {\n id: NUMBER_MULTIPLY_TRANSFORM_ID,\n transform: cellNumberMultiplyTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberMultiplyTransform(registerFn);\n return NUMBER_MULTIPLY_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_DIVIDE_TRANSFORM_ID = 'numberDivide';\n\ntype Params = { value?: number };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberDivideTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { value: divisor = 1 } = (params ?? {}) as Params;\n const d = Number(divisor);\n if (Number.isNaN(d) || d === 0) return value;\n return n / d;\n}\n\nexport function registerNumberDivideTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_DIVIDE_TRANSFORM_ID, cellNumberDivideTransform, { type: 'cell' });\n}\n\nexport const CellNumberDivideTransform = {\n id: NUMBER_DIVIDE_TRANSFORM_ID,\n transform: cellNumberDivideTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberDivideTransform(registerFn);\n return NUMBER_DIVIDE_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_SUBTRACT_TRANSFORM_ID = 'numberSubtract';\n\ntype Params = { value?: number };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberSubtractTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { value: sub = 0 } = (params ?? {}) as Params;\n const delta = Number(sub);\n return Number.isNaN(delta) ? value : n - delta;\n}\n\nexport function registerNumberSubtractTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_SUBTRACT_TRANSFORM_ID, cellNumberSubtractTransform, { type: 'cell' });\n}\n\nexport const CellNumberSubtractTransform = {\n id: NUMBER_SUBTRACT_TRANSFORM_ID,\n transform: cellNumberSubtractTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberSubtractTransform(registerFn);\n return NUMBER_SUBTRACT_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_ROUND_TRANSFORM_ID = 'numberRound';\n\ntype Params = { mode?: 'round' | 'ceil' | 'floor' };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberRoundTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { mode = 'round' } = (params ?? {}) as Params;\n if (mode === 'ceil') return Math.ceil(n);\n if (mode === 'floor') return Math.floor(n);\n return Math.round(n);\n}\n\nexport function registerNumberRoundTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_ROUND_TRANSFORM_ID, cellNumberRoundTransform, { type: 'cell' });\n}\n\nexport const CellNumberRoundTransform = {\n id: NUMBER_ROUND_TRANSFORM_ID,\n transform: cellNumberRoundTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberRoundTransform(registerFn);\n return NUMBER_ROUND_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_ABS_TRANSFORM_ID = 'numberAbs';\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberAbsTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n return Math.abs(n);\n}\n\nexport function registerNumberAbsTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_ABS_TRANSFORM_ID, cellNumberAbsTransform, { type: 'cell' });\n}\n\nexport const CellNumberAbsTransform = {\n id: NUMBER_ABS_TRANSFORM_ID,\n transform: cellNumberAbsTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberAbsTransform(registerFn);\n return NUMBER_ABS_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_SQRT_TRANSFORM_ID = 'numberSqrt';\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberSqrtTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null || n < 0) return value;\n return Math.sqrt(n);\n}\n\nexport function registerNumberSqrtTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_SQRT_TRANSFORM_ID, cellNumberSqrtTransform, { type: 'cell' });\n}\n\nexport const CellNumberSqrtTransform = {\n id: NUMBER_SQRT_TRANSFORM_ID,\n transform: cellNumberSqrtTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberSqrtTransform(registerFn);\n return NUMBER_SQRT_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_LIMIT_TRANSFORM_ID = 'numberLimit';\n\ntype Params = { min?: number; max?: number };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberLimitTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { min, max } = (params ?? {}) as Params;\n let out = n;\n const minVal = Number(min);\n if (!Number.isNaN(minVal) && out < minVal) out = minVal;\n const maxVal = Number(max);\n if (!Number.isNaN(maxVal) && out > maxVal) out = maxVal;\n return out;\n}\n\nexport function registerNumberLimitTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_LIMIT_TRANSFORM_ID, cellNumberLimitTransform, { type: 'cell' });\n}\n\nexport const CellNumberLimitTransform = {\n id: NUMBER_LIMIT_TRANSFORM_ID,\n transform: cellNumberLimitTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberLimitTransform(registerFn);\n return NUMBER_LIMIT_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const NUMBER_PERCENT_TRANSFORM_ID = 'numberPercent';\n\ntype Params = { total?: number };\n\nfunction toNumber(v: unknown): number | null {\n if (typeof v === 'number' && !Number.isNaN(v)) return v;\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellNumberPercentTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const n = toNumber(value);\n if (n === null) return value;\n const { total } = (params ?? {}) as Params;\n const t = Number(total);\n if (Number.isNaN(t) || t === 0) return value;\n return (n / t) * 100;\n}\n\nexport function registerNumberPercentTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(NUMBER_PERCENT_TRANSFORM_ID, cellNumberPercentTransform, { type: 'cell' });\n}\n\nexport const CellNumberPercentTransform = {\n id: NUMBER_PERCENT_TRANSFORM_ID,\n transform: cellNumberPercentTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerNumberPercentTransform(registerFn);\n return NUMBER_PERCENT_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_TO_ONLY_TIME_TRANSFORM_ID = 'dateToOnlyTime';\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nfunction toISOTimeString(d: Date): string {\n const h = String(d.getHours()).padStart(2, '0');\n const min = String(d.getMinutes()).padStart(2, '0');\n const s = String(d.getSeconds()).padStart(2, '0');\n return `${h}:${min}:${s}`;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateToOnlyTimeTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n return toISOTimeString(d);\n}\n\nexport function registerDateToOnlyTimeTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_TO_ONLY_TIME_TRANSFORM_ID, cellDateToOnlyTimeTransform, { type: 'cell' });\n}\n\nexport const CellDateToOnlyTimeTransform = {\n id: DATE_TO_ONLY_TIME_TRANSFORM_ID,\n transform: cellDateToOnlyTimeTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateToOnlyTimeTransform(registerFn);\n return DATE_TO_ONLY_TIME_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_TO_ONLY_DATE_TRANSFORM_ID = 'dateToOnlyDate';\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nfunction toISODateString(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateToOnlyDateTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n return toISODateString(d);\n}\n\nexport function registerDateToOnlyDateTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_TO_ONLY_DATE_TRANSFORM_ID, cellDateToOnlyDateTransform, { type: 'cell' });\n}\n\nexport const CellDateToOnlyDateTransform = {\n id: DATE_TO_ONLY_DATE_TRANSFORM_ID,\n transform: cellDateToOnlyDateTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateToOnlyDateTransform(registerFn);\n return DATE_TO_ONLY_DATE_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_TO_TIME_DATE_TRANSFORM_ID = 'dateToTimeDate';\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nfunction toISODateString(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nfunction toISOTimeString(d: Date): string {\n const h = String(d.getHours()).padStart(2, '0');\n const min = String(d.getMinutes()).padStart(2, '0');\n const s = String(d.getSeconds()).padStart(2, '0');\n return `${h}:${min}:${s}`;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateToTimeDateTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n return `${toISODateString(d)}T${toISOTimeString(d)}`;\n}\n\nexport function registerDateToTimeDateTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_TO_TIME_DATE_TRANSFORM_ID, cellDateToTimeDateTransform, { type: 'cell' });\n}\n\nexport const CellDateToTimeDateTransform = {\n id: DATE_TO_TIME_DATE_TRANSFORM_ID,\n transform: cellDateToTimeDateTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateToTimeDateTransform(registerFn);\n return DATE_TO_TIME_DATE_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_TO_UTC_TRANSFORM_ID = 'dateToUtc';\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateToUtcTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n _params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n return d.toISOString();\n}\n\nexport function registerDateToUtcTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_TO_UTC_TRANSFORM_ID, cellDateToUtcTransform, { type: 'cell' });\n}\n\nexport const CellDateToUtcTransform = {\n id: DATE_TO_UTC_TRANSFORM_ID,\n transform: cellDateToUtcTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateToUtcTransform(registerFn);\n return DATE_TO_UTC_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_LIMIT_TRANSFORM_ID = 'dateLimit';\n\ntype Params = { min?: string | number; max?: string | number };\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n if (!Number.isNaN(ms)) return new Date(ms);\n const n = Number(value);\n return Number.isFinite(n) ? new Date(n) : null;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateLimitTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n const { min, max } = (params ?? {}) as Params;\n let out = d.getTime();\n if (min !== undefined) {\n const minD = typeof min === 'number' ? new Date(min) : new Date(String(min));\n if (!Number.isNaN(minD.getTime()) && out < minD.getTime()) out = minD.getTime();\n }\n if (max !== undefined) {\n const maxD = typeof max === 'number' ? new Date(max) : new Date(String(max));\n if (!Number.isNaN(maxD.getTime()) && out > maxD.getTime()) out = maxD.getTime();\n }\n return new Date(out).toISOString();\n}\n\nexport function registerDateLimitTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_LIMIT_TRANSFORM_ID, cellDateLimitTransform, { type: 'cell' });\n}\n\nexport const CellDateLimitTransform = {\n id: DATE_LIMIT_TRANSFORM_ID,\n transform: cellDateLimitTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateLimitTransform(registerFn);\n return DATE_LIMIT_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_ADD_TRANSFORM_ID = 'dateAdd';\n\ntype Params = {\n days?: number;\n minutes?: number;\n hours?: number;\n seconds?: number;\n ms?: number;\n months?: number;\n years?: number;\n};\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nfunction addToDate(d: Date, p: Params): Date {\n const out = new Date(d.getTime());\n const ms = Number(p.ms) || 0;\n const sec = Number(p.seconds) || 0;\n const min = Number(p.minutes) || 0;\n const h = Number(p.hours) || 0;\n const days = Number(p.days) || 0;\n out.setTime(out.getTime() + ms + sec * 1000 + min * 60_000 + h * 3_600_000 + days * 86_400_000);\n const months = Number(p.months) || 0;\n const years = Number(p.years) || 0;\n if (months || years) {\n out.setFullYear(out.getFullYear() + years);\n out.setMonth(out.getMonth() + months);\n }\n return out;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateAddTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n return addToDate(d, (params ?? {}) as Params).toISOString();\n}\n\nexport function registerDateAddTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_ADD_TRANSFORM_ID, cellDateAddTransform, { type: 'cell' });\n}\n\nexport const CellDateAddTransform = {\n id: DATE_ADD_TRANSFORM_ID,\n transform: cellDateAddTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateAddTransform(registerFn);\n return DATE_ADD_TRANSFORM_ID;\n },\n};\n","import type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\n\nexport const DATE_SUBTRACT_TRANSFORM_ID = 'dateSubtract';\n\ntype Params = {\n days?: number;\n minutes?: number;\n hours?: number;\n seconds?: number;\n ms?: number;\n months?: number;\n years?: number;\n};\n\nfunction parseToDate(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (value === null || value === undefined) return null;\n const s = String(value).trim();\n if (!s) return null;\n const ms = Date.parse(s);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nfunction subtractFromDate(d: Date, p: Params): Date {\n const out = new Date(d.getTime());\n const ms = Number(p.ms) || 0;\n const sec = Number(p.seconds) || 0;\n const min = Number(p.minutes) || 0;\n const h = Number(p.hours) || 0;\n const days = Number(p.days) || 0;\n out.setTime(out.getTime() - ms - sec * 1000 - min * 60_000 - h * 3_600_000 - days * 86_400_000);\n const months = Number(p.months) || 0;\n const years = Number(p.years) || 0;\n if (months || years) {\n out.setFullYear(out.getFullYear() - years);\n out.setMonth(out.getMonth() - months);\n }\n return out;\n}\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n) => unknown;\n\nexport function cellDateSubtractTransform(\n value: unknown,\n _cell: ValidatedCell,\n _row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>\n): unknown {\n const d = parseToDate(value);\n if (!d) return value;\n return subtractFromDate(d, (params ?? {}) as Params).toISOString();\n}\n\nexport function registerDateSubtractTransform(\n register: (name: string, fn: CellTransformFn, options: { type: 'cell' }) => void\n): void {\n register(DATE_SUBTRACT_TRANSFORM_ID, cellDateSubtractTransform, { type: 'cell' });\n}\n\nexport const CellDateSubtractTransform = {\n id: DATE_SUBTRACT_TRANSFORM_ID,\n transform: cellDateSubtractTransform,\n Register(\n registerFn?: (name: string, fn: CellTransformFn, opts: { type: 'cell' }) => void\n ): string {\n if (registerFn) registerDateSubtractTransform(registerFn);\n return DATE_SUBTRACT_TRANSFORM_ID;\n },\n};\n","import { Registry } from '../../../shared/registry/index.js';\nimport { registerToUpperTransform } from '../../../utils/controller/string/cell-to-upper-transform.js';\nimport { registerStringToLowerTransform } from '../../../utils/controller/string/cell-string-tolower-transform.js';\nimport { registerStringSliceTransform } from '../../../utils/controller/string/cell-string-slice-transform.js';\nimport { registerStringReplaceTransform } from '../../../utils/controller/string/cell-string-replace-transform.js';\nimport { registerStringReplaceByRegexTransform } from '../../../utils/controller/string/cell-string-replace-regex-transform.js';\nimport { registerStringFillStartTransform } from '../../../utils/controller/string/cell-string-fill-start-transform.js';\nimport { registerStringFillEndTransform } from '../../../utils/controller/string/cell-string-fill-end-transform.js';\nimport { registerStringExtractByRegexTransform } from '../../../utils/controller/string/cell-string-extract-regex-transform.js';\nimport { registerNumberAddTransform } from '../../../utils/controller/number/cell-number-add-transform.js';\nimport { registerNumberMultiplyTransform } from '../../../utils/controller/number/cell-number-multiply-transform.js';\nimport { registerNumberDivideTransform } from '../../../utils/controller/number/cell-number-divide-transform.js';\nimport { registerNumberSubtractTransform } from '../../../utils/controller/number/cell-number-subtract-transform.js';\nimport { registerNumberRoundTransform } from '../../../utils/controller/number/cell-number-round-transform.js';\nimport { registerNumberAbsTransform } from '../../../utils/controller/number/cell-number-abs-transform.js';\nimport { registerNumberSqrtTransform } from '../../../utils/controller/number/cell-number-sqrt-transform.js';\nimport { registerNumberLimitTransform } from '../../../utils/controller/number/cell-number-limit-transform.js';\nimport { registerNumberPercentTransform } from '../../../utils/controller/number/cell-number-percent-transform.js';\nimport { registerDateToOnlyTimeTransform } from '../../../utils/controller/date/cell-date-to-only-time-transform.js';\nimport { registerDateToOnlyDateTransform } from '../../../utils/controller/date/cell-date-to-only-date-transform.js';\nimport { registerDateToTimeDateTransform } from '../../../utils/controller/date/cell-date-to-time-date-transform.js';\nimport { registerDateToUtcTransform } from '../../../utils/controller/date/cell-date-to-utc-transform.js';\nimport { registerDateLimitTransform } from '../../../utils/controller/date/cell-date-limit-transform.js';\nimport { registerDateAddTransform } from '../../../utils/controller/date/cell-date-add-transform.js';\nimport { registerDateSubtractTransform } from '../../../utils/controller/date/cell-date-subtract-transform.js';\nimport type { Sheet } from '../../../types/sheet.js';\nimport type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\nimport type { TransformDeltaItem } from '../types/transform-delta.js';\nimport type { TransformGetters } from '../runner/run-transform.js';\n\ntype CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n p?: Readonly<Record<string, unknown>>\n) => unknown;\n\ntype RowTransformFn = (row: ValidatedRow, p?: Readonly<Record<string, unknown>>) => ValidatedRow;\n\ntype SheetTransformFn = (\n sheet: Sheet,\n p?: Readonly<Record<string, unknown>>,\n signal?: AbortSignal\n) => readonly TransformDeltaItem[] | Promise<readonly TransformDeltaItem[]>;\n\nconst registry = new Registry<(...args: unknown[]) => unknown>();\n\nfunction registerCellTransform(name: string, fn: CellTransformFn, opts: { type: 'cell' }): void {\n registry.register(name, fn, opts);\n}\n\nregisterToUpperTransform(registerCellTransform);\nregisterStringToLowerTransform(registerCellTransform);\nregisterStringSliceTransform(registerCellTransform);\nregisterStringReplaceTransform(registerCellTransform);\nregisterStringReplaceByRegexTransform(registerCellTransform);\nregisterStringFillStartTransform(registerCellTransform);\nregisterStringFillEndTransform(registerCellTransform);\nregisterStringExtractByRegexTransform(registerCellTransform);\nregisterNumberAddTransform(registerCellTransform);\nregisterNumberMultiplyTransform(registerCellTransform);\nregisterNumberDivideTransform(registerCellTransform);\nregisterNumberSubtractTransform(registerCellTransform);\nregisterNumberRoundTransform(registerCellTransform);\nregisterNumberAbsTransform(registerCellTransform);\nregisterNumberSqrtTransform(registerCellTransform);\nregisterNumberLimitTransform(registerCellTransform);\nregisterNumberPercentTransform(registerCellTransform);\nregisterDateToOnlyTimeTransform(registerCellTransform);\nregisterDateToOnlyDateTransform(registerCellTransform);\nregisterDateToTimeDateTransform(registerCellTransform);\nregisterDateToUtcTransform(registerCellTransform);\nregisterDateLimitTransform(registerCellTransform);\nregisterDateAddTransform(registerCellTransform);\nregisterDateSubtractTransform(registerCellTransform);\n\nfunction getCellTransform(name: string): CellTransformFn | undefined {\n const entry = registry.get(name);\n if (!entry || entry.type !== 'cell') return undefined;\n return entry.fn as CellTransformFn;\n}\n\nfunction getRowTransform(_name: string): RowTransformFn | undefined {\n return undefined;\n}\n\nfunction getSheetTransform(_name: string): SheetTransformFn | undefined {\n return undefined;\n}\n\nexport function getTransformGetters(): TransformGetters {\n return {\n getCellTransform,\n getRowTransform,\n getSheetTransform,\n };\n}\n","import type { ValidatorOrWithParams } from '../../../types/sheet-layout.js';\n\nexport interface ResolvedTransformRef {\n readonly name: string;\n readonly params?: Readonly<Record<string, unknown>>;\n}\n\nexport function resolveTransformRef(ref: ValidatorOrWithParams): ResolvedTransformRef {\n if (typeof ref === 'string') return { name: ref };\n return { name: ref.name, params: ref.params };\n}\n","import type { SheetLayoutField } from '../../../types/sheet-layout.js';\nimport type { ValidatedCell, ValidatedRow } from '../../../types/sheet.js';\nimport { resolveTransformRef } from './resolve-transform-ref.js';\n\nexport type CellTransformFn = (\n value: unknown,\n cell: ValidatedCell,\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>,\n) => unknown;\n\nexport type GetCellTransform = (name: string) => CellTransformFn | undefined;\n\nexport function runCellTransforms(\n cell: ValidatedCell,\n row: ValidatedRow,\n field: SheetLayoutField,\n getTransform: GetCellTransform,\n): unknown {\n if (cell.errors.length > 0) return cell.value;\n const list = field.transformations;\n if (!list?.length) return cell.value;\n let current: unknown = cell.value;\n for (const ref of list) {\n const { name, params } = resolveTransformRef(ref);\n const fn = getTransform(name);\n if (fn) current = fn(current, cell, row, params);\n }\n return current;\n}\n","import type { SheetLayout } from '../../../types/sheet-layout.js';\nimport type { ValidatedRow } from '../../../types/sheet.js';\nimport { resolveTransformRef } from './resolve-transform-ref.js';\n\nexport type RowTransformFn = (\n row: ValidatedRow,\n params?: Readonly<Record<string, unknown>>,\n) => ValidatedRow;\n\nexport type GetRowTransform = (name: string) => RowTransformFn | undefined;\n\nexport function runRowTransforms(\n row: ValidatedRow,\n sheetLayout: SheetLayout,\n getTransform: GetRowTransform,\n): ValidatedRow {\n if (row.errors.length > 0) return row;\n const list = sheetLayout.rowTransformations;\n if (!list?.length) return row;\n let current: ValidatedRow = row;\n for (const ref of list) {\n const { name, params } = resolveTransformRef(ref);\n const fn = getTransform(name);\n if (fn) current = fn(current, params);\n }\n return current;\n}\n","import type { SheetError } from '../../../types/error.js';\nimport type { SheetLayout } from '../../../types/sheet-layout.js';\nimport type { Sheet } from '../../../types/sheet.js';\nimport type { TransformDeltaItem } from '../types/transform-delta.js';\nimport { resolveTransformRef } from './resolve-transform-ref.js';\n\nexport const EXTERNAL_TRANSFORM_FAILED = 'EXTERNAL_TRANSFORM_FAILED';\n\nexport type SheetTransformFn = (\n sheet: Sheet,\n params?: Readonly<Record<string, unknown>>,\n signal?: AbortSignal,\n) => readonly TransformDeltaItem[] | Promise<readonly TransformDeltaItem[]>;\n\nexport type GetSheetTransform = (name: string) => SheetTransformFn | undefined;\n\nexport interface SheetTransformOutput {\n readonly deltas: TransformDeltaItem[];\n readonly errors: SheetError[];\n}\n\nexport async function runSheetTransforms(\n sheet: Sheet,\n sheetLayout: SheetLayout,\n getTransform: GetSheetTransform,\n signal?: AbortSignal,\n): Promise<SheetTransformOutput> {\n const list = sheetLayout.sheetTransformations;\n if (!list?.length) return { deltas: [], errors: [] };\n const deltas: TransformDeltaItem[] = [];\n const errors: SheetError[] = [];\n for (const ref of list) {\n const { name, params } = resolveTransformRef(ref);\n const fn = getTransform(name);\n if (!fn) continue;\n try {\n const result = await Promise.resolve(fn(sheet, params, signal));\n if (result?.length) deltas.push(...result);\n } catch {\n errors.push({\n code: EXTERNAL_TRANSFORM_FAILED,\n level: 'fatal',\n params: { reason: 'network' },\n });\n }\n }\n return { deltas, errors };\n}\n","import type { Sheet, ValidatedCell, ValidatedRow } from '../../types/sheet.js';\nimport type { TransformDelta } from './types/transform-delta.js';\n\nfunction patchCellInRow(\n rows: ValidatedRow[],\n rowIndex: number,\n col: string,\n newValue: unknown,\n): ValidatedRow[] {\n return rows.map((row) => {\n if (row.index !== rowIndex) return row;\n const cells: ValidatedCell[] = row.cells.map((cell) =>\n cell.key === col ? { ...cell, value: newValue } : cell,\n );\n return { ...row, cells };\n });\n}\n\nexport function applyTransformDelta(sheet: Sheet, delta: TransformDelta): Sheet {\n if (!delta.deltas.length) return sheet;\n let rows = [...sheet.rows];\n for (const item of delta.deltas) {\n if (item.row < 0) continue;\n rows = patchCellInRow(rows, item.row, item.col, item.newValue);\n }\n return { ...sheet, rows };\n}\n"],"mappings":"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","names":["TO_UPPER_TRANSFORM_ID","cellToUpperTransform","value","_cell","_row","_params","registerToUpperTransform","register","TO_LOWER_TRANSFORM_ID","cellStringToLowerTransform","value","_cell","_row","_params","registerStringToLowerTransform","register","SLICE_TRANSFORM_ID","cellStringSliceTransform","value","_cell","_row","params","start","end","s","e","registerStringSliceTransform","register","REPLACE_STR_TRANSFORM_ID","cellStringReplaceTransform","value","_cell","_row","params","search","replacement","registerStringReplaceTransform","register","REPLACE_BY_REGEX_TRANSFORM_ID","cellStringReplaceByRegexTransform","value","_cell","_row","params","pattern","flags","replacement","re","registerStringReplaceByRegexTransform","register","FILL_START_TRANSFORM_ID","cellStringFillStartTransform","value","_cell","_row","params","s","length","fill","safeLength","registerStringFillStartTransform","register","FILL_END_TRANSFORM_ID","cellStringFillEndTransform","value","_cell","_row","params","s","length","fill","safeLength","registerStringFillEndTransform","register","EXTRACT_BY_REGEX_TRANSFORM_ID","cellStringExtractByRegexTransform","value","_cell","_row","params","s","pattern","flags","group","re","m","g","registerStringExtractByRegexTransform","register","NUMBER_ADD_TRANSFORM_ID","toNumber","v","n","cellNumberAddTransform","value","_cell","_row","params","add","delta","registerNumberAddTransform","register","NUMBER_MULTIPLY_TRANSFORM_ID","toNumber","v","n","cellNumberMultiplyTransform","value","_cell","_row","params","factor","f","registerNumberMultiplyTransform","register","NUMBER_DIVIDE_TRANSFORM_ID","toNumber","v","n","cellNumberDivideTransform","value","_cell","_row","params","divisor","d","registerNumberDivideTransform","register","NUMBER_SUBTRACT_TRANSFORM_ID","toNumber","v","n","cellNumberSubtractTransform","value","_cell","_row","params","sub","delta","registerNumberSubtractTransform","register","NUMBER_ROUND_TRANSFORM_ID","toNumber","v","n","cellNumberRoundTransform","value","_cell","_row","params","mode","registerNumberRoundTransform","register","NUMBER_ABS_TRANSFORM_ID","toNumber","v","n","cellNumberAbsTransform","value","_cell","_row","_params","registerNumberAbsTransform","register","NUMBER_SQRT_TRANSFORM_ID","toNumber","v","n","cellNumberSqrtTransform","value","_cell","_row","_params","registerNumberSqrtTransform","register","NUMBER_LIMIT_TRANSFORM_ID","toNumber","v","n","cellNumberLimitTransform","value","_cell","_row","params","min","max","out","minVal","maxVal","registerNumberLimitTransform","register","NUMBER_PERCENT_TRANSFORM_ID","toNumber","v","n","cellNumberPercentTransform","value","_cell","_row","params","total","t","registerNumberPercentTransform","register","DATE_TO_ONLY_TIME_TRANSFORM_ID","parseToDate","value","s","ms","toISOTimeString","d","h","min","cellDateToOnlyTimeTransform","_cell","_row","_params","registerDateToOnlyTimeTransform","register","DATE_TO_ONLY_DATE_TRANSFORM_ID","parseToDate","value","s","ms","toISODateString","d","y","m","day","cellDateToOnlyDateTransform","_cell","_row","_params","registerDateToOnlyDateTransform","register","DATE_TO_TIME_DATE_TRANSFORM_ID","parseToDate","value","s","ms","toISODateString","d","y","m","day","toISOTimeString","h","min","cellDateToTimeDateTransform","_cell","_row","_params","registerDateToTimeDateTransform","register","DATE_TO_UTC_TRANSFORM_ID","parseToDate","value","s","ms","cellDateToUtcTransform","_cell","_row","_params","d","registerDateToUtcTransform","register","DATE_LIMIT_TRANSFORM_ID","parseToDate","value","s","ms","n","cellDateLimitTransform","_cell","_row","params","d","min","max","out","minD","maxD","registerDateLimitTransform","register","DATE_ADD_TRANSFORM_ID","parseToDate","value","s","ms","addToDate","d","p","out","sec","min","h","days","months","years","cellDateAddTransform","_cell","_row","params","registerDateAddTransform","register","DATE_SUBTRACT_TRANSFORM_ID","parseToDate","value","s","ms","subtractFromDate","d","p","out","sec","min","h","days","months","years","cellDateSubtractTransform","_cell","_row","params","registerDateSubtractTransform","register","registry","Registry","registerCellTransform","name","fn","opts","registerToUpperTransform","registerStringToLowerTransform","registerStringSliceTransform","registerStringReplaceTransform","registerStringReplaceByRegexTransform","registerStringFillStartTransform","registerStringFillEndTransform","registerStringExtractByRegexTransform","registerNumberAddTransform","registerNumberMultiplyTransform","registerNumberDivideTransform","registerNumberSubtractTransform","registerNumberRoundTransform","registerNumberAbsTransform","registerNumberSqrtTransform","registerNumberLimitTransform","registerNumberPercentTransform","registerDateToOnlyTimeTransform","registerDateToOnlyDateTransform","registerDateToTimeDateTransform","registerDateToUtcTransform","registerDateLimitTransform","registerDateAddTransform","registerDateSubtractTransform","getCellTransform","entry","getRowTransform","_name","getSheetTransform","getTransformGetters","resolveTransformRef","ref","runCellTransforms","cell","row","field","getTransform","list","current","ref","name","params","resolveTransformRef","fn","runRowTransforms","row","sheetLayout","getTransform","list","current","ref","name","params","resolveTransformRef","fn","EXTERNAL_TRANSFORM_FAILED","runSheetTransforms","sheet","sheetLayout","getTransform","signal","list","deltas","errors","ref","name","params","resolveTransformRef","fn","result","patchCellInRow","rows","rowIndex","col","newValue","row","cells","cell","applyTransformDelta","sheet","delta","item"]}
@@ -0,0 +1,2 @@
1
+ import{a as c}from"./chunk-YETPLYYC.js";var X="required";function Y(e,t,o){return e==null||typeof e=="string"&&e.trim()===""?[{code:"REQUIRED",level:"error",params:{value:e}}]:null}function f(e){e(X,Y,{type:"cell"})}var Z="string:byregex";function H(e,t,o){let{pattern:r="",flags:n=""}=o??{};if(!r)return[{code:"STRING_BYREGEX_INVALID_PARAMS",level:"error",params:{reason:"missing pattern"}}];let i=e==null?"":String(e);try{if(!new RegExp(r,n).test(i))return[{code:"STRING_BYREGEX_MISMATCH",level:"error",params:{value:i,pattern:r}}]}catch{return[{code:"STRING_BYREGEX_INVALID_PATTERN",level:"error",params:{pattern:r}}]}return null}function y(e){e(Z,H,{type:"cell"})}var $="string:maxLength";function q(e,t,o){let{maxLength:r}=o??{},n=typeof r=="number"&&Number.isFinite(r)?r:void 0;if(n===void 0||n<0)return[{code:"STRING_MAX_LENGTH_INVALID_PARAMS",level:"error",params:{maxLength:r}}];let i=e==null?"":String(e);return i.length>n?[{code:"STRING_MAX_LENGTH",level:"error",params:{value:i,maxLength:n,length:i.length}}]:null}function S(e){e($,q,{type:"cell"})}var W="string:minLength";function Q(e,t,o){let{minLength:r}=o??{},n=typeof r=="number"&&Number.isFinite(r)&&r>=0?r:void 0;if(n===void 0)return[{code:"STRING_MIN_LENGTH_INVALID_PARAMS",level:"error",params:{minLength:r}}];let i=e==null?"":String(e);return i.length<n?[{code:"STRING_MIN_LENGTH",level:"error",params:{value:i,minLength:n,length:i.length}}]:null}function R(e){e(W,Q,{type:"cell"})}var J="string:email",K=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;function ee(e,t,o){let r=e==null?"":String(e).trim();return r?K.test(r)?null:[{code:"STRING_EMAIL_INVALID",level:"error",params:{value:r}}]:null}function g(e){e(J,ee,{type:"cell"})}var re="string:phone",te=/^[\d\s\-+.()]{7,20}$/;function ne(e,t,o){let r=e==null?"":String(e).trim();if(!r)return null;let n=r.replace(/\D/g,"");return n.length<7||n.length>15||!te.test(r)?[{code:"STRING_PHONE_INVALID",level:"error",params:{value:r}}]:null}function h(e){e(re,ne,{type:"cell"})}var oe="string:phoneInternational",ie=/^\+?[1-9]\d{0,3}/;function le(e,t,o){let r=e==null?"":String(e).trim().replace(/\s/g,"");if(!r)return null;let n=r.replace(/\D/g,""),i=r.startsWith("+")?r:`+${r}`;return n.length<10||n.length>15||!ie.test(i)?[{code:"STRING_PHONE_INTERNATIONAL_INVALID",level:"error",params:{value:r}}]:null}function w(e){e(oe,le,{type:"cell"})}var ae="string:phoneLocal";function se(e,t,o){let{minDigits:r=6,maxDigits:n=11}=o??{},i=typeof r=="number"&&r>=0?r:6,l=typeof n=="number"&&n>=i?n:11,a=e==null?"":String(e).trim();if(!a)return null;let s=a.replace(/\D/g,"");return a.startsWith("+")&&s.length>3?[{code:"STRING_PHONE_LOCAL_INVALID",level:"error",params:{value:a,reason:"international"}}]:s.length<i||s.length>l?[{code:"STRING_PHONE_LOCAL_INVALID",level:"error",params:{value:a,minDigits:i,maxDigits:l}}]:null}function V(e){e(ae,se,{type:"cell"})}var de="string:onlyNumbers",ue=/^\d+$/;function pe(e,t,o){if(e==null)return null;let r=String(e).trim();return r?ue.test(r)?null:[{code:"STRING_ONLY_NUMBERS_INVALID",level:"error",params:{value:r}}]:null}function _(e){e(de,pe,{type:"cell"})}var me="string:onlyLetters",ce=/^[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF]+$/,fe=/^[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF\s]+$/;function ye(e,t,o){let{allowSpaces:r=!1}=o??{};if(e==null)return null;let n=String(e).trim();return n?(r?fe:ce).test(n)?null:[{code:"STRING_ONLY_LETTERS_INVALID",level:"error",params:{value:n}}]:null}function N(e){e(me,ye,{type:"cell"})}var Se="number:min";function Re(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;let t=Number(e);return Number.isFinite(t)?t:null}function ge(e,t,o){let{min:r}=o??{},n=typeof r=="number"&&Number.isFinite(r)?r:void 0;if(n===void 0)return[{code:"NUMBER_MIN_INVALID_PARAMS",level:"error",params:{min:r}}];let i=Re(e);return i===null?[{code:"NUMBER_MIN_NOT_A_NUMBER",level:"error",params:{value:e}}]:i<n?[{code:"NUMBER_MIN",level:"error",params:{value:i,min:n}}]:null}function E(e){e(Se,ge,{type:"cell"})}var he="number:max";function we(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;let t=Number(e);return Number.isFinite(t)?t:null}function Ve(e,t,o){let{max:r}=o??{},n=typeof r=="number"&&Number.isFinite(r)?r:void 0;if(n===void 0)return[{code:"NUMBER_MAX_INVALID_PARAMS",level:"error",params:{max:r}}];let i=we(e);return i===null?[{code:"NUMBER_MAX_NOT_A_NUMBER",level:"error",params:{value:e}}]:i>n?[{code:"NUMBER_MAX",level:"error",params:{value:i,max:n}}]:null}function I(e){e(he,Ve,{type:"cell"})}var _e="number:float";function Ne(e){if(e==null)return!1;if(typeof e=="number")return Number.isFinite(e);let t=String(e).trim();if(!t)return!1;let o=parseFloat(t);return Number.isFinite(o)}function Ee(e,t,o){return e==null||e===""||Ne(e)?null:[{code:"NUMBER_FLOAT_INVALID",level:"error",params:{value:e}}]}function A(e){e(_e,Ee,{type:"cell"})}var Ie="number:integer";function Ae(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e)&&Number.isInteger(e))return e;let t=Number(e);return Number.isFinite(t)&&Number.isInteger(t)?t:null}function Te(e,t,o){return e==null||e===""?null:Ae(e)===null?[{code:"NUMBER_INTEGER_INVALID",level:"error",params:{value:e}}]:null}function T(e){e(Ie,Te,{type:"cell"})}var xe="number:nonNegative";function De(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;let t=Number(e);return Number.isFinite(t)?t:null}function ze(e,t,o){if(e==null||e==="")return null;let r=De(e);return r===null?[{code:"NUMBER_NON_NEGATIVE_NOT_A_NUMBER",level:"error",params:{value:e}}]:r<0?[{code:"NUMBER_NON_NEGATIVE",level:"error",params:{value:r}}]:null}function x(e){e(xe,ze,{type:"cell"})}var be="number:nonPositive";function Le(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;let t=Number(e);return Number.isFinite(t)?t:null}function ke(e,t,o){if(e==null||e==="")return null;let r=Le(e);return r===null?[{code:"NUMBER_NON_POSITIVE_NOT_A_NUMBER",level:"error",params:{value:e}}]:r>0?[{code:"NUMBER_NON_POSITIVE",level:"error",params:{value:r}}]:null}function D(e){e(be,ke,{type:"cell"})}var Fe="number:nonZero";function Ce(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;let t=Number(e);return Number.isFinite(t)?t:null}function Me(e,t,o){if(e==null||e==="")return null;let r=Ce(e);return r===null?[{code:"NUMBER_NON_ZERO_NOT_A_NUMBER",level:"error",params:{value:e}}]:r===0?[{code:"NUMBER_NON_ZERO",level:"error",params:{value:r}}]:null}function z(e){e(Fe,Me,{type:"cell"})}var Oe="date:min";function b(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;if(e instanceof Date&&!Number.isNaN(e.getTime()))return e.getTime();let t=Date.parse(String(e).trim());return Number.isNaN(t)?null:t}function ve(e,t,o){let{min:r}=o??{},n=r!==void 0?b(r):void 0;if(n==null)return[{code:"DATE_MIN_INVALID_PARAMS",level:"error",params:{min:r}}];let i=b(e);return i===null?[{code:"DATE_MIN_NOT_A_DATE",level:"error",params:{value:e}}]:i<n?[{code:"DATE_MIN",level:"error",params:{value:i,min:n}}]:null}function L(e){e(Oe,ve,{type:"cell"})}var Pe="date:max";function k(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;if(e instanceof Date&&!Number.isNaN(e.getTime()))return e.getTime();let t=Date.parse(String(e).trim());return Number.isNaN(t)?null:t}function je(e,t,o){let{max:r}=o??{},n=r!==void 0?k(r):void 0;if(n==null)return[{code:"DATE_MAX_INVALID_PARAMS",level:"error",params:{max:r}}];let i=k(e);return i===null?[{code:"DATE_MAX_NOT_A_DATE",level:"error",params:{value:e}}]:i>n?[{code:"DATE_MAX",level:"error",params:{value:i,max:n}}]:null}function F(e){e(Pe,je,{type:"cell"})}var Ge="date:onlyYear",Ue=/^(?:19|20)\d{2}$/;function Be(e,t,o){if(e==null)return null;let r=String(e).trim();if(!r)return null;let n=Number(r),i=Ue.test(r),l=Number.isInteger(n)&&n>=1900&&n<=2099;return!i&&!l?[{code:"DATE_ONLY_YEAR_INVALID",level:"error",params:{value:r}}]:null}function C(e){e(Ge,Be,{type:"cell"})}var Xe="date:onlyTime",Ye=/^([01]?\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(?:\.\d+)?$/;function Ze(e,t,o){if(e==null)return null;let r=String(e).trim();return r?Ye.test(r)?null:[{code:"DATE_ONLY_TIME_INVALID",level:"error",params:{value:r}}]:null}function M(e){e(Xe,Ze,{type:"cell"})}var He="date:datetime";function $e(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;if(e instanceof Date&&!Number.isNaN(e.getTime()))return e.getTime();let t=Date.parse(String(e).trim());return Number.isNaN(t)?null:t}function qe(e,t,o){if(e==null)return null;let r=String(e).trim();return r&&$e(e)===null?[{code:"DATE_DATETIME_INVALID",level:"error",params:{value:r}}]:null}function O(e){e(He,qe,{type:"cell"})}var We="date:timestamp";function Qe(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;if(e instanceof Date&&!Number.isNaN(e.getTime()))return e.getTime();let t=String(e).trim();if(/^\d+$/.test(t)){let r=Number(t);return Number.isFinite(r)?r:null}let o=Date.parse(t);return Number.isNaN(o)?null:o}function Je(e,t,o){if(e==null)return null;let r=String(e).trim();if(!r)return null;let n=Qe(e);return n===null?[{code:"DATE_TIMESTAMP_INVALID",level:"error",params:{value:r}}]:n<-864e10||n>864e10?[{code:"DATE_TIMESTAMP_OUT_OF_RANGE",level:"error",params:{value:n}}]:null}function v(e){e(We,Je,{type:"cell"})}var Ke="date:utc";function er(e){if(e==null)return null;if(typeof e=="number"&&Number.isFinite(e))return e;if(e instanceof Date&&!Number.isNaN(e.getTime()))return e.getTime();let t=Date.parse(String(e).trim());return Number.isNaN(t)?null:t}function rr(e,t,o){if(e==null)return null;let r=String(e).trim();return r?er(e)===null?[{code:"DATE_UTC_NOT_A_DATE",level:"error",params:{value:r}}]:typeof e=="number"||r.endsWith("Z")||/[+-]00:00$/.test(r)||/^\d+$/.test(r)?null:[{code:"DATE_UTC_REQUIRED",level:"error",params:{value:r}}]:null}function P(e){e(Ke,rr,{type:"cell"})}var tr="bool:onlyTrue";function nr(e){if(e===!0)return!0;if(typeof e=="string"){let t=e.trim().toLowerCase();return t==="true"||t==="1"||t==="yes"}return e===1}function or(e,t,o){return e==null||e===""||nr(e)?null:[{code:"BOOL_ONLY_TRUE",level:"error",params:{value:e}}]}function j(e){e(tr,or,{type:"cell"})}var ir="bool:onlyFalse";function lr(e){if(e===!1)return!0;if(typeof e=="string"){let t=e.trim().toLowerCase();return t==="false"||t==="0"||t==="no"}return e===0}function ar(e,t,o){return e==null||e===""||lr(e)?null:[{code:"BOOL_ONLY_FALSE",level:"error",params:{value:e}}]}function G(e){e(ir,ar,{type:"cell"})}var U=new c;function sr(e){f(e),y(e),S(e),R(e),g(e),h(e),w(e),V(e),_(e),N(e),E(e),I(e),A(e),T(e),x(e),D(e),z(e),L(e),F(e),C(e),M(e),O(e),v(e),P(e),j(e),G(e)}sr((e,t,o)=>{U.register(e,t,o)});function dr(e){let t=U.get(e);if(!(!t||t.type!=="cell"))return t.fn}function ur(e){}function pr(e){}function ct(){return{getCellValidator:dr,getRowValidator:ur,getTableValidator:pr}}function p(e){return typeof e=="string"?{name:e}:{name:e.name,params:e.params}}function Rt(e,t,o,r){let n=o.validators;if(!n?.length)return[];let i=[];for(let l of n){let{name:a,params:s}=p(l),d=r(a);if(d){let u=d(e.value,t,s);if(u?.length&&(i.push(...u),u.some(B=>B.level==="fatal")))break}}return i}function wt(e,t,o){let r=t.rowValidators;if(!r?.length)return[];let n=[];for(let i of r){let{name:l,params:a}=p(i),s=o(l);if(s){let d=s(e,a);if(d?.length&&(n.push(...d),d.some(m=>m.level==="fatal")))break}}return n}var mr="EXTERNAL_VALIDATION_FAILED";function cr(e){return e.map(t=>({error:t}))}async function Nt(e,t,o,r){let n=t.sheetValidators;if(!n?.length)return[];let i=[];for(let l of n){let{name:a,params:s}=p(l),d=o(a);if(d)try{let u=await Promise.resolve(d(e,s,r));u?.length&&i.push(...cr(u))}catch{i.push({error:{code:mr,level:"fatal",params:{reason:"network"}}})}}return i}export{Rt as a,wt as b,Nt as c,ct as d};
2
+ //# sourceMappingURL=chunk-XTSACACJ.js.map