@nixxie-cms/core 1.0.3 → 2.0.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 (203) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/CHANGES-1.1.md +134 -0
  3. package/context/dist/nixxie-cms-core-context.cjs.js +4 -3
  4. package/context/dist/nixxie-cms-core-context.esm.js +3 -2
  5. package/dist/declarations/src/access.d.ts +2 -2
  6. package/dist/declarations/src/access.d.ts.map +1 -1
  7. package/dist/declarations/src/admin-ui/components/Navigation.d.ts +2 -2
  8. package/dist/declarations/src/admin-ui/components/Navigation.d.ts.map +1 -1
  9. package/dist/declarations/src/admin-ui/context.d.ts +6 -6
  10. package/dist/declarations/src/admin-ui/context.d.ts.map +1 -1
  11. package/dist/declarations/src/admin-ui/utils/Fields.d.ts +3 -3
  12. package/dist/declarations/src/admin-ui/utils/Fields.d.ts.map +1 -1
  13. package/dist/declarations/src/admin-ui/utils/filters.d.ts +5 -5
  14. package/dist/declarations/src/admin-ui/utils/filters.d.ts.map +1 -1
  15. package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts +3 -3
  16. package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts.map +1 -1
  17. package/dist/declarations/src/admin-ui/utils/utils.d.ts +2 -2
  18. package/dist/declarations/src/admin-ui/utils/utils.d.ts.map +1 -1
  19. package/dist/declarations/src/context.d.ts +1 -1
  20. package/dist/declarations/src/context.d.ts.map +1 -1
  21. package/dist/declarations/src/fields/types/bigInt/index.d.ts +3 -3
  22. package/dist/declarations/src/fields/types/bigInt/index.d.ts.map +1 -1
  23. package/dist/declarations/src/fields/types/bytes/index.d.ts +3 -3
  24. package/dist/declarations/src/fields/types/bytes/index.d.ts.map +1 -1
  25. package/dist/declarations/src/fields/types/calendarDay/index.d.ts +3 -3
  26. package/dist/declarations/src/fields/types/calendarDay/index.d.ts.map +1 -1
  27. package/dist/declarations/src/fields/types/checkbox/index.d.ts +3 -3
  28. package/dist/declarations/src/fields/types/checkbox/index.d.ts.map +1 -1
  29. package/dist/declarations/src/fields/types/decimal/index.d.ts +3 -3
  30. package/dist/declarations/src/fields/types/decimal/index.d.ts.map +1 -1
  31. package/dist/declarations/src/fields/types/file/index.d.ts +4 -4
  32. package/dist/declarations/src/fields/types/file/index.d.ts.map +1 -1
  33. package/dist/declarations/src/fields/types/float/index.d.ts +3 -3
  34. package/dist/declarations/src/fields/types/float/index.d.ts.map +1 -1
  35. package/dist/declarations/src/fields/types/image/index.d.ts +4 -4
  36. package/dist/declarations/src/fields/types/image/index.d.ts.map +1 -1
  37. package/dist/declarations/src/fields/types/integer/index.d.ts +3 -3
  38. package/dist/declarations/src/fields/types/integer/index.d.ts.map +1 -1
  39. package/dist/declarations/src/fields/types/json/index.d.ts +3 -3
  40. package/dist/declarations/src/fields/types/json/index.d.ts.map +1 -1
  41. package/dist/declarations/src/fields/types/multiselect/index.d.ts +3 -3
  42. package/dist/declarations/src/fields/types/multiselect/index.d.ts.map +1 -1
  43. package/dist/declarations/src/fields/types/multiselect/views/index.d.ts.map +1 -1
  44. package/dist/declarations/src/fields/types/password/index.d.ts +3 -3
  45. package/dist/declarations/src/fields/types/password/index.d.ts.map +1 -1
  46. package/dist/declarations/src/fields/types/relationship/index.d.ts +8 -8
  47. package/dist/declarations/src/fields/types/relationship/index.d.ts.map +1 -1
  48. package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts +3 -3
  49. package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts.map +1 -1
  50. package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts +3 -3
  51. package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts.map +1 -1
  52. package/dist/declarations/src/fields/types/relationship/views/index.d.ts +3 -3
  53. package/dist/declarations/src/fields/types/relationship/views/index.d.ts.map +1 -1
  54. package/dist/declarations/src/fields/types/relationship/views/types.d.ts +3 -3
  55. package/dist/declarations/src/fields/types/relationship/views/types.d.ts.map +1 -1
  56. package/dist/declarations/src/fields/types/select/index.d.ts +3 -3
  57. package/dist/declarations/src/fields/types/select/index.d.ts.map +1 -1
  58. package/dist/declarations/src/fields/types/text/index.d.ts +3 -3
  59. package/dist/declarations/src/fields/types/text/index.d.ts.map +1 -1
  60. package/dist/declarations/src/fields/types/timestamp/index.d.ts +3 -3
  61. package/dist/declarations/src/fields/types/timestamp/index.d.ts.map +1 -1
  62. package/dist/declarations/src/fields/types/virtual/index.d.ts +7 -7
  63. package/dist/declarations/src/fields/types/virtual/index.d.ts.map +1 -1
  64. package/dist/declarations/src/helpers.d.ts +249 -13
  65. package/dist/declarations/src/helpers.d.ts.map +1 -1
  66. package/dist/declarations/src/index.d.ts +9 -4
  67. package/dist/declarations/src/index.d.ts.map +1 -1
  68. package/dist/declarations/src/internal-unstable/admin-ui/pages/ListPage/index.d.ts.map +1 -1
  69. package/dist/declarations/src/lib/admin-meta.d.ts +11 -11
  70. package/dist/declarations/src/lib/admin-meta.d.ts.map +1 -1
  71. package/dist/declarations/src/lib/core/access-control.d.ts +18 -18
  72. package/dist/declarations/src/lib/core/access-control.d.ts.map +1 -1
  73. package/dist/declarations/src/lib/core/cascade.d.ts +47 -0
  74. package/dist/declarations/src/lib/core/cascade.d.ts.map +1 -0
  75. package/dist/declarations/src/lib/core/initialise-lists.d.ts +27 -24
  76. package/dist/declarations/src/lib/core/initialise-lists.d.ts.map +1 -1
  77. package/dist/declarations/src/lib/env.d.ts +9 -0
  78. package/dist/declarations/src/lib/env.d.ts.map +1 -0
  79. package/dist/declarations/src/lib/system.d.ts +1 -1
  80. package/dist/declarations/src/lib/system.d.ts.map +1 -1
  81. package/dist/declarations/src/list-features.d.ts +162 -0
  82. package/dist/declarations/src/list-features.d.ts.map +1 -0
  83. package/dist/declarations/src/schema.d.ts +24 -23
  84. package/dist/declarations/src/schema.d.ts.map +1 -1
  85. package/dist/declarations/src/session.d.ts +75 -0
  86. package/dist/declarations/src/session.d.ts.map +1 -1
  87. package/dist/declarations/src/types/admin-meta.d.ts +11 -11
  88. package/dist/declarations/src/types/admin-meta.d.ts.map +1 -1
  89. package/dist/declarations/src/types/config/access-control.d.ts +42 -42
  90. package/dist/declarations/src/types/config/access-control.d.ts.map +1 -1
  91. package/dist/declarations/src/types/config/fields.d.ts +19 -19
  92. package/dist/declarations/src/types/config/fields.d.ts.map +1 -1
  93. package/dist/declarations/src/types/config/hooks.d.ts +131 -131
  94. package/dist/declarations/src/types/config/hooks.d.ts.map +1 -1
  95. package/dist/declarations/src/types/config/index.d.ts +190 -8
  96. package/dist/declarations/src/types/config/index.d.ts.map +1 -1
  97. package/dist/declarations/src/types/config/lists.d.ts +146 -108
  98. package/dist/declarations/src/types/config/lists.d.ts.map +1 -1
  99. package/dist/declarations/src/types/context.d.ts +507 -47
  100. package/dist/declarations/src/types/context.d.ts.map +1 -1
  101. package/dist/declarations/src/types/next-fields.d.ts +28 -28
  102. package/dist/declarations/src/types/next-fields.d.ts.map +1 -1
  103. package/dist/declarations/src/types/type-info.d.ts +3 -3
  104. package/dist/declarations/src/types/type-info.d.ts.map +1 -1
  105. package/dist/{express-455ae20c.cjs.js → express-84d534c2.cjs.js} +6 -6
  106. package/dist/{express-7559ca2d.esm.js → express-d0a4ce99.esm.js} +6 -6
  107. package/dist/{index-15c8f81e.esm.js → index-5d8b0b4e.esm.js} +363 -183
  108. package/dist/index-6055753b.cjs.js +393 -0
  109. package/dist/{index-42045902.cjs.js → index-ac29f382.cjs.js} +363 -185
  110. package/dist/index-f1703b7b.esm.js +386 -0
  111. package/dist/nixxie-cms-core.cjs.js +1388 -30
  112. package/dist/nixxie-cms-core.esm.js +1362 -24
  113. package/dist/{non-null-graphql-add6bb3d.cjs.js → non-null-graphql-4a44c122.cjs.js} +1 -1
  114. package/dist/{non-null-graphql-a84ed64d.esm.js → non-null-graphql-8c5feaae.esm.js} +1 -1
  115. package/dist/{resolve-hooks-165a9ce2.cjs.js → resolve-hooks-10a5f84c.cjs.js} +240 -6
  116. package/dist/{resolve-hooks-6813a045.esm.js → resolve-hooks-9e676794.esm.js} +238 -7
  117. package/dist/{system-a321642d.cjs.js → system-6b37a5f8.cjs.js} +33 -7
  118. package/dist/{system-03e49e4f.esm.js → system-e591d821.esm.js} +33 -7
  119. package/fields/dist/nixxie-cms-core-fields.cjs.js +29 -576
  120. package/fields/dist/nixxie-cms-core-fields.esm.js +18 -565
  121. package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.cjs.js +4 -2
  122. package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.esm.js +4 -2
  123. package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.cjs.js +1 -6
  124. package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.esm.js +1 -6
  125. package/fields/types/password/dist/nixxie-cms-core-fields-types-password.cjs.js +4 -2
  126. package/fields/types/password/dist/nixxie-cms-core-fields-types-password.esm.js +4 -2
  127. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.cjs.js +4 -3
  128. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.esm.js +4 -3
  129. package/package.json +4 -4
  130. package/scripts/cli/dist/nixxie-cms-core-scripts-cli.cjs.js +4 -3
  131. package/scripts/cli/dist/nixxie-cms-core-scripts-cli.esm.js +4 -3
  132. package/scripts/dist/nixxie-cms-core-scripts.cjs.js +4 -3
  133. package/scripts/dist/nixxie-cms-core-scripts.esm.js +4 -3
  134. package/session/dist/nixxie-cms-core-session.cjs.js +286 -0
  135. package/session/dist/nixxie-cms-core-session.esm.js +279 -1
  136. package/src/access.ts +25 -25
  137. package/src/admin-ui/admin-meta-graphql.ts +5 -5
  138. package/src/admin-ui/components/CreateButtonLink.tsx +46 -46
  139. package/src/admin-ui/components/Navigation.tsx +3 -3
  140. package/src/admin-ui/context.tsx +6 -6
  141. package/src/admin-ui/utils/Fields.tsx +241 -241
  142. package/src/admin-ui/utils/actionData.ts +36 -36
  143. package/src/admin-ui/utils/filters.ts +148 -148
  144. package/src/admin-ui/utils/useCreateItem.ts +171 -171
  145. package/src/admin-ui/utils/utils.tsx +127 -127
  146. package/src/context.ts +1 -1
  147. package/src/fields/non-null-graphql.ts +115 -115
  148. package/src/fields/types/bigInt/index.ts +6 -6
  149. package/src/fields/types/bytes/index.ts +6 -6
  150. package/src/fields/types/calendarDay/index.ts +18 -19
  151. package/src/fields/types/checkbox/index.ts +6 -6
  152. package/src/fields/types/decimal/index.ts +6 -6
  153. package/src/fields/types/file/index.ts +8 -8
  154. package/src/fields/types/float/index.ts +6 -6
  155. package/src/fields/types/image/index.ts +8 -8
  156. package/src/fields/types/integer/index.ts +6 -6
  157. package/src/fields/types/json/index.ts +5 -5
  158. package/src/fields/types/multiselect/index.ts +7 -7
  159. package/src/fields/types/multiselect/views/index.tsx +149 -151
  160. package/src/fields/types/password/index.ts +6 -6
  161. package/src/fields/types/relationship/index.ts +13 -13
  162. package/src/fields/types/relationship/views/ComboboxMany.tsx +110 -110
  163. package/src/fields/types/relationship/views/ComboboxSingle.tsx +115 -115
  164. package/src/fields/types/relationship/views/ContextualActions.tsx +139 -139
  165. package/src/fields/types/relationship/views/index.tsx +492 -492
  166. package/src/fields/types/relationship/views/types.ts +46 -46
  167. package/src/fields/types/relationship/views/useApolloQuery.ts +185 -185
  168. package/src/fields/types/relationship/views/useFilter.tsx +109 -109
  169. package/src/fields/types/select/index.ts +6 -6
  170. package/src/fields/types/text/index.ts +6 -6
  171. package/src/fields/types/timestamp/index.ts +23 -21
  172. package/src/fields/types/virtual/index.ts +11 -11
  173. package/src/helpers.ts +773 -42
  174. package/src/index.ts +66 -24
  175. package/src/internal-unstable/admin-ui/pages/ItemPage/common.tsx +4 -4
  176. package/src/internal-unstable/admin-ui/pages/ItemPage/index.tsx +5 -5
  177. package/src/internal-unstable/admin-ui/pages/ListPage/index.tsx +8 -8
  178. package/src/lib/admin-meta.ts +369 -369
  179. package/src/lib/context/createContext.ts +6 -0
  180. package/src/lib/core/access-control.ts +434 -434
  181. package/src/lib/core/cascade.ts +236 -0
  182. package/src/lib/core/initialise-lists.ts +49 -33
  183. package/src/lib/core/mutations/index.ts +7 -0
  184. package/src/lib/core/mutations/nested-mutation-many-input-resolvers.ts +145 -145
  185. package/src/lib/core/mutations/nested-mutation-one-input-resolvers.ts +71 -71
  186. package/src/lib/core/queries/output-field.ts +178 -178
  187. package/src/lib/env.ts +50 -0
  188. package/src/lib/id-field.ts +2 -2
  189. package/src/lib/system.ts +221 -207
  190. package/src/lib/typescript-schema-printer.ts +227 -227
  191. package/src/list-features.ts +476 -0
  192. package/src/schema.ts +92 -22
  193. package/src/session.ts +225 -0
  194. package/src/types/admin-meta.ts +218 -218
  195. package/src/types/config/access-control.ts +186 -186
  196. package/src/types/config/fields.ts +96 -96
  197. package/src/types/config/hooks.ts +529 -529
  198. package/src/types/config/index.ts +206 -7
  199. package/src/types/config/lists.ts +606 -565
  200. package/src/types/context.ts +592 -55
  201. package/src/types/next-fields.ts +31 -31
  202. package/src/types/type-info.ts +38 -38
  203. package/src/types/type-tests.ts +21 -21
