@dforge-core/metadata 0.0.12 → 0.0.13

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 (111) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/index.d.ts +1221 -28
  3. package/dist/index.js +418 -32
  4. package/dist/index.js.map +1 -1
  5. package/package.json +6 -4
  6. package/schemas/data_views.schema.json +16 -3
  7. package/schemas/folders.schema.json +18 -2
  8. package/schemas/reports.schema.json +18 -2
  9. package/src/filter.ts +35 -3
  10. package/src/index.ts +9 -1
  11. package/dist/actions.d.ts +0 -31
  12. package/dist/actions.d.ts.map +0 -1
  13. package/dist/actions.js +0 -7
  14. package/dist/actions.js.map +0 -1
  15. package/dist/aggregation.d.ts +0 -13
  16. package/dist/aggregation.d.ts.map +0 -1
  17. package/dist/aggregation.js +0 -17
  18. package/dist/aggregation.js.map +0 -1
  19. package/dist/base-datatypes.d.ts +0 -5
  20. package/dist/base-datatypes.d.ts.map +0 -1
  21. package/dist/base-datatypes.js +0 -49
  22. package/dist/base-datatypes.js.map +0 -1
  23. package/dist/column-types.d.ts +0 -5
  24. package/dist/column-types.d.ts.map +0 -1
  25. package/dist/column-types.js +0 -18
  26. package/dist/column-types.js.map +0 -1
  27. package/dist/data-views.d.ts +0 -95
  28. package/dist/data-views.d.ts.map +0 -1
  29. package/dist/data-views.js +0 -18
  30. package/dist/data-views.js.map +0 -1
  31. package/dist/deps.d.ts +0 -55
  32. package/dist/deps.d.ts.map +0 -1
  33. package/dist/deps.js +0 -23
  34. package/dist/deps.js.map +0 -1
  35. package/dist/derive.d.ts +0 -19
  36. package/dist/derive.d.ts.map +0 -1
  37. package/dist/derive.js +0 -68
  38. package/dist/derive.js.map +0 -1
  39. package/dist/domains.d.ts +0 -32
  40. package/dist/domains.d.ts.map +0 -1
  41. package/dist/domains.js +0 -10
  42. package/dist/domains.js.map +0 -1
  43. package/dist/entity-meta.d.ts +0 -18
  44. package/dist/entity-meta.d.ts.map +0 -1
  45. package/dist/entity-meta.js +0 -45
  46. package/dist/entity-meta.js.map +0 -1
  47. package/dist/entity.d.ts +0 -116
  48. package/dist/entity.d.ts.map +0 -1
  49. package/dist/entity.js +0 -7
  50. package/dist/entity.js.map +0 -1
  51. package/dist/field-types.d.ts +0 -287
  52. package/dist/field-types.d.ts.map +0 -1
  53. package/dist/field-types.js +0 -58
  54. package/dist/field-types.js.map +0 -1
  55. package/dist/filter.d.ts +0 -26
  56. package/dist/filter.d.ts.map +0 -1
  57. package/dist/filter.js +0 -7
  58. package/dist/filter.js.map +0 -1
  59. package/dist/folders.d.ts +0 -32
  60. package/dist/folders.d.ts.map +0 -1
  61. package/dist/folders.js +0 -6
  62. package/dist/folders.js.map +0 -1
  63. package/dist/index.d.ts.map +0 -1
  64. package/dist/jobs.d.ts +0 -32
  65. package/dist/jobs.d.ts.map +0 -1
  66. package/dist/jobs.js +0 -3
  67. package/dist/jobs.js.map +0 -1
  68. package/dist/manifest.d.ts +0 -53
  69. package/dist/manifest.d.ts.map +0 -1
  70. package/dist/manifest.js +0 -4
  71. package/dist/manifest.js.map +0 -1
  72. package/dist/menus.d.ts +0 -32
  73. package/dist/menus.d.ts.map +0 -1
  74. package/dist/menus.js +0 -3
  75. package/dist/menus.js.map +0 -1
  76. package/dist/print-templates.d.ts +0 -36
  77. package/dist/print-templates.d.ts.map +0 -1
  78. package/dist/print-templates.js +0 -4
  79. package/dist/print-templates.js.map +0 -1
  80. package/dist/reports.d.ts +0 -84
  81. package/dist/reports.d.ts.map +0 -1
  82. package/dist/reports.js +0 -24
  83. package/dist/reports.js.map +0 -1
  84. package/dist/roles.d.ts +0 -10
  85. package/dist/roles.d.ts.map +0 -1
  86. package/dist/roles.js +0 -3
  87. package/dist/roles.js.map +0 -1
  88. package/dist/seed-data.d.ts +0 -8
  89. package/dist/seed-data.d.ts.map +0 -1
  90. package/dist/seed-data.js +0 -4
  91. package/dist/seed-data.js.map +0 -1
  92. package/dist/settings.d.ts +0 -26
  93. package/dist/settings.d.ts.map +0 -1
  94. package/dist/settings.js +0 -3
  95. package/dist/settings.js.map +0 -1
  96. package/dist/traits.d.ts +0 -14
  97. package/dist/traits.d.ts.map +0 -1
  98. package/dist/traits.js +0 -121
  99. package/dist/traits.js.map +0 -1
  100. package/dist/triggers.d.ts +0 -28
  101. package/dist/triggers.d.ts.map +0 -1
  102. package/dist/triggers.js +0 -3
  103. package/dist/triggers.js.map +0 -1
  104. package/dist/types.d.ts +0 -128
  105. package/dist/types.d.ts.map +0 -1
  106. package/dist/types.js +0 -7
  107. package/dist/types.js.map +0 -1
  108. package/dist/webhooks.d.ts +0 -31
  109. package/dist/webhooks.d.ts.map +0 -1
  110. package/dist/webhooks.js +0 -3
  111. package/dist/webhooks.js.map +0 -1
