@opensaas/stack-core 0.20.1 → 0.22.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 (136) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +334 -0
  3. package/CLAUDE.md +29 -11
  4. package/dist/access/access-filter.d.ts +29 -0
  5. package/dist/access/access-filter.d.ts.map +1 -0
  6. package/dist/access/access-filter.js +68 -0
  7. package/dist/access/access-filter.js.map +1 -0
  8. package/dist/access/engine.d.ts +15 -48
  9. package/dist/access/engine.d.ts.map +1 -1
  10. package/dist/access/engine.js +14 -280
  11. package/dist/access/engine.js.map +1 -1
  12. package/dist/access/field-access.d.ts +44 -0
  13. package/dist/access/field-access.d.ts.map +1 -0
  14. package/dist/access/field-access.js +123 -0
  15. package/dist/access/field-access.js.map +1 -0
  16. package/dist/access/field-access.test.d.ts +2 -0
  17. package/dist/access/field-access.test.d.ts.map +1 -0
  18. package/dist/access/{engine.test.js → field-access.test.js} +2 -2
  19. package/dist/access/field-access.test.js.map +1 -0
  20. package/dist/access/field-visibility.d.ts +13 -0
  21. package/dist/access/field-visibility.d.ts.map +1 -0
  22. package/dist/access/field-visibility.js +178 -0
  23. package/dist/access/field-visibility.js.map +1 -0
  24. package/dist/access/index.d.ts +4 -1
  25. package/dist/access/index.d.ts.map +1 -1
  26. package/dist/access/index.js +8 -1
  27. package/dist/access/index.js.map +1 -1
  28. package/dist/access/multi-column-read-write.test.d.ts +2 -0
  29. package/dist/access/multi-column-read-write.test.d.ts.map +1 -0
  30. package/dist/access/multi-column-read-write.test.js +149 -0
  31. package/dist/access/multi-column-read-write.test.js.map +1 -0
  32. package/dist/config/index.d.ts +1 -1
  33. package/dist/config/index.d.ts.map +1 -1
  34. package/dist/config/types.d.ts +334 -5
  35. package/dist/config/types.d.ts.map +1 -1
  36. package/dist/context/hook-pipeline.d.ts +49 -0
  37. package/dist/context/hook-pipeline.d.ts.map +1 -0
  38. package/dist/context/hook-pipeline.js +75 -0
  39. package/dist/context/hook-pipeline.js.map +1 -0
  40. package/dist/context/index.d.ts.map +1 -1
  41. package/dist/context/index.js +30 -462
  42. package/dist/context/index.js.map +1 -1
  43. package/dist/context/nested-operations.d.ts.map +1 -1
  44. package/dist/context/nested-operations.js +72 -68
  45. package/dist/context/nested-operations.js.map +1 -1
  46. package/dist/context/write-pipeline.d.ts +158 -0
  47. package/dist/context/write-pipeline.d.ts.map +1 -0
  48. package/dist/context/write-pipeline.js +306 -0
  49. package/dist/context/write-pipeline.js.map +1 -0
  50. package/dist/extend.d.ts +3 -0
  51. package/dist/extend.d.ts.map +1 -0
  52. package/dist/extend.js +10 -0
  53. package/dist/extend.js.map +1 -0
  54. package/dist/fields/format-prisma-default.d.ts +35 -0
  55. package/dist/fields/format-prisma-default.d.ts.map +1 -0
  56. package/dist/fields/format-prisma-default.js +52 -0
  57. package/dist/fields/format-prisma-default.js.map +1 -0
  58. package/dist/fields/format-prisma-default.test.d.ts +2 -0
  59. package/dist/fields/format-prisma-default.test.d.ts.map +1 -0
  60. package/dist/fields/format-prisma-default.test.js +54 -0
  61. package/dist/fields/format-prisma-default.test.js.map +1 -0
  62. package/dist/fields/index.d.ts +1 -0
  63. package/dist/fields/index.d.ts.map +1 -1
  64. package/dist/fields/index.js +267 -18
  65. package/dist/fields/index.js.map +1 -1
  66. package/dist/fields/select.test.js +85 -0
  67. package/dist/fields/select.test.js.map +1 -1
  68. package/dist/fields/text-keystone-compat.test.d.ts +2 -0
  69. package/dist/fields/text-keystone-compat.test.d.ts.map +1 -0
  70. package/dist/fields/text-keystone-compat.test.js +93 -0
  71. package/dist/fields/text-keystone-compat.test.js.map +1 -0
  72. package/dist/hooks/index.d.ts +20 -0
  73. package/dist/hooks/index.d.ts.map +1 -1
  74. package/dist/hooks/index.js +246 -0
  75. package/dist/hooks/index.js.map +1 -1
  76. package/dist/index.d.ts +6 -8
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +25 -9
  79. package/dist/index.js.map +1 -1
  80. package/dist/index.test.d.ts +2 -0
  81. package/dist/index.test.d.ts.map +1 -0
  82. package/dist/index.test.js +33 -0
  83. package/dist/index.test.js.map +1 -0
  84. package/dist/internal.d.ts +8 -0
  85. package/dist/internal.d.ts.map +1 -0
  86. package/dist/internal.js +16 -0
  87. package/dist/internal.js.map +1 -0
  88. package/dist/mcp/handler.js +0 -1
  89. package/dist/mcp/handler.js.map +1 -1
  90. package/dist/validation/field-config.d.ts +55 -0
  91. package/dist/validation/field-config.d.ts.map +1 -0
  92. package/dist/validation/field-config.js +100 -0
  93. package/dist/validation/field-config.js.map +1 -0
  94. package/dist/validation/field-config.test.d.ts +2 -0
  95. package/dist/validation/field-config.test.d.ts.map +1 -0
  96. package/dist/validation/field-config.test.js +159 -0
  97. package/dist/validation/field-config.test.js.map +1 -0
  98. package/package.json +11 -3
  99. package/src/access/access-filter.ts +97 -0
  100. package/src/access/engine.ts +13 -396
  101. package/src/access/{engine.test.ts → field-access.test.ts} +1 -1
  102. package/src/access/field-access.ts +159 -0
  103. package/src/access/field-visibility.ts +269 -0
  104. package/src/access/index.ts +7 -4
  105. package/src/access/multi-column-read-write.test.ts +255 -0
  106. package/src/config/index.ts +3 -0
  107. package/src/config/types.ts +342 -4
  108. package/src/context/hook-pipeline.ts +160 -0
  109. package/src/context/index.ts +29 -667
  110. package/src/context/nested-operations.ts +142 -111
  111. package/src/context/write-pipeline.ts +543 -0
  112. package/src/extend.ts +19 -0
  113. package/src/fields/format-prisma-default.test.ts +64 -0
  114. package/src/fields/format-prisma-default.ts +67 -0
  115. package/src/fields/index.ts +375 -20
  116. package/src/fields/select.test.ts +99 -0
  117. package/src/fields/text-keystone-compat.test.ts +126 -0
  118. package/src/hooks/index.ts +270 -0
  119. package/src/index.test.ts +50 -0
  120. package/src/index.ts +35 -82
  121. package/src/internal.ts +49 -0
  122. package/src/mcp/handler.ts +0 -2
  123. package/src/validation/field-config.test.ts +199 -0
  124. package/src/validation/field-config.ts +145 -0
  125. package/tests/access-relationships.test.ts +4 -4
  126. package/tests/access.test.ts +1 -1
  127. package/tests/field-hooks.test.ts +410 -0
  128. package/tests/field-types.test.ts +1 -1
  129. package/tests/hook-pipeline.test.ts +233 -0
  130. package/tests/nested-operation-registry.test.ts +206 -0
  131. package/tests/write-pipeline.test.ts +588 -0
  132. package/tsconfig.tsbuildinfo +1 -1
  133. package/vitest.config.ts +43 -1
  134. package/dist/access/engine.test.d.ts +0 -2
  135. package/dist/access/engine.test.d.ts.map +0 -1
  136. package/dist/access/engine.test.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { text, integer } from './index.js';
