@stndrds/schema 1.0.0-alpha.282 → 1.0.0-alpha.284

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 (81) hide show
  1. package/dist/all-DanoPxKr.d.ts +879 -0
  2. package/dist/all-bG_ha0VV.d.mts +879 -0
  3. package/dist/{attributes-CU871AfG.d.ts → attributes-CNYwg_Nr.d.ts} +3 -2
  4. package/dist/{attributes-DoiGyNFk.d.mts → attributes-CWPLbp7c.d.mts} +3 -2
  5. package/dist/capabilities.d.mts +146 -0
  6. package/dist/capabilities.d.ts +146 -0
  7. package/dist/capabilities.js +77 -0
  8. package/dist/capabilities.mjs +70 -0
  9. package/dist/{chunk-R34LOMT7.mjs → chunk-5OBQRDRM.mjs} +3 -3
  10. package/dist/{chunk-QGRYOIHT.mjs → chunk-AGRAFDGU.mjs} +40 -14
  11. package/dist/{chunk-DIMTNM3F.js → chunk-BOICAZHR.js} +5 -4
  12. package/dist/{chunk-V4MZOTLV.js → chunk-I3EYILYO.js} +5 -5
  13. package/dist/{chunk-LBGLB443.js → chunk-K6ET4CXP.js} +3 -3
  14. package/dist/{chunk-PLTLAMWJ.mjs → chunk-PNOWKRH2.mjs} +2 -2
  15. package/dist/{chunk-EFSS7PGC.mjs → chunk-R57T4UDX.mjs} +1 -1
  16. package/dist/{chunk-HOVUEYEQ.mjs → chunk-RUO25ERR.mjs} +4 -0
  17. package/dist/{chunk-L4KLYMUI.js → chunk-V26R64A4.js} +4 -0
  18. package/dist/{chunk-KIMECN6D.js → chunk-YZ5RCMIQ.js} +83 -46
  19. package/dist/exceptions.d.mts +6 -2
  20. package/dist/exceptions.d.ts +6 -2
  21. package/dist/exceptions.js +39 -39
  22. package/dist/exceptions.mjs +1 -1
  23. package/dist/{helpers-BNr-Dppk.d.ts → helpers-CXkVwpsl.d.ts} +3 -3
  24. package/dist/{helpers-CfEOUBmB.d.mts → helpers-Dul_r9rJ.d.mts} +3 -3
  25. package/dist/{index-D9XBjFnu.d.mts → index-Ca-MzQuU.d.mts} +8 -3
  26. package/dist/{index-Br7koyHF.d.ts → index-Ns6KGfrZ.d.ts} +8 -3
  27. package/dist/index.d.mts +1120 -206
  28. package/dist/index.d.ts +1120 -206
  29. package/dist/index.js +1184 -359
  30. package/dist/index.mjs +868 -118
  31. package/dist/{migrations-BGWgXHXb.d.ts → migrations-DaFneOfx.d.ts} +1 -1
  32. package/dist/{migrations-C-GN1xx_.d.mts → migrations-fRvadl6i.d.mts} +1 -1
  33. package/dist/{objects-BRypaBpi.d.mts → objects-CDwMSnqv.d.mts} +2 -2
  34. package/dist/{objects-BiOMwzLL.d.ts → objects-DJv6WrDE.d.ts} +2 -2
  35. package/dist/{types-80c2rOUZ.d.mts → types-CVYiFc69.d.mts} +1 -1
  36. package/dist/{types-DqYz8Iv_.d.ts → types-NGEww_ln.d.ts} +1 -1
  37. package/dist/utils.js +8 -8
  38. package/dist/utils.mjs +2 -2
  39. package/dist/validation/all.d.mts +7 -7
  40. package/dist/validation/all.d.ts +7 -7
  41. package/dist/validation/all.js +46 -46
  42. package/dist/validation/all.mjs +5 -5
  43. package/dist/validation/complex/currency.d.mts +2 -2
  44. package/dist/validation/complex/currency.d.ts +2 -2
  45. package/dist/validation/complex/location.d.mts +2 -2
  46. package/dist/validation/complex/location.d.ts +2 -2
  47. package/dist/validation/complex/phone.d.mts +2 -2
  48. package/dist/validation/complex/phone.d.ts +2 -2
  49. package/dist/validation/complex/relation.d.mts +2 -2
  50. package/dist/validation/complex/relation.d.ts +2 -2
  51. package/dist/validation/complex/richtext.d.mts +2 -2
  52. package/dist/validation/complex/richtext.d.ts +2 -2
  53. package/dist/validation/complex/select.d.mts +2 -2
  54. package/dist/validation/complex/select.d.ts +2 -2
  55. package/dist/validation/complex/user.d.mts +2 -2
  56. package/dist/validation/complex/user.d.ts +2 -2
  57. package/dist/validation/computed/formula.d.mts +2 -2
  58. package/dist/validation/computed/formula.d.ts +2 -2
  59. package/dist/validation/computed/rollup.d.mts +2 -2
  60. package/dist/validation/computed/rollup.d.ts +2 -2
  61. package/dist/validation/config/index.d.mts +4 -4
  62. package/dist/validation/config/index.d.ts +4 -4
  63. package/dist/validation/config/index.js +15 -11
  64. package/dist/validation/config/index.mjs +2 -2
  65. package/dist/validation/core/index.d.mts +3 -3
  66. package/dist/validation/core/index.d.ts +3 -3
  67. package/dist/validation/object/index.d.mts +5 -5
  68. package/dist/validation/object/index.d.ts +5 -5
  69. package/dist/validation/object/index.js +15 -15
  70. package/dist/validation/object/index.mjs +3 -3
  71. package/dist/validation/primitives/checkbox.d.mts +2 -2
  72. package/dist/validation/primitives/checkbox.d.ts +2 -2
  73. package/dist/validation/primitives/date.d.mts +2 -2
  74. package/dist/validation/primitives/date.d.ts +2 -2
  75. package/dist/validation/primitives/number.d.mts +2 -2
  76. package/dist/validation/primitives/number.d.ts +2 -2
  77. package/dist/validation/primitives/text.d.mts +2 -2
  78. package/dist/validation/primitives/text.d.ts +2 -2
  79. package/package.json +10 -5
  80. package/dist/all-C3EaFLCU.d.ts +0 -472
  81. package/dist/all-CQMswOrw.d.mts +0 -472
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkL4KLYMUI_js = require('./chunk-L4KLYMUI.js');
3
+ var chunkV26R64A4_js = require('./chunk-V26R64A4.js');
4
4
  var zod = require('zod');