package/dist/derive.js DELETED
@@ -1,68 +0,0 @@
1
- // Derivation helpers — turn a friendly field-type choice into the physical
2
- // metadata the platform needs, so the author never types a raw SQL type.
3
- //
4
- // Defaults follow how core modules actually author fields (e.g. currency →
5
- // numeric(18,2), color → varchar(20)); callers may always override the result.
6
- import { baseToDbDatatype } from "./base-datatypes";
7
- import { getFieldType } from "./field-types";
8
- /** Total digits used when building a `numeric(total, scale)` type. */
9
- export const NUMERIC_TOTAL = 18;
10
- /** Field types whose natural storage is unbounded `text` rather than `varchar`. */
11
- const TEXT_BACKED = new Set(["textarea", "markdown", "richtext", "code"]);
12
- /**
13
- * Field types the server pins to a fixed column type regardless of their base
14
- * datatype — mirrors `DdlService.ResolveDbTypeFromFieldType`. `file`/`image`
15
- * classify as `binary`, but dForge stores them as a JSON metadata reference
16
- * (`{ storagePath, fileName, … }`), NOT inline `bytea`; the column is `jsonb`.
17
- * Without this override the base path derives `bytea`, and the file-attach
18
- * pipeline — which reads/writes that JSON — fails on save.
19
- */
20
- const DB_DATATYPE_OVERRIDE = {
21
- file: "jsonb",
22
- image: "jsonb",
23
- };
24
- /**
25
- * Derive the PostgreSQL `dbDatatype` for a field type. Returns `null` for
26
- * field types backed by relationships/sets (lookup, grid) that have no physical
27
- * column of their own. Unknown field types fall back to `varchar`.
28
- */
29
- export function deriveDbDatatype(fieldTypeCd, options = {}) {
30
- const ft = getFieldType(fieldTypeCd);
31
- if (!ft)
32
- return "varchar";
33
- // Relationship-backed types (lookup → R, grid → S) never own a physical
34
- // column — the FK lives on a separate hidden column.
35
- if (ft.columnType === "R" || ft.columnType === "S")
36
- return null;
37
- // Server-pinned column types that don't follow the base-datatype path
38
- // (file/image → jsonb, not bytea). Mirrors ResolveDbTypeFromFieldType.
39
- const override = DB_DATATYPE_OVERRIDE[ft.cd];
40
- if (override)
41
- return override;
42
- const base = baseToDbDatatype(ft.baseDatatypeCd);
43
- if (base === null)
44
- return null; // other non-physical base (link/ref/set)
45
- if (ft.baseDatatypeCd === "number") {
46
- const precision = options.precision ?? ft.precision;
47
- return precision != null ? `numeric(${NUMERIC_TOTAL},${precision})` : "numeric";
48
- }
49
- if (ft.baseDatatypeCd === "string") {
50
- if (TEXT_BACKED.has(ft.cd))
51
- return "text";
52
- const maxLen = options.maxLen ?? ft.maxLen;
53
- return maxLen != null ? `varchar(${maxLen})` : "varchar";
54
- }
55
- return base;
56
- }
57
- /** Default `params` to seed a new field of this type with (or `undefined`). */
58
- export function defaultParams(fieldTypeCd) {
59
- const ft = getFieldType(fieldTypeCd);
60
- if (!ft?.defParams)
61
- return undefined;
62
- return { ...ft.defParams };
63
- }
64
- /** The base datatype code a field type maps to (for `baseDatatypeCd` on F columns). */
65
- export function deriveBaseDatatype(fieldTypeCd) {
66
- return getFieldType(fieldTypeCd)?.baseDatatypeCd;
67
- }
68
- //# sourceMappingURL=derive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,+EAA+E;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,mFAAmF;AACnF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAA2B;IACpD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;CACd,CAAC;AASF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,UAAyB,EAAE;IAChF,MAAM,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAE1B,wEAAwE;IACxE,qDAAqD;IACrD,IAAI,EAAE,CAAC,UAAU,KAAK,GAAG,IAAI,EAAE,CAAC,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAEhE,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,yCAAyC;IAEzE,IAAI,EAAE,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,CAAC;QACpD,OAAO,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,aAAa,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,CAAC;IAED,IAAI,EAAE,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC;QAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC;QAC3C,OAAO,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,WAAmB;IAChD,MAAM,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,EAAE,SAAS;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AAC5B,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACrD,OAAO,YAAY,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;AAClD,CAAC"}
package/dist/domains.d.ts DELETED
@@ -1,32 +0,0 @@
1
- import type { BaseDatatypeCd, FieldTypeCd, FieldOption } from "./types";
2
- /** A single reusable column domain. */
3
- export interface DomainDef {
4
- /** Human-readable label. Localizable via `translations/<locale>.json` → `domains.<code>.label`. */
5
- description?: string;
6
- /**
7
- * Base datatype the domain stands for. Required — it is what a consuming column's
8
- * DDL is generated from.
9
- */
10
- baseDatatypeCd: BaseDatatypeCd;
11
- /** Physical Postgres type for consuming columns; omit to infer from `fieldTypeCd`. */
12
- dbDatatype?: string;
13
- /** Control used to render/edit consuming columns (e.g. `dropdown`, `text`, `number`). */
14
- fieldTypeCd?: FieldTypeCd;
15
- /** Max length for string-backed domains. */
16
- maxLen?: number;
17
- /** Decimal precision for numeric domains. */
18
- precision?: number;
19
- /**
20
- * Field-type config shared by every consuming column — most importantly the option
21
- * list for `dropdown`/`radio`/`flags`. Never copied onto columns: it resolves from
22
- * the domain at load time, which is what lets its labels be translated once for all
23
- * consumers. Per-locale label/icon/color overrides live in `translations/<locale>.json`
24
- * under `domains.<code>.options.<value>`.
25
- */
26
- params?: {
27
- options?: (string | FieldOption)[];
28
- } & Record<string, unknown>;
29
- }
30
- /** A `domains.json` file: reusable column domains keyed by domain code. */
31
- export type DomainsFile = Record<string, DomainDef>;
32
- //# sourceMappingURL=domains.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../src/domains.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAExE,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACzB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,cAAc,CAAC;IAC/B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1E;AAED,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC"}
package/dist/domains.js DELETED
@@ -1,10 +0,0 @@
1
- // Column domains — authoring shape of `domains.json`. Mirror of domains.schema.json.
2
- //
3
- // A domain is a reusable, named semantic type: a base datatype, a control, sizing and
4
- // a shared option list under one code (e.g. `doc_status`). A column references it via
5
- // `FieldDef.domain` ("module_cd.domain_cd") instead of restating the definition. The
6
- // structural fields are materialized onto each column at install; `params` (the option
7
- // list) stays on the domain and resolves at load time, so a shared list is authored and
8
- // translated exactly once. See docs/modules/MODULE_CONVENTIONS.md.
9
- export {};
10
- //# sourceMappingURL=domains.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domains.js","sourceRoot":"","sources":["../src/domains.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,EAAE;AACF,sFAAsF;AACtF,sFAAsF;AACtF,qFAAqF;AACrF,uFAAuF;AACvF,wFAAwF;AACxF,mEAAmE"}
@@ -1,18 +0,0 @@
1
- import type { EntityDef } from "./entity";
2
- /** `{ field, target }` for each Reference (R) column that declares a link. */
3
- export declare function getLinks(entity: EntityDef): Array<{
4
- field: string;
5
- target: string;
6
- }>;
7
- /**
8
- * Identity-trait primary-key column codes for `entityCode` (e.g. `invoice_id`),
9
- * excluding any the author already declared explicitly. Empty unless the entity
10
- * carries the `identity` trait.
11
- */
12
- export declare function getIdentityKeys(entity: EntityDef, entityCode: string): string[];
13
- /**
14
- * All primary-key column codes: fields flagged `isPk`, plus identity-trait keys.
15
- * Order is explicit-first, then identity keys; duplicates removed.
16
- */
17
- export declare function getPrimaryKeys(entity: EntityDef, entityCode: string): string[];
18
- //# sourceMappingURL=entity-meta.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity-meta.d.ts","sourceRoot":"","sources":["../src/entity-meta.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQpF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAa9E"}
@@ -1,45 +0,0 @@
1
- // Entity introspection helpers — derive the projections clients commonly need
2
- // (primary keys, identity-trait keys, reference links) from a raw EntityDef.
3
- // Shared so the editor, web app and CLI compute these the same way instead of
4
- // each reimplementing the rules.
5
- import { expandTrait } from "./traits";
6
- /** `{ field, target }` for each Reference (R) column that declares a link. */
7
- export function getLinks(entity) {
8
- const links = [];
9
- for (const [code, field] of Object.entries(entity.fields ?? {})) {
10
- if (field.columnType === "R" && field.link?.entity) {
11
- links.push({ field: code, target: field.link.entity });
12
- }
13
- }
14
- return links;
15
- }
16
- /**
17
- * Identity-trait primary-key column codes for `entityCode` (e.g. `invoice_id`),
18
- * excluding any the author already declared explicitly. Empty unless the entity
19
- * carries the `identity` trait.
20
- */
21
- export function getIdentityKeys(entity, entityCode) {
22
- if (!entity.traits?.includes("identity"))
23
- return [];
24
- const explicit = new Set(Object.keys(entity.fields ?? {}));
25
- return Object.keys(expandTrait("identity", entityCode)).filter((key) => !explicit.has(key));
26
- }
27
- /**
28
- * All primary-key column codes: fields flagged `isPk`, plus identity-trait keys.
29
- * Order is explicit-first, then identity keys; duplicates removed.
30
- */
31
- export function getPrimaryKeys(entity, entityCode) {
32
- const explicit = Object.entries(entity.fields ?? {})
33
- .filter(([, field]) => field.isPk)
34
- .map(([code]) => code);
35
- const seen = new Set(explicit);
36
- const result = [...explicit];
37
- for (const key of getIdentityKeys(entity, entityCode)) {
38
- if (!seen.has(key)) {
39
- seen.add(key);
40
- result.push(key);
41
- }
42
- }
43
- return result;
44
- }
45
- //# sourceMappingURL=entity-meta.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity-meta.js","sourceRoot":"","sources":["../src/entity-meta.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,iCAAiC;AAGjC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,8EAA8E;AAC9E,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACzC,MAAM,KAAK,GAA6C,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,UAAkB;IACpE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,UAAkB;IACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SAClD,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
package/dist/entity.d.ts DELETED
@@ -1,116 +0,0 @@
1
- import type { FieldDef } from "./types";
2
- /** Trait codes valid in an entity's `traits` array (entity.schema.json enum). */
3
- export type TraitCd = "identity" | "audit" | "audit-full" | "soft-delete" | "sorting" | "postable" | "accumulation" | "ledger" | "period" | "file-library";
4
- /** Referential action for a FK's ON DELETE / ON UPDATE clause (omitted = noAction). */
5
- export type ReferentialAction = "cascade" | "setNull" | "restrict" | "noAction";
6
- /** Foreign-key reference (legacy `references` block — prefer `link` on a field). */
7
- export interface EntityReference {
8
- from: {
9
- field: string;
10
- };
11
- to: {
12
- entity: string;
13
- field: string;
14
- };
15
- /** ON DELETE rule; `setNull` requires a nullable FK column. */
16
- onDelete?: ReferentialAction;
17
- /** ON UPDATE rule; a no-op for immutable `cuid` PKs. */
18
- onUpdate?: ReferentialAction;
19
- }
20
- /** Automatic document numbering config (entity `numberSequence`). */
21
- export interface NumberSequenceDef {
22
- /** Column code that receives the auto-generated number. */
23
- column: string;
24
- /** Module setting code to resolve the prefix from (folder-scoped). */
25
- prefixSettingCd?: string;
26
- /** Fallback prefix when no setting is configured. */
27
- defaultPrefix: string;
28
- /** Format pattern. Placeholders: {prefix}, {yyyy}, {yy}, {mm}, {dd}, {seq:N}. */
29
- pattern?: string;
30
- /** Counter reset period (default: year). */
31
- resetPeriod?: "year" | "month" | "day" | "never";
32
- }
33
- /** Period-entity config (`period` block; requires the `period` trait). */
34
- export interface PeriodConfig {
35
- /** Format for the period key. Placeholders: {yyyy}, {yy}, {MM}, {dd}, {q}. */
36
- keyFormat: string;
37
- }
38
- /** Dynamic sign determination based on a field value. */
39
- export interface SignConfig {
40
- /** Field code that determines direction. */
41
- field: string;
42
- /** Values that mean increase. */
43
- positive: string[];
44
- /** Values that mean decrease. */
45
- negative: string[];
46
- }
47
- /** Accumulation-registry config (`accumulation` block; requires the trait). */
48
- export interface AccumulationConfig {
49
- /** Balance entity code (e.g. 'stock'). */
50
- balanceEntity: string;
51
- /** Balance lookup dimensions: field-name array or balance→document field map. */
52
- dimensions: string[] | Record<string, string>;
53
- /** Document field → balance field resource mappings. */
54
- resources: Record<string, {
55
- balanceField: string;
56
- }>;
57
- /** Fixed posting direction for all postings. */
58
- direction?: "increase" | "decrease";
59
- /** Dynamic sign (alternative to `direction`). */
60
- sign?: SignConfig;
61
- autoCreateBalance?: boolean;
62
- allowNegative?: boolean;
63
- /** Document fields locked once posted. */
64
- lockedFields?: string[];
65
- }
66
- /** One registry target within an L-column's `registries` array. */
67
- export interface LedgerRegistryEntry {
68
- /** Movement entity code (e.g. 'posting_record'). */
69
- movementEntity: string;
70
- /** Line field → movement field mapping. */
71
- movementMapping: Record<string, string>;
72
- /** Balance entity code (e.g. 'balance_register'). */
73
- balanceEntity: string;
74
- balanceMapping: {
75
- /** Balance row dimension columns. */
76
- dimensions: string[];
77
- /** Balance column for debit turnover. */
78
- debitResource: string;
79
- /** Balance column for credit turnover. */
80
- creditResource: string;
81
- };
82
- }
83
- /** A single entity definition (`entities/<code>.json`). */
84
- export interface EntityDef {
85
- /** Qualified entity code to extend (e.g. 'fin.invoice') — turns this into an extension. */
86
- extends?: string;
87
- description?: string;
88
- /** Database schema name override (defaults to module schema). */
89
- schema?: string;
90
- /** Database table/view name (defaults to entity code). */
91
- dbObject?: string;
92
- /** When true, maps to a SQL view (read-only, no DDL). */
93
- isView?: boolean;
94
- /** SELECT statement for view-backed entities (`isView=true`). */
95
- viewSql?: string;
96
- /** Display pattern using column placeholders, e.g. "{first_name} {last_name}". */
97
- toString?: string;
98
- /** Traits expanded at install time. */
99
- traits?: TraitCd[];
100
- /** Column definitions keyed by column code. Optional when a trait (e.g. `period`) supplies all columns. */
101
- fields?: Record<string, FieldDef>;
102
- /** Database constraints (unique, check, …); free-form per the schema. */
103
- constraints?: Record<string, unknown>;
104
- /** FK references (legacy format; prefer `link` on a field). */
105
- references?: Record<string, EntityReference>;
106
- /** Database index definitions; free-form per the schema. */
107
- indexes?: Record<string, unknown>;
108
- numberSequence?: NumberSequenceDef;
109
- period?: PeriodConfig;
110
- accumulation?: AccumulationConfig;
111
- /** Entity-level platform behavior flags. */
112
- params?: {
113
- restricted?: boolean;
114
- } & Record<string, unknown>;
115
- }
116
- //# sourceMappingURL=entity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"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"}
package/dist/entity.js DELETED
@@ -1,7 +0,0 @@
1
- // Entity definition — authoring shape of an `entities/*.json` file.
2
- //
3
- // Mirror of entity.schema.json. Describes a table/view mapping: its fields
4
- // (see FieldDef in types.ts), traits, references, number sequence and the
5
- // register configs for accumulation/ledger entities.
6
- export {};
7
- //# sourceMappingURL=entity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,qDAAqD"}
@@ -1,287 +0,0 @@
1
- import type { FieldTypeCd, FieldTypeDef } from "./types";
2
- export declare const fieldTypes: readonly [{
3
- readonly cd: "text";
4
- readonly name: "Text";
5
- readonly columnType: "D";
6
- readonly baseDatatypeCd: "string";
7
- readonly supportedAgg: null;
8
- readonly maxLen: null;
9
- readonly precision: null;
10
- readonly useStringInFilter: true;
11
- }, {
12
- readonly cd: "avatar";
13
- readonly name: "Avatar Name";
14
- readonly columnType: "D";
15
- readonly baseDatatypeCd: "string";
16
- readonly supportedAgg: null;
17
- readonly maxLen: null;
18
- readonly precision: null;
19
- readonly useStringInFilter: true;
20
- }, {
21
- readonly cd: "email";
22
- readonly name: "Email";
23
- readonly columnType: "D";
24
- readonly baseDatatypeCd: "string";
25
- readonly supportedAgg: null;
26
- readonly maxLen: null;
27
- readonly precision: null;
28
- readonly useStringInFilter: true;
29
- }, {
30
- readonly cd: "phone";
31
- readonly name: "Phone";
32
- readonly columnType: "D";
33
- readonly baseDatatypeCd: "string";
34
- readonly supportedAgg: null;
35
- readonly maxLen: null;
36
- readonly precision: null;
37
- readonly useStringInFilter: true;
38
- }, {
39
- readonly cd: "url";
40
- readonly name: "URL";
41
- readonly columnType: "D";
42
- readonly baseDatatypeCd: "string";
43
- readonly supportedAgg: null;
44
- readonly maxLen: null;
45
- readonly precision: null;
46
- readonly useStringInFilter: true;
47
- }, {
48
- readonly cd: "textarea";
49
- readonly name: "Multiline Text";
50
- readonly columnType: "D";
51
- readonly baseDatatypeCd: "string";
52
- readonly supportedAgg: null;
53
- readonly maxLen: null;
54
- readonly precision: null;
55
- readonly useStringInFilter: true;
56
- }, {
57
- readonly cd: "number";
58
- readonly name: "Number";
59
- readonly columnType: "D";
60
- readonly baseDatatypeCd: "number";
61
- readonly supportedAgg: "SCAM";
62
- readonly maxLen: null;
63
- readonly precision: null;
64
- readonly useStringInFilter: false;
65
- readonly defParams: {
66
- readonly min: 0;
67
- readonly max: 10000;
68
- };
69
- }, {
70
- readonly cd: "currency";
71
- readonly name: "Currency";
72
- readonly columnType: "D";
73
- readonly baseDatatypeCd: "number";
74
- readonly supportedAgg: "SCAM";
75
- readonly maxLen: null;
76
- readonly precision: 2;
77
- readonly useStringInFilter: false;
78
- readonly defParams: {
79
- readonly min: 0;
80
- readonly max: 1000000;
81
- };
82
- }, {
83
- readonly cd: "percent";
84
- readonly name: "Percent";
85
- readonly columnType: "D";
86
- readonly baseDatatypeCd: "number";
87
- readonly supportedAgg: "CAM";
88
- readonly maxLen: null;
89
- readonly precision: 2;
90
- readonly useStringInFilter: false;
91
- readonly defParams: {
92
- readonly min: 0;
93
- readonly max: 100;
94
- };
95
- }, {
96
- readonly cd: "checkbox";
97
- readonly name: "Checkbox";
98
- readonly columnType: "D";
99
- readonly baseDatatypeCd: "bool";
100
- readonly supportedAgg: "C";
101
- readonly maxLen: null;
102
- readonly precision: null;
103
- readonly useStringInFilter: false;
104
- }, {
105
- readonly cd: "date";
106
- readonly name: "Date";
107
- readonly columnType: "D";
108
- readonly baseDatatypeCd: "date";
109
- readonly supportedAgg: "CM";
110
- readonly maxLen: null;
111
- readonly precision: null;
112
- readonly useStringInFilter: false;
113
- }, {
114
- readonly cd: "datetime";
115
- readonly name: "Date & Time";
116
- readonly columnType: "D";
117
- readonly baseDatatypeCd: "timestamp";
118
- readonly supportedAgg: "CM";
119
- readonly maxLen: null;
120
- readonly precision: null;
121
- readonly useStringInFilter: false;
122
- }, {
123
- readonly cd: "time";
124
- readonly name: "Time";
125
- readonly columnType: "D";
126
- readonly baseDatatypeCd: "time";
127
- readonly supportedAgg: null;
128
- readonly maxLen: null;
129
- readonly precision: null;
130
- readonly useStringInFilter: false;
131
- }, {
132
- readonly cd: "dropdown";
133
- readonly name: "Dropdown";
134
- readonly columnType: "D";
135
- readonly baseDatatypeCd: "string";
136
- readonly supportedAgg: "C";
137
- readonly maxLen: null;
138
- readonly precision: null;
139
- readonly useStringInFilter: true;
140
- }, {
141
- readonly cd: "flags";
142
- readonly name: "Flags";
143
- readonly columnType: "D";
144
- readonly baseDatatypeCd: "string";
145
- readonly supportedAgg: "C";
146
- readonly maxLen: null;
147
- readonly precision: null;
148
- readonly useStringInFilter: true;
149
- readonly defParams: {
150
- readonly style: "buttons";
151
- };
152
- }, {
153
- readonly cd: "json";
154
- readonly name: "JSON Editor";
155
- readonly columnType: "D";
156
- readonly baseDatatypeCd: "json";
157
- readonly supportedAgg: null;
158
- readonly maxLen: null;
159
- readonly precision: null;
160
- readonly useStringInFilter: false;
161
- }, {
162
- readonly cd: "hidden";
163
- readonly name: "Hidden";
164
- readonly columnType: "D";
165
- readonly baseDatatypeCd: "string";
166
- readonly supportedAgg: null;
167
- readonly maxLen: null;
168
- readonly precision: null;
169
- readonly useStringInFilter: false;
170
- }, {
171
- readonly cd: "color";
172
- readonly name: "Color Picker";
173
- readonly columnType: "D";
174
- readonly baseDatatypeCd: "string";
175
- readonly supportedAgg: null;
176
- readonly maxLen: 20;
177
- readonly precision: null;
178
- readonly useStringInFilter: false;
179
- }, {
180
- readonly cd: "image";
181
- readonly name: "Image";
182
- readonly columnType: "D";
183
- readonly baseDatatypeCd: "binary";
184
- readonly supportedAgg: null;
185
- readonly maxLen: null;
186
- readonly precision: null;
187
- readonly useStringInFilter: false;
188
- }, {
189
- readonly cd: "file";
190
- readonly name: "File";
191
- readonly columnType: "D";
192
- readonly baseDatatypeCd: "binary";
193
- readonly supportedAgg: null;
194
- readonly maxLen: null;
195
- readonly precision: null;
196
- readonly useStringInFilter: false;
197
- }, {
198
- readonly cd: "markdown";
199
- readonly name: "Markdown";
200
- readonly columnType: "D";
201
- readonly baseDatatypeCd: "string";
202
- readonly supportedAgg: null;
203
- readonly maxLen: null;
204
- readonly precision: null;
205
- readonly useStringInFilter: true;
206
- }, {
207
- readonly cd: "richtext";
208
- readonly name: "Rich Text Editor";
209
- readonly columnType: "D";
210
- readonly baseDatatypeCd: "string";
211
- readonly supportedAgg: null;
212
- readonly maxLen: null;
213
- readonly precision: null;
214
- readonly useStringInFilter: true;
215
- }, {
216
- readonly cd: "lookup";
217
- readonly name: "Lookup";
218
- readonly columnType: "R";
219
- readonly baseDatatypeCd: "guid";
220
- readonly supportedAgg: "C";
221
- readonly maxLen: null;
222
- readonly precision: null;
223
- readonly useStringInFilter: true;
224
- }, {
225
- readonly cd: "user";
226
- readonly name: "User Picker";
227
- readonly columnType: "D";
228
- readonly baseDatatypeCd: "cuid";
229
- readonly supportedAgg: "C";
230
- readonly maxLen: null;
231
- readonly precision: null;
232
- readonly useStringInFilter: false;
233
- }, {
234
- readonly cd: "grid";
235
- readonly name: "Detail Grid";
236
- readonly columnType: "S";
237
- readonly baseDatatypeCd: "set";
238
- readonly supportedAgg: "C";
239
- readonly maxLen: null;
240
- readonly precision: null;
241
- readonly useStringInFilter: false;
242
- }, {
243
- readonly cd: "list";
244
- readonly name: "Detail List";
245
- readonly columnType: "S";
246
- readonly baseDatatypeCd: "set";
247
- readonly supportedAgg: "C";
248
- readonly maxLen: null;
249
- readonly precision: null;
250
- readonly useStringInFilter: false;
251
- }, {
252
- readonly cd: "tags";
253
- readonly name: "Tags";
254
- readonly columnType: "D";
255
- readonly baseDatatypeCd: "string";
256
- readonly supportedAgg: "C";
257
- readonly maxLen: null;
258
- readonly precision: null;
259
- readonly useStringInFilter: true;
260
- }, {
261
- readonly cd: "entitylink";
262
- readonly name: "Entity Link";
263
- readonly columnType: "D";
264
- readonly baseDatatypeCd: "json";
265
- readonly supportedAgg: "C";
266
- readonly maxLen: null;
267
- readonly precision: null;
268
- readonly useStringInFilter: false;
269
- }, {
270
- readonly cd: "code";
271
- readonly name: "Code Editor";
272
- readonly columnType: "D";
273
- readonly baseDatatypeCd: "string";
274
- readonly supportedAgg: "C";
275
- readonly maxLen: null;
276
- readonly precision: null;
277
- readonly useStringInFilter: false;
278
- }];
279
- /** Set of all known field type codes, for membership checks. */
280
- export declare const fieldTypeCds: ReadonlySet<string>;
281
- /** Type guard: is `cd` one of the known field type codes? */
282
- export declare function isFieldTypeCd(cd: string | undefined): cd is FieldTypeCd;
283
- /** Look up a field type by code, or `undefined` if unknown. */
284
- export declare function getFieldType(cd: string): FieldTypeDef | undefined;
285
- /** Field types whose default column kind is `columnType` (e.g. "D" value types). */
286
- export declare function fieldTypesByColumnType(columnType: string): readonly FieldTypeDef[];
287
- //# sourceMappingURL=field-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-types.d.ts","sourceRoot":"","sources":["../src/field-types.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIzD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BqB,CAAC;AAY7C,gEAAgE;AAChE,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAA0C,CAAC;AAExF,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,IAAI,WAAW,CAEvE;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEjE;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAElF"}