@stndrds/schema 1.0.0-alpha.344 → 1.0.0-alpha.346

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 (69) hide show
  1. package/dist/{all-BjBPrd9V.d.ts → all-72y_keWh.d.mts} +11 -16
  2. package/dist/{all-BrEKv8xR.d.mts → all-DCBPCw9F.d.ts} +11 -16
  3. package/dist/{checkbox-D8nK0oIO.d.ts → checkbox-CMNq2fkL.d.ts} +2 -2
  4. package/dist/{checkbox-DSzn5epa.d.mts → checkbox-CpPTW4Qn.d.mts} +2 -2
  5. package/dist/{config-6uO9OYWQ.mjs → config-BiQGgy7f.mjs} +1 -1
  6. package/dist/{config-DIBMi8S_.js → config-WUWITOeW.js} +1 -1
  7. package/dist/{date-CteDw_88.d.mts → date-B8W-uBOd.d.mts} +2 -2
  8. package/dist/{date-BGULTVlX.d.ts → date-Bn1QYgWY.d.ts} +2 -2
  9. package/dist/{exceptions-BCfkN2ct.d.mts → exceptions-B3WE8Upv.d.mts} +9 -0
  10. package/dist/{exceptions-BCfkN2ct.d.ts → exceptions-B3WE8Upv.d.ts} +9 -0
  11. package/dist/exceptions.d.mts +1 -1
  12. package/dist/exceptions.d.ts +1 -1
  13. package/dist/{index-_gdqRN1W.d.mts → index-BKMp1wdz.d.mts} +1 -1
  14. package/dist/{index-CLEwI8GE.d.ts → index-CL87KvMy.d.ts} +2 -2
  15. package/dist/{index-DyeLYnEc.d.ts → index-D4Fo465g.d.ts} +1 -1
  16. package/dist/{index-BKv7a08I.d.ts → index-Dh21B6e4.d.ts} +1 -1
  17. package/dist/{index-Ds0DxPHk.d.mts → index-Dib0TdMy.d.mts} +2 -2
  18. package/dist/{index-DzEWbzP-.d.mts → index-nzT7sEBR.d.mts} +1 -1
  19. package/dist/index.d.mts +446 -16
  20. package/dist/index.d.ts +446 -16
  21. package/dist/index.js +9 -9
  22. package/dist/index.mjs +9 -9
  23. package/dist/{number-U7UMAXKt.d.mts → number-B52ufFXh.d.mts} +2 -2
  24. package/dist/{number-BcMYyg8j.d.ts → number-DwKAGHUq.d.ts} +2 -2
  25. package/dist/{text-CjhjkBXJ.d.mts → text-CjNrbnmS.d.mts} +2 -2
  26. package/dist/{text-C4EAE9Ap.d.ts → text-LRdjjxmn.d.ts} +2 -2
  27. package/dist/utils.d.mts +1 -1
  28. package/dist/utils.d.ts +1 -1
  29. package/dist/validation/all.d.mts +4 -4
  30. package/dist/validation/all.d.ts +4 -4
  31. package/dist/validation/all.js +1 -1
  32. package/dist/validation/all.mjs +1 -1
  33. package/dist/validation/complex/currency.d.mts +2 -2
  34. package/dist/validation/complex/currency.d.ts +2 -2
  35. package/dist/validation/complex/location.d.mts +2 -2
  36. package/dist/validation/complex/location.d.ts +2 -2
  37. package/dist/validation/complex/phone.d.mts +2 -2
  38. package/dist/validation/complex/phone.d.ts +2 -2
  39. package/dist/validation/complex/relation.d.mts +2 -2
  40. package/dist/validation/complex/relation.d.ts +2 -2
  41. package/dist/validation/complex/richtext.d.mts +2 -2
  42. package/dist/validation/complex/richtext.d.ts +2 -2
  43. package/dist/validation/complex/select.d.mts +2 -2
  44. package/dist/validation/complex/select.d.ts +2 -2
  45. package/dist/validation/complex/user.d.mts +2 -2
  46. package/dist/validation/complex/user.d.ts +2 -2
  47. package/dist/validation/computed/formula.d.mts +2 -2
  48. package/dist/validation/computed/formula.d.ts +2 -2
  49. package/dist/validation/computed/rollup.d.mts +2 -2
  50. package/dist/validation/computed/rollup.d.ts +2 -2
  51. package/dist/validation/config/index.d.mts +1 -1
  52. package/dist/validation/config/index.d.ts +1 -1
  53. package/dist/validation/config/index.js +1 -1
  54. package/dist/validation/config/index.mjs +1 -1
  55. package/dist/validation/core/index.d.mts +1 -1
  56. package/dist/validation/core/index.d.ts +1 -1
  57. package/dist/validation/object/index.d.mts +1 -1
  58. package/dist/validation/object/index.d.ts +1 -1
  59. package/dist/validation/primitives/checkbox.d.mts +1 -1
  60. package/dist/validation/primitives/checkbox.d.ts +1 -1
  61. package/dist/validation/primitives/date.d.mts +1 -1
  62. package/dist/validation/primitives/date.d.ts +1 -1
  63. package/dist/validation/primitives/number.d.mts +1 -1
  64. package/dist/validation/primitives/number.d.ts +1 -1
  65. package/dist/validation/primitives/text.d.mts +1 -1
  66. package/dist/validation/primitives/text.d.ts +1 -1
  67. package/dist/{view-config.schema-D6b67GQM.js → view-config.schema-BDQ3S3IE.js} +1 -1
  68. package/dist/{view-config.schema-CupkOK1m.mjs → view-config.schema-xYyZKn9M.mjs} +1 -1
  69. package/package.json +2 -2
@@ -1,12 +1,12 @@
1
1
 
2
- import { Tt as RollupAttribute, Y as Attribute, Z as AttributeType } from "./exceptions-BCfkN2ct.js";
3
- import { m as ListViewTabVisibility } from "./index-CLEwI8GE.js";
4
- import "./index-BKv7a08I.js";
5
- import "./index-DyeLYnEc.js";
6
- import "./text-C4EAE9Ap.js";
7
- import "./number-BcMYyg8j.js";
8
- import "./checkbox-D8nK0oIO.js";
9
- import "./date-BGULTVlX.js";
2
+ import { Tt as RollupAttribute, Y as Attribute, Z as AttributeType } from "./exceptions-B3WE8Upv.mjs";
3
+ import { m as ListViewTabVisibility } from "./index-Dib0TdMy.mjs";
4
+ import "./index-BKMp1wdz.mjs";
5
+ import "./index-nzT7sEBR.mjs";
6
+ import "./text-CjNrbnmS.mjs";
7
+ import "./number-B52ufFXh.mjs";
8
+ import "./checkbox-CpPTW4Qn.mjs";
9
+ import "./date-B8W-uBOd.mjs";
10
10
  import { z as z$1 } from "zod";
11
11
  import { IconName } from "@stndrds/constants";
12
12
  //#region src/types/filters.d.ts
@@ -695,10 +695,7 @@ declare const publishedViewContentDefinitionSchema: z$1.ZodDiscriminatedUnion<[z
695
695
  aside: "aside";
696
696
  }>;
697
697
  }, z$1.core.$strict>], "type">;
