@sheetpane/validation 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -6
- package/dist/check.d.ts +26 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +36 -0
- package/dist/check.js.map +1 -0
- package/dist/index.d.ts +23 -61
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -107
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +94 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +139 -0
- package/dist/plugin.js.map +1 -0
- package/dist/rules.d.ts +57 -11
- package/dist/rules.d.ts.map +1 -1
- package/dist/rules.js +91 -11
- package/dist/rules.js.map +1 -1
- package/dist/ui.d.ts +4 -3
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +16 -8
- package/dist/ui.js.map +1 -1
- package/dist/write.d.ts +122 -0
- package/dist/write.d.ts.map +1 -0
- package/dist/write.js +356 -0
- package/dist/write.js.map +1 -0
- package/package.json +10 -6
package/dist/ui.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { registerPlugin } from '@sheetpane/grid';
|
|
6
6
|
import { AUTHOR, ERROR_TYPE, lastReport, listRuleAt, validation } from './index.js';
|
|
7
7
|
import { listOptions } from './rules.js';
|
|
8
|
+
import { lastRulesWrite } from './write.js';
|
|
8
9
|
/** The controls plugin's id. */
|
|
9
10
|
export const UI_ID = 'validation-ui';
|
|
10
11
|
const ARROW = '<svg viewBox="0 0 12 12" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5l3 3 3-3"/></svg>';
|
|
@@ -12,23 +13,30 @@ const ARROW = '<svg viewBox="0 0 12 12" width="12" height="12" fill="none" strok
|
|
|
12
13
|
* Open validation errors in a snapshot.
|
|
13
14
|
*
|
|
14
15
|
* @param snap - A snapshot of the store.
|
|
15
|
-
* @returns How many errors by the `workbook` author, of type `validation`, are open.
|
|
16
|
+
* @returns How many errors by the `workbook` author, of type `validation`, are open in the layers shown (W-51).
|
|
16
17
|
*/
|
|
17
18
|
export function openWarnings(snap) {
|
|
18
|
-
return snap.
|
|
19
|
+
return snap.visibleErrors.filter((e) => e.author === AUTHOR && e.type === ERROR_TYPE && e.status === 'open').length;
|
|
19
20
|
}
|
|
20
21
|
/**
|
|
21
|
-
* The status line: `3 validation warnings`, plus `· 1 rule not checked` when some are skipped
|
|
22
|
+
* The status line: `3 validation warnings`, plus `· 1 rule not checked` when some are skipped, plus — after an
|
|
23
|
+
* export that wrote the host's rules (W-58) — `· 2 rules not written to Excel` for those skipped or cut short.
|
|
22
24
|
*
|
|
23
25
|
* @param snap - A snapshot of the store.
|
|
24
|
-
* @returns The text, or `''` when the workbook has no rules.
|
|
26
|
+
* @returns The text, or `''` when the workbook has no rules and none were written.
|
|
25
27
|
*/
|
|
26
28
|
export function statusText(snap) {
|
|
29
|
+
const parts = [];
|
|
27
30
|
const report = lastReport(snap.book);
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
if (report?.rules) {
|
|
32
|
+
const n = openWarnings(snap), k = report.skipped.length;
|
|
33
|
+
parts.push(`${n} validation warning${n === 1 ? '' : 's'}${k ? ` · ${k} rule${k === 1 ? '' : 's'} not checked` : ''}`);
|
|
34
|
+
}
|
|
35
|
+
const w = lastRulesWrite(snap.book);
|
|
36
|
+
const u = w ? w.skipped.length + w.conflicts.length : 0;
|
|
37
|
+
if (u)
|
|
38
|
+
parts.push(`${u} rule${u === 1 ? '' : 's'} not written to Excel`);
|
|
39
|
+
return parts.join(' · ');
|
|
32
40
|
}
|
|
33
41
|
const listArrow = {
|
|
34
42
|
id: 'validation-list',
|
package/dist/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,qEAAqE;AACrE,sDAAsD;AACtD,OAAO,EAAE,cAAc,EAAsD,MAAM,iBAAiB,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAA0B,MAAM,YAAY,CAAC;AAC5G,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
package/dist/write.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { type ColumnRule, type OnInvalid, type WorkbookStore } from '@sheetpane/grid';
|
|
2
|
+
import { type DataValidation, type PatchContext, type SpCode } from '@sheetpane/export';
|
|
3
|
+
import { type Book } from './rules.js';
|
|
4
|
+
/** The export option's key: `export({ rulesAsValidation: true })`, and the Download menu's switch. */
|
|
5
|
+
export declare const RULES_OPTION = "rulesAsValidation";
|
|
6
|
+
/** The Download menu's label for {@link RULES_OPTION}. */
|
|
7
|
+
export declare const RULES_OPTION_LABEL = "Write rules as Excel dropdowns";
|
|
8
|
+
/**
|
|
9
|
+
* Why a rule is not written: a check Excel's data validation has none of (`pattern`, `noneOf`, `unique`), two checks
|
|
10
|
+
* one Excel rule cannot hold together (`combination`), a list Excel cannot type out (`list`), a bound it cannot read
|
|
11
|
+
* (`bound`), a column or sheet the workbook lacks (`column`, `sheet`), or a sheet whose own rules could not be
|
|
12
|
+
* rewritten (`workbook`).
|
|
13
|
+
*/
|
|
14
|
+
export type UnwrittenReason = 'pattern' | 'noneOf' | 'unique' | 'combination' | 'list' | 'bound' | 'column' | 'sheet' | 'workbook';
|
|
15
|
+
/** A rule that is not in the download: where it is, why, and its SP code. */
|
|
16
|
+
export interface UnwrittenRule {
|
|
17
|
+
code: SpCode;
|
|
18
|
+
/** The sheet, or `*` for a rule meant for every sheet. */
|
|
19
|
+
sheet: string;
|
|
20
|
+
/** `column “Units”` or `cell B3` (a range: `cells A1:B4`). */
|
|
21
|
+
where: string;
|
|
22
|
+
reason: UnwrittenReason;
|
|
23
|
+
detail: string;
|
|
24
|
+
}
|
|
25
|
+
/** Cells a written rule does not reach because a rule already holds them — the workbook's own, which wins, or another written one. */
|
|
26
|
+
export interface RuleConflict {
|
|
27
|
+
code: SpCode;
|
|
28
|
+
sheet: string;
|
|
29
|
+
/** The cells the rule gave up, as an sqref: `C2:C5`. */
|
|
30
|
+
cells: string;
|
|
31
|
+
/** The rule that gave them up: `column “Units”`. */
|
|
32
|
+
where: string;
|
|
33
|
+
/** The rule that keeps them: `the workbook's own whole rule` or `cell B3`. */
|
|
34
|
+
kept: string;
|
|
35
|
+
}
|
|
36
|
+
/** What writing the rules did. */
|
|
37
|
+
export interface RulesWriteReport {
|
|
38
|
+
/** Rules written, in whole or in part (a part when a conflict took some of their cells). */
|
|
39
|
+
written: number;
|
|
40
|
+
/** Of those, how many joined a rule the workbook already had (the same check), instead of adding one. */
|
|
41
|
+
merged: number;
|
|
42
|
+
skipped: UnwrittenRule[];
|
|
43
|
+
conflicts: RuleConflict[];
|
|
44
|
+
}
|
|
45
|
+
/** The rules to write: each changed sheet's whole `<dataValidations>` set, and the report. */
|
|
46
|
+
export interface RulesWritePlan extends RulesWriteReport {
|
|
47
|
+
/** `written`: how many of the plan's written rules are on that sheet. */
|
|
48
|
+
sheets: {
|
|
49
|
+
sheet: string;
|
|
50
|
+
rules: DataValidation[];
|
|
51
|
+
written: number;
|
|
52
|
+
}[];
|
|
53
|
+
}
|
|
54
|
+
/** One rule mapped: the Excel rule (without its range), a reason it cannot be written, or nothing to write. */
|
|
55
|
+
export type MappedRule = {
|
|
56
|
+
dv: Omit<DataValidation, 'sqref'>;
|
|
57
|
+
skip?: undefined;
|
|
58
|
+
} | {
|
|
59
|
+
dv?: undefined;
|
|
60
|
+
skip: {
|
|
61
|
+
code: SpCode;
|
|
62
|
+
reason: UnwrittenReason;
|
|
63
|
+
detail: string;
|
|
64
|
+
};
|
|
65
|
+
} | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* One rule (a rules-file or column rule) as one Excel data-validation rule, without its range. `oneOf` and `equals`
|
|
68
|
+
* are a typed-out list; `number` and `integer` (or `min` / `max` alone) a decimal or whole-number rule; `date` a date
|
|
69
|
+
* rule; `minLength` / `maxLength` a text-length rule; `boolean` the list TRUE, FALSE; `required` alone a text length of
|
|
70
|
+
* at least 1. `required` (and `equals`) clear "ignore blank". `onInvalid: 'block'` is Excel's Stop, a `note` its
|
|
71
|
+
* Information, anything else its Warning; the message is the rule's own `message`, else the rule in words, which is
|
|
72
|
+
* also the input prompt. A `pattern`, `noneOf`, `unique` or two checks Excel cannot hold in one rule skip it.
|
|
73
|
+
*
|
|
74
|
+
* @param rule - The rule.
|
|
75
|
+
* @param o - The title Excel shows (a column's title or a cell; cut to 32 characters) and the pane's `onInvalid`.
|
|
76
|
+
* @returns `{ dv }`, `{ skip }` with its SP code, or `undefined` when the rule checks nothing (`type: 'text'` alone).
|
|
77
|
+
*/
|
|
78
|
+
export declare function validationOf(rule: ColumnRule, o?: {
|
|
79
|
+
title?: string;
|
|
80
|
+
onInvalid?: OnInvalid | undefined;
|
|
81
|
+
}): MappedRule;
|
|
82
|
+
/**
|
|
83
|
+
* The host's rules as each sheet's whole `<dataValidations>` set: the workbook's own rules, kept as they are, plus
|
|
84
|
+
* every rule of the rules file and the element's `columns` that Excel can hold. A column rule covers its column from
|
|
85
|
+
* the row under the titles to the last row; a cell rule its cell or range. Where a rule already holds a cell the
|
|
86
|
+
* workbook's own rule wins: the written rule leaves those cells (a conflict, SP-5406) or, when it checks the same thing,
|
|
87
|
+
* joins the workbook's rule instead of repeating it. A cell rule wins over a column rule, a named sheet's over `*`'s.
|
|
88
|
+
*
|
|
89
|
+
* @param store - The workbook store: its workbook and its `columnRules`.
|
|
90
|
+
* @param o - `inBlock(sheet)`: how many of the sheet's own rules (in the order read) are in the main block — the rest
|
|
91
|
+
* are Excel 2010 `x14` rules, left where they are and never repeated; all of them when absent.
|
|
92
|
+
* @returns Each changed sheet's whole set, ready for `setDataValidations` or `patchXlsx`'s `dataValidations`, and the report.
|
|
93
|
+
*/
|
|
94
|
+
export declare function rulesAsValidations(store: WorkbookStore, o?: {
|
|
95
|
+
inBlock?: (sheet: string) => number | undefined;
|
|
96
|
+
}): RulesWritePlan;
|
|
97
|
+
/**
|
|
98
|
+
* How many `<dataValidation>`s a worksheet holds in its main block (Excel 2010's `x14:` ones, inside `<extLst>`, not counted).
|
|
99
|
+
*
|
|
100
|
+
* @param xml - The worksheet's XML.
|
|
101
|
+
* @returns The count — the first that many of the sheet's rules, in the order `@sheetpane/import` reads them.
|
|
102
|
+
*/
|
|
103
|
+
export declare function mainBlockCount(xml: string): number;
|
|
104
|
+
/**
|
|
105
|
+
* The report of the last export that wrote the rules (the status line reads it).
|
|
106
|
+
*
|
|
107
|
+
* @param book - The workbook, or `undefined`.
|
|
108
|
+
* @returns The report, or `undefined` before the first such export.
|
|
109
|
+
*/
|
|
110
|
+
export declare function lastRulesWrite(book: Book | undefined): RulesWriteReport | undefined;
|
|
111
|
+
/**
|
|
112
|
+
* Writes the host's rules into an `.xlsx` being exported, from an `exportPatch` hook: each changed sheet's
|
|
113
|
+
* `<dataValidations>` rewritten to its whole set ({@link rulesAsValidations}), `x14` rules left where they are. A
|
|
114
|
+
* sheet whose own rules cannot be rewritten (SP-2015) keeps its block and its written rules are listed (SP-5407).
|
|
115
|
+
* Every rule not written, and every conflict, is a console warning with its code.
|
|
116
|
+
*
|
|
117
|
+
* @param patch - The `exportPatch` context.
|
|
118
|
+
* @param store - The workbook store.
|
|
119
|
+
* @returns The report.
|
|
120
|
+
*/
|
|
121
|
+
export declare function writeRules(patch: PatchContext, store: WorkbookStore): Promise<RulesWriteReport>;
|
|
122
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"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"}
|
package/dist/write.js
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
// The host's rules written into the download as the workbook's own data validation
|
|
2
|
+
// (W-58): each rule of the rules file — and of the element's `columns` — mapped to one
|
|
3
|
+
// `<dataValidation>` and merged into its sheet's block on export, so a person working in
|
|
4
|
+
// Excel gets the same dropdowns and checks. What Excel cannot hold (a pattern, "none of",
|
|
5
|
+
// unique, two checks in one rule) is skipped and listed, each with its SP code.
|
|
6
|
+
// DOM-free: the rules come from the store's `columnRules`, read by the grid's
|
|
7
|
+
// `checkDocument`; the XML is @sheetpane/export's `setDataValidations`.
|
|
8
|
+
import { checkDocument, describeRule } from '@sheetpane/grid';
|
|
9
|
+
import { cellRef, MAX_ROWS, parseRange, rangeRef, setDataValidations, spMessage } from '@sheetpane/export';
|
|
10
|
+
import { parseBox } from './rules.js';
|
|
11
|
+
/** The export option's key: `export({ rulesAsValidation: true })`, and the Download menu's switch. */
|
|
12
|
+
export const RULES_OPTION = 'rulesAsValidation';
|
|
13
|
+
/** The Download menu's label for {@link RULES_OPTION}. */
|
|
14
|
+
export const RULES_OPTION_LABEL = 'Write rules as Excel dropdowns';
|
|
15
|
+
const NUM = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;
|
|
16
|
+
const ISO = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
17
|
+
const LIST_MAX = 255, TITLE_MAX = 32, MESSAGE_MAX = 255;
|
|
18
|
+
/** Excel's largest number: the bound of a "any number" rule. */
|
|
19
|
+
const BIG = '9.99E+307';
|
|
20
|
+
const cut = (s, n) => (s.length <= n ? s : `${s.slice(0, n - 1)}…`);
|
|
21
|
+
const skip = (code, reason, detail) => ({ skip: { code, reason, detail } });
|
|
22
|
+
/** A number bound, or `NaN` when it is not one. */
|
|
23
|
+
const numberBound = (x) => (typeof x === 'number' ? x : NUM.test(x.trim()) ? Number(x.trim()) : NaN);
|
|
24
|
+
/** A date bound as Excel's operand (`DATE(2026,1,31)` or a serial) and a number to order it by; undefined when unreadable. */
|
|
25
|
+
function dateBound(x) {
|
|
26
|
+
if (typeof x === 'number')
|
|
27
|
+
return Number.isFinite(x) ? { f: String(x), at: x * 864e5 + Date.UTC(1899, 11, 30) } : undefined;
|
|
28
|
+
const m = ISO.exec(x.trim());
|
|
29
|
+
if (!m)
|
|
30
|
+
return undefined;
|
|
31
|
+
const y = Number(m[1]), mo = Number(m[2]), d = Number(m[3]), at = Date.UTC(y, mo - 1, d), t = new Date(at);
|
|
32
|
+
if (t.getUTCFullYear() !== y || t.getUTCMonth() !== mo - 1 || t.getUTCDate() !== d)
|
|
33
|
+
return undefined;
|
|
34
|
+
return { f: `DATE(${y},${mo},${d})`, at };
|
|
35
|
+
}
|
|
36
|
+
/** `between`, `≥` or `≤`, from the bounds a rule gives. */
|
|
37
|
+
function bounded(lo, hi, all) {
|
|
38
|
+
if (lo !== undefined && hi !== undefined)
|
|
39
|
+
return { operator: 'between', formula1: lo, formula2: hi };
|
|
40
|
+
if (lo !== undefined)
|
|
41
|
+
return { operator: 'greaterThanOrEqual', formula1: lo };
|
|
42
|
+
if (hi !== undefined)
|
|
43
|
+
return { operator: 'lessThanOrEqual', formula1: hi };
|
|
44
|
+
return { operator: 'between', formula1: all[0], formula2: all[1] };
|
|
45
|
+
}
|
|
46
|
+
const listText = (x) => (typeof x === 'boolean' ? (x ? 'TRUE' : 'FALSE') : String(x));
|
|
47
|
+
/**
|
|
48
|
+
* One rule (a rules-file or column rule) as one Excel data-validation rule, without its range. `oneOf` and `equals`
|
|
49
|
+
* are a typed-out list; `number` and `integer` (or `min` / `max` alone) a decimal or whole-number rule; `date` a date
|
|
50
|
+
* rule; `minLength` / `maxLength` a text-length rule; `boolean` the list TRUE, FALSE; `required` alone a text length of
|
|
51
|
+
* at least 1. `required` (and `equals`) clear "ignore blank". `onInvalid: 'block'` is Excel's Stop, a `note` its
|
|
52
|
+
* Information, anything else its Warning; the message is the rule's own `message`, else the rule in words, which is
|
|
53
|
+
* also the input prompt. A `pattern`, `noneOf`, `unique` or two checks Excel cannot hold in one rule skip it.
|
|
54
|
+
*
|
|
55
|
+
* @param rule - The rule.
|
|
56
|
+
* @param o - The title Excel shows (a column's title or a cell; cut to 32 characters) and the pane's `onInvalid`.
|
|
57
|
+
* @returns `{ dv }`, `{ skip }` with its SP code, or `undefined` when the rule checks nothing (`type: 'text'` alone).
|
|
58
|
+
*/
|
|
59
|
+
export function validationOf(rule, o = {}) {
|
|
60
|
+
if (rule.pattern !== undefined)
|
|
61
|
+
return skip('SP-5401', 'pattern', `a pattern (/${rule.pattern}/): Excel's data validation has no regular expressions`);
|
|
62
|
+
if (rule.noneOf !== undefined)
|
|
63
|
+
return skip('SP-5401', 'noneOf', 'a list of values not allowed (noneOf): Excel has no "none of" rule');
|
|
64
|
+
if (rule.unique)
|
|
65
|
+
return skip('SP-5401', 'unique', 'unique in the column: Excel needs a formula rule for that');
|
|
66
|
+
const required = !!rule.required || rule.equals !== undefined;
|
|
67
|
+
const type = rule.type === 'text' ? undefined : rule.type;
|
|
68
|
+
const bounds = rule.min !== undefined || rule.max !== undefined;
|
|
69
|
+
const lengths = rule.minLength !== undefined || rule.maxLength !== undefined;
|
|
70
|
+
const combo = (what) => skip('SP-5402', 'combination', `${what}: one Excel rule holds one check`);
|
|
71
|
+
if (rule.equals !== undefined && rule.oneOf)
|
|
72
|
+
return combo('equals and oneOf');
|
|
73
|
+
const items = rule.equals !== undefined ? [rule.equals] : rule.oneOf;
|
|
74
|
+
let core;
|
|
75
|
+
if (items) {
|
|
76
|
+
const fits = (x) => (type === undefined ? true : type === 'number' ? typeof x === 'number' : type === 'integer' ? Number.isInteger(x) : type === 'boolean' ? typeof x === 'boolean' : false);
|
|
77
|
+
if (bounds || lengths || !items.every(fits))
|
|
78
|
+
return combo(`a list with ${bounds ? 'min or max' : lengths ? 'a length' : `type ${String(rule.type)}`}`);
|
|
79
|
+
if (!items.length)
|
|
80
|
+
return skip('SP-5403', 'list', 'an empty list');
|
|
81
|
+
const texts = items.map(listText);
|
|
82
|
+
const comma = texts.find((t) => t.includes(','));
|
|
83
|
+
if (comma !== undefined)
|
|
84
|
+
return skip('SP-5403', 'list', `“${comma}” holds a comma: Excel's typed-out list splits on commas`);
|
|
85
|
+
const body = texts.map((t) => t.replace(/"/g, '""')).join(',');
|
|
86
|
+
if (body.length > LIST_MAX)
|
|
87
|
+
return skip('SP-5403', 'list', `the list is ${body.length} characters: Excel types out ${LIST_MAX}`);
|
|
88
|
+
core = { type: 'list', formula1: `"${body}"` };
|
|
89
|
+
}
|
|
90
|
+
else if (type === 'boolean') {
|
|
91
|
+
if (bounds || lengths)
|
|
92
|
+
return combo('TRUE or FALSE with a bound');
|
|
93
|
+
core = { type: 'list', formula1: '"TRUE,FALSE"' };
|
|
94
|
+
}
|
|
95
|
+
else if (type === 'number' || type === 'integer' || (type === undefined && bounds)) {
|
|
96
|
+
if (lengths)
|
|
97
|
+
return combo('a number with a length');
|
|
98
|
+
const lo = rule.min === undefined ? undefined : numberBound(rule.min), hi = rule.max === undefined ? undefined : numberBound(rule.max);
|
|
99
|
+
if (lo !== undefined && !Number.isFinite(lo))
|
|
100
|
+
return skip('SP-5404', 'bound', `min ${JSON.stringify(rule.min)} is not a number`);
|
|
101
|
+
if (hi !== undefined && !Number.isFinite(hi))
|
|
102
|
+
return skip('SP-5404', 'bound', `max ${JSON.stringify(rule.max)} is not a number`);
|
|
103
|
+
if (lo !== undefined && hi !== undefined && lo > hi)
|
|
104
|
+
return skip('SP-5404', 'bound', `min ${lo} is above max ${hi}`);
|
|
105
|
+
core = { type: type === 'integer' ? 'whole' : 'decimal', ...bounded(lo === undefined ? undefined : String(lo), hi === undefined ? undefined : String(hi), [`-${BIG}`, BIG]) };
|
|
106
|
+
}
|
|
107
|
+
else if (type === 'date') {
|
|
108
|
+
if (lengths)
|
|
109
|
+
return combo('a date with a length');
|
|
110
|
+
const lo = rule.min === undefined ? undefined : dateBound(rule.min), hi = rule.max === undefined ? undefined : dateBound(rule.max);
|
|
111
|
+
if (rule.min !== undefined && !lo)
|
|
112
|
+
return skip('SP-5404', 'bound', `min ${JSON.stringify(rule.min)} is not a date Excel can read: write it as 2026-01-31 or a serial`);
|
|
113
|
+
if (rule.max !== undefined && !hi)
|
|
114
|
+
return skip('SP-5404', 'bound', `max ${JSON.stringify(rule.max)} is not a date Excel can read: write it as 2026-01-31 or a serial`);
|
|
115
|
+
if (lo && hi && lo.at > hi.at)
|
|
116
|
+
return skip('SP-5404', 'bound', `min ${String(rule.min)} is after max ${String(rule.max)}`);
|
|
117
|
+
core = { type: 'date', ...bounded(lo?.f, hi?.f, ['DATE(1900,1,1)', 'DATE(9999,12,31)']) };
|
|
118
|
+
}
|
|
119
|
+
else if (lengths) {
|
|
120
|
+
const ok = (n) => n === undefined || (typeof n === 'number' && Number.isInteger(n) && n >= 0);
|
|
121
|
+
if (!ok(rule.minLength) || !ok(rule.maxLength))
|
|
122
|
+
return skip('SP-5404', 'bound', 'minLength and maxLength must be whole numbers from 0');
|
|
123
|
+
if (rule.minLength !== undefined && rule.maxLength !== undefined && rule.minLength > rule.maxLength)
|
|
124
|
+
return skip('SP-5404', 'bound', `minLength ${rule.minLength} is above maxLength ${rule.maxLength}`);
|
|
125
|
+
core = { type: 'textLength', ...bounded(rule.minLength === undefined ? undefined : String(rule.minLength), rule.maxLength === undefined ? undefined : String(rule.maxLength), ['0', '32767']) };
|
|
126
|
+
}
|
|
127
|
+
else if (required) {
|
|
128
|
+
core = { type: 'textLength', operator: 'greaterThanOrEqual', formula1: '1' };
|
|
129
|
+
}
|
|
130
|
+
else
|
|
131
|
+
return undefined;
|
|
132
|
+
const words = describeRule(rule);
|
|
133
|
+
const title = cut(o.title ?? '', TITLE_MAX);
|
|
134
|
+
const onInvalid = rule.onInvalid ?? o.onInvalid ?? 'flag';
|
|
135
|
+
const dv = {
|
|
136
|
+
...core,
|
|
137
|
+
allowBlank: !required,
|
|
138
|
+
showErrorMessage: true,
|
|
139
|
+
showDropDown: false,
|
|
140
|
+
errorStyle: onInvalid === 'block' ? 'stop' : rule.severity === 'note' ? 'information' : 'warning',
|
|
141
|
+
error: cut(rule.message ?? words, MESSAGE_MAX),
|
|
142
|
+
};
|
|
143
|
+
if (title) {
|
|
144
|
+
dv.errorTitle = title;
|
|
145
|
+
dv.promptTitle = title;
|
|
146
|
+
}
|
|
147
|
+
if (words)
|
|
148
|
+
dv.prompt = cut(words, MESSAGE_MAX);
|
|
149
|
+
return { dv };
|
|
150
|
+
}
|
|
151
|
+
// ── ranges ────────────────────────────────────────────────────────────────
|
|
152
|
+
const meets = (a, b) => a.top <= b.bottom && b.top <= a.bottom && a.left <= b.right && b.left <= a.right;
|
|
153
|
+
const overlap = (a, b) => ({ top: Math.max(a.top, b.top), left: Math.max(a.left, b.left), bottom: Math.min(a.bottom, b.bottom), right: Math.min(a.right, b.right) });
|
|
154
|
+
/** `a` without `b`: up to four boxes (above, below, left, right of the overlap). */
|
|
155
|
+
function minus(a, b) {
|
|
156
|
+
if (!meets(a, b))
|
|
157
|
+
return [a];
|
|
158
|
+
const out = [];
|
|
159
|
+
if (a.top < b.top)
|
|
160
|
+
out.push({ ...a, bottom: b.top - 1 });
|
|
161
|
+
if (a.bottom > b.bottom)
|
|
162
|
+
out.push({ ...a, top: b.bottom + 1 });
|
|
163
|
+
const top = Math.max(a.top, b.top), bottom = Math.min(a.bottom, b.bottom);
|
|
164
|
+
if (a.left < b.left)
|
|
165
|
+
out.push({ top, bottom, left: a.left, right: b.left - 1 });
|
|
166
|
+
if (a.right > b.right)
|
|
167
|
+
out.push({ top, bottom, left: b.right + 1, right: a.right });
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
const sqrefOf = (boxes) => boxes.map((b) => rangeRef(b));
|
|
171
|
+
/** Two rules that check the same thing (their messages aside): the second joins the first instead of being added. */
|
|
172
|
+
function sameCheck(a, b) {
|
|
173
|
+
const f = (x) => (x ?? '').trim().replace(/^=/, '');
|
|
174
|
+
const ordered = a.type !== 'list' && a.type !== 'custom' && a.type !== 'none';
|
|
175
|
+
const two = (a.operator ?? 'between') === 'between' || a.operator === 'notBetween';
|
|
176
|
+
return a.type === b.type && a.allowBlank === b.allowBlank && f(a.formula1) === f(b.formula1)
|
|
177
|
+
&& (!ordered || ((a.operator ?? 'between') === (b.operator ?? 'between') && (!two || f(a.formula2) === f(b.formula2))));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* The host's rules as each sheet's whole `<dataValidations>` set: the workbook's own rules, kept as they are, plus
|
|
181
|
+
* every rule of the rules file and the element's `columns` that Excel can hold. A column rule covers its column from
|
|
182
|
+
* the row under the titles to the last row; a cell rule its cell or range. Where a rule already holds a cell the
|
|
183
|
+
* workbook's own rule wins: the written rule leaves those cells (a conflict, SP-5406) or, when it checks the same thing,
|
|
184
|
+
* joins the workbook's rule instead of repeating it. A cell rule wins over a column rule, a named sheet's over `*`'s.
|
|
185
|
+
*
|
|
186
|
+
* @param store - The workbook store: its workbook and its `columnRules`.
|
|
187
|
+
* @param o - `inBlock(sheet)`: how many of the sheet's own rules (in the order read) are in the main block — the rest
|
|
188
|
+
* are Excel 2010 `x14` rules, left where they are and never repeated; all of them when absent.
|
|
189
|
+
* @returns Each changed sheet's whole set, ready for `setDataValidations` or `patchXlsx`'s `dataValidations`, and the report.
|
|
190
|
+
*/
|
|
191
|
+
export function rulesAsValidations(store, o = {}) {
|
|
192
|
+
const plan = { sheets: [], written: 0, merged: 0, skipped: [], conflicts: [] };
|
|
193
|
+
const book = store.book;
|
|
194
|
+
if (!book)
|
|
195
|
+
return plan;
|
|
196
|
+
const cfg = store.columnRules;
|
|
197
|
+
const doc = cfg.document === undefined ? undefined : checkDocument(cfg.document);
|
|
198
|
+
const star = doc?.sheets.get('*');
|
|
199
|
+
const names = new Set(book.sheets.map((s) => s.name));
|
|
200
|
+
for (const name of doc?.sheets.keys() ?? [])
|
|
201
|
+
if (name !== '*' && !names.has(name))
|
|
202
|
+
plan.skipped.push({ code: 'SP-5405', sheet: name, where: `sheet “${name}”`, reason: 'sheet', detail: `no sheet is named “${name}”: its rules are not written` });
|
|
203
|
+
const general = new Map(); // title (lower case) → as written, for the element's and "*"'s columns
|
|
204
|
+
for (const t of [...Object.keys(cfg.columns ?? {}), ...Object.keys(star?.columns ?? {})])
|
|
205
|
+
general.set(t.trim().toLowerCase(), t);
|
|
206
|
+
const foundGeneral = new Set();
|
|
207
|
+
for (const s of book.sheets) {
|
|
208
|
+
const own = doc?.sheets.get(s.name);
|
|
209
|
+
const headerRow = Math.max(1, Math.floor(own?.headerRow ?? star?.headerRow ?? cfg.headerRow ?? 1));
|
|
210
|
+
// the columns, merged as the rules engine merges them: element < "*" < this sheet
|
|
211
|
+
const byTitle = new Map();
|
|
212
|
+
for (const src of [cfg.columns ?? {}, star?.columns ?? {}, own?.columns ?? {}])
|
|
213
|
+
for (const [t, r] of Object.entries(src))
|
|
214
|
+
byTitle.set(t.trim().toLowerCase(), { title: t, rule: r });
|
|
215
|
+
const seen = new Set();
|
|
216
|
+
const cols = [];
|
|
217
|
+
const width = s.rows[headerRow - 1]?.length ?? 0;
|
|
218
|
+
for (let c = 0; c < width; c++) {
|
|
219
|
+
const t = store.text(s.name, cellRef(headerRow - 1, c)).trim(), k = t.toLowerCase();
|
|
220
|
+
if (!t || seen.has(k))
|
|
221
|
+
continue;
|
|
222
|
+
seen.add(k);
|
|
223
|
+
const hit = byTitle.get(k);
|
|
224
|
+
if (hit) {
|
|
225
|
+
cols.push({ col: c, title: t, rule: hit.rule });
|
|
226
|
+
if (general.has(k))
|
|
227
|
+
foundGeneral.add(k);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
for (const t of Object.keys(own?.columns ?? {}))
|
|
231
|
+
if (!seen.has(t.trim().toLowerCase()))
|
|
232
|
+
plan.skipped.push({ code: 'SP-5405', sheet: s.name, where: `column “${t}”`, reason: 'column', detail: `no column is titled “${t}” in row ${headerRow} of “${s.name}”` });
|
|
233
|
+
// the rules to write, the strongest first: this sheet's cells, "*"'s cells, then the columns
|
|
234
|
+
const wanted = [];
|
|
235
|
+
for (const src of [own?.cells, star?.cells])
|
|
236
|
+
for (const [ref, r] of Object.entries(src ?? {})) {
|
|
237
|
+
const box = parseRange(ref);
|
|
238
|
+
if (box)
|
|
239
|
+
wanted.push({ where: `${ref.includes(':') ? 'cells' : 'cell'} ${ref}`, title: ref, box, rule: r });
|
|
240
|
+
}
|
|
241
|
+
for (const c of cols)
|
|
242
|
+
wanted.push({ where: `column “${c.title}”`, title: c.title, box: { top: headerRow, left: c.col, bottom: MAX_ROWS - 1, right: c.col }, rule: c.rule });
|
|
243
|
+
if (!wanted.length)
|
|
244
|
+
continue;
|
|
245
|
+
const n = o.inBlock?.(s.name) ?? s.dataValidations.length;
|
|
246
|
+
const placed = s.dataValidations.map((dv, i) => ({ dv: { ...dv, sqref: [...dv.sqref] }, boxes: dv.sqref.map(parseBox).filter((b) => !!b), own: true, inBlock: i < n, where: '' }));
|
|
247
|
+
let written = 0;
|
|
248
|
+
for (const w of wanted) {
|
|
249
|
+
const m = validationOf(w.rule, { title: w.title, onInvalid: cfg.onInvalid });
|
|
250
|
+
if (!m)
|
|
251
|
+
continue;
|
|
252
|
+
if (m.skip) {
|
|
253
|
+
plan.skipped.push({ ...m.skip, sheet: s.name, where: w.where });
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
let pieces = [w.box];
|
|
257
|
+
for (const p of placed) {
|
|
258
|
+
const hit = p.boxes.flatMap((b) => pieces.filter((x) => meets(x, b)).map((x) => overlap(x, b)));
|
|
259
|
+
if (!hit.length)
|
|
260
|
+
continue;
|
|
261
|
+
if (!sameCheck(p.dv, m.dv))
|
|
262
|
+
plan.conflicts.push({ code: 'SP-5406', sheet: s.name, cells: sqrefOf(hit).join(' '), where: w.where, kept: p.own ? `the workbook's own ${p.dv.type} rule` : p.where });
|
|
263
|
+
pieces = p.boxes.reduce((left, b) => left.flatMap((x) => minus(x, b)), pieces);
|
|
264
|
+
}
|
|
265
|
+
if (!pieces.length)
|
|
266
|
+
continue;
|
|
267
|
+
plan.written++;
|
|
268
|
+
written++;
|
|
269
|
+
const join = placed.find((p) => p.inBlock && sameCheck(p.dv, m.dv));
|
|
270
|
+
if (join) {
|
|
271
|
+
join.dv.sqref.push(...sqrefOf(pieces));
|
|
272
|
+
join.boxes.push(...pieces);
|
|
273
|
+
if (join.own)
|
|
274
|
+
plan.merged++;
|
|
275
|
+
}
|
|
276
|
+
else
|
|
277
|
+
placed.push({ dv: { ...m.dv, sqref: sqrefOf(pieces) }, boxes: pieces, own: false, inBlock: true, where: w.where });
|
|
278
|
+
}
|
|
279
|
+
if (written)
|
|
280
|
+
plan.sheets.push({ sheet: s.name, rules: placed.filter((p) => p.inBlock).map((p) => p.dv), written });
|
|
281
|
+
}
|
|
282
|
+
for (const [k, t] of general)
|
|
283
|
+
if (!foundGeneral.has(k))
|
|
284
|
+
plan.skipped.push({ code: 'SP-5405', sheet: '*', where: `column “${t}”`, reason: 'column', detail: `no sheet has a column titled “${t}”` });
|
|
285
|
+
return plan;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* How many `<dataValidation>`s a worksheet holds in its main block (Excel 2010's `x14:` ones, inside `<extLst>`, not counted).
|
|
289
|
+
*
|
|
290
|
+
* @param xml - The worksheet's XML.
|
|
291
|
+
* @returns The count — the first that many of the sheet's rules, in the order `@sheetpane/import` reads them.
|
|
292
|
+
*/
|
|
293
|
+
export function mainBlockCount(xml) {
|
|
294
|
+
const body = xml.replace(/<((?:[\w.-]+:)?)extLst\b[\s\S]*?<\/\1extLst>/g, '');
|
|
295
|
+
return (body.match(/<(?:[\w.-]+:)?dataValidation[\s/>]/g) ?? []).length;
|
|
296
|
+
}
|
|
297
|
+
const reports = new WeakMap();
|
|
298
|
+
/**
|
|
299
|
+
* The report of the last export that wrote the rules (the status line reads it).
|
|
300
|
+
*
|
|
301
|
+
* @param book - The workbook, or `undefined`.
|
|
302
|
+
* @returns The report, or `undefined` before the first such export.
|
|
303
|
+
*/
|
|
304
|
+
export function lastRulesWrite(book) {
|
|
305
|
+
return book ? reports.get(book) : undefined;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Writes the host's rules into an `.xlsx` being exported, from an `exportPatch` hook: each changed sheet's
|
|
309
|
+
* `<dataValidations>` rewritten to its whole set ({@link rulesAsValidations}), `x14` rules left where they are. A
|
|
310
|
+
* sheet whose own rules cannot be rewritten (SP-2015) keeps its block and its written rules are listed (SP-5407).
|
|
311
|
+
* Every rule not written, and every conflict, is a console warning with its code.
|
|
312
|
+
*
|
|
313
|
+
* @param patch - The `exportPatch` context.
|
|
314
|
+
* @param store - The workbook store.
|
|
315
|
+
* @returns The report.
|
|
316
|
+
*/
|
|
317
|
+
export async function writeRules(patch, store) {
|
|
318
|
+
const book = store.book;
|
|
319
|
+
const xml = new Map(), count = new Map();
|
|
320
|
+
for (const s of book?.sheets ?? []) {
|
|
321
|
+
if (!s.dataValidations.length)
|
|
322
|
+
continue;
|
|
323
|
+
const path = patch.sheetPath(s.name), text = path ? await patch.readText(path) : undefined;
|
|
324
|
+
if (text === undefined)
|
|
325
|
+
continue;
|
|
326
|
+
xml.set(s.name, text);
|
|
327
|
+
count.set(s.name, mainBlockCount(text));
|
|
328
|
+
}
|
|
329
|
+
const plan = rulesAsValidations(store, { inBlock: (sheet) => count.get(sheet) });
|
|
330
|
+
const report = { written: plan.written, merged: plan.merged, skipped: plan.skipped, conflicts: plan.conflicts };
|
|
331
|
+
for (const { sheet, rules, written } of plan.sheets) {
|
|
332
|
+
const path = patch.sheetPath(sheet);
|
|
333
|
+
const text = xml.get(sheet) ?? (path ? await patch.readText(path) : undefined);
|
|
334
|
+
let why = path && text !== undefined ? '' : `no worksheet part for “${sheet}”`;
|
|
335
|
+
if (path && text !== undefined) {
|
|
336
|
+
try {
|
|
337
|
+
patch.write(path, setDataValidations(text, rules, sheet));
|
|
338
|
+
}
|
|
339
|
+
catch (e) {
|
|
340
|
+
why = e.message;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (why) {
|
|
344
|
+
report.written -= written;
|
|
345
|
+
report.skipped.push({ code: 'SP-5407', sheet, where: `sheet “${sheet}”`, reason: 'workbook', detail: `the sheet's own rules could not be rewritten, so none were written to it: ${why}` });
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (book)
|
|
349
|
+
reports.set(book, report);
|
|
350
|
+
for (const x of report.skipped)
|
|
351
|
+
console.warn(spMessage(x.code, `sheetpane validation: ${x.where}${x.sheet === '*' || x.where.startsWith('sheet') ? '' : ` on “${x.sheet}”`} not written to Excel: ${x.detail}`));
|
|
352
|
+
for (const c of report.conflicts)
|
|
353
|
+
console.warn(spMessage(c.code, `sheetpane validation: ${c.where} on “${c.sheet}” not written to ${c.cells}: ${c.kept} holds those cells`));
|
|
354
|
+
return report;
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,uFAAuF;AACvF,yFAAyF;AACzF,0FAA0F;AAC1F,gFAAgF;AAChF,8EAA8E;AAC9E,wEAAwE;AACxE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuD,MAAM,iBAAiB,CAAC;AACnH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAuD,MAAM,mBAAmB,CAAC;AAChK,OAAO,EAAE,QAAQ,EAAuB,MAAM,YAAY,CAAC;AAE3D,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAChD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AAuDnE,MAAM,GAAG,GAAG,uCAAuC,CAAC;AACpD,MAAM,GAAG,GAAG,2BAA2B,CAAC;AACxC,MAAM,QAAQ,GAAG,GAAG,EAAE,SAAS,GAAG,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC;AACxD,gEAAgE;AAChE,MAAM,GAAG,GAAG,WAAW,CAAC;AACxB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACpF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,MAAuB,EAAE,MAAc,EAAc,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AAEzH,mDAAmD;AACnD,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACtH,8HAA8H;AAC9H,SAAS,SAAS,CAAC,CAAkB;IACnC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5H,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3G,IAAI,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACrG,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;AAC5C,CAAC;AACD,2DAA2D;AAC3D,SAAS,OAAO,CAAC,EAAsB,EAAE,EAAsB,EAAE,GAAqB;IACpF,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACrG,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9E,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC3E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,CAAC,GAA0D,EAAE;IAC1G,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,IAAI,CAAC,OAAO,wDAAwD,CAAC,CAAC;IACvJ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,oEAAoE,CAAC,CAAC;IACtI,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,2DAA2D,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;IAC7E,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI,kCAAkC,CAAC,CAAC;IAC1G,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACrE,IAAI,IAAyE,CAAC;IAC9E,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxN,IAAI,MAAM,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,eAAe,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACvJ,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,KAAK,0DAA0D,CAAC,CAAC;QAC7H,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,IAAI,CAAC,MAAM,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QACjI,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,MAAM,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClE,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACpD,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC;QACrF,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvI,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACjI,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACjI,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACrH,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IAChL,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnI,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACvK,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACvK,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3H,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAC5F,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,sDAAsD,CAAC,CAAC;QACxI,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACzM,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAClM,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,IAAI,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC/E,CAAC;;QAAM,OAAO,SAAS,CAAC;IACxB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC;IAC1D,MAAM,EAAE,GAAkC;QACxC,GAAG,IAAI;QACP,UAAU,EAAE,CAAC,QAAQ;QACrB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;QACjG,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,WAAW,CAAC;KAC/C,CAAC;IACF,IAAI,KAAK,EAAE,CAAC;QAAC,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC;QAAC,EAAE,CAAC,WAAW,GAAG,KAAK,CAAC;IAAC,CAAC;IAC7D,IAAI,KAAK;QAAE,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/C,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC;AAED,6EAA6E;AAC7E,MAAM,KAAK,GAAG,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;AACnH,MAAM,OAAO,GAAG,CAAC,CAAM,EAAE,CAAM,EAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACpL,oFAAoF;AACpF,SAAS,KAAK,CAAC,CAAM,EAAE,CAAM;IAC3B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1E,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC;AACb,CAAC;AACD,MAAM,OAAO,GAAG,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,qHAAqH;AACrH,SAAS,SAAS,CAAC,CAAgC,EAAE,CAAgC;IACnF,MAAM,CAAC,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;IAC9E,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC;IACnF,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;WACvF,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5H,CAAC;AAKD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB,EAAE,CAAC,GAAwD,EAAE;IAClH,MAAM,IAAI,GAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE;QAAE,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,CAAC,CAAC;IACpP,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,uEAAuE;IAClH,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IACjI,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;QACnG,kFAAkF;QAClF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+C,CAAC;QACvE,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;YAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACrL,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,IAAI,GAAuD,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACpF,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAChC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;QACxG,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,wBAAwB,CAAC,YAAY,SAAS,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACjQ,6FAA6F;QAC7F,MAAM,MAAM,GAAmE,EAAE,CAAC;QAClF,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;YAAE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;gBAAC,IAAI,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QAC5O,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5K,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC;QAC1D,MAAM,MAAM,GAAa,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvM,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC1F,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChG,IAAI,CAAC,GAAG,CAAC,MAAM;oBAAE,SAAS;gBAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;oBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACjF,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,SAAS;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,IAAI,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;gBAAC,IAAI,IAAI,CAAC,GAAG;oBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,CAAC;;gBACzG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1H,CAAC;QACD,IAAI,OAAO;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO;QAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iCAAiC,CAAC,GAAG,EAAE,CAAC,CAAC;IACpM,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAA0B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAmB,EAAE,KAAoB;IACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,EAAE,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM;YAAE,SAAS;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjF,MAAM,MAAM,GAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAClI,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0BAA0B,KAAK,GAAG,CAAC;QAC/E,IAAI,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,GAAG,GAAI,CAAW,CAAC,OAAO,CAAC;YAAC,CAAC;QAC9G,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,KAAK,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,6EAA6E,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7L,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG,0BAA0B,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjN,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC;IAC7K,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sheetpane/validation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Data validation for sheetpane — the workbook's own `<dataValidations>` rules checked on load and on every edit, landing in <sheetpane-errors> — as a plugin on the `validate` hook.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
"types": "./dist/index.d.ts",
|
|
24
24
|
"import": "./dist/index.js"
|
|
25
25
|
},
|
|
26
|
+
"./check": {
|
|
27
|
+
"types": "./dist/check.d.ts",
|
|
28
|
+
"import": "./dist/check.js"
|
|
29
|
+
},
|
|
26
30
|
"./ui": {
|
|
27
31
|
"types": "./dist/ui.d.ts",
|
|
28
32
|
"import": "./dist/ui.js"
|
|
@@ -32,15 +36,15 @@
|
|
|
32
36
|
"dist"
|
|
33
37
|
],
|
|
34
38
|
"peerDependencies": {
|
|
35
|
-
"@sheetpane/grid": "0.
|
|
39
|
+
"@sheetpane/grid": "0.4.0"
|
|
36
40
|
},
|
|
37
41
|
"dependencies": {
|
|
38
|
-
"@sheetpane/
|
|
42
|
+
"@sheetpane/export": "0.4.0",
|
|
43
|
+
"@sheetpane/skills": "0.4.0"
|
|
39
44
|
},
|
|
40
45
|
"devDependencies": {
|
|
41
|
-
"@sheetpane/
|
|
42
|
-
"@sheetpane/
|
|
43
|
-
"@sheetpane/grid": "0.3.0"
|
|
46
|
+
"@sheetpane/formulas": "0.4.0",
|
|
47
|
+
"@sheetpane/grid": "0.4.0"
|
|
44
48
|
},
|
|
45
49
|
"publishConfig": {
|
|
46
50
|
"access": "public"
|