@fayz-ai/shop 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +18 -1
  2. package/dist/admin.d.ts +2 -0
  3. package/dist/admin.d.ts.map +1 -0
  4. package/dist/catalog.d.ts +1 -3
  5. package/dist/catalog.d.ts.map +1 -1
  6. package/dist/catalog.js +2 -2
  7. package/dist/{chunk-IYQHKMLB.js → chunk-2WACO2TG.js} +4 -4
  8. package/dist/chunk-2WACO2TG.js.map +1 -0
  9. package/dist/chunk-3GERSY5F.js +526 -0
  10. package/dist/chunk-3GERSY5F.js.map +1 -0
  11. package/dist/chunk-6BO2TMZ5.js +93 -0
  12. package/dist/chunk-6BO2TMZ5.js.map +1 -0
  13. package/dist/chunk-FQPGE3YN.js +3 -0
  14. package/dist/{chunk-JR25TISO.js.map → chunk-FQPGE3YN.js.map} +1 -1
  15. package/dist/{chunk-CTKZ6O2J.js → chunk-IKNGCRUM.js} +41 -15
  16. package/dist/chunk-IKNGCRUM.js.map +1 -0
  17. package/dist/chunk-KLDS7IPU.js +17 -0
  18. package/dist/chunk-KLDS7IPU.js.map +1 -0
  19. package/dist/chunk-NWW3WJ7Y.js +136 -0
  20. package/dist/chunk-NWW3WJ7Y.js.map +1 -0
  21. package/dist/chunk-STRNMFC4.js +1438 -0
  22. package/dist/chunk-STRNMFC4.js.map +1 -0
  23. package/dist/chunk-U6HV3LVP.js +1170 -0
  24. package/dist/chunk-U6HV3LVP.js.map +1 -0
  25. package/dist/client.d.ts +2 -0
  26. package/dist/client.d.ts.map +1 -0
  27. package/dist/data/customer-search.d.ts +3 -0
  28. package/dist/data/customer-search.d.ts.map +1 -0
  29. package/dist/data/functions.d.ts +9 -0
  30. package/dist/data/functions.d.ts.map +1 -0
  31. package/dist/data/media.d.ts +37 -0
  32. package/dist/data/media.d.ts.map +1 -0
  33. package/dist/{mock-catalog.d.ts → data/mock-catalog.d.ts} +21 -1
  34. package/dist/data/mock-catalog.d.ts.map +1 -0
  35. package/dist/data/mock-provider.d.ts +165 -0
  36. package/dist/data/mock-provider.d.ts.map +1 -0
  37. package/dist/data/mock.d.ts +3 -0
  38. package/dist/data/mock.d.ts.map +1 -0
  39. package/dist/data/provider.d.ts +335 -0
  40. package/dist/data/provider.d.ts.map +1 -0
  41. package/dist/data/supabase-provider.d.ts +208 -0
  42. package/dist/data/supabase-provider.d.ts.map +1 -0
  43. package/dist/data/tables.d.ts +38 -0
  44. package/dist/data/tables.d.ts.map +1 -0
  45. package/dist/data/tenant.d.ts.map +1 -0
  46. package/dist/entities/entity-reconcile.d.ts +32 -0
  47. package/dist/entities/entity-reconcile.d.ts.map +1 -0
  48. package/dist/entities/entity-sql.d.ts +50 -0
  49. package/dist/entities/entity-sql.d.ts.map +1 -0
  50. package/dist/entities/entity-store.d.ts +58 -0
  51. package/dist/entities/entity-store.d.ts.map +1 -0
  52. package/dist/entities/index.d.ts +10 -0
  53. package/dist/entities/index.d.ts.map +1 -0
  54. package/dist/entities/mock-entity-store.d.ts +17 -0
  55. package/dist/entities/mock-entity-store.d.ts.map +1 -0
  56. package/dist/entities/supabase-entity-store.d.ts +8 -0
  57. package/dist/entities/supabase-entity-store.d.ts.map +1 -0
  58. package/dist/entities.js +159 -0
  59. package/dist/entities.js.map +1 -0
  60. package/dist/index.d.ts +28 -12
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +1558 -40
  63. package/dist/index.js.map +1 -1
  64. package/dist/inventory/allocation.d.ts +98 -0
  65. package/dist/inventory/allocation.d.ts.map +1 -0
  66. package/dist/inventory/index.d.ts +13 -0
  67. package/dist/inventory/index.d.ts.map +1 -0
  68. package/dist/inventory/mock-stock-store.d.ts +89 -0
  69. package/dist/inventory/mock-stock-store.d.ts.map +1 -0
  70. package/dist/inventory/postgrest-double.d.ts +65 -0
  71. package/dist/inventory/postgrest-double.d.ts.map +1 -0
  72. package/dist/inventory/shopify-mapping.d.ts +67 -0
  73. package/dist/inventory/shopify-mapping.d.ts.map +1 -0
  74. package/dist/inventory/stock-contract.d.ts +46 -0
  75. package/dist/inventory/stock-contract.d.ts.map +1 -0
  76. package/dist/inventory/stock-store.d.ts +96 -0
  77. package/dist/inventory/stock-store.d.ts.map +1 -0
  78. package/dist/inventory/stock-types.d.ts +351 -0
  79. package/dist/inventory/stock-types.d.ts.map +1 -0
  80. package/dist/inventory/supabase-stock-store.d.ts +60 -0
  81. package/dist/inventory/supabase-stock-store.d.ts.map +1 -0
  82. package/dist/inventory/vocabulary.d.ts +86 -0
  83. package/dist/inventory/vocabulary.d.ts.map +1 -0
  84. package/dist/inventory.js +4 -0
  85. package/dist/inventory.js.map +1 -0
  86. package/dist/lib/catalog.d.ts +4 -0
  87. package/dist/lib/catalog.d.ts.map +1 -0
  88. package/dist/{commerce.d.ts → lib/commerce.d.ts} +2 -2
  89. package/dist/lib/commerce.d.ts.map +1 -0
  90. package/dist/lib/document.d.ts +13 -0
  91. package/dist/lib/document.d.ts.map +1 -0
  92. package/dist/lib/emails.d.ts +50 -0
  93. package/dist/lib/emails.d.ts.map +1 -0
  94. package/dist/lib/message-events.d.ts +4 -0
  95. package/dist/lib/message-events.d.ts.map +1 -0
  96. package/dist/lib/runtime.d.ts +5 -0
  97. package/dist/lib/runtime.d.ts.map +1 -0
  98. package/dist/lib/variant-matrix.d.ts +120 -0
  99. package/dist/lib/variant-matrix.d.ts.map +1 -0
  100. package/dist/mock.d.ts +1 -2
  101. package/dist/mock.d.ts.map +1 -1
  102. package/dist/mock.js +4 -2
  103. package/dist/provider.d.ts +1 -88
  104. package/dist/provider.d.ts.map +1 -1
  105. package/dist/providers/checkout.d.ts +129 -0
  106. package/dist/providers/checkout.d.ts.map +1 -0
  107. package/dist/providers/index.d.ts +5 -0
  108. package/dist/providers/index.d.ts.map +1 -0
  109. package/dist/providers/shipping.d.ts +43 -0
  110. package/dist/providers/shipping.d.ts.map +1 -0
  111. package/dist/providers.js +70 -0
  112. package/dist/providers.js.map +1 -0
  113. package/dist/rules/adapter.d.ts +36 -0
  114. package/dist/rules/adapter.d.ts.map +1 -0
  115. package/dist/rules/attributes.d.ts +64 -0
  116. package/dist/rules/attributes.d.ts.map +1 -0
  117. package/dist/rules/context.d.ts +43 -0
  118. package/dist/rules/context.d.ts.map +1 -0
  119. package/dist/rules/evaluator.d.ts +37 -0
  120. package/dist/rules/evaluator.d.ts.map +1 -0
  121. package/dist/rules/index.d.ts +13 -0
  122. package/dist/rules/index.d.ts.map +1 -0
  123. package/dist/rules/prices.d.ts +25 -0
  124. package/dist/rules/prices.d.ts.map +1 -0
  125. package/dist/rules/rule-types.d.ts +160 -0
  126. package/dist/rules/rule-types.d.ts.map +1 -0
  127. package/dist/rules.js +22 -0
  128. package/dist/rules.js.map +1 -0
  129. package/dist/runtime.d.ts +1 -4
  130. package/dist/runtime.d.ts.map +1 -1
  131. package/dist/runtime.js +5 -3
  132. package/dist/shipping/label-provider.d.ts +43 -0
  133. package/dist/shipping/label-provider.d.ts.map +1 -0
  134. package/dist/types.d.ts +688 -0
  135. package/dist/types.d.ts.map +1 -1
  136. package/package.json +30 -20
  137. package/dist/chunk-CTKZ6O2J.js.map +0 -1
  138. package/dist/chunk-IYQHKMLB.js.map +0 -1
  139. package/dist/chunk-JR25TISO.js +0 -3
  140. package/dist/chunk-SVTCJ6HP.js +0 -440
  141. package/dist/chunk-SVTCJ6HP.js.map +0 -1
  142. package/dist/commerce.d.ts.map +0 -1
  143. package/dist/mock-catalog.d.ts.map +0 -1
  144. package/dist/mock-provider.d.ts +0 -60
  145. package/dist/mock-provider.d.ts.map +0 -1
  146. package/dist/supabase-provider.d.ts +0 -56
  147. package/dist/supabase-provider.d.ts.map +0 -1
  148. package/dist/tables.d.ts +0 -12
  149. package/dist/tables.d.ts.map +0 -1
  150. package/dist/tenant.d.ts.map +0 -1
  151. package/src/catalog.ts +0 -3
  152. package/src/commerce.ts +0 -120
  153. package/src/index.ts +0 -40
  154. package/src/mock-catalog.ts +0 -266
  155. package/src/mock-provider.ts +0 -480
  156. package/src/mock.ts +0 -2
  157. package/src/provider.ts +0 -117
  158. package/src/runtime.ts +0 -20
  159. package/src/supabase-provider.ts +0 -754
  160. package/src/tables.ts +0 -17
  161. package/src/tenant.ts +0 -21
  162. package/src/types.ts +0 -623
  163. /package/dist/{tenant.d.ts → data/tenant.d.ts} +0 -0