698
- type AsideRule = "enforce" | "tolerate";
699
- declare function draftContentViewDefinitionSchemaFor({ asideRule }?: {
700
- asideRule?: AsideRule;
701
- }): z$1.ZodObject<{
698
+ declare function draftContentViewDefinitionSchemaFor(): z$1.ZodObject<{
702
699
  contents: z$1.ZodArray<z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
703
700
  type: z$1.ZodLiteral<"form">;
704
701
  groups: z$1.ZodArray<z$1.ZodObject<{
@@ -944,9 +941,7 @@ declare function draftContentViewDefinitionSchemaFor({ asideRule }?: {
944
941
  }>;
945
942
  default: z$1.ZodOptional<z$1.ZodBoolean>;
946
943
  }, z$1.core.$strict>;
947
- declare function contentViewDefinitionSchemaFor({ asideRule }?: {
948
- asideRule?: AsideRule;
949
- }): z$1.ZodType<ContentViewDefinition>;
944
+ declare function contentViewDefinitionSchemaFor(): z$1.ZodType<ContentViewDefinition>;
950
945
  declare const draftContentViewDefinitionSchema: z$1.ZodObject<{
951
946
  contents: z$1.ZodArray<z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
952
947
  type: z$1.ZodLiteral<"form">;
@@ -1195,4 +1190,4 @@ declare const draftContentViewDefinitionSchema: z$1.ZodObject<{
1195
1190
  }, z$1.core.$strict>;
1196
1191
  declare const contentViewDefinitionSchema: z$1.ZodType<ContentViewDefinition>;
1197
1192
  //#endregion
1198
- export { QueryState as $, FormContentDefinition as A, DayMonthValue as B, ContentOpenMode as C, CustomContentDefinition as D, ContentViewDefinition as E, MeetingsContentDefinition as F, FilterOperator as G, EdgeQuantifier as H, RichtextContentDefinition as I, FilterValue as J, FilterRule as K, ViewContentDefinition as L, FormsContentDefinition as M, KanbanCollectionContentDefinition as N, DocumentsContentDefinition as O, ListViewLayout as P, PhoneFilterValue as Q, ViewRead as R, ContentFieldGroup as S, ContentViewContext as T, ExtendedFilterRule as U, DynamicValue as V, FilterCombinator as W, NoValueOperator as X, NO_VALUE_OPERATORS as Y, OPERATORS_BY_TYPE as Z, CollectionContentDefinition as _, contentViewDefinitionSchemaFor as a, isNoValueOperator as at, ContentCreateMode as b, draftContentViewDefinitionSchemaFor as c, sortsSchema as d, RelativeDateValue as et, colorIdSchema as f, CollectionAction as g, ActivityContentDefinition as h, contentViewDefinitionSchema as i, getRollupFilterOperators as it, FormDensity as j, EmailsContentDefinition as k, filterStateSchema as l, SCHEMA_LIMITS as m, collectionContentSourceSchema as n, SortRule as nt, displayAttributesSchema as o, iconNameSchema as p, FilterState as q, columnsSchema as r, filterOperatorsByTypeForGeneration as rt, draftContentViewDefinitionSchema as s, AsideRule as t, SortDirection as tt, publishedViewContentDefinitionSchema as u, CollectionContentSource as v, ContentPlacement as w, ContentField as x, ColumnReference as y, CurrencyFilterValue as z };
1193
+ export { RelativeDateValue as $, FormDensity as A, DynamicValue as B, ContentPlacement as C, DocumentsContentDefinition as D, CustomContentDefinition as E, RichtextContentDefinition as F, FilterRule as G, ExtendedFilterRule as H, ViewContentDefinition as I, NO_VALUE_OPERATORS as J, FilterState as K, ViewRead as L, KanbanCollectionContentDefinition as M, ListViewLayout as N, EmailsContentDefinition as O, MeetingsContentDefinition as P, QueryState as Q, CurrencyFilterValue as R, ContentOpenMode as S, ContentViewDefinition as T, FilterCombinator as U, EdgeQuantifier as V, FilterOperator as W, OPERATORS_BY_TYPE as X, NoValueOperator as Y, PhoneFilterValue as Z, CollectionContentSource as _, displayAttributesSchema as a, ContentField as b, filterStateSchema as c, colorIdSchema as d, SortDirection as et, iconNameSchema as f, CollectionContentDefinition as g, CollectionAction as h, contentViewDefinitionSchemaFor as i, isNoValueOperator as it, FormsContentDefinition as j, FormContentDefinition as k, publishedViewContentDefinitionSchema as l, ActivityContentDefinition as m, columnsSchema as n, filterOperatorsByTypeForGeneration as nt, draftContentViewDefinitionSchema as o, SCHEMA_LIMITS as p, FilterValue as q, contentViewDefinitionSchema as r, getRollupFilterOperators as rt, draftContentViewDefinitionSchemaFor as s, collectionContentSourceSchema as t, SortRule as tt, sortsSchema as u, ColumnReference as v, ContentViewContext as w, ContentFieldGroup as x, ContentCreateMode as y, DayMonthValue as z };
@@ -1,12 +1,12 @@
1
1
 
2
- import { Tt as RollupAttribute, Y as Attribute, Z as AttributeType } from "./exceptions-BCfkN2ct.mjs";
3
- import { m as ListViewTabVisibility } from "./index-Ds0DxPHk.mjs";
4
- import "./index-_gdqRN1W.mjs";
5
- import "./index-DzEWbzP-.mjs";
6
- import "./text-CjhjkBXJ.mjs";
7
- import "./number-U7UMAXKt.mjs";
8
- import "./checkbox-DSzn5epa.mjs";
9
- import "./date-CteDw_88.mjs";
2
+ import { Tt as RollupAttribute, Y as Attribute, Z as AttributeType } from "./exceptions-B3WE8Upv.js";
3
+ import { m as ListViewTabVisibility } from "./index-CL87KvMy.js";
4
+ import "./index-Dh21B6e4.js";
5
+ import "./index-D4Fo465g.js";
6
+ import "./text-LRdjjxmn.js";
7
+ import "./number-DwKAGHUq.js";
8
+ import "./checkbox-CMNq2fkL.js";
9
+ import "./date-Bn1QYgWY.js";
10
10
  import { z as z$1 } from "zod";
11
11
  import { IconName } from "@stndrds/constants";
12
12
  //#region src/types/filters.d.ts
@@ -695,10 +695,7 @@ declare const publishedViewContentDefinitionSchema: z$1.ZodDiscriminatedUnion<[z
695
695
  aside: "aside";
696
696
  }>;
697
697
  }, z$1.core.$strict>], "type">;
698
- type AsideRule = "enforce" | "tolerate";
699
- declare function draftContentViewDefinitionSchemaFor({ asideRule }?: {
700
- asideRule?: AsideRule;
701
- }): z$1.ZodObject<{
698
+ declare function draftContentViewDefinitionSchemaFor(): z$1.ZodObject<{
702
699
  contents: z$1.ZodArray<z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
703
700
  type: z$1.ZodLiteral<"form">;
704
701
  groups: z$1.ZodArray<z$1.ZodObject<{
@@ -944,9 +941,7 @@ declare function draftContentViewDefinitionSchemaFor({ asideRule }?: {
944
941
  }>;
945
942
  default: z$1.ZodOptional<z$1.ZodBoolean>;
946
943
  }, z$1.core.$strict>;
947
- declare function contentViewDefinitionSchemaFor({ asideRule }?: {
948
- asideRule?: AsideRule;
949
- }): z$1.ZodType<ContentViewDefinition>;
944
+ declare function contentViewDefinitionSchemaFor(): z$1.ZodType<ContentViewDefinition>;
950
945
  declare const draftContentViewDefinitionSchema: z$1.ZodObject<{
951
946
  contents: z$1.ZodArray<z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
952
947
  type: z$1.ZodLiteral<"form">;
@@ -1195,4 +1190,4 @@ declare const draftContentViewDefinitionSchema: z$1.ZodObject<{
1195
1190
  }, z$1.core.$strict>;
1196
1191
  declare const contentViewDefinitionSchema: z$1.ZodType<ContentViewDefinition>;
1197
1192
  //#endregion
1198
- export { QueryState as $, FormContentDefinition as A, DayMonthValue as B, ContentOpenMode as C, CustomContentDefinition as D, ContentViewDefinition as E, MeetingsContentDefinition as F, FilterOperator as G, EdgeQuantifier as H, RichtextContentDefinition as I, FilterValue as J, FilterRule as K, ViewContentDefinition as L, FormsContentDefinition as M, KanbanCollectionContentDefinition as N, DocumentsContentDefinition as O, ListViewLayout as P, PhoneFilterValue as Q, ViewRead as R, ContentFieldGroup as S, ContentViewContext as T, ExtendedFilterRule as U, DynamicValue as V, FilterCombinator as W, NoValueOperator as X, NO_VALUE_OPERATORS as Y, OPERATORS_BY_TYPE as Z, CollectionContentDefinition as _, contentViewDefinitionSchemaFor as a, isNoValueOperator as at, ContentCreateMode as b, draftContentViewDefinitionSchemaFor as c, sortsSchema as d, RelativeDateValue as et, colorIdSchema as f, CollectionAction as g, ActivityContentDefinition as h, contentViewDefinitionSchema as i, getRollupFilterOperators as it, FormDensity as j, EmailsContentDefinition as k, filterStateSchema as l, SCHEMA_LIMITS as m, collectionContentSourceSchema as n, SortRule as nt, displayAttributesSchema as o, iconNameSchema as p, FilterState as q, columnsSchema as r, filterOperatorsByTypeForGeneration as rt, draftContentViewDefinitionSchema as s, AsideRule as t, SortDirection as tt, publishedViewContentDefinitionSchema as u, CollectionContentSource as v, ContentPlacement as w, ContentField as x, ColumnReference as y, CurrencyFilterValue as z };
1193
+ export { RelativeDateValue as $, FormDensity as A, DynamicValue as B, ContentPlacement as C, DocumentsContentDefinition as D, CustomContentDefinition as E, RichtextContentDefinition as F, FilterRule as G, ExtendedFilterRule as H, ViewContentDefinition as I, NO_VALUE_OPERATORS as J, FilterState as K, ViewRead as L, KanbanCollectionContentDefinition as M, ListViewLayout as N, EmailsContentDefinition as O, MeetingsContentDefinition as P, QueryState as Q, CurrencyFilterValue as R, ContentOpenMode as S, ContentViewDefinition as T, FilterCombinator as U, EdgeQuantifier as V, FilterOperator as W, OPERATORS_BY_TYPE as X, NoValueOperator as Y, PhoneFilterValue as Z, CollectionContentSource as _, displayAttributesSchema as a, ContentField as b, filterStateSchema as c, colorIdSchema as d, SortDirection as et, iconNameSchema as f, CollectionContentDefinition as g, CollectionAction as h, contentViewDefinitionSchemaFor as i, isNoValueOperator as it, FormsContentDefinition as j, FormContentDefinition as k, publishedViewContentDefinitionSchema as l, ActivityContentDefinition as m, columnsSchema as n, filterOperatorsByTypeForGeneration as nt, draftContentViewDefinitionSchema as o, SCHEMA_LIMITS as p, FilterValue as q, contentViewDefinitionSchema as r, getRollupFilterOperators as rt, draftContentViewDefinitionSchemaFor as s, collectionContentSourceSchema as t, SortRule as tt, sortsSchema as u, ColumnReference as v, ContentViewContext as w, ContentFieldGroup as x, ContentCreateMode as y, DayMonthValue as z };
@@ -1,6 +1,6 @@
1
1
 
2
- import { et as CheckboxAttribute } from "./exceptions-BCfkN2ct.js";
3
- import { r as ValidationMessages } from "./index-DyeLYnEc.js";
2
+ import { et as CheckboxAttribute } from "./exceptions-B3WE8Upv.js";
3
+ import { r as ValidationMessages } from "./index-D4Fo465g.js";
4
4
  import { z as z$1 } from "zod";
5
5
  //#region src/validation/primitives/checkbox.d.ts
6
6
  /**
@@ -1,6 +1,6 @@
1
1
 
2
- import { et as CheckboxAttribute } from "./exceptions-BCfkN2ct.mjs";
3
- import { r as ValidationMessages } from "./index-DzEWbzP-.mjs";
2
+ import { et as CheckboxAttribute } from "./exceptions-B3WE8Upv.mjs";
3
+ import { r as ValidationMessages } from "./index-nzT7sEBR.mjs";
4
4
  import { z as z$1 } from "zod";
5
5
  //#region src/validation/primitives/checkbox.d.ts
6
6
  /**
@@ -10,4 +10,4 @@ Name must be a valid variable identifier:
10
10
  ✅ Valid: 'firstName', 'first_name', 'FirstName', 'FIRST_NAME'
11
11
  ❌ Invalid: 'first-name', 'first name', '123name', 'first.name'`);if(u.includes(e))throw Error(`[AttributeBuilder] "${e}" is a reserved name and cannot be used as an attribute name.\nReserved names: ${u.join(`, `)}`)}function validateLabel(e){if(!e||e.length===0)throw Error(`[AttributeBuilder] Attribute label cannot be empty`);if(e.length>_)throw Error(`[AttributeBuilder] Attribute label is too long (max ${_} characters)`)}function validateIconName(e,t){if(!ne.has(e))throw Error(`[AttributeBuilder] Invalid icon "${e}" in ${t}.\nIcon must be one of the predefined icons from @stndrds/constants.`)}function validateOptions(e,t){let n=new Set;for(let r of t){if(!r.value?.trim())throw Error(`[AttributeBuilder] Option in "${e}" has an empty or missing value.`);if(!r.label?.trim())throw Error(`[AttributeBuilder] Option "${r.value}" in "${e}" has an empty or missing label.`);if(n.has(r.value))throw Error(`[AttributeBuilder] Duplicate option value "${r.value}" in "${e}".`);n.add(r.value)}for(let n of t){if(n.inverse===void 0)continue;let r=t.find(e=>e.value===n.inverse);if(!r)throw Error(`[AttributeBuilder] Option "${n.value}" in "${e}" has inverse "${n.inverse}" which does not match any option value.`);if(r.inverse!==n.value)throw Error(`[AttributeBuilder] Inverse mismatch in "${e}": "${n.value}" points to "${n.inverse}", but "${n.inverse}" points to "${r.inverse??`(none)`}". Inverse pairs must be symmetric.`)}}var ComputedFormulaParseError=class extends Error{constructor(e){super(e),this.name=`ComputedFormulaParseError`}};function parseComputedFormula(e){let t=new Parser(tokenize(e)),n=t.parseExpression();return t.expectEnd(),n}function tokenize(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===` `||r===` `||r===`
12
12
  `||r===`\r`){n+=1;continue}if(r===`"`||r===`'`){let i=scanString(e,n,r);t.push({kind:`string`,value:i.value,position:n}),n=i.nextIndex;continue}if(isDigit(r)){let r=scanNumber(e,n);t.push({kind:`number`,value:r.value,position:n}),n=r.nextIndex;continue}if(isIdentifierStart(r)){let r=scanIdentifier(e,n),i=r.value.toLowerCase();i===`true`?t.push({kind:`boolean`,value:!0,position:n}):i===`false`?t.push({kind:`boolean`,value:!1,position:n}):i===`null`?t.push({kind:`null`,position:n}):t.push({kind:`identifier`,value:r.value,position:n}),n=r.nextIndex;continue}let i=e.slice(n,n+2);if(i===`>=`||i===`<=`||i===`==`||i===`!=`){t.push({kind:`operator`,value:i,position:n}),n+=2;continue}if(r===`>`||r===`<`||r===`+`||r===`-`||r===`*`||r===`/`){t.push({kind:`operator`,value:r,position:n}),n+=1;continue}if(r===`(`||r===`)`||r===`,`||r===`.`){t.push({kind:`punctuation`,value:r,position:n}),n+=1;continue}throw new ComputedFormulaParseError(`Unexpected character "${r}" at position ${n}`)}return t}function scanString(e,t,n=`"`){let r=``,i=t+1;for(;i<e.length;){let t=e[i];if(t===n)return{value:r,nextIndex:i+1};if(t===`\\`){let t=e[i+1];if(t===void 0)throw new ComputedFormulaParseError(`Unterminated string literal at position ${i}`);r+=decodeEscape(t,i),i+=2;continue}r+=t,i+=1}throw new ComputedFormulaParseError(`Unterminated string literal at position ${t}`)}function decodeEscape(e,t){switch(e){case`"`:case`\\`:return e;case`n`:return`
13
- `;case`r`:return`\r`;case`t`:return` `;default:throw new ComputedFormulaParseError(`Unknown escape sequence "\\${e}" at position ${t}`)}}function scanNumber(e,t){let n=t;for(;n<e.length&&isDigit(e[n]);)n+=1;if(e[n]===`.`){let t=n;if(n+=1,!isDigit(e[n]))throw new ComputedFormulaParseError(`Invalid number literal at position ${t}`);for(;n<e.length&&isDigit(e[n]);)n+=1}let r=e.slice(t,n),i=Number(r);if(!Number.isFinite(i))throw new ComputedFormulaParseError(`Invalid number literal "${r}"`);return{value:i,nextIndex:n}}function scanIdentifier(e,t){let n=t+1;for(;n<e.length&&isIdentifierPart(e[n]);)n+=1;return{value:e.slice(t,n),nextIndex:n}}function isDigit(e){return e!==void 0&&e>=`0`&&e<=`9`}function isIdentifierStart(e){return e!==void 0&&/[A-Za-z_]/.test(e)}function isIdentifierPart(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}var Parser=class{constructor(e){this.tokens=e,this.position=0}parseExpression(){return this.parseBinaryExpression(0)}expectEnd(){let e=this.peek();if(e!==void 0)throw new ComputedFormulaParseError(`Unexpected token ${describeToken(e)} at position ${e.position}`)}parseBinaryExpression(e){let t=this.parsePrimary();for(;;){let n=this.peek();if(n?.kind!==`operator`)return t;let r=getOperatorPrecedence(n.value);if(r<e)return t;let i=n.value;this.consume();let a=this.parseBinaryExpression(r+1);t={kind:`binary`,operator:i,left:t,right:a}}}parsePrimary(){let e=this.consume();if(e===void 0)throw new ComputedFormulaParseError(`Unexpected end of expression`);switch(e.kind){case`string`:case`number`:case`boolean`:return{kind:`literal`,value:e.value};case`null`:return{kind:`literal`,value:null};case`identifier`:return this.parseIdentifier(e.value);case`punctuation`:if(e.value===`(`){let e=this.parseExpression();return this.expectPunctuation(`)`),e}break;case`operator`:if(e.value===`-`){let e=this.consume();if(e?.kind===`number`)return{kind:`literal`,value:-e.value}}}throw new ComputedFormulaParseError(`Expected literal, path, call, or parenthesized expression at position ${e.position}`)}parseIdentifier(e){if(this.matchPunctuation(`(`)){let t=[];if(!this.matchPunctuation(`)`)){do t.push(this.parseExpression());while(this.matchPunctuation(`,`));this.expectPunctuation(`)`)}return{kind:`call`,functionName:e.toLowerCase(),args:t}}let t=[e];for(;this.matchPunctuation(`.`);){let e=this.consume();if(e?.kind!==`identifier`)throw new ComputedFormulaParseError(`Expected attribute name after path separator at position ${e?.position??this.previousPosition()}`);t.push(e.value)}return{kind:`path`,parts:t}}expectPunctuation(e){if(!this.matchPunctuation(e))throw new ComputedFormulaParseError(`Expected "${e}" at position ${this.peek()?.position??this.previousPosition()}`)}matchPunctuation(e){let t=this.peek();return t?.kind===`punctuation`&&t.value===e&&(this.consume(),!0)}peek(){return this.tokens[this.position]}consume(){let e=this.tokens[this.position];return this.position+=1,e}previousPosition(){return this.tokens[this.position-1]?.position??0}};function describeToken(e){switch(e.kind){case`identifier`:case`number`:case`string`:case`boolean`:case`operator`:case`punctuation`:return`"${String(e.value)}"`;case`null`:return`"null"`;default:return e}}function getOperatorPrecedence(e){switch(e){case`*`:case`/`:return 3;case`+`:case`-`:return 2;case`>`:case`<`:case`>=`:case`<=`:case`==`:case`!=`:return 1;default:return e}}const b=i.object({placeholder:i.string().optional(),description:i.string().optional(),defaultValue:i.unknown().optional(),icon:i.string().optional(),order:i.number().int().optional(),hidden:i.boolean().optional(),archived:i.boolean().optional(),deprecated:i.boolean().optional(),metadata:i.record(i.string(),i.unknown()).optional()}),x=[`placeholder`,`description`,`defaultValue`,`icon`,`order`,`hidden`,`archived`,`deprecated`,`metadata`];function refuseForeignKeys(e,t,n=[]){let r=new Set(n);return function refuse(n,i,a,o=[]){let s=e[n];if(s!==void 0&&i!==void 0)for(let e of Object.keys(i))s.has(e)||r.has(e)||a.addIssue({code:`custom`,path:[...o,e],message:`"${e}" is not a ${n} ${t}; keys of ${n}: ${[...s].join(`, `)}`})}}const S=i.object({value:i.string().min(1).describe(`Stored value`),label:i.string().min(1).describe(`Label people see`),description:i.string().describe(`Extra context`).optional(),inverse:i.string().describe(`Paired option's value (symmetric)`).optional(),archived:i.boolean().describe(`Hides without deleting`).optional()}),C=i.enum([`idle`,`in_progress`,`finished`]).describe(`Workflow stage`),w=S.extend({color:m}).strict(),T=w,E=S.extend({color:m,group:C}).strict(),D=S.extend({color:i.string().optional().describe(`A color id`),group:C.optional()}).strict(),O=i.array(D).min(1).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`});function writeOptionsArraySchema(e){return i.array(e).min(1).max(f.optionsPerAttribute).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`})}const k=writeOptionsArraySchema(w),A=writeOptionsArraySchema(T),j=writeOptionsArraySchema(E),ie=i.object({object:i.string().min(1).describe(`Target object`),displayTemplate:i.string().optional().describe(`Linked record label template`),filter:i.record(i.string(),i.unknown()).optional().describe(`Restricts linkable records`)}),ae=i.object({object:i.string().min(1).describe(`Other side's object`),attribute:i.string().min(1).describe(`Other side's attribute`),cardinality:i.enum([`one`,`many`]).optional().describe(`Other side's cardinality`),label:i.string().min(1).optional().describe(`Other side's label`),storageOwner:i.boolean().optional().describe(`Owns the join storage`)}),M=i.object({objectName:i.string().min(1).describe(`API name of the object whose options are mirrored`),attributeName:i.string().min(1).describe(`API name of the select/status attribute to mirror options from`),attributeId:i.string().optional().describe(`Id of the source attribute, resolved by the server`)}),N=b.extend({multiline:i.boolean().describe(`Renders as a multi-line textarea`).optional(),minLength:i.number().int().min(0).describe(`Minimum character count`).optional(),maxLength:i.number().int().min(1).describe(`Maximum character count`).optional(),pattern:i.string().describe(`Regular expression the value must match`).optional(),format:i.enum([`email`,`url`,`slug`]).describe(`Validates and renders as this format`).optional()}),oe=b,P=b.extend({renderAs:i.enum([`number`,`rating`]).describe(`Plain number or a star rating`).optional(),min:i.number().describe(`Minimum allowed value`).optional(),max:i.number().describe(`Maximum allowed value`).optional(),unit:i.enum([`integer`,`decimal`,`percentage`]).describe(`How the value is stored and rendered`).optional(),decimals:i.number().int().min(0).max(10).describe(`Decimal places shown`).optional()}),F=b,I=b.extend({dateFormat:i.enum([`short`,`long`,`full`,`relative`]).describe(`How the date is rendered`).optional(),minDate:i.string().describe(`Earliest allowed date (ISO)`).optional(),maxDate:i.string().describe(`Latest allowed date (ISO)`).optional(),includeTime:i.boolean().describe(`Also captures a time of day`).optional(),endDate:i.boolean().describe(`Paired with another date attribute as a range's end`).optional(),timeFormat:i.enum([`12h`,`24h`]).describe(`Clock format when a time is included`).optional()}),L=b.extend({defaultCountryCode:i.string().length(3).describe(`ISO country code preselected in the dialer`).optional()}),R=b.extend({defaultCurrency:i.string().length(3).describe(`ISO currency code preselected for new values`).optional(),allowedCurrencies:i.array(i.string().length(3)).describe(`ISO currency codes a value may use; any currency when omitted`).optional(),allowNegative:i.boolean().describe(`Whether a negative amount is accepted`).optional()}),z=b.extend({options:O.describe(`The workflow statuses, in order`)}),B=b.extend({granularity:i.enum([`full`,`address`,`city`,`state`,`country`,`coordinates`]).describe(`How precise a location must be captured`).optional(),defaultCountry:i.string().length(3).describe(`ISO country code preselected for new values`).optional(),allowedCountries:i.array(i.string().length(3)).describe(`ISO country codes a value may use; any country when omitted`).optional()}),V=b.extend({options:O.describe(`Options`),renderAs:i.literal(`badges`).optional().describe(`Renders the chosen option as a colored badge`)}),H=b.extend({options:O.describe(`Options`),renderAs:i.literal(`badges`).optional().describe(`Renders the chosen options as colored badges`)}),U=b.extend({types:i.array(i.enum([`user`,`agent`])).min(1).optional().describe(`Which kinds of actor can be picked; both when omitted`),multiple:i.boolean().optional().describe(`Whether more than one actor can be picked`)}),W={name:y.describe(`Property API name`),label:i.string().min(1).describe(`Label people see`),required:i.boolean().describe(`Required on every edge`).optional()},G={id:i.string().optional(),objectId:i.string().optional(),system:i.boolean().optional(),unique:i.boolean().optional()},K=Object.fromEntries(x.map(e=>[e,!0])),q=[`text`,`number`,`checkbox`,`date`,`phone`,`currency`,`location`],J=[...q,`select`,`multiselect`,`status`],Y={text:N,number:P,checkbox:F,date:I,phone:L,currency:R,location:B,select:V,multiselect:H,status:z},se={...Y,select:V.extend({options:k.describe(`Options`)}),multiselect:H.extend({options:A.describe(`Options`)}),status:z.extend({options:j.describe(`Statuses`)})},propertyWireConfigShapeFor=e=>se[e].omit(K).shape,storedPropertyMember=e=>i.object({...W,...G,type:i.literal(e).describe(`Property type`),...Y[e].shape}).strip(),X=i.discriminatedUnion(`type`,J.map(storedPropertyMember)),Z=i.object({definitions:i.array(X).min(1).max(f.optionsPerAttribute).describe(`Edge properties`)}).strip().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),ce=refuseForeignKeys(Object.fromEntries(J.map(e=>[e,new Set(Object.keys(propertyWireConfigShapeFor(e)))])),`property key`,[...Object.keys(W),`type`]);function refuseForeignPropertyKeys(e,t){ce(e.type,e,t)}const le=q.reduce((e,t)=>(Object.assign(e,propertyWireConfigShapeFor(t)),e),{}),optionPropertyWireMember=e=>i.object({...W,type:e.length===1?i.literal(e[0]).describe(`Property type`):i.enum(e).describe(`Property type`),...propertyWireConfigShapeFor(e[0])}).strict(),Q=i.discriminatedUnion(`type`,[optionPropertyWireMember([`select`,`multiselect`]),optionPropertyWireMember([`status`]),i.object({...W,type:i.enum(q).describe(`Property type`),...le}).strict().superRefine(refuseForeignPropertyKeys)]),ue=i.object({definitions:i.array(Q).min(1).max(f.optionsPerAttribute).describe(`Edge properties`)}).strict().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),de=b.extend({targets:i.array(ie).min(1).describe(`Target object(s)`),cardinality:i.enum([`one`,`many`]).describe(`one or many`),maxItems:i.number().int().min(1).optional().describe(`Max linked records`),bilateral:ae.optional().describe(`Syncs the other side's attribute`),properties:Z.optional()}),fe=b.extend({expression:i.string().min(1).superRefine((e,t)=>{try{parseComputedFormula(e)}catch(e){t.addIssue({code:i.ZodIssueCode.custom,message:e instanceof Error?e.message:`Invalid formula expression`})}}).describe(`The formula expression, compiled against this object's attributes`),returnType:i.enum([`text`,`number`,`boolean`,`date`,`select`,`multiselect`]).describe(`The formula's result type`),decimals:i.number().int().min(0).max(10).optional().describe(`Decimal places shown for a number result`),allowRelations:i.boolean().optional().describe(`Whether the expression may read across a relation`),optionsSource:M.optional().describe(`Mirrors an option set`)}),pe=b.extend({relationAttribute:i.string().min(1).optional().describe(`API name of the relation this rollup aggregates through`),relationPath:i.string().optional().describe(`Not supported yet — single-hop only`),targetAttribute:i.string().min(1).optional().describe(`API name of the attribute aggregated on the relation's target object; not read by count`),function:i.enum([`sum`,`avg`,`earliest`,`latest`,`count`,`countValues`,`countUniqueValues`,`countEmpty`,`percentEmpty`,`percentNotEmpty`,`original`]).describe(`The aggregation applied across the linked records`),decimals:i.number().int().min(0).max(10).optional().describe(`Decimal places shown for a numeric result`),targetAttributeType:i.string().optional().describe(`Server-set`),targetAttributeOptions:i.array(D).optional().describe(`Server-set`),targetCurrencyCode:i.string().length(3).optional().describe(`Server-set`),optionsSource:M.optional().describe(`Mirrors an option set`)});function rollupTargetIssue(e,t){if(e===`rollup`&&t.function!==`count`&&t.targetAttribute===void 0)return{path:[`targetAttribute`],message:`targetAttribute is required for a "${String(t.function)}" rollup`}}const $={text:N,richtext:oe,number:P,checkbox:F,date:I,phone:L,currency:R,status:z,location:B,select:V,multiselect:H,user:U,relation:de,formula:fe,rollup:pe,document:b.extend({properties:Z.optional(),accepts:i.array(i.string().min(1)).optional().describe("MIME prefixes or globs a file must match (e.g. `image/*`, `*.pdf`)"),maxFileSize:i.number().int().min(1).optional().describe(`Maximum file size in bytes`)})};function getAttributeConfigSchema(e){let t=$[e];if(!t)throw new n(`Unsupported attribute type: ${e}`,[]);return t}function parseAttributeConfig(e,t){let n=getAttributeConfigSchema(e).strip().parse(t),r=rollupTargetIssue(e,n);if(r)throw validationErrorFromIssues([r]);return n}function getAttributeConfigWriteSchema(e){let t=getAttributeConfigSchema(e).extend({icon:h.optional()});switch(e){case`select`:return t.extend({options:k.describe(`Options`)});case`multiselect`:return t.extend({options:A.describe(`Options`)});case`status`:return t.extend({options:j.describe(`Statuses`)});default:return t}}function validationErrorFromIssues(e){return n.fromZodErrors(e.map(e=>({path:e.path.map(e=>typeof e==`symbol`?String(e):e),message:e.message})))}function parseWriteSchema(e,t){let n=getAttributeConfigWriteSchema(e).strip().safeParse(t);if(!n.success)throw validationErrorFromIssues(n.error.issues);let r=rollupTargetIssue(e,n.data);if(r)throw validationErrorFromIssues([r]);return n.data}function parseAttributeConfigForCreate(e,t){return parseWriteSchema(e,t)}function validatePatchedIcon(e){if(!Object.prototype.hasOwnProperty.call(e,`icon`))return;let t=h.optional().safeParse(e.icon);if(!t.success)throw n.fromZodErrors(t.error.issues.map(e=>({path:[`icon`,...e.path.map(e=>typeof e==`symbol`?String(e):e)],message:e.message})))}function isSelectLike(e){return e===`select`||e===`multiselect`||e===`status`}function parseAttributeConfigForUpdate(e,t){let n=Object.prototype.hasOwnProperty.call(t,`options`),r=Object.prototype.hasOwnProperty.call(t,`icon`),i={...e,...t};if(validatePatchedIcon(t),n){let{icon:t,...n}=i,a=parseWriteSchema(e.type,r?i:n);return!r&&t!==void 0&&(a.icon=t),a}let a=e.options;isSelectLike(e.type)&&(i.options=[{value:`__legacy__`,label:`__legacy__`}]);let o=getAttributeConfigSchema(e.type).strip().safeParse(i);if(!o.success)throw validationErrorFromIssues(o.error.issues);let s=o.data;return isSelectLike(e.type)&&(s.options=a),s}export{h as A,validateAttributeName as C,validateOptions as D,validateObjectName as E,c as F,l as I,parseResourceVisibility as L,ee as M,u as N,validateViewName as O,d as P,s as R,assertUniqueBy as S,validateLabel as T,E as _,getAttributeConfigWriteSchema as a,y as b,parseAttributeConfigForCreate as c,Q as d,Z as f,C as g,w as h,getAttributeConfigSchema as i,f as j,m as k,parseAttributeConfigForUpdate as l,refuseForeignKeys as m,x as n,T as o,ue as p,$ as r,parseAttributeConfig as s,q as t,X as u,ComputedFormulaParseError as v,validateIconName as w,v as x,parseComputedFormula as y,isNativeObjectName as z};
13
+ `;case`r`:return`\r`;case`t`:return` `;default:throw new ComputedFormulaParseError(`Unknown escape sequence "\\${e}" at position ${t}`)}}function scanNumber(e,t){let n=t;for(;n<e.length&&isDigit(e[n]);)n+=1;if(e[n]===`.`){let t=n;if(n+=1,!isDigit(e[n]))throw new ComputedFormulaParseError(`Invalid number literal at position ${t}`);for(;n<e.length&&isDigit(e[n]);)n+=1}let r=e.slice(t,n),i=Number(r);if(!Number.isFinite(i))throw new ComputedFormulaParseError(`Invalid number literal "${r}"`);return{value:i,nextIndex:n}}function scanIdentifier(e,t){let n=t+1;for(;n<e.length&&isIdentifierPart(e[n]);)n+=1;return{value:e.slice(t,n),nextIndex:n}}function isDigit(e){return e!==void 0&&e>=`0`&&e<=`9`}function isIdentifierStart(e){return e!==void 0&&/[A-Za-z_]/.test(e)}function isIdentifierPart(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}var Parser=class{constructor(e){this.tokens=e,this.position=0}parseExpression(){return this.parseBinaryExpression(0)}expectEnd(){let e=this.peek();if(e!==void 0)throw new ComputedFormulaParseError(`Unexpected token ${describeToken(e)} at position ${e.position}`)}parseBinaryExpression(e){let t=this.parsePrimary();for(;;){let n=this.peek();if(n?.kind!==`operator`)return t;let r=getOperatorPrecedence(n.value);if(r<e)return t;let i=n.value;this.consume();let a=this.parseBinaryExpression(r+1);t={kind:`binary`,operator:i,left:t,right:a}}}parsePrimary(){let e=this.consume();if(e===void 0)throw new ComputedFormulaParseError(`Unexpected end of expression`);switch(e.kind){case`string`:case`number`:case`boolean`:return{kind:`literal`,value:e.value};case`null`:return{kind:`literal`,value:null};case`identifier`:return this.parseIdentifier(e.value);case`punctuation`:if(e.value===`(`){let e=this.parseExpression();return this.expectPunctuation(`)`),e}break;case`operator`:if(e.value===`-`){let e=this.consume();if(e?.kind===`number`)return{kind:`literal`,value:-e.value}}}throw new ComputedFormulaParseError(`Expected literal, path, call, or parenthesized expression at position ${e.position}`)}parseIdentifier(e){if(this.matchPunctuation(`(`)){let t=[];if(!this.matchPunctuation(`)`)){do t.push(this.parseExpression());while(this.matchPunctuation(`,`));this.expectPunctuation(`)`)}return{kind:`call`,functionName:e.toLowerCase(),args:t}}let t=[e];for(;this.matchPunctuation(`.`);){let e=this.consume();if(e?.kind!==`identifier`)throw new ComputedFormulaParseError(`Expected attribute name after path separator at position ${e?.position??this.previousPosition()}`);t.push(e.value)}return{kind:`path`,parts:t}}expectPunctuation(e){if(!this.matchPunctuation(e))throw new ComputedFormulaParseError(`Expected "${e}" at position ${this.peek()?.position??this.previousPosition()}`)}matchPunctuation(e){let t=this.peek();return t?.kind===`punctuation`&&t.value===e&&(this.consume(),!0)}peek(){return this.tokens[this.position]}consume(){let e=this.tokens[this.position];return this.position+=1,e}previousPosition(){return this.tokens[this.position-1]?.position??0}};function describeToken(e){switch(e.kind){case`identifier`:case`number`:case`string`:case`boolean`:case`operator`:case`punctuation`:return`"${String(e.value)}"`;case`null`:return`"null"`;default:return e}}function getOperatorPrecedence(e){switch(e){case`*`:case`/`:return 3;case`+`:case`-`:return 2;case`>`:case`<`:case`>=`:case`<=`:case`==`:case`!=`:return 1;default:return e}}const b=i.object({placeholder:i.string().optional(),description:i.string().optional(),defaultValue:i.unknown().optional(),icon:i.string().optional(),order:i.number().int().optional(),hidden:i.boolean().optional(),archived:i.boolean().optional(),deprecated:i.boolean().optional(),metadata:i.record(i.string(),i.unknown()).optional()}),x=[`placeholder`,`description`,`defaultValue`,`icon`,`order`,`hidden`,`archived`,`deprecated`,`metadata`];function refuseForeignKeys(e,t,n=[]){let r=new Set(n);return function refuse(n,i,a,o=[]){let s=e[n];if(s!==void 0&&i!==void 0)for(let e of Object.keys(i))s.has(e)||r.has(e)||a.addIssue({code:`custom`,path:[...o,e],message:`"${e}" is not a ${n} ${t}; keys of ${n}: ${[...s].join(`, `)}`})}}const S=i.object({value:i.string().min(1).describe(`Stored value`),label:i.string().min(1).describe(`Label people see`),description:i.string().describe(`Extra context`).optional(),inverse:i.string().describe(`Paired option's value (symmetric)`).optional(),archived:i.boolean().describe(`Hides without deleting`).optional()}),C=i.enum([`idle`,`in_progress`,`finished`]).describe(`Workflow stage`),w=S.extend({color:m}).strict(),T=w,E=S.extend({color:m,group:C}).strict(),D=S.extend({color:i.string().optional().describe(`A color id`),group:C.optional()}).strict(),O=i.array(D).min(1).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`});function writeOptionsArraySchema(e){return i.array(e).min(1).max(f.optionsPerAttribute).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`})}const k=writeOptionsArraySchema(w),A=writeOptionsArraySchema(T),j=writeOptionsArraySchema(E),ie=i.object({object:i.string().min(1).describe(`Target object`),displayTemplate:i.string().optional().describe(`Linked record label template`),filter:i.record(i.string(),i.unknown()).optional().describe(`Restricts linkable records`)}),ae=i.object({object:i.string().min(1).describe(`Other side's object`),attribute:i.string().min(1).describe(`Other side's attribute`),cardinality:i.enum([`one`,`many`]).optional().describe(`Other side's cardinality`),label:i.string().min(1).optional().describe(`Other side's label`),storageOwner:i.boolean().optional().describe(`Owns the join storage`)}),M=i.object({objectName:i.string().min(1).describe(`API name of the object whose options are mirrored`),attributeName:i.string().min(1).describe(`API name of the select/status attribute to mirror options from`),attributeId:i.string().optional().describe(`Id of the source attribute, resolved by the server`)}),N=b.extend({multiline:i.boolean().describe(`Renders as a multi-line textarea`).optional(),minLength:i.number().int().min(0).describe(`Minimum character count`).optional(),maxLength:i.number().int().min(1).describe(`Maximum character count`).optional(),pattern:i.string().describe(`Regular expression the value must match`).optional(),format:i.enum([`email`,`url`,`slug`]).describe(`Validates and renders as this format`).optional()}),oe=b,P=b.extend({renderAs:i.enum([`number`,`rating`]).describe(`Plain number or a star rating`).optional(),min:i.number().describe(`Minimum allowed value`).optional(),max:i.number().describe(`Maximum allowed value`).optional(),unit:i.enum([`integer`,`decimal`,`percentage`]).describe(`How the value is stored and rendered`).optional(),decimals:i.number().int().min(0).max(10).describe(`Decimal places shown`).optional()}),F=b,I=b.extend({dateFormat:i.enum([`short`,`long`,`full`,`relative`]).describe(`How the date is rendered`).optional(),minDate:i.string().describe(`Earliest allowed date (ISO)`).optional(),maxDate:i.string().describe(`Latest allowed date (ISO)`).optional(),includeTime:i.boolean().describe(`Also captures a time of day`).optional(),endDate:i.boolean().describe(`Paired with another date attribute as a range's end`).optional(),timeFormat:i.enum([`12h`,`24h`]).describe(`Clock format when a time is included`).optional()}),L=b.extend({defaultCountryCode:i.string().length(3).describe(`ISO country code preselected in the dialer`).optional()}),R=b.extend({defaultCurrency:i.string().length(3).describe(`ISO currency code preselected for new values`).optional(),allowedCurrencies:i.array(i.string().length(3)).describe(`ISO currency codes a value may use; any currency when omitted`).optional(),allowNegative:i.boolean().describe(`Whether a negative amount is accepted`).optional()}),z=b.extend({options:O.describe(`The workflow statuses, in order`)}),B=b.extend({granularity:i.enum([`full`,`address`,`city`,`state`,`country`,`coordinates`]).describe(`How precise a location must be captured`).optional(),defaultCountry:i.string().length(3).describe(`ISO country code preselected for new values`).optional(),allowedCountries:i.array(i.string().length(3)).describe(`ISO country codes a value may use; any country when omitted`).optional()}),V=b.extend({options:O.describe(`Options`),renderAs:i.literal(`badges`).optional().describe(`Renders the chosen option as a colored badge`)}),H=b.extend({options:O.describe(`Options`),renderAs:i.literal(`badges`).optional().describe(`Renders the chosen options as colored badges`)}),U=b.extend({types:i.array(i.enum([`user`,`agent`])).min(1).optional().describe(`Which kinds of actor can be picked; both when omitted`),multiple:i.boolean().optional().describe(`Whether more than one actor can be picked`)}),W={name:y.describe(`Property API name`),label:i.string().min(1).describe(`Label people see`),required:i.boolean().describe(`Required on every edge`).optional()},G={id:i.string().optional(),objectId:i.string().optional(),system:i.boolean().optional(),unique:i.boolean().optional()},K=Object.fromEntries(x.map(e=>[e,!0])),q=[`text`,`number`,`checkbox`,`date`,`phone`,`currency`,`location`],J=[...q,`select`,`multiselect`,`status`],Y={text:N,number:P,checkbox:F,date:I,phone:L,currency:R,location:B,select:V,multiselect:H,status:z},se={...Y,select:V.extend({options:k.describe(`Options`)}),multiselect:H.extend({options:A.describe(`Options`)}),status:z.extend({options:j.describe(`Statuses`)})},propertyWireConfigShapeFor=e=>se[e].omit(K).shape,storedPropertyMember=e=>i.object({...W,...G,type:i.literal(e).describe(`Property type`),...Y[e].shape}).strip(),X=i.discriminatedUnion(`type`,J.map(storedPropertyMember)),Z=i.object({definitions:i.array(X).min(1).max(f.optionsPerAttribute).describe(`Edge properties`)}).strip().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),ce=refuseForeignKeys(Object.fromEntries(J.map(e=>[e,new Set(Object.keys(propertyWireConfigShapeFor(e)))])),`property key`,[...Object.keys(W),`type`]);function refuseForeignPropertyKeys(e,t){ce(e.type,e,t)}const le=q.reduce((e,t)=>(Object.assign(e,propertyWireConfigShapeFor(t)),e),{}),optionPropertyWireMember=e=>i.object({...W,type:e.length===1?i.literal(e[0]).describe(`Property type`):i.enum(e).describe(`Property type`),...propertyWireConfigShapeFor(e[0])}).strict(),Q=i.discriminatedUnion(`type`,[optionPropertyWireMember([`select`,`multiselect`]),optionPropertyWireMember([`status`]),i.object({...W,type:i.enum(q).describe(`Property type`),...le}).strict().superRefine(refuseForeignPropertyKeys)]),ue=i.object({definitions:i.array(Q).min(1).max(f.optionsPerAttribute).describe(`Edge properties`)}).strict().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),de=b.extend({targets:i.array(ie).min(1).describe(`Target object(s)`),cardinality:i.enum([`one`,`many`]).describe(`one or many`),maxItems:i.number().int().min(1).optional().describe(`Max linked records`),bilateral:ae.optional().describe(`Syncs the other side's attribute`),properties:Z.optional()}),fe=b.extend({expression:i.string().min(1).superRefine((e,t)=>{try{parseComputedFormula(e)}catch(e){t.addIssue({code:i.ZodIssueCode.custom,message:e instanceof Error?e.message:`Invalid formula expression`})}}).describe(`The formula expression, compiled against this object's attributes`),returnType:i.enum([`text`,`number`,`boolean`,`date`,`select`,`multiselect`]).describe(`The formula's result type`),decimals:i.number().int().min(0).max(10).optional().describe(`Decimal places shown for a number result`),currencyCode:i.string().length(3).optional().describe(`ISO 4217 code a number result renders with; presentation only`),allowRelations:i.boolean().optional().describe(`Whether the expression may read across a relation`),optionsSource:M.optional().describe(`Mirrors an option set`)}),pe=b.extend({relationAttribute:i.string().min(1).optional().describe(`API name of the relation this rollup aggregates through`),relationPath:i.string().optional().describe(`Not supported yet — single-hop only`),targetAttribute:i.string().min(1).optional().describe(`API name of the attribute aggregated on the relation's target object; not read by count`),function:i.enum([`sum`,`avg`,`earliest`,`latest`,`count`,`countValues`,`countUniqueValues`,`countEmpty`,`percentEmpty`,`percentNotEmpty`,`original`]).describe(`The aggregation applied across the linked records`),decimals:i.number().int().min(0).max(10).optional().describe(`Decimal places shown for a numeric result`),targetAttributeType:i.string().optional().describe(`Server-set`),targetAttributeOptions:i.array(D).optional().describe(`Server-set`),targetCurrencyCode:i.string().length(3).optional().describe(`Server-set`),optionsSource:M.optional().describe(`Mirrors an option set`)});function rollupTargetIssue(e,t){if(e===`rollup`&&t.function!==`count`&&t.targetAttribute===void 0)return{path:[`targetAttribute`],message:`targetAttribute is required for a "${String(t.function)}" rollup`}}const $={text:N,richtext:oe,number:P,checkbox:F,date:I,phone:L,currency:R,status:z,location:B,select:V,multiselect:H,user:U,relation:de,formula:fe,rollup:pe,document:b.extend({properties:Z.optional(),accepts:i.array(i.string().min(1)).optional().describe("MIME prefixes or globs a file must match (e.g. `image/*`, `*.pdf`)"),maxFileSize:i.number().int().min(1).optional().describe(`Maximum file size in bytes`)})};function getAttributeConfigSchema(e){let t=$[e];if(!t)throw new n(`Unsupported attribute type: ${e}`,[]);return t}function parseAttributeConfig(e,t){let n=getAttributeConfigSchema(e).strip().parse(t),r=rollupTargetIssue(e,n);if(r)throw validationErrorFromIssues([r]);return n}function getAttributeConfigWriteSchema(e){let t=getAttributeConfigSchema(e).extend({icon:h.optional()});switch(e){case`select`:return t.extend({options:k.describe(`Options`)});case`multiselect`:return t.extend({options:A.describe(`Options`)});case`status`:return t.extend({options:j.describe(`Statuses`)});default:return t}}function validationErrorFromIssues(e){return n.fromZodErrors(e.map(e=>({path:e.path.map(e=>typeof e==`symbol`?String(e):e),message:e.message})))}function parseWriteSchema(e,t){let n=getAttributeConfigWriteSchema(e).strip().safeParse(t);if(!n.success)throw validationErrorFromIssues(n.error.issues);let r=rollupTargetIssue(e,n.data);if(r)throw validationErrorFromIssues([r]);return n.data}function parseAttributeConfigForCreate(e,t){return parseWriteSchema(e,t)}function validatePatchedIcon(e){if(!Object.prototype.hasOwnProperty.call(e,`icon`))return;let t=h.optional().safeParse(e.icon);if(!t.success)throw n.fromZodErrors(t.error.issues.map(e=>({path:[`icon`,...e.path.map(e=>typeof e==`symbol`?String(e):e)],message:e.message})))}function isSelectLike(e){return e===`select`||e===`multiselect`||e===`status`}function parseAttributeConfigForUpdate(e,t){let n=Object.prototype.hasOwnProperty.call(t,`options`),r=Object.prototype.hasOwnProperty.call(t,`icon`),i={...e,...t};if(validatePatchedIcon(t),n){let{icon:t,...n}=i,a=parseWriteSchema(e.type,r?i:n);return!r&&t!==void 0&&(a.icon=t),a}let a=e.options;isSelectLike(e.type)&&(i.options=[{value:`__legacy__`,label:`__legacy__`}]);let o=getAttributeConfigSchema(e.type).strip().safeParse(i);if(!o.success)throw validationErrorFromIssues(o.error.issues);let s=o.data;return isSelectLike(e.type)&&(s.options=a),s}export{h as A,validateAttributeName as C,validateOptions as D,validateObjectName as E,c as F,l as I,parseResourceVisibility as L,ee as M,u as N,validateViewName as O,d as P,s as R,assertUniqueBy as S,validateLabel as T,E as _,getAttributeConfigWriteSchema as a,y as b,parseAttributeConfigForCreate as c,Q as d,Z as f,C as g,w as h,getAttributeConfigSchema as i,f as j,m as k,parseAttributeConfigForUpdate as l,refuseForeignKeys as m,x as n,T as o,ue as p,$ as r,parseAttributeConfig as s,q as t,X as u,ComputedFormulaParseError as v,validateIconName as w,v as x,parseComputedFormula as y,isNativeObjectName as z};
@@ -10,4 +10,4 @@ Name must be a valid variable identifier:
10
10
  ✅ Valid: 'firstName', 'first_name', 'FirstName', 'FIRST_NAME'
11
11
  ❌ Invalid: 'first-name', 'first name', '123name', 'first.name'`);if(p.includes(e))throw Error(`[AttributeBuilder] "${e}" is a reserved name and cannot be used as an attribute name.\nReserved names: ${p.join(`, `)}`)}function validateLabel(e){if(!e||e.length===0)throw Error(`[AttributeBuilder] Attribute label cannot be empty`);if(e.length>y)throw Error(`[AttributeBuilder] Attribute label is too long (max ${y} characters)`)}function validateIconName(e,t){if(!ne.has(e))throw Error(`[AttributeBuilder] Invalid icon "${e}" in ${t}.\nIcon must be one of the predefined icons from @stndrds/constants.`)}function validateOptions(e,t){let n=new Set;for(let r of t){if(!r.value?.trim())throw Error(`[AttributeBuilder] Option in "${e}" has an empty or missing value.`);if(!r.label?.trim())throw Error(`[AttributeBuilder] Option "${r.value}" in "${e}" has an empty or missing label.`);if(n.has(r.value))throw Error(`[AttributeBuilder] Duplicate option value "${r.value}" in "${e}".`);n.add(r.value)}for(let n of t){if(n.inverse===void 0)continue;let r=t.find(e=>e.value===n.inverse);if(!r)throw Error(`[AttributeBuilder] Option "${n.value}" in "${e}" has inverse "${n.inverse}" which does not match any option value.`);if(r.inverse!==n.value)throw Error(`[AttributeBuilder] Inverse mismatch in "${e}": "${n.value}" points to "${n.inverse}", but "${n.inverse}" points to "${r.inverse??`(none)`}". Inverse pairs must be symmetric.`)}}var ComputedFormulaParseError=class extends Error{constructor(e){super(e),this.name=`ComputedFormulaParseError`}};function parseComputedFormula(e){let t=new Parser(tokenize(e)),n=t.parseExpression();return t.expectEnd(),n}function tokenize(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===` `||r===` `||r===`
12
12
  `||r===`\r`){n+=1;continue}if(r===`"`||r===`'`){let i=scanString(e,n,r);t.push({kind:`string`,value:i.value,position:n}),n=i.nextIndex;continue}if(isDigit(r)){let r=scanNumber(e,n);t.push({kind:`number`,value:r.value,position:n}),n=r.nextIndex;continue}if(isIdentifierStart(r)){let r=scanIdentifier(e,n),i=r.value.toLowerCase();i===`true`?t.push({kind:`boolean`,value:!0,position:n}):i===`false`?t.push({kind:`boolean`,value:!1,position:n}):i===`null`?t.push({kind:`null`,position:n}):t.push({kind:`identifier`,value:r.value,position:n}),n=r.nextIndex;continue}let i=e.slice(n,n+2);if(i===`>=`||i===`<=`||i===`==`||i===`!=`){t.push({kind:`operator`,value:i,position:n}),n+=2;continue}if(r===`>`||r===`<`||r===`+`||r===`-`||r===`*`||r===`/`){t.push({kind:`operator`,value:r,position:n}),n+=1;continue}if(r===`(`||r===`)`||r===`,`||r===`.`){t.push({kind:`punctuation`,value:r,position:n}),n+=1;continue}throw new ComputedFormulaParseError(`Unexpected character "${r}" at position ${n}`)}return t}function scanString(e,t,n=`"`){let r=``,i=t+1;for(;i<e.length;){let t=e[i];if(t===n)return{value:r,nextIndex:i+1};if(t===`\\`){let t=e[i+1];if(t===void 0)throw new ComputedFormulaParseError(`Unterminated string literal at position ${i}`);r+=decodeEscape(t,i),i+=2;continue}r+=t,i+=1}throw new ComputedFormulaParseError(`Unterminated string literal at position ${t}`)}function decodeEscape(e,t){switch(e){case`"`:case`\\`:return e;case`n`:return`
13
- `;case`r`:return`\r`;case`t`:return` `;default:throw new ComputedFormulaParseError(`Unknown escape sequence "\\${e}" at position ${t}`)}}function scanNumber(e,t){let n=t;for(;n<e.length&&isDigit(e[n]);)n+=1;if(e[n]===`.`){let t=n;if(n+=1,!isDigit(e[n]))throw new ComputedFormulaParseError(`Invalid number literal at position ${t}`);for(;n<e.length&&isDigit(e[n]);)n+=1}let r=e.slice(t,n),i=Number(r);if(!Number.isFinite(i))throw new ComputedFormulaParseError(`Invalid number literal "${r}"`);return{value:i,nextIndex:n}}function scanIdentifier(e,t){let n=t+1;for(;n<e.length&&isIdentifierPart(e[n]);)n+=1;return{value:e.slice(t,n),nextIndex:n}}function isDigit(e){return e!==void 0&&e>=`0`&&e<=`9`}function isIdentifierStart(e){return e!==void 0&&/[A-Za-z_]/.test(e)}function isIdentifierPart(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}var Parser=class{constructor(e){this.tokens=e,this.position=0}parseExpression(){return this.parseBinaryExpression(0)}expectEnd(){let e=this.peek();if(e!==void 0)throw new ComputedFormulaParseError(`Unexpected token ${describeToken(e)} at position ${e.position}`)}parseBinaryExpression(e){let t=this.parsePrimary();for(;;){let n=this.peek();if(n?.kind!==`operator`)return t;let r=getOperatorPrecedence(n.value);if(r<e)return t;let i=n.value;this.consume();let a=this.parseBinaryExpression(r+1);t={kind:`binary`,operator:i,left:t,right:a}}}parsePrimary(){let e=this.consume();if(e===void 0)throw new ComputedFormulaParseError(`Unexpected end of expression`);switch(e.kind){case`string`:case`number`:case`boolean`:return{kind:`literal`,value:e.value};case`null`:return{kind:`literal`,value:null};case`identifier`:return this.parseIdentifier(e.value);case`punctuation`:if(e.value===`(`){let e=this.parseExpression();return this.expectPunctuation(`)`),e}break;case`operator`:if(e.value===`-`){let e=this.consume();if(e?.kind===`number`)return{kind:`literal`,value:-e.value}}}throw new ComputedFormulaParseError(`Expected literal, path, call, or parenthesized expression at position ${e.position}`)}parseIdentifier(e){if(this.matchPunctuation(`(`)){let t=[];if(!this.matchPunctuation(`)`)){do t.push(this.parseExpression());while(this.matchPunctuation(`,`));this.expectPunctuation(`)`)}return{kind:`call`,functionName:e.toLowerCase(),args:t}}let t=[e];for(;this.matchPunctuation(`.`);){let e=this.consume();if(e?.kind!==`identifier`)throw new ComputedFormulaParseError(`Expected attribute name after path separator at position ${e?.position??this.previousPosition()}`);t.push(e.value)}return{kind:`path`,parts:t}}expectPunctuation(e){if(!this.matchPunctuation(e))throw new ComputedFormulaParseError(`Expected "${e}" at position ${this.peek()?.position??this.previousPosition()}`)}matchPunctuation(e){let t=this.peek();return t?.kind===`punctuation`&&t.value===e&&(this.consume(),!0)}peek(){return this.tokens[this.position]}consume(){let e=this.tokens[this.position];return this.position+=1,e}previousPosition(){return this.tokens[this.position-1]?.position??0}};function describeToken(e){switch(e.kind){case`identifier`:case`number`:case`string`:case`boolean`:case`operator`:case`punctuation`:return`"${String(e.value)}"`;case`null`:return`"null"`;default:return e}}function getOperatorPrecedence(e){switch(e){case`*`:case`/`:return 3;case`+`:case`-`:return 2;case`>`:case`<`:case`>=`:case`<=`:case`==`:case`!=`:return 1;default:return e}}const S=s.z.object({placeholder:s.z.string().optional(),description:s.z.string().optional(),defaultValue:s.z.unknown().optional(),icon:s.z.string().optional(),order:s.z.number().int().optional(),hidden:s.z.boolean().optional(),archived:s.z.boolean().optional(),deprecated:s.z.boolean().optional(),metadata:s.z.record(s.z.string(),s.z.unknown()).optional()}),C=[`placeholder`,`description`,`defaultValue`,`icon`,`order`,`hidden`,`archived`,`deprecated`,`metadata`];function refuseForeignKeys(e,t,n=[]){let r=new Set(n);return function refuse(n,i,a,o=[]){let s=e[n];if(s!==void 0&&i!==void 0)for(let e of Object.keys(i))s.has(e)||r.has(e)||a.addIssue({code:`custom`,path:[...o,e],message:`"${e}" is not a ${n} ${t}; keys of ${n}: ${[...s].join(`, `)}`})}}const w=s.z.object({value:s.z.string().min(1).describe(`Stored value`),label:s.z.string().min(1).describe(`Label people see`),description:s.z.string().describe(`Extra context`).optional(),inverse:s.z.string().describe(`Paired option's value (symmetric)`).optional(),archived:s.z.boolean().describe(`Hides without deleting`).optional()}),T=s.z.enum([`idle`,`in_progress`,`finished`]).describe(`Workflow stage`),E=w.extend({color:g}).strict(),D=E,O=w.extend({color:g,group:T}).strict(),k=w.extend({color:s.z.string().optional().describe(`A color id`),group:T.optional()}).strict(),A=s.z.array(k).min(1).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`});function writeOptionsArraySchema(e){return s.z.array(e).min(1).max(h.optionsPerAttribute).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`})}const j=writeOptionsArraySchema(E),M=writeOptionsArraySchema(D),N=writeOptionsArraySchema(O),ie=s.z.object({object:s.z.string().min(1).describe(`Target object`),displayTemplate:s.z.string().optional().describe(`Linked record label template`),filter:s.z.record(s.z.string(),s.z.unknown()).optional().describe(`Restricts linkable records`)}),ae=s.z.object({object:s.z.string().min(1).describe(`Other side's object`),attribute:s.z.string().min(1).describe(`Other side's attribute`),cardinality:s.z.enum([`one`,`many`]).optional().describe(`Other side's cardinality`),label:s.z.string().min(1).optional().describe(`Other side's label`),storageOwner:s.z.boolean().optional().describe(`Owns the join storage`)}),P=s.z.object({objectName:s.z.string().min(1).describe(`API name of the object whose options are mirrored`),attributeName:s.z.string().min(1).describe(`API name of the select/status attribute to mirror options from`),attributeId:s.z.string().optional().describe(`Id of the source attribute, resolved by the server`)}),F=S.extend({multiline:s.z.boolean().describe(`Renders as a multi-line textarea`).optional(),minLength:s.z.number().int().min(0).describe(`Minimum character count`).optional(),maxLength:s.z.number().int().min(1).describe(`Maximum character count`).optional(),pattern:s.z.string().describe(`Regular expression the value must match`).optional(),format:s.z.enum([`email`,`url`,`slug`]).describe(`Validates and renders as this format`).optional()}),oe=S,I=S.extend({renderAs:s.z.enum([`number`,`rating`]).describe(`Plain number or a star rating`).optional(),min:s.z.number().describe(`Minimum allowed value`).optional(),max:s.z.number().describe(`Maximum allowed value`).optional(),unit:s.z.enum([`integer`,`decimal`,`percentage`]).describe(`How the value is stored and rendered`).optional(),decimals:s.z.number().int().min(0).max(10).describe(`Decimal places shown`).optional()}),L=S,R=S.extend({dateFormat:s.z.enum([`short`,`long`,`full`,`relative`]).describe(`How the date is rendered`).optional(),minDate:s.z.string().describe(`Earliest allowed date (ISO)`).optional(),maxDate:s.z.string().describe(`Latest allowed date (ISO)`).optional(),includeTime:s.z.boolean().describe(`Also captures a time of day`).optional(),endDate:s.z.boolean().describe(`Paired with another date attribute as a range's end`).optional(),timeFormat:s.z.enum([`12h`,`24h`]).describe(`Clock format when a time is included`).optional()}),z=S.extend({defaultCountryCode:s.z.string().length(3).describe(`ISO country code preselected in the dialer`).optional()}),B=S.extend({defaultCurrency:s.z.string().length(3).describe(`ISO currency code preselected for new values`).optional(),allowedCurrencies:s.z.array(s.z.string().length(3)).describe(`ISO currency codes a value may use; any currency when omitted`).optional(),allowNegative:s.z.boolean().describe(`Whether a negative amount is accepted`).optional()}),V=S.extend({options:A.describe(`The workflow statuses, in order`)}),H=S.extend({granularity:s.z.enum([`full`,`address`,`city`,`state`,`country`,`coordinates`]).describe(`How precise a location must be captured`).optional(),defaultCountry:s.z.string().length(3).describe(`ISO country code preselected for new values`).optional(),allowedCountries:s.z.array(s.z.string().length(3)).describe(`ISO country codes a value may use; any country when omitted`).optional()}),U=S.extend({options:A.describe(`Options`),renderAs:s.z.literal(`badges`).optional().describe(`Renders the chosen option as a colored badge`)}),W=S.extend({options:A.describe(`Options`),renderAs:s.z.literal(`badges`).optional().describe(`Renders the chosen options as colored badges`)}),se=S.extend({types:s.z.array(s.z.enum([`user`,`agent`])).min(1).optional().describe(`Which kinds of actor can be picked; both when omitted`),multiple:s.z.boolean().optional().describe(`Whether more than one actor can be picked`)}),G={name:x.describe(`Property API name`),label:s.z.string().min(1).describe(`Label people see`),required:s.z.boolean().describe(`Required on every edge`).optional()},ce={id:s.z.string().optional(),objectId:s.z.string().optional(),system:s.z.boolean().optional(),unique:s.z.boolean().optional()},le=Object.fromEntries(C.map(e=>[e,!0])),K=[`text`,`number`,`checkbox`,`date`,`phone`,`currency`,`location`],q=[...K,`select`,`multiselect`,`status`],J={text:F,number:I,checkbox:L,date:R,phone:z,currency:B,location:H,select:U,multiselect:W,status:V},ue={...J,select:U.extend({options:j.describe(`Options`)}),multiselect:W.extend({options:M.describe(`Options`)}),status:V.extend({options:N.describe(`Statuses`)})},propertyWireConfigShapeFor=e=>ue[e].omit(le).shape,storedPropertyMember=e=>s.z.object({...G,...ce,type:s.z.literal(e).describe(`Property type`),...J[e].shape}).strip(),Y=s.z.discriminatedUnion(`type`,q.map(storedPropertyMember)),X=s.z.object({definitions:s.z.array(Y).min(1).max(h.optionsPerAttribute).describe(`Edge properties`)}).strip().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),de=refuseForeignKeys(Object.fromEntries(q.map(e=>[e,new Set(Object.keys(propertyWireConfigShapeFor(e)))])),`property key`,[...Object.keys(G),`type`]);function refuseForeignPropertyKeys(e,t){de(e.type,e,t)}const Z=K.reduce((e,t)=>(Object.assign(e,propertyWireConfigShapeFor(t)),e),{}),optionPropertyWireMember=e=>s.z.object({...G,type:e.length===1?s.z.literal(e[0]).describe(`Property type`):s.z.enum(e).describe(`Property type`),...propertyWireConfigShapeFor(e[0])}).strict(),Q=s.z.discriminatedUnion(`type`,[optionPropertyWireMember([`select`,`multiselect`]),optionPropertyWireMember([`status`]),s.z.object({...G,type:s.z.enum(K).describe(`Property type`),...Z}).strict().superRefine(refuseForeignPropertyKeys)]),fe=s.z.object({definitions:s.z.array(Q).min(1).max(h.optionsPerAttribute).describe(`Edge properties`)}).strict().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),pe=S.extend({targets:s.z.array(ie).min(1).describe(`Target object(s)`),cardinality:s.z.enum([`one`,`many`]).describe(`one or many`),maxItems:s.z.number().int().min(1).optional().describe(`Max linked records`),bilateral:ae.optional().describe(`Syncs the other side's attribute`),properties:X.optional()}),me=S.extend({expression:s.z.string().min(1).superRefine((e,t)=>{try{parseComputedFormula(e)}catch(e){t.addIssue({code:s.z.ZodIssueCode.custom,message:e instanceof Error?e.message:`Invalid formula expression`})}}).describe(`The formula expression, compiled against this object's attributes`),returnType:s.z.enum([`text`,`number`,`boolean`,`date`,`select`,`multiselect`]).describe(`The formula's result type`),decimals:s.z.number().int().min(0).max(10).optional().describe(`Decimal places shown for a number result`),allowRelations:s.z.boolean().optional().describe(`Whether the expression may read across a relation`),optionsSource:P.optional().describe(`Mirrors an option set`)}),he=S.extend({relationAttribute:s.z.string().min(1).optional().describe(`API name of the relation this rollup aggregates through`),relationPath:s.z.string().optional().describe(`Not supported yet — single-hop only`),targetAttribute:s.z.string().min(1).optional().describe(`API name of the attribute aggregated on the relation's target object; not read by count`),function:s.z.enum([`sum`,`avg`,`earliest`,`latest`,`count`,`countValues`,`countUniqueValues`,`countEmpty`,`percentEmpty`,`percentNotEmpty`,`original`]).describe(`The aggregation applied across the linked records`),decimals:s.z.number().int().min(0).max(10).optional().describe(`Decimal places shown for a numeric result`),targetAttributeType:s.z.string().optional().describe(`Server-set`),targetAttributeOptions:s.z.array(k).optional().describe(`Server-set`),targetCurrencyCode:s.z.string().length(3).optional().describe(`Server-set`),optionsSource:P.optional().describe(`Mirrors an option set`)});function rollupTargetIssue(e,t){if(e===`rollup`&&t.function!==`count`&&t.targetAttribute===void 0)return{path:[`targetAttribute`],message:`targetAttribute is required for a "${String(t.function)}" rollup`}}const $={text:F,richtext:oe,number:I,checkbox:L,date:R,phone:z,currency:B,status:V,location:H,select:U,multiselect:W,user:se,relation:pe,formula:me,rollup:he,document:S.extend({properties:X.optional(),accepts:s.z.array(s.z.string().min(1)).optional().describe("MIME prefixes or globs a file must match (e.g. `image/*`, `*.pdf`)"),maxFileSize:s.z.number().int().min(1).optional().describe(`Maximum file size in bytes`)})};function getAttributeConfigSchema(e){let t=$[e];if(!t)throw new o.ValidationError(`Unsupported attribute type: ${e}`,[]);return t}function parseAttributeConfig(e,t){let n=getAttributeConfigSchema(e).strip().parse(t),r=rollupTargetIssue(e,n);if(r)throw validationErrorFromIssues([r]);return n}function getAttributeConfigWriteSchema(e){let t=getAttributeConfigSchema(e).extend({icon:_.optional()});switch(e){case`select`:return t.extend({options:j.describe(`Options`)});case`multiselect`:return t.extend({options:M.describe(`Options`)});case`status`:return t.extend({options:N.describe(`Statuses`)});default:return t}}function validationErrorFromIssues(e){return o.ValidationError.fromZodErrors(e.map(e=>({path:e.path.map(e=>typeof e==`symbol`?String(e):e),message:e.message})))}function parseWriteSchema(e,t){let n=getAttributeConfigWriteSchema(e).strip().safeParse(t);if(!n.success)throw validationErrorFromIssues(n.error.issues);let r=rollupTargetIssue(e,n.data);if(r)throw validationErrorFromIssues([r]);return n.data}function parseAttributeConfigForCreate(e,t){return parseWriteSchema(e,t)}function validatePatchedIcon(e){if(!Object.prototype.hasOwnProperty.call(e,`icon`))return;let t=_.optional().safeParse(e.icon);if(!t.success)throw o.ValidationError.fromZodErrors(t.error.issues.map(e=>({path:[`icon`,...e.path.map(e=>typeof e==`symbol`?String(e):e)],message:e.message})))}function isSelectLike(e){return e===`select`||e===`multiselect`||e===`status`}function parseAttributeConfigForUpdate(e,t){let n=Object.prototype.hasOwnProperty.call(t,`options`),r=Object.prototype.hasOwnProperty.call(t,`icon`),i={...e,...t};if(validatePatchedIcon(t),n){let{icon:t,...n}=i,a=parseWriteSchema(e.type,r?i:n);return!r&&t!==void 0&&(a.icon=t),a}let a=e.options;isSelectLike(e.type)&&(i.options=[{value:`__legacy__`,label:`__legacy__`}]);let o=getAttributeConfigSchema(e.type).strip().safeParse(i);if(!o.success)throw validationErrorFromIssues(o.error.issues);let s=o.data;return isSelectLike(e.type)&&(s.options=a),s}Object.defineProperty(exports,"A",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return validateAttributeName}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return validateOptions}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return validateObjectName}}),Object.defineProperty(exports,"F",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"I",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"L",{enumerable:!0,get:function(){return parseResourceVisibility}}),Object.defineProperty(exports,"M",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"N",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"O",{enumerable:!0,get:function(){return validateViewName}}),Object.defineProperty(exports,"P",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"R",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return assertUniqueBy}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return validateLabel}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return getAttributeConfigWriteSchema}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return parseAttributeConfigForCreate}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return getAttributeConfigSchema}}),Object.defineProperty(exports,"j",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"k",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return parseAttributeConfigForUpdate}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return refuseForeignKeys}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return parseAttributeConfig}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return ComputedFormulaParseError}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return validateIconName}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return parseComputedFormula}}),Object.defineProperty(exports,"z",{enumerable:!0,get:function(){return isNativeObjectName}});
13
+ `;case`r`:return`\r`;case`t`:return` `;default:throw new ComputedFormulaParseError(`Unknown escape sequence "\\${e}" at position ${t}`)}}function scanNumber(e,t){let n=t;for(;n<e.length&&isDigit(e[n]);)n+=1;if(e[n]===`.`){let t=n;if(n+=1,!isDigit(e[n]))throw new ComputedFormulaParseError(`Invalid number literal at position ${t}`);for(;n<e.length&&isDigit(e[n]);)n+=1}let r=e.slice(t,n),i=Number(r);if(!Number.isFinite(i))throw new ComputedFormulaParseError(`Invalid number literal "${r}"`);return{value:i,nextIndex:n}}function scanIdentifier(e,t){let n=t+1;for(;n<e.length&&isIdentifierPart(e[n]);)n+=1;return{value:e.slice(t,n),nextIndex:n}}function isDigit(e){return e!==void 0&&e>=`0`&&e<=`9`}function isIdentifierStart(e){return e!==void 0&&/[A-Za-z_]/.test(e)}function isIdentifierPart(e){return e!==void 0&&/[A-Za-z0-9_]/.test(e)}var Parser=class{constructor(e){this.tokens=e,this.position=0}parseExpression(){return this.parseBinaryExpression(0)}expectEnd(){let e=this.peek();if(e!==void 0)throw new ComputedFormulaParseError(`Unexpected token ${describeToken(e)} at position ${e.position}`)}parseBinaryExpression(e){let t=this.parsePrimary();for(;;){let n=this.peek();if(n?.kind!==`operator`)return t;let r=getOperatorPrecedence(n.value);if(r<e)return t;let i=n.value;this.consume();let a=this.parseBinaryExpression(r+1);t={kind:`binary`,operator:i,left:t,right:a}}}parsePrimary(){let e=this.consume();if(e===void 0)throw new ComputedFormulaParseError(`Unexpected end of expression`);switch(e.kind){case`string`:case`number`:case`boolean`:return{kind:`literal`,value:e.value};case`null`:return{kind:`literal`,value:null};case`identifier`:return this.parseIdentifier(e.value);case`punctuation`:if(e.value===`(`){let e=this.parseExpression();return this.expectPunctuation(`)`),e}break;case`operator`:if(e.value===`-`){let e=this.consume();if(e?.kind===`number`)return{kind:`literal`,value:-e.value}}}throw new ComputedFormulaParseError(`Expected literal, path, call, or parenthesized expression at position ${e.position}`)}parseIdentifier(e){if(this.matchPunctuation(`(`)){let t=[];if(!this.matchPunctuation(`)`)){do t.push(this.parseExpression());while(this.matchPunctuation(`,`));this.expectPunctuation(`)`)}return{kind:`call`,functionName:e.toLowerCase(),args:t}}let t=[e];for(;this.matchPunctuation(`.`);){let e=this.consume();if(e?.kind!==`identifier`)throw new ComputedFormulaParseError(`Expected attribute name after path separator at position ${e?.position??this.previousPosition()}`);t.push(e.value)}return{kind:`path`,parts:t}}expectPunctuation(e){if(!this.matchPunctuation(e))throw new ComputedFormulaParseError(`Expected "${e}" at position ${this.peek()?.position??this.previousPosition()}`)}matchPunctuation(e){let t=this.peek();return t?.kind===`punctuation`&&t.value===e&&(this.consume(),!0)}peek(){return this.tokens[this.position]}consume(){let e=this.tokens[this.position];return this.position+=1,e}previousPosition(){return this.tokens[this.position-1]?.position??0}};function describeToken(e){switch(e.kind){case`identifier`:case`number`:case`string`:case`boolean`:case`operator`:case`punctuation`:return`"${String(e.value)}"`;case`null`:return`"null"`;default:return e}}function getOperatorPrecedence(e){switch(e){case`*`:case`/`:return 3;case`+`:case`-`:return 2;case`>`:case`<`:case`>=`:case`<=`:case`==`:case`!=`:return 1;default:return e}}const S=s.z.object({placeholder:s.z.string().optional(),description:s.z.string().optional(),defaultValue:s.z.unknown().optional(),icon:s.z.string().optional(),order:s.z.number().int().optional(),hidden:s.z.boolean().optional(),archived:s.z.boolean().optional(),deprecated:s.z.boolean().optional(),metadata:s.z.record(s.z.string(),s.z.unknown()).optional()}),C=[`placeholder`,`description`,`defaultValue`,`icon`,`order`,`hidden`,`archived`,`deprecated`,`metadata`];function refuseForeignKeys(e,t,n=[]){let r=new Set(n);return function refuse(n,i,a,o=[]){let s=e[n];if(s!==void 0&&i!==void 0)for(let e of Object.keys(i))s.has(e)||r.has(e)||a.addIssue({code:`custom`,path:[...o,e],message:`"${e}" is not a ${n} ${t}; keys of ${n}: ${[...s].join(`, `)}`})}}const w=s.z.object({value:s.z.string().min(1).describe(`Stored value`),label:s.z.string().min(1).describe(`Label people see`),description:s.z.string().describe(`Extra context`).optional(),inverse:s.z.string().describe(`Paired option's value (symmetric)`).optional(),archived:s.z.boolean().describe(`Hides without deleting`).optional()}),T=s.z.enum([`idle`,`in_progress`,`finished`]).describe(`Workflow stage`),E=w.extend({color:g}).strict(),D=E,O=w.extend({color:g,group:T}).strict(),k=w.extend({color:s.z.string().optional().describe(`A color id`),group:T.optional()}).strict(),A=s.z.array(k).min(1).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`});function writeOptionsArraySchema(e){return s.z.array(e).min(1).max(h.optionsPerAttribute).refine(e=>{let t=e.map(e=>e.value);return new Set(t).size===t.length},{message:`Duplicate option values are not allowed`})}const j=writeOptionsArraySchema(E),M=writeOptionsArraySchema(D),N=writeOptionsArraySchema(O),ie=s.z.object({object:s.z.string().min(1).describe(`Target object`),displayTemplate:s.z.string().optional().describe(`Linked record label template`),filter:s.z.record(s.z.string(),s.z.unknown()).optional().describe(`Restricts linkable records`)}),ae=s.z.object({object:s.z.string().min(1).describe(`Other side's object`),attribute:s.z.string().min(1).describe(`Other side's attribute`),cardinality:s.z.enum([`one`,`many`]).optional().describe(`Other side's cardinality`),label:s.z.string().min(1).optional().describe(`Other side's label`),storageOwner:s.z.boolean().optional().describe(`Owns the join storage`)}),P=s.z.object({objectName:s.z.string().min(1).describe(`API name of the object whose options are mirrored`),attributeName:s.z.string().min(1).describe(`API name of the select/status attribute to mirror options from`),attributeId:s.z.string().optional().describe(`Id of the source attribute, resolved by the server`)}),F=S.extend({multiline:s.z.boolean().describe(`Renders as a multi-line textarea`).optional(),minLength:s.z.number().int().min(0).describe(`Minimum character count`).optional(),maxLength:s.z.number().int().min(1).describe(`Maximum character count`).optional(),pattern:s.z.string().describe(`Regular expression the value must match`).optional(),format:s.z.enum([`email`,`url`,`slug`]).describe(`Validates and renders as this format`).optional()}),oe=S,I=S.extend({renderAs:s.z.enum([`number`,`rating`]).describe(`Plain number or a star rating`).optional(),min:s.z.number().describe(`Minimum allowed value`).optional(),max:s.z.number().describe(`Maximum allowed value`).optional(),unit:s.z.enum([`integer`,`decimal`,`percentage`]).describe(`How the value is stored and rendered`).optional(),decimals:s.z.number().int().min(0).max(10).describe(`Decimal places shown`).optional()}),L=S,R=S.extend({dateFormat:s.z.enum([`short`,`long`,`full`,`relative`]).describe(`How the date is rendered`).optional(),minDate:s.z.string().describe(`Earliest allowed date (ISO)`).optional(),maxDate:s.z.string().describe(`Latest allowed date (ISO)`).optional(),includeTime:s.z.boolean().describe(`Also captures a time of day`).optional(),endDate:s.z.boolean().describe(`Paired with another date attribute as a range's end`).optional(),timeFormat:s.z.enum([`12h`,`24h`]).describe(`Clock format when a time is included`).optional()}),z=S.extend({defaultCountryCode:s.z.string().length(3).describe(`ISO country code preselected in the dialer`).optional()}),B=S.extend({defaultCurrency:s.z.string().length(3).describe(`ISO currency code preselected for new values`).optional(),allowedCurrencies:s.z.array(s.z.string().length(3)).describe(`ISO currency codes a value may use; any currency when omitted`).optional(),allowNegative:s.z.boolean().describe(`Whether a negative amount is accepted`).optional()}),V=S.extend({options:A.describe(`The workflow statuses, in order`)}),H=S.extend({granularity:s.z.enum([`full`,`address`,`city`,`state`,`country`,`coordinates`]).describe(`How precise a location must be captured`).optional(),defaultCountry:s.z.string().length(3).describe(`ISO country code preselected for new values`).optional(),allowedCountries:s.z.array(s.z.string().length(3)).describe(`ISO country codes a value may use; any country when omitted`).optional()}),U=S.extend({options:A.describe(`Options`),renderAs:s.z.literal(`badges`).optional().describe(`Renders the chosen option as a colored badge`)}),W=S.extend({options:A.describe(`Options`),renderAs:s.z.literal(`badges`).optional().describe(`Renders the chosen options as colored badges`)}),se=S.extend({types:s.z.array(s.z.enum([`user`,`agent`])).min(1).optional().describe(`Which kinds of actor can be picked; both when omitted`),multiple:s.z.boolean().optional().describe(`Whether more than one actor can be picked`)}),G={name:x.describe(`Property API name`),label:s.z.string().min(1).describe(`Label people see`),required:s.z.boolean().describe(`Required on every edge`).optional()},ce={id:s.z.string().optional(),objectId:s.z.string().optional(),system:s.z.boolean().optional(),unique:s.z.boolean().optional()},le=Object.fromEntries(C.map(e=>[e,!0])),K=[`text`,`number`,`checkbox`,`date`,`phone`,`currency`,`location`],q=[...K,`select`,`multiselect`,`status`],J={text:F,number:I,checkbox:L,date:R,phone:z,currency:B,location:H,select:U,multiselect:W,status:V},ue={...J,select:U.extend({options:j.describe(`Options`)}),multiselect:W.extend({options:M.describe(`Options`)}),status:V.extend({options:N.describe(`Statuses`)})},propertyWireConfigShapeFor=e=>ue[e].omit(le).shape,storedPropertyMember=e=>s.z.object({...G,...ce,type:s.z.literal(e).describe(`Property type`),...J[e].shape}).strip(),Y=s.z.discriminatedUnion(`type`,q.map(storedPropertyMember)),X=s.z.object({definitions:s.z.array(Y).min(1).max(h.optionsPerAttribute).describe(`Edge properties`)}).strip().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),de=refuseForeignKeys(Object.fromEntries(q.map(e=>[e,new Set(Object.keys(propertyWireConfigShapeFor(e)))])),`property key`,[...Object.keys(G),`type`]);function refuseForeignPropertyKeys(e,t){de(e.type,e,t)}const Z=K.reduce((e,t)=>(Object.assign(e,propertyWireConfigShapeFor(t)),e),{}),optionPropertyWireMember=e=>s.z.object({...G,type:e.length===1?s.z.literal(e[0]).describe(`Property type`):s.z.enum(e).describe(`Property type`),...propertyWireConfigShapeFor(e[0])}).strict(),Q=s.z.discriminatedUnion(`type`,[optionPropertyWireMember([`select`,`multiselect`]),optionPropertyWireMember([`status`]),s.z.object({...G,type:s.z.enum(K).describe(`Property type`),...Z}).strict().superRefine(refuseForeignPropertyKeys)]),fe=s.z.object({definitions:s.z.array(Q).min(1).max(h.optionsPerAttribute).describe(`Edge properties`)}).strict().describe(`Properties carried by the edge itself (role, share, since…), never a third object`),pe=S.extend({targets:s.z.array(ie).min(1).describe(`Target object(s)`),cardinality:s.z.enum([`one`,`many`]).describe(`one or many`),maxItems:s.z.number().int().min(1).optional().describe(`Max linked records`),bilateral:ae.optional().describe(`Syncs the other side's attribute`),properties:X.optional()}),me=S.extend({expression:s.z.string().min(1).superRefine((e,t)=>{try{parseComputedFormula(e)}catch(e){t.addIssue({code:s.z.ZodIssueCode.custom,message:e instanceof Error?e.message:`Invalid formula expression`})}}).describe(`The formula expression, compiled against this object's attributes`),returnType:s.z.enum([`text`,`number`,`boolean`,`date`,`select`,`multiselect`]).describe(`The formula's result type`),decimals:s.z.number().int().min(0).max(10).optional().describe(`Decimal places shown for a number result`),currencyCode:s.z.string().length(3).optional().describe(`ISO 4217 code a number result renders with; presentation only`),allowRelations:s.z.boolean().optional().describe(`Whether the expression may read across a relation`),optionsSource:P.optional().describe(`Mirrors an option set`)}),he=S.extend({relationAttribute:s.z.string().min(1).optional().describe(`API name of the relation this rollup aggregates through`),relationPath:s.z.string().optional().describe(`Not supported yet — single-hop only`),targetAttribute:s.z.string().min(1).optional().describe(`API name of the attribute aggregated on the relation's target object; not read by count`),function:s.z.enum([`sum`,`avg`,`earliest`,`latest`,`count`,`countValues`,`countUniqueValues`,`countEmpty`,`percentEmpty`,`percentNotEmpty`,`original`]).describe(`The aggregation applied across the linked records`),decimals:s.z.number().int().min(0).max(10).optional().describe(`Decimal places shown for a numeric result`),targetAttributeType:s.z.string().optional().describe(`Server-set`),targetAttributeOptions:s.z.array(k).optional().describe(`Server-set`),targetCurrencyCode:s.z.string().length(3).optional().describe(`Server-set`),optionsSource:P.optional().describe(`Mirrors an option set`)});function rollupTargetIssue(e,t){if(e===`rollup`&&t.function!==`count`&&t.targetAttribute===void 0)return{path:[`targetAttribute`],message:`targetAttribute is required for a "${String(t.function)}" rollup`}}const $={text:F,richtext:oe,number:I,checkbox:L,date:R,phone:z,currency:B,status:V,location:H,select:U,multiselect:W,user:se,relation:pe,formula:me,rollup:he,document:S.extend({properties:X.optional(),accepts:s.z.array(s.z.string().min(1)).optional().describe("MIME prefixes or globs a file must match (e.g. `image/*`, `*.pdf`)"),maxFileSize:s.z.number().int().min(1).optional().describe(`Maximum file size in bytes`)})};function getAttributeConfigSchema(e){let t=$[e];if(!t)throw new o.ValidationError(`Unsupported attribute type: ${e}`,[]);return t}function parseAttributeConfig(e,t){let n=getAttributeConfigSchema(e).strip().parse(t),r=rollupTargetIssue(e,n);if(r)throw validationErrorFromIssues([r]);return n}function getAttributeConfigWriteSchema(e){let t=getAttributeConfigSchema(e).extend({icon:_.optional()});switch(e){case`select`:return t.extend({options:j.describe(`Options`)});case`multiselect`:return t.extend({options:M.describe(`Options`)});case`status`:return t.extend({options:N.describe(`Statuses`)});default:return t}}function validationErrorFromIssues(e){return o.ValidationError.fromZodErrors(e.map(e=>({path:e.path.map(e=>typeof e==`symbol`?String(e):e),message:e.message})))}function parseWriteSchema(e,t){let n=getAttributeConfigWriteSchema(e).strip().safeParse(t);if(!n.success)throw validationErrorFromIssues(n.error.issues);let r=rollupTargetIssue(e,n.data);if(r)throw validationErrorFromIssues([r]);return n.data}function parseAttributeConfigForCreate(e,t){return parseWriteSchema(e,t)}function validatePatchedIcon(e){if(!Object.prototype.hasOwnProperty.call(e,`icon`))return;let t=_.optional().safeParse(e.icon);if(!t.success)throw o.ValidationError.fromZodErrors(t.error.issues.map(e=>({path:[`icon`,...e.path.map(e=>typeof e==`symbol`?String(e):e)],message:e.message})))}function isSelectLike(e){return e===`select`||e===`multiselect`||e===`status`}function parseAttributeConfigForUpdate(e,t){let n=Object.prototype.hasOwnProperty.call(t,`options`),r=Object.prototype.hasOwnProperty.call(t,`icon`),i={...e,...t};if(validatePatchedIcon(t),n){let{icon:t,...n}=i,a=parseWriteSchema(e.type,r?i:n);return!r&&t!==void 0&&(a.icon=t),a}let a=e.options;isSelectLike(e.type)&&(i.options=[{value:`__legacy__`,label:`__legacy__`}]);let o=getAttributeConfigSchema(e.type).strip().safeParse(i);if(!o.success)throw validationErrorFromIssues(o.error.issues);let s=o.data;return isSelectLike(e.type)&&(s.options=a),s}Object.defineProperty(exports,"A",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return validateAttributeName}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return validateOptions}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return validateObjectName}}),Object.defineProperty(exports,"F",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"I",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"L",{enumerable:!0,get:function(){return parseResourceVisibility}}),Object.defineProperty(exports,"M",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"N",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"O",{enumerable:!0,get:function(){return validateViewName}}),Object.defineProperty(exports,"P",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"R",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return assertUniqueBy}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return validateLabel}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return getAttributeConfigWriteSchema}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return parseAttributeConfigForCreate}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return getAttributeConfigSchema}}),Object.defineProperty(exports,"j",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"k",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return parseAttributeConfigForUpdate}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return refuseForeignKeys}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return parseAttributeConfig}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return ComputedFormulaParseError}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return validateIconName}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return parseComputedFormula}}),Object.defineProperty(exports,"z",{enumerable:!0,get:function(){return isNativeObjectName}});
@@ -1,6 +1,6 @@
1
1
 
2
- import { rt as DateAttribute } from "./exceptions-BCfkN2ct.mjs";
3
- import { r as ValidationMessages } from "./index-DzEWbzP-.mjs";
2
+ import { rt as DateAttribute } from "./exceptions-B3WE8Upv.mjs";
3
+ import { r as ValidationMessages } from "./index-nzT7sEBR.mjs";
4
4
  import { z as z$1 } from "zod";
5
5
  //#region src/validation/primitives/date.d.ts
6
6
  /**
@@ -1,6 +1,6 @@
1
1
 
2
- import { rt as DateAttribute } from "./exceptions-BCfkN2ct.js";
3
- import { r as ValidationMessages } from "./index-DyeLYnEc.js";
2
+ import { rt as DateAttribute } from "./exceptions-B3WE8Upv.js";
3
+ import { r as ValidationMessages } from "./index-D4Fo465g.js";
4
4
  import { z as z$1 } from "zod";
5
5
  //#region src/validation/primitives/date.d.ts
6
6
  /**
@@ -704,6 +704,15 @@ interface FormulaAttribute extends Omit<BaseAttribute<never>, "defaultValue" | "
704
704
  returnType: FormulaReturnType;
705
705
  /** Decimal places for number results */
706
706
  decimals?: number;
707
+ /**
708
+ * ISO 4217 code a `number` result renders with — `123 456 €` instead of
709
+ * `123456` — for a formula over money (#3419). Presentation only: the
710
+ * stored value stays a number, sort, filter and aggregation are untouched,
711
+ * and `returnType` stays `"number"` because that IS what the expression
712
+ * returns. The rollup's `targetCurrencyCode` (#2644), mirrored. Absent →
713
+ * the bare number, exactly as before.
714
+ */
715
+ currencyCode?: CurrencyCode;
707
716
  /** Source attribute for select-like computed options */
708
717
  optionsSource?: ComputedOptionsSource;
709
718
  /** Whether to allow relation references in the expression (e.g., "company.name") */
@@ -704,6 +704,15 @@ interface FormulaAttribute extends Omit<BaseAttribute<never>, "defaultValue" | "
704
704
  returnType: FormulaReturnType;
705
705
  /** Decimal places for number results */
706
706
  decimals?: number;
707
+ /**
708
+ * ISO 4217 code a `number` result renders with — `123 456 €` instead of
709
+ * `123456` — for a formula over money (#3419). Presentation only: the
710
+ * stored value stays a number, sort, filter and aggregation are untouched,
711
+ * and `returnType` stays `"number"` because that IS what the expression
712
+ * returns. The rollup's `targetCurrencyCode` (#2644), mirrored. Absent →
713
+ * the bare number, exactly as before.
714
+ */
715
+ currencyCode?: CurrencyCode;
707
716
  /** Source attribute for select-like computed options */
708
717
  optionsSource?: ComputedOptionsSource;
709
718
  /** Whether to allow relation references in the expression (e.g., "company.name") */
@@ -1,3 +1,3 @@
1
1
 
2
- import { A as StorageError, B as isObjectReferencedError, C as RepositoryOperation, D as SchemaErrorCode, E as SchemaError, F as SystemEntityImmutableError, H as isRecordReferencedError, I as ValidationError, L as ValidationErrorDetail, M as SyncCascadeError, N as SyncConflictError, O as SchemaPlanNotFoundError, P as SyncError, R as isAttributeInUseError, S as RepositoryError, T as RoleNotFoundError, U as isSchemaError, V as isProtectedResourceError, W as isValidationError, _ as ProtectedResourceError, a as ChangeTypeNotSupportedError, b as RecordReference, c as DuplicateError, d as MigrationTimeoutError, f as NotFoundError, g as OrphanSystemAttributeError, h as ObjectReferencedError, i as AttributeUsage, j as StorageOperation, k as SearchBackendError, l as ForbiddenError, m as ObjectNotFoundError, n as AttributeInUseError, o as ConcurrentModificationError, p as NotImplementedError, r as AttributeNotFoundError, s as DestructiveSyncNotAllowedError, t as AccessDeniedError, u as MemoryNotFoundError, v as ProtectedRoleError, w as ReservedObjectNameError, x as RecordReferencedError, y as RecordNotFoundError, z as isNotFoundError } from "./exceptions-BCfkN2ct.mjs";
2
+ import { A as StorageError, B as isObjectReferencedError, C as RepositoryOperation, D as SchemaErrorCode, E as SchemaError, F as SystemEntityImmutableError, H as isRecordReferencedError, I as ValidationError, L as ValidationErrorDetail, M as SyncCascadeError, N as SyncConflictError, O as SchemaPlanNotFoundError, P as SyncError, R as isAttributeInUseError, S as RepositoryError, T as RoleNotFoundError, U as isSchemaError, V as isProtectedResourceError, W as isValidationError, _ as ProtectedResourceError, a as ChangeTypeNotSupportedError, b as RecordReference, c as DuplicateError, d as MigrationTimeoutError, f as NotFoundError, g as OrphanSystemAttributeError, h as ObjectReferencedError, i as AttributeUsage, j as StorageOperation, k as SearchBackendError, l as ForbiddenError, m as ObjectNotFoundError, n as AttributeInUseError, o as ConcurrentModificationError, p as NotImplementedError, r as AttributeNotFoundError, s as DestructiveSyncNotAllowedError, t as AccessDeniedError, u as MemoryNotFoundError, v as ProtectedRoleError, w as ReservedObjectNameError, x as RecordReferencedError, y as RecordNotFoundError, z as isNotFoundError } from "./exceptions-B3WE8Upv.mjs";
3
3
  export { AccessDeniedError, AttributeInUseError, AttributeNotFoundError, AttributeUsage, ChangeTypeNotSupportedError, ConcurrentModificationError, DestructiveSyncNotAllowedError, DuplicateError, ForbiddenError, MemoryNotFoundError, MigrationTimeoutError, NotFoundError, NotImplementedError, ObjectNotFoundError, ObjectReferencedError, OrphanSystemAttributeError, ProtectedResourceError, ProtectedRoleError, RecordNotFoundError, RecordReference, RecordReferencedError, RepositoryError, RepositoryOperation, ReservedObjectNameError, RoleNotFoundError, SchemaError, SchemaErrorCode, SchemaPlanNotFoundError, SearchBackendError, StorageError, StorageOperation, SyncCascadeError, SyncConflictError, SyncError, SystemEntityImmutableError, ValidationError, ValidationErrorDetail, isAttributeInUseError, isNotFoundError, isObjectReferencedError, isProtectedResourceError, isRecordReferencedError, isSchemaError, isValidationError };
@@ -1,3 +1,3 @@
1
1
 
2
- import { A as StorageError, B as isObjectReferencedError, C as RepositoryOperation, D as SchemaErrorCode, E as SchemaError, F as SystemEntityImmutableError, H as isRecordReferencedError, I as ValidationError, L as ValidationErrorDetail, M as SyncCascadeError, N as SyncConflictError, O as SchemaPlanNotFoundError, P as SyncError, R as isAttributeInUseError, S as RepositoryError, T as RoleNotFoundError, U as isSchemaError, V as isProtectedResourceError, W as isValidationError, _ as ProtectedResourceError, a as ChangeTypeNotSupportedError, b as RecordReference, c as DuplicateError, d as MigrationTimeoutError, f as NotFoundError, g as OrphanSystemAttributeError, h as ObjectReferencedError, i as AttributeUsage, j as StorageOperation, k as SearchBackendError, l as ForbiddenError, m as ObjectNotFoundError, n as AttributeInUseError, o as ConcurrentModificationError, p as NotImplementedError, r as AttributeNotFoundError, s as DestructiveSyncNotAllowedError, t as AccessDeniedError, u as MemoryNotFoundError, v as ProtectedRoleError, w as ReservedObjectNameError, x as RecordReferencedError, y as RecordNotFoundError, z as isNotFoundError } from "./exceptions-BCfkN2ct.js";
2
+ import { A as StorageError, B as isObjectReferencedError, C as RepositoryOperation, D as SchemaErrorCode, E as SchemaError, F as SystemEntityImmutableError, H as isRecordReferencedError, I as ValidationError, L as ValidationErrorDetail, M as SyncCascadeError, N as SyncConflictError, O as SchemaPlanNotFoundError, P as SyncError, R as isAttributeInUseError, S as RepositoryError, T as RoleNotFoundError, U as isSchemaError, V as isProtectedResourceError, W as isValidationError, _ as ProtectedResourceError, a as ChangeTypeNotSupportedError, b as RecordReference, c as DuplicateError, d as MigrationTimeoutError, f as NotFoundError, g as OrphanSystemAttributeError, h as ObjectReferencedError, i as AttributeUsage, j as StorageOperation, k as SearchBackendError, l as ForbiddenError, m as ObjectNotFoundError, n as AttributeInUseError, o as ConcurrentModificationError, p as NotImplementedError, r as AttributeNotFoundError, s as DestructiveSyncNotAllowedError, t as AccessDeniedError, u as MemoryNotFoundError, v as ProtectedRoleError, w as ReservedObjectNameError, x as RecordReferencedError, y as RecordNotFoundError, z as isNotFoundError } from "./exceptions-B3WE8Upv.js";
3
3
  export { AccessDeniedError, AttributeInUseError, AttributeNotFoundError, AttributeUsage, ChangeTypeNotSupportedError, ConcurrentModificationError, DestructiveSyncNotAllowedError, DuplicateError, ForbiddenError, MemoryNotFoundError, MigrationTimeoutError, NotFoundError, NotImplementedError, ObjectNotFoundError, ObjectReferencedError, OrphanSystemAttributeError, ProtectedResourceError, ProtectedRoleError, RecordNotFoundError, RecordReference, RecordReferencedError, RepositoryError, RepositoryOperation, ReservedObjectNameError, RoleNotFoundError, SchemaError, SchemaErrorCode, SchemaPlanNotFoundError, SearchBackendError, StorageError, StorageOperation, SyncCascadeError, SyncConflictError, SyncError, SystemEntityImmutableError, ValidationError, ValidationErrorDetail, isAttributeInUseError, isNotFoundError, isObjectReferencedError, isProtectedResourceError, isRecordReferencedError, isSchemaError, isValidationError };
@@ -1,5 +1,5 @@
1
1
 
2
- import { Y as Attribute, Z as AttributeType } from "./exceptions-BCfkN2ct.mjs";
2
+ import { Y as Attribute, Z as AttributeType } from "./exceptions-B3WE8Upv.mjs";
3
3
  import { z as z$1 } from "zod";
4
4
  import { IconName } from "@stndrds/constants";
5
5
  //#region src/types/mutations.d.ts
@@ -1,6 +1,6 @@
1
1
 
2
- import { Jt as Uuid, K as MigrationDefinition, Y as Attribute } from "./exceptions-BCfkN2ct.js";
3
- import { i as ValidationResult, r as ValidationMessages } from "./index-DyeLYnEc.js";
2
+ import { Jt as Uuid, K as MigrationDefinition, Y as Attribute } from "./exceptions-B3WE8Upv.js";
3
+ import { i as ValidationResult, r as ValidationMessages } from "./index-D4Fo465g.js";
4
4
  import { z as z$1 } from "zod";
5
5
  import { IconName } from "@stndrds/constants";
6
6
  //#region src/types/document-layout.d.ts
@@ -1,5 +1,5 @@
1
1
 
2
- import { Y as Attribute } from "./exceptions-BCfkN2ct.js";
2
+ import { Y as Attribute } from "./exceptions-B3WE8Upv.js";
3
3
  import { z as z$1 } from "zod";
4
4
  //#region src/validation/core/types.d.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
1
 
2
- import { Y as Attribute, Z as AttributeType } from "./exceptions-BCfkN2ct.js";
2
+ import { Y as Attribute, Z as AttributeType } from "./exceptions-B3WE8Upv.js";
3
3
  import { z as z$1 } from "zod";
4
4
  import { IconName } from "@stndrds/constants";
5
5
  //#region src/types/mutations.d.ts
@@ -1,6 +1,6 @@
1
1
 
2
- import { Jt as Uuid, K as MigrationDefinition, Y as Attribute } from "./exceptions-BCfkN2ct.mjs";
3
- import { i as ValidationResult, r as ValidationMessages } from "./index-DzEWbzP-.mjs";
2
+ import { Jt as Uuid, K as MigrationDefinition, Y as Attribute } from "./exceptions-B3WE8Upv.mjs";
3
+ import { i as ValidationResult, r as ValidationMessages } from "./index-nzT7sEBR.mjs";
4
4
  import { z as z$1 } from "zod";
5
5
  import { IconName } from "@stndrds/constants";
6
6
  //#region src/types/document-layout.d.ts
@@ -1,5 +1,5 @@
1
1
 
2
- import { Y as Attribute } from "./exceptions-BCfkN2ct.mjs";
2
+ import { Y as Attribute } from "./exceptions-B3WE8Upv.mjs";
3
3
  import { z as z$1 } from "zod";
4
4
  //#region src/validation/core/types.d.ts
5
5
  /**