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