@@ -0,0 +1,32 @@
1
+ import type { EntityDeclaration } from '@fayz-ai/core';
2
+ /** What the pipeline observed in the database for ONE entity, as a value. */
3
+ export interface ObservedEntitySchema {
4
+ /** The plg_entity_types definition previously reconciled, or null the first
5
+ * time. The shape serializeEntityDeclaration wrote (an EntityDeclaration). */
6
+ descriptor: EntityDeclaration | null;
7
+ /** Index names present on the entity's storage table. */
8
+ indexes: readonly string[];
9
+ /** Policy names present on the entity's storage table. */
10
+ policies: readonly string[];
11
+ }
12
+ export interface QuarantinedDdl {
13
+ sql: string;
14
+ /** Why this cannot run unattended — shown to whoever reviews the plan. */
15
+ reason: string;
16
+ }
17
+ export interface EntityReconcilePlan {
18
+ /** Additive, idempotent statements, in application order. */
19
+ safe: string[];
20
+ /** Destructive or narrowing statements. NEVER applied automatically. */
21
+ quarantined: QuarantinedDdl[];
22
+ }
23
+ export interface ReconcileEntityOptions {
24
+ /** Tenant the descriptor upsert is scoped to. */
25
+ tenantId: string;
26
+ }
27
+ /**
28
+ * Diff one declaration against what the database was observed to hold and
29
+ * produce the plan. Deterministic and total — same inputs, same plan.
30
+ */
31
+ export declare function reconcileEntity(declaration: EntityDeclaration, observed: ObservedEntitySchema, options: ReconcileEntityOptions): EntityReconcilePlan;
32
+ //# sourceMappingURL=entity-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-reconcile.d.ts","sourceRoot":"","sources":["../../src/entities/entity-reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,eAAe,CAAA;AAqBnE,6EAA6E;AAC7E,MAAM,WAAW,oBAAoB;IACnC;mFAC+E;IAC/E,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACpC,yDAAyD;IACzD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,0DAA0D;IAC1D,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,wEAAwE;IACxE,WAAW,EAAE,cAAc,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAA;CACjB;AAqCD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,iBAAiB,EAC9B,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,sBAAsB,GAC9B,mBAAmB,CA0DrB"}
@@ -0,0 +1,50 @@
1
+ import type { EntityDeclaration } from '@fayz-ai/core';
2
+ /** The declaration-mirror table (migration 0030): what the reconciler diffs
3
+ * against, Medusa link_module_migrations-style. */
4
+ export declare const ENTITY_TYPES_TABLE = "plg_entity_types";
5
+ /** Stable JSON for embedding a declaration: sorted keys, so the same
6
+ * declaration always serializes to the same text and diffs stay quiet. */
7
+ export declare function serializeEntityDeclaration(declaration: EntityDeclaration): string;
8
+ export interface GeneratedPolicy {
9
+ name: string;
10
+ sql: string;
11
+ }
12
+ /**
13
+ * The RLS policies one entity requires on its storage table, generated from
14
+ * the declaration:
15
+ *
16
+ * - `<staff>`: tenant members read and write their own rows — the
17
+ * access.write='staff' rule plus tenant scoping, mirroring the plg_shop_*
18
+ * tenant policies (user_tenant_ids()).
19
+ * - `<public_read>` (only when access.read='public'): anonymous storefront
20
+ * read, gated by the SAME published/strict-tenant functions the catalog
21
+ * tables use (0020/0028), so a custom entity is never MORE visible than
22
+ * the store's own products.
23
+ *
24
+ * On the shared generic table every predicate is additionally pinned to
25
+ * `entity = '<key>'`, so one entity's policy can never widen another's rows.
26
+ * A promoted entity (dedicated table) drops the pin: the table IS the entity.
27
+ */
28
+ export declare function generateEntityPolicies(declaration: EntityDeclaration): GeneratedPolicy[];
29
+ /** The full generated RLS block for one entity, ready to apply or to diff. */
30
+ export declare function generateEntityRlsSql(declaration: EntityDeclaration): string;
31
+ export interface GeneratedIndex {
32
+ name: string;
33
+ sql: string;
34
+ }
35
+ /** Name prefix under which one entity's generated indexes live — how the
36
+ * reconciler tells its own indexes from everyone else's. */
37
+ export declare function entityIndexPrefix(declaration: EntityDeclaration): string;
38
+ /**
39
+ * One expression index per declared index tuple, over the jsonb payload,
40
+ * partial to the entity's rows on the shared table. `data->>'field'` matches
41
+ * how the generic store filters, so the index serves the queries that exist.
42
+ */
43
+ export declare function generateEntityIndexes(declaration: EntityDeclaration): GeneratedIndex[];
44
+ /**
45
+ * Mirror the declaration into plg_entity_types for the given tenant — the row
46
+ * the NEXT reconciliation diffs against. jsonb comparison in the ON CONFLICT
47
+ * keeps re-applying an unchanged declaration a true no-op.
48
+ */
49
+ export declare function generateEntityDescriptorUpsertSql(declaration: EntityDeclaration, tenantId: string): string;
50
+ //# sourceMappingURL=entity-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-sql.d.ts","sourceRoot":"","sources":["../../src/entities/entity-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAqBtD;oDACoD;AACpD,eAAO,MAAM,kBAAkB,qBAAqB,CAAA;AAIpD;2EAC2E;AAC3E,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CAejF;AAID,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,iBAAiB,GAAG,eAAe,EAAE,CAiCxF;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CAG3E;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;6DAC6D;AAC7D,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CAExE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAYtF;AAID;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1G"}
@@ -0,0 +1,58 @@
1
+ import type { EntityRecordIssue } from '@fayz-ai/core';
2
+ /** One stored record. Structural columns + the declared `data` payload. */
3
+ export interface EntityRecord<TData extends Record<string, unknown> = Record<string, unknown>> {
4
+ id: string;
5
+ tenantId: string;
6
+ /** The entity key this record belongs to (defineEntity key). */
7
+ entity: string;
8
+ /** URL-stable identity within (tenant, entity); derived from the title field
9
+ * when not provided. Null for entities that never surface on a URL. */
10
+ slug: string | null;
11
+ data: TData;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ }
15
+ export interface ListEntityRecordsOptions {
16
+ /** Equality filters over declared data fields ({ region: 'sudeste' }). */
17
+ filter?: Record<string, unknown>;
18
+ /** Declared field to order by. Default: creation order. */
19
+ orderBy?: string;
20
+ order?: 'asc' | 'desc';
21
+ limit?: number;
22
+ offset?: number;
23
+ }
24
+ export interface EntityRecordInput<TData extends Record<string, unknown> = Record<string, unknown>> {
25
+ slug?: string | null;
26
+ data: TData;
27
+ }
28
+ /** The typed CRUD surface one entity's storage exposes. */
29
+ export interface EntityStore<TData extends Record<string, unknown> = Record<string, unknown>> {
30
+ list(options?: ListEntityRecordsOptions): Promise<EntityRecord<TData>[]>;
31
+ get(id: string): Promise<EntityRecord<TData> | null>;
32
+ getBySlug(slug: string): Promise<EntityRecord<TData> | null>;
33
+ create(input: EntityRecordInput<TData>): Promise<EntityRecord<TData>>;
34
+ update(id: string, input: Partial<EntityRecordInput<TData>>): Promise<EntityRecord<TData>>;
35
+ delete(id: string): Promise<void>;
36
+ }
37
+ /** Thrown by every EntityStore write whose data fails the declared schema. */
38
+ export declare class EntityValidationError extends Error {
39
+ readonly entity: string;
40
+ readonly issues: EntityRecordIssue[];
41
+ constructor(entity: string, issues: EntityRecordIssue[]);
42
+ }
43
+ /**
44
+ * Promote an entity to a dedicated store implementation. From this call on,
45
+ * every provider read/write for `entity` routes here instead of the generic
46
+ * jsonb store — callers, loaders and blocks are untouched (I5).
47
+ */
48
+ export declare function registerEntityStore(entity: string, store: EntityStore): void;
49
+ /** The registered dedicated store for an entity, when one exists. */
50
+ export declare function getRegisteredEntityStore(entity: string): EntityStore | undefined;
51
+ /** Resolve an entity's store: the promoted implementation when registered,
52
+ * otherwise the caller's generic fallback. The ONLY lookup providers use. */
53
+ export declare function resolveEntityStore(entity: string, generic: (entity: string) => EntityStore): EntityStore;
54
+ /** Test seam. */
55
+ export declare function clearEntityStores(): void;
56
+ /** Shared slug derivation: mirrors the product path so entity URLs read the same. */
57
+ export declare function slugifyEntityTitle(value: string): string;
58
+ //# sourceMappingURL=entity-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-store.d.ts","sourceRoot":"","sources":["../../src/entities/entity-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { EntityValidationError, registerEntityStore, getRegisteredEntityStore, resolveEntityStore, clearEntityStores, slugifyEntityTitle, } from './entity-store';
2
+ export type { EntityRecord, EntityRecordInput, EntityStore, ListEntityRecordsOptions, } from './entity-store';
3
+ export { createMockEntityStore } from './mock-entity-store';
4
+ export type { MockEntityStoreOptions } from './mock-entity-store';
5
+ export { createSupabaseEntityStore } from './supabase-entity-store';
6
+ export { ENTITY_TYPES_TABLE, serializeEntityDeclaration, generateEntityPolicies, generateEntityRlsSql, generateEntityIndexes, entityIndexPrefix, generateEntityDescriptorUpsertSql, } from './entity-sql';
7
+ export type { GeneratedPolicy, GeneratedIndex } from './entity-sql';
8
+ export { reconcileEntity } from './entity-reconcile';
9
+ export type { ObservedEntitySchema, QuarantinedDdl, EntityReconcilePlan, ReconcileEntityOptions, } from './entity-reconcile';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,wBAAwB,GACzB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,iCAAiC,GAClC,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,17 @@
1
+ import type { EntityStore } from './entity-store';
2
+ export interface MockEntityStoreOptions {
3
+ tenantId?: string;
4
+ /** Seed records: `data` payloads (validated), with optional slug/id. */
5
+ seed?: Array<{
6
+ id?: string;
7
+ slug?: string | null;
8
+ data: Record<string, unknown>;
9
+ }>;
10
+ }
11
+ /**
12
+ * An EntityStore for one declared entity, in memory. The entity must be
13
+ * declared (defineEntity) before records move: validation IS the store's
14
+ * contract, and there is nothing to validate against without the declaration.
15
+ */
16
+ export declare function createMockEntityStore(entity: string, options?: MockEntityStoreOptions): EntityStore;
17
+ //# sourceMappingURL=mock-entity-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-entity-store.d.ts","sourceRoot":"","sources":["../../src/entities/mock-entity-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmC,WAAW,EAA4B,MAAM,gBAAgB,CAAA;AAe5G,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CACnF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,WAAW,CA8GvG"}
@@ -0,0 +1,8 @@
1
+ import type { EntityStore } from './entity-store';
2
+ /**
3
+ * The generic store for one entity over the shared records table. Promotion to
4
+ * typed columns replaces THIS with a dedicated store via registerEntityStore —
5
+ * the callers' contract (this interface) is what stays.
6
+ */
7
+ export declare function createSupabaseEntityStore(entity: string): EntityStore;
8
+ //# sourceMappingURL=supabase-entity-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-entity-store.d.ts","sourceRoot":"","sources":["../../src/entities/supabase-entity-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmC,WAAW,EAA4B,MAAM,gBAAgB,CAAA;AAiC5G;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAyFrE"}
@@ -0,0 +1,159 @@
1
+ export { createSupabaseEntityStore } from './chunk-6BO2TMZ5.js';
2
+ import './chunk-KLDS7IPU.js';
3
+ export { EntityValidationError, clearEntityStores, createMockEntityStore, getRegisteredEntityStore, registerEntityStore, resolveEntityStore, slugifyEntityTitle } from './chunk-NWW3WJ7Y.js';
4
+
5
+ // src/entities/entity-sql.ts
6
+ var ENTITY_TYPES_TABLE = "plg_entity_types";
7
+ var sqlString = (value) => `'${value.replace(/'/g, "''")}'`;
8
+ function serializeEntityDeclaration(declaration) {
9
+ const canonical = (value) => {
10
+ if (Array.isArray(value)) return value.map(canonical);
11
+ if (value && typeof value === "object") {
12
+ const record = value;
13
+ return Object.fromEntries(
14
+ Object.keys(record).sort().filter((key) => record[key] !== void 0).map((key) => [key, canonical(record[key])])
15
+ );
16
+ }
17
+ return value;
18
+ };
19
+ return JSON.stringify(canonical(declaration));
20
+ }
21
+ function generateEntityPolicies(declaration) {
22
+ const table = `public.${declaration.storage.table}`;
23
+ const pin = declaration.storage.mode === "generic" ? `entity = ${sqlString(declaration.key)} AND ` : "";
24
+ const policies = [];
25
+ const staffName = `plg_entity_${declaration.key}_staff`;
26
+ policies.push({
27
+ name: staffName,
28
+ sql: [
29
+ `DROP POLICY IF EXISTS ${staffName} ON ${table};`,
30
+ `CREATE POLICY ${staffName} ON ${table}`,
31
+ ` FOR ALL TO authenticated`,
32
+ ` USING (${pin}tenant_id IN (SELECT public.user_tenant_ids()))`,
33
+ ` WITH CHECK (${pin}tenant_id IN (SELECT public.user_tenant_ids()));`
34
+ ].join("\n")
35
+ });
36
+ if (declaration.access.read === "public") {
37
+ const publicName = `plg_entity_${declaration.key}_public_read`;
38
+ policies.push({
39
+ name: publicName,
40
+ sql: [
41
+ `DROP POLICY IF EXISTS ${publicName} ON ${table};`,
42
+ `CREATE POLICY ${publicName} ON ${table}`,
43
+ ` FOR SELECT TO anon, authenticated`,
44
+ ` USING (${pin}tenant_id IN (SELECT public.storefront_published_tenants())`,
45
+ ` AND (tenant_id NOT IN (SELECT public.storefront_strict_tenants())`,
46
+ ` OR tenant_id = public.storefront_requested_store()));`
47
+ ].join("\n")
48
+ });
49
+ }
50
+ return policies;
51
+ }
52
+ function generateEntityRlsSql(declaration) {
53
+ const header = `-- Generated from defineEntity(${sqlString(declaration.key)}) \u2014 never hand-edited (I6).`;
54
+ return [header, ...generateEntityPolicies(declaration).map((policy) => policy.sql)].join("\n");
55
+ }
56
+ function entityIndexPrefix(declaration) {
57
+ return `${declaration.storage.table}_${declaration.key}_`;
58
+ }
59
+ function generateEntityIndexes(declaration) {
60
+ const table = `public.${declaration.storage.table}`;
61
+ return declaration.indexes.map((fields) => {
62
+ const name = `${entityIndexPrefix(declaration)}${fields.join("_")}_idx`;
63
+ const expressions = fields.map((field) => `(data->>${sqlString(field)})`).join(", ");
64
+ const where = declaration.storage.mode === "generic" ? `
65
+ WHERE entity = ${sqlString(declaration.key)}` : "";
66
+ return {
67
+ name,
68
+ sql: `CREATE INDEX IF NOT EXISTS ${name}
69
+ ON ${table} (${expressions})${where};`
70
+ };
71
+ });
72
+ }
73
+ function generateEntityDescriptorUpsertSql(declaration, tenantId) {
74
+ const definition = serializeEntityDeclaration(declaration);
75
+ return [
76
+ `INSERT INTO public.${ENTITY_TYPES_TABLE} (tenant_id, key, definition)`,
77
+ `VALUES (${sqlString(tenantId)}, ${sqlString(declaration.key)}, ${sqlString(definition)}::jsonb)`,
78
+ `ON CONFLICT (tenant_id, key)`,
79
+ `DO UPDATE SET definition = EXCLUDED.definition, updated_at = now()`,
80
+ `WHERE ${ENTITY_TYPES_TABLE}.definition IS DISTINCT FROM EXCLUDED.definition;`
81
+ ].join("\n");
82
+ }
83
+
84
+ // src/entities/entity-reconcile.ts
85
+ function destructiveFieldChanges(previous, next) {
86
+ const changes = [];
87
+ for (const [name, prevField] of Object.entries(previous)) {
88
+ const nextField = next[name];
89
+ if (!nextField) {
90
+ changes.push({
91
+ field: name,
92
+ reason: `drops field "${name}": existing records keep the value in jsonb, but every reader, form and index loses it`
93
+ });
94
+ continue;
95
+ }
96
+ if (nextField.type !== prevField.type) {
97
+ changes.push({
98
+ field: name,
99
+ reason: `changes field "${name}" from ${prevField.type} to ${nextField.type}: existing values were validated as ${prevField.type} and may not satisfy the new type`
100
+ });
101
+ }
102
+ if (nextField.required === true && prevField.required !== true) {
103
+ changes.push({
104
+ field: name,
105
+ reason: `makes field "${name}" required: existing records without it would stop validating on their next write`
106
+ });
107
+ }
108
+ }
109
+ return changes;
110
+ }
111
+ function reconcileEntity(declaration, observed, options) {
112
+ const safe = [];
113
+ const quarantined = [];
114
+ const upsert = generateEntityDescriptorUpsertSql(declaration, options.tenantId);
115
+ const destructive = observed.descriptor ? destructiveFieldChanges(observed.descriptor.fields, declaration.fields) : [];
116
+ if (destructive.length > 0) {
117
+ quarantined.push({
118
+ sql: upsert,
119
+ reason: destructive.map((change) => change.reason).join("; ")
120
+ });
121
+ } else if (!observed.descriptor) {
122
+ safe.push(upsert);
123
+ } else {
124
+ safe.push(upsert);
125
+ }
126
+ const wantedIndexes = generateEntityIndexes(declaration);
127
+ for (const index of wantedIndexes) {
128
+ if (!observed.indexes.includes(index.name)) safe.push(index.sql);
129
+ }
130
+ const wantedIndexNames = new Set(wantedIndexes.map((index) => index.name));
131
+ const prefix = entityIndexPrefix(declaration);
132
+ for (const name of observed.indexes) {
133
+ if (name.startsWith(prefix) && !wantedIndexNames.has(name)) {
134
+ quarantined.push({
135
+ sql: `DROP INDEX IF EXISTS public.${name};`,
136
+ reason: `index "${name}" exists but the declaration no longer asks for it \u2014 dropping is reversible but degrades queries that may still run`
137
+ });
138
+ }
139
+ }
140
+ const wantedPolicies = generateEntityPolicies(declaration);
141
+ for (const policy of wantedPolicies) {
142
+ if (!observed.policies.includes(policy.name)) safe.push(policy.sql);
143
+ }
144
+ const wantedPolicyNames = new Set(wantedPolicies.map((policy) => policy.name));
145
+ const policyPrefix = `plg_entity_${declaration.key}_`;
146
+ for (const name of observed.policies) {
147
+ if (name.startsWith(policyPrefix) && !wantedPolicyNames.has(name)) {
148
+ quarantined.push({
149
+ sql: `DROP POLICY IF EXISTS ${name} ON public.${declaration.storage.table};`,
150
+ reason: `policy "${name}" grants access the declaration no longer declares \u2014 removing it narrows who can read/write and must be a deliberate act`
151
+ });
152
+ }
153
+ }
154
+ return { safe, quarantined };
155
+ }
156
+
157
+ export { ENTITY_TYPES_TABLE, entityIndexPrefix, generateEntityDescriptorUpsertSql, generateEntityIndexes, generateEntityPolicies, generateEntityRlsSql, reconcileEntity, serializeEntityDeclaration };
158
+ //# sourceMappingURL=entities.js.map
159
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entities/entity-sql.ts","../src/entities/entity-reconcile.ts"],"names":[],"mappings":"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","file":"entities.js","sourcesContent":["import type { EntityDeclaration } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Declaration → SQL, as pure text functions (I6).\n//\n// Nobody hand-writes a per-entity policy or index: the RLS that scopes an\n// entity's rows to its tenant, and opens (or does not open) public read, is\n// GENERATED from the same declaration that produced the JSON Schema — so row\n// scoping can never be forgotten or hand-written differently on two entities.\n// The reconciler (entity-reconcile.ts) decides WHICH of these statements run;\n// this module only knows how to spell them.\n//\n// Everything emitted is replay-safe by construction (DROP POLICY IF EXISTS\n// before CREATE POLICY, CREATE INDEX IF NOT EXISTS), matching the repo's\n// idempotent-migration guardrail, because the reconciler re-applies whenever a\n// declaration changes.\n//\n// No function here touches a database. Output is text; applying it is the\n// deploy pipeline's job, under the live-DB protocol.\n// ---------------------------------------------------------------------------\n\n/** The declaration-mirror table (migration 0030): what the reconciler diffs\n * against, Medusa link_module_migrations-style. */\nexport const ENTITY_TYPES_TABLE = 'plg_entity_types'\n\nconst sqlString = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\n/** Stable JSON for embedding a declaration: sorted keys, so the same\n * declaration always serializes to the same text and diffs stay quiet. */\nexport function serializeEntityDeclaration(declaration: EntityDeclaration): string {\n const canonical = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(canonical)\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>\n return Object.fromEntries(\n Object.keys(record)\n .sort()\n .filter((key) => record[key] !== undefined)\n .map((key) => [key, canonical(record[key])]),\n )\n }\n return value\n }\n return JSON.stringify(canonical(declaration))\n}\n\n// --- Policies -----------------------------------------------------------------\n\nexport interface GeneratedPolicy {\n name: string\n sql: string\n}\n\n/**\n * The RLS policies one entity requires on its storage table, generated from\n * the declaration:\n *\n * - `<staff>`: tenant members read and write their own rows — the\n * access.write='staff' rule plus tenant scoping, mirroring the plg_shop_*\n * tenant policies (user_tenant_ids()).\n * - `<public_read>` (only when access.read='public'): anonymous storefront\n * read, gated by the SAME published/strict-tenant functions the catalog\n * tables use (0020/0028), so a custom entity is never MORE visible than\n * the store's own products.\n *\n * On the shared generic table every predicate is additionally pinned to\n * `entity = '<key>'`, so one entity's policy can never widen another's rows.\n * A promoted entity (dedicated table) drops the pin: the table IS the entity.\n */\nexport function generateEntityPolicies(declaration: EntityDeclaration): GeneratedPolicy[] {\n const table = `public.${declaration.storage.table}`\n const pin = declaration.storage.mode === 'generic' ? `entity = ${sqlString(declaration.key)} AND ` : ''\n const policies: GeneratedPolicy[] = []\n\n const staffName = `plg_entity_${declaration.key}_staff`\n policies.push({\n name: staffName,\n sql: [\n `DROP POLICY IF EXISTS ${staffName} ON ${table};`,\n `CREATE POLICY ${staffName} ON ${table}`,\n ` FOR ALL TO authenticated`,\n ` USING (${pin}tenant_id IN (SELECT public.user_tenant_ids()))`,\n ` WITH CHECK (${pin}tenant_id IN (SELECT public.user_tenant_ids()));`,\n ].join('\\n'),\n })\n\n if (declaration.access.read === 'public') {\n const publicName = `plg_entity_${declaration.key}_public_read`\n policies.push({\n name: publicName,\n sql: [\n `DROP POLICY IF EXISTS ${publicName} ON ${table};`,\n `CREATE POLICY ${publicName} ON ${table}`,\n ` FOR SELECT TO anon, authenticated`,\n ` USING (${pin}tenant_id IN (SELECT public.storefront_published_tenants())`,\n ` AND (tenant_id NOT IN (SELECT public.storefront_strict_tenants())`,\n ` OR tenant_id = public.storefront_requested_store()));`,\n ].join('\\n'),\n })\n }\n\n return policies\n}\n\n/** The full generated RLS block for one entity, ready to apply or to diff. */\nexport function generateEntityRlsSql(declaration: EntityDeclaration): string {\n const header = `-- Generated from defineEntity(${sqlString(declaration.key)}) — never hand-edited (I6).`\n return [header, ...generateEntityPolicies(declaration).map((policy) => policy.sql)].join('\\n')\n}\n\n// --- Indexes ------------------------------------------------------------------\n\nexport interface GeneratedIndex {\n name: string\n sql: string\n}\n\n/** Name prefix under which one entity's generated indexes live — how the\n * reconciler tells its own indexes from everyone else's. */\nexport function entityIndexPrefix(declaration: EntityDeclaration): string {\n return `${declaration.storage.table}_${declaration.key}_`\n}\n\n/**\n * One expression index per declared index tuple, over the jsonb payload,\n * partial to the entity's rows on the shared table. `data->>'field'` matches\n * how the generic store filters, so the index serves the queries that exist.\n */\nexport function generateEntityIndexes(declaration: EntityDeclaration): GeneratedIndex[] {\n const table = `public.${declaration.storage.table}`\n return declaration.indexes.map((fields) => {\n const name = `${entityIndexPrefix(declaration)}${fields.join('_')}_idx`\n const expressions = fields.map((field) => `(data->>${sqlString(field)})`).join(', ')\n const where =\n declaration.storage.mode === 'generic' ? `\\n WHERE entity = ${sqlString(declaration.key)}` : ''\n return {\n name,\n sql: `CREATE INDEX IF NOT EXISTS ${name}\\n ON ${table} (${expressions})${where};`,\n }\n })\n}\n\n// --- Descriptor upsert --------------------------------------------------------\n\n/**\n * Mirror the declaration into plg_entity_types for the given tenant — the row\n * the NEXT reconciliation diffs against. jsonb comparison in the ON CONFLICT\n * keeps re-applying an unchanged declaration a true no-op.\n */\nexport function generateEntityDescriptorUpsertSql(declaration: EntityDeclaration, tenantId: string): string {\n const definition = serializeEntityDeclaration(declaration)\n return [\n `INSERT INTO public.${ENTITY_TYPES_TABLE} (tenant_id, key, definition)`,\n `VALUES (${sqlString(tenantId)}, ${sqlString(declaration.key)}, ${sqlString(definition)}::jsonb)`,\n `ON CONFLICT (tenant_id, key)`,\n `DO UPDATE SET definition = EXCLUDED.definition, updated_at = now()`,\n `WHERE ${ENTITY_TYPES_TABLE}.definition IS DISTINCT FROM EXCLUDED.definition;`,\n ].join('\\n')\n}\n","import type { EntityDeclaration, EntityField } from '@fayz-ai/core'\nimport {\n entityIndexPrefix,\n generateEntityDescriptorUpsertSql,\n generateEntityIndexes,\n generateEntityPolicies,\n} from './entity-sql'\n\n// ---------------------------------------------------------------------------\n// Declaration → DDL reconciler (I6). PURE: (declaration, observed schema\n// snapshot) → plan. The observed snapshot is an input VALUE — how it was read\n// (and whether the plan's safe half ever runs) belongs to the deploy pipeline,\n// under the live-DB protocol. Nothing here connects to anything.\n//\n// The split is the whole point, learned from Medusa's defineLink migrator:\n// additive operations (new descriptor, new field, new index, new policy) are\n// safe and can run unattended; anything that would lose data, narrow a type,\n// or narrow access lands in `quarantined` with an explanation and NEVER in\n// `safe` — an agent redeclaring an entity cannot drop a column by accident.\n// ---------------------------------------------------------------------------\n\n/** What the pipeline observed in the database for ONE entity, as a value. */\nexport interface ObservedEntitySchema {\n /** The plg_entity_types definition previously reconciled, or null the first\n * time. The shape serializeEntityDeclaration wrote (an EntityDeclaration). */\n descriptor: EntityDeclaration | null\n /** Index names present on the entity's storage table. */\n indexes: readonly string[]\n /** Policy names present on the entity's storage table. */\n policies: readonly string[]\n}\n\nexport interface QuarantinedDdl {\n sql: string\n /** Why this cannot run unattended — shown to whoever reviews the plan. */\n reason: string\n}\n\nexport interface EntityReconcilePlan {\n /** Additive, idempotent statements, in application order. */\n safe: string[]\n /** Destructive or narrowing statements. NEVER applied automatically. */\n quarantined: QuarantinedDdl[]\n}\n\nexport interface ReconcileEntityOptions {\n /** Tenant the descriptor upsert is scoped to. */\n tenantId: string\n}\n\ninterface FieldChange {\n field: string\n reason: string\n}\n\nfunction destructiveFieldChanges(\n previous: Record<string, EntityField>,\n next: Record<string, EntityField>,\n): FieldChange[] {\n const changes: FieldChange[] = []\n for (const [name, prevField] of Object.entries(previous)) {\n const nextField = next[name]\n if (!nextField) {\n changes.push({\n field: name,\n reason: `drops field \"${name}\": existing records keep the value in jsonb, but every reader, form and index loses it`,\n })\n continue\n }\n if (nextField.type !== prevField.type) {\n changes.push({\n field: name,\n reason: `changes field \"${name}\" from ${prevField.type} to ${nextField.type}: existing values were validated as ${prevField.type} and may not satisfy the new type`,\n })\n }\n if (nextField.required === true && prevField.required !== true) {\n changes.push({\n field: name,\n reason: `makes field \"${name}\" required: existing records without it would stop validating on their next write`,\n })\n }\n }\n return changes\n}\n\n/**\n * Diff one declaration against what the database was observed to hold and\n * produce the plan. Deterministic and total — same inputs, same plan.\n */\nexport function reconcileEntity(\n declaration: EntityDeclaration,\n observed: ObservedEntitySchema,\n options: ReconcileEntityOptions,\n): EntityReconcilePlan {\n const safe: string[] = []\n const quarantined: QuarantinedDdl[] = []\n\n // --- Descriptor: additive changes ride the upsert; destructive ones hold it.\n const upsert = generateEntityDescriptorUpsertSql(declaration, options.tenantId)\n const destructive = observed.descriptor\n ? destructiveFieldChanges(observed.descriptor.fields, declaration.fields)\n : []\n if (destructive.length > 0) {\n quarantined.push({\n sql: upsert,\n reason: destructive.map((change) => change.reason).join('; '),\n })\n } else if (!observed.descriptor) {\n safe.push(upsert)\n } else {\n // Additive-only evolution (new fields, widened display config). The upsert\n // itself no-ops when the definition is byte-identical.\n safe.push(upsert)\n }\n\n // --- Indexes: create what is declared and missing; quarantine what exists\n // under this entity's prefix and is no longer declared.\n const wantedIndexes = generateEntityIndexes(declaration)\n for (const index of wantedIndexes) {\n if (!observed.indexes.includes(index.name)) safe.push(index.sql)\n }\n const wantedIndexNames = new Set(wantedIndexes.map((index) => index.name))\n const prefix = entityIndexPrefix(declaration)\n for (const name of observed.indexes) {\n if (name.startsWith(prefix) && !wantedIndexNames.has(name)) {\n quarantined.push({\n sql: `DROP INDEX IF EXISTS public.${name};`,\n reason: `index \"${name}\" exists but the declaration no longer asks for it — dropping is reversible but degrades queries that may still run`,\n })\n }\n }\n\n // --- Policies: create what the declaration implies and the table lacks;\n // quarantine policies of this entity that the declaration no longer implies\n // (that is an ACCESS change, e.g. public read being withdrawn).\n const wantedPolicies = generateEntityPolicies(declaration)\n for (const policy of wantedPolicies) {\n if (!observed.policies.includes(policy.name)) safe.push(policy.sql)\n }\n const wantedPolicyNames = new Set(wantedPolicies.map((policy) => policy.name))\n const policyPrefix = `plg_entity_${declaration.key}_`\n for (const name of observed.policies) {\n if (name.startsWith(policyPrefix) && !wantedPolicyNames.has(name)) {\n quarantined.push({\n sql: `DROP POLICY IF EXISTS ${name} ON public.${declaration.storage.table};`,\n reason: `policy \"${name}\" grants access the declaration no longer declares — removing it narrows who can read/write and must be a deliberate act`,\n })\n }\n }\n\n return { safe, quarantined }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,29 @@
1
- export type { Product, ProductImage, Category, ProductEnquiry, ProductEnquiryStatus, Order, OrderItem, OrderStatus, FinancialStatus, FulfillmentStatus, ShopCustomer, Discount, DiscountType, DiscountMethod, DiscountStatus, ProductStatus, CreateProductInput, UpdateProductInput, ListProductsOptions, CreateProductEnquiryInput, ListProductEnquiriesOptions, CreateCategoryInput, UpdateCategoryInput, CreateOrderInput, UpdateOrderInput, ListOrdersOptions, CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput, CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, SalesChannel, SalesChannelKind, CreateSalesChannelInput, UpdateSalesChannelInput, PlaceOrderInput, PlaceOrderLine, DiscountValidation, InventoryLine, InventoryIssue, InventoryCheck, CartTotalLine, CartTotals, } from './types';
2
- export type { ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput, ShippingQuoteOption, CustomerAddress, } from './types';
3
- export type { ShopProvider } from './provider';
4
- export { validateDiscount, applyDiscount, checkInventory, computeCartTotals, getCustomerOrders, } from './commerce';
5
- export { SupabaseShopProvider, createSupabaseShopProvider } from './supabase-provider';
6
- export { MockShopProvider, createMockShopProvider } from './mock-provider';
7
- export type { MockShopSeed } from './mock-provider';
8
- export { setShopTenantResolver, getShopTenantId } from './tenant';
9
- export type { TenantResolver } from './tenant';
10
- export { getShopProvider, setShopProvider, resetShopProvider } from './runtime';
11
- export { MOCK_PRODUCTS, MOCK_CATEGORIES, MOCK_DISCOUNTS, svgPlaceholder, buildMockCatalog, } from './catalog';
12
- export type { CatalogInput, CatalogProductInput, CatalogCategoryInput } from './catalog';
1
+ export type { Product, ProductImage, Category, ProductEnquiry, ProductEnquiryStatus, Order, OrderItem, OrderStatus, FinancialStatus, FulfillmentStatus, ShopCustomer, Discount, DiscountType, DiscountMethod, DiscountStatus, ProductStatus, ProductOption, ProductVariant, ProductVariantSet, ProductOptionInput, CreateProductVariantInput, UpdateProductVariantInput, CreateProductInput, UpdateProductInput, ListProductsOptions, CreateProductEnquiryInput, ListProductEnquiriesOptions, CreateCategoryInput, UpdateCategoryInput, CreateOrderInput, UpdateOrderInput, ListOrdersOptions, CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput, CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, SalesChannel, SalesChannelKind, CreateSalesChannelInput, UpdateSalesChannelInput, PlaceOrderInput, PlaceOrderLine, DiscountValidation, InventoryLine, InventoryIssue, InventoryCheck, CartTotalLine, CartTotals, } from './types';
2
+ export type { ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput, ShippingPackage, ShippingPackageKind, CreateShippingPackageInput, UpdateShippingPackageInput, ShippingQuoteOption, CustomerAddress, ShippingSettings, UpdateShippingSettingsInput, DeliveryCheck, HandlingRequirement, ShippingProfile, CreateShippingProfileInput, UpdateShippingProfileInput, } from './types';
3
+ export type { StoreSettings, UpdateStoreSettingsInput, CheckoutFieldKey, CheckoutFieldPolicy, PaymentMethodKind, PaymentChargeMethod, PaymentCharge, PaymentChargeResult, CheckoutSessionInput, CheckoutSession, CheckoutSettlement, CreateFulfillmentInput, ShipFulfillmentInput, OrderShipment, ShippingLabel, ShippingLabelOption, ShippingAgency, } from './types';
4
+ export type { ShopProvider } from './data/provider';
5
+ export { validateDiscount, applyDiscount, checkInventory, computeCartTotals, getCustomerOrders, } from './lib/commerce';
6
+ export { SupabaseShopProvider, createSupabaseShopProvider } from './data/supabase-provider';
7
+ export { MockShopProvider, createMockShopProvider } from './data/mock-provider';
8
+ export type { MockShopSeed } from './data/mock-provider';
9
+ export { StockMovementError, registerStockStore, resolveStockStore, SupabaseStockStore, createSupabaseStockStore, MockStockStore, createMockStockStore, validateStockMovement, listStockMovementKinds, listStockReasonCodes, registerStockMovementKind, registerStockReasonCode, replayStockLedger, mirroredInventoryCount, STOCK_TRACKING_MODES, DEFAULT_STOCK_TRACKING, OWN_FULFILLMENT, } from './inventory';
10
+ export type { StockStore, StockTrackingMode, StockLocation, StockLocationKind, CreateStockLocationInput, UpdateStockLocationInput, StockLot, StockMovement, StockBalance, StockReservation, RecordStockMovementInput, ListStockBalancesOptions, ListStockLotsOptions, ListStockMovementsOptions, } from './inventory';
11
+ export { registerShippingLabelProvider, listShippingLabelProviders, resetShippingLabelProviders, resolveShippingLabelProvider, } from './shipping/label-provider';
12
+ export type { ShippingLabelProvider, ResolveShippingLabelOptions } from './shipping/label-provider';
13
+ export { setShopTenantResolver, getShopTenantId } from './data/tenant';
14
+ export type { TenantResolver } from './data/tenant';
15
+ export { setShopFunctionsUrl, getShopFunctionsUrl } from './data/functions';
16
+ export { getShopProvider, setShopProvider, resetShopProvider } from './lib/runtime';
17
+ export { MOCK_PRODUCTS, MOCK_CATEGORIES, MOCK_DISCOUNTS, svgPlaceholder, buildMockCatalog, } from './lib/catalog';
18
+ export type { CatalogInput, CatalogProductInput, CatalogCategoryInput } from './lib/catalog';
19
+ export { MAX_VARIANT_AXES, MAX_VARIANT_COMBINATIONS, variantOptionsKey, normalizeVariantAxes, variantCombinations, validateVariantAxes, planVariantMatrix, applyVariantMatrix, hasOnlyDefaultVariant, leavesNothingSellable, axesFromOptions, formatVariantCombination, } from './lib/variant-matrix';
20
+ export type { VariantAxisInput, VariantCombination, VariantMatrixRow, VariantMatrixPlan } from './lib/variant-matrix';
21
+ export { documentDigits, documentKind, formatDocument, isValidCnpj, isValidCpf, isValidDocument, } from './lib/document';
22
+ export type { DocumentKind } from './lib/document';
23
+ export { buildShopDomainEvents, buildShopMessageDefaults } from './lib/message-events';
24
+ export type { Collection, CreateCollectionInput, UpdateCollectionInput, CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput, CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, GiftCard, GiftCardStatus, CreateGiftCardInput, UpdateGiftCardInput, MediaFile, MediaFileKind, MediaFileReference, } from './types';
25
+ export { mediaKindOf, storagePathOf, displayNameOf, productImageToMediaFile, mergeMediaFiles, } from './data/media';
26
+ export { SHOP_EMAIL_EVENTS, EMAIL_PLACEHOLDERS, EMAIL_PREVIEW_SAMPLE, renderEmailTemplate, resolveEmailTemplates, } from './lib/emails';
27
+ export type { EmailEventDef, ResolvedEmailTemplate } from './lib/emails';
28
+ export type { EmailEventKey, EmailTemplateKind, EmailTemplate, UpsertEmailTemplateInput, } from './types';
13
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EACrE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EACjE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EACpE,aAAa,EACb,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC3D,yBAAyB,EAAE,2BAA2B,EACtD,mBAAmB,EAAE,mBAAmB,EACxC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EACrD,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EACpF,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAC9D,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,uBAAuB,EAChF,eAAe,EAAE,cAAc,EAC/B,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,GAC7F,MAAM,SAAS,CAAA;AAEhB,YAAY,EACV,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAC9D,mBAAmB,EAAE,eAAe,GACrC,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EACL,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,GACtF,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AACtF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG/E,OAAO,EACL,aAAa,EACb,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}