3
+ /**
4
+ * Unit coverage for Keystone-compat mode on text() (issue #475).
5
+ *
6
+ * Keystone 6 gives every non-null text column an implicit empty-string default.
7
+ * The `keystoneCompat` flag (db.keystoneCompat) reaches text()'s getPrismaType as
8
+ * the 4th positional argument — the same way provider/listName already do — and
9
+ * emits `@default("")` for a non-null text column that has no explicit default.
10
+ *
11
+ * These tests pin the precise on/off/explicit-default/nullable/non-text matrix
12
+ * from the issue's acceptance criteria.
13
+ */
14
+ describe('text() Keystone-compat empty-string default', () => {
15
+ const KEYSTONE_COMPAT = true;
16
+ describe('with keystoneCompat ON', () => {
17
+ it('emits @default("") for a required (non-null) text field without an explicit default', () => {
18
+ const field = text({ validation: { isRequired: true } });
19
+ const result = field.getPrismaType('name', 'sqlite', 'User', KEYSTONE_COMPAT);
20
+ expect(result.type).toBe('String');
21
+ expect(result.modifiers).toBe('@default("")');
22
+ });
23
+ it('emits @default("") for a non-null text field made non-null via db.isNullable: false', () => {
24
+ // Non-null at the DB level even though validation does not mark it required.
25
+ const field = text({ db: { isNullable: false } });
26
+ const result = field.getPrismaType('phone', 'sqlite', 'User', KEYSTONE_COMPAT);
27
+ expect(result.modifiers).toBe('@default("")');
28
+ });
29
+ it('does NOT emit a default for a nullable text field', () => {
30
+ // Optional → nullable; Keystone-compat must leave it alone.
31
+ const field = text();
32
+ const result = field.getPrismaType('bio', 'sqlite', 'User', KEYSTONE_COMPAT);
33
+ expect(result.modifiers).toBe('?');
34
+ expect(result.modifiers).not.toContain('@default');
35
+ });
36
+ it('does NOT emit a default for a text field made nullable via db.isNullable: true', () => {
37
+ // Required validation, but explicitly nullable at the DB level.
38
+ const field = text({ validation: { isRequired: true }, db: { isNullable: true } });
39
+ const result = field.getPrismaType('note', 'sqlite', 'User', KEYSTONE_COMPAT);
40
+ expect(result.modifiers).toBe('?');
41
+ expect(result.modifiers).not.toContain('@default');
42
+ });
43
+ it('lets an explicit defaultValue win over the compat empty-string default', () => {
44
+ const field = text({ validation: { isRequired: true }, defaultValue: 'PLEASE_UPDATE' });
45
+ const result = field.getPrismaType('status', 'sqlite', 'Account', KEYSTONE_COMPAT);
46
+ expect(result.modifiers).toBe('@default("PLEASE_UPDATE")');
47
+ expect(result.modifiers).not.toContain('@default("")');
48
+ });
49
+ it('honours an explicit empty-string defaultValue without double-emitting', () => {
50
+ const field = text({ validation: { isRequired: true }, defaultValue: '' });
51
+ const result = field.getPrismaType('label', 'sqlite', 'Account', KEYSTONE_COMPAT);
52
+ // A single @default("") — the explicit default, not a duplicate.
53
+ expect(result.modifiers).toBe('@default("")');
54
+ expect(result.modifiers.match(/@default/g)).toHaveLength(1);
55
+ });
56
+ it('places @default("") alongside other modifiers in the expected order', () => {
57
+ const field = text({
58
+ validation: { isRequired: true },
59
+ isIndexed: 'unique',
60
+ db: { nativeType: 'Text', map: 'full_name' },
61
+ });
62
+ const result = field.getPrismaType('fullName', 'postgresql', 'User', KEYSTONE_COMPAT);
63
+ // nativeType → default → unique → map, matching the builder's modifier order.
64
+ expect(result.modifiers).toBe('@db.Text @default("") @unique @map("full_name")');
65
+ });
66
+ });
67
+ describe('with keystoneCompat OFF (default)', () => {
68
+ it('emits no default for a required text field when the flag is omitted', () => {
69
+ const field = text({ validation: { isRequired: true } });
70
+ const result = field.getPrismaType('name', 'sqlite', 'User');
71
+ expect(result.modifiers).toBeUndefined();
72
+ });
73
+ it('emits no default for a required text field when the flag is explicitly false', () => {
74
+ const field = text({ validation: { isRequired: true } });
75
+ const result = field.getPrismaType('name', 'sqlite', 'User', false);
76
+ expect(result.modifiers).toBeUndefined();
77
+ });
78
+ it('still honours an explicit defaultValue when the flag is off', () => {
79
+ const field = text({ validation: { isRequired: true }, defaultValue: 'PLEASE_UPDATE' });
80
+ const result = field.getPrismaType('status', 'sqlite', 'Account', false);
81
+ expect(result.modifiers).toBe('@default("PLEASE_UPDATE")');
82
+ });
83
+ });
84
+ describe('non-text fields are unaffected by the flag', () => {
85
+ it('does not give a required integer field an empty-string default under keystoneCompat', () => {
86
+ const field = integer({ validation: { isRequired: true } });
87
+ const result = field.getPrismaType('count', 'sqlite', 'Widget', KEYSTONE_COMPAT);
88
+ expect(result.type).toBe('Int');
89
+ expect(result.modifiers ?? '').not.toContain('@default');
90
+ });
91
+ });
92
+ });
93
+ //# sourceMappingURL=text-keystone-compat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-keystone-compat.test.js","sourceRoot":"","sources":["../../src/fields/text-keystone-compat.test.ts"],"names":[],"mappings":"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"}
@@ -113,6 +113,26 @@ export declare function executeAfterOperation<TOutput = Record<string, unknown>,
113
113
  originalItem: TOutput;