@@ -1,188 +1,14 @@
1
+ import './resolve-hooks-9e676794.esm.js';
2
+ import 'node:crypto';
1
3
  import 'pluralize';
2
- import { g, f as fieldType, o as orderDirectionEnum } from './next-fields-9bf04ed8.esm.js';
3
- import { p as postgresql, s as sqlite, a as mysql } from './resolve-hooks-6813a045.esm.js';
4
- import { m as makeValidateHook, d as defaultIsRequired } from './non-null-graphql-a84ed64d.esm.js';
5
- import 'node:path';
4
+ import { f as fieldType, g, o as orderDirectionEnum } from './next-fields-9bf04ed8.esm.js';
5
+ import { g as getAdminMetaForRelationshipField } from './admin-meta-14c60fec.esm.js';
6
6
  import '@graphql-ts/schema';
7
7
  import '@graphql-ts/extend';
8
- import { g as getAdminMetaForRelationshipField } from './admin-meta-14c60fec.esm.js';
9
-
10
- const objectEntriesButAssumeNoExtraProperties = Object.entries;
11
- function internalResolveFilter(entries, mode) {
12
- const entry = entries.shift();
13
- if (entry === undefined) return {};
14
- const [key, val] = entry;
15
- if (val == null) {
16
- return {
17
- AND: [{
18
- [key]: val
19
- }, internalResolveFilter(entries, mode)]
20
- };
21
- }
22
- switch (key) {
23
- case 'equals':
24
- case 'lt':
25
- case 'lte':
26
- case 'gt':
27
- case 'gte':
28
- case 'in':
29
- case 'contains':
30
- case 'startsWith':
31
- case 'endsWith':
32
- {
33
- return {
34
- AND: [{
35
- [key]: val,
36
- mode
37
- }, {
38
- not: null
39
- }, internalResolveFilter(entries, mode)]
40
- };
41
- }
42
- case 'notIn':
43
- {
44
- return {
45
- AND: [{
46
- NOT: [internalResolveFilter(objectEntriesButAssumeNoExtraProperties({
47
- in: val
48
- }), mode)]
49
- }, internalResolveFilter(entries, mode)]
50
- };
51
- }
52
- case 'not':
53
- {
54
- return {
55
- AND: [{
56
- NOT: [internalResolveFilter(objectEntriesButAssumeNoExtraProperties(val), mode)]
57
- }, internalResolveFilter(entries, mode)]
58
- };
59
- }
60
- }
61
- }
62
- function resolveCommon(val) {
63
- if (val === null) return null;
64
- return internalResolveFilter(objectEntriesButAssumeNoExtraProperties(val), undefined);
65
- }
66
- function resolveString(val) {
67
- if (val === null) return null;
68
- const {
69
- mode,
70
- ...value
71
- } = val;
72
- return internalResolveFilter(objectEntriesButAssumeNoExtraProperties(value), mode !== null && mode !== void 0 ? mode : undefined);
73
- }
74
-
75
- var filters = /*#__PURE__*/Object.freeze({
76
- __proto__: null,
77
- postgresql: postgresql,
78
- sqlite: sqlite,
79
- mysql: mysql,
80
- resolveCommon: resolveCommon,
81
- resolveString: resolveString
82
- });
83
-
84
- function timestamp(config = {}) {
85
- const {
86
- isIndexed,
87
- defaultValue,
88
- validation
89
- } = config;
90
- return meta => {
91
- var _config$db, _config$db2, _config$db3, _config$db4, _validation$isRequire;
92
- if (typeof defaultValue === 'string') {
93
- try {
94
- g.DateTime.parseValue(defaultValue);
95
- } catch (err) {
96
- throw new Error(`${meta.listKey}.${meta.fieldKey}.defaultValue is required to be an ISO8601 date-time string such as ${new Date().toISOString()}`);
97
- }
98
- }
99
- const parsedDefaultValue = typeof defaultValue === 'string' ? g.DateTime.parseValue(defaultValue) : defaultValue;
100
- // `db.updatedAt` (Prisma `@updatedAt`) and a `defaultValue` are both filled by the database, so
101
- // the value is not "required" on create even when the column is non-nullable — otherwise
102
- // `timestamp({ db: { updatedAt: true, isNullable: false } })` (e.g. via withTimestamps) would
103
- // fail create validation with "missing value".
104
- const hasPrismaDefaultValue = defaultValue !== undefined || Boolean((_config$db = config.db) === null || _config$db === void 0 ? void 0 : _config$db.updatedAt);
105
- const {
106
- mode,
107
- validate
108
- } = makeValidateHook(meta, config, undefined, hasPrismaDefaultValue);
109
- return fieldType({
110
- kind: 'scalar',
111
- mode,
112
- scalar: 'DateTime',
113
- index: isIndexed === true ? 'index' : isIndexed || undefined,
114
- default: typeof defaultValue === 'string' ? {
115
- kind: 'literal',
116
- value: defaultValue
117
- } : defaultValue === undefined ? undefined : {
118
- kind: 'now'
119
- },
120
- updatedAt: (_config$db2 = config.db) === null || _config$db2 === void 0 ? void 0 : _config$db2.updatedAt,
121
- map: (_config$db3 = config.db) === null || _config$db3 === void 0 ? void 0 : _config$db3.map,
122
- extendPrismaSchema: (_config$db4 = config.db) === null || _config$db4 === void 0 ? void 0 : _config$db4.extendPrismaSchema
123
- })({
124
- ...config,
125
- ...defaultIsRequired(config, (_validation$isRequire = validation === null || validation === void 0 ? void 0 : validation.isRequired) !== null && _validation$isRequire !== void 0 ? _validation$isRequire : false),
126
- hooks: {
127
- ...config.hooks,
128
- validate
129
- },
130
- input: {
131
- uniqueWhere: isIndexed === 'unique' ? {
132
- arg: g.arg({
133
- type: g.DateTime
134
- })
135
- } : undefined,
136
- where: {
137
- arg: g.arg({
138
- type: filters[meta.provider].DateTime[mode]
139
- }),
140
- resolve: mode === 'optional' ? resolveCommon : undefined
141
- },
142
- create: {
143
- arg: g.arg({
144
- type: g.DateTime,
145
- // TODO: add support for defaultValue of { kind: 'now' } in the GraphQL API
146
- defaultValue: parsedDefaultValue instanceof Date ? parsedDefaultValue : undefined
147
- }),
148
- resolve(val) {
149
- if (val === undefined) {
150
- var _config$db5;
151
- if (parsedDefaultValue === undefined && (_config$db5 = config.db) !== null && _config$db5 !== void 0 && _config$db5.updatedAt) return undefined;
152
- if (parsedDefaultValue instanceof Date || parsedDefaultValue === undefined) {
153
- return parsedDefaultValue !== null && parsedDefaultValue !== void 0 ? parsedDefaultValue : null;
154
- }
155
- return new Date();
156
- }
157
- return val;
158
- }
159
- },
160
- update: {
161
- arg: g.arg({
162
- type: g.DateTime
163
- })
164
- },
165
- orderBy: {
166
- arg: g.arg({
167
- type: orderDirectionEnum
168
- })
169
- }
170
- },
171
- output: g.field({
172
- type: g.DateTime
173
- }),
174
- __nxTelemetryFieldTypeName: '@nixxie-cms/timestamp',
175
- views: '@nixxie-cms/core/fields/types/timestamp/views',
176
- getAdminMeta() {
177
- var _config$db$updatedAt, _config$db6;
178
- return {
179
- defaultValue: defaultValue !== null && defaultValue !== void 0 ? defaultValue : null,
180
- updatedAt: (_config$db$updatedAt = (_config$db6 = config.db) === null || _config$db6 === void 0 ? void 0 : _config$db6.updatedAt) !== null && _config$db$updatedAt !== void 0 ? _config$db$updatedAt : false
181
- };
182
- }
183
- });
184
- };
185
- }
8
+ import { h as humanize } from './utils-0cc426c8.esm.js';
9
+ import { f as filters, r as resolveCommon, b as resolveString } from './index-f1703b7b.esm.js';
10
+ import { m as makeValidateHook, d as defaultIsRequired } from './non-null-graphql-8c5feaae.esm.js';
11
+ import 'node:path';
186
12
 
