@drzl/validation-core 3.12.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -84473,6 +84473,7 @@ module.exports = __toCommonJS(index_exports2);
84473
84473
  // src/checks.ts
84474
84474
  var COMPARISON = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*(>=|<=|<>|!=|>|<|=)\s*(.+?)\s*$/;
84475
84475
  var IN_LIST = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s+IN\s*\((.+)\)\s*$/i;
84476
+ var CARDINALITY_OF = /^\s*(?:cardinality\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)|array_length\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*,\s*1\s*\))\s*(>=|<=|<>|!=|>|<|=)\s*(\d+)\s*$/i;
84476
84477
  var LENGTH_OF = /^\s*(?:length|char_length)\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)\s*(>=|<=|<>|!=|>|<|=)\s*(\d+)\s*$/i;
84477
84478
  function splitTopLevelAnd(expr) {
84478
84479
  const parts = [];
@@ -84595,6 +84596,7 @@ function parseCheck(expression, name) {
84595
84596
  const sets = [];
84596
84597
  const rows = [];
84597
84598
  const lengths = [];
84599
+ const cardinalities = [];
84598
84600
  for (const part of parts) {
84599
84601
  const parsed = parseCheck(part, name);
84600
84602
  if (!parsed.ok)
@@ -84603,13 +84605,15 @@ function parseCheck(expression, name) {
84603
84605
  if (parsed.sets) sets.push(...parsed.sets);
84604
84606
  if (parsed.rows) rows.push(...parsed.rows);
84605
84607
  if (parsed.lengths) lengths.push(...parsed.lengths);
84608
+ if (parsed.cardinalities) cardinalities.push(...parsed.cardinalities);
84606
84609
  }
84607
84610
  return {
84608
84611
  ok: true,
84609
84612
  checks,
84610
84613
  ...sets.length ? { sets } : {},
84611
84614
  ...rows.length ? { rows } : {},
84612
- ...lengths.length ? { lengths } : {}
84615
+ ...lengths.length ? { lengths } : {},
84616
+ ...cardinalities.length ? { cardinalities } : {}
84613
84617
  };
84614
84618
  }
84615
84619
  const lengthOf = expr.match(LENGTH_OF);
@@ -84621,6 +84625,22 @@ function parseCheck(expression, name) {
84621
84625
  lengths: [{ column: lengthOf[1], operator: op4, value: lengthOf[3], name }]
84622
84626
  };
84623
84627
  }
84628
+ const cardinalityOf = expr.match(CARDINALITY_OF);
84629
+ if (cardinalityOf) {
84630
+ const op4 = cardinalityOf[3] === "!=" ? "<>" : cardinalityOf[3];
84631
+ return {
84632
+ ok: true,
84633
+ checks: [],
84634
+ cardinalities: [
84635
+ {
84636
+ column: cardinalityOf[1] ?? cardinalityOf[2],
84637
+ operator: op4,
84638
+ value: cardinalityOf[4],
84639
+ ...name ? { name } : {}
84640
+ }
84641
+ ]
84642
+ };
84643
+ }
84624
84644
  const inList = expr.match(IN_LIST);
84625
84645
  if (inList) {
84626
84646
  const raw = splitTopLevelCommas(inList[2]);
package/dist/index.d.cts CHANGED
@@ -244,6 +244,18 @@ interface LengthCheck {
244
244
  value: string;
245
245
  name?: string;
246
246
  }
247
+ /**
248
+ * A constraint on an array column's element count, from `CHECK (cardinality(tags) > 0)`.
249
+ *
250
+ * The array analogue of `LengthCheck`, and free of the question that one carries: an element
251
+ * count is the same number in SQL and in JavaScript, with no encoding involved.
252
+ */
253
+ interface CardinalityCheck {
254
+ column: string;
255
+ operator: ColumnCheck['operator'];
256
+ value: string;
257
+ name?: string;
258
+ }
247
259
  /** A check that was understood, or the reason it was not. */
248
260
  type ParsedCheck = {
249
261
  ok: true;
@@ -251,6 +263,7 @@ type ParsedCheck = {
251
263
  sets?: ColumnSet[];
252
264
  rows?: RowCheck[];
253
265
  lengths?: LengthCheck[];
266
+ cardinalities?: CardinalityCheck[];
254
267
  } | {
255
268
  ok: false;
256
269
  reason: string;
@@ -448,4 +461,4 @@ declare function updateColumns(table: Table): Column[];
448
461
  declare function selectColumns(table: Table): Column[];
449
462
  declare function formatCode(code: string, filePath: string, fmt?: FormatOptions): Promise<any>;
450
463
 
451
- export { AFFIX_PROBE_TABLE, type AffixIssue, type AffixOptions, type AffixValue, CODEPOINT_LENGTH, COLUMN_FORMATS, type ColumnCheck, type ColumnSet, DEFAULT_IMPORT_EXTENSION, DEFAULT_MODE_PREFIX, DEFAULT_SCHEMA_SUFFIX, DEFAULT_TYPE_SUFFIX, type FormatOptions, IMPORT_EXTENSIONS, type ImportExtension, type LengthCheck, NAME_MODES, type NameMode, type ParsedCheck, type ResolvedAffix, type RowCheck, type Table, type TableCase, type ValidationGenerateOptions, type ValidationLibrary, type ValidationRenderer, applyTableCase, describeSet, formatCode, importSpecifier, insertColumns, isGeneratedColumn, isIntegerColumn, moduleFileName, moduleSpecifier, parseCheck, pascalCase, resolveAffix, resolveConfiguredImport, schemaName, selectColumns, typeName, updateColumns, validateAffix };
464
+ export { AFFIX_PROBE_TABLE, type AffixIssue, type AffixOptions, type AffixValue, CODEPOINT_LENGTH, COLUMN_FORMATS, type CardinalityCheck, type ColumnCheck, type ColumnSet, DEFAULT_IMPORT_EXTENSION, DEFAULT_MODE_PREFIX, DEFAULT_SCHEMA_SUFFIX, DEFAULT_TYPE_SUFFIX, type FormatOptions, IMPORT_EXTENSIONS, type ImportExtension, type LengthCheck, NAME_MODES, type NameMode, type ParsedCheck, type ResolvedAffix, type RowCheck, type Table, type TableCase, type ValidationGenerateOptions, type ValidationLibrary, type ValidationRenderer, applyTableCase, describeSet, formatCode, importSpecifier, insertColumns, isGeneratedColumn, isIntegerColumn, moduleFileName, moduleSpecifier, parseCheck, pascalCase, resolveAffix, resolveConfiguredImport, schemaName, selectColumns, typeName, updateColumns, validateAffix };
package/dist/index.d.ts CHANGED
@@ -244,6 +244,18 @@ interface LengthCheck {
244
244
  value: string;
245
245
  name?: string;
246
246
  }
247
+ /**
248
+ * A constraint on an array column's element count, from `CHECK (cardinality(tags) > 0)`.
249
+ *
250
+ * The array analogue of `LengthCheck`, and free of the question that one carries: an element
251
+ * count is the same number in SQL and in JavaScript, with no encoding involved.
252
+ */
253
+ interface CardinalityCheck {
254
+ column: string;
255
+ operator: ColumnCheck['operator'];
256
+ value: string;
257
+ name?: string;
258
+ }
247
259
  /** A check that was understood, or the reason it was not. */
248
260
  type ParsedCheck = {
249
261
  ok: true;
@@ -251,6 +263,7 @@ type ParsedCheck = {
251
263
  sets?: ColumnSet[];
252
264
  rows?: RowCheck[];
253
265
  lengths?: LengthCheck[];
266
+ cardinalities?: CardinalityCheck[];
254
267
  } | {
255
268
  ok: false;
256
269
  reason: string;
@@ -448,4 +461,4 @@ declare function updateColumns(table: Table): Column[];
448
461
  declare function selectColumns(table: Table): Column[];
449
462
  declare function formatCode(code: string, filePath: string, fmt?: FormatOptions): Promise<any>;
450
463
 
451
- export { AFFIX_PROBE_TABLE, type AffixIssue, type AffixOptions, type AffixValue, CODEPOINT_LENGTH, COLUMN_FORMATS, type ColumnCheck, type ColumnSet, DEFAULT_IMPORT_EXTENSION, DEFAULT_MODE_PREFIX, DEFAULT_SCHEMA_SUFFIX, DEFAULT_TYPE_SUFFIX, type FormatOptions, IMPORT_EXTENSIONS, type ImportExtension, type LengthCheck, NAME_MODES, type NameMode, type ParsedCheck, type ResolvedAffix, type RowCheck, type Table, type TableCase, type ValidationGenerateOptions, type ValidationLibrary, type ValidationRenderer, applyTableCase, describeSet, formatCode, importSpecifier, insertColumns, isGeneratedColumn, isIntegerColumn, moduleFileName, moduleSpecifier, parseCheck, pascalCase, resolveAffix, resolveConfiguredImport, schemaName, selectColumns, typeName, updateColumns, validateAffix };
464
+ export { AFFIX_PROBE_TABLE, type AffixIssue, type AffixOptions, type AffixValue, CODEPOINT_LENGTH, COLUMN_FORMATS, type CardinalityCheck, type ColumnCheck, type ColumnSet, DEFAULT_IMPORT_EXTENSION, DEFAULT_MODE_PREFIX, DEFAULT_SCHEMA_SUFFIX, DEFAULT_TYPE_SUFFIX, type FormatOptions, IMPORT_EXTENSIONS, type ImportExtension, type LengthCheck, NAME_MODES, type NameMode, type ParsedCheck, type ResolvedAffix, type RowCheck, type Table, type TableCase, type ValidationGenerateOptions, type ValidationLibrary, type ValidationRenderer, applyTableCase, describeSet, formatCode, importSpecifier, insertColumns, isGeneratedColumn, isIntegerColumn, moduleFileName, moduleSpecifier, parseCheck, pascalCase, resolveAffix, resolveConfiguredImport, schemaName, selectColumns, typeName, updateColumns, validateAffix };
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import "./chunk-ZZGILH5A.js";
3
3
  // src/checks.ts
4
4
  var COMPARISON = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*(>=|<=|<>|!=|>|<|=)\s*(.+?)\s*$/;
5
5
  var IN_LIST = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s+IN\s*\((.+)\)\s*$/i;
6
+ var CARDINALITY_OF = /^\s*(?:cardinality\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)|array_length\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*,\s*1\s*\))\s*(>=|<=|<>|!=|>|<|=)\s*(\d+)\s*$/i;
6
7
  var LENGTH_OF = /^\s*(?:length|char_length)\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)\s*(>=|<=|<>|!=|>|<|=)\s*(\d+)\s*$/i;
7
8
  function splitTopLevelAnd(expr) {
8
9
  const parts = [];
@@ -125,6 +126,7 @@ function parseCheck(expression, name) {
125
126
  const sets = [];
126
127
  const rows = [];
127
128
  const lengths = [];
129
+ const cardinalities = [];
128
130
  for (const part of parts) {
129
131
  const parsed = parseCheck(part, name);
130
132
  if (!parsed.ok)
@@ -133,13 +135,15 @@ function parseCheck(expression, name) {
133
135
  if (parsed.sets) sets.push(...parsed.sets);
134
136
  if (parsed.rows) rows.push(...parsed.rows);
135
137
  if (parsed.lengths) lengths.push(...parsed.lengths);
138
+ if (parsed.cardinalities) cardinalities.push(...parsed.cardinalities);
136
139
  }
137
140
  return {
138
141
  ok: true,
139
142
  checks,
140
143
  ...sets.length ? { sets } : {},
141
144
  ...rows.length ? { rows } : {},
142
- ...lengths.length ? { lengths } : {}
145
+ ...lengths.length ? { lengths } : {},
146
+ ...cardinalities.length ? { cardinalities } : {}
143
147
  };
144
148
  }
145
149
  const lengthOf = expr.match(LENGTH_OF);
@@ -151,6 +155,22 @@ function parseCheck(expression, name) {
151
155
  lengths: [{ column: lengthOf[1], operator: op2, value: lengthOf[3], name }]
152
156
  };
153
157
  }
158
+ const cardinalityOf = expr.match(CARDINALITY_OF);
159
+ if (cardinalityOf) {
160
+ const op2 = cardinalityOf[3] === "!=" ? "<>" : cardinalityOf[3];
161
+ return {
162
+ ok: true,
163
+ checks: [],
164
+ cardinalities: [
165
+ {
166
+ column: cardinalityOf[1] ?? cardinalityOf[2],
167
+ operator: op2,
168
+ value: cardinalityOf[4],
169
+ ...name ? { name } : {}
170
+ }
171
+ ]
172
+ };
173
+ }
154
174
  const inList = expr.match(IN_LIST);
155
175
  if (inList) {
156
176
  const raw = splitTopLevelCommas(inList[2]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drzl/validation-core",
3
- "version": "3.12.0",
3
+ "version": "3.13.0",
4
4
  "private": false,
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",