5
5
  var constants = require('@stndrds/constants');
6
6
 
@@ -551,7 +551,7 @@ var attributeConfigSchemas = {
551
551
  function getAttributeConfigSchema(type) {
552
552
  const schema = attributeConfigSchemas[type];
553
553
  if (!schema) {
554
- throw new Error(`Unsupported attribute type: ${type}`);
554
+ throw new chunkV26R64A4_js.ValidationError(`Unsupported attribute type: ${type}`, []);
555
555
  }
556
556
  return schema;
557
557
  }
@@ -575,7 +575,7 @@ function getAttributeConfigWriteSchema(type) {
575
575
  }
576
576
  }
577
577
  function validationErrorFromIssues(issues) {
578
- return chunkL4KLYMUI_js.ValidationError.fromZodErrors(
578
+ return chunkV26R64A4_js.ValidationError.fromZodErrors(
579
579
  issues.map((issue) => ({
580
580
  path: issue.path.map((segment) => typeof segment === "symbol" ? String(segment) : segment),
581
581
  message: issue.message
@@ -598,7 +598,7 @@ function validatePatchedIcon(patch) {
598
598
  }
599
599
  const result = iconNameSchema.optional().safeParse(patch.icon);
600
600
  if (!result.success) {
601
- throw chunkL4KLYMUI_js.ValidationError.fromZodErrors(
601
+ throw chunkV26R64A4_js.ValidationError.fromZodErrors(
602
602
  result.error.issues.map((issue) => ({
603
603
  path: [
604
604
  "icon",
@@ -645,6 +645,7 @@ exports.SCHEMA_LIMITS = SCHEMA_LIMITS;
645
645
  exports.attributeConfigSchemas = attributeConfigSchemas;
646
646
  exports.colorIdSchema = colorIdSchema;
647
647
  exports.getAttributeConfigSchema = getAttributeConfigSchema;
648
+ exports.getAttributeConfigWriteSchema = getAttributeConfigWriteSchema;
648
649
  exports.iconNameSchema = iconNameSchema;
649
650
  exports.multiselectOptionWriteSchema = multiselectOptionWriteSchema;
650
651
  exports.parseAttributeConfig = parseAttributeConfig;
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunkEEH4XQ7W_js = require('./chunk-EEH4XQ7W.js');
3
4
  var chunkEW5XR2X3_js = require('./chunk-EW5XR2X3.js');
4
5
  var chunkQWKLQRBX_js = require('./chunk-QWKLQRBX.js');
5
6
  var chunkKNGWHQLR_js = require('./chunk-KNGWHQLR.js');
@@ -9,11 +10,10 @@ var chunk5WATIVCA_js = require('./chunk-5WATIVCA.js');
9
10
  var chunkSI34M4IC_js = require('./chunk-SI34M4IC.js');
10
11
  var chunkYIP5FJ5H_js = require('./chunk-YIP5FJ5H.js');
11
12
  var chunkZPFOKBIN_js = require('./chunk-ZPFOKBIN.js');
12
- var chunkL4KLYMUI_js = require('./chunk-L4KLYMUI.js');
13
+ var chunkV26R64A4_js = require('./chunk-V26R64A4.js');
13
14
  var chunkACKMC6FL_js = require('./chunk-ACKMC6FL.js');
14
15
  var chunkE6JUYGJX_js = require('./chunk-E6JUYGJX.js');
15
16
  var chunkQ4SZAMJT_js = require('./chunk-Q4SZAMJT.js');
16
- var chunkEEH4XQ7W_js = require('./chunk-EEH4XQ7W.js');
17
17
  var chunkYKWSHBT5_js = require('./chunk-YKWSHBT5.js');
18
18
  var zod = require('zod');
19
19
 
@@ -162,7 +162,7 @@ function validateObjectOrThrow(objectDef, data) {
162
162
  if (!result.success) {
163
163
  const errors = result.errors ?? [];
164
164
  const detail = errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n") || "Unknown validation error";
165
- throw new chunkL4KLYMUI_js.ValidationError(
165
+ throw new chunkV26R64A4_js.ValidationError(
166
166
  `Validation failed for ${objectDef.label}:
167
167
  ${detail}`,
168
168
  errors.map((err) => ({ path: err.path, message: err.message }))
@@ -189,7 +189,7 @@ function validateDraftOrThrow(objectDef, data) {
189
189
  if (!result.success) {
190
190
  const errors = result.errors ?? [];
191
191
  const detail = errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n") || "Unknown validation error";
192
- throw new chunkL4KLYMUI_js.ValidationError(
192
+ throw new chunkV26R64A4_js.ValidationError(
193
193
  `Draft validation failed for ${objectDef.label}:
194
194
  ${detail}`,
195
195
  errors.map((err) => ({ path: err.path, message: err.message }))
@@ -201,7 +201,7 @@ function rejectUnknownAttributesOrThrow(objectDef, data) {
201
201
  const knownNames = new Set(objectDef.attributes.map((a) => a.name));
202
202
  const unknownKeys = Object.keys(data).filter((key) => !knownNames.has(key));
203
203
  if (unknownKeys.length > 0) {
204
- throw new chunkL4KLYMUI_js.ValidationError(
204
+ throw new chunkV26R64A4_js.ValidationError(
205
205
  `Unknown attribute${unknownKeys.length > 1 ? "s" : ""} for ${objectDef.label}: ${unknownKeys.join(", ")}`,
206
206
  unknownKeys.map((key) => ({ path: [key], message: "Unknown attribute" }))
207
207
  );
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkL4KLYMUI_js = require('./chunk-L4KLYMUI.js');
3
+ var chunkV26R64A4_js = require('./chunk-V26R64A4.js');
4
4
 
5
5
  // src/utils/canonical-json.ts
6
6
  function canonicalStringify(value) {
@@ -17,10 +17,10 @@ function canonicalStringify(value) {
17
17
  case "object":
18
18
  break;
19
19
  default:
20
- throw new chunkL4KLYMUI_js.ValidationError(`Cannot canonicalize value of type ${typeof v}`, []);
20
+ throw new chunkV26R64A4_js.ValidationError(`Cannot canonicalize value of type ${typeof v}`, []);
21
21
  }
22
22
  const obj = v;
23
- if (seen.has(obj)) throw new chunkL4KLYMUI_js.ValidationError("Cannot canonicalize circular structure", []);
23
+ if (seen.has(obj)) throw new chunkV26R64A4_js.ValidationError("Cannot canonicalize circular structure", []);
24
24
  seen.add(obj);
25
25
  try {
26
26
  if (Array.isArray(obj)) return `[${obj.map((e) => encode(e) ?? "null").join(",")}]`;
@@ -1,3 +1,4 @@
1
+ import { createRelationValidator } from './chunk-GO6LQADH.mjs';
1
2
  import { createRichtextValidator } from './chunk-QVLQPW3O.mjs';
2
3
  import { createMultiselectValidator, createSelectValidator, createStatusValidator } from './chunk-ZDQ5AP26.mjs';
3
4
  import { createUserValidator } from './chunk-LV3FEUKU.mjs';
@@ -7,11 +8,10 @@ import { createCheckboxValidator } from './chunk-OSSGN43B.mjs';
7
8
  import { createDateValidator } from './chunk-Q44QKLN4.mjs';
8
9
  import { createNumberValidator } from './chunk-UANQJ2GH.mjs';
9
10
  import { createTextValidator } from './chunk-O73ROMWQ.mjs';
10
- import { ValidationError } from './chunk-HOVUEYEQ.mjs';
11
+ import { ValidationError } from './chunk-RUO25ERR.mjs';
11
12
  import { createCurrencyValidator } from './chunk-AYVHMVKQ.mjs';
12
13
  import { createLocationValidator } from './chunk-YUFTHPOE.mjs';
13
14
  import { createPhoneValidator } from './chunk-R5LAJCBU.mjs';
14
- import { createRelationValidator } from './chunk-GO6LQADH.mjs';
15
15
  import { DEFAULT_VALIDATION_MESSAGES, formatZodErrors } from './chunk-HRQEZUAA.mjs';
16
16
  import { z } from 'zod';
17
17
 
@@ -1,4 +1,4 @@
1
- import { ValidationError } from './chunk-HOVUEYEQ.mjs';
1
+ import { ValidationError } from './chunk-RUO25ERR.mjs';
2
2
 
3
3
  // src/utils/canonical-json.ts
4
4
  function canonicalStringify(value) {
@@ -203,6 +203,8 @@ var NotFoundError = class extends SchemaError {
203
203
  resourceType,
204
204
  resourceId
205
205
  });
206
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
207
+ this._tag = "NotFoundError";
206
208
  this.name = "NotFoundError";
207
209
  this.resourceType = resourceType;
208
210
  this.resourceId = resourceId;
@@ -235,6 +237,8 @@ var SchemaPlanNotFoundError = class extends NotFoundError {
235
237
  var ValidationError = class _ValidationError extends SchemaError {
236
238
  constructor(message, errors) {
237
239
  super(message, SchemaErrorCode.VALIDATION_FAILED, { errors });
240
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
241
+ this._tag = "ValidationError";
238
242
  this.name = "ValidationError";
239
243
  this.errors = errors;
240
244
  }
@@ -205,6 +205,8 @@ var NotFoundError = class extends SchemaError {
205
205
  resourceType,
206
206
  resourceId
207
207
  });
208
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
209
+ this._tag = "NotFoundError";
208
210
  this.name = "NotFoundError";
209
211
  this.resourceType = resourceType;
210
212
  this.resourceId = resourceId;
@@ -237,6 +239,8 @@ var SchemaPlanNotFoundError = class extends NotFoundError {
237
239
  var ValidationError = class _ValidationError extends SchemaError {
238
240
  constructor(message, errors) {
239
241
  super(message, SchemaErrorCode.VALIDATION_FAILED, { errors });
242
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
243
+ this._tag = "ValidationError";
240
244
  this.name = "ValidationError";
241
245
  this.errors = errors;
242
246
  }
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkDIMTNM3F_js = require('./chunk-DIMTNM3F.js');
4
- var chunkL4KLYMUI_js = require('./chunk-L4KLYMUI.js');
3
+ var chunkBOICAZHR_js = require('./chunk-BOICAZHR.js');
4
+ var chunkV26R64A4_js = require('./chunk-V26R64A4.js');
5
5
  var zod = require('zod');
6
6
 
7
7
  // src/types/system-attributes.ts
@@ -500,7 +500,7 @@ function canonicalizeFilterValue(rule, effectiveType) {
500
500
  const message = `Filter on a currency attribute expected a numeric amount, received ${JSON.stringify(
501
501
  value
502
502
  )}`;
503
- throw new chunkL4KLYMUI_js.ValidationError(message, [{ path: ["value"], message }]);
503
+ throw new chunkV26R64A4_js.ValidationError(message, [{ path: ["value"], message }]);
504
504
  }
505
505
  function hasCurrencyAmount(value) {
506
506
  if (typeof value !== "object") return true;
@@ -661,13 +661,13 @@ function resolveCanonicalOperator(rawOperator, effectiveType) {
661
661
  const replacement = REMOVED_OPERATOR_REPLACEMENTS[rawOperator];
662
662
  if (replacement) {
663
663
  const m = `Unknown filter operator "${rawOperator}" \u2014 use ${replacement}`;
664
- throw new chunkL4KLYMUI_js.ValidationError(m, [{ path: ["operator"], message: m }]);
664
+ throw new chunkV26R64A4_js.ValidationError(m, [{ path: ["operator"], message: m }]);
665
665
  }
666
666
  const normalized = normalizeOperator(rawOperator);
667
667
  const membership = SUBSTRING_TO_MEMBERSHIP[normalized];
668
668
  if (membership && SET_MEMBERSHIP_TYPES.has(effectiveType)) {
669
669
  const m = `Operator "${normalized}" is not valid for type "${effectiveType}" \u2014 use "${membership}"`;
670
- throw new chunkL4KLYMUI_js.ValidationError(m, [{ path: ["operator"], message: m }]);
670
+ throw new chunkV26R64A4_js.ValidationError(m, [{ path: ["operator"], message: m }]);
671
671
  }
672
672
  return normalized;
673
673
  }
@@ -677,7 +677,7 @@ function assertOperatorForType(operator, type, context) {
677
677
  if (!ops?.includes(normalized)) {
678
678
  const validList = ops?.length ? ops.join(", ") : "(no operators registered for this type)";
679
679
  const summary = `Operator "${operator}" is not valid for ${context} type "${type}". Valid operators: ${validList}.`;
680
- throw new chunkL4KLYMUI_js.ValidationError(summary, [
680
+ throw new chunkV26R64A4_js.ValidationError(summary, [
681
681
  {
682
682
  path: ["operator"],
683
683
  message: summary
@@ -690,7 +690,7 @@ function assertRelativeDateValue(rule) {
690
690
  if (rule.operator !== "is_within") return;
691
691
  if (!isRelativeDateValue(rule.value)) {
692
692
  const m = `Operator "is_within" requires a relative-date value { amount: positive number, unit: days|weeks|months|years, direction: past|future }`;
693
- throw new chunkL4KLYMUI_js.ValidationError(m, [{ path: ["value"], message: m }]);
693
+ throw new chunkV26R64A4_js.ValidationError(m, [{ path: ["value"], message: m }]);
694
694
  }
695
695
  }
696
696
  function applyCanonicalForm(rule, operator, effectiveType) {
@@ -703,11 +703,11 @@ function assertDynamicValueForAttribute(rule, attrType) {
703
703
  const v = rule.value;
704
704
  if (v.dynamic === "actor" && attrType !== "user") {
705
705
  const m = `actor token (@me) is only valid on user attributes, not "${attrType}"`;
706
- throw new chunkL4KLYMUI_js.ValidationError(m, [{ path: ["value"], message: m }]);
706
+ throw new chunkV26R64A4_js.ValidationError(m, [{ path: ["value"], message: m }]);
707
707
  }
708
708
  if (v.dynamic === "date" && attrType !== "date") {
709
709
  const m = `date token (@today/@now) is only valid on date attributes, not "${attrType}"`;
710
- throw new chunkL4KLYMUI_js.ValidationError(m, [{ path: ["value"], message: m }]);
710
+ throw new chunkV26R64A4_js.ValidationError(m, [{ path: ["value"], message: m }]);
711
711
  }
712
712
  }
713
713
  function collectQualifiedRuleIssues(rule, context) {
@@ -715,7 +715,7 @@ function collectQualifiedRuleIssues(rule, context) {
715
715
  validateQualifiedRule({ ...rule }, context);
716
716
  return [];
717
717
  } catch (error) {
718
- if (!(error instanceof chunkL4KLYMUI_js.ValidationError)) throw error;
718
+ if (!(error instanceof chunkV26R64A4_js.ValidationError)) throw error;
719
719
  return error.errors.map((issue) => ({ ...issue, path: [...issue.path] }));
720
720
  }
721
721
  }
@@ -723,17 +723,17 @@ function validateQualifiedRule(rule, context) {
723
723
  const rootAttr = context.attributes.find((a) => a.name === rule.attribute);
724
724
  const systemOps = SYSTEM_FILTER_OPERATORS[rule.attribute];
725
725
  if (!(rootAttr || systemOps)) {
726
- throw new chunkL4KLYMUI_js.ValidationError(`Unknown attribute: ${rule.attribute}`, [
726
+ throw new chunkV26R64A4_js.ValidationError(`Unknown attribute: ${rule.attribute}`, [
727
727
  { path: ["attribute"], message: `Unknown attribute: ${rule.attribute}` }
728
728
  ]);
729
729
  }
730
730
  if (rule.quantifier !== void 0 && !rule.property) {
731
731
  const m = `quantifier is only valid on qualified edge rules (set "property")`;
732
- throw new chunkL4KLYMUI_js.ValidationError(m, [{ path: ["quantifier"], message: m }]);
732
+ throw new chunkV26R64A4_js.ValidationError(m, [{ path: ["quantifier"], message: m }]);
733
733
  }
734
734
  if (!rootAttr) {
735
735
  if (rule.property) {
736
- throw new chunkL4KLYMUI_js.ValidationError(`Cannot qualify system attribute "${rule.attribute}"`, [
736
+ throw new chunkV26R64A4_js.ValidationError(`Cannot qualify system attribute "${rule.attribute}"`, [
737
737
  { path: ["property"], message: `"${rule.attribute}" is a system column, not a reference` }
738
738
  ]);
739
739
  }
@@ -741,7 +741,7 @@ function validateQualifiedRule(rule, context) {
741
741
  const normalizedOperator2 = resolveCanonicalOperator(rule.operator, effectiveType);
742
742
  if (!systemOps.includes(normalizedOperator2)) {
743
743
  const summary = `Operator "${rule.operator}" is not valid for system attribute "${rule.attribute}". Valid operators: ${systemOps.join(", ")}.`;
744
- throw new chunkL4KLYMUI_js.ValidationError(summary, [{ path: ["operator"], message: summary }]);
744
+ throw new chunkV26R64A4_js.ValidationError(summary, [{ path: ["operator"], message: summary }]);
745
745
  }
746
746
  applyCanonicalForm(rule, normalizedOperator2, effectiveType);
747
747
  return;
@@ -753,25 +753,25 @@ function validateQualifiedRule(rule, context) {
753
753
  if (!ops.includes(normalizedOperator2)) {
754
754
  const validList = ops.length ? ops.join(", ") : "(not filterable)";
755
755
  const summary = `Operator "${rule.operator}" is not valid for attribute "${rootAttr.name}". Valid operators: ${validList}.`;
756
- throw new chunkL4KLYMUI_js.ValidationError(summary, [{ path: ["operator"], message: summary }]);
756
+ throw new chunkV26R64A4_js.ValidationError(summary, [{ path: ["operator"], message: summary }]);
757
757
  }
758
758
  applyCanonicalForm(rule, normalizedOperator2, resolveEffectiveFilterType(rootAttr));
759
759
  return;
760
760
  }
761
761
  if (!REFERENCE_TYPES.has(rootAttr.type)) {
762
- throw new chunkL4KLYMUI_js.ValidationError(`Cannot qualify ${rootAttr.type} attribute "${rule.attribute}"`, [
762
+ throw new chunkV26R64A4_js.ValidationError(`Cannot qualify ${rootAttr.type} attribute "${rule.attribute}"`, [
763
763
  { path: ["property"], message: `Attribute "${rule.attribute}" is not a reference type` }
764
764
  ]);
765
765
  }
766
766
  const propSchema = rootAttr.properties;
767
767
  if (!propSchema) {
768
- throw new chunkL4KLYMUI_js.ValidationError(`Attribute "${rule.attribute}" has no qualifyWith schema`, [
768
+ throw new chunkV26R64A4_js.ValidationError(`Attribute "${rule.attribute}" has no qualifyWith schema`, [
769
769
  { path: ["property"], message: `"${rule.attribute}" has no qualifyWith` }
770
770
  ]);
771
771
  }
772
772
  const propDef = propSchema.definitions.find((p) => p.name === rule.property);
773
773
  if (!propDef) {
774
- throw new chunkL4KLYMUI_js.ValidationError(
774
+ throw new chunkV26R64A4_js.ValidationError(
775
775
  `Property "${rule.property}" not defined on "${rule.attribute}".qualifyWith()`,
776
776
  [{ path: ["property"], message: `Unknown property: ${rule.property}` }]
777
777
  );
@@ -787,7 +787,7 @@ function parseResourceVisibility(value) {
787
787
  if (typeof value === "string" && RESOURCE_VISIBILITIES.includes(value)) {
788
788
  return value;
789
789
  }
790
- throw new chunkL4KLYMUI_js.ValidationError(
790
+ throw new chunkV26R64A4_js.ValidationError(
791
791
  `visibility must be one of: ${RESOURCE_VISIBILITIES.join(", ")} (received: ${String(value)})`,
792
792
  []
793
793
  );
@@ -821,12 +821,12 @@ var RESERVED_OBJECT_NAMES = ["skill"];
821
821
  // src/validators/view-config.schema.ts
822
822
  var createModeSchema = zod.z.enum(["redirect", "inline", "peek"]);
823
823
  var nonEmptyStringArraySchema = zod.z.array(zod.z.string()).min(1);
824
- var columnsSchema = zod.z.array(zod.z.string()).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.columnsPerTab);
824
+ var columnsSchema = zod.z.array(zod.z.string()).max(chunkBOICAZHR_js.SCHEMA_LIMITS.columnsPerTab);
825
825
  var sortRuleSchema = zod.z.object({
826
826
  attribute: zod.z.string(),
827
827
  direction: zod.z.enum(["asc", "desc"])
828
828
  }).strict();
829
- var sortsSchema = zod.z.array(sortRuleSchema).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.sortsPerTab);
829
+ var sortsSchema = zod.z.array(sortRuleSchema).max(chunkBOICAZHR_js.SCHEMA_LIMITS.sortsPerTab);
830
830
  var relativeDateValueSchema = zod.z.object({
831
831
  amount: zod.z.number(),
832
832
  unit: zod.z.enum(["days", "weeks", "months", "years"]),
@@ -900,7 +900,7 @@ var filterRuleSchema = zod.z.object({
900
900
  operator: filterOperatorSchema,
901
901
  value: filterValueSchema
902
902
  }).strict();
903
- var filterRulesSchema = zod.z.array(filterRuleSchema).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.filterRulesPerTab);
903
+ var filterRulesSchema = zod.z.array(filterRuleSchema).max(chunkBOICAZHR_js.SCHEMA_LIMITS.filterRulesPerTab);
904
904
  var filterStateSchema = zod.z.object({
905
905
  combinator: zod.z.enum(["and", "or"]),
906
906
  rules: filterRulesSchema
@@ -961,20 +961,25 @@ var fieldPresentationShape = {
961
961
  label: zod.z.string().optional(),
962
962
  readOnly: zod.z.boolean().optional()
963
963
  };
964
- var fieldSchema = zod.z.object({
965
- /** Stable slot identity. Optional: a builder may omit it, `ensureFieldIds` assigns it. */
966
- id: zod.z.string().optional(),
964
+ var fieldShape = {
967
965
  attribute: zod.z.string().optional(),
968
966
  attributeGroup: attributeGroupFieldSchema.optional(),
969
967
  ...fieldPresentationShape
970
- }).strict().superRefine((field, ctx) => {
968
+ };
969
+ function refineField(field, ctx) {
971
970
  if (field.attribute === void 0 === (field.attributeGroup === void 0)) {
972
971
  ctx.addIssue({
973
972
  code: "custom",
974
973
  message: "A field must define exactly one of attribute or attributeGroup"
975
974
  });
976
975
  }
977
- });
976
+ }
977
+ var fieldSchema = zod.z.object({
978
+ /** Stable slot identity. Optional: a builder may omit it, `ensureFieldIds` assigns it. */
979
+ id: zod.z.string().optional(),
980
+ ...fieldShape
981
+ }).strict().superRefine(refineField);
982
+ var fieldSlotSchema = zod.z.object({ id: zod.z.string().min(1), ...fieldShape }).strict().superRefine(refineField);
978
983
  var baseGroupShape = {
979
984
  id: zod.z.string(),
980
985
  label: zod.z.string(),
@@ -986,35 +991,38 @@ var baseGroupShape = {
986
991
  var fieldGroupWriteSchema = zod.z.object({
987
992
  ...baseGroupShape,
988
993
  type: zod.z.literal("fields"),
989
- fields: zod.z.array(fieldSchema).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.fieldsPerGroup)
994
+ fields: zod.z.array(fieldSchema).max(chunkBOICAZHR_js.SCHEMA_LIMITS.fieldsPerGroup)
990
995
  }).strict();
991
996
  var groupWriteSchema = fieldGroupWriteSchema;
992
997
  var baseTabShape = {
993
998
  id: zod.z.string(),
994
999
  name: zod.z.string(),
995
1000
  label: zod.z.string(),
996
- icon: chunkDIMTNM3F_js.iconNameSchema.optional(),
1001
+ icon: chunkBOICAZHR_js.iconNameSchema.optional(),
997
1002
  order: zod.z.number().optional()
998
1003
  };
999
- var formTabWriteSchema = zod.z.object({
1004
+ var formTabGroupsSchema = zod.z.array(groupWriteSchema).max(chunkBOICAZHR_js.SCHEMA_LIMITS.groupsPerFormTab);
1005
+ var formTabShape = {
1000
1006
  ...baseTabShape,
1001
1007
  type: zod.z.literal("form"),
1002
- groups: zod.z.array(groupWriteSchema).min(1).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.groupsPerFormTab),
1008
+ groups: formTabGroupsSchema,
1003
1009
  formColumns: zod.z.union([zod.z.literal(1), zod.z.literal(2), zod.z.literal(3)]).optional(),
1004
1010
  density: zod.z.enum(["compact", "comfortable", "spacious"]).optional()
1005
- }).strict().superRefine((tab, ctx) => {
1011
+ };
1012
+ var formTabDraftObjectSchema = zod.z.object(formTabShape).strict();
1013
+ function refineFormTab(tab, ctx) {
1006
1014
  addDuplicateIdIssues(tab.groups, ctx, ["groups"]);
1007
1015
  const totalFields = tab.groups.reduce(
1008
1016
  (count, group) => count + (group.type === "fields" ? group.fields.length : 0),
1009
1017
  0
1010
1018
  );
1011
- if (totalFields > chunkDIMTNM3F_js.SCHEMA_LIMITS.fieldsPerFormTab) {
1019
+ if (totalFields > chunkBOICAZHR_js.SCHEMA_LIMITS.fieldsPerFormTab) {
1012
1020
  ctx.addIssue({
1013
1021
  code: "too_big",
1014
1022
  origin: "array",
1015
- maximum: chunkDIMTNM3F_js.SCHEMA_LIMITS.fieldsPerFormTab,
1023
+ maximum: chunkBOICAZHR_js.SCHEMA_LIMITS.fieldsPerFormTab,
1016
1024
  inclusive: true,
1017
- message: `A form tab can contain at most ${chunkDIMTNM3F_js.SCHEMA_LIMITS.fieldsPerFormTab} fields`,
1025
+ message: `A form tab can contain at most ${chunkBOICAZHR_js.SCHEMA_LIMITS.fieldsPerFormTab} fields`,
1018
1026
  path: ["groups"]
1019
1027
  });
1020
1028
  }
@@ -1034,7 +1042,9 @@ var formTabWriteSchema = zod.z.object({
1034
1042
  seenAttributeGroupIds.add(id);
1035
1043
  });
1036
1044
  });
1037
- });
1045
+ }
1046
+ var formTabWriteSchema = zod.z.object({ ...formTabShape, groups: formTabGroupsSchema.min(1) }).strict().superRefine(refineFormTab);
1047
+ var formTabDraftSchema = formTabDraftObjectSchema.superRefine(refineFormTab);
1038
1048
  var relationSourceSchema = zod.z.object({
1039
1049
  type: zod.z.literal("relation"),
1040
1050
  attribute: zod.z.string()
@@ -1216,15 +1226,14 @@ var formsTabSchema = zod.z.object({
1216
1226
  var emailsTabSchema = zod.z.object({
1217
1227
  ...baseTabShape,
1218
1228
  type: zod.z.literal("emails"),
1219
- emailAttributeIds: zod.z.array(zod.z.string()).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.emailAttributesPerTab)
1229
+ emailAttributeIds: zod.z.array(zod.z.string()).max(chunkBOICAZHR_js.SCHEMA_LIMITS.emailAttributesPerTab)
1220
1230
  }).strict();
1221
1231
  var meetingsTabSchema = zod.z.object({
1222
1232
  ...baseTabShape,
1223
1233
  type: zod.z.literal("meetings"),
1224
- emailAttributeIds: zod.z.array(zod.z.string()).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.emailAttributesPerTab)
1234
+ emailAttributeIds: zod.z.array(zod.z.string()).max(chunkBOICAZHR_js.SCHEMA_LIMITS.emailAttributesPerTab)
1225
1235
  }).strict();
1226
- var detailTabSchema = zod.z.discriminatedUnion("type", [
1227
- formTabWriteSchema,
1236
+ var nonFormDetailTabSchemas = [
1228
1237
  tableTabSchema,
1229
1238
  customTabSchema,
1230
1239
  activityTabSchema,
@@ -1233,11 +1242,19 @@ var detailTabSchema = zod.z.discriminatedUnion("type", [
1233
1242
  formsTabSchema,
1234
1243
  emailsTabSchema,
1235
1244
  meetingsTabSchema
1245
+ ];
1246
+ var detailTabSchema = zod.z.discriminatedUnion("type", [
1247
+ formTabWriteSchema,
1248
+ ...nonFormDetailTabSchemas
1249
+ ]);
1250
+ var detailTabDraftSchema = zod.z.discriminatedUnion("type", [
1251
+ formTabDraftSchema,
1252
+ ...nonFormDetailTabSchemas
1236
1253
  ]);
1237
1254
  var listTabCommonShape = {
1238
1255
  id: zod.z.string(),
1239
1256
  label: zod.z.string(),
1240
- icon: chunkDIMTNM3F_js.iconNameSchema.optional(),
1257
+ icon: chunkBOICAZHR_js.iconNameSchema.optional(),
1241
1258
  default: zod.z.boolean().optional(),
1242
1259
  // Which records the tab scopes to. `"all"` is the default and means "impose
1243
1260
  // no scope" — the mandatory viewer predicate alone decides, so the tab shows
@@ -1271,7 +1288,7 @@ var listViewTabSchema = zod.z.discriminatedUnion("layout", [
1271
1288
  ]);
1272
1289
  var _listViewConfigSchema = zod.z.object({
1273
1290
  defaultFilters: filterGroupSchema.optional(),
1274
- tabs: zod.z.array(listViewTabSchema).min(1).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.tabsPerView)
1291
+ tabs: zod.z.array(listViewTabSchema).min(1).max(chunkBOICAZHR_js.SCHEMA_LIMITS.tabsPerView)
1275
1292
  }).strict().superRefine((config, ctx) => {
1276
1293
  addDuplicateIdIssues(config.tabs, ctx, ["tabs"]);
1277
1294
  let hasDefault = false;
@@ -1292,7 +1309,7 @@ var sidePanelPaneSchema = zod.z.discriminatedUnion("kind", [
1292
1309
  kind: zod.z.literal("fields"),
1293
1310
  id: zod.z.string().optional(),
1294
1311
  label: zod.z.string().optional(),
1295
- attributes: zod.z.array(zod.z.string()).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.sidePanelAttributes)
1312
+ attributes: zod.z.array(zod.z.string()).max(chunkBOICAZHR_js.SCHEMA_LIMITS.sidePanelAttributes)
1296
1313
  }).strict(),
1297
1314
  zod.z.object({
1298
1315
  kind: zod.z.literal("activity"),
@@ -1311,10 +1328,10 @@ var sidePanelPaneSchema = zod.z.discriminatedUnion("kind", [
1311
1328
  }).strict()
1312
1329
  ]);
1313
1330
  var _detailViewConfigSchema = zod.z.object({
1314
- tabs: zod.z.array(detailTabSchema).min(1).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.tabsPerView),
1331
+ tabs: zod.z.array(detailTabSchema).min(1).max(chunkBOICAZHR_js.SCHEMA_LIMITS.tabsPerView),
1315
1332
  sidePanel: zod.z.object({
1316
- attributes: zod.z.array(zod.z.string()).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.sidePanelAttributes).optional(),
1317
- panes: zod.z.array(sidePanelPaneSchema).max(chunkDIMTNM3F_js.SCHEMA_LIMITS.sidePanelPanes).optional(),
1333
+ attributes: zod.z.array(zod.z.string()).max(chunkBOICAZHR_js.SCHEMA_LIMITS.sidePanelAttributes).optional(),
1334
+ panes: zod.z.array(sidePanelPaneSchema).max(chunkBOICAZHR_js.SCHEMA_LIMITS.sidePanelPanes).optional(),
1318
1335
  width: zod.z.number().optional()
1319
1336
  }).strict().refine((sidePanel) => sidePanel.attributes !== void 0 || sidePanel.panes !== void 0, {
1320
1337
  message: "sidePanel requires attributes or panes"
@@ -1350,8 +1367,19 @@ function parseViewConfig(type, input) {
1350
1367
  return viewConfigByTypeSchema.parse({ type, config: input }).config;
1351
1368
  }
1352
1369
  }
1370
+ var LIST_TAB_TABLE_KEYS = ["columnSizing"];
1371
+ var LIST_TAB_KANBAN_KEYS = [
1372
+ "groupByAttribute",
1373
+ "cardUserAttribute",
1374
+ "cardDateAttribute",
1375
+ "kanbanColumnOrder",
1376
+ "kanbanColumnVisibility",
1377
+ "kanbanPinnedColumns"
1378
+ ];
1353
1379
 
1354
1380
  exports.ATTRIBUTE_FILTER_OPERATORS = ATTRIBUTE_FILTER_OPERATORS;
1381
+ exports.LIST_TAB_KANBAN_KEYS = LIST_TAB_KANBAN_KEYS;
1382
+ exports.LIST_TAB_TABLE_KEYS = LIST_TAB_TABLE_KEYS;
1355
1383
  exports.LIST_VIEW_TAB_VISIBILITIES = LIST_VIEW_TAB_VISIBILITIES;
1356
1384
  exports.NO_VALUE_OPERATORS = NO_VALUE_OPERATORS;
1357
1385
  exports.OPERATORS_BY_TYPE = OPERATORS_BY_TYPE;
@@ -1366,17 +1394,25 @@ exports.SYSTEM_FIELD_NAMES = SYSTEM_FIELD_NAMES;
1366
1394
  exports.SYSTEM_FILTER_ATTRIBUTE_TYPES = SYSTEM_FILTER_ATTRIBUTE_TYPES;
1367
1395
  exports.canonicalizeFilterValue = canonicalizeFilterValue;
1368
1396
  exports.collectQualifiedRuleIssues = collectQualifiedRuleIssues;
1397
+ exports.columnsSchema = columnsSchema;
1369
1398
  exports.currentActor = currentActor;
1399
+ exports.detailTabDraftSchema = detailTabDraftSchema;
1370
1400
  exports.detailTabSchema = detailTabSchema;
1371
1401
  exports.detailViewConfigSchema = detailViewConfigSchema;
1372
1402
  exports.extractCurrencyFilterValue = extractCurrencyFilterValue;
1373
1403
  exports.extractFilterValue = extractFilterValue;
1404
+ exports.fieldSchema = fieldSchema;
1405
+ exports.fieldShape = fieldShape;
1406
+ exports.fieldSlotSchema = fieldSlotSchema;
1407
+ exports.filterGroupSchema = filterGroupSchema;
1408
+ exports.filterStateSchema = filterStateSchema;
1374
1409
  exports.getAttributeCapabilities = getAttributeCapabilities;
1375
1410
  exports.getAttributeFilterOperators = getAttributeFilterOperators;
1376
1411
  exports.getOperatorPolarity = getOperatorPolarity;
1377
1412
  exports.getRollupFilterOperators = getRollupFilterOperators2;
1378
1413
  exports.getSystemAttributeI18nKey = getSystemAttributeI18nKey;
1379
1414
  exports.getSystemAttributeList = getSystemAttributeList;
1415
+ exports.groupWriteSchema = groupWriteSchema;
1380
1416
  exports.inverseSourceSchema = inverseSourceSchema;
1381
1417
  exports.isAttributeFilterable = isAttributeFilterable;
1382
1418
  exports.isAttributeGroupable = isAttributeGroupable;
@@ -1400,6 +1436,7 @@ exports.relationSourceSchema = relationSourceSchema;
1400
1436
  exports.resolveEffectiveFilterType = resolveEffectiveFilterType;
1401
1437
  exports.resolveIsWithinBounds = resolveIsWithinBounds;
1402
1438
  exports.resolveUtcDayBounds = resolveUtcDayBounds;
1439
+ exports.sortsSchema = sortsSchema;
1403
1440
  exports.tableSourceSchema = tableSourceSchema;
1404
1441
  exports.toMultiValueOperator = toMultiValueOperator;
1405
1442
  exports.toUtcDayString = toUtcDayString;
@@ -1,5 +1,5 @@
1
- import { S as SchemaOperation } from './migrations-C-GN1xx_.mjs';
2
- import './attributes-DoiGyNFk.mjs';
1
+ import { S as SchemaOperation } from './migrations-fRvadl6i.mjs';
2
+ import './attributes-CWPLbp7c.mjs';
3
3
  import '@stndrds/constants';
4
4
  import './utils.mjs';
5
5
 
@@ -151,6 +151,8 @@ declare class SchemaError extends Error {
151
151
  * Base class for "not found" errors
152
152
  */
153
153
  declare class NotFoundError extends SchemaError {
154
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
155
+ readonly _tag = "NotFoundError";
154
156
  readonly resourceType: string;
155
157
  readonly resourceId: string;
156
158
  constructor(resourceType: string, resourceId: string, code?: SchemaErrorCode, message?: string);
@@ -193,6 +195,8 @@ interface ValidationErrorDetail {
193
195
  * Validation error thrown when data fails schema validation
194
196
  */
195
197
  declare class ValidationError extends SchemaError {
198
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
199
+ readonly _tag = "ValidationError";
196
200
  readonly errors: ValidationErrorDetail[];
197
201
  constructor(message: string, errors: ValidationErrorDetail[]);
198
202
  /**
@@ -1,5 +1,5 @@
1
- import { S as SchemaOperation } from './migrations-BGWgXHXb.js';
2
- import './attributes-CU871AfG.js';
1
+ import { S as SchemaOperation } from './migrations-DaFneOfx.js';
2
+ import './attributes-CNYwg_Nr.js';
3
3
  import '@stndrds/constants';
4
4
  import './utils.js';
5
5
 
@@ -151,6 +151,8 @@ declare class SchemaError extends Error {
151
151
  * Base class for "not found" errors
152
152
  */
153
153
  declare class NotFoundError extends SchemaError {
154
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
155
+ readonly _tag = "NotFoundError";
154
156
  readonly resourceType: string;
155
157
  readonly resourceId: string;
156
158
  constructor(resourceType: string, resourceId: string, code?: SchemaErrorCode, message?: string);
@@ -193,6 +195,8 @@ interface ValidationErrorDetail {
193
195
  * Validation error thrown when data fails schema validation
194
196
  */
195
197
  declare class ValidationError extends SchemaError {
198
+ /** Literal discriminator for `Effect.catchTag`; a widened `string` breaks narrowing. */
199
+ readonly _tag = "ValidationError";
196
200
  readonly errors: ValidationErrorDetail[];
197
201
  constructor(message: string, errors: ValidationErrorDetail[]);
198
202
  /**