@nixxie-cms/core 1.0.0 → 1.0.2

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 (187) hide show
  1. package/README.md +2 -2
  2. package/admin-ui/components/dist/nixxie-cms-core-admin-ui-components.cjs.js +4 -4
  3. package/admin-ui/components/dist/nixxie-cms-core-admin-ui-components.esm.js +4 -4
  4. package/admin-ui/context/dist/nixxie-cms-core-admin-ui-context.cjs.js +2 -2
  5. package/admin-ui/context/dist/nixxie-cms-core-admin-ui-context.esm.js +2 -2
  6. package/context/dist/nixxie-cms-core-context.cjs.js +2 -2
  7. package/context/dist/nixxie-cms-core-context.esm.js +2 -2
  8. package/dist/{CreateItemDialog-33335548.esm.js → CreateItemDialog-7008b050.esm.js} +1 -1
  9. package/dist/{CreateItemDialog-56cf59b7.cjs.js → CreateItemDialog-a0cab315.cjs.js} +1 -1
  10. package/dist/{PageContainer-7db73317.esm.js → PageContainer-5ae731cc.esm.js} +25 -18
  11. package/dist/{PageContainer-27c27f10.cjs.js → PageContainer-abd7159f.cjs.js} +25 -18
  12. package/dist/{admin-meta-graphql-6f7f5331.esm.js → admin-meta-graphql-0e6e606e.esm.js} +1 -1
  13. package/dist/{admin-meta-graphql-c8f926e9.cjs.js → admin-meta-graphql-306c224a.cjs.js} +1 -1
  14. package/dist/{context-3132c3ed.esm.js → context-af9957ed.esm.js} +2 -2
  15. package/dist/{context-e7a45152.cjs.js → context-b5204629.cjs.js} +2 -2
  16. package/dist/declarations/src/admin-ui/components/Navigation.d.ts.map +1 -1
  17. package/dist/declarations/src/admin-ui/components/PageContainer.d.ts.map +1 -1
  18. package/dist/declarations/src/helpers.d.ts.map +1 -1
  19. package/dist/declarations/src/index.d.ts +1 -0
  20. package/dist/declarations/src/index.d.ts.map +1 -1
  21. package/dist/declarations/src/internal-unstable/admin-ui/id-field-view.d.ts.map +1 -0
  22. package/dist/declarations/src/internal-unstable/admin-ui/pages/App/index.d.ts.map +1 -0
  23. package/dist/declarations/src/internal-unstable/admin-ui/pages/CreateItemPage/index.d.ts.map +1 -0
  24. package/dist/declarations/src/internal-unstable/admin-ui/pages/HomePage/index.d.ts.map +1 -0
  25. package/dist/declarations/src/internal-unstable/admin-ui/pages/ItemPage/index.d.ts.map +1 -0
  26. package/dist/declarations/src/internal-unstable/admin-ui/pages/ListPage/index.d.ts.map +1 -0
  27. package/dist/declarations/src/internal-unstable/admin-ui/pages/NoAccessPage/index.d.ts.map +1 -0
  28. package/dist/declarations/src/internal-unstable/artifacts.d.ts.map +1 -0
  29. package/dist/declarations/src/lib/core/initialise-lists.d.ts +1 -1
  30. package/dist/declarations/src/schema.d.ts.map +1 -1
  31. package/dist/declarations/src/types/config/index.d.ts +60 -1
  32. package/dist/declarations/src/types/config/index.d.ts.map +1 -1
  33. package/dist/declarations/src/types/config/lists.d.ts +4 -4
  34. package/dist/declarations/src/types/context.d.ts +150 -0
  35. package/dist/declarations/src/types/context.d.ts.map +1 -1
  36. package/dist/declarations/src/types/next-fields.d.ts +1 -1
  37. package/dist/{express-e9ed9a7d.cjs.js → express-455ae20c.cjs.js} +1 -1
  38. package/dist/{express-6743b918.esm.js → express-7559ca2d.esm.js} +1 -1
  39. package/dist/{index-ac01583b.cjs.js → index-89635494.cjs.js} +4 -4
  40. package/dist/{index-24b78415.esm.js → index-baa799e0.esm.js} +4 -4
  41. package/dist/nixxie-cms-core.cjs.js +104 -77
  42. package/dist/nixxie-cms-core.esm.js +104 -77
  43. package/dist/{non-null-graphql-5315718c.esm.js → non-null-graphql-a84ed64d.esm.js} +1 -1
  44. package/dist/{non-null-graphql-17b83ddc.cjs.js → non-null-graphql-add6bb3d.cjs.js} +1 -1
  45. package/dist/{resolve-hooks-66fe8a8e.cjs.js → resolve-hooks-165a9ce2.cjs.js} +1 -1
  46. package/dist/{resolve-hooks-17aafd37.esm.js → resolve-hooks-6813a045.esm.js} +2 -2
  47. package/dist/{system-dfec2f0a.esm.js → system-03e49e4f.esm.js} +8 -4
  48. package/dist/{system-48c5f6df.cjs.js → system-a321642d.cjs.js} +8 -4
  49. package/dist/{useFilter-0b5a1ee6.esm.js → useFilter-9b6db1f9.esm.js} +1 -1
  50. package/dist/{useFilter-1a4e6900.cjs.js → useFilter-acc9d413.cjs.js} +1 -1
  51. package/fields/dist/nixxie-cms-core-fields.cjs.js +16 -16
  52. package/fields/dist/nixxie-cms-core-fields.esm.js +17 -17
  53. package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.cjs.js +3 -3
  54. package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.esm.js +3 -3
  55. package/fields/types/bytes/views/dist/nixxie-cms-core-fields-types-bytes-views.cjs.js +1 -1
  56. package/fields/types/bytes/views/dist/nixxie-cms-core-fields-types-bytes-views.esm.js +1 -1
  57. package/fields/types/password/dist/nixxie-cms-core-fields-types-password.cjs.js +3 -3
  58. package/fields/types/password/dist/nixxie-cms-core-fields-types-password.esm.js +3 -3
  59. package/fields/types/relationship/views/dist/nixxie-cms-core-fields-types-relationship-views.cjs.js +4 -4
  60. package/fields/types/relationship/views/dist/nixxie-cms-core-fields-types-relationship-views.esm.js +4 -4
  61. package/fields/types/select/views/dist/nixxie-cms-core-fields-types-select-views.cjs.js +1 -1
  62. package/fields/types/select/views/dist/nixxie-cms-core-fields-types-select-views.esm.js +1 -1
  63. package/fields/types/text/views/dist/nixxie-cms-core-fields-types-text-views.cjs.js +1 -1
  64. package/fields/types/text/views/dist/nixxie-cms-core-fields-types-text-views.esm.js +1 -1
  65. package/internal-unstable/admin-ui/id-field-view/dist/nixxie-cms-core-internal-unstable-admin-ui-id-field-view.cjs.d.ts +2 -0
  66. package/internal-unstable/admin-ui/id-field-view/dist/nixxie-cms-core-internal-unstable-admin-ui-id-field-view.cjs.js +244 -0
  67. package/internal-unstable/admin-ui/id-field-view/dist/nixxie-cms-core-internal-unstable-admin-ui-id-field-view.esm.js +235 -0
  68. package/internal-unstable/admin-ui/id-field-view/package.json +4 -0
  69. package/internal-unstable/admin-ui/next-config/package.json +4 -0
  70. package/internal-unstable/admin-ui/pages/App/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-App.cjs.d.ts +2 -0
  71. package/internal-unstable/admin-ui/pages/App/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-App.cjs.js +59 -0
  72. package/internal-unstable/admin-ui/pages/App/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-App.esm.js +55 -0
  73. package/internal-unstable/admin-ui/pages/App/package.json +4 -0
  74. package/internal-unstable/admin-ui/pages/CreateItemPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-CreateItemPage.cjs.d.ts +2 -0
  75. package/internal-unstable/admin-ui/pages/CreateItemPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-CreateItemPage.cjs.js +116 -0
  76. package/internal-unstable/admin-ui/pages/CreateItemPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-CreateItemPage.esm.js +112 -0
  77. package/internal-unstable/admin-ui/pages/CreateItemPage/package.json +4 -0
  78. package/internal-unstable/admin-ui/pages/HomePage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-HomePage.cjs.d.ts +2 -0
  79. package/internal-unstable/admin-ui/pages/HomePage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-HomePage.cjs.js +336 -0
  80. package/internal-unstable/admin-ui/pages/HomePage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-HomePage.esm.js +332 -0
  81. package/internal-unstable/admin-ui/pages/HomePage/package.json +4 -0
  82. package/internal-unstable/admin-ui/pages/ItemPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-ItemPage.cjs.d.ts +2 -0
  83. package/internal-unstable/admin-ui/pages/ItemPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-ItemPage.cjs.js +463 -0
  84. package/internal-unstable/admin-ui/pages/ItemPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-ItemPage.esm.js +455 -0
  85. package/internal-unstable/admin-ui/pages/ItemPage/package.json +4 -0
  86. package/internal-unstable/admin-ui/pages/ListPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-ListPage.cjs.d.ts +2 -0
  87. package/internal-unstable/admin-ui/pages/ListPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-ListPage.cjs.js +1195 -0
  88. package/internal-unstable/admin-ui/pages/ListPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-ListPage.esm.js +1187 -0
  89. package/internal-unstable/admin-ui/pages/ListPage/package.json +4 -0
  90. package/internal-unstable/admin-ui/pages/NoAccessPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-NoAccessPage.cjs.d.ts +2 -0
  91. package/internal-unstable/admin-ui/pages/NoAccessPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-NoAccessPage.cjs.js +40 -0
  92. package/internal-unstable/admin-ui/pages/NoAccessPage/dist/nixxie-cms-core-internal-unstable-admin-ui-pages-NoAccessPage.esm.js +35 -0
  93. package/internal-unstable/admin-ui/pages/NoAccessPage/package.json +4 -0
  94. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.cjs.d.ts +2 -0
  95. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.cjs.js +51 -0
  96. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.esm.js +38 -0
  97. package/internal-unstable/artifacts/package.json +4 -0
  98. package/package.json +44 -44
  99. package/scripts/cli/dist/nixxie-cms-core-scripts-cli.cjs.js +44 -15
  100. package/scripts/cli/dist/nixxie-cms-core-scripts-cli.esm.js +44 -15
  101. package/scripts/dist/nixxie-cms-core-scripts.cjs.js +3 -3
  102. package/scripts/dist/nixxie-cms-core-scripts.esm.js +3 -3
  103. package/src/admin-ui/admin-meta-graphql.ts +168 -168
  104. package/src/admin-ui/components/CommandPalette.tsx +433 -431
  105. package/src/admin-ui/components/Navigation.tsx +389 -385
  106. package/src/admin-ui/components/PageContainer.tsx +311 -310
  107. package/src/admin-ui/components/WelcomeDialog.tsx +1 -1
  108. package/src/admin-ui/context.tsx +338 -338
  109. package/src/admin-ui/templates/app.ts +60 -60
  110. package/src/admin-ui/templates/create-item.ts +5 -5
  111. package/src/admin-ui/templates/home.ts +2 -2
  112. package/src/admin-ui/templates/item.tsx +5 -5
  113. package/src/admin-ui/templates/list.tsx +5 -5
  114. package/src/admin-ui/templates/next-config.ts +29 -0
  115. package/src/admin-ui/templates/no-access.ts +7 -7
  116. package/src/fields/types/bigInt/index.ts +181 -181
  117. package/src/fields/types/bytes/index.ts +275 -275
  118. package/src/fields/types/calendarDay/index.ts +194 -194
  119. package/src/fields/types/checkbox/index.ts +76 -76
  120. package/src/fields/types/decimal/index.ts +182 -182
  121. package/src/fields/types/file/index.ts +168 -168
  122. package/src/fields/types/float/index.ts +133 -133
  123. package/src/fields/types/image/index.ts +244 -244
  124. package/src/fields/types/integer/index.ts +156 -156
  125. package/src/fields/types/json/index.ts +77 -77
  126. package/src/fields/types/multiselect/index.ts +212 -212
  127. package/src/fields/types/password/index.ts +241 -241
  128. package/src/fields/types/relationship/index.ts +381 -381
  129. package/src/fields/types/relationship/views/RelationshipTable.tsx +190 -190
  130. package/src/fields/types/select/index.ts +226 -226
  131. package/src/fields/types/text/index.ts +207 -207
  132. package/src/fields/types/timestamp/index.ts +116 -116
  133. package/src/fields/types/virtual/index.ts +108 -108
  134. package/src/helpers.ts +342 -316
  135. package/src/index.ts +4 -0
  136. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/id-field-view.tsx +167 -167
  137. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/App/index.tsx +22 -22
  138. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/CreateItemPage/index.tsx +71 -71
  139. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/HomePage/index.tsx +333 -333
  140. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ItemPage/common.tsx +358 -358
  141. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ItemPage/index.tsx +483 -483
  142. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ListPage/FilterAdd.tsx +221 -221
  143. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ListPage/PaginationControls.tsx +170 -170
  144. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ListPage/Tag.tsx +72 -72
  145. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ListPage/index.tsx +1006 -1006
  146. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/NoAccessPage/index.tsx +24 -24
  147. package/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/artifacts.ts +5 -5
  148. package/src/lib/context/createContext.ts +165 -161
  149. package/src/lib/core/initialise-lists.ts +1097 -1097
  150. package/src/lib/id-field.ts +214 -214
  151. package/src/lib/telemetry.ts +342 -342
  152. package/src/schema.ts +237 -233
  153. package/src/scripts/telemetry.ts +1 -1
  154. package/src/types/config/index.ts +400 -333
  155. package/src/types/config/lists.ts +4 -4
  156. package/src/types/context.ts +700 -530
  157. package/src/types/next-fields.ts +499 -499
  158. package/src/types/telemetry.ts +51 -51
  159. package/tests/telemetry.test.ts +361 -361
  160. package/CHANGELOG.md +0 -3158
  161. package/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view/package.json +0 -4
  162. package/___internal-do-not-use-will-break-in-patch/admin-ui/next-config/package.json +0 -4
  163. package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/package.json +0 -4
  164. package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/package.json +0 -4
  165. package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/package.json +0 -4
  166. package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/package.json +0 -4
  167. package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/package.json +0 -4
  168. package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/package.json +0 -4
  169. package/___internal-do-not-use-will-break-in-patch/artifacts/package.json +0 -4
  170. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view.d.ts.map +0 -1
  171. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/index.d.ts.map +0 -1
  172. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/index.d.ts.map +0 -1
  173. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/index.d.ts.map +0 -1
  174. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/index.d.ts.map +0 -1
  175. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/index.d.ts.map +0 -1
  176. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/index.d.ts.map +0 -1
  177. package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/artifacts.d.ts.map +0 -1
  178. /package/dist/{common-1a350e11.cjs.js → common-5933f758.cjs.js} +0 -0
  179. /package/dist/{common-29fc82e6.esm.js → common-ea5c441a.esm.js} +0 -0
  180. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/id-field-view.d.ts +0 -0
  181. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/App/index.d.ts +0 -0
  182. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/CreateItemPage/index.d.ts +0 -0
  183. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/HomePage/index.d.ts +0 -0
  184. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ItemPage/index.d.ts +0 -0
  185. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/ListPage/index.d.ts +0 -0
  186. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/admin-ui/pages/NoAccessPage/index.d.ts +0 -0
  187. /package/dist/declarations/src/{___internal-do-not-use-will-break-in-patch → internal-unstable}/artifacts.d.ts +0 -0