187
13
  // This is the default display mode for Relationships
188
14
 
@@ -421,4 +247,358 @@ function relationship({
421
247
  };
422
248
  }
423
249
 
424
- export { resolveCommon as a, resolveString as b, filters as f, relationship as r, timestamp as t };
250
+ // these are the lowest and highest values for a signed 32-bit integer
251
+ const MAX_INT$1 = 2147483647;
252
+ const MIN_INT$1 = -2147483648;
253
+ function select(config) {
254
+ const {
255
+ isIndexed,
256
+ ui: {
257
+ displayMode = 'select',
258
+ ...ui
259
+ } = {},
260
+ defaultValue,
261
+ validation
262
+ } = config;
263
+ return meta => {
264
+ var _validation$isRequire, _config$db, _config$db2;
265
+ const options = config.options.map(option => {
266
+ if (typeof option === 'string') {
267
+ return {
268
+ label: humanize(option),
269
+ value: option
270
+ };
271
+ }
272
+ return option;
273
+ });
274
+ const accepted = new Set(options.map(x => x.value));
275
+ if (accepted.size !== options.length) {
276
+ throw new Error(`${meta.listKey}.${meta.fieldKey}: duplicate options, this is not allowed`);
277
+ }
278
+ const {
279
+ mode,
280
+ validate
281
+ } = makeValidateHook(meta, config, ({
282
+ resolvedData,
283
+ operation,
284
+ addValidationError
285
+ }) => {
286
+ if (operation === 'delete') return;
287
+ const value = resolvedData[meta.fieldKey];
288
+ if (value != null && !accepted.has(value)) {
289
+ addValidationError(`value is not an accepted option`);
290
+ }
291
+ });
292
+ const commonConfig = {
293
+ ...config,
294
+ mode,
295
+ ...defaultIsRequired({
296
+ ui
297
+ }, (_validation$isRequire = validation === null || validation === void 0 ? void 0 : validation.isRequired) !== null && _validation$isRequire !== void 0 ? _validation$isRequire : false),
298
+ hooks: {
299
+ ...config.hooks,
300
+ validate
301
+ },
302
+ __nxTelemetryFieldTypeName: '@nixxie-cms/select',
303
+ views: '@nixxie-cms/core/fields/types/select/views',
304
+ getAdminMeta: () => {
305
+ var _config$type;
306
+ return {
307
+ options,
308
+ type: (_config$type = config.type) !== null && _config$type !== void 0 ? _config$type : 'string',
309
+ displayMode: displayMode,
310
+ defaultValue: defaultValue !== null && defaultValue !== void 0 ? defaultValue : null
311
+ };
312
+ }
313
+ };
314
+ const commonDbFieldConfig = {
315
+ mode,
316
+ index: isIndexed === true ? 'index' : isIndexed || undefined,
317
+ default: defaultValue === undefined ? undefined : {
318
+ kind: 'literal',
319
+ value: defaultValue
320
+ },
321
+ map: (_config$db = config.db) === null || _config$db === void 0 ? void 0 : _config$db.map,
322
+ extendPrismaSchema: (_config$db2 = config.db) === null || _config$db2 === void 0 ? void 0 : _config$db2.extendPrismaSchema
323
+ };
324
+ const resolveCreate = val => {
325
+ if (val === undefined) {
326
+ var _ref;
327
+ return (_ref = defaultValue) !== null && _ref !== void 0 ? _ref : null;
328
+ }
329
+ return val;
330
+ };
331
+ if (config.type === 'integer') {
332
+ if (config.options.some(({
333
+ value
334
+ }) => !Number.isInteger(value) || value > MAX_INT$1 || value < MIN_INT$1)) {
335
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies integer values that are outside the range of a 32-bit signed integer`);
336
+ }
337
+ return fieldType({
338
+ kind: 'scalar',
339
+ scalar: 'Int',
340
+ ...commonDbFieldConfig
341
+ })({
342
+ ...commonConfig,
343
+ input: {
344
+ uniqueWhere: isIndexed === 'unique' ? {
345
+ arg: g.arg({
346
+ type: g.Int
347
+ })
348
+ } : undefined,
349
+ where: {
350
+ arg: g.arg({
351
+ type: filters[meta.provider].Int[mode]
352
+ }),
353
+ resolve: mode === 'required' ? undefined : resolveCommon
354
+ },
355
+ create: {
356
+ arg: g.arg({
357
+ type: g.Int,
358
+ defaultValue: typeof defaultValue === 'number' ? defaultValue : undefined
359
+ }),
360
+ resolve: resolveCreate
361
+ },
362
+ update: {
363
+ arg: g.arg({
364
+ type: g.Int
365
+ })
366
+ },
367
+ orderBy: {
368
+ arg: g.arg({
369
+ type: orderDirectionEnum
370
+ })
371
+ }
372
+ },
373
+ output: g.field({
374
+ type: g.Int
375
+ })
376
+ });
377
+ }
378
+ if (config.type === 'enum') {
379
+ const enumName = `${meta.listKey}${humanize(meta.fieldKey).replace(/ /g, '')}Type`;
380
+ const enumValues = options.map(x => `${x.value}`);
381
+ const graphQLType = g.enum({
382
+ name: enumName,
383
+ values: g.enumValues(enumValues)
384
+ });
385
+ return fieldType(meta.provider === 'sqlite' ? {
386
+ kind: 'scalar',
387
+ scalar: 'String',
388
+ ...commonDbFieldConfig
389
+ } : {
390
+ kind: 'enum',
391
+ values: enumValues,
392
+ name: enumName,
393
+ ...commonDbFieldConfig
394
+ })({
395
+ ...commonConfig,
396
+ input: {
397
+ uniqueWhere: isIndexed === 'unique' ? {
398
+ arg: g.arg({
399
+ type: graphQLType
400
+ })
401
+ } : undefined,
402
+ where: {
403
+ arg: g.arg({
404
+ type: filters[meta.provider].enum(graphQLType).optional
405
+ }),
406
+ resolve: mode === 'required' ? undefined : resolveCommon
407
+ },
408
+ create: {
409
+ arg: g.arg({
410
+ type: graphQLType,
411
+ defaultValue: typeof defaultValue === 'string' ? defaultValue : undefined
412
+ }),
413
+ resolve: resolveCreate
414
+ },
415
+ update: {
416
+ arg: g.arg({
417
+ type: graphQLType
418
+ })
419
+ },
420
+ orderBy: {
421
+ arg: g.arg({
422
+ type: orderDirectionEnum
423
+ })
424
+ }
425
+ },
426
+ output: g.field({
427
+ type: graphQLType
428
+ })
429
+ });
430
+ }
431
+ return fieldType({
432
+ kind: 'scalar',
433
+ scalar: 'String',
434
+ ...commonDbFieldConfig
435
+ })({
436
+ ...commonConfig,
437
+ input: {
438
+ uniqueWhere: isIndexed === 'unique' ? {
439
+ arg: g.arg({
440
+ type: g.String
441
+ })
442
+ } : undefined,
443
+ where: {
444
+ arg: g.arg({
445
+ type: filters[meta.provider].String[mode]
446
+ }),
447
+ resolve: mode === 'required' ? undefined : resolveString
448
+ },
449
+ create: {
450
+ arg: g.arg({
451
+ type: g.String,
452
+ defaultValue: typeof defaultValue === 'string' ? defaultValue : undefined
453
+ }),
454
+ resolve: resolveCreate
455
+ },
456
+ update: {
457
+ arg: g.arg({
458
+ type: g.String
459
+ })
460
+ },
461
+ orderBy: {
462
+ arg: g.arg({
463
+ type: orderDirectionEnum
464
+ })
465
+ }
466
+ },
467
+ output: g.field({
468
+ type: g.String
469
+ })
470
+ });
471
+ };
472
+ }
473
+
474
+ // for a signed 32-bit integer
475
+ const MAX_INT = 0x7fffffff;
476
+ const MIN_INT = -0x80000000;
477
+ function integer(config = {}) {
478
+ var _defaultValue_$kind;
479
+ const {
480
+ defaultValue: defaultValue_,
481
+ isIndexed,
482
+ validation = {}
483
+ } = config;
484
+ const {
485
+ isRequired = false,
486
+ min,
487
+ max
488
+ } = validation;
489
+ const defaultValue = typeof defaultValue_ === 'number' ? defaultValue_ : (_defaultValue_$kind = defaultValue_ === null || defaultValue_ === void 0 ? void 0 : defaultValue_.kind) !== null && _defaultValue_$kind !== void 0 ? _defaultValue_$kind : null;
490
+ return meta => {
491
+ var _config$db, _config$db2;
492
+ if (typeof defaultValue === 'number' && !Number.isInteger(defaultValue)) {
493
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies a default value of: ${defaultValue} but it must be a valid finite number`);
494
+ }
495
+ if (min !== undefined && !Number.isInteger(min)) {
496
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies validation.min: ${min} but it must be an integer`);
497
+ }
498
+ if (max !== undefined && !Number.isInteger(max)) {
499
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies validation.max: ${max} but it must be an integer`);
500
+ }
501
+ if (min !== undefined && (min > MAX_INT || min < MIN_INT)) {
502
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies validation.min: ${min} which is outside of the range of a 32-bit signed integer`);
503
+ }
504
+ if (max !== undefined && (max > MAX_INT || max < MIN_INT)) {
505
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies validation.max: ${max} which is outside of the range of a 32-bit signed integer`);
506
+ }
507
+ if (min !== undefined && max !== undefined && min > max) {
508
+ throw new Error(`${meta.listKey}.${meta.fieldKey} specifies a validation.max that is less than the validation.min, and therefore has no valid options`);
509
+ }
510
+ const hasAdditionalValidation = min !== undefined || max !== undefined;
511
+ const {
512
+ mode,
513
+ validate
514
+ } = makeValidateHook(meta, config, hasAdditionalValidation ? ({
515
+ resolvedData,
516
+ operation,
517
+ addValidationError
518
+ }) => {
519
+ if (operation === 'delete') return;
520
+ const value = resolvedData[meta.fieldKey];
521
+ if (typeof value === 'number') {
522
+ if (min !== undefined && value < min) {
523
+ addValidationError(`value must be greater than or equal to ${min}`);
524
+ }
525
+ if (max !== undefined && value > max) {
526
+ addValidationError(`value must be less than or equal to ${max}`);
527
+ }
528
+ }
529
+ } : undefined, defaultValue !== null);
530
+ return fieldType({
531
+ kind: 'scalar',
532
+ mode,
533
+ scalar: 'Int',
534
+ index: isIndexed === true ? 'index' : isIndexed || undefined,
535
+ default: typeof defaultValue === 'number' ? {
536
+ kind: 'literal',
537
+ value: defaultValue
538
+ } : defaultValue === 'autoincrement' ? {
539
+ kind: 'autoincrement'
540
+ } : undefined,
541
+ map: (_config$db = config.db) === null || _config$db === void 0 ? void 0 : _config$db.map,
542
+ extendPrismaSchema: (_config$db2 = config.db) === null || _config$db2 === void 0 ? void 0 : _config$db2.extendPrismaSchema
543
+ })({
544
+ ...config,
545
+ ...defaultIsRequired(config, isRequired),
546
+ hooks: {
547
+ ...config.hooks,
548
+ validate
549
+ },
550
+ input: {
551
+ uniqueWhere: isIndexed === 'unique' ? {
552
+ arg: g.arg({
553
+ type: g.Int
554
+ })
555
+ } : undefined,
556
+ where: {
557
+ arg: g.arg({
558
+ type: filters[meta.provider].Int[mode]
559
+ }),
560
+ resolve: mode === 'optional' ? resolveCommon : undefined
561
+ },
562
+ create: {
563
+ arg: g.arg({
564
+ type: g.Int,
565
+ defaultValue: typeof defaultValue === 'number' ? defaultValue : undefined
566
+ }),
567
+ resolve(value) {
568
+ if (value === undefined) {
569
+ if (defaultValue === 'autoincrement') return undefined;
570
+ return defaultValue;
571
+ }
572
+ return value;
573
+ }
574
+ },
575
+ update: {
576
+ arg: g.arg({
577
+ type: g.Int
578
+ })
579
+ },
580
+ orderBy: {
581
+ arg: g.arg({
582
+ type: orderDirectionEnum
583
+ })
584
+ }
585
+ },
586
+ output: g.field({
587
+ type: g.Int
588
+ }),
589
+ __nxTelemetryFieldTypeName: '@nixxie-cms/integer',
590
+ views: '@nixxie-cms/core/fields/types/integer/views',
591
+ getAdminMeta() {
592
+ return {
593
+ validation: {
594
+ min: min !== null && min !== void 0 ? min : MIN_INT,
595
+ max: max !== null && max !== void 0 ? max : MAX_INT
596
+ },
597
+ defaultValue
598
+ };
599
+ }
600
+ });
601
+ };
602
+ }
603
+
604
+ export { integer as i, relationship as r, select as s };