@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,1586 @@
|
|
|
1
|
+
import meow from 'meow';
|
|
2
|
+
import esbuild from 'esbuild';
|
|
3
|
+
import { walk as walk$1 } from '@nodelib/fs.walk';
|
|
4
|
+
import fse from 'fs-extra';
|
|
5
|
+
import fs from 'node:fs/promises';
|
|
6
|
+
import path, { join } from 'node:path';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
import resolve from 'resolve';
|
|
9
|
+
import { w as withSpan, c as createSystem } from '../../../dist/system-dfec2f0a.esm.js';
|
|
10
|
+
import { i as importBuiltNixxieConfiguration, v as validateArtifacts, g as generateArtifacts, a as generateTypes, b as generatePrismaClient, E as ExitError, c as createExpressServer, p as printPrismaSchema, d as getFormattedGraphQLSchema } from '../../../dist/express-6743b918.esm.js';
|
|
11
|
+
import { createRequire } from 'node:module';
|
|
12
|
+
import { createServer } from 'node:http';
|
|
13
|
+
import { createDatabase, dropDatabase } from '@prisma/internals';
|
|
14
|
+
import chalk, { yellow, red, green, bold, grey, blue } from 'chalk';
|
|
15
|
+
import express from 'express';
|
|
16
|
+
import { printSchema } from 'graphql';
|
|
17
|
+
import next from 'next';
|
|
18
|
+
import path$1 from 'path';
|
|
19
|
+
import { w as withMigrate } from '../../../dist/migrations-996e66a0.esm.js';
|
|
20
|
+
import prompts from 'prompts';
|
|
21
|
+
import { platform } from 'node:os';
|
|
22
|
+
import https from 'node:https';
|
|
23
|
+
import ci from 'ci-info';
|
|
24
|
+
import Conf from 'conf';
|
|
25
|
+
import { spawn } from 'node:child_process';
|
|
26
|
+
import { randomBytes } from 'node:crypto';
|
|
27
|
+
import '../../../dist/admin-meta-14c60fec.esm.js';
|
|
28
|
+
import '@graphql-ts/schema';
|
|
29
|
+
import '../../../dist/resolve-hooks-17aafd37.esm.js';
|
|
30
|
+
import 'pluralize';
|
|
31
|
+
import '../../../dist/next-fields-9bf04ed8.esm.js';
|
|
32
|
+
import 'decimal.js';
|
|
33
|
+
import '@graphql-ts/extend';
|
|
34
|
+
import 'graphql-upload/GraphQLUpload.js';
|
|
35
|
+
import '../../../dist/utils-ef2cd0f4.esm.js';
|
|
36
|
+
import '../../../dist/utils-0cc426c8.esm.js';
|
|
37
|
+
import '../../../access/dist/nixxie-cms-core-access.esm.js';
|
|
38
|
+
import 'graphql/execution/values';
|
|
39
|
+
import '../../../dist/utils-f9556354.esm.js';
|
|
40
|
+
import '@apollo/cache-control-types';
|
|
41
|
+
import 'dataloader';
|
|
42
|
+
import '@babel/runtime/helpers/classPrivateFieldInitSpec';
|
|
43
|
+
import '@babel/runtime/helpers/classPrivateFieldGet2';
|
|
44
|
+
import '@babel/runtime/helpers/classPrivateFieldSet2';
|
|
45
|
+
import '@opentelemetry/api';
|
|
46
|
+
import '@prisma/client-generator-registry';
|
|
47
|
+
import 'http';
|
|
48
|
+
import 'cors';
|
|
49
|
+
import 'body-parser';
|
|
50
|
+
import '@apollo/server/express4';
|
|
51
|
+
import '@apollo/server';
|
|
52
|
+
import '@apollo/server/plugin/disabled';
|
|
53
|
+
import '@apollo/server/plugin/landingPage/default';
|
|
54
|
+
import 'graphql-upload/graphqlUploadExpress.js';
|
|
55
|
+
import '@prisma/migrate';
|
|
56
|
+
|
|
57
|
+
function doesConfigExist(path$1) {
|
|
58
|
+
try {
|
|
59
|
+
const configPath = path.join(process.cwd(), ...path$1);
|
|
60
|
+
resolve.sync(configPath, {
|
|
61
|
+
extensions: ['.ts', '.tsx', '.js'],
|
|
62
|
+
preserveSymlinks: false
|
|
63
|
+
});
|
|
64
|
+
return true;
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (err.code === 'MODULE_NOT_FOUND') return false;
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function appTemplate(config, adminMeta) {
|
|
71
|
+
const allViews = adminMeta.views.map(viewRelativeToProject => {
|
|
72
|
+
const isRelativeToFile = viewRelativeToProject.startsWith('./') || viewRelativeToProject.startsWith('../');
|
|
73
|
+
const viewRelativeToAppFile = isRelativeToFile ? '../../../' + viewRelativeToProject : viewRelativeToProject;
|
|
74
|
+
|
|
75
|
+
// we're not using serializePathForImport here because we want the thing you write for a view
|
|
76
|
+
// to be exactly what you would put in an import in the project directory.
|
|
77
|
+
// we're still using JSON.stringify to escape anything that might need to be though
|
|
78
|
+
return JSON.stringify(viewRelativeToAppFile);
|
|
79
|
+
});
|
|
80
|
+
// -- TEMPLATE START
|
|
81
|
+
return `import { getApp } from '@nixxie-cms/core/___internal-do-not-use-will-break-in-patch/admin-ui/pages/App'
|
|
82
|
+
|
|
83
|
+
${allViews.map((views, i) => `import * as view${i} from ${views}`).join('\n')}
|
|
84
|
+
|
|
85
|
+
${doesConfigExist(['.nixxie', 'admin', 'config']) ? `import * as packageAdminConfig from "../../../.nixxie/admin/config"` : 'let packageAdminConfig = {}'}
|
|
86
|
+
|
|
87
|
+
${doesConfigExist(['admin', 'config']) ? `import * as userAdminConfig from "../../../admin/config"` : 'let userAdminConfig = {}'}
|
|
88
|
+
|
|
89
|
+
export default getApp({
|
|
90
|
+
adminConfig: {
|
|
91
|
+
...packageAdminConfig,
|
|
92
|
+
...userAdminConfig
|
|
93
|
+
},
|
|
94
|
+
apiPath: "${config.graphql.path}",
|
|
95
|
+
fieldViews: [${allViews.map((_, i) => `view${i}`)}],
|
|
96
|
+
})
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const createItemTemplate = listKey => `import { getCreateItemPage } from '@nixxie-cms/core/___internal-do-not-use-will-break-in-patch/admin-ui/pages/CreateItemPage';
|
|
101
|
+
|
|
102
|
+
export default getCreateItemPage(${JSON.stringify({
|
|
103
|
+
listKey
|
|
104
|
+
})})
|
|
105
|
+
`;
|
|
106
|
+
|
|
107
|
+
const homeTemplate = `export { HomePage as default } from '@nixxie-cms/core/___internal-do-not-use-will-break-in-patch/admin-ui/pages/HomePage';
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
const itemTemplate = listKey => `import { getItemPage } from '@nixxie-cms/core/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ItemPage';
|
|
111
|
+
|
|
112
|
+
export default getItemPage(${JSON.stringify({
|
|
113
|
+
listKey
|
|
114
|
+
})})
|
|
115
|
+
`;
|
|
116
|
+
|
|
117
|
+
const listTemplate = listKey => `import { getListPage } from '@nixxie-cms/core/___internal-do-not-use-will-break-in-patch/admin-ui/pages/ListPage';
|
|
118
|
+
|
|
119
|
+
export default getListPage(${JSON.stringify({
|
|
120
|
+
listKey
|
|
121
|
+
})});
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
const nextConfigTemplate = basePath => `const nextConfig = {
|
|
125
|
+
bundlePagesRouterDependencies: true,
|
|
126
|
+
typescript: {
|
|
127
|
+
ignoreBuildErrors: true,
|
|
128
|
+
},
|
|
129
|
+
eslint: {
|
|
130
|
+
ignoreDuringBuilds: true,
|
|
131
|
+
},
|
|
132
|
+
// We use transpilePackages for the custom admin-ui pages in the ./admin folder
|
|
133
|
+
// as they import ts files into nextjs
|
|
134
|
+
transpilePackages: ['../../admin'],
|
|
135
|
+
${basePath ? `basePath: '${basePath}',` : ''}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
module.exports = nextConfig`;
|
|
139
|
+
|
|
140
|
+
const noAccessTemplate = session => `import { getNoAccessPage } from '@nixxie-cms/core/___internal-do-not-use-will-break-in-patch/admin-ui/pages/NoAccessPage';
|
|
141
|
+
|
|
142
|
+
export default getNoAccessPage(${JSON.stringify({
|
|
143
|
+
sessionsEnabled: !!session
|
|
144
|
+
})})
|
|
145
|
+
`;
|
|
146
|
+
|
|
147
|
+
const pkgDir$1 = path.dirname(require.resolve('@nixxie-cms/core/package.json'));
|
|
148
|
+
function writeAdminFiles(config, adminMeta) {
|
|
149
|
+
var _config$ui;
|
|
150
|
+
return [{
|
|
151
|
+
mode: 'write',
|
|
152
|
+
src: nextConfigTemplate((_config$ui = config.ui) === null || _config$ui === void 0 ? void 0 : _config$ui.basePath),
|
|
153
|
+
outputPath: 'next.config.js'
|
|
154
|
+
}, {
|
|
155
|
+
mode: 'copy',
|
|
156
|
+
inputPath: path.join(pkgDir$1, 'static', 'favicon.ico'),
|
|
157
|
+
outputPath: 'public/favicon.ico'
|
|
158
|
+
}, {
|
|
159
|
+
mode: 'copy',
|
|
160
|
+
inputPath: path.join(pkgDir$1, 'static', 'favicon.svg'),
|
|
161
|
+
outputPath: 'public/favicon.svg'
|
|
162
|
+
}, {
|
|
163
|
+
mode: 'write',
|
|
164
|
+
src: noAccessTemplate(config.session),
|
|
165
|
+
outputPath: 'pages/no-access.js'
|
|
166
|
+
}, {
|
|
167
|
+
mode: 'write',
|
|
168
|
+
src: appTemplate(config, adminMeta),
|
|
169
|
+
outputPath: 'pages/_app.js'
|
|
170
|
+
}, {
|
|
171
|
+
mode: 'write',
|
|
172
|
+
src: homeTemplate,
|
|
173
|
+
outputPath: 'pages/index.js'
|
|
174
|
+
}, ...adminMeta.lists.flatMap(({
|
|
175
|
+
path,
|
|
176
|
+
key
|
|
177
|
+
}) => [{
|
|
178
|
+
mode: 'write',
|
|
179
|
+
src: listTemplate(key),
|
|
180
|
+
outputPath: `pages/${path}/index.js`
|
|
181
|
+
}, {
|
|
182
|
+
mode: 'write',
|
|
183
|
+
src: itemTemplate(key),
|
|
184
|
+
outputPath: `pages/${path}/[id].js`
|
|
185
|
+
}, {
|
|
186
|
+
mode: 'write',
|
|
187
|
+
src: createItemTemplate(key),
|
|
188
|
+
outputPath: `pages/${path}/create.js`
|
|
189
|
+
}])];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const walk = promisify(walk$1);
|
|
193
|
+
function toPosixPath(p) {
|
|
194
|
+
return p.split(path.sep).join('/');
|
|
195
|
+
}
|
|
196
|
+
function serializePathForImport(path) {
|
|
197
|
+
// JSON.stringify is important here because it will escape windows style paths(and any thing else that might potentially be in there)
|
|
198
|
+
return JSON.stringify(toPosixPath(path
|
|
199
|
+
// Next is unhappy about imports that include .ts/tsx in them because TypeScript is unhappy with them because when doing a TypeScript compilation with tsc, the imports won't be written so they would be wrong there
|
|
200
|
+
.replace(/\.tsx?$/, '')));
|
|
201
|
+
}
|
|
202
|
+
async function writeAdminFile(file, projectAdminPath) {
|
|
203
|
+
const outputFilename = path.join(projectAdminPath, file.outputPath);
|
|
204
|
+
if (file.mode === 'copy') {
|
|
205
|
+
if (!path.isAbsolute(file.inputPath)) {
|
|
206
|
+
throw new Error(`An inputPath of "${file.inputPath}" was provided to copy but inputPaths must be absolute`);
|
|
207
|
+
}
|
|
208
|
+
await fse.ensureDir(path.dirname(outputFilename));
|
|
209
|
+
// TODO: should we use copyFile or copy?
|
|
210
|
+
await fs.copyFile(file.inputPath, outputFilename);
|
|
211
|
+
}
|
|
212
|
+
let content;
|
|
213
|
+
try {
|
|
214
|
+
content = await fs.readFile(outputFilename, 'utf8');
|
|
215
|
+
} catch (err) {
|
|
216
|
+
if (err.code !== 'ENOENT') throw err;
|
|
217
|
+
}
|
|
218
|
+
if (file.mode === 'write' && content !== file.src) {
|
|
219
|
+
await fse.outputFile(outputFilename, file.src);
|
|
220
|
+
}
|
|
221
|
+
return path.normalize(outputFilename);
|
|
222
|
+
}
|
|
223
|
+
const pageExtensions = new Set(['.js', '.jsx', '.ts', '.tsx']);
|
|
224
|
+
async function generateAdminUI(config, adminMeta, projectAdminPath, isLiveReload) {
|
|
225
|
+
await withSpan('generating admin next application', async () => {
|
|
226
|
+
// when we're not doing a live reload, we want to clear everything out except the .next directory (not the .next directory because it has caches)
|
|
227
|
+
// so that at least every so often, we'll clear out anything that the deleting we do during live reloads doesn't (should just be directories)
|
|
228
|
+
if (!isLiveReload) {
|
|
229
|
+
const dir = await fs.readdir(projectAdminPath).catch(err => {
|
|
230
|
+
if (err.code === 'ENOENT') return [];
|
|
231
|
+
throw err;
|
|
232
|
+
});
|
|
233
|
+
await Promise.all(dir.map(x => {
|
|
234
|
+
if (x === '.next') return;
|
|
235
|
+
return fs.rm(path.join(projectAdminPath, x), {
|
|
236
|
+
recursive: true
|
|
237
|
+
});
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Write out the files configured by the user
|
|
242
|
+
const userFilesToWrite = await config.ui.getAdditionalFiles();
|
|
243
|
+
const savedFiles = await Promise.all(userFilesToWrite.map(file => writeAdminFile(file, projectAdminPath)));
|
|
244
|
+
const uniqueFiles = new Set(savedFiles);
|
|
245
|
+
|
|
246
|
+
// Add files to pages/ which point to any files which exist in admin/pages
|
|
247
|
+
const adminConfigDir = path.join(process.cwd(), 'admin');
|
|
248
|
+
const userPagesDir = path.join(adminConfigDir, 'pages');
|
|
249
|
+
let userPagesEntries = [];
|
|
250
|
+
try {
|
|
251
|
+
userPagesEntries = await walk(userPagesDir, {
|
|
252
|
+
entryFilter: entry => entry.dirent.isFile() && pageExtensions.has(path.extname(entry.name))
|
|
253
|
+
});
|
|
254
|
+
} catch (err) {
|
|
255
|
+
if (err.code !== 'ENOENT') throw err;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Collect files into a map keyed by outputPath to handle duplicates
|
|
259
|
+
// User-provided files take precedence over internal files
|
|
260
|
+
const adminFilesMap = new Map();
|
|
261
|
+
|
|
262
|
+
// Add internal files first
|
|
263
|
+
for (const file of writeAdminFiles(config, adminMeta)) {
|
|
264
|
+
adminFilesMap.set(file.outputPath, file);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Add user page files (these override internal files)
|
|
268
|
+
for (const {
|
|
269
|
+
path: path$1
|
|
270
|
+
} of userPagesEntries) {
|
|
271
|
+
const outputFilename = toPosixPath(path.relative(adminConfigDir, path$1));
|
|
272
|
+
const importPath = path.relative(path.dirname(path.join(projectAdminPath, outputFilename)), path$1);
|
|
273
|
+
const serializedImportPath = serializePathForImport(importPath);
|
|
274
|
+
adminFilesMap.set(outputFilename, {
|
|
275
|
+
mode: 'write',
|
|
276
|
+
outputPath: outputFilename,
|
|
277
|
+
src: `export { default } from ${serializedImportPath}`
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Filter out files already written by getAdditionalFiles() and convert to array
|
|
282
|
+
const adminFiles = Array.from(adminFilesMap.values()).filter(x => !uniqueFiles.has(path.normalize(path.join(projectAdminPath, x.outputPath))));
|
|
283
|
+
|
|
284
|
+
// Write distinct output paths in parallel after deterministic de-duplication
|
|
285
|
+
await Promise.all(adminFiles.map(file => writeAdminFile(file, projectAdminPath)));
|
|
286
|
+
|
|
287
|
+
// Because Next will re-compile things (or at least check things and log a bunch of stuff)
|
|
288
|
+
// if we delete pages and then re-create them, we want to avoid that when live reloading
|
|
289
|
+
// so we only delete things that shouldn't exist anymore
|
|
290
|
+
// this won't clear out empty directories, this is fine since:
|
|
291
|
+
// - they won't create pages in Admin UI which is really what this deleting is about avoiding
|
|
292
|
+
// - we'll remove them when the user restarts the process
|
|
293
|
+
if (isLiveReload) {
|
|
294
|
+
const ignoredDir = path.resolve(projectAdminPath, '.next');
|
|
295
|
+
const ignoredFiles = new Set([...adminFiles.map(x => x.outputPath), ...uniqueFiles, 'next-env.d.ts', 'pages/api/__nixxie_api_build.js'].map(x => path.resolve(projectAdminPath, x)));
|
|
296
|
+
const entries = await walk(projectAdminPath, {
|
|
297
|
+
deepFilter: entry => entry.path !== ignoredDir,
|
|
298
|
+
entryFilter: entry => entry.dirent.isFile() && !ignoredFiles.has(entry.path)
|
|
299
|
+
});
|
|
300
|
+
await Promise.all(entries.map(entry => fs.rm(entry.path, {
|
|
301
|
+
recursive: true
|
|
302
|
+
})));
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// WARNING: be careful not to import this file within next
|
|
308
|
+
function identity(x) {
|
|
309
|
+
return x;
|
|
310
|
+
}
|
|
311
|
+
async function getEsbuildConfigFn(cwd) {
|
|
312
|
+
try {
|
|
313
|
+
await esbuild.build({
|
|
314
|
+
entryPoints: ['./esbuild.nixxie'],
|
|
315
|
+
absWorkingDir: cwd,
|
|
316
|
+
bundle: true,
|
|
317
|
+
sourcemap: true,
|
|
318
|
+
outfile: '.nixxie/esbuild.js',
|
|
319
|
+
format: 'cjs',
|
|
320
|
+
platform: 'node',
|
|
321
|
+
logLevel: 'silent'
|
|
322
|
+
});
|
|
323
|
+
} catch (e) {
|
|
324
|
+
var _e$errors;
|
|
325
|
+
if (!((_e$errors = e.errors) !== null && _e$errors !== void 0 && _e$errors.some(err => err.text.includes('Could not resolve')))) throw e;
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
return require(require.resolve(`${cwd}/.nixxie/esbuild.js`)).default;
|
|
330
|
+
} catch (err) {
|
|
331
|
+
if (err.code !== 'MODULE_NOT_FOUND') throw err;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async function getEsbuildConfig(cwd) {
|
|
335
|
+
var _await$getEsbuildConf;
|
|
336
|
+
const esbuildFn = (_await$getEsbuildConf = await getEsbuildConfigFn(cwd)) !== null && _await$getEsbuildConf !== void 0 ? _await$getEsbuildConf : identity;
|
|
337
|
+
const resolveDir = path.join(cwd, '.nixxie');
|
|
338
|
+
const importer = path.join(cwd, '.nixxie/config.js');
|
|
339
|
+
// we need the .nixxie directory to exist so when we resolve from it below, it actually exists
|
|
340
|
+
await fs.mkdir(resolveDir, {
|
|
341
|
+
// while we don't need to actually make this recursive,
|
|
342
|
+
// this will make mkdir not error when the directory already exists
|
|
343
|
+
recursive: true
|
|
344
|
+
});
|
|
345
|
+
return esbuildFn({
|
|
346
|
+
entryPoints: ['./nixxie'],
|
|
347
|
+
absWorkingDir: cwd,
|
|
348
|
+
bundle: true,
|
|
349
|
+
sourcemap: true,
|
|
350
|
+
jsx: 'automatic',
|
|
351
|
+
// TODO: this cannot be changed for now, circular dependency with getSystemPaths, getEsbuildConfig
|
|
352
|
+
outfile: '.nixxie/config.js',
|
|
353
|
+
format: 'cjs',
|
|
354
|
+
platform: 'node',
|
|
355
|
+
plugins: [{
|
|
356
|
+
name: 'external-node_modules',
|
|
357
|
+
setup(build) {
|
|
358
|
+
build.onResolve({
|
|
359
|
+
namespace: 'file',
|
|
360
|
+
// anything this is a relative path, we know that we definitely want to bundle it
|
|
361
|
+
// so we can skip running the function
|
|
362
|
+
// WARNING: we can't use a negative lookahead/lookbehind because esbuild uses Go
|
|
363
|
+
filter: /(?:^[^.])|(?:^\.[^/.])|(?:^\.\.[^/])/
|
|
364
|
+
}, async ({
|
|
365
|
+
path: path$1,
|
|
366
|
+
...args
|
|
367
|
+
}) => {
|
|
368
|
+
const resolved = await build.resolve(path$1, {
|
|
369
|
+
...args,
|
|
370
|
+
namespace: 'inner'
|
|
371
|
+
});
|
|
372
|
+
if (
|
|
373
|
+
// we want to bundle everything _except_ node_modules
|
|
374
|
+
// to avoid problems with duplicate instances of modules
|
|
375
|
+
// note that this will still bundle monorepo dependencies
|
|
376
|
+
// since the realpath of the modules will be outside node_modules
|
|
377
|
+
// even though they're symlinked into node_modules
|
|
378
|
+
resolved.path.includes('node_modules')) {
|
|
379
|
+
const resolvedFromOutputMaybeEsm = await build.resolve(path$1, {
|
|
380
|
+
resolveDir,
|
|
381
|
+
importer,
|
|
382
|
+
kind: 'import-statement',
|
|
383
|
+
namespace: 'inner'
|
|
384
|
+
});
|
|
385
|
+
// if Node will be able to resolve the module using the path written,
|
|
386
|
+
// we can emit imports that are the same as what was written
|
|
387
|
+
if (resolved.path === resolvedFromOutputMaybeEsm.path) {
|
|
388
|
+
return {
|
|
389
|
+
path: path$1,
|
|
390
|
+
external: true
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
// otherwise, we need to use longer relative paths to exactly where the module is
|
|
394
|
+
// this might involve imports that look like
|
|
395
|
+
// ../../packages/something/node_modules/something/index.js
|
|
396
|
+
// which is unfortunate, but not really a significant problem
|
|
397
|
+
// we also want to resolve it with node:module createRequire
|
|
398
|
+
// so that we'll get the cjs version
|
|
399
|
+
const resolvedFromImporterCjs = createRequire(args.importer).resolve(path$1);
|
|
400
|
+
return {
|
|
401
|
+
path: path.relative('.nixxie', resolvedFromImporterCjs),
|
|
402
|
+
external: true
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
if (
|
|
406
|
+
// this exception is purely here for projects in the nixxie repo itself
|
|
407
|
+
// since if we bundled @nixxie-cms/core, we would cause problems with the duplicated
|
|
408
|
+
// when using a published version of nixxie, this should absolutely nothing
|
|
409
|
+
// since imports to @nixxie-cms/core will be in node_modules
|
|
410
|
+
path$1.startsWith('@nixxie-cms/core')) {
|
|
411
|
+
return {
|
|
412
|
+
path: path$1,
|
|
413
|
+
external: true
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
return resolved;
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}]
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async function build(cwd, {
|
|
424
|
+
frozen,
|
|
425
|
+
prisma,
|
|
426
|
+
quiet,
|
|
427
|
+
ui
|
|
428
|
+
}) {
|
|
429
|
+
var _system$config$ui;
|
|
430
|
+
function log(message) {
|
|
431
|
+
if (quiet) return;
|
|
432
|
+
console.log(message);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// log('✨ Building Nixxie configuration')
|
|
436
|
+
await esbuild.build(await getEsbuildConfig(cwd));
|
|
437
|
+
const system = createSystem(await importBuiltNixxieConfiguration(cwd));
|
|
438
|
+
if (prisma) {
|
|
439
|
+
if (frozen) {
|
|
440
|
+
await validateArtifacts(cwd, system);
|
|
441
|
+
log('✨ GraphQL and Prisma schemas are up to date'); // TODO: validating?
|
|
442
|
+
} else {
|
|
443
|
+
await generateArtifacts(cwd, system);
|
|
444
|
+
log('✨ Generated GraphQL and Prisma schemas'); // TODO: generating?
|
|
445
|
+
}
|
|
446
|
+
await generateTypes(cwd, system);
|
|
447
|
+
await generatePrismaClient(cwd, system);
|
|
448
|
+
}
|
|
449
|
+
if ((_system$config$ui = system.config.ui) !== null && _system$config$ui !== void 0 && _system$config$ui.isDisabled || !ui) return;
|
|
450
|
+
log('✨ Generating Admin UI code');
|
|
451
|
+
const paths = system.getPaths(cwd);
|
|
452
|
+
await generateAdminUI(system.config, system.adminMeta, paths.admin, false);
|
|
453
|
+
log('✨ Building Admin UI');
|
|
454
|
+
|
|
455
|
+
// do _NOT_ change this to a static import, it is intentionally like this
|
|
456
|
+
// to avoid loading it in the common case where the UI is not being built
|
|
457
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
458
|
+
const nextBuild = require('next/dist/build').default;
|
|
459
|
+
await nextBuild(paths.admin, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'default', undefined);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const pkgDir = path$1.dirname(createRequire(__dirname).resolve('@nixxie-cms/core/package.json'));
|
|
463
|
+
|
|
464
|
+
const adminErrorHTMLFilepath = path.join(pkgDir, 'static', 'admin-error.html');
|
|
465
|
+
function createAdminUIMiddlewareWithNextApp(config, commonContext, nextApp) {
|
|
466
|
+
const handle = nextApp.getRequestHandler();
|
|
467
|
+
const {
|
|
468
|
+
ui: {
|
|
469
|
+
isAccessAllowed,
|
|
470
|
+
pageMiddleware,
|
|
471
|
+
publicPages,
|
|
472
|
+
basePath
|
|
473
|
+
}
|
|
474
|
+
} = config;
|
|
475
|
+
if (basePath.endsWith('/')) throw new TypeError('basePath must not end with a trailing slash');
|
|
476
|
+
return async (req, res) => {
|
|
477
|
+
const {
|
|
478
|
+
path
|
|
479
|
+
} = req;
|
|
480
|
+
if (path.startsWith(`${basePath}/_next`) || path.startsWith(`${basePath}/__next`)) {
|
|
481
|
+
return handle(req, res);
|
|
482
|
+
}
|
|
483
|
+
try {
|
|
484
|
+
// do nothing if this is a public page
|
|
485
|
+
const isPublicPage = publicPages.includes(path);
|
|
486
|
+
const context = await commonContext.withRequest(req, res);
|
|
487
|
+
const wasAccessAllowed = isPublicPage ? true : await isAccessAllowed(context);
|
|
488
|
+
const shouldRedirect = await (pageMiddleware === null || pageMiddleware === void 0 ? void 0 : pageMiddleware({
|
|
489
|
+
context,
|
|
490
|
+
wasAccessAllowed,
|
|
491
|
+
basePath
|
|
492
|
+
}));
|
|
493
|
+
if (shouldRedirect) {
|
|
494
|
+
res.header('Cache-Control', 'no-cache, max-age=0');
|
|
495
|
+
res.header('Location', shouldRedirect.to);
|
|
496
|
+
res.status(302);
|
|
497
|
+
res.send();
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
if (!wasAccessAllowed) return nextApp.render(req, res, '/no-access');
|
|
501
|
+
handle(req, res);
|
|
502
|
+
} catch (e) {
|
|
503
|
+
console.error('An error occurred handling a request for the Admin UI:', e);
|
|
504
|
+
res.status(500);
|
|
505
|
+
res.format({
|
|
506
|
+
'text/html': function () {
|
|
507
|
+
res.sendFile(adminErrorHTMLFilepath);
|
|
508
|
+
},
|
|
509
|
+
'application/json': function () {
|
|
510
|
+
res.send({
|
|
511
|
+
error: true
|
|
512
|
+
});
|
|
513
|
+
},
|
|
514
|
+
default: function () {
|
|
515
|
+
res.send('An error occurred handling a request for the Admin UI.');
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// prompts is badly typed so we have some more specific typed APIs
|
|
523
|
+
// prompts also returns an undefined value on SIGINT which we really just want to exit on
|
|
524
|
+
|
|
525
|
+
async function confirmPrompt(message, initial = true) {
|
|
526
|
+
const {
|
|
527
|
+
value
|
|
528
|
+
} = await prompts({
|
|
529
|
+
name: 'value',
|
|
530
|
+
type: 'confirm',
|
|
531
|
+
message,
|
|
532
|
+
initial
|
|
533
|
+
});
|
|
534
|
+
if (value === undefined) {
|
|
535
|
+
process.exit(1);
|
|
536
|
+
}
|
|
537
|
+
return value;
|
|
538
|
+
}
|
|
539
|
+
async function textPrompt(message) {
|
|
540
|
+
const {
|
|
541
|
+
value
|
|
542
|
+
} = await prompts({
|
|
543
|
+
name: 'value',
|
|
544
|
+
type: 'text',
|
|
545
|
+
message
|
|
546
|
+
});
|
|
547
|
+
if (value === undefined) {
|
|
548
|
+
process.exit(1);
|
|
549
|
+
}
|
|
550
|
+
return value;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
const defaultTelemetryEndpoint = 'https://telemetry.nixxiecms.com/3/';
|
|
554
|
+
function log(message) {
|
|
555
|
+
if (process.env.KEYSTONE_TELEMETRY_DEBUG === '1') {
|
|
556
|
+
console.log(`${message}`);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
function getTelemetryConfig() {
|
|
560
|
+
const userConfig = new Conf({
|
|
561
|
+
projectName: 'nixxiecms',
|
|
562
|
+
projectSuffix: '',
|
|
563
|
+
projectVersion: '3.0.0',
|
|
564
|
+
migrations: {
|
|
565
|
+
'^2.0.0': store => {
|
|
566
|
+
var _existing$device$last;
|
|
567
|
+
const existing = store.get('telemetry');
|
|
568
|
+
if (!existing) return; // skip non-configured or known opt-outs
|
|
569
|
+
|
|
570
|
+
const replacement = {
|
|
571
|
+
informedAt: null,
|
|
572
|
+
// re-inform
|
|
573
|
+
device: {
|
|
574
|
+
lastSentDate: (_existing$device$last = existing.device.lastSentDate) !== null && _existing$device$last !== void 0 ? _existing$device$last : null
|
|
575
|
+
},
|
|
576
|
+
projects: {} // see below
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
// copy existing project.lastSentDate's
|
|
580
|
+
for (const [projectPath, project] of Object.entries(existing.projects)) {
|
|
581
|
+
if (projectPath === 'default') continue; // informedAt moved to device.lastSentDate
|
|
582
|
+
|
|
583
|
+
// dont copy garbage
|
|
584
|
+
if (typeof project !== 'object') continue;
|
|
585
|
+
if (typeof project.lastSentDate !== 'string') continue;
|
|
586
|
+
if (new Date(project.lastSentDate).toString() === 'Invalid Date') continue;
|
|
587
|
+
|
|
588
|
+
// retain lastSentDate
|
|
589
|
+
replacement.projects[projectPath] = {
|
|
590
|
+
lastSentDate: project.lastSentDate
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
store.set('telemetry', replacement);
|
|
594
|
+
},
|
|
595
|
+
'^3.0.0': store => {
|
|
596
|
+
const existing = store.get('telemetry');
|
|
597
|
+
if (!existing) return; // skip non-configured or known opt-outs
|
|
598
|
+
|
|
599
|
+
store.set('telemetry', {
|
|
600
|
+
...existing,
|
|
601
|
+
informedAt: null // re-inform
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
return {
|
|
607
|
+
telemetry: userConfig.get('telemetry'),
|
|
608
|
+
userConfig
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
function getDefault(telemetry) {
|
|
612
|
+
if (telemetry) return telemetry;
|
|
613
|
+
return {
|
|
614
|
+
informedAt: null,
|
|
615
|
+
device: {
|
|
616
|
+
lastSentDate: null
|
|
617
|
+
},
|
|
618
|
+
projects: {}
|
|
619
|
+
}; // help Typescript infer the type
|
|
620
|
+
}
|
|
621
|
+
const todaysDate = new Date().toISOString().slice(0, 10);
|
|
622
|
+
function collectFieldCount(lists) {
|
|
623
|
+
const fields = {
|
|
624
|
+
unknown: 0
|
|
625
|
+
};
|
|
626
|
+
for (const list of Object.values(lists)) {
|
|
627
|
+
for (const [fieldPath, field] of Object.entries(list.fields)) {
|
|
628
|
+
const fieldType = field.__ksTelemetryFieldTypeName;
|
|
629
|
+
if (!fieldType) {
|
|
630
|
+
// skip id fields
|
|
631
|
+
if (fieldPath.endsWith('id')) continue;
|
|
632
|
+
fields.unknown++;
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
fields[fieldType] || (fields[fieldType] = 0);
|
|
636
|
+
fields[fieldType] += 1;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return fields;
|
|
640
|
+
}
|
|
641
|
+
async function collectPackageVersions() {
|
|
642
|
+
const packages = {
|
|
643
|
+
'@nixxie-cms/core': '0.0.0' // "unknown"
|
|
644
|
+
};
|
|
645
|
+
for (const packageName of ['@nixxie-cms/core', '@nixxie-cms/auth', '@nixxie-cms/fields-document', '@nixxie-cms/cloudinary', '@nixxie-cms/session-store-redis',
|
|
646
|
+
// we hope usage to drops to zero
|
|
647
|
+
'@opensaas/nixxie-nextjs-auth']) {
|
|
648
|
+
try {
|
|
649
|
+
const packageJson = require(`${packageName}/package.json`);
|
|
650
|
+
// const packageJson = await import(`${packageName}/package.json`, { assert: { type: 'json' } }) // TODO: broken in jest
|
|
651
|
+
packages[packageName] = packageJson.version;
|
|
652
|
+
} catch (err) {
|
|
653
|
+
// do nothing, the package is probably not installed
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
return packages;
|
|
657
|
+
}
|
|
658
|
+
function printNext(telemetry) {
|
|
659
|
+
if (!telemetry) {
|
|
660
|
+
console.log(`Telemetry data will ${red`not`} be sent by this system user`);
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
console.log(`Telemetry data will be sent the next time you run ${green`"nixxie dev"`}`);
|
|
664
|
+
}
|
|
665
|
+
function printTelemetryStatus(telemetry, updated = false) {
|
|
666
|
+
const auxverb = updated ? 'has been' : 'is';
|
|
667
|
+
if (telemetry === undefined) {
|
|
668
|
+
console.log(`Nixxie telemetry ${auxverb} ${yellow`uninitialized`}`);
|
|
669
|
+
console.log();
|
|
670
|
+
printNext(telemetry);
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
if (telemetry === false) {
|
|
674
|
+
console.log(`Nixxie telemetry ${auxverb} ${red`disabled`}`);
|
|
675
|
+
console.log();
|
|
676
|
+
printNext(telemetry);
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
console.log(`Nixxie telemetry ${auxverb} ${green`enabled`}`);
|
|
680
|
+
console.log();
|
|
681
|
+
console.log(` Device telemetry was last sent on ${telemetry.device.lastSentDate}`);
|
|
682
|
+
for (const [projectPath, project] of Object.entries(telemetry.projects)) {
|
|
683
|
+
console.log(` Project telemetry for "${yellow(projectPath)}" was last sent on ${project === null || project === void 0 ? void 0 : project.lastSentDate}`);
|
|
684
|
+
}
|
|
685
|
+
console.log();
|
|
686
|
+
printNext(telemetry);
|
|
687
|
+
}
|
|
688
|
+
function inform(telemetry, userConfig) {
|
|
689
|
+
console.log(); // gap to help visiblity
|
|
690
|
+
console.log(`${bold('Nixxie Telemetry')}`);
|
|
691
|
+
console.log(`${yellow`Nixxie collects anonymous data when you run`} ${green`"nixxie dev"`}`);
|
|
692
|
+
console.log(`You can use ${green`"nixxie telemetry --help"`} to update your preferences at any time`);
|
|
693
|
+
if (telemetry.informedAt === null) {
|
|
694
|
+
console.log();
|
|
695
|
+
console.log(`No telemetry data has been sent as part of this notice`);
|
|
696
|
+
}
|
|
697
|
+
console.log();
|
|
698
|
+
printNext(telemetry);
|
|
699
|
+
console.log(); // gap to help visiblity
|
|
700
|
+
console.log(`For more information, including how to opt-out see ${grey`https://nixxiecms.com/telemetry`} (updated ${blue`2024-08-20`})`);
|
|
701
|
+
|
|
702
|
+
// update the informedAt
|
|
703
|
+
telemetry.informedAt = new Date().toJSON();
|
|
704
|
+
userConfig.set('telemetry', telemetry);
|
|
705
|
+
}
|
|
706
|
+
async function sendEvent(eventType, eventData) {
|
|
707
|
+
const endpoint = process.env.KEYSTONE_TELEMETRY_ENDPOINT || defaultTelemetryEndpoint;
|
|
708
|
+
await new Promise(resolve => {
|
|
709
|
+
const req = https.request(`${endpoint}${eventType}`, {
|
|
710
|
+
method: 'POST',
|
|
711
|
+
headers: {
|
|
712
|
+
'Content-Type': 'application/json'
|
|
713
|
+
}
|
|
714
|
+
}, () => resolve());
|
|
715
|
+
req.once('error', err => {
|
|
716
|
+
var _err$message;
|
|
717
|
+
log((_err$message = err === null || err === void 0 ? void 0 : err.message) !== null && _err$message !== void 0 ? _err$message : err);
|
|
718
|
+
resolve();
|
|
719
|
+
});
|
|
720
|
+
req.end(JSON.stringify(eventData));
|
|
721
|
+
});
|
|
722
|
+
log(`sent ${eventType} report`);
|
|
723
|
+
}
|
|
724
|
+
async function sendProjectTelemetryEvent(cwd, lists, dbProviderName, telemetry, userConfig) {
|
|
725
|
+
var _telemetry$projects$c;
|
|
726
|
+
const project = (_telemetry$projects$c = telemetry.projects[cwd]) !== null && _telemetry$projects$c !== void 0 ? _telemetry$projects$c : {
|
|
727
|
+
lastSentDate: null
|
|
728
|
+
};
|
|
729
|
+
const {
|
|
730
|
+
lastSentDate
|
|
731
|
+
} = project;
|
|
732
|
+
if (lastSentDate && lastSentDate === todaysDate) {
|
|
733
|
+
log('project telemetry already sent today');
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
await sendEvent('project', {
|
|
737
|
+
lastSentDate,
|
|
738
|
+
packages: await collectPackageVersions(),
|
|
739
|
+
database: dbProviderName,
|
|
740
|
+
lists: Object.keys(lists).length,
|
|
741
|
+
fields: collectFieldCount(lists)
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
// update the project lastSentDate
|
|
745
|
+
telemetry.projects[cwd] = {
|
|
746
|
+
lastSentDate: todaysDate
|
|
747
|
+
};
|
|
748
|
+
userConfig.set('telemetry', telemetry);
|
|
749
|
+
}
|
|
750
|
+
async function sendDeviceTelemetryEvent(telemetry, userConfig) {
|
|
751
|
+
const {
|
|
752
|
+
lastSentDate
|
|
753
|
+
} = telemetry.device;
|
|
754
|
+
if (lastSentDate && lastSentDate === todaysDate) {
|
|
755
|
+
log('device telemetry already sent today');
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
await sendEvent('device', {
|
|
759
|
+
lastSentDate,
|
|
760
|
+
os: platform(),
|
|
761
|
+
node: process.versions.node.split('.')[0]
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
// update the device lastSentDate
|
|
765
|
+
telemetry.device = {
|
|
766
|
+
lastSentDate: todaysDate
|
|
767
|
+
};
|
|
768
|
+
userConfig.set('telemetry', telemetry);
|
|
769
|
+
}
|
|
770
|
+
async function runTelemetry(cwd, lists, dbProviderName) {
|
|
771
|
+
try {
|
|
772
|
+
if (ci.isCI) {
|
|
773
|
+
console.log(`Nixxie Telemetry is ${red`disabled`} (running in CI)`);
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
const {
|
|
777
|
+
telemetry,
|
|
778
|
+
userConfig
|
|
779
|
+
} = getTelemetryConfig();
|
|
780
|
+
if (telemetry === false) {
|
|
781
|
+
console.log(`Nixxie Telemetry is ${red`disabled`} (via opt-out)`);
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
if (process.env.NIXXIE_TELEMETRY_DISABLED === '1') {
|
|
785
|
+
console.log(`Nixxie Telemetry is ${red`disabled`} (NIXXIE_TELEMETRY_DISABLED is set)`);
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
if (process.env.DO_NOT_TRACK === '1') {
|
|
789
|
+
console.log(`Nixxie Telemetry is ${red`disabled`} (DO_NOT_TRACK is set)`);
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
if (process.env.NODE_ENV === 'production') {
|
|
793
|
+
console.log(`Nixxie Telemetry is ${red`disabled`} (NODE_ENV is production)`);
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
// don't send telemetry before we inform the user, allowing opt-out
|
|
798
|
+
const telemetryDefaulted = getDefault(telemetry);
|
|
799
|
+
if (!telemetryDefaulted.informedAt) return inform(telemetryDefaulted, userConfig);
|
|
800
|
+
console.log(`Nixxie Telemetry is ${green`enabled`}`);
|
|
801
|
+
await sendProjectTelemetryEvent(cwd, lists, dbProviderName, telemetryDefaulted, userConfig);
|
|
802
|
+
await sendDeviceTelemetryEvent(telemetryDefaulted, userConfig);
|
|
803
|
+
} catch (err) {
|
|
804
|
+
var _err$message2;
|
|
805
|
+
log((_err$message2 = err === null || err === void 0 ? void 0 : err.message) !== null && _err$message2 !== void 0 ? _err$message2 : err);
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
function statusTelemetry(updated = false) {
|
|
809
|
+
const {
|
|
810
|
+
telemetry
|
|
811
|
+
} = getTelemetryConfig();
|
|
812
|
+
printTelemetryStatus(telemetry, updated);
|
|
813
|
+
}
|
|
814
|
+
function informTelemetry() {
|
|
815
|
+
const {
|
|
816
|
+
userConfig
|
|
817
|
+
} = getTelemetryConfig();
|
|
818
|
+
inform(getDefault(false), userConfig);
|
|
819
|
+
}
|
|
820
|
+
function enableTelemetry() {
|
|
821
|
+
const {
|
|
822
|
+
telemetry,
|
|
823
|
+
userConfig
|
|
824
|
+
} = getTelemetryConfig();
|
|
825
|
+
if (!telemetry) {
|
|
826
|
+
userConfig.set('telemetry', getDefault(telemetry));
|
|
827
|
+
}
|
|
828
|
+
statusTelemetry(true);
|
|
829
|
+
}
|
|
830
|
+
function disableTelemetry() {
|
|
831
|
+
const {
|
|
832
|
+
userConfig
|
|
833
|
+
} = getTelemetryConfig();
|
|
834
|
+
userConfig.set('telemetry', false);
|
|
835
|
+
statusTelemetry(true);
|
|
836
|
+
}
|
|
837
|
+
function resetTelemetry() {
|
|
838
|
+
const {
|
|
839
|
+
userConfig
|
|
840
|
+
} = getTelemetryConfig();
|
|
841
|
+
userConfig.delete('telemetry');
|
|
842
|
+
statusTelemetry(true);
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
async function noop() {}
|
|
846
|
+
const devLoadingHTMLFilepath = path.join(pkgDir, 'static', 'dev-loading.html');
|
|
847
|
+
function stripExtendHttpServer(config) {
|
|
848
|
+
const {
|
|
849
|
+
server,
|
|
850
|
+
...rest
|
|
851
|
+
} = config;
|
|
852
|
+
const {
|
|
853
|
+
extendHttpServer,
|
|
854
|
+
...restServer
|
|
855
|
+
} = server;
|
|
856
|
+
return {
|
|
857
|
+
...rest,
|
|
858
|
+
server: {
|
|
859
|
+
...restServer,
|
|
860
|
+
extendHttpServer: noop
|
|
861
|
+
}
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
function resolvablePromise() {
|
|
865
|
+
let _resolve;
|
|
866
|
+
const promise = new Promise(resolve => {
|
|
867
|
+
_resolve = resolve;
|
|
868
|
+
});
|
|
869
|
+
promise.resolve = _resolve;
|
|
870
|
+
return promise;
|
|
871
|
+
}
|
|
872
|
+
async function dev(cwd, {
|
|
873
|
+
dbPush,
|
|
874
|
+
prisma,
|
|
875
|
+
quiet,
|
|
876
|
+
server,
|
|
877
|
+
ui
|
|
878
|
+
}) {
|
|
879
|
+
var _esbuildConfig$plugin;
|
|
880
|
+
function log(message) {
|
|
881
|
+
if (quiet) return;
|
|
882
|
+
console.log(message);
|
|
883
|
+
}
|
|
884
|
+
log('✨ Starting Nixxie');
|
|
885
|
+
let lastPromise = resolvablePromise();
|
|
886
|
+
const builds = {
|
|
887
|
+
[Symbol.asyncIterator]: () => ({
|
|
888
|
+
next: () => lastPromise
|
|
889
|
+
})
|
|
890
|
+
};
|
|
891
|
+
function addBuildResult(build) {
|
|
892
|
+
const prev = lastPromise;
|
|
893
|
+
lastPromise = resolvablePromise();
|
|
894
|
+
prev.resolve({
|
|
895
|
+
value: build,
|
|
896
|
+
done: false
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
const esbuildConfig = await getEsbuildConfig(cwd);
|
|
900
|
+
const esbuildContext = await esbuild.context({
|
|
901
|
+
...esbuildConfig,
|
|
902
|
+
plugins: [...((_esbuildConfig$plugin = esbuildConfig.plugins) !== null && _esbuildConfig$plugin !== void 0 ? _esbuildConfig$plugin : []), {
|
|
903
|
+
name: 'esbuildWatchPlugin',
|
|
904
|
+
setup(build) {
|
|
905
|
+
// TODO: no any
|
|
906
|
+
build.onEnd(addBuildResult);
|
|
907
|
+
}
|
|
908
|
+
}]
|
|
909
|
+
});
|
|
910
|
+
try {
|
|
911
|
+
const firstBuild = await esbuildContext.rebuild();
|
|
912
|
+
addBuildResult(firstBuild);
|
|
913
|
+
} catch (e) {
|
|
914
|
+
// esbuild prints everything we want users to see
|
|
915
|
+
}
|
|
916
|
+
esbuildContext.watch();
|
|
917
|
+
let prismaClient = null;
|
|
918
|
+
async function stop(aHttpServer, exitMessage = '') {
|
|
919
|
+
await esbuildContext.dispose();
|
|
920
|
+
|
|
921
|
+
// WARNING: this is only actually required for tests
|
|
922
|
+
// stop httpServer
|
|
923
|
+
if (aHttpServer) {
|
|
924
|
+
await new Promise((resolve, reject) => {
|
|
925
|
+
aHttpServer.close(async err => {
|
|
926
|
+
if (err) {
|
|
927
|
+
console.error('Error closing the server', err);
|
|
928
|
+
return reject(err);
|
|
929
|
+
}
|
|
930
|
+
resolve(null);
|
|
931
|
+
});
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
// WARNING: this is only required for tests
|
|
936
|
+
// stop Prisma
|
|
937
|
+
try {
|
|
938
|
+
var _prismaClient, _prismaClient$disconn;
|
|
939
|
+
await ((_prismaClient = prismaClient) === null || _prismaClient === void 0 || (_prismaClient$disconn = _prismaClient.disconnect) === null || _prismaClient$disconn === void 0 ? void 0 : _prismaClient$disconn.call(_prismaClient));
|
|
940
|
+
} catch (err) {
|
|
941
|
+
console.error('Error disconnecting from the database', err);
|
|
942
|
+
throw err;
|
|
943
|
+
}
|
|
944
|
+
if (exitMessage) throw new ExitError(1, exitMessage);
|
|
945
|
+
}
|
|
946
|
+
const app = server ? express() : null;
|
|
947
|
+
const httpServer = app ? createServer(app) : null;
|
|
948
|
+
let expressServer = null;
|
|
949
|
+
let hasAddedAdminUIMiddleware = false;
|
|
950
|
+
const isReady = () => !server || expressServer !== null && hasAddedAdminUIMiddleware;
|
|
951
|
+
const initNixxie = async () => {
|
|
952
|
+
var _configWithExtendHttp, _system$config$ui;
|
|
953
|
+
const configWithExtendHttp = await importBuiltNixxieConfiguration(cwd);
|
|
954
|
+
const {
|
|
955
|
+
system,
|
|
956
|
+
context,
|
|
957
|
+
prismaClientModule,
|
|
958
|
+
apolloServer,
|
|
959
|
+
...rest
|
|
960
|
+
} = await async function () {
|
|
961
|
+
const system = createSystem(stripExtendHttpServer(configWithExtendHttp));
|
|
962
|
+
|
|
963
|
+
// Generate the Artifacts
|
|
964
|
+
if (prisma) {
|
|
965
|
+
log('✨ Generating GraphQL and Prisma schemas');
|
|
966
|
+
const {
|
|
967
|
+
prisma: generatedPrismaSchema
|
|
968
|
+
} = await generateArtifacts(cwd, system);
|
|
969
|
+
await generateTypes(cwd, system);
|
|
970
|
+
await generatePrismaClient(cwd, system);
|
|
971
|
+
const paths = system.getPaths(cwd);
|
|
972
|
+
if (dbPush) {
|
|
973
|
+
const created = await createDatabase(system.config.db.url, path.dirname(paths.schema.prisma));
|
|
974
|
+
if (created) log(`✨ Database created`);
|
|
975
|
+
const migration = await withMigrate(paths.schema.prisma, system, async m => {
|
|
976
|
+
// what does force on migrate.engine.schemaPush mean?
|
|
977
|
+
// - true: ignore warnings, but unexecutable steps will block
|
|
978
|
+
// - false: warnings or unexecutable steps will block
|
|
979
|
+
const migration_ = await m.schema(generatedPrismaSchema, false);
|
|
980
|
+
|
|
981
|
+
// if there are unexecutable steps, we need to reset the database [or the user can use migrations]
|
|
982
|
+
if (migration_.unexecutable.length) {
|
|
983
|
+
console.error(`${chalk.bold.red('\n⚠️ We found changes that cannot be executed:\n')}`);
|
|
984
|
+
for (const item of migration_.unexecutable) {
|
|
985
|
+
console.error(` • ${item}`);
|
|
986
|
+
}
|
|
987
|
+
if (migration_.warnings.length) {
|
|
988
|
+
console.error(chalk.bold(`\n⚠️ Warnings:\n`));
|
|
989
|
+
for (const warning of migration_.warnings) {
|
|
990
|
+
console.error(` • ${warning}`);
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
console.error('\nTo apply this migration, we need to reset the database');
|
|
994
|
+
if (!(await confirmPrompt(`Do you want to continue? ${chalk.red('The database will be reset')}`, false))) {
|
|
995
|
+
throw new ExitError(1, 'Database reset cancelled by user');
|
|
996
|
+
}
|
|
997
|
+
await m.reset();
|
|
998
|
+
return m.schema(generatedPrismaSchema, false);
|
|
999
|
+
}
|
|
1000
|
+
if (migration_.warnings.length) {
|
|
1001
|
+
if (migration_.warnings.length) {
|
|
1002
|
+
console.error(chalk.bold(`\n⚠️ Warnings:\n`));
|
|
1003
|
+
for (const warning of migration_.warnings) {
|
|
1004
|
+
console.error(` • ${warning}`);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
if (!(await confirmPrompt(`Do you want to continue? ${chalk.red('Some data will be lost')}`, false))) {
|
|
1008
|
+
throw new ExitError(1, 'Database push cancelled by user');
|
|
1009
|
+
}
|
|
1010
|
+
return m.schema(generatedPrismaSchema, true);
|
|
1011
|
+
}
|
|
1012
|
+
return migration_;
|
|
1013
|
+
});
|
|
1014
|
+
if (migration.warnings.length === 0 && migration.executedSteps === 0) {
|
|
1015
|
+
log(`✨ Database unchanged`);
|
|
1016
|
+
} else {
|
|
1017
|
+
log(`✨ Database synchronized with Prisma schema`);
|
|
1018
|
+
}
|
|
1019
|
+
} else {
|
|
1020
|
+
log('⚠️ Skipping database schema push');
|
|
1021
|
+
}
|
|
1022
|
+
const prismaClientModule = require(paths.prisma);
|
|
1023
|
+
const nixxie = system.getNixxie(prismaClientModule);
|
|
1024
|
+
log('✨ Connecting to the database');
|
|
1025
|
+
await nixxie.connect(); // TODO: remove, replace with server.onStart
|
|
1026
|
+
if (!server) {
|
|
1027
|
+
return {
|
|
1028
|
+
system,
|
|
1029
|
+
context: nixxie.context,
|
|
1030
|
+
prismaClientModule
|
|
1031
|
+
};
|
|
1032
|
+
}
|
|
1033
|
+
log('✨ Creating server');
|
|
1034
|
+
const {
|
|
1035
|
+
apolloServer,
|
|
1036
|
+
expressServer
|
|
1037
|
+
} = await createExpressServer(system.config, nixxie.context);
|
|
1038
|
+
log(`✅ GraphQL API ready`);
|
|
1039
|
+
return {
|
|
1040
|
+
system,
|
|
1041
|
+
context: nixxie.context,
|
|
1042
|
+
expressServer,
|
|
1043
|
+
apolloServer,
|
|
1044
|
+
prismaClientModule
|
|
1045
|
+
};
|
|
1046
|
+
}
|
|
1047
|
+
return {
|
|
1048
|
+
system
|
|
1049
|
+
};
|
|
1050
|
+
}();
|
|
1051
|
+
if (configWithExtendHttp !== null && configWithExtendHttp !== void 0 && (_configWithExtendHttp = configWithExtendHttp.server) !== null && _configWithExtendHttp !== void 0 && _configWithExtendHttp.extendHttpServer && httpServer && context) {
|
|
1052
|
+
configWithExtendHttp.server.extendHttpServer(httpServer, context);
|
|
1053
|
+
}
|
|
1054
|
+
prismaClient = context === null || context === void 0 ? void 0 : context.prisma;
|
|
1055
|
+
if (rest.expressServer) {
|
|
1056
|
+
({
|
|
1057
|
+
expressServer
|
|
1058
|
+
} = rest);
|
|
1059
|
+
}
|
|
1060
|
+
let nextApp;
|
|
1061
|
+
if (!((_system$config$ui = system.config.ui) !== null && _system$config$ui !== void 0 && _system$config$ui.isDisabled) && ui) {
|
|
1062
|
+
if (!expressServer || !context) throw new TypeError('Error trying to prepare the Admin UI');
|
|
1063
|
+
log('✨ Generating Admin UI code');
|
|
1064
|
+
const paths = system.getPaths(cwd);
|
|
1065
|
+
await fs.rm(paths.admin, {
|
|
1066
|
+
recursive: true,
|
|
1067
|
+
force: true
|
|
1068
|
+
});
|
|
1069
|
+
await generateAdminUI(system.config, system.adminMeta, paths.admin, false);
|
|
1070
|
+
log('✨ Preparing Admin UI');
|
|
1071
|
+
nextApp = next({
|
|
1072
|
+
dev: true,
|
|
1073
|
+
dir: paths.admin
|
|
1074
|
+
});
|
|
1075
|
+
await nextApp.prepare();
|
|
1076
|
+
expressServer.use(createAdminUIMiddlewareWithNextApp(system.config, context, nextApp));
|
|
1077
|
+
log(`✅ Admin UI ready`);
|
|
1078
|
+
}
|
|
1079
|
+
hasAddedAdminUIMiddleware = true;
|
|
1080
|
+
initNixxiePromiseResolve();
|
|
1081
|
+
const originalPrismaSchema = printPrismaSchema(system.config, system.lists);
|
|
1082
|
+
let lastPrintedGraphQLSchema = printSchema(system.graphql.schemas.public);
|
|
1083
|
+
let lastApolloServer = apolloServer !== null && apolloServer !== void 0 ? apolloServer : null;
|
|
1084
|
+
if (system.config.telemetry !== false) {
|
|
1085
|
+
runTelemetry(cwd, system.lists, system.config.db.provider);
|
|
1086
|
+
}
|
|
1087
|
+
for await (const buildResult of builds) {
|
|
1088
|
+
if (buildResult.errors.length) continue;
|
|
1089
|
+
log('compiled successfully');
|
|
1090
|
+
try {
|
|
1091
|
+
const paths = system.getPaths(cwd);
|
|
1092
|
+
|
|
1093
|
+
// wipe the require cache
|
|
1094
|
+
{
|
|
1095
|
+
const resolved = require.resolve(paths.config);
|
|
1096
|
+
delete require.cache[resolved];
|
|
1097
|
+
}
|
|
1098
|
+
const newConfigWithHttp = await importBuiltNixxieConfiguration(cwd);
|
|
1099
|
+
const newSystem = createSystem(stripExtendHttpServer(newConfigWithHttp));
|
|
1100
|
+
if (prisma) {
|
|
1101
|
+
if (!originalPrismaSchema) throw new TypeError('Missing Prisma schema source');
|
|
1102
|
+
const newPrismaSchema = printPrismaSchema(newSystem.config, newSystem.lists);
|
|
1103
|
+
if (originalPrismaSchema !== newPrismaSchema) {
|
|
1104
|
+
return stop(null, '🔄 Your prisma schema has changed, please restart Nixxie');
|
|
1105
|
+
}
|
|
1106
|
+
// we only need to test for the things which influence the prisma client creation
|
|
1107
|
+
// and aren't written into the prisma schema since we check whether the prisma schema has changed above
|
|
1108
|
+
if (JSON.stringify(newSystem.config.db.enableLogging) !== JSON.stringify(system.config.db.enableLogging) || newSystem.config.db.url !== system.config.db.url) {
|
|
1109
|
+
return stop(null, 'Your database configuration has changed, please restart Nixxie');
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
// we're not using generateCommittedArtifacts or any of the similar functions
|
|
1114
|
+
// because we will never need to write a new prisma schema here
|
|
1115
|
+
// and formatting the prisma schema leaves some listeners on the process
|
|
1116
|
+
// which means you get a "there's probably a memory leak" warning from node
|
|
1117
|
+
const newPrintedGraphQLSchema = printSchema(newSystem.graphql.schemas.public);
|
|
1118
|
+
if (newPrintedGraphQLSchema !== lastPrintedGraphQLSchema) {
|
|
1119
|
+
await fs.writeFile(paths.schema.graphql, getFormattedGraphQLSchema(newPrintedGraphQLSchema));
|
|
1120
|
+
lastPrintedGraphQLSchema = newPrintedGraphQLSchema;
|
|
1121
|
+
}
|
|
1122
|
+
await generateTypes(cwd, newSystem);
|
|
1123
|
+
await generateAdminUI(newSystem.config, newSystem.adminMeta, paths.admin, true);
|
|
1124
|
+
if (prismaClientModule) {
|
|
1125
|
+
if (server && lastApolloServer) {
|
|
1126
|
+
const {
|
|
1127
|
+
context: newContext
|
|
1128
|
+
} = newSystem.getNixxie(prismaClientModule);
|
|
1129
|
+
const servers = await createExpressServer(newSystem.config, newContext);
|
|
1130
|
+
if (nextApp) {
|
|
1131
|
+
servers.expressServer.use(createAdminUIMiddlewareWithNextApp(newSystem.config, newContext, nextApp));
|
|
1132
|
+
}
|
|
1133
|
+
expressServer = servers.expressServer;
|
|
1134
|
+
const prevApolloServer = lastApolloServer;
|
|
1135
|
+
lastApolloServer = servers.apolloServer;
|
|
1136
|
+
await prevApolloServer.stop();
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
} catch (err) {
|
|
1140
|
+
console.error(`Error loading your Nixxie config`, err);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
};
|
|
1144
|
+
|
|
1145
|
+
// Serve the dev status page for the Admin UI
|
|
1146
|
+
let initNixxiePromiseResolve;
|
|
1147
|
+
let initNixxiePromiseReject;
|
|
1148
|
+
const initNixxiePromise = new Promise((resolve, reject) => {
|
|
1149
|
+
initNixxiePromiseResolve = resolve;
|
|
1150
|
+
initNixxiePromiseReject = reject;
|
|
1151
|
+
});
|
|
1152
|
+
if (app && httpServer) {
|
|
1153
|
+
var _config$server;
|
|
1154
|
+
const config = await importBuiltNixxieConfiguration(cwd);
|
|
1155
|
+
app.use('/__nixxie/dev/status', (req, res) => {
|
|
1156
|
+
res.status(isReady() ? 200 : 501).end();
|
|
1157
|
+
});
|
|
1158
|
+
app.use((req, res, next) => {
|
|
1159
|
+
var _config$graphql$path, _config$graphql;
|
|
1160
|
+
if (expressServer && hasAddedAdminUIMiddleware) {
|
|
1161
|
+
return expressServer(req, res, next);
|
|
1162
|
+
}
|
|
1163
|
+
const {
|
|
1164
|
+
pathname
|
|
1165
|
+
} = new URL(req.url, 'http://ks');
|
|
1166
|
+
if (expressServer && pathname === ((_config$graphql$path = (_config$graphql = config.graphql) === null || _config$graphql === void 0 ? void 0 : _config$graphql.path) !== null && _config$graphql$path !== void 0 ? _config$graphql$path : '/api/graphql')) {
|
|
1167
|
+
return expressServer(req, res, next);
|
|
1168
|
+
}
|
|
1169
|
+
res.sendFile(devLoadingHTMLFilepath);
|
|
1170
|
+
});
|
|
1171
|
+
const httpOptions = {
|
|
1172
|
+
port: 3000
|
|
1173
|
+
};
|
|
1174
|
+
if (config !== null && config !== void 0 && config.server && 'port' in config.server && typeof ((_config$server = config.server) === null || _config$server === void 0 ? void 0 : _config$server.port) === 'number') {
|
|
1175
|
+
httpOptions.port = config.server.port;
|
|
1176
|
+
}
|
|
1177
|
+
if (config !== null && config !== void 0 && config.server && 'options' in config.server && config.server.options) {
|
|
1178
|
+
Object.assign(httpOptions, config.server.options);
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
// preference env.PORT if supplied
|
|
1182
|
+
if ('PORT' in process.env) {
|
|
1183
|
+
var _process$env$PORT;
|
|
1184
|
+
httpOptions.port = parseInt((_process$env$PORT = process.env.PORT) !== null && _process$env$PORT !== void 0 ? _process$env$PORT : '');
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
// preference env.HOST if supplied
|
|
1188
|
+
if ('HOST' in process.env) {
|
|
1189
|
+
var _process$env$HOST;
|
|
1190
|
+
httpOptions.host = (_process$env$HOST = process.env.HOST) !== null && _process$env$HOST !== void 0 ? _process$env$HOST : '';
|
|
1191
|
+
}
|
|
1192
|
+
const server = httpServer.listen(httpOptions, err => {
|
|
1193
|
+
var _httpOptions$host, _config$graphql$path2, _config$graphql2;
|
|
1194
|
+
if (err) throw err;
|
|
1195
|
+
const easyHost = [undefined, '', '::', '0.0.0.0'].includes(httpOptions.host) ? 'localhost' : httpOptions.host;
|
|
1196
|
+
log(`⭐️ Server listening on ${(_httpOptions$host = httpOptions.host) !== null && _httpOptions$host !== void 0 ? _httpOptions$host : ''}:${httpOptions.port} (http://${easyHost}:${httpOptions.port}/)`);
|
|
1197
|
+
log(`⭐️ GraphQL API available at ${(_config$graphql$path2 = (_config$graphql2 = config.graphql) === null || _config$graphql2 === void 0 ? void 0 : _config$graphql2.path) !== null && _config$graphql$path2 !== void 0 ? _config$graphql$path2 : '/api/graphql'}`);
|
|
1198
|
+
|
|
1199
|
+
// Don't start initialising Nixxie until the dev server is ready,
|
|
1200
|
+
// otherwise it slows down the first response significantly
|
|
1201
|
+
initNixxie().catch(async err => {
|
|
1202
|
+
await stop(server);
|
|
1203
|
+
initNixxiePromiseReject(err);
|
|
1204
|
+
});
|
|
1205
|
+
});
|
|
1206
|
+
await initNixxiePromise;
|
|
1207
|
+
return async () => await stop(server);
|
|
1208
|
+
} else {
|
|
1209
|
+
await initNixxie();
|
|
1210
|
+
return () => Promise.resolve();
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
async function spawnPrisma(cwd, system, commands) {
|
|
1215
|
+
let output = '';
|
|
1216
|
+
return new Promise((resolve, reject) => {
|
|
1217
|
+
const p = spawn('node', ['--title=prisma', require.resolve('prisma/build/index.js'), ...commands], {
|
|
1218
|
+
cwd,
|
|
1219
|
+
env: {
|
|
1220
|
+
...process.env,
|
|
1221
|
+
DATABASE_URL: system.config.db.url,
|
|
1222
|
+
PRISMA_HIDE_UPDATE_MESSAGE: '1'
|
|
1223
|
+
}
|
|
1224
|
+
});
|
|
1225
|
+
p.stdout.on('data', data => output += data.toString('utf-8'));
|
|
1226
|
+
p.stderr.on('data', data => output += data.toString('utf-8'));
|
|
1227
|
+
p.on('error', err => reject(err));
|
|
1228
|
+
p.on('exit', exitCode => resolve({
|
|
1229
|
+
exitCode,
|
|
1230
|
+
output
|
|
1231
|
+
}));
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
async function migrateCreate(cwd, {
|
|
1235
|
+
frozen,
|
|
1236
|
+
quiet
|
|
1237
|
+
}) {
|
|
1238
|
+
function log(message) {
|
|
1239
|
+
if (quiet) return;
|
|
1240
|
+
console.log(message);
|
|
1241
|
+
}
|
|
1242
|
+
await esbuild.build(await getEsbuildConfig(cwd));
|
|
1243
|
+
const system = createSystem(await importBuiltNixxieConfiguration(cwd));
|
|
1244
|
+
if (frozen) {
|
|
1245
|
+
await validateArtifacts(cwd, system);
|
|
1246
|
+
log('✨ GraphQL and Prisma schemas are up to date');
|
|
1247
|
+
} else {
|
|
1248
|
+
await generateArtifacts(cwd, system);
|
|
1249
|
+
log('✨ Generated GraphQL and Prisma schemas');
|
|
1250
|
+
}
|
|
1251
|
+
await generateTypes(cwd, system);
|
|
1252
|
+
await generatePrismaClient(cwd, system);
|
|
1253
|
+
|
|
1254
|
+
// TODO: remove, should be Prisma
|
|
1255
|
+
await fse.outputFile(join(cwd, 'migrations/migration_lock.toml'), `Please do not edit this file manually
|
|
1256
|
+
// # It should be added in your version-control system (i.e. Git)
|
|
1257
|
+
provider = ${system.config.db.provider}`);
|
|
1258
|
+
// TODO: remove, should be Prisma
|
|
1259
|
+
let deleteShadowDatabase = async () => {};
|
|
1260
|
+
let shadowDatabaseUrl = system.config.db.shadowDatabaseUrl;
|
|
1261
|
+
if (system.config.db.provider !== 'sqlite' && !shadowDatabaseUrl) {
|
|
1262
|
+
const parsedUrl = new URL(system.config.db.url);
|
|
1263
|
+
parsedUrl.pathname = `ktmp${Date.now()}_${randomBytes(6).toString('hex')}`;
|
|
1264
|
+
shadowDatabaseUrl = parsedUrl.toString();
|
|
1265
|
+
try {
|
|
1266
|
+
await createDatabase(shadowDatabaseUrl);
|
|
1267
|
+
} catch (err) {
|
|
1268
|
+
console.error(err);
|
|
1269
|
+
console.error(chalk.red('Failed to create shadow database, db.shadowDatabaseUrl may be required'));
|
|
1270
|
+
throw new ExitError(1);
|
|
1271
|
+
}
|
|
1272
|
+
deleteShadowDatabase = async () => {
|
|
1273
|
+
await dropDatabase(shadowDatabaseUrl);
|
|
1274
|
+
};
|
|
1275
|
+
}
|
|
1276
|
+
let sql;
|
|
1277
|
+
try {
|
|
1278
|
+
const paths = system.getPaths(cwd);
|
|
1279
|
+
const {
|
|
1280
|
+
output: summary,
|
|
1281
|
+
exitCode: prismaExitCode
|
|
1282
|
+
} = await spawnPrisma(cwd, system, ['migrate', 'diff', ...(shadowDatabaseUrl ? ['--shadow-database-url', shadowDatabaseUrl] : []), '--from-migrations', 'migrations/', '--to-schema-datamodel', paths.schema.prisma]);
|
|
1283
|
+
if (typeof prismaExitCode === 'number' && prismaExitCode !== 0) {
|
|
1284
|
+
console.error(summary);
|
|
1285
|
+
throw new ExitError(prismaExitCode);
|
|
1286
|
+
}
|
|
1287
|
+
if (summary.startsWith('No difference detected')) {
|
|
1288
|
+
log('🔄 Database unchanged from Prisma schema');
|
|
1289
|
+
throw new ExitError(0);
|
|
1290
|
+
}
|
|
1291
|
+
console.error(summary);
|
|
1292
|
+
const {
|
|
1293
|
+
output,
|
|
1294
|
+
exitCode: prismaExitCode2
|
|
1295
|
+
} = await spawnPrisma(cwd, system, ['migrate', 'diff', ...(shadowDatabaseUrl ? ['--shadow-database-url', shadowDatabaseUrl] : []), '--from-migrations', 'migrations/', '--to-schema-datamodel', paths.schema.prisma, '--script']);
|
|
1296
|
+
sql = output;
|
|
1297
|
+
if (typeof prismaExitCode2 === 'number' && prismaExitCode2 !== 0) {
|
|
1298
|
+
console.error(sql);
|
|
1299
|
+
throw new ExitError(prismaExitCode2);
|
|
1300
|
+
}
|
|
1301
|
+
} finally {
|
|
1302
|
+
await deleteShadowDatabase();
|
|
1303
|
+
}
|
|
1304
|
+
const prefix = new Date().toLocaleString('sv-SE').replace(/[^0-9]/g, '').slice(0, 14);
|
|
1305
|
+
|
|
1306
|
+
// https://github.com/prisma/prisma/blob/183c14d2aa6059fc3c00c95363887e8941b3d911/packages/migrate/src/utils/promptForMigrationName.ts#L12
|
|
1307
|
+
// Prisma truncates >200 characters
|
|
1308
|
+
const name = (await textPrompt('Name of migration')).replace(/[^A-Za-z0-9_]/g, '_').slice(0, 200);
|
|
1309
|
+
const path = join(`migrations`, `${prefix}_${name}/migration.sql`);
|
|
1310
|
+
await fse.outputFile(join(cwd, path), sql);
|
|
1311
|
+
log(`✨ Generated SQL migration at ${path}`);
|
|
1312
|
+
}
|
|
1313
|
+
async function migrateApply(cwd, {
|
|
1314
|
+
frozen,
|
|
1315
|
+
quiet
|
|
1316
|
+
}) {
|
|
1317
|
+
function log(message) {
|
|
1318
|
+
if (quiet) return;
|
|
1319
|
+
console.log(message);
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
// TODO: should this happen if frozen?
|
|
1323
|
+
await esbuild.build(await getEsbuildConfig(cwd));
|
|
1324
|
+
const system = createSystem(await importBuiltNixxieConfiguration(cwd));
|
|
1325
|
+
if (frozen) {
|
|
1326
|
+
await validateArtifacts(cwd, system);
|
|
1327
|
+
log('✨ GraphQL and Prisma schemas are up to date');
|
|
1328
|
+
} else {
|
|
1329
|
+
await generateArtifacts(cwd, system);
|
|
1330
|
+
log('✨ Generated GraphQL and Prisma schemas');
|
|
1331
|
+
}
|
|
1332
|
+
await generateTypes(cwd, system);
|
|
1333
|
+
await generatePrismaClient(cwd, system);
|
|
1334
|
+
log('✨ Applying any database migrations');
|
|
1335
|
+
const paths = system.getPaths(cwd);
|
|
1336
|
+
const {
|
|
1337
|
+
appliedMigrationNames
|
|
1338
|
+
} = await withMigrate(paths.schema.prisma, system, async m => {
|
|
1339
|
+
const diagnostic = await m.diagnostic();
|
|
1340
|
+
if (diagnostic.action.tag === 'reset') {
|
|
1341
|
+
console.error(diagnostic.action.reason);
|
|
1342
|
+
const consent = await confirmPrompt(`Do you want to continue? ${chalk.red('The database will be reset')}`);
|
|
1343
|
+
if (!consent) throw new ExitError(1, 'Database reset cancelled by user');
|
|
1344
|
+
await m.reset();
|
|
1345
|
+
}
|
|
1346
|
+
return await m.apply();
|
|
1347
|
+
});
|
|
1348
|
+
log(appliedMigrationNames.length === 0 ? `✨ No database migrations to apply` : `✨ Database migrated`);
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
async function spawnPrisma3(cwd, system, commands) {
|
|
1352
|
+
return new Promise((resolve, reject) => {
|
|
1353
|
+
const p = spawn('node', ['--title=prisma', require.resolve('prisma/build/index.js'), ...commands], {
|
|
1354
|
+
cwd,
|
|
1355
|
+
env: {
|
|
1356
|
+
...process.env,
|
|
1357
|
+
DATABASE_URL: system.config.db.url,
|
|
1358
|
+
PRISMA_HIDE_UPDATE_MESSAGE: '1'
|
|
1359
|
+
},
|
|
1360
|
+
stdio: 'inherit'
|
|
1361
|
+
});
|
|
1362
|
+
p.on('error', err => reject(err));
|
|
1363
|
+
p.on('exit', exitCode => resolve({
|
|
1364
|
+
exitCode
|
|
1365
|
+
}));
|
|
1366
|
+
});
|
|
1367
|
+
}
|
|
1368
|
+
async function prisma(cwd, args, frozen) {
|
|
1369
|
+
// TODO: should build unless --frozen?
|
|
1370
|
+
|
|
1371
|
+
const system = createSystem(await importBuiltNixxieConfiguration(cwd));
|
|
1372
|
+
await validateArtifacts(cwd, system);
|
|
1373
|
+
const {
|
|
1374
|
+
exitCode
|
|
1375
|
+
} = await spawnPrisma3(cwd, system, args);
|
|
1376
|
+
if (typeof exitCode === 'number' && exitCode !== 0) {
|
|
1377
|
+
throw new ExitError(exitCode);
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
async function start(cwd, {
|
|
1382
|
+
quiet,
|
|
1383
|
+
server,
|
|
1384
|
+
ui,
|
|
1385
|
+
withMigrations
|
|
1386
|
+
}) {
|
|
1387
|
+
var _system$config$ui;
|
|
1388
|
+
function log(message) {
|
|
1389
|
+
if (quiet) return;
|
|
1390
|
+
console.log(message);
|
|
1391
|
+
}
|
|
1392
|
+
log('✨ Starting Nixxie');
|
|
1393
|
+
const system = createSystem(await importBuiltNixxieConfiguration(cwd));
|
|
1394
|
+
const paths = system.getPaths(cwd);
|
|
1395
|
+
if (withMigrations) {
|
|
1396
|
+
log('✨ Applying any database migrations');
|
|
1397
|
+
const {
|
|
1398
|
+
appliedMigrationNames
|
|
1399
|
+
} = await withMigrate(paths.schema.prisma, system, m => m.apply());
|
|
1400
|
+
log(appliedMigrationNames.length === 0 ? `✨ No database migrations to apply` : `✨ Database migrated`);
|
|
1401
|
+
}
|
|
1402
|
+
if (!server) return;
|
|
1403
|
+
const prismaClient = require(paths.prisma);
|
|
1404
|
+
const nixxie = system.getNixxie(prismaClient);
|
|
1405
|
+
log('✨ Connecting to the database');
|
|
1406
|
+
await nixxie.connect();
|
|
1407
|
+
log('✨ Creating server');
|
|
1408
|
+
const {
|
|
1409
|
+
expressServer,
|
|
1410
|
+
httpServer
|
|
1411
|
+
} = await createExpressServer(system.config, nixxie.context);
|
|
1412
|
+
log(`✅ GraphQL API ready`);
|
|
1413
|
+
if (!((_system$config$ui = system.config.ui) !== null && _system$config$ui !== void 0 && _system$config$ui.isDisabled) && ui) {
|
|
1414
|
+
log('✨ Preparing Admin UI');
|
|
1415
|
+
const nextApp = next({
|
|
1416
|
+
dev: false,
|
|
1417
|
+
dir: paths.admin
|
|
1418
|
+
});
|
|
1419
|
+
await nextApp.prepare();
|
|
1420
|
+
expressServer.use(createAdminUIMiddlewareWithNextApp(system.config, nixxie.context, nextApp));
|
|
1421
|
+
log(`✅ Admin UI ready`);
|
|
1422
|
+
}
|
|
1423
|
+
const httpOptions = system.config.server.options;
|
|
1424
|
+
|
|
1425
|
+
// prefer env.PORT
|
|
1426
|
+
if ('PORT' in process.env) {
|
|
1427
|
+
httpOptions.port = parseInt(process.env.PORT || '');
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
// prefer env.HOST
|
|
1431
|
+
if ('HOST' in process.env) {
|
|
1432
|
+
httpOptions.host = process.env.HOST || '';
|
|
1433
|
+
}
|
|
1434
|
+
httpServer.listen(system.config.server.options, err => {
|
|
1435
|
+
if (err) throw err;
|
|
1436
|
+
const easyHost = [undefined, '', '::', '0.0.0.0'].includes(httpOptions.host) ? 'localhost' : httpOptions.host;
|
|
1437
|
+
log(`⭐️ Server listening on ${httpOptions.host || ''}:${httpOptions.port} (http://${easyHost}:${httpOptions.port}/)`);
|
|
1438
|
+
});
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
async function telemetry(_, command) {
|
|
1442
|
+
const usageText = `
|
|
1443
|
+
Usage
|
|
1444
|
+
$ nixxie telemetry [command]
|
|
1445
|
+
Commands
|
|
1446
|
+
disable opt-out of telemetry, disabling telemetry for this system user
|
|
1447
|
+
enable opt-in to telemetry
|
|
1448
|
+
reset resets your telemetry configuration (if any)
|
|
1449
|
+
status show if telemetry is enabled, disabled or uninitialised
|
|
1450
|
+
inform show an informed consent notice
|
|
1451
|
+
|
|
1452
|
+
For more details visit: https://nixxiecms.com/telemetry
|
|
1453
|
+
`;
|
|
1454
|
+
if (command === 'disable') return disableTelemetry();
|
|
1455
|
+
if (command === 'enable') return enableTelemetry();
|
|
1456
|
+
if (command === 'reset') return resetTelemetry();
|
|
1457
|
+
if (command === 'status') return statusTelemetry();
|
|
1458
|
+
if (command === 'inform') return informTelemetry();
|
|
1459
|
+
if (command === '--help') {
|
|
1460
|
+
console.error(`${bold('Nixxie Telemetry')}`);
|
|
1461
|
+
console.error(usageText);
|
|
1462
|
+
return;
|
|
1463
|
+
}
|
|
1464
|
+
console.error(command ? `Invalid option: ${command}` : '');
|
|
1465
|
+
console.error(usageText);
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
function defaultFlags(flags, defaults) {
|
|
1469
|
+
flags = {
|
|
1470
|
+
...defaults,
|
|
1471
|
+
...flags
|
|
1472
|
+
};
|
|
1473
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
1474
|
+
if (value !== undefined && !(key in defaults)) {
|
|
1475
|
+
// TODO: maybe we should prevent other flags?
|
|
1476
|
+
//throw new Error(`Option '${key}' is unsupported for this command`);
|
|
1477
|
+
continue;
|
|
1478
|
+
}
|
|
1479
|
+
const defaultValue = defaults[key];
|
|
1480
|
+
// should we default the flag?
|
|
1481
|
+
if (value === undefined) {
|
|
1482
|
+
flags[key] = defaultValue;
|
|
1483
|
+
}
|
|
1484
|
+
if (typeof value !== typeof defaultValue) {
|
|
1485
|
+
throw new Error(`Option '${key}' should be of type ${typeof defaultValue}`);
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
return flags;
|
|
1489
|
+
}
|
|
1490
|
+
async function cli(cwd, argv) {
|
|
1491
|
+
const {
|
|
1492
|
+
input,
|
|
1493
|
+
help,
|
|
1494
|
+
flags
|
|
1495
|
+
} = meow(`
|
|
1496
|
+
Usage
|
|
1497
|
+
$ nixxie [command] [options]
|
|
1498
|
+
|
|
1499
|
+
Commands
|
|
1500
|
+
dev start the project in development mode (default)
|
|
1501
|
+
migrate create build the project for development and create a migration from the Prisma diff
|
|
1502
|
+
migrate apply build the project for development and apply any pending migrations
|
|
1503
|
+
postinstall build the project for development
|
|
1504
|
+
build build the project (required by \`nixxie start\` and \`nixxie prisma\`)
|
|
1505
|
+
telemetry sets telemetry preference (enable/disable/status)
|
|
1506
|
+
|
|
1507
|
+
start start the project
|
|
1508
|
+
prisma use prisma commands in a Nixxie context
|
|
1509
|
+
|
|
1510
|
+
Options
|
|
1511
|
+
--frozen (build, migrate)
|
|
1512
|
+
don't build the graphql or prisma schemas, only validate them
|
|
1513
|
+
|
|
1514
|
+
--no-db-push (dev)
|
|
1515
|
+
don't push any updates of your Prisma schema to your database
|
|
1516
|
+
|
|
1517
|
+
--no-prisma (build, dev)
|
|
1518
|
+
don't build or validate the prisma schema
|
|
1519
|
+
|
|
1520
|
+
--no-server (dev, start)
|
|
1521
|
+
don't start the express server
|
|
1522
|
+
|
|
1523
|
+
--no-ui (build, dev, start)
|
|
1524
|
+
don't build and serve the AdminUI
|
|
1525
|
+
|
|
1526
|
+
--with-migrations (start)
|
|
1527
|
+
trigger prisma to run migrations as part of startup
|
|
1528
|
+
`, {
|
|
1529
|
+
argv
|
|
1530
|
+
});
|
|
1531
|
+
const command = input.join(' ') || 'dev';
|
|
1532
|
+
if (command === 'dev') {
|
|
1533
|
+
return dev(cwd, defaultFlags(flags, {
|
|
1534
|
+
dbPush: true,
|
|
1535
|
+
prisma: true,
|
|
1536
|
+
server: true,
|
|
1537
|
+
ui: true
|
|
1538
|
+
}));
|
|
1539
|
+
}
|
|
1540
|
+
if (command === 'migrate create') {
|
|
1541
|
+
return migrateCreate(cwd, defaultFlags(flags, {
|
|
1542
|
+
ui: false
|
|
1543
|
+
}));
|
|
1544
|
+
}
|
|
1545
|
+
if (command === 'migrate apply') {
|
|
1546
|
+
return migrateApply(cwd, defaultFlags(flags, {
|
|
1547
|
+
ui: false
|
|
1548
|
+
}));
|
|
1549
|
+
}
|
|
1550
|
+
if (command === 'build') {
|
|
1551
|
+
return build(cwd, defaultFlags(flags, {
|
|
1552
|
+
frozen: false,
|
|
1553
|
+
prisma: true,
|
|
1554
|
+
ui: true
|
|
1555
|
+
}));
|
|
1556
|
+
}
|
|
1557
|
+
if (command === 'start') {
|
|
1558
|
+
return start(cwd, defaultFlags(flags, {
|
|
1559
|
+
server: true,
|
|
1560
|
+
ui: true,
|
|
1561
|
+
withMigrations: false
|
|
1562
|
+
}));
|
|
1563
|
+
}
|
|
1564
|
+
if (command.startsWith('prisma')) {
|
|
1565
|
+
return prisma(cwd, argv.slice(1), Boolean(flags.frozen));
|
|
1566
|
+
}
|
|
1567
|
+
if (command.startsWith('telemetry')) {
|
|
1568
|
+
return telemetry(cwd, argv[1]);
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
// WARNING: postinstall is an alias for `build --frozen --no-ui`
|
|
1572
|
+
if (command === 'postinstall') {
|
|
1573
|
+
// uncomment when you need to update the schemas
|
|
1574
|
+
// return build(cwd, defaultFlags(flags, { frozen: false, prisma: true, ui: false }))
|
|
1575
|
+
return build(cwd, defaultFlags(flags, {
|
|
1576
|
+
frozen: true,
|
|
1577
|
+
prisma: true,
|
|
1578
|
+
ui: false
|
|
1579
|
+
}));
|
|
1580
|
+
}
|
|
1581
|
+
console.error(`${command} is an unknown command`);
|
|
1582
|
+
console.error(help);
|
|
1583
|
+
throw new ExitError(1);
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
export { cli };
|