@@ -1,333 +1,400 @@
1
- import type { Server } from 'node:http'
2
- import type { ListenOptions } from 'node:net'
3
-
4
- import type { ApolloServerOptions } from '@apollo/server'
5
- import type { Options as BodyParserOptions } from 'body-parser'
6
- import type { CorsOptions } from 'cors'
7
- import type express from 'express'
8
- import type { GraphQLSchema } from 'graphql'
9
-
10
- import type {
11
- BaseNixxieTypeInfo,
12
- DatabaseProvider,
13
- NixxieAuditService,
14
- NixxieCacheService,
15
- NixxieContext,
16
- NixxieEmailService,
17
- NixxieHealthService,
18
- NixxieJobsService,
19
- NixxieRateLimitService,
20
- NixxieWebhooksService,
21
- } from '..'
22
- import type { SessionStrategy } from '../session'
23
- import type { MaybePromise } from '../utils'
24
- import type { FieldAccessControl, ListAccessControl } from './access-control'
25
- import type { BaseFields } from './fields'
26
- import type { FieldHooks, ListHooks } from './hooks'
27
- import type {
28
- IdFieldConfig,
29
- ListConfig,
30
- MaybeItemFunctionWithFilter,
31
- MaybeSessionFunction,
32
- } from './lists'
33
-
34
- export type * from './access-control'
35
- export type * from './fields'
36
- export type * from './lists'
37
-
38
- // copy of the Prisma's LogLevel types from `src/runtime/getLogLevel.ts`, as we dont have them
39
- type PrismaLogLevel = 'info' | 'query' | 'warn' | 'error'
40
- type PrismaLogDefinition = {
41
- level: PrismaLogLevel
42
- emit: 'stdout' | 'event'
43
- }
44
-
45
- export type NixxieConfigPre<TypeInfo extends BaseNixxieTypeInfo = BaseNixxieTypeInfo> = {
46
- types?: {
47
- path: string
48
- }
49
-
50
- db: {
51
- provider: DatabaseProvider
52
- url: string
53
-
54
- shadowDatabaseUrl?: string
55
- onConnect?: (args: NixxieContext<TypeInfo>) => Promise<void>
56
- enableLogging?: boolean | Array<PrismaLogLevel | PrismaLogDefinition>
57
- idField?: IdFieldConfig
58
- prismaClientPath?: string
59
- prismaSchemaPath?: string
60
-
61
- extendPrismaSchema?: (schema: string) => string
62
- extendPrismaClient?: (client: any) => any
63
- }
64
-
65
- graphql?: {
66
- // The path of the GraphQL API endpoint. Default: '/api/graphql'.
67
- path?: string
68
- // The CORS configuration to use on the GraphQL API endpoint.
69
- // Default: { origin: 'https://studio.apollographql.com', credentials: true }
70
- cors?: CorsOptions
71
- bodyParser?: BodyParserOptions
72
- /**
73
- * - `true` - Add `ApolloServerPluginLandingPageGraphQLPlayground` to the Apollo Server plugins
74
- * - `false` - Add `ApolloServerPluginLandingPageDisabled` to the Apollo Server plugins
75
- * - `'apollo'` - Do not add any plugins to the Apollo config, this will use [Apollo Sandbox](https://www.apollographql.com/docs/apollo-server/testing/build-run-queries/#apollo-sandbox)
76
- * @default process.env.NODE_ENV !== 'production'
77
- */
78
- playground?: boolean | 'apollo'
79
- /**
80
- * Additional options to pass into the ApolloServer constructor.
81
- * @see https://www.apollographql.com/docs/apollo-server/api/apollo-server/#constructor
82
- */
83
- apolloConfig?: Partial<ApolloServerOptions<NixxieContext<TypeInfo>>>
84
- /**
85
- * When an error is returned from the GraphQL API, Apollo can include a stacktrace
86
- * indicating where the error occurred. When Nixxie is processing mutations, it
87
- * will sometimes captures more than one error at a time, and then group these into
88
- * a single error returned from the GraphQL API. Each of these errors will include
89
- * a stacktrace.
90
- *
91
- * In general both categories of stacktrace are useful for debugging while developing,
92
- * but should not be exposed in production, and this is the default behaviour of Nixxie.
93
- *
94
- * You can use the `debug` option to change this behaviour. A use case for this
95
- * would be if you need to send the stacktraces to a log, but do not want to return them
96
- * from the API. In this case you could set `debug: true` and use
97
- * `apolloConfig.formatError` to log the stacktraces and then strip them out before
98
- * returning the error.
99
- *
100
- * ```ts
101
- * graphql: {
102
- * debug: true,
103
- * apolloConfig: {
104
- * formatError: err => {
105
- * console.error(err)
106
- * delete err.extensions?.errors
107
- * delete err.extensions?.exception?.errors
108
- * delete err.extensions?.exception?.stacktrace
109
- * return err
110
- * },
111
- * },
112
- * }
113
- * ```
114
- *
115
- * @default process.env.NODE_ENV !== 'production'
116
- */
117
- debug?: boolean
118
-
119
- /**
120
- * The path to GraphQL schema
121
- * @default 'schema.graphql'
122
- */
123
- schemaPath?: string
124
-
125
- /**
126
- * A function that receives the Nixxie GraphQL schema for the developer to extend
127
- * @default 'schema.graphql'
128
- */
129
- extendGraphqlSchema?: (schema: GraphQLSchema) => GraphQLSchema
130
- }
131
-
132
- lists: Record<string, ListConfig<any>>
133
- server?: {
134
- /** Configuration options for the cors middleware. Set to `true` to use Nixxie's defaults */
135
- cors?: boolean | CorsOptions
136
-
137
- /** Maximum upload file size allowed (in bytes) */
138
- maxFileSize?: number
139
-
140
- /** extend the Express application used by Nixxie */
141
- extendExpressApp?: (
142
- app: express.Express,
143
- context: NixxieContext<TypeInfo>
144
- ) => MaybePromise<void>
145
-
146
- /** extend the node:http server used by Nixxie */
147
- extendHttpServer?: (server: Server, context: NixxieContext<TypeInfo>) => MaybePromise<void>
148
- } & (
149
- | {
150
- /** Port number to start the server on. Defaults to process.env.PORT || 3000 */
151
- port?: number
152
- }
153
- | {
154
- /** node http.Server options */
155
- options?: ListenOptions
156
- }
157
- )
158
-
159
- session?: SessionStrategy<TypeInfo['session'], TypeInfo>
160
-
161
- /**
162
- * Email service instance created with `createEmail()` from `@nixxie-cms/email`.
163
- * Once configured, it is available everywhere as `context.services.email`.
164
- *
165
- * @example
166
- * ```ts
167
- * import { createEmail } from '@nixxie-cms/email'
168
- * export default config({
169
- * email: createEmail({ transport: { type: 'resend', apiKey: process.env.RESEND_API_KEY! }, from: 'app@example.com' }),
170
- * })
171
- * ```
172
- */
173
- email?: NixxieEmailService
174
-
175
- /**
176
- * Background job scheduler created with `createJobs()` from `@nixxie-cms/jobs`.
177
- * Available as `context.services.jobs`. Supports cron expressions and interval-based scheduling.
178
- *
179
- * @example
180
- * ```ts
181
- * import { createJobs } from '@nixxie-cms/jobs'
182
- * export default config({
183
- * jobs: createJobs({
184
- * jobs: [{ name: 'cleanup', schedule: '0 3 * * *', handler: async () => { ... } }],
185
- * }),
186
- * })
187
- * ```
188
- */
189
- jobs?: NixxieJobsService
190
-
191
- /**
192
- * Cache service created with `createCache()` from `@nixxie-cms/cache`.
193
- * Available as `context.services.cache`. Supports in-memory (LRU) and Redis backends.
194
- *
195
- * @example
196
- * ```ts
197
- * import { createCache } from '@nixxie-cms/cache'
198
- * export default config({
199
- * cache: createCache({ store: 'memory', max: 500, ttl: 60_000 }),
200
- * })
201
- * ```
202
- */
203
- cache?: NixxieCacheService
204
-
205
- /**
206
- * Audit log service created with `createAudit()` from `@nixxie-cms/audit`.
207
- * Available as `context.services.audit`. Records who did what and when.
208
- *
209
- * @example
210
- * ```ts
211
- * import { createAudit } from '@nixxie-cms/audit'
212
- * export default config({
213
- * audit: createAudit({ store: 'memory', maxEntries: 10_000 }),
214
- * })
215
- * ```
216
- */
217
- audit?: NixxieAuditService
218
-
219
- /**
220
- * Outbound webhook service created with `createWebhooks()` from `@nixxie-cms/webhooks`.
221
- * Available as `context.services.webhooks`. Manages subscriptions and reliable delivery with retry.
222
- *
223
- * @example
224
- * ```ts
225
- * import { createWebhooks } from '@nixxie-cms/webhooks'
226
- * export default config({
227
- * webhooks: createWebhooks({ retries: 3, timeout: 10_000 }),
228
- * })
229
- * ```
230
- */
231
- webhooks?: NixxieWebhooksService
232
-
233
- /**
234
- * Rate limiting service created with `createRateLimit()` from `@nixxie-cms/rate-limit`.
235
- * Available as `context.services.rateLimit`. Sliding-window counters backed by memory or Redis.
236
- *
237
- * @example
238
- * ```ts
239
- * import { createRateLimit } from '@nixxie-cms/rate-limit'
240
- * export default config({
241
- * rateLimit: createRateLimit({ store: 'memory' }),
242
- * })
243
- * ```
244
- */
245
- rateLimit?: NixxieRateLimitService
246
-
247
- /**
248
- * Health-check service created with `createHealth()` from `@nixxie-cms/health`.
249
- * Available as `context.services.health`. Auto-exposes `/health/live` and `/health/ready`
250
- * when mounted via `extendExpressApp`.
251
- *
252
- * @example
253
- * ```ts
254
- * import { createHealth } from '@nixxie-cms/health'
255
- * export default config({
256
- * health: createHealth(),
257
- * server: {
258
- * extendExpressApp: async (app, context) => {
259
- * context.services.health.register('db', async () => {
260
- * await context.prisma.$queryRaw`SELECT 1`
261
- * return { ok: true }
262
- * })
263
- * app.use('/health', context.services.health.router())
264
- * },
265
- * },
266
- * })
267
- * ```
268
- */
269
- health?: NixxieHealthService
270
-
271
- /** Telemetry boolean to disable telemetry for this project */
272
- telemetry?: boolean
273
-
274
- ui?: {
275
- /** Completely disables the Admin UI */
276
- isDisabled?: boolean
277
-
278
- /** A function that can be run to validate that the current session should have access to the Admin UI */
279
- isAccessAllowed?: (context: NixxieContext<TypeInfo>) => MaybePromise<boolean>
280
-
281
- /** An array of page routes that bypass the isAccessAllowed function */
282
- publicPages?: readonly string[]
283
-
284
- /** The Base Path for Nixxies Admin UI */
285
- basePath?: string
286
-
287
- getAdditionalFiles?: () => MaybePromise<readonly AdminFileToWrite[]>
288
-
289
- /** An async middleware function that can optionally return a redirect */
290
- pageMiddleware?: (args: {
291
- context: NixxieContext<TypeInfo>
292
- wasAccessAllowed: boolean
293
- basePath: string
294
- }) => MaybePromise<{ kind: 'redirect'; to: string } | void>
295
- }
296
- }
297
-
298
- export type NixxieConfig<TypeInfo extends BaseNixxieTypeInfo = BaseNixxieTypeInfo> = {
299
- types: NixxieConfigPre<TypeInfo>['types']
300
- db: Omit<Required<NixxieConfigPre<TypeInfo>['db']>, 'enableLogging'> & {
301
- enableLogging: PrismaLogLevel | Array<PrismaLogLevel | PrismaLogDefinition>
302
- }
303
- graphql: NonNullable<NixxieConfigPre<TypeInfo>['graphql']> & {
304
- path: string
305
- }
306
- lists: {
307
- [listKey: string]: {
308
- listKey: string
309
- } & Required<NixxieConfigPre<TypeInfo>['lists'][string]>
310
- }
311
- server: Omit<Required<NonNullable<NixxieConfigPre<TypeInfo>['server']>>, 'cors' | 'port'> & {
312
- cors: CorsOptions | null
313
- options: ListenOptions
314
- }
315
- session: NixxieConfigPre<TypeInfo>['session']
316
- email: NixxieEmailService | undefined
317
- jobs: NixxieJobsService | undefined
318
- cache: NixxieCacheService | undefined
319
- audit: NixxieAuditService | undefined
320
- webhooks: NixxieWebhooksService | undefined
321
- rateLimit: NixxieRateLimitService | undefined
322
- health: NixxieHealthService | undefined
323
- telemetry: boolean
324
- ui: NonNullable<Required<NixxieConfigPre<TypeInfo>['ui']>>
325
- }
326
-
327
- export type { BaseFields, ListConfig, MaybeItemFunctionWithFilter, MaybeSessionFunction }
328
-
329
- export type AdminFileToWrite =
330
- | { mode: 'write'; src: string; outputPath: string }
331
- | { mode: 'copy'; inputPath: string; outputPath: string }
332
-
333
- export type { FieldAccessControl, FieldHooks, ListAccessControl, ListHooks }
1
+ import type { Server } from 'node:http'
2
+ import type { ListenOptions } from 'node:net'
3
+
4
+ import type { ApolloServerOptions } from '@apollo/server'
5
+ import type { Options as BodyParserOptions } from 'body-parser'
6
+ import type { CorsOptions } from 'cors'
7
+ import type express from 'express'
8
+ import type { GraphQLSchema } from 'graphql'
9
+
10
+ import type {
11
+ BaseNixxieTypeInfo,
12
+ DatabaseProvider,
13
+ NixxieAiService,
14
+ NixxieAuditService,
15
+ NixxieCacheService,
16
+ NixxieContext,
17
+ NixxieEmailService,
18
+ NixxieHealthService,
19
+ NixxieJobsService,
20
+ NixxieNotificationsService,
21
+ NixxieRateLimitService,
22
+ NixxieSearchService,
23
+ NixxieStorageService,
24
+ NixxieWebhooksService,
25
+ } from '..'
26
+ import type { SessionStrategy } from '../session'
27
+ import type { MaybePromise } from '../utils'
28
+ import type { FieldAccessControl, ListAccessControl } from './access-control'
29
+ import type { BaseFields } from './fields'
30
+ import type { FieldHooks, ListHooks } from './hooks'
31
+ import type {
32
+ IdFieldConfig,
33
+ ListConfig,
34
+ MaybeItemFunctionWithFilter,
35
+ MaybeSessionFunction,
36
+ } from './lists'
37
+
38
+ export type * from './access-control'
39
+ export type * from './fields'
40
+ export type * from './lists'
41
+
42
+ // copy of the Prisma's LogLevel types from `src/runtime/getLogLevel.ts`, as we dont have them
43
+ type PrismaLogLevel = 'info' | 'query' | 'warn' | 'error'
44
+ type PrismaLogDefinition = {
45
+ level: PrismaLogLevel
46
+ emit: 'stdout' | 'event'
47
+ }
48
+
49
+ export type NixxieConfigPre<TypeInfo extends BaseNixxieTypeInfo = BaseNixxieTypeInfo> = {
50
+ types?: {
51
+ path: string
52
+ }
53
+
54
+ db: {
55
+ provider: DatabaseProvider
56
+ url: string
57
+
58
+ shadowDatabaseUrl?: string
59
+ onConnect?: (args: NixxieContext<TypeInfo>) => Promise<void>
60
+ enableLogging?: boolean | Array<PrismaLogLevel | PrismaLogDefinition>
61
+ idField?: IdFieldConfig
62
+ prismaClientPath?: string
63
+ prismaSchemaPath?: string
64
+
65
+ extendPrismaSchema?: (schema: string) => string
66
+ extendPrismaClient?: (client: any) => any
67
+ }
68
+
69
+ graphql?: {
70
+ // The path of the GraphQL API endpoint. Default: '/api/graphql'.
71
+ path?: string
72
+ // The CORS configuration to use on the GraphQL API endpoint.
73
+ // Default: { origin: 'https://studio.apollographql.com', credentials: true }
74
+ cors?: CorsOptions
75
+ bodyParser?: BodyParserOptions
76
+ /**
77
+ * - `true` - Add `ApolloServerPluginLandingPageGraphQLPlayground` to the Apollo Server plugins
78
+ * - `false` - Add `ApolloServerPluginLandingPageDisabled` to the Apollo Server plugins
79
+ * - `'apollo'` - Do not add any plugins to the Apollo config, this will use [Apollo Sandbox](https://www.apollographql.com/docs/apollo-server/testing/build-run-queries/#apollo-sandbox)
80
+ * @default process.env.NODE_ENV !== 'production'
81
+ */
82
+ playground?: boolean | 'apollo'
83
+ /**
84
+ * Additional options to pass into the ApolloServer constructor.
85
+ * @see https://www.apollographql.com/docs/apollo-server/api/apollo-server/#constructor
86
+ */
87
+ apolloConfig?: Partial<ApolloServerOptions<NixxieContext<TypeInfo>>>
88
+ /**
89
+ * When an error is returned from the GraphQL API, Apollo can include a stacktrace
90
+ * indicating where the error occurred. When Nixxie is processing mutations, it
91
+ * will sometimes captures more than one error at a time, and then group these into
92
+ * a single error returned from the GraphQL API. Each of these errors will include
93
+ * a stacktrace.
94
+ *
95
+ * In general both categories of stacktrace are useful for debugging while developing,
96
+ * but should not be exposed in production, and this is the default behaviour of Nixxie.
97
+ *
98
+ * You can use the `debug` option to change this behaviour. A use case for this
99
+ * would be if you need to send the stacktraces to a log, but do not want to return them
100
+ * from the API. In this case you could set `debug: true` and use
101
+ * `apolloConfig.formatError` to log the stacktraces and then strip them out before
102
+ * returning the error.
103
+ *
104
+ * ```ts
105
+ * graphql: {
106
+ * debug: true,
107
+ * apolloConfig: {
108
+ * formatError: err => {
109
+ * console.error(err)
110
+ * delete err.extensions?.errors
111
+ * delete err.extensions?.exception?.errors
112
+ * delete err.extensions?.exception?.stacktrace
113
+ * return err
114
+ * },
115
+ * },
116
+ * }
117
+ * ```
118
+ *
119
+ * @default process.env.NODE_ENV !== 'production'
120
+ */
121
+ debug?: boolean
122
+
123
+ /**
124
+ * The path to GraphQL schema
125
+ * @default 'schema.graphql'
126
+ */
127
+ schemaPath?: string
128
+
129
+ /**
130
+ * A function that receives the Nixxie GraphQL schema for the developer to extend
131
+ * @default 'schema.graphql'
132
+ */
133
+ extendGraphqlSchema?: (schema: GraphQLSchema) => GraphQLSchema
134
+ }
135
+
136
+ lists: Record<string, ListConfig<any>>
137
+ server?: {
138
+ /** Configuration options for the cors middleware. Set to `true` to use Nixxie's defaults */
139
+ cors?: boolean | CorsOptions
140
+
141
+ /** Maximum upload file size allowed (in bytes) */
142
+ maxFileSize?: number
143
+
144
+ /** extend the Express application used by Nixxie */
145
+ extendExpressApp?: (
146
+ app: express.Express,
147
+ context: NixxieContext<TypeInfo>
148
+ ) => MaybePromise<void>
149
+
150
+ /** extend the node:http server used by Nixxie */
151
+ extendHttpServer?: (server: Server, context: NixxieContext<TypeInfo>) => MaybePromise<void>
152
+ } & (
153
+ | {
154
+ /** Port number to start the server on. Defaults to process.env.PORT || 3000 */
155
+ port?: number
156
+ }
157
+ | {
158
+ /** node http.Server options */
159
+ options?: ListenOptions
160
+ }
161
+ )
162
+
163
+ session?: SessionStrategy<TypeInfo['session'], TypeInfo>
164
+
165
+ /**
166
+ * Email service instance created with `createEmail()` from `@nixxie-cms/email`.
167
+ * Once configured, it is available everywhere as `context.services.email`.
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * import { createEmail } from '@nixxie-cms/email'
172
+ * export default config({
173
+ * email: createEmail({ transport: { type: 'resend', apiKey: process.env.RESEND_API_KEY! }, from: 'app@example.com' }),
174
+ * })
175
+ * ```
176
+ */
177
+ email?: NixxieEmailService
178
+
179
+ /**
180
+ * Background job scheduler created with `createJobs()` from `@nixxie-cms/jobs`.
181
+ * Available as `context.services.jobs`. Supports cron expressions and interval-based scheduling.
182
+ *
183
+ * @example
184
+ * ```ts
185
+ * import { createJobs } from '@nixxie-cms/jobs'
186
+ * export default config({
187
+ * jobs: createJobs({
188
+ * jobs: [{ name: 'cleanup', schedule: '0 3 * * *', handler: async () => { ... } }],
189
+ * }),
190
+ * })
191
+ * ```
192
+ */
193
+ jobs?: NixxieJobsService
194
+
195
+ /**
196
+ * Cache service created with `createCache()` from `@nixxie-cms/cache`.
197
+ * Available as `context.services.cache`. Supports in-memory (LRU) and Redis backends.
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * import { createCache } from '@nixxie-cms/cache'
202
+ * export default config({
203
+ * cache: createCache({ store: 'memory', max: 500, ttl: 60_000 }),
204
+ * })
205
+ * ```
206
+ */
207
+ cache?: NixxieCacheService
208
+
209
+ /**
210
+ * Audit log service created with `createAudit()` from `@nixxie-cms/audit`.
211
+ * Available as `context.services.audit`. Records who did what and when.
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * import { createAudit } from '@nixxie-cms/audit'
216
+ * export default config({
217
+ * audit: createAudit({ store: 'memory', maxEntries: 10_000 }),
218
+ * })
219
+ * ```
220
+ */
221
+ audit?: NixxieAuditService
222
+
223
+ /**
224
+ * Outbound webhook service created with `createWebhooks()` from `@nixxie-cms/webhooks`.
225
+ * Available as `context.services.webhooks`. Manages subscriptions and reliable delivery with retry.
226
+ *
227
+ * @example
228
+ * ```ts
229
+ * import { createWebhooks } from '@nixxie-cms/webhooks'
230
+ * export default config({
231
+ * webhooks: createWebhooks({ retries: 3, timeout: 10_000 }),
232
+ * })
233
+ * ```
234
+ */
235
+ webhooks?: NixxieWebhooksService
236
+
237
+ /**
238
+ * Rate limiting service created with `createRateLimit()` from `@nixxie-cms/rate-limit`.
239
+ * Available as `context.services.rateLimit`. Sliding-window counters backed by memory or Redis.
240
+ *
241
+ * @example
242
+ * ```ts
243
+ * import { createRateLimit } from '@nixxie-cms/rate-limit'
244
+ * export default config({
245
+ * rateLimit: createRateLimit({ store: 'memory' }),
246
+ * })
247
+ * ```
248
+ */
249
+ rateLimit?: NixxieRateLimitService
250
+
251
+ /**
252
+ * Health-check service created with `createHealth()` from `@nixxie-cms/health`.
253
+ * Available as `context.services.health`. Auto-exposes `/health/live` and `/health/ready`
254
+ * when mounted via `extendExpressApp`.
255
+ *
256
+ * @example
257
+ * ```ts
258
+ * import { createHealth } from '@nixxie-cms/health'
259
+ * export default config({
260
+ * health: createHealth(),
261
+ * server: {
262
+ * extendExpressApp: async (app, context) => {
263
+ * context.services.health.register('db', async () => {
264
+ * await context.prisma.$queryRaw`SELECT 1`
265
+ * return { ok: true }
266
+ * })
267
+ * app.use('/health', context.services.health.router())
268
+ * },
269
+ * },
270
+ * })
271
+ * ```
272
+ */
273
+ health?: NixxieHealthService
274
+
275
+ /**
276
+ * Blob storage service created with `createStorage()` from `@nixxie-cms/storage`.
277
+ * Available as `context.services.storage`. Supports local disk, S3, GCS and Azure Blob.
278
+ *
279
+ * @example
280
+ * ```ts
281
+ * import { createStorage } from '@nixxie-cms/storage'
282
+ * export default config({
283
+ * storage: createStorage({ driver: 's3', bucket: 'my-bucket', region: 'us-east-1' }),
284
+ * })
285
+ * ```
286
+ */
287
+ storage?: NixxieStorageService
288
+
289
+ /**
290
+ * Full-text search service created with `createSearch()` from `@nixxie-cms/search`.
291
+ * Available as `context.services.search`. Supports in-memory, Meilisearch, Typesense,
292
+ * Algolia and Elasticsearch backends.
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * import { createSearch } from '@nixxie-cms/search'
297
+ * export default config({
298
+ * search: createSearch({ driver: 'meilisearch', url: 'http://localhost:7700', apiKey: '...' }),
299
+ * })
300
+ * ```
301
+ */
302
+ search?: NixxieSearchService
303
+
304
+ /**
305
+ * Multi-channel notification service created with `createNotifications()` from
306
+ * `@nixxie-cms/notifications`. Available as `context.services.notifications`.
307
+ * Supports Slack, Discord, SMS (Twilio) and generic webhook channels.
308
+ *
309
+ * @example
310
+ * ```ts
311
+ * import { createNotifications } from '@nixxie-cms/notifications'
312
+ * export default config({
313
+ * notifications: createNotifications({ channels: { slack: { webhookUrl: process.env.SLACK_URL! } } }),
314
+ * })
315
+ * ```
316
+ */
317
+ notifications?: NixxieNotificationsService
318
+
319
+ /**
320
+ * AI service created with `createAi()` from `@nixxie-cms/ai`.
321
+ * Available as `context.services.ai`. Provides text completion, chat and embeddings
322
+ * via Anthropic or OpenAI.
323
+ *
324
+ * @example
325
+ * ```ts
326
+ * import { createAi } from '@nixxie-cms/ai'
327
+ * export default config({
328
+ * ai: createAi({ provider: 'anthropic', apiKey: process.env.ANTHROPIC_API_KEY! }),
329
+ * })
330
+ * ```
331
+ */
332
+ ai?: NixxieAiService
333
+
334
+ /** Telemetry boolean to disable telemetry for this project */
335
+ telemetry?: boolean
336
+
337
+ ui?: {
338
+ /** Completely disables the Admin UI */
339
+ isDisabled?: boolean
340
+
341
+ /** A function that can be run to validate that the current session should have access to the Admin UI */
342
+ isAccessAllowed?: (context: NixxieContext<TypeInfo>) => MaybePromise<boolean>
343
+
344
+ /** An array of page routes that bypass the isAccessAllowed function */
345
+ publicPages?: readonly string[]
346
+
347
+ /** The Base Path for Nixxies Admin UI */
348
+ basePath?: string
349
+
350
+ getAdditionalFiles?: () => MaybePromise<readonly AdminFileToWrite[]>
351
+
352
+ /** An async middleware function that can optionally return a redirect */
353
+ pageMiddleware?: (args: {
354
+ context: NixxieContext<TypeInfo>
355
+ wasAccessAllowed: boolean
356
+ basePath: string
357
+ }) => MaybePromise<{ kind: 'redirect'; to: string } | void>
358
+ }
359
+ }
360
+
361
+ export type NixxieConfig<TypeInfo extends BaseNixxieTypeInfo = BaseNixxieTypeInfo> = {
362
+ types: NixxieConfigPre<TypeInfo>['types']
363
+ db: Omit<Required<NixxieConfigPre<TypeInfo>['db']>, 'enableLogging'> & {
364
+ enableLogging: PrismaLogLevel | Array<PrismaLogLevel | PrismaLogDefinition>
365
+ }
366
+ graphql: NonNullable<NixxieConfigPre<TypeInfo>['graphql']> & {
367
+ path: string
368
+ }
369
+ lists: {
370
+ [listKey: string]: {
371
+ listKey: string
372
+ } & Required<NixxieConfigPre<TypeInfo>['lists'][string]>
373
+ }
374
+ server: Omit<Required<NonNullable<NixxieConfigPre<TypeInfo>['server']>>, 'cors' | 'port'> & {
375
+ cors: CorsOptions | null
376
+ options: ListenOptions
377
+ }
378
+ session: NixxieConfigPre<TypeInfo>['session']
379
+ email: NixxieEmailService | undefined
380
+ jobs: NixxieJobsService | undefined
381
+ cache: NixxieCacheService | undefined
382
+ audit: NixxieAuditService | undefined
383
+ webhooks: NixxieWebhooksService | undefined
384
+ rateLimit: NixxieRateLimitService | undefined
385
+ health: NixxieHealthService | undefined
386
+ storage: NixxieStorageService | undefined
387
+ search: NixxieSearchService | undefined
388
+ notifications: NixxieNotificationsService | undefined
389
+ ai: NixxieAiService | undefined
390
+ telemetry: boolean
391
+ ui: NonNullable<Required<NixxieConfigPre<TypeInfo>['ui']>>
392
+ }
393
+
394
+ export type { BaseFields, ListConfig, MaybeItemFunctionWithFilter, MaybeSessionFunction }
395
+
396
+ export type AdminFileToWrite =
397
+ | { mode: 'write'; src: string; outputPath: string }
398
+ | { mode: 'copy'; inputPath: string; outputPath: string }
399
+
400
+ export type { FieldAccessControl, FieldHooks, ListAccessControl, ListHooks }