114
114
  context: AccessContext;
115
115
  }): Promise<void>;
116
+ /**
117
+ * Execute field-level resolveInput hooks
118
+ * Allows fields to transform their input values before database write
119
+ */
120
+ export declare function executeFieldResolveInputHooks(inputData: Record<string, any>, resolvedData: Record<string, any>, fields: Record<string, FieldConfig>, operation: 'create' | 'update', context: AccessContext, listKey: string, item?: any): Promise<Record<string, unknown>>;
121
+ /**
122
+ * Execute field-level validate hooks
123
+ * Allows fields to perform custom validation after resolveInput but before database write
124
+ */
125
+ export declare function executeFieldValidateHooks(inputData: Record<string, any> | undefined, resolvedData: Record<string, any> | undefined, fields: Record<string, FieldConfig>, operation: 'create' | 'update' | 'delete', context: AccessContext, listKey: string, item?: any): Promise<void>;
126
+ /**
127
+ * Execute field-level beforeOperation hooks (side effects only)
128
+ * Allows fields to perform side effects before database write
129
+ */
130
+ export declare function executeFieldBeforeOperationHooks(inputData: Record<string, any>, resolvedData: Record<string, any>, fields: Record<string, FieldConfig>, operation: 'create' | 'update' | 'delete', context: AccessContext, listKey: string, item?: any): Promise<void>;
131
+ /**
132
+ * Execute field-level afterOperation hooks (side effects only)
133
+ * Allows fields to perform side effects after database operations
134
+ */
135
+ export declare function executeFieldAfterOperationHooks(item: any, inputData: Record<string, unknown> | undefined, resolvedData: Record<string, unknown> | undefined, fields: Record<string, FieldConfig>, operation: 'create' | 'update' | 'delete', context: AccessContext, listKey: string, originalItem?: any): Promise<void>;
116
136
  /**
117
137
  * Validate field-level validation rules using Zod
118
138
  * Checks isRequired, length constraints, etc.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAIrD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACjC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBAE9B,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;CAMvE;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAER,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAMrF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEtC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,SAAS,EAC7D,IAAI,EACA;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,aAAa,CAAA;CACvB,GACJ,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC,CAOtC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEtC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,SAAS,EAC7D,IAAI,EACA;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,aAAa,CAAA;CACvB,GACJ,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,wBAAkB,CAAA;AAEnD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEtC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,SAAS,EAC7D,IAAI,EACA;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,aAAa,CAAA;CACvB,GACJ,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEtC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,SAAS,EAC7D,IAAI,EACA;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;IACrB,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,aAAa,CAAA;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,aAAa,CAAA;CACvB,GACJ,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CAEjD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAE9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EAEf,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsElC;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAE7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAE1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EAEf,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAEpD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAE9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EAEf,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CAEnD,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC9C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EAEf,YAAY,CAAC,EAAE,GAAG,GACjB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACzC,SAAS,GAAE,QAAQ,GAAG,QAAmB,GACxC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAW3D"}
@@ -1,4 +1,5 @@
1
1
  import { validateWithZod } from '../validation/schema.js';
2
+ import { checkFieldAccess } from '../access/field-access.js';
2
3
  /**
3
4
  * Validation error collection
4
5
  */
