@nixxie-cms/core 1.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.
- package/CHANGELOG.md +3158 -0
- package/LICENSE +21 -0
- package/README.md +6 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-id-field-view.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-id-field-view.cjs.js +244 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-id-field-view.esm.js +235 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/next-config/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-App.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-App.cjs.js +59 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-App.esm.js +55 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-CreateItemPage.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-CreateItemPage.cjs.js +116 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-CreateItemPage.esm.js +112 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-HomePage.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-HomePage.cjs.js +336 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-HomePage.esm.js +332 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-ItemPage.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-ItemPage.cjs.js +463 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-ItemPage.esm.js +455 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-ListPage.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-ListPage.cjs.js +1195 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-ListPage.esm.js +1187 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-NoAccessPage.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-NoAccessPage.cjs.js +40 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-admin-ui-pages-NoAccessPage.esm.js +35 -0
- package/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/package.json +4 -0
- package/___internal-do-not-use-will-break-in-patch/artifacts/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-artifacts.cjs.d.ts +2 -0
- package/___internal-do-not-use-will-break-in-patch/artifacts/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-artifacts.cjs.js +51 -0
- package/___internal-do-not-use-will-break-in-patch/artifacts/dist/nixxie-cms-core-___internal-do-not-use-will-break-in-patch-artifacts.esm.js +38 -0
- package/___internal-do-not-use-will-break-in-patch/artifacts/package.json +4 -0
- package/access/dist/nixxie-cms-core-access.cjs.d.ts +2 -0
- package/access/dist/nixxie-cms-core-access.cjs.js +26 -0
- package/access/dist/nixxie-cms-core-access.esm.js +19 -0
- package/access/package.json +4 -0
- package/admin-ui/apollo/dist/nixxie-cms-core-admin-ui-apollo.cjs.d.ts +2 -0
- package/admin-ui/apollo/dist/nixxie-cms-core-admin-ui-apollo.cjs.js +87 -0
- package/admin-ui/apollo/dist/nixxie-cms-core-admin-ui-apollo.esm.js +2 -0
- package/admin-ui/apollo/package.json +4 -0
- package/admin-ui/components/dist/nixxie-cms-core-admin-ui-components.cjs.d.ts +2 -0
- package/admin-ui/components/dist/nixxie-cms-core-admin-ui-components.cjs.js +77 -0
- package/admin-ui/components/dist/nixxie-cms-core-admin-ui-components.esm.js +58 -0
- package/admin-ui/components/package.json +4 -0
- package/admin-ui/context/dist/nixxie-cms-core-admin-ui-context.cjs.d.ts +2 -0
- package/admin-ui/context/dist/nixxie-cms-core-admin-ui-context.cjs.js +35 -0
- package/admin-ui/context/dist/nixxie-cms-core-admin-ui-context.esm.js +23 -0
- package/admin-ui/context/package.json +4 -0
- package/admin-ui/image/dist/nixxie-cms-core-admin-ui-image.cjs.d.ts +3 -0
- package/admin-ui/image/dist/nixxie-cms-core-admin-ui-image.cjs.js +18 -0
- package/admin-ui/image/dist/nixxie-cms-core-admin-ui-image.esm.js +2 -0
- package/admin-ui/image/package.json +4 -0
- package/admin-ui/router/dist/nixxie-cms-core-admin-ui-router.cjs.d.ts +2 -0
- package/admin-ui/router/dist/nixxie-cms-core-admin-ui-router.cjs.js +34 -0
- package/admin-ui/router/dist/nixxie-cms-core-admin-ui-router.esm.js +12 -0
- package/admin-ui/router/package.json +4 -0
- package/admin-ui/utils/dist/nixxie-cms-core-admin-ui-utils.cjs.d.ts +2 -0
- package/admin-ui/utils/dist/nixxie-cms-core-admin-ui-utils.cjs.js +45 -0
- package/admin-ui/utils/dist/nixxie-cms-core-admin-ui-utils.esm.js +22 -0
- package/admin-ui/utils/package.json +4 -0
- package/bin/cli.js +3 -0
- package/context/dist/nixxie-cms-core-context.cjs.d.ts +2 -0
- package/context/dist/nixxie-cms-core-context.cjs.js +31 -0
- package/context/dist/nixxie-cms-core-context.esm.js +23 -0
- package/context/package.json +4 -0
- package/dist/CreateItemDialog-33335548.esm.js +55 -0
- package/dist/CreateItemDialog-56cf59b7.cjs.js +57 -0
- package/dist/Errors-575adfa3.cjs.js +147 -0
- package/dist/Errors-bf24759e.esm.js +143 -0
- package/dist/Field-47f85161.esm.js +278 -0
- package/dist/Field-ed8d7627.cjs.js +287 -0
- package/dist/Fields-956d9a14.esm.js +203 -0
- package/dist/Fields-e2c28056.cjs.js +206 -0
- package/dist/GraphQLErrorNotice-cd74180d.cjs.js +57 -0
- package/dist/GraphQLErrorNotice-d9f0931b.esm.js +55 -0
- package/dist/NullableFieldWrapper-6ea48af3.esm.js +71 -0
- package/dist/NullableFieldWrapper-daa0a080.cjs.js +74 -0
- package/dist/PageContainer-27c27f10.cjs.js +1144 -0
- package/dist/PageContainer-7db73317.esm.js +1129 -0
- package/dist/actionData-64d4c37a.esm.js +28 -0
- package/dist/actionData-7858738d.cjs.js +32 -0
- package/dist/admin-meta-14c60fec.esm.js +210 -0
- package/dist/admin-meta-18d0c276.cjs.js +217 -0
- package/dist/admin-meta-graphql-6f7f5331.esm.js +142 -0
- package/dist/admin-meta-graphql-c8f926e9.cjs.js +144 -0
- package/dist/common-1a350e11.cjs.js +324 -0
- package/dist/common-29fc82e6.esm.js +315 -0
- package/dist/context-3132c3ed.esm.js +419 -0
- package/dist/context-e7a45152.cjs.js +432 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view.d.ts +6 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/index.d.ts +10 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/index.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/index.d.ts +6 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/index.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/index.d.ts +2 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/index.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/index.d.ts +6 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/index.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/index.d.ts +12 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/index.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/index.d.ts +7 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/index.d.ts.map +1 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/artifacts.d.ts +6 -0
- package/dist/declarations/src/___internal-do-not-use-will-break-in-patch/artifacts.d.ts.map +1 -0
- package/dist/declarations/src/access.d.ts +12 -0
- package/dist/declarations/src/access.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/apollo.d.ts +8 -0
- package/dist/declarations/src/admin-ui/apollo.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/CellContainer.d.ts +5 -0
- package/dist/declarations/src/admin-ui/components/CellContainer.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/CreateItemDialog.d.ts +5 -0
- package/dist/declarations/src/admin-ui/components/CreateItemDialog.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/Errors.d.ts +28 -0
- package/dist/declarations/src/admin-ui/components/Errors.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/GraphQLErrorNotice.d.ts +6 -0
- package/dist/declarations/src/admin-ui/components/GraphQLErrorNotice.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/InlineCode.d.ts +3 -0
- package/dist/declarations/src/admin-ui/components/InlineCode.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/Logo.d.ts +2 -0
- package/dist/declarations/src/admin-ui/components/Logo.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/Navigation.d.ts +22 -0
- package/dist/declarations/src/admin-ui/components/Navigation.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/NullableFieldWrapper.d.ts +33 -0
- package/dist/declarations/src/admin-ui/components/NullableFieldWrapper.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/PageContainer.d.ts +10 -0
- package/dist/declarations/src/admin-ui/components/PageContainer.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/components/index.d.ts +11 -0
- package/dist/declarations/src/admin-ui/components/index.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/context.d.ts +50 -0
- package/dist/declarations/src/admin-ui/context.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/image.d.ts +3 -0
- package/dist/declarations/src/admin-ui/image.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/router.d.ts +15 -0
- package/dist/declarations/src/admin-ui/router.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/utils/Fields.d.ts +16 -0
- package/dist/declarations/src/admin-ui/utils/Fields.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/utils/filters.d.ts +10 -0
- package/dist/declarations/src/admin-ui/utils/filters.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/utils/index.d.ts +8 -0
- package/dist/declarations/src/admin-ui/utils/index.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts +24 -0
- package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts.map +1 -0
- package/dist/declarations/src/admin-ui/utils/utils.d.ts +8 -0
- package/dist/declarations/src/admin-ui/utils/utils.d.ts.map +1 -0
- package/dist/declarations/src/artifacts.d.ts +14 -0
- package/dist/declarations/src/artifacts.d.ts.map +1 -0
- package/dist/declarations/src/context.d.ts +2 -0
- package/dist/declarations/src/context.d.ts.map +1 -0
- package/dist/declarations/src/fields/filters/enum-filter.d.ts +27 -0
- package/dist/declarations/src/fields/filters/enum-filter.d.ts.map +1 -0
- package/dist/declarations/src/fields/filters/index.d.ts +2 -0
- package/dist/declarations/src/fields/filters/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/filters/internal.d.ts +21 -0
- package/dist/declarations/src/fields/filters/internal.d.ts.map +1 -0
- package/dist/declarations/src/fields/filters/providers/mysql.d.ts +182 -0
- package/dist/declarations/src/fields/filters/providers/mysql.d.ts.map +1 -0
- package/dist/declarations/src/fields/filters/providers/postgresql.d.ts +182 -0
- package/dist/declarations/src/fields/filters/providers/postgresql.d.ts.map +1 -0
- package/dist/declarations/src/fields/filters/providers/sqlite.d.ts +179 -0
- package/dist/declarations/src/fields/filters/providers/sqlite.d.ts.map +1 -0
- package/dist/declarations/src/fields/index.d.ts +35 -0
- package/dist/declarations/src/fields/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/bigInt/index.d.ts +20 -0
- package/dist/declarations/src/fields/types/bigInt/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/bigInt/views/index.d.ts +24 -0
- package/dist/declarations/src/fields/types/bigInt/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/bytes/index.d.ts +70 -0
- package/dist/declarations/src/fields/types/bytes/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/bytes/views/index.d.ts +24 -0
- package/dist/declarations/src/fields/types/bytes/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/calendarDay/index.d.ts +15 -0
- package/dist/declarations/src/fields/types/calendarDay/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/calendarDay/views/index.d.ts +18 -0
- package/dist/declarations/src/fields/types/calendarDay/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/checkbox/index.d.ts +11 -0
- package/dist/declarations/src/fields/types/checkbox/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/checkbox/views/index.d.ts +9 -0
- package/dist/declarations/src/fields/types/checkbox/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/decimal/index.d.ts +20 -0
- package/dist/declarations/src/fields/types/decimal/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/decimal/views/index.d.ts +22 -0
- package/dist/declarations/src/fields/types/decimal/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/file/index.d.ts +34 -0
- package/dist/declarations/src/fields/types/file/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/file/views/Field.d.ts +17 -0
- package/dist/declarations/src/fields/types/file/views/Field.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/file/views/index.d.ts +29 -0
- package/dist/declarations/src/fields/types/file/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/float/index.d.ts +18 -0
- package/dist/declarations/src/fields/types/float/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/float/views/index.d.ts +22 -0
- package/dist/declarations/src/fields/types/float/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/image/index.d.ts +34 -0
- package/dist/declarations/src/fields/types/image/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/image/utils.d.ts +2 -0
- package/dist/declarations/src/fields/types/image/utils.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/image/views/Field.d.ts +4 -0
- package/dist/declarations/src/fields/types/image/views/Field.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/image/views/index.d.ts +49 -0
- package/dist/declarations/src/fields/types/image/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/integer/index.d.ts +20 -0
- package/dist/declarations/src/fields/types/integer/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/integer/views/index.d.ts +23 -0
- package/dist/declarations/src/fields/types/integer/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/json/index.d.ts +25 -0
- package/dist/declarations/src/fields/types/json/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/json/views/index.d.ts +9 -0
- package/dist/declarations/src/fields/types/json/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/multiselect/index.d.ts +50 -0
- package/dist/declarations/src/fields/types/multiselect/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/multiselect/views/index.d.ts +26 -0
- package/dist/declarations/src/fields/types/multiselect/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/password/index.d.ts +49 -0
- package/dist/declarations/src/fields/types/password/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/password/views/index.d.ts +47 -0
- package/dist/declarations/src/fields/types/password/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/relationship/index.d.ts +113 -0
- package/dist/declarations/src/fields/types/relationship/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts +26 -0
- package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts +24 -0
- package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/relationship/views/index.d.ts +27 -0
- package/dist/declarations/src/fields/types/relationship/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/relationship/views/types.d.ts +39 -0
- package/dist/declarations/src/fields/types/relationship/views/types.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/select/index.d.ts +42 -0
- package/dist/declarations/src/fields/types/select/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/select/views/index.d.ts +32 -0
- package/dist/declarations/src/fields/types/select/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/text/index.d.ts +58 -0
- package/dist/declarations/src/fields/types/text/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/text/views/index.d.ts +36 -0
- package/dist/declarations/src/fields/types/text/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/timestamp/index.d.ts +19 -0
- package/dist/declarations/src/fields/types/timestamp/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/timestamp/views/index.d.ts +14 -0
- package/dist/declarations/src/fields/types/timestamp/views/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/timestamp/views/utils.d.ts +14 -0
- package/dist/declarations/src/fields/types/timestamp/views/utils.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/virtual/index.d.ts +40 -0
- package/dist/declarations/src/fields/types/virtual/index.d.ts.map +1 -0
- package/dist/declarations/src/fields/types/virtual/views/index.d.ts +7 -0
- package/dist/declarations/src/fields/types/virtual/views/index.d.ts.map +1 -0
- package/dist/declarations/src/graphql-ts.d.ts +5 -0
- package/dist/declarations/src/graphql-ts.d.ts.map +1 -0
- package/dist/declarations/src/helpers.d.ts +121 -0
- package/dist/declarations/src/helpers.d.ts.map +1 -0
- package/dist/declarations/src/index.d.ts +6 -0
- package/dist/declarations/src/index.d.ts.map +1 -0
- package/dist/declarations/src/lib/admin-meta.d.ts +71 -0
- package/dist/declarations/src/lib/admin-meta.d.ts.map +1 -0
- package/dist/declarations/src/lib/core/access-control.d.ts +39 -0
- package/dist/declarations/src/lib/core/access-control.d.ts.map +1 -0
- package/dist/declarations/src/lib/core/initialise-lists.d.ts +131 -0
- package/dist/declarations/src/lib/core/initialise-lists.d.ts.map +1 -0
- package/dist/declarations/src/lib/core/resolve-relationships.d.ts +30 -0
- package/dist/declarations/src/lib/core/resolve-relationships.d.ts.map +1 -0
- package/dist/declarations/src/lib/core/where-inputs.d.ts +15 -0
- package/dist/declarations/src/lib/core/where-inputs.d.ts.map +1 -0
- package/dist/declarations/src/lib/express.d.ts +10 -0
- package/dist/declarations/src/lib/express.d.ts.map +1 -0
- package/dist/declarations/src/lib/migrations.d.ts +13 -0
- package/dist/declarations/src/lib/migrations.d.ts.map +1 -0
- package/dist/declarations/src/lib/system.d.ts +35 -0
- package/dist/declarations/src/lib/system.d.ts.map +1 -0
- package/dist/declarations/src/schema.d.ts +40 -0
- package/dist/declarations/src/schema.d.ts.map +1 -0
- package/dist/declarations/src/scripts/cli.d.ts +11 -0
- package/dist/declarations/src/scripts/cli.d.ts.map +1 -0
- package/dist/declarations/src/scripts/index.d.ts +2 -0
- package/dist/declarations/src/scripts/index.d.ts.map +1 -0
- package/dist/declarations/src/scripts/utils.d.ts +7 -0
- package/dist/declarations/src/scripts/utils.d.ts.map +1 -0
- package/dist/declarations/src/session.d.ts +86 -0
- package/dist/declarations/src/session.d.ts.map +1 -0
- package/dist/declarations/src/testing.d.ts +2 -0
- package/dist/declarations/src/testing.d.ts.map +1 -0
- package/dist/declarations/src/types/admin-meta.d.ts +190 -0
- package/dist/declarations/src/types/admin-meta.d.ts.map +1 -0
- package/dist/declarations/src/types/config/access-control.d.ts +108 -0
- package/dist/declarations/src/types/config/access-control.d.ts.map +1 -0
- package/dist/declarations/src/types/config/fields.d.ts +67 -0
- package/dist/declarations/src/types/config/fields.d.ts.map +1 -0
- package/dist/declarations/src/types/config/hooks.d.ts +441 -0
- package/dist/declarations/src/types/config/hooks.d.ts.map +1 -0
- package/dist/declarations/src/types/config/index.d.ts +283 -0
- package/dist/declarations/src/types/config/index.d.ts.map +1 -0
- package/dist/declarations/src/types/config/lists.d.ts +430 -0
- package/dist/declarations/src/types/config/lists.d.ts.map +1 -0
- package/dist/declarations/src/types/context.d.ts +458 -0
- package/dist/declarations/src/types/context.d.ts.map +1 -0
- package/dist/declarations/src/types/core.d.ts +9 -0
- package/dist/declarations/src/types/core.d.ts.map +1 -0
- package/dist/declarations/src/types/index.d.ts +9 -0
- package/dist/declarations/src/types/index.d.ts.map +1 -0
- package/dist/declarations/src/types/next-fields.d.ts +308 -0
- package/dist/declarations/src/types/next-fields.d.ts.map +1 -0
- package/dist/declarations/src/types/prisma.d.ts +13 -0
- package/dist/declarations/src/types/prisma.d.ts.map +1 -0
- package/dist/declarations/src/types/schema/g.d.ts +7 -0
- package/dist/declarations/src/types/schema/g.d.ts.map +1 -0
- package/dist/declarations/src/types/schema/gWithContext.d.ts +12 -0
- package/dist/declarations/src/types/schema/gWithContext.d.ts.map +1 -0
- package/dist/declarations/src/types/schema/index.d.ts +4 -0
- package/dist/declarations/src/types/schema/index.d.ts.map +1 -0
- package/dist/declarations/src/types/schema/legacy-alias.d.ts +28 -0
- package/dist/declarations/src/types/schema/scalars.d.ts +22 -0
- package/dist/declarations/src/types/schema/scalars.d.ts.map +1 -0
- package/dist/declarations/src/types/session.d.ts +28 -0
- package/dist/declarations/src/types/session.d.ts.map +1 -0
- package/dist/declarations/src/types/type-info.d.ts +35 -0
- package/dist/declarations/src/types/type-info.d.ts.map +1 -0
- package/dist/declarations/src/types/utils.d.ts +78 -0
- package/dist/declarations/src/types/utils.d.ts.map +1 -0
- package/dist/declarations/types/dist/nixxie-cms-core-types.cjs.d.ts +2 -0
- package/dist/express-6743b918.esm.js +476 -0
- package/dist/express-e9ed9a7d.cjs.js +495 -0
- package/dist/filters-8c8616f9.esm.js +89 -0
- package/dist/filters-b3e5eb50.cjs.js +96 -0
- package/dist/index-24b78415.esm.js +419 -0
- package/dist/index-ac01583b.cjs.js +425 -0
- package/dist/migrations-996e66a0.esm.js +76 -0
- package/dist/migrations-ab2e0fd4.cjs.js +78 -0
- package/dist/next-fields-49c025ef.cjs.js +251 -0
- package/dist/next-fields-9bf04ed8.esm.js +241 -0
- package/dist/nixxie-cms-core.cjs.d.ts +2 -0
- package/dist/nixxie-cms-core.cjs.js +522 -0
- package/dist/nixxie-cms-core.esm.js +504 -0
- package/dist/non-null-graphql-17b83ddc.cjs.js +72 -0
- package/dist/non-null-graphql-5315718c.esm.js +67 -0
- package/dist/pick-5fe45878.cjs.js +71 -0
- package/dist/pick-b7ef3115.esm.js +68 -0
- package/dist/resolve-hooks-17aafd37.esm.js +2026 -0
- package/dist/resolve-hooks-66fe8a8e.cjs.js +2043 -0
- package/dist/system-48c5f6df.cjs.js +4283 -0
- package/dist/system-dfec2f0a.esm.js +4273 -0
- package/dist/useCreateItem-1be4987e.cjs.js +160 -0
- package/dist/useCreateItem-1f94d252.esm.js +157 -0
- package/dist/useFilter-0b5a1ee6.esm.js +118 -0
- package/dist/useFilter-1a4e6900.cjs.js +120 -0
- package/dist/utils-0cc426c8.esm.js +19 -0
- package/dist/utils-1b632a8f.cjs.js +21 -0
- package/dist/utils-230cddb1.cjs.js +150 -0
- package/dist/utils-5e1d4d28.esm.js +138 -0
- package/dist/utils-b031e11c.cjs.js +49 -0
- package/dist/utils-e74e3527.cjs.js +87 -0
- package/dist/utils-ef2cd0f4.esm.js +80 -0
- package/dist/utils-f9556354.esm.js +41 -0
- package/fields/dist/nixxie-cms-core-fields.cjs.d.ts +2 -0
- package/fields/dist/nixxie-cms-core-fields.cjs.js +1808 -0
- package/fields/dist/nixxie-cms-core-fields.esm.js +1785 -0
- package/fields/package.json +4 -0
- package/fields/types/bigInt/views/dist/nixxie-cms-core-fields-types-bigInt-views.cjs.d.ts +2 -0
- package/fields/types/bigInt/views/dist/nixxie-cms-core-fields-types-bigInt-views.cjs.js +258 -0
- package/fields/types/bigInt/views/dist/nixxie-cms-core-fields-types-bigInt-views.esm.js +253 -0
- package/fields/types/bigInt/views/package.json +4 -0
- package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.cjs.d.ts +2 -0
- package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.cjs.js +221 -0
- package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.esm.js +216 -0
- package/fields/types/bytes/package.json +4 -0
- package/fields/types/bytes/views/dist/nixxie-cms-core-fields-types-bytes-views.cjs.d.ts +2 -0
- package/fields/types/bytes/views/dist/nixxie-cms-core-fields-types-bytes-views.cjs.js +239 -0
- package/fields/types/bytes/views/dist/nixxie-cms-core-fields-types-bytes-views.esm.js +234 -0
- package/fields/types/bytes/views/package.json +4 -0
- package/fields/types/calendarDay/views/dist/nixxie-cms-core-fields-types-calendarDay-views.cjs.d.ts +2 -0
- package/fields/types/calendarDay/views/dist/nixxie-cms-core-fields-types-calendarDay-views.cjs.js +147 -0
- package/fields/types/calendarDay/views/dist/nixxie-cms-core-fields-types-calendarDay-views.esm.js +141 -0
- package/fields/types/calendarDay/views/package.json +4 -0
- package/fields/types/checkbox/views/dist/nixxie-cms-core-fields-types-checkbox-views.cjs.d.ts +2 -0
- package/fields/types/checkbox/views/dist/nixxie-cms-core-fields-types-checkbox-views.cjs.js +126 -0
- package/fields/types/checkbox/views/dist/nixxie-cms-core-fields-types-checkbox-views.esm.js +120 -0
- package/fields/types/checkbox/views/package.json +4 -0
- package/fields/types/decimal/views/dist/nixxie-cms-core-fields-types-decimal-views.cjs.d.ts +2 -0
- package/fields/types/decimal/views/dist/nixxie-cms-core-fields-types-decimal-views.cjs.js +248 -0
- package/fields/types/decimal/views/dist/nixxie-cms-core-fields-types-decimal-views.esm.js +239 -0
- package/fields/types/decimal/views/package.json +4 -0
- package/fields/types/file/utils/package.json +4 -0
- package/fields/types/file/views/dist/nixxie-cms-core-fields-types-file-views.cjs.d.ts +2 -0
- package/fields/types/file/views/dist/nixxie-cms-core-fields-types-file-views.cjs.js +86 -0
- package/fields/types/file/views/dist/nixxie-cms-core-fields-types-file-views.esm.js +81 -0
- package/fields/types/file/views/package.json +4 -0
- package/fields/types/float/views/dist/nixxie-cms-core-fields-types-float-views.cjs.d.ts +2 -0
- package/fields/types/float/views/dist/nixxie-cms-core-fields-types-float-views.cjs.js +237 -0
- package/fields/types/float/views/dist/nixxie-cms-core-fields-types-float-views.esm.js +232 -0
- package/fields/types/float/views/package.json +4 -0
- package/fields/types/image/utils/dist/nixxie-cms-core-fields-types-image-utils.cjs.d.ts +2 -0
- package/fields/types/image/utils/dist/nixxie-cms-core-fields-types-image-utils.cjs.js +7 -0
- package/fields/types/image/utils/dist/nixxie-cms-core-fields-types-image-utils.esm.js +3 -0
- package/fields/types/image/utils/package.json +4 -0
- package/fields/types/image/views/dist/nixxie-cms-core-fields-types-image-views.cjs.d.ts +2 -0
- package/fields/types/image/views/dist/nixxie-cms-core-fields-types-image-views.cjs.js +361 -0
- package/fields/types/image/views/dist/nixxie-cms-core-fields-types-image-views.esm.js +354 -0
- package/fields/types/image/views/package.json +4 -0
- package/fields/types/integer/views/dist/nixxie-cms-core-fields-types-integer-views.cjs.d.ts +2 -0
- package/fields/types/integer/views/dist/nixxie-cms-core-fields-types-integer-views.cjs.js +254 -0
- package/fields/types/integer/views/dist/nixxie-cms-core-fields-types-integer-views.esm.js +249 -0
- package/fields/types/integer/views/package.json +4 -0
- package/fields/types/json/views/dist/nixxie-cms-core-fields-types-json-views.cjs.d.ts +2 -0
- package/fields/types/json/views/dist/nixxie-cms-core-fields-types-json-views.cjs.js +83 -0
- package/fields/types/json/views/dist/nixxie-cms-core-fields-types-json-views.esm.js +77 -0
- package/fields/types/json/views/package.json +4 -0
- package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.cjs.d.ts +2 -0
- package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.cjs.js +147 -0
- package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.esm.js +141 -0
- package/fields/types/multiselect/views/package.json +4 -0
- package/fields/types/password/dist/nixxie-cms-core-fields-types-password.cjs.d.ts +2 -0
- package/fields/types/password/dist/nixxie-cms-core-fields-types-password.cjs.js +206 -0
- package/fields/types/password/dist/nixxie-cms-core-fields-types-password.esm.js +196 -0
- package/fields/types/password/package.json +4 -0
- package/fields/types/password/views/dist/nixxie-cms-core-fields-types-password-views.cjs.d.ts +2 -0
- package/fields/types/password/views/dist/nixxie-cms-core-fields-types-password-views.cjs.js +330 -0
- package/fields/types/password/views/dist/nixxie-cms-core-fields-types-password-views.esm.js +320 -0
- package/fields/types/password/views/package.json +4 -0
- package/fields/types/relationship/views/RelationshipSelect/package.json +4 -0
- package/fields/types/relationship/views/dist/nixxie-cms-core-fields-types-relationship-views.cjs.d.ts +2 -0
- package/fields/types/relationship/views/dist/nixxie-cms-core-fields-types-relationship-views.cjs.js +1213 -0
- package/fields/types/relationship/views/dist/nixxie-cms-core-fields-types-relationship-views.esm.js +1201 -0
- package/fields/types/relationship/views/package.json +4 -0
- package/fields/types/select/views/dist/nixxie-cms-core-fields-types-select-views.cjs.d.ts +2 -0
- package/fields/types/select/views/dist/nixxie-cms-core-fields-types-select-views.cjs.js +422 -0
- package/fields/types/select/views/dist/nixxie-cms-core-fields-types-select-views.esm.js +416 -0
- package/fields/types/select/views/package.json +4 -0
- package/fields/types/text/views/dist/nixxie-cms-core-fields-types-text-views.cjs.d.ts +2 -0
- package/fields/types/text/views/dist/nixxie-cms-core-fields-types-text-views.cjs.js +316 -0
- package/fields/types/text/views/dist/nixxie-cms-core-fields-types-text-views.esm.js +311 -0
- package/fields/types/text/views/package.json +4 -0
- package/fields/types/timestamp/views/dist/nixxie-cms-core-fields-types-timestamp-views.cjs.d.ts +2 -0
- package/fields/types/timestamp/views/dist/nixxie-cms-core-fields-types-timestamp-views.cjs.js +285 -0
- package/fields/types/timestamp/views/dist/nixxie-cms-core-fields-types-timestamp-views.esm.js +279 -0
- package/fields/types/timestamp/views/package.json +4 -0
- package/fields/types/virtual/views/dist/nixxie-cms-core-fields-types-virtual-views.cjs.d.ts +2 -0
- package/fields/types/virtual/views/dist/nixxie-cms-core-fields-types-virtual-views.cjs.js +54 -0
- package/fields/types/virtual/views/dist/nixxie-cms-core-fields-types-virtual-views.esm.js +48 -0
- package/fields/types/virtual/views/package.json +4 -0
- package/graphql-ts/dist/nixxie-cms-core-graphql-ts.cjs.d.ts +2 -0
- package/graphql-ts/dist/nixxie-cms-core-graphql-ts.cjs.js +45 -0
- package/graphql-ts/dist/nixxie-cms-core-graphql-ts.esm.js +2 -0
- package/graphql-ts/package.json +4 -0
- package/package.json +339 -0
- package/schema/package.json +4 -0
- package/scripts/cli/dist/nixxie-cms-core-scripts-cli.cjs.d.ts +2 -0
- package/scripts/cli/dist/nixxie-cms-core-scripts-cli.cjs.js +1607 -0
- package/scripts/cli/dist/nixxie-cms-core-scripts-cli.esm.js +1586 -0
- package/scripts/cli/package.json +4 -0
- package/scripts/dist/nixxie-cms-core-scripts.cjs.d.ts +2 -0
- package/scripts/dist/nixxie-cms-core-scripts.cjs.js +73 -0
- package/scripts/dist/nixxie-cms-core-scripts.esm.js +71 -0
- package/scripts/package.json +4 -0
- package/session/dist/nixxie-cms-core-session.cjs.d.ts +2 -0
- package/session/dist/nixxie-cms-core-session.cjs.js +157 -0
- package/session/dist/nixxie-cms-core-session.esm.js +129 -0
- package/session/package.json +4 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/id-field-view.tsx +167 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App/index.tsx +22 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage/index.tsx +71 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage/index.tsx +333 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/common.tsx +358 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage/index.tsx +483 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/FilterAdd.tsx +221 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/PaginationControls.tsx +170 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/Tag.tsx +72 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage/index.tsx +1006 -0
- package/src/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage/index.tsx +24 -0
- package/src/___internal-do-not-use-will-break-in-patch/artifacts.ts +5 -0
- package/src/access.ts +25 -0
- package/src/admin-ui/admin-meta-graphql.ts +168 -0
- package/src/admin-ui/apollo.tsx +35 -0
- package/src/admin-ui/components/CellContainer.tsx +6 -0
- package/src/admin-ui/components/CommandPalette.tsx +431 -0
- package/src/admin-ui/components/Container.tsx +14 -0
- package/src/admin-ui/components/CreateButtonLink.tsx +46 -0
- package/src/admin-ui/components/CreateItemDialog.tsx +56 -0
- package/src/admin-ui/components/EmptyState.tsx +52 -0
- package/src/admin-ui/components/Errors.tsx +130 -0
- package/src/admin-ui/components/GraphQLErrorNotice.tsx +78 -0
- package/src/admin-ui/components/InlineCode.tsx +17 -0
- package/src/admin-ui/components/Logo.tsx +70 -0
- package/src/admin-ui/components/Navigation.tsx +385 -0
- package/src/admin-ui/components/NullableFieldWrapper.tsx +72 -0
- package/src/admin-ui/components/PageContainer.tsx +310 -0
- package/src/admin-ui/components/WelcomeDialog.tsx +119 -0
- package/src/admin-ui/components/index.ts +23 -0
- package/src/admin-ui/context.tsx +338 -0
- package/src/admin-ui/image.tsx +2 -0
- package/src/admin-ui/index.tsx +1 -0
- package/src/admin-ui/router.tsx +24 -0
- package/src/admin-ui/system/generateAdminUI.ts +155 -0
- package/src/admin-ui/system/index.ts +1 -0
- package/src/admin-ui/templates/app.ts +60 -0
- package/src/admin-ui/templates/create-item.ts +5 -0
- package/src/admin-ui/templates/home.ts +2 -0
- package/src/admin-ui/templates/index.ts +53 -0
- package/src/admin-ui/templates/item.tsx +5 -0
- package/src/admin-ui/templates/list.tsx +5 -0
- package/src/admin-ui/templates/next-config.ts +16 -0
- package/src/admin-ui/templates/no-access.ts +7 -0
- package/src/admin-ui/utils/Fields.tsx +241 -0
- package/src/admin-ui/utils/actionData.ts +36 -0
- package/src/admin-ui/utils/filters.ts +148 -0
- package/src/admin-ui/utils/index.ts +10 -0
- package/src/admin-ui/utils/pick.ts +12 -0
- package/src/admin-ui/utils/useCreateItem.ts +171 -0
- package/src/admin-ui/utils/usePreventNavigation.tsx +31 -0
- package/src/admin-ui/utils/utils.tsx +127 -0
- package/src/artifacts.ts +110 -0
- package/src/context.ts +1 -0
- package/src/fields/filters/enum-filter.ts +77 -0
- package/src/fields/filters/index.ts +1 -0
- package/src/fields/filters/internal.ts +89 -0
- package/src/fields/filters/providers/mysql.ts +450 -0
- package/src/fields/filters/providers/postgresql.ts +448 -0
- package/src/fields/filters/providers/sqlite.ts +442 -0
- package/src/fields/index.ts +34 -0
- package/src/fields/non-null-graphql.ts +115 -0
- package/src/fields/resolve-hooks.ts +61 -0
- package/src/fields/types/bigInt/index.ts +181 -0
- package/src/fields/types/bigInt/views/index.tsx +254 -0
- package/src/fields/types/bytes/index.ts +275 -0
- package/src/fields/types/bytes/views/index.tsx +190 -0
- package/src/fields/types/calendarDay/index.ts +194 -0
- package/src/fields/types/calendarDay/views/index.tsx +144 -0
- package/src/fields/types/checkbox/index.ts +76 -0
- package/src/fields/types/checkbox/views/index.tsx +97 -0
- package/src/fields/types/decimal/index.ts +182 -0
- package/src/fields/types/decimal/views/index.tsx +215 -0
- package/src/fields/types/file/index.ts +168 -0
- package/src/fields/types/file/views/Field.tsx +300 -0
- package/src/fields/types/file/views/index.tsx +74 -0
- package/src/fields/types/float/index.ts +133 -0
- package/src/fields/types/float/views/index.tsx +215 -0
- package/src/fields/types/image/index.ts +244 -0
- package/src/fields/types/image/internal-utils.ts +58 -0
- package/src/fields/types/image/utils.ts +1 -0
- package/src/fields/types/image/views/Field.tsx +295 -0
- package/src/fields/types/image/views/index.tsx +92 -0
- package/src/fields/types/integer/index.ts +156 -0
- package/src/fields/types/integer/views/index.tsx +255 -0
- package/src/fields/types/json/index.ts +77 -0
- package/src/fields/types/json/views/index.tsx +76 -0
- package/src/fields/types/multiselect/index.ts +212 -0
- package/src/fields/types/multiselect/views/index.tsx +151 -0
- package/src/fields/types/password/index.ts +241 -0
- package/src/fields/types/password/views/index.tsx +342 -0
- package/src/fields/types/relationship/index.ts +381 -0
- package/src/fields/types/relationship/views/ComboboxMany.tsx +110 -0
- package/src/fields/types/relationship/views/ComboboxSingle.tsx +115 -0
- package/src/fields/types/relationship/views/ContextualActions.tsx +139 -0
- package/src/fields/types/relationship/views/RelationshipTable.tsx +190 -0
- package/src/fields/types/relationship/views/index.tsx +492 -0
- package/src/fields/types/relationship/views/types.ts +46 -0
- package/src/fields/types/relationship/views/useApolloQuery.ts +185 -0
- package/src/fields/types/relationship/views/useFilter.tsx +109 -0
- package/src/fields/types/select/index.ts +226 -0
- package/src/fields/types/select/views/SegmentedControl.tsx +83 -0
- package/src/fields/types/select/views/index.tsx +318 -0
- package/src/fields/types/text/index.ts +207 -0
- package/src/fields/types/text/views/index.tsx +273 -0
- package/src/fields/types/timestamp/index.ts +116 -0
- package/src/fields/types/timestamp/views/__tests__/index.tsx +68 -0
- package/src/fields/types/timestamp/views/__tests__/utils.tsx +16 -0
- package/src/fields/types/timestamp/views/index.tsx +262 -0
- package/src/fields/types/timestamp/views/utils.ts +22 -0
- package/src/fields/types/virtual/index.ts +108 -0
- package/src/fields/types/virtual/views/index.tsx +53 -0
- package/src/graphql-ts.ts +32 -0
- package/src/helpers.ts +316 -0
- package/src/index.ts +20 -0
- package/src/lib/admin-meta-graphql.ts +407 -0
- package/src/lib/admin-meta.ts +369 -0
- package/src/lib/coerceAndValidateForGraphQLInput.ts +29 -0
- package/src/lib/context/api.ts +99 -0
- package/src/lib/context/createContext.ts +161 -0
- package/src/lib/context/graphql.ts +300 -0
- package/src/lib/core/access-control.ts +434 -0
- package/src/lib/core/field-assertions.ts +118 -0
- package/src/lib/core/filter-order-access.ts +48 -0
- package/src/lib/core/graphql-errors.ts +76 -0
- package/src/lib/core/hooks.ts +111 -0
- package/src/lib/core/initialise-lists.ts +1097 -0
- package/src/lib/core/mutations/index.ts +917 -0
- package/src/lib/core/mutations/nested-mutation-many-input-resolvers.ts +145 -0
- package/src/lib/core/mutations/nested-mutation-one-input-resolvers.ts +71 -0
- package/src/lib/core/prisma-schema-printer.ts +256 -0
- package/src/lib/core/queries/index.ts +66 -0
- package/src/lib/core/queries/output-field.ts +178 -0
- package/src/lib/core/queries/resolvers.ts +258 -0
- package/src/lib/core/resolve-relationships.ts +303 -0
- package/src/lib/core/utils.ts +56 -0
- package/src/lib/core/where-inputs.ts +130 -0
- package/src/lib/express.ts +109 -0
- package/src/lib/graphql.ts +83 -0
- package/src/lib/id-field.ts +214 -0
- package/src/lib/middleware.ts +68 -0
- package/src/lib/migrations.ts +90 -0
- package/src/lib/otel.ts +43 -0
- package/src/lib/prompts.ts +29 -0
- package/src/lib/system.ts +207 -0
- package/src/lib/telemetry.ts +342 -0
- package/src/lib/typescript-schema-printer.ts +227 -0
- package/src/lib/utils.ts +21 -0
- package/src/pkg-dir.ts +6 -0
- package/src/schema.ts +233 -0
- package/src/scripts/build.ts +64 -0
- package/src/scripts/cli.ts +124 -0
- package/src/scripts/dev.ts +452 -0
- package/src/scripts/esbuild.ts +120 -0
- package/src/scripts/index.ts +20 -0
- package/src/scripts/migrate.ts +214 -0
- package/src/scripts/prisma.ts +49 -0
- package/src/scripts/start.ts +76 -0
- package/src/scripts/telemetry.ts +37 -0
- package/src/scripts/utils.ts +22 -0
- package/src/session.ts +168 -0
- package/src/testing.ts +23 -0
- package/src/types/admin-meta.ts +218 -0
- package/src/types/config/access-control.ts +186 -0
- package/src/types/config/fields.ts +96 -0
- package/src/types/config/hooks.ts +529 -0
- package/src/types/config/index.ts +333 -0
- package/src/types/config/lists.ts +565 -0
- package/src/types/context.ts +530 -0
- package/src/types/core.ts +16 -0
- package/src/types/index.ts +8 -0
- package/src/types/next-fields.ts +499 -0
- package/src/types/prisma.ts +16 -0
- package/src/types/schema/g.ts +5 -0
- package/src/types/schema/gWithContext.ts +20 -0
- package/src/types/schema/index.ts +4 -0
- package/src/types/schema/legacy-alias.d.ts +28 -0
- package/src/types/schema/legacy-alias.js +1 -0
- package/src/types/schema/scalars.ts +220 -0
- package/src/types/session.ts +26 -0
- package/src/types/telemetry.ts +51 -0
- package/src/types/type-info.ts +38 -0
- package/src/types/type-tests.ts +21 -0
- package/src/types/utils.ts +108 -0
- package/static/admin-error.html +53 -0
- package/static/dev-loading.html +146 -0
- package/static/favicon.ico +0 -0
- package/static/favicon.svg +4 -0
- package/system/package.json +4 -0
- package/testing/dist/nixxie-cms-core-testing.cjs.d.ts +2 -0
- package/testing/dist/nixxie-cms-core-testing.cjs.js +29 -0
- package/testing/dist/nixxie-cms-core-testing.esm.js +21 -0
- package/testing/package.json +4 -0
- package/tests/conditional-filters.test.ts +326 -0
- package/tests/telemetry.test.ts +361 -0
- package/tsconfig.json +20 -0
- package/types/dist/nixxie-cms-core-types.cjs.d.ts +2 -0
- package/types/dist/nixxie-cms-core-types.cjs.js +29 -0
- package/types/dist/nixxie-cms-core-types.esm.js +9 -0
- package/types/package.json +4 -0
|
@@ -0,0 +1,917 @@
|
|
|
1
|
+
import { GInputObjectType, type GNullableInputType } from '@graphql-ts/schema'
|
|
2
|
+
import type { GraphQLNamedType } from 'graphql'
|
|
3
|
+
|
|
4
|
+
import type { BaseItem, NixxieContext } from '../../../types'
|
|
5
|
+
import type { UniquePrismaFilter } from '../../../types/prisma'
|
|
6
|
+
import { g } from '../../../types/schema'
|
|
7
|
+
import { withSpan } from '../../otel'
|
|
8
|
+
import {
|
|
9
|
+
cannotActionForItem,
|
|
10
|
+
cannotForItem,
|
|
11
|
+
enforceFieldLevelAccessControl,
|
|
12
|
+
enforceListLevelAccessControl,
|
|
13
|
+
getAccessFilters,
|
|
14
|
+
getOperationAccess,
|
|
15
|
+
} from '../access-control'
|
|
16
|
+
import { checkFilterOrderAccess } from '../filter-order-access'
|
|
17
|
+
import {
|
|
18
|
+
accessDeniedError,
|
|
19
|
+
extensionError,
|
|
20
|
+
relationshipError,
|
|
21
|
+
resolverError,
|
|
22
|
+
} from '../graphql-errors'
|
|
23
|
+
import { runSideEffectOnlyHook, validate } from '../hooks'
|
|
24
|
+
import type { InitialisedAction, InitialisedList } from '../initialise-lists'
|
|
25
|
+
import { mapUniqueWhereToWhere, traverse } from '../queries/resolvers'
|
|
26
|
+
import type { ResolvedDBField } from '../resolve-relationships'
|
|
27
|
+
import {
|
|
28
|
+
type IdType,
|
|
29
|
+
getDBFieldKeyForFieldOnMultiField,
|
|
30
|
+
promiseAllRejectWithAllErrors,
|
|
31
|
+
} from '../utils'
|
|
32
|
+
import {
|
|
33
|
+
type InputFilter,
|
|
34
|
+
type UniqueInputFilter,
|
|
35
|
+
resolveUniqueWhereInput,
|
|
36
|
+
resolveWhereInput,
|
|
37
|
+
} from '../where-inputs'
|
|
38
|
+
import {
|
|
39
|
+
RelationshipErrors,
|
|
40
|
+
resolveRelateToManyForCreateInput,
|
|
41
|
+
resolveRelateToManyForUpdateInput,
|
|
42
|
+
} from './nested-mutation-many-input-resolvers'
|
|
43
|
+
import {
|
|
44
|
+
resolveRelateToOneForCreateInput,
|
|
45
|
+
resolveRelateToOneForUpdateInput,
|
|
46
|
+
} from './nested-mutation-one-input-resolvers'
|
|
47
|
+
|
|
48
|
+
async function getFilteredItem(
|
|
49
|
+
list: InitialisedList,
|
|
50
|
+
context: NixxieContext,
|
|
51
|
+
uniqueWhere: UniquePrismaFilter,
|
|
52
|
+
accessFilters: boolean | InputFilter,
|
|
53
|
+
operation: 'update' | 'delete'
|
|
54
|
+
) {
|
|
55
|
+
// early exit if they want to exclude everything
|
|
56
|
+
if (accessFilters === false) {
|
|
57
|
+
throw accessDeniedError(cannotForItem(operation, list))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// merge the filter access control and try to get the item
|
|
61
|
+
let where = mapUniqueWhereToWhere(uniqueWhere, list)
|
|
62
|
+
|
|
63
|
+
await checkFilterOrderAccess([...traverse(list, where as any)], context, 'filter')
|
|
64
|
+
|
|
65
|
+
if (typeof accessFilters === 'object') {
|
|
66
|
+
where = { AND: [where, await resolveWhereInput(accessFilters, list, context)] }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const item = await context.prisma[list.listKey].findFirst({ where })
|
|
70
|
+
if (item !== null) return item
|
|
71
|
+
|
|
72
|
+
throw accessDeniedError(cannotForItem(operation, list))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function createSingle__(
|
|
76
|
+
inputData: Record<string, unknown>,
|
|
77
|
+
list: InitialisedList,
|
|
78
|
+
context: NixxieContext
|
|
79
|
+
) {
|
|
80
|
+
return await withSpan(
|
|
81
|
+
`create ${list.graphql.names.outputTypeNameLower}`,
|
|
82
|
+
async span => {
|
|
83
|
+
// throw an accessDeniedError if not allowed
|
|
84
|
+
await enforceListLevelAccessControl(context, 'create', list, inputData, undefined)
|
|
85
|
+
await enforceFieldLevelAccessControl(context, 'create', list, inputData, undefined)
|
|
86
|
+
const { beforeOperation, afterOperation, data } = await resolveInputForCreateOrUpdate(
|
|
87
|
+
list,
|
|
88
|
+
context,
|
|
89
|
+
inputData,
|
|
90
|
+
undefined
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
// before operation
|
|
94
|
+
await beforeOperation()
|
|
95
|
+
|
|
96
|
+
// operation
|
|
97
|
+
const result = await context.prisma[list.listKey].create({
|
|
98
|
+
data: list.isSingleton ? { ...data, id: 1 } : data,
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
span.setAttribute('nixxie.result.id', result?.id ?? '')
|
|
102
|
+
return { item: result, afterOperation }
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
'nixxie.list': list.listKey,
|
|
106
|
+
'nixxie.operation': 'create',
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export class NestedMutationState {
|
|
112
|
+
#afterOperations: (() => void | Promise<void>)[] = []
|
|
113
|
+
#context: NixxieContext
|
|
114
|
+
constructor(context: NixxieContext) {
|
|
115
|
+
this.#context = context
|
|
116
|
+
}
|
|
117
|
+
async create(data: Record<string, unknown>, list: InitialisedList) {
|
|
118
|
+
const context = this.#context
|
|
119
|
+
|
|
120
|
+
const operationAccess = await getOperationAccess(list, context, 'create')
|
|
121
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('create', list))
|
|
122
|
+
|
|
123
|
+
// before operation AND operation
|
|
124
|
+
const { item, afterOperation } = await createSingle__(data, list, context)
|
|
125
|
+
|
|
126
|
+
// after operation
|
|
127
|
+
this.#afterOperations.push(() => afterOperation(item))
|
|
128
|
+
return { id: item.id as IdType }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async afterOperation() {
|
|
132
|
+
await promiseAllRejectWithAllErrors(this.#afterOperations.map(async x => x()))
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
type InputData = Record<string, unknown> | null | undefined
|
|
137
|
+
type UpdateInput = {
|
|
138
|
+
where: UniqueInputFilter
|
|
139
|
+
data: InputData
|
|
140
|
+
}
|
|
141
|
+
type ActionInput = {
|
|
142
|
+
where: UniqueInputFilter
|
|
143
|
+
args: Record<string, unknown>
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function updateSingle__(
|
|
147
|
+
{ where, data: inputData }: UpdateInput,
|
|
148
|
+
list: InitialisedList,
|
|
149
|
+
context: NixxieContext,
|
|
150
|
+
accessFilters: boolean | InputFilter
|
|
151
|
+
) {
|
|
152
|
+
return await withSpan(
|
|
153
|
+
`update ${list.graphql.names.outputTypeNameLower}`,
|
|
154
|
+
async span => {
|
|
155
|
+
// validate and resolve the input filter
|
|
156
|
+
const uniqueWhere = await resolveUniqueWhereInput(where, list, context)
|
|
157
|
+
|
|
158
|
+
// filter and item access control - throws an AccessDeniedError if not allowed
|
|
159
|
+
const item = await getFilteredItem(list, context, uniqueWhere!, accessFilters, 'update')
|
|
160
|
+
|
|
161
|
+
// throw an accessDeniedError if not allowed
|
|
162
|
+
await enforceListLevelAccessControl(context, 'update', list, inputData ?? {}, item)
|
|
163
|
+
await enforceFieldLevelAccessControl(context, 'update', list, inputData ?? {}, item)
|
|
164
|
+
const { beforeOperation, afterOperation, data } = await resolveInputForCreateOrUpdate(
|
|
165
|
+
list,
|
|
166
|
+
context,
|
|
167
|
+
inputData ?? {},
|
|
168
|
+
item
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
// before operation
|
|
172
|
+
await beforeOperation()
|
|
173
|
+
|
|
174
|
+
// operation
|
|
175
|
+
const result = await context.prisma[list.listKey].update({
|
|
176
|
+
where: { id: item.id },
|
|
177
|
+
data,
|
|
178
|
+
})
|
|
179
|
+
span.setAttribute('nixxie.result.id', result?.id ?? '')
|
|
180
|
+
|
|
181
|
+
// after operation
|
|
182
|
+
await afterOperation(result)
|
|
183
|
+
|
|
184
|
+
return result
|
|
185
|
+
},
|
|
186
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'update' }
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function deleteSingle__(
|
|
191
|
+
where: UniqueInputFilter,
|
|
192
|
+
list: InitialisedList,
|
|
193
|
+
context: NixxieContext,
|
|
194
|
+
accessFilters: boolean | InputFilter
|
|
195
|
+
) {
|
|
196
|
+
return await withSpan(
|
|
197
|
+
`delete ${list.graphql.names.outputTypeNameLower}`,
|
|
198
|
+
async span => {
|
|
199
|
+
// validate and resolve the input filter
|
|
200
|
+
const uniqueWhere = await resolveUniqueWhereInput(where, list, context)
|
|
201
|
+
|
|
202
|
+
// filter and item access control throw an AccessDeniedError if not allowed
|
|
203
|
+
// apply access.filter.* controls
|
|
204
|
+
const item = await getFilteredItem(list, context, uniqueWhere!, accessFilters, 'delete')
|
|
205
|
+
|
|
206
|
+
await enforceListLevelAccessControl(context, 'delete', list, {}, item)
|
|
207
|
+
// WARNING: no field level access control for delete operations
|
|
208
|
+
|
|
209
|
+
const hookArgs = {
|
|
210
|
+
operation: 'delete' as const,
|
|
211
|
+
listKey: list.listKey,
|
|
212
|
+
context,
|
|
213
|
+
item,
|
|
214
|
+
resolvedData: undefined,
|
|
215
|
+
inputData: undefined,
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// hooks
|
|
219
|
+
await validate({ list, hookArgs })
|
|
220
|
+
|
|
221
|
+
// before operation
|
|
222
|
+
await runSideEffectOnlyHook(list, 'beforeOperation', hookArgs)
|
|
223
|
+
|
|
224
|
+
// operation
|
|
225
|
+
const result = await context.prisma[list.listKey].delete({ where: { id: item.id } })
|
|
226
|
+
span.setAttribute('nixxie.result.id', result?.id ?? '')
|
|
227
|
+
|
|
228
|
+
// after operation
|
|
229
|
+
await runSideEffectOnlyHook(list, 'afterOperation', {
|
|
230
|
+
...hookArgs,
|
|
231
|
+
item: undefined,
|
|
232
|
+
originalItem: item,
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
return result
|
|
236
|
+
},
|
|
237
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'delete' }
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
async function actionSingle__(
|
|
242
|
+
context: NixxieContext,
|
|
243
|
+
list: InitialisedList,
|
|
244
|
+
action: InitialisedAction,
|
|
245
|
+
{ where, args }: ActionInput
|
|
246
|
+
) {
|
|
247
|
+
return await withSpan(
|
|
248
|
+
action.otel,
|
|
249
|
+
async span => {
|
|
250
|
+
// no before operation hook for actions
|
|
251
|
+
|
|
252
|
+
// operation
|
|
253
|
+
const result = await action.resolve(
|
|
254
|
+
{
|
|
255
|
+
listKey: list.listKey,
|
|
256
|
+
actionKey: action.actionKey,
|
|
257
|
+
where,
|
|
258
|
+
args,
|
|
259
|
+
},
|
|
260
|
+
context
|
|
261
|
+
)
|
|
262
|
+
span.setAttribute('nixxie.result.id', (result?.id as string) ?? '')
|
|
263
|
+
|
|
264
|
+
// no after operation hook for actions
|
|
265
|
+
return result
|
|
266
|
+
},
|
|
267
|
+
{ 'nixxie.list': list.listKey, 'nixxie.action': action.actionKey }
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
//
|
|
272
|
+
|
|
273
|
+
async function createOne(inputData: InputData, list: InitialisedList, context: NixxieContext) {
|
|
274
|
+
const operationAccess = await getOperationAccess(list, context, 'create')
|
|
275
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('create', list))
|
|
276
|
+
|
|
277
|
+
// get list-level access control filters
|
|
278
|
+
// NOTHING - no filters for create operations
|
|
279
|
+
|
|
280
|
+
// operation
|
|
281
|
+
const { item, afterOperation } = await createSingle__(inputData ?? {}, list, context)
|
|
282
|
+
|
|
283
|
+
// after operation // TODO: move to createSingle__
|
|
284
|
+
await afterOperation(item)
|
|
285
|
+
|
|
286
|
+
return item
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
async function createMany(
|
|
290
|
+
inputDatas: InputData[],
|
|
291
|
+
list: InitialisedList,
|
|
292
|
+
context: NixxieContext
|
|
293
|
+
) {
|
|
294
|
+
const operationAccess = await getOperationAccess(list, context, 'create')
|
|
295
|
+
// WARNING: we do not short-circuit here, we throw for each
|
|
296
|
+
|
|
297
|
+
// get list-level access control filters
|
|
298
|
+
// NOTHING - no filters for create operations
|
|
299
|
+
|
|
300
|
+
return inputDatas.map(async inputData => {
|
|
301
|
+
// throw for each attempt
|
|
302
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('create', list))
|
|
303
|
+
|
|
304
|
+
// operation
|
|
305
|
+
const { item, afterOperation } = await createSingle__(inputData ?? {}, list, context)
|
|
306
|
+
|
|
307
|
+
// after operation // TODO: move to createSingle__
|
|
308
|
+
await afterOperation(item)
|
|
309
|
+
|
|
310
|
+
return item
|
|
311
|
+
})
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
async function updateOne(
|
|
315
|
+
updateInput: UpdateInput,
|
|
316
|
+
list: InitialisedList,
|
|
317
|
+
context: NixxieContext
|
|
318
|
+
) {
|
|
319
|
+
const operationAccess = await getOperationAccess(list, context, 'update')
|
|
320
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('update', list))
|
|
321
|
+
|
|
322
|
+
// get list-level access control filters
|
|
323
|
+
const accessFilters = await getAccessFilters(list, context, 'update')
|
|
324
|
+
|
|
325
|
+
return updateSingle__(updateInput, list, context, accessFilters)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
async function updateMany(
|
|
329
|
+
updateManyInput: UpdateInput[],
|
|
330
|
+
list: InitialisedList,
|
|
331
|
+
context: NixxieContext
|
|
332
|
+
) {
|
|
333
|
+
const operationAccess = await getOperationAccess(list, context, 'update')
|
|
334
|
+
// WARNING: we do not short-circuit here, we throw for each
|
|
335
|
+
|
|
336
|
+
// get list-level access control filters
|
|
337
|
+
const accessFilters = await getAccessFilters(list, context, 'update')
|
|
338
|
+
|
|
339
|
+
return updateManyInput.map(async updateInput => {
|
|
340
|
+
// throw for each attempt
|
|
341
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('update', list))
|
|
342
|
+
|
|
343
|
+
return updateSingle__(updateInput, list, context, accessFilters)
|
|
344
|
+
})
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
async function deleteOne(
|
|
348
|
+
where: UniqueInputFilter,
|
|
349
|
+
list: InitialisedList,
|
|
350
|
+
context: NixxieContext
|
|
351
|
+
) {
|
|
352
|
+
const operationAccess = await getOperationAccess(list, context, 'delete')
|
|
353
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('delete', list))
|
|
354
|
+
|
|
355
|
+
// get list-level access control filters
|
|
356
|
+
const accessFilters = await getAccessFilters(list, context, 'delete')
|
|
357
|
+
|
|
358
|
+
return deleteSingle__(where, list, context, accessFilters)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
async function deleteMany(
|
|
362
|
+
wheres: UniqueInputFilter[],
|
|
363
|
+
list: InitialisedList,
|
|
364
|
+
context: NixxieContext
|
|
365
|
+
) {
|
|
366
|
+
const operationAccess = await getOperationAccess(list, context, 'delete')
|
|
367
|
+
// WARNING: we do not short-circuit here, we throw for each
|
|
368
|
+
|
|
369
|
+
// get list-level access control filters
|
|
370
|
+
const accessFilters = await getAccessFilters(list, context, 'delete')
|
|
371
|
+
|
|
372
|
+
return wheres.map(async where => {
|
|
373
|
+
// throw for each attempt
|
|
374
|
+
if (!operationAccess) throw accessDeniedError(cannotForItem('delete', list))
|
|
375
|
+
|
|
376
|
+
return deleteSingle__(where, list, context, accessFilters)
|
|
377
|
+
})
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
async function actionOne(
|
|
381
|
+
input: ActionInput,
|
|
382
|
+
list: InitialisedList,
|
|
383
|
+
context: NixxieContext,
|
|
384
|
+
action: InitialisedAction
|
|
385
|
+
) {
|
|
386
|
+
const operationAccess = await action.access({
|
|
387
|
+
context,
|
|
388
|
+
session: context.session, // TODO: remove in breaking change
|
|
389
|
+
listKey: list.listKey,
|
|
390
|
+
actionKey: action.actionKey,
|
|
391
|
+
})
|
|
392
|
+
if (!operationAccess) throw accessDeniedError(cannotActionForItem(action, list))
|
|
393
|
+
|
|
394
|
+
// get list-level access control filters
|
|
395
|
+
// NOTHING - no filters for action operations
|
|
396
|
+
|
|
397
|
+
return actionSingle__(context, list, action, input)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
async function actionMany(
|
|
401
|
+
inputs: ActionInput[],
|
|
402
|
+
list: InitialisedList,
|
|
403
|
+
context: NixxieContext,
|
|
404
|
+
action: InitialisedAction
|
|
405
|
+
) {
|
|
406
|
+
const operationAccess = await action.access({
|
|
407
|
+
context,
|
|
408
|
+
session: context.session, // TODO: remove in breaking change
|
|
409
|
+
listKey: list.listKey,
|
|
410
|
+
actionKey: action.actionKey,
|
|
411
|
+
})
|
|
412
|
+
// WARNING: we do not short-circuit here, we throw for each
|
|
413
|
+
|
|
414
|
+
// get list-level access control filters
|
|
415
|
+
// NOTHING - no filters for action operations
|
|
416
|
+
|
|
417
|
+
return inputs.map(async ({ where, ...args }) => {
|
|
418
|
+
// throw for each attempt
|
|
419
|
+
if (!operationAccess) throw accessDeniedError(cannotActionForItem(action, list))
|
|
420
|
+
|
|
421
|
+
return actionSingle__(context, list, action, { where, args })
|
|
422
|
+
})
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
async function getResolvedData(
|
|
426
|
+
list: InitialisedList,
|
|
427
|
+
hookArgs: {
|
|
428
|
+
context: NixxieContext
|
|
429
|
+
listKey: string
|
|
430
|
+
inputData: Record<string, any>
|
|
431
|
+
} & ({ operation: 'create'; item: undefined } | { operation: 'update'; item: BaseItem }),
|
|
432
|
+
nestedMutationState: NestedMutationState
|
|
433
|
+
) {
|
|
434
|
+
const { context, operation } = hookArgs
|
|
435
|
+
let resolvedData = hookArgs.inputData
|
|
436
|
+
|
|
437
|
+
// apply non-relationship field type input resolvers
|
|
438
|
+
const resolverErrors: { error: Error; tag: string }[] = []
|
|
439
|
+
resolvedData = Object.fromEntries(
|
|
440
|
+
await Promise.all(
|
|
441
|
+
Object.entries(list.fields).map(async ([fieldKey, field]) => {
|
|
442
|
+
const inputResolver = field.input?.[operation]?.resolve
|
|
443
|
+
|
|
444
|
+
if (inputResolver && field.dbField.kind !== 'relation') {
|
|
445
|
+
try {
|
|
446
|
+
return [fieldKey, await inputResolver(resolvedData[fieldKey], context, undefined)]
|
|
447
|
+
} catch (error: any) {
|
|
448
|
+
resolverErrors.push({ error, tag: `${list.listKey}.${fieldKey}` })
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return [fieldKey, resolvedData[fieldKey]] as const
|
|
452
|
+
})
|
|
453
|
+
)
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
if (resolverErrors.length) throw resolverError(resolverErrors)
|
|
457
|
+
|
|
458
|
+
// apply relationship field type input resolvers
|
|
459
|
+
const relationshipErrors: { error: Error; tag: string }[] = []
|
|
460
|
+
resolvedData = Object.fromEntries(
|
|
461
|
+
await Promise.all(
|
|
462
|
+
Object.entries(list.fields).map(async ([fieldKey, field]) => {
|
|
463
|
+
const inputResolver = field.input?.[operation]?.resolve
|
|
464
|
+
let input = resolvedData[fieldKey]
|
|
465
|
+
if (inputResolver && field.dbField.kind === 'relation') {
|
|
466
|
+
const tag = `${list.listKey}.${fieldKey}`
|
|
467
|
+
try {
|
|
468
|
+
input = await inputResolver(
|
|
469
|
+
input,
|
|
470
|
+
context,
|
|
471
|
+
// this third argument only applies to relationship fields
|
|
472
|
+
(() => {
|
|
473
|
+
if (input === undefined) {
|
|
474
|
+
// no-op: this is what we want
|
|
475
|
+
return () => undefined
|
|
476
|
+
}
|
|
477
|
+
if (input === null) {
|
|
478
|
+
// no-op: should this be userinputerror?
|
|
479
|
+
return () => undefined
|
|
480
|
+
}
|
|
481
|
+
const foreignList = list.lists[field.dbField.list]
|
|
482
|
+
if (field.dbField.mode === 'many' && operation === 'create') {
|
|
483
|
+
return resolveRelateToManyForCreateInput(
|
|
484
|
+
nestedMutationState,
|
|
485
|
+
context,
|
|
486
|
+
foreignList,
|
|
487
|
+
tag
|
|
488
|
+
)
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if (field.dbField.mode === 'many' && operation === 'update') {
|
|
492
|
+
return resolveRelateToManyForUpdateInput(
|
|
493
|
+
nestedMutationState,
|
|
494
|
+
context,
|
|
495
|
+
foreignList,
|
|
496
|
+
tag
|
|
497
|
+
)
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
if (field.dbField.mode === 'one' && operation === 'create') {
|
|
501
|
+
return resolveRelateToOneForCreateInput(nestedMutationState, context, foreignList)
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
if (field.dbField.mode === 'one' && operation === 'update') {
|
|
505
|
+
return resolveRelateToOneForUpdateInput(nestedMutationState, context, foreignList)
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
throw new Error('Unknown relationship field type input mode or operation')
|
|
509
|
+
})()
|
|
510
|
+
)
|
|
511
|
+
} catch (error: any) {
|
|
512
|
+
if (error instanceof RelationshipErrors) {
|
|
513
|
+
relationshipErrors.push(...error.errors)
|
|
514
|
+
} else {
|
|
515
|
+
relationshipErrors.push({ error, tag })
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return [fieldKey, input] as const
|
|
520
|
+
})
|
|
521
|
+
)
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
if (relationshipErrors.length) throw relationshipError(relationshipErrors)
|
|
525
|
+
|
|
526
|
+
// field hooks
|
|
527
|
+
const fieldsErrors: { error: Error; tag: string }[] = []
|
|
528
|
+
resolvedData = Object.fromEntries(
|
|
529
|
+
await Promise.all(
|
|
530
|
+
Object.entries(list.fields).map(async ([fieldKey, field]) => {
|
|
531
|
+
try {
|
|
532
|
+
return [
|
|
533
|
+
fieldKey,
|
|
534
|
+
operation === 'create'
|
|
535
|
+
? await field.hooks.resolveInput.create({
|
|
536
|
+
...hookArgs,
|
|
537
|
+
itemField: undefined,
|
|
538
|
+
inputFieldData: hookArgs.inputData[fieldKey],
|
|
539
|
+
resolvedData,
|
|
540
|
+
resolvedFieldData: resolvedData[fieldKey],
|
|
541
|
+
fieldKey,
|
|
542
|
+
})
|
|
543
|
+
: await field.hooks.resolveInput.update({
|
|
544
|
+
...hookArgs,
|
|
545
|
+
itemField: hookArgs.item[fieldKey],
|
|
546
|
+
inputFieldData: hookArgs.inputData[fieldKey],
|
|
547
|
+
resolvedData,
|
|
548
|
+
resolvedFieldData: resolvedData[fieldKey],
|
|
549
|
+
fieldKey,
|
|
550
|
+
}),
|
|
551
|
+
]
|
|
552
|
+
} catch (error: any) {
|
|
553
|
+
fieldsErrors.push({
|
|
554
|
+
error,
|
|
555
|
+
tag: `${list.listKey}.${fieldKey}.hooks.resolveInput`,
|
|
556
|
+
})
|
|
557
|
+
return [fieldKey, undefined]
|
|
558
|
+
}
|
|
559
|
+
})
|
|
560
|
+
)
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
if (fieldsErrors.length) throw extensionError('resolveInput', fieldsErrors)
|
|
564
|
+
|
|
565
|
+
// list hooks
|
|
566
|
+
try {
|
|
567
|
+
if (operation === 'create') {
|
|
568
|
+
resolvedData = await list.hooks.resolveInput.create({ ...hookArgs, resolvedData })
|
|
569
|
+
} else if (operation === 'update') {
|
|
570
|
+
resolvedData = await list.hooks.resolveInput.update({ ...hookArgs, resolvedData })
|
|
571
|
+
}
|
|
572
|
+
} catch (error: any) {
|
|
573
|
+
throw extensionError('resolveInput', [{ error, tag: `${list.listKey}.hooks.resolveInput` }])
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
return resolvedData
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
async function resolveInputForCreateOrUpdate(
|
|
580
|
+
list: InitialisedList,
|
|
581
|
+
context: NixxieContext,
|
|
582
|
+
inputData: Record<string, unknown>,
|
|
583
|
+
item: BaseItem | undefined
|
|
584
|
+
) {
|
|
585
|
+
const nestedMutationState = new NestedMutationState(context)
|
|
586
|
+
const baseHookArgs = {
|
|
587
|
+
context,
|
|
588
|
+
listKey: list.listKey,
|
|
589
|
+
inputData,
|
|
590
|
+
resolvedData: {},
|
|
591
|
+
}
|
|
592
|
+
const hookArgs =
|
|
593
|
+
item === undefined
|
|
594
|
+
? { ...baseHookArgs, operation: 'create' as const, item, originalItem: undefined }
|
|
595
|
+
: { ...baseHookArgs, operation: 'update' as const, item, originalItem: item }
|
|
596
|
+
|
|
597
|
+
// Take the original input and resolve all the fields down to what
|
|
598
|
+
// will be saved into the database.
|
|
599
|
+
hookArgs.resolvedData = await getResolvedData(list, hookArgs, nestedMutationState)
|
|
600
|
+
|
|
601
|
+
// Apply all validation checks
|
|
602
|
+
await validate({ list, hookArgs })
|
|
603
|
+
|
|
604
|
+
// Return the full resolved input (ready for prisma level operation),
|
|
605
|
+
// and the afterOperation hook to be applied
|
|
606
|
+
return {
|
|
607
|
+
data: transformForPrismaClient(list, context, hookArgs.resolvedData),
|
|
608
|
+
beforeOperation: async () => {
|
|
609
|
+
// before operation
|
|
610
|
+
await runSideEffectOnlyHook(list, 'beforeOperation', hookArgs)
|
|
611
|
+
},
|
|
612
|
+
afterOperation: async (updatedItem: BaseItem) => {
|
|
613
|
+
await nestedMutationState.afterOperation()
|
|
614
|
+
|
|
615
|
+
// after operation
|
|
616
|
+
await runSideEffectOnlyHook(list, 'afterOperation', {
|
|
617
|
+
...hookArgs,
|
|
618
|
+
item: updatedItem,
|
|
619
|
+
})
|
|
620
|
+
},
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
function transformInnerDBField(
|
|
625
|
+
dbField: Exclude<ResolvedDBField, { kind: 'multi' }>,
|
|
626
|
+
context: NixxieContext,
|
|
627
|
+
value: unknown
|
|
628
|
+
) {
|
|
629
|
+
if (dbField.kind === 'scalar' && dbField.scalar === 'Json' && value === null) {
|
|
630
|
+
return context.__internal.prisma.DbNull
|
|
631
|
+
}
|
|
632
|
+
return value
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
function transformForPrismaClient(
|
|
636
|
+
list: InitialisedList,
|
|
637
|
+
context: NixxieContext,
|
|
638
|
+
data: Record<string, any>
|
|
639
|
+
) {
|
|
640
|
+
return Object.fromEntries([
|
|
641
|
+
...(function* () {
|
|
642
|
+
for (const fieldKey in data) {
|
|
643
|
+
if (!(fieldKey in list.fields)) {
|
|
644
|
+
// either the types are wrong, or someone didnt use them, either way, bail out
|
|
645
|
+
throw new Error(`Attempted to use unknown field "${fieldKey}"`)
|
|
646
|
+
}
|
|
647
|
+
const value = data[fieldKey]
|
|
648
|
+
const { dbField } = list.fields[fieldKey]
|
|
649
|
+
|
|
650
|
+
if (dbField.kind === 'multi') {
|
|
651
|
+
for (const innerFieldKey in value) {
|
|
652
|
+
const innerFieldValue = value[innerFieldKey]
|
|
653
|
+
yield [
|
|
654
|
+
getDBFieldKeyForFieldOnMultiField(fieldKey, innerFieldKey),
|
|
655
|
+
transformInnerDBField(dbField.fields[innerFieldKey], context, innerFieldValue),
|
|
656
|
+
]
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
continue
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
yield [fieldKey, transformInnerDBField(dbField, context, value)]
|
|
663
|
+
}
|
|
664
|
+
})(),
|
|
665
|
+
])
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// This is not a thing that I really agree with but it's to make the behaviour consistent with old nixxie.
|
|
669
|
+
// Basically, old nixxie uses Promise.allSettled and then after that maps that into promises that resolve and reject,
|
|
670
|
+
// whereas the new stuff is just like "here are some promises" with no guarantees about the order they will be settled in.
|
|
671
|
+
// That doesn't matter when they all resolve successfully because the order they resolve successfully in
|
|
672
|
+
// doesn't affect anything, If some reject though, the order that they reject in will be the order in the errors array
|
|
673
|
+
// and some of our tests rely on the order of the graphql errors array. They shouldn't, but they do.
|
|
674
|
+
function promisesButSettledWhenAllSettledAndInOrder<T extends Promise<unknown>[]>(promises: T): T {
|
|
675
|
+
const resultsPromise = Promise.allSettled(promises)
|
|
676
|
+
return promises.map(async (_, i) => {
|
|
677
|
+
const result: PromiseSettledResult<Awaited<T>> = (await resultsPromise)[i] as any
|
|
678
|
+
return result.status === 'fulfilled'
|
|
679
|
+
? Promise.resolve(result.value)
|
|
680
|
+
: Promise.reject(result.reason)
|
|
681
|
+
}) as T
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function nonNull<T extends GNullableInputType>(t: T) {
|
|
685
|
+
if (t === g.Empty) return t
|
|
686
|
+
return g.nonNull(t)
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
export function getMutationsForList(list: InitialisedList) {
|
|
690
|
+
const defaultUniqueWhereInput = list.isSingleton ? { id: '1' } : undefined
|
|
691
|
+
|
|
692
|
+
const createOne_ = g.field({
|
|
693
|
+
type: list.graphql.types.output,
|
|
694
|
+
args: {
|
|
695
|
+
data: g.arg({ type: nonNull(list.graphql.types.create) }),
|
|
696
|
+
},
|
|
697
|
+
async resolve(_, { data }, context, info) {
|
|
698
|
+
return await withSpan(
|
|
699
|
+
`mutation ${info.fieldName}`,
|
|
700
|
+
async () => {
|
|
701
|
+
return createOne(data, list, context)
|
|
702
|
+
},
|
|
703
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'create' }
|
|
704
|
+
)
|
|
705
|
+
},
|
|
706
|
+
})
|
|
707
|
+
|
|
708
|
+
const createMany_ = g.field({
|
|
709
|
+
type: g.list(list.graphql.types.output),
|
|
710
|
+
args: {
|
|
711
|
+
data: g.arg({
|
|
712
|
+
type: g.nonNull(g.list(nonNull(list.graphql.types.create))),
|
|
713
|
+
}),
|
|
714
|
+
},
|
|
715
|
+
async resolve(_, { data }, context, info) {
|
|
716
|
+
return await withSpan(
|
|
717
|
+
`mutation ${info.fieldName}`,
|
|
718
|
+
async () => {
|
|
719
|
+
return promisesButSettledWhenAllSettledAndInOrder(await createMany(data, list, context))
|
|
720
|
+
},
|
|
721
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'create', 'nixxie.many': true }
|
|
722
|
+
)
|
|
723
|
+
},
|
|
724
|
+
})
|
|
725
|
+
|
|
726
|
+
const updateOne_ = g.field({
|
|
727
|
+
type: list.graphql.types.output,
|
|
728
|
+
args: {
|
|
729
|
+
where: g.arg({
|
|
730
|
+
type: g.nonNull(list.graphql.types.uniqueWhere),
|
|
731
|
+
defaultValue: defaultUniqueWhereInput,
|
|
732
|
+
}),
|
|
733
|
+
data: g.arg({ type: nonNull(list.graphql.types.update) }),
|
|
734
|
+
},
|
|
735
|
+
async resolve(_, { where, data }, context, info) {
|
|
736
|
+
return await withSpan(
|
|
737
|
+
`mutation ${info.fieldName}`,
|
|
738
|
+
async () => {
|
|
739
|
+
return updateOne({ where, data }, list, context)
|
|
740
|
+
},
|
|
741
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'update' }
|
|
742
|
+
)
|
|
743
|
+
},
|
|
744
|
+
})
|
|
745
|
+
|
|
746
|
+
const updateManyInput = g.inputObject({
|
|
747
|
+
name: list.graphql.names.updateManyInputName,
|
|
748
|
+
fields: {
|
|
749
|
+
where: g.arg({
|
|
750
|
+
type: g.nonNull(list.graphql.types.uniqueWhere),
|
|
751
|
+
defaultValue: defaultUniqueWhereInput,
|
|
752
|
+
}),
|
|
753
|
+
data: g.arg({ type: nonNull(list.graphql.types.update) }),
|
|
754
|
+
},
|
|
755
|
+
})
|
|
756
|
+
const updateMany_ = g.field({
|
|
757
|
+
type: g.list(list.graphql.types.output),
|
|
758
|
+
args: {
|
|
759
|
+
data: g.arg({
|
|
760
|
+
type: g.nonNull(g.list(g.nonNull(updateManyInput))),
|
|
761
|
+
}),
|
|
762
|
+
},
|
|
763
|
+
async resolve(_, { data }, context, info) {
|
|
764
|
+
return await withSpan(
|
|
765
|
+
`mutation ${info.fieldName}`,
|
|
766
|
+
async () => {
|
|
767
|
+
return promisesButSettledWhenAllSettledAndInOrder(await updateMany(data, list, context))
|
|
768
|
+
},
|
|
769
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'update', 'nixxie.many': true }
|
|
770
|
+
)
|
|
771
|
+
},
|
|
772
|
+
})
|
|
773
|
+
|
|
774
|
+
const deleteOne_ = g.field({
|
|
775
|
+
type: list.graphql.types.output,
|
|
776
|
+
args: {
|
|
777
|
+
where: g.arg({
|
|
778
|
+
type: g.nonNull(list.graphql.types.uniqueWhere),
|
|
779
|
+
defaultValue: defaultUniqueWhereInput,
|
|
780
|
+
}),
|
|
781
|
+
},
|
|
782
|
+
async resolve(_, { where }, context, info) {
|
|
783
|
+
return await withSpan(
|
|
784
|
+
`mutation ${info.fieldName}`,
|
|
785
|
+
async () => {
|
|
786
|
+
return deleteOne(where, list, context)
|
|
787
|
+
},
|
|
788
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'delete' }
|
|
789
|
+
)
|
|
790
|
+
},
|
|
791
|
+
})
|
|
792
|
+
|
|
793
|
+
const deleteMany_ = g.field({
|
|
794
|
+
type: g.list(list.graphql.types.output),
|
|
795
|
+
args: {
|
|
796
|
+
where: g.arg({
|
|
797
|
+
type: g.nonNull(g.list(g.nonNull(list.graphql.types.uniqueWhere))),
|
|
798
|
+
}),
|
|
799
|
+
},
|
|
800
|
+
async resolve(_, { where }, context, info) {
|
|
801
|
+
return await withSpan(
|
|
802
|
+
`mutation ${info.fieldName}`,
|
|
803
|
+
async () => {
|
|
804
|
+
return promisesButSettledWhenAllSettledAndInOrder(await deleteMany(where, list, context))
|
|
805
|
+
},
|
|
806
|
+
{ 'nixxie.list': list.listKey, 'nixxie.operation': 'delete', 'nixxie.many': true }
|
|
807
|
+
)
|
|
808
|
+
},
|
|
809
|
+
})
|
|
810
|
+
|
|
811
|
+
const collectedTypes: GraphQLNamedType[] = []
|
|
812
|
+
const { isEnabled } = list.graphql
|
|
813
|
+
if (isEnabled.type) {
|
|
814
|
+
// adding all of these types explicitly isn't strictly necessary but we do it to create a certain order in the schema
|
|
815
|
+
collectedTypes.push(list.graphql.types.output)
|
|
816
|
+
if (isEnabled.query || isEnabled.update || isEnabled.delete) {
|
|
817
|
+
collectedTypes.push(list.graphql.types.uniqueWhere)
|
|
818
|
+
}
|
|
819
|
+
if (isEnabled.query) {
|
|
820
|
+
for (const field of Object.values(list.fields)) {
|
|
821
|
+
if (
|
|
822
|
+
isEnabled.query &&
|
|
823
|
+
field.graphql.isEnabled.read &&
|
|
824
|
+
field.unreferencedConcreteInterfaceImplementations
|
|
825
|
+
) {
|
|
826
|
+
// this _IS_ actually necessary since they aren't implicitly referenced by other types, unlike the types above
|
|
827
|
+
collectedTypes.push(...field.unreferencedConcreteInterfaceImplementations)
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
collectedTypes.push(list.graphql.types.where)
|
|
831
|
+
collectedTypes.push(list.graphql.types.orderBy)
|
|
832
|
+
}
|
|
833
|
+
if (isEnabled.update) {
|
|
834
|
+
if (list.graphql.types.update instanceof GInputObjectType) {
|
|
835
|
+
collectedTypes.push(list.graphql.types.update)
|
|
836
|
+
}
|
|
837
|
+
collectedTypes.push(updateManyInput)
|
|
838
|
+
}
|
|
839
|
+
if (isEnabled.create) {
|
|
840
|
+
if (list.graphql.types.create instanceof GInputObjectType) {
|
|
841
|
+
collectedTypes.push(list.graphql.types.create)
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
return {
|
|
847
|
+
mutations: {
|
|
848
|
+
...(list.graphql.isEnabled.create && {
|
|
849
|
+
[list.graphql.names.createMutationName]: createOne_,
|
|
850
|
+
[list.graphql.names.createManyMutationName]: createMany_,
|
|
851
|
+
}),
|
|
852
|
+
...(list.graphql.isEnabled.update && {
|
|
853
|
+
[list.graphql.names.updateMutationName]: updateOne_,
|
|
854
|
+
[list.graphql.names.updateManyMutationName]: updateMany_,
|
|
855
|
+
}),
|
|
856
|
+
...(list.graphql.isEnabled.delete && {
|
|
857
|
+
[list.graphql.names.deleteMutationName]: deleteOne_,
|
|
858
|
+
[list.graphql.names.deleteManyMutationName]: deleteMany_,
|
|
859
|
+
}),
|
|
860
|
+
...Object.fromEntries(
|
|
861
|
+
(function* () {
|
|
862
|
+
for (const action of list.actions) {
|
|
863
|
+
yield [
|
|
864
|
+
action.graphql.names.one,
|
|
865
|
+
g.field({
|
|
866
|
+
type: list.graphql.types.output,
|
|
867
|
+
args: {
|
|
868
|
+
where: g.arg({
|
|
869
|
+
type: g.nonNull(list.graphql.types.uniqueWhere),
|
|
870
|
+
defaultValue: defaultUniqueWhereInput,
|
|
871
|
+
}),
|
|
872
|
+
...action.graphql.types.arguments,
|
|
873
|
+
},
|
|
874
|
+
async resolve(_, { where, ...args }, context, info) {
|
|
875
|
+
return await withSpan(
|
|
876
|
+
`mutation ${info.fieldName}`,
|
|
877
|
+
async () => {
|
|
878
|
+
return actionOne({ where, args }, list, context, action)
|
|
879
|
+
},
|
|
880
|
+
{ 'nixxie.list': list.listKey, 'nixxie.action': action.actionKey }
|
|
881
|
+
)
|
|
882
|
+
},
|
|
883
|
+
}),
|
|
884
|
+
]
|
|
885
|
+
yield [
|
|
886
|
+
action.graphql.names.many,
|
|
887
|
+
g.field({
|
|
888
|
+
type: g.list(list.graphql.types.output),
|
|
889
|
+
args: {
|
|
890
|
+
data: g.arg({
|
|
891
|
+
type: g.nonNull(g.list(g.nonNull(action.graphql.types.args))),
|
|
892
|
+
}),
|
|
893
|
+
},
|
|
894
|
+
async resolve(_, { data }, context, info) {
|
|
895
|
+
return await withSpan(
|
|
896
|
+
`mutation ${info.fieldName}`,
|
|
897
|
+
async () => {
|
|
898
|
+
return promisesButSettledWhenAllSettledAndInOrder(
|
|
899
|
+
await actionMany(data as ActionInput[], list, context, action)
|
|
900
|
+
)
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
'nixxie.list': list.listKey,
|
|
904
|
+
'nixxie.action': action.actionKey,
|
|
905
|
+
'nixxie.many': true,
|
|
906
|
+
}
|
|
907
|
+
)
|
|
908
|
+
},
|
|
909
|
+
}),
|
|
910
|
+
]
|
|
911
|
+
}
|
|
912
|
+
})()
|
|
913
|
+
),
|
|
914
|
+
},
|
|
915
|
+
types: collectedTypes,
|
|
916
|
+
}
|
|
917
|
+
}
|