@@ -83,6 +84,251 @@ export async function executeAfterOperation(hooks, args) {
83
84
  }
84
85
  await hooks.afterOperation(args);
85
86
  }
87
+ /**
88
+ * Execute field-level resolveInput hooks
89
+ * Allows fields to transform their input values before database write
90
+ */
91
+ export async function executeFieldResolveInputHooks(
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ inputData,
94
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
+ resolvedData, fields, operation, context, listKey,
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ item) {
98
+ let result = { ...resolvedData };
99
+ for (const [fieldKey, fieldConfig] of Object.entries(fields)) {
100
+ // Skip if field not in data
101
+ if (!(fieldKey in result))
102
+ continue;
103
+ // A field's resolveInput produces its resolved value; for most fields that
104
+ // value is stored back under the same key. Multi-column fields additionally
105
+ // split that value across their physical columns below.
106
+ let resolvedValue = result[fieldKey];
107
+ if (fieldConfig.hooks?.resolveInput) {
108
+ // Execute field hook
109
+ // Type assertion is safe here because hooks are typed correctly in field definitions
110
+ // and we're working with runtime values that match those types
111
+ resolvedValue = await fieldConfig.hooks.resolveInput({
112
+ listKey,
113
+ fieldKey,
114
+ operation,
115
+ inputData,
116
+ item,
117
+ resolvedData: { ...result }, // Pass a copy to avoid mutation affecting recorded args
118
+ context,
119
+ });
120
+ }
121
+ else if (!fieldConfig.splitColumns) {
122
+ // No resolveInput and not a multi-column field — nothing to do.
123
+ continue;
124
+ }
125
+ if (fieldConfig.splitColumns) {
126
+ // Multi-column field (e.g. storage image()/file() in Keystone-parity
127
+ // mode): replace the single logical key with its per-part columns so the
128
+ // write payload targets the live columns instead of a single one.
129
+ //
130
+ // The split removes the logical key from the payload BEFORE the
131
+ // canonical writable-field filter (`filterWritableFields`) runs, and the
132
+ // raw per-part column keys are not in `fieldConfigs` — so that later
133
+ // filter cannot enforce this field's own write access. Enforce it HERE,
134
+ // using the canonical field-access evaluator with the SAME arguments the
135
+ // write pipeline uses. A single-column field denied by `update`/`create`
136
+ // is simply omitted from the write; a denied multi-column field must
137
+ // likewise contribute NONE of its per-part columns. (sudo bypasses via
138
+ // `checkFieldAccess`.)
139
+ const canWrite = await checkFieldAccess(fieldConfig.access, operation, {
140
+ session: context.session,
141
+ item,
142
+ context,
143
+ inputData,
144
+ });
145
+ if (!canWrite) {
146
+ // Denied: drop the logical key and write none of its columns — exactly
147
+ // as filterWritableFields drops a denied single-column field.
148
+ const next = { ...result };
149
+ delete next[fieldKey];
150
+ result = next;
151
+ continue;
152
+ }
153
+ const columns = fieldConfig.splitColumns(fieldKey, resolvedValue);
154
+ // Drop the logical key (it is not a real column) and merge the columns.
155
+ const next = { ...result, ...columns };
156
+ delete next[fieldKey];
157
+ result = next;
158
+ }
159
+ else {
160
+ // Create new object with updated field to avoid mutating the passed reference
161
+ result = { ...result, [fieldKey]: resolvedValue };
162
+ }
163
+ }
164
+ return result;
165
+ }
166
+ /**
167
+ * Execute field-level validate hooks
168
+ * Allows fields to perform custom validation after resolveInput but before database write
169
+ */
170
+ export async function executeFieldValidateHooks(
171
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
172
+ inputData,
173
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
174
+ resolvedData, fields, operation, context, listKey,
175
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
+ item) {
177
+ const errors = [];
178
+ const fieldErrors = {};
179
+ const addValidationError = (fieldKey) => (msg) => {
180
+ errors.push(msg);
181
+ fieldErrors[fieldKey] = msg;
182
+ };
183
+ for (const [fieldKey, fieldConfig] of Object.entries(fields)) {
184
+ // Support both 'validate' (new) and 'validateInput' (deprecated) for backwards compatibility
185
+ const validateHook = fieldConfig.hooks?.validate ?? fieldConfig.hooks?.validateInput;
186
+ if (!validateHook)
187
+ continue;
188
+ // Execute field hook
189
+ // Type assertion is safe here because hooks are typed correctly in field definitions
190
+ if (operation === 'delete') {
191
+ await validateHook({
192
+ listKey,
193
+ fieldKey,
194
+ operation: 'delete',
195
+ item,
196
+ context,
197
+ addValidationError: addValidationError(fieldKey),
198
+ });
199
+ }
200
+ else if (operation === 'create') {
201
+ await validateHook({
202
+ listKey,
203
+ fieldKey,
204
+ operation: 'create',
205
+ inputData,
206
+ item: undefined,
207
+ resolvedData,
208
+ context,
209
+ addValidationError: addValidationError(fieldKey),
210
+ });
211
+ }
212
+ else {
213
+ // operation === 'update'
214
+ await validateHook({
215
+ listKey,
216
+ fieldKey,
217
+ operation: 'update',
218
+ inputData,
219
+ item,
220
+ resolvedData,
221
+ context,
222
+ addValidationError: addValidationError(fieldKey),
223
+ });
224
+ }
225
+ }
226
+ if (errors.length > 0) {
227
+ throw new ValidationError(errors, fieldErrors);
228
+ }
229
+ }
230
+ /**
231
+ * Execute field-level beforeOperation hooks (side effects only)
232
+ * Allows fields to perform side effects before database write
233
+ */
234
+ export async function executeFieldBeforeOperationHooks(
235
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
+ inputData,
237
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
+ resolvedData, fields, operation, context, listKey,
239
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
240
+ item) {
241
+ for (const [fieldKey, fieldConfig] of Object.entries(fields)) {
242
+ // Skip if no hooks defined
243
+ if (!fieldConfig.hooks?.beforeOperation)
244
+ continue;
245
+ // Skip if field not in data (for create/update)
246
+ if (operation !== 'delete' && !(fieldKey in resolvedData))
247
+ continue;
248
+ // Execute field hook (side effects only, no return value used)
249
+ // Type assertion is safe here because hooks are typed correctly in field definitions
250
+ if (operation === 'delete') {
251
+ await fieldConfig.hooks.beforeOperation({
252
+ listKey,
253
+ fieldKey,
254
+ operation: 'delete',
255
+ item,
256
+ context,
257
+ });
258
+ }
259
+ else if (operation === 'create') {
260
+ await fieldConfig.hooks.beforeOperation({
261
+ listKey,
262
+ fieldKey,
263
+ operation: 'create',
264
+ inputData,
265
+ resolvedData,
266
+ context,
267
+ });
268
+ }
269
+ else {
270
+ // operation === 'update'
271
+ await fieldConfig.hooks.beforeOperation({
272
+ listKey,
273
+ fieldKey,
274
+ operation: 'update',
275
+ inputData,
276
+ item,
277
+ resolvedData,
278
+ context,
279
+ });
280
+ }
281
+ }
282
+ }
283
+ /**
284
+ * Execute field-level afterOperation hooks (side effects only)
285
+ * Allows fields to perform side effects after database operations
286
+ */
287
+ export async function executeFieldAfterOperationHooks(
288
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
289
+ item, inputData, resolvedData, fields, operation, context, listKey,
290
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
291
+ originalItem) {
292
+ for (const [fieldKey, fieldConfig] of Object.entries(fields)) {
293
+ // Skip if no hooks defined
294
+ if (!fieldConfig.hooks?.afterOperation)
295
+ continue;
296
+ // Execute field hook (side effects only, no return value used)
297
+ if (operation === 'delete') {
298
+ await fieldConfig.hooks.afterOperation({
299
+ listKey,
300
+ fieldKey,
301
+ operation: 'delete',
302
+ originalItem,
303
+ context,
304
+ });
305
+ }
306
+ else if (operation === 'create') {
307
+ await fieldConfig.hooks.afterOperation({
308
+ listKey,
309
+ fieldKey,
310
+ operation: 'create',
311
+ inputData,
312
+ item,
313
+ resolvedData,
314
+ context,
315
+ });
316
+ }
317
+ else {
318
+ // operation === 'update'
319
+ await fieldConfig.hooks.afterOperation({
320
+ listKey,
321
+ fieldKey,
322
+ operation: 'update',
323
+ inputData,
324
+ originalItem,
325
+ item,
326
+ resolvedData,
327
+ context,
328
+ });
329
+ }
330
+ }
331
+ }
86
332
  /**
87
333
  * Validate field-level validation rules using Zod
88
334
  * Checks isRequired, length constraints, etc.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,11 @@
1
1
  export { config, list } from './config/index.js';
2
- export type { OpenSaasConfig, ListConfig, FieldConfig, BaseFieldConfig, TextField, IntegerField, CheckboxField, TimestampField, PasswordField, SelectField, RelationshipField, JsonField, VirtualField, TypeDescriptor, TypeInfo, OperationAccess, Hooks, FieldHooks, FieldsWithTypeInfo, DatabaseConfig, SessionConfig, UIConfig, ThemeConfig, ThemePreset, ThemeColors, McpConfig, McpToolsConfig, McpAuthConfig, ListMcpConfig, McpCustomTool, FileMetadata, ImageMetadata, ImageTransformationResult, Plugin, PluginContext, GeneratedFiles, ResolveInputHookArgs, ValidateHookArgs, BeforeOperationHookArgs, AfterOperationHookArgs, FieldResolveInputHookArgs, FieldValidateHookArgs, FieldBeforeOperationHookArgs, FieldAfterOperationHookArgs, FieldResolveOutputHookArgs, } from './config/index.js';
3
- export type { AccessControl, FieldAccess, Session, AccessContext, PrismaFilter, AccessControlledDB, StorageUtils, AugmentedFindMany, AugmentedFindUnique, FindManyQueryArgs, } from './access/index.js';
2
+ export type { OpenSaasConfig, OutputConfig, ListConfig, DatabaseConfig, FieldConfig, OperationAccess, } from './config/index.js';
3
+ export type { AccessControl, FieldAccess, Session, AccessContext, PrismaFilter, } from './access/index.js';
4
4
  export { getContext } from './context/index.js';
5
- export type { PrismaClientLike } from './access/types.js';
6
- export type { ServerActionProps } from './context/index.js';
7
- export { getDbKey, getUrlKey, getListKeyFromUrl, pascalToCamel, pascalToKebab, kebabToPascal, kebabToCamel, } from './lib/case-utils.js';
5
+ export { getDbKey, getUrlKey, getListKeyFromUrl } from './lib/case-utils.js';
8
6
  export { ValidationError } from './hooks/index.js';
9
- export { validateWithZod, generateZodSchema } from './validation/schema.js';
10
- export { hashPassword, comparePassword, isHashedPassword, HashedPassword, } from './utils/password.js';
7
+ export { validateFieldConfig, validateConfigFields } from './validation/field-config.js';
8
+ export type { FieldConfigValidationError } from './validation/field-config.js';
11
9
  export { defineFragment, runQuery, runQueryOne } from './query/index.js';
12
- export type { Fragment, FieldSelection, ResultOf, RelationSelector, QueryArgs, QueryRunnerContext, } from './query/index.js';
10
+ export type { ResultOf, RelationSelector, QueryArgs } from './query/index.js';
13
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,eAAe,EACf,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,yBAAyB,EAEzB,MAAM,EACN,aAAa,EACb,cAAc,EAEd,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EAEtB,yBAAyB,EACzB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAG3D,OAAO,EACL,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG3E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACxE,YAAY,EACV,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,kBAAkB,GACnB,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAKhD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,WAAW,EACX,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAG5E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAMlD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACxF,YAAY,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAQ9E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACxE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -1,14 +1,30 @@
1
- // Config system
1
+ // ───────────────────────────────────────────────────────────────
2
+ // @opensaas/stack-core — consumer entry point
3
+ //
4
+ // The everyday surface for defining a config and using a context.
5
+ // • Field builders → '@opensaas/stack-core/fields'
6
+ // • Plugin / field authoring → '@opensaas/stack-core/extend'
7
+ // • MCP runtime → '@opensaas/stack-core/mcp'
8
+ // Internal plumbing lives on '@opensaas/stack-core/internal' (unstable).
9
+ // ───────────────────────────────────────────────────────────────
10
+ // Config builders
2
11
  export { config, list } from './config/index.js';
3
- // Context
12
+ // Context factory
4
13
  export { getContext } from './context/index.js';
5
- // Utilities
6
- export { getDbKey, getUrlKey, getListKeyFromUrl, pascalToCamel, pascalToKebab, kebabToPascal, kebabToCamel, } from './lib/case-utils.js';
7
- // Hooks and validation
14
+ // Naming utilities (documented public helpers; used for URLs and db keys)
15
+ export { getDbKey, getUrlKey, getListKeyFromUrl } from './lib/case-utils.js';
16
+ // Validation error surfaced by write operations
8
17
  export { ValidationError } from './hooks/index.js';
9
- export { validateWithZod, generateZodSchema } from './validation/schema.js';
10
- // Password utilities
11
- export { hashPassword, comparePassword, isHashedPassword, HashedPassword, } from './utils/password.js';
12
- // Query utilities fragment-based, type-safe query helpers
18
+ // Field self-containment validation checks each field implements the
19
+ // generation contract (getPrismaType / getTypeScriptType / getZodSchema, or
20
+ // getPrismaRelation for relationships) so a misimplemented field fails early
21
+ // with a clear per-field message instead of deep inside generation.
22
+ export { validateFieldConfig, validateConfigFields } from './validation/field-config.js';
23
+ // Fragment-based query API — composable, type-safe reads that mirror
24
+ // Keystone's GraphQL fragments without a GraphQL runtime. The migration
25
+ // guide, CHANGELOG, and migrate-context-calls skill all advertise importing
26
+ // these from the root entry point. The internal runtime helpers (isFragment,
27
+ // buildInclude, pickFields) and the Fragment/FieldSelection types stay off the
28
+ // root surface — those live on '@opensaas/stack-core/internal'.
13
29
  export { defineFragment, runQuery, runQueryOne } from './query/index.js';
14
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAkEhD,UAAU;AACV,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAI/C,YAAY;AACZ,OAAO,EACL,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,qBAAqB,CAAA;AAE5B,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE3E,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,qBAAqB,CAAA;AAE5B,4DAA4D;AAC5D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,8CAA8C;AAC9C,EAAE;AACF,kEAAkE;AAClE,gEAAgE;AAChE,gEAAgE;AAChE,6DAA6D;AAC7D,yEAAyE;AACzE,kEAAkE;AAElE,kBAAkB;AAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAuBhD,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,0EAA0E;AAC1E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5E,gDAAgD;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,uEAAuE;AACvE,4EAA4E;AAC5E,6EAA6E;AAC7E,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGxF,qEAAqE;AACrE,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,gEAAgE;AAChE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect, expectTypeOf } from 'vitest';
2
+ // Import from the package root entry point exactly as the docs / CHANGELOG /
3
+ // migrate-context-calls skill instruct consumers to. If the root `index.ts`
4
+ // stops re-exporting the query API, this file fails to type-check / run,
5
+ // preventing a silent regression (issue #496).
6
+ import { defineFragment, runQuery, runQueryOne } from './index.js';
7
+ describe('@opensaas/stack-core root entry point — query API re-exports (issue #496)', () => {
8
+ it('re-exports the runtime query functions from the package root', () => {
9
+ expect(typeof defineFragment).toBe('function');
10
+ expect(typeof runQuery).toBe('function');
11
+ expect(typeof runQueryOne).toBe('function');
12
+ });
13
+ it('defineFragment imported from the root produces a usable fragment', () => {
14
+ const userFragment = defineFragment()({ id: true, name: true });
15
+ expect(userFragment._type).toBe('fragment');
16
+ expect(userFragment._fields).toEqual({ id: true, name: true });
17
+ });
18
+ it('exposes ResultOf as a usable type alias from the root', () => {
19
+ const userFragment = defineFragment()({ id: true, name: true });
20
+ expect(userFragment._type).toBe('fragment');
21
+ // Type-level assertion: ResultOf<typeof fragment> narrows to the selection.
22
+ expectTypeOf().toEqualTypeOf();
23
+ });
24
+ it('exposes QueryArgs and RelationSelector as usable types from the root', () => {
25
+ // Type-level usage — these annotations only compile if the types resolve
26
+ // from the root entry point.
27
+ const args = { where: { id: 'abc' }, take: 5 };
28
+ expect(args.take).toBe(5);
29
+ const selector = defineFragment()({ id: true });
30
+ expectTypeOf(selector).not.toBeNever();
31
+ });
32
+ });
33
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC3D,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAalE,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACzF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACxC,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,YAAY,GAAG,cAAc,EAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAW,CAAC,CAAA;QAE9E,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC3C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,YAAY,GAAG,cAAc,EAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAW,CAAC,CAAA;QAC9E,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAE3C,4EAA4E;QAC5E,YAAY,EAAiC,CAAC,aAAa,EAAgC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,yEAAyE;QACzE,6BAA6B;QAC7B,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;QACzD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEzB,MAAM,QAAQ,GAA2B,cAAc,EAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAW,CAAC,CAAA;QACtF,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export type { ServerActionProps } from './context/index.js';
2
+ export type { PrismaClientLike, AccessControlledDB, StorageUtils, AugmentedFindMany, AugmentedFindUnique, FindManyQueryArgs, } from './access/types.js';
3
+ export type { Fragment, FieldSelection } from './query/index.js';
4
+ export { hashPassword, comparePassword, isHashedPassword, HashedPassword, } from './utils/password.js';
5
+ export { pascalToCamel, pascalToKebab, kebabToPascal, kebabToCamel } from './lib/case-utils.js';
6
+ export { validateWithZod, generateZodSchema } from './validation/schema.js';
7
+ export type { DatabaseConfig, SessionConfig, ThemeConfig, ThemePreset, ThemeColors, FileMetadata, ImageMetadata, ImageTransformationResult, } from './config/index.js';
8
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAWA,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGhE,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAG/F,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG3E,YAAY,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,16 @@
1
+ // ───────────────────────────────────────────────────────────────
2
+ // @opensaas/stack-core/internal
3
+ //
4
+ // @internal — plumbing shared between the @opensaas/* packages and the
5
+ // code emitted by the generator (`.opensaas/`). NOT a public API: these
6
+ // exports carry NO semver guarantees and may change or disappear in any
7
+ // release. Application authors should never import from this path; use
8
+ // the root entry point, `/fields`, or `/extend` instead.
9
+ // ───────────────────────────────────────────────────────────────
10
+ // Password hashing internals (the password field emits HashedPassword into generated types)
11
+ export { hashPassword, comparePassword, isHashedPassword, HashedPassword, } from './utils/password.js';
12
+ // Case conversion helpers used by sibling packages
13
+ export { pascalToCamel, pascalToKebab, kebabToPascal, kebabToCamel } from './lib/case-utils.js';
14
+ // Zod schema helpers used internally for validation
15
+ export { validateWithZod, generateZodSchema } from './validation/schema.js';
16
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,gCAAgC;AAChC,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,wEAAwE;AACxE,uEAAuE;AACvE,yDAAyD;AACzD,kEAAkE;AAgBlE,4FAA4F;AAC5F,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,qBAAqB,CAAA;AAE5B,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAE/F,oDAAoD;AACpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -325,7 +325,6 @@ async function handleToolsCall(
325
325
  params, session, config, getContext, id) {
326
326
  const toolName = params?.name;
327
327
  const toolArgs = params?.arguments || {};
328
- console.log('Handling tool call:', toolName, toolArgs);
329
328
  if (!toolName) {
330
329
  return new Response(JSON.stringify({
331
330
  jsonrpc: '2.0',