@carlonicora/nextjs-jsonapi 1.4.0 → 1.6.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/README.md +208 -127
- package/dist/{ApiResponseInterface-DDI7QQPR.d.ts → ApiResponseInterface-CfcC7pPC.d.mts} +11 -2
- package/dist/{ApiResponseInterface-BHN5D9r5.d.mts → ApiResponseInterface-DTBJaV5R.d.ts} +11 -2
- package/dist/{BlockNoteEditor-QV6ESIQA.js → BlockNoteEditor-7FM7B737.js} +19 -24
- package/dist/BlockNoteEditor-7FM7B737.js.map +1 -0
- package/dist/{BlockNoteEditor-U2IHUVUF.mjs → BlockNoteEditor-RVL76ZAS.mjs} +11 -16
- package/dist/BlockNoteEditor-RVL76ZAS.mjs.map +1 -0
- package/dist/JsonApiRequest-KOKGVPBI.js +25 -0
- package/dist/{JsonApiRequest-UJ7FGIVI.js.map → JsonApiRequest-KOKGVPBI.js.map} +1 -1
- package/dist/{JsonApiRequest-6UR7DIAR.mjs → JsonApiRequest-VCCRO732.mjs} +2 -2
- package/dist/chunk-2Z56AS2S.js +2723 -0
- package/dist/chunk-2Z56AS2S.js.map +1 -0
- package/dist/{chunk-HTLEKZND.mjs → chunk-37NJZ2VD.mjs} +281 -1019
- package/dist/chunk-37NJZ2VD.mjs.map +1 -0
- package/dist/{chunk-2K3Q24UF.js → chunk-3ZPK4QOB.js} +24 -14
- package/dist/chunk-3ZPK4QOB.js.map +1 -0
- package/dist/chunk-AGWQ75PQ.js +142 -0
- package/dist/chunk-AGWQ75PQ.js.map +1 -0
- package/dist/{chunk-32HM6MDD.js → chunk-CSM6AIAP.js} +1 -1
- package/dist/{chunk-32HM6MDD.js.map → chunk-CSM6AIAP.js.map} +1 -1
- package/dist/{chunk-IKBA4AHN.mjs → chunk-F4Y3GZG4.mjs} +3 -3
- package/dist/{chunk-YF5XQZDR.mjs → chunk-F5UNXZ3J.mjs} +1 -1
- package/dist/chunk-F5UNXZ3J.mjs.map +1 -0
- package/dist/chunk-IGOWVLJH.mjs +142 -0
- package/dist/chunk-IGOWVLJH.mjs.map +1 -0
- package/dist/{chunk-HAG77QBV.mjs → chunk-K4W5QXL5.mjs} +1 -1
- package/dist/chunk-KFL5ZFM4.mjs +2723 -0
- package/dist/chunk-KFL5ZFM4.mjs.map +1 -0
- package/dist/{chunk-HR4H2FP7.mjs → chunk-KJ4ETLJB.mjs} +24 -14
- package/dist/chunk-KJ4ETLJB.mjs.map +1 -0
- package/dist/chunk-LOSPCUCF.js +637 -0
- package/dist/chunk-LOSPCUCF.js.map +1 -0
- package/dist/{chunk-E2HRC2OG.js → chunk-SVX7E6RR.js} +10360 -6256
- package/dist/chunk-SVX7E6RR.js.map +1 -0
- package/dist/{chunk-EFJEWLRL.js → chunk-YUO55Q5A.js} +1 -1
- package/dist/chunk-YUO55Q5A.js.map +1 -0
- package/dist/chunk-ZQTFZKLJ.mjs +12089 -0
- package/dist/chunk-ZQTFZKLJ.mjs.map +1 -0
- package/dist/{chunk-PMXG5WBC.js → chunk-ZUEEIQHW.js} +3 -3
- package/dist/{chunk-PMXG5WBC.js.map → chunk-ZUEEIQHW.js.map} +1 -1
- package/dist/client/index.d.mts +161 -11
- package/dist/client/index.d.ts +161 -11
- package/dist/client/index.js +74 -12
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +73 -11
- package/dist/components/index.d.mts +762 -73
- package/dist/components/index.d.ts +762 -73
- package/dist/components/index.js +465 -12
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +466 -13
- package/dist/config-B43zxEvn.d.mts +69 -0
- package/dist/config-D2OUrI_G.d.ts +69 -0
- package/dist/content.fields-Ck5lkQ5d.d.mts +47 -0
- package/dist/content.fields-Ck5lkQ5d.d.ts +47 -0
- package/dist/{content.interface-C_PGZMuy.d.ts → content.interface-Bs8a7uW6.d.mts} +2 -3
- package/dist/{content.interface-D_WS6CrB.d.mts → content.interface-UtsJ-mzs.d.ts} +2 -3
- package/dist/contexts/index.d.mts +13 -6
- package/dist/contexts/index.d.ts +13 -6
- package/dist/contexts/index.js +10 -12
- package/dist/contexts/index.js.map +1 -1
- package/dist/contexts/index.mjs +9 -11
- package/dist/core/index.d.mts +539 -8
- package/dist/core/index.d.ts +539 -8
- package/dist/core/index.js +104 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +105 -3
- package/dist/index.d.mts +131 -70
- package/dist/index.d.ts +131 -70
- package/dist/index.js +97 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +118 -28
- package/dist/notification.interface-BdcwkuQE.d.mts +228 -0
- package/dist/notification.interface-BdcwkuQE.d.ts +228 -0
- package/dist/request-GBLBPYFM.js +8 -0
- package/dist/request-GBLBPYFM.js.map +1 -0
- package/dist/request-XABCMU25.mjs +8 -0
- package/dist/{AbstractService-wLid8dB0.d.ts → s3.interface-D7ttGatc.d.ts} +36 -26
- package/dist/{AbstractService-BsY6W3Ej.d.mts → s3.interface-DlaMDRTn.d.mts} +36 -26
- package/dist/scripts/generate-web-module/generator.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/generator.js +8 -5
- package/dist/scripts/generate-web-module/generator.js.map +1 -1
- package/dist/scripts/generate-web-module/index.js +1 -1
- package/dist/scripts/generate-web-module/index.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/editor.template.js +8 -1
- package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -1
- package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts +4 -3
- package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/transformers/parent-detector.js +9 -3
- package/dist/scripts/generate-web-module/transformers/parent-detector.js.map +1 -1
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts +11 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +36 -9
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -1
- package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +2 -0
- package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +1 -0
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts +4 -3
- package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/utils/i18n-updater.js +9 -9
- package/dist/scripts/generate-web-module/utils/i18n-updater.js.map +1 -1
- package/dist/scripts/generate-web-module/validators/json-schema-validator.js +3 -3
- package/dist/scripts/generate-web-module/validators/json-schema-validator.js.map +1 -1
- package/dist/server/index.d.mts +299 -4
- package/dist/server/index.d.ts +299 -4
- package/dist/server/index.js +215 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +214 -4
- package/dist/server/index.mjs.map +1 -1
- package/dist/token-2UWQJY5T.js +8 -0
- package/dist/token-2UWQJY5T.js.map +1 -0
- package/dist/token-EOK3N45S.mjs +8 -0
- package/dist/{useSocket-DzMKRKCA.d.ts → useSocket-8vwK_R_c.d.ts} +1 -1
- package/dist/{useSocket-Cn7fB_B1.d.mts → useSocket-BWJUXuOl.d.mts} +1 -1
- package/package.json +12 -52
- package/scripts/generate-web-module/generator.ts +8 -5
- package/scripts/generate-web-module/index.ts +1 -1
- package/scripts/generate-web-module/templates/components/editor.template.ts +7 -2
- package/scripts/generate-web-module/transformers/parent-detector.ts +10 -3
- package/scripts/generate-web-module/transformers/relationship-resolver.ts +36 -9
- package/scripts/generate-web-module/types/json-schema.interface.ts +2 -0
- package/scripts/generate-web-module/types/template-data.interface.ts +1 -0
- package/scripts/generate-web-module/utils/i18n-updater.ts +9 -9
- package/scripts/generate-web-module/validators/json-schema-validator.ts +3 -3
- package/src/client/JsonApiClient.ts +248 -0
- package/src/client/config.ts +78 -0
- package/src/client/index.ts +6 -1
- package/src/components/containers/TabsContainer.tsx +1 -1
- package/src/components/editors/BlockNoteEditor.tsx +3 -1
- package/src/components/index.ts +4 -0
- package/src/components/navigations/Breadcrumb.tsx +1 -1
- package/src/components/navigations/Header.tsx +2 -2
- package/src/contexts/CommonContext.tsx +1 -1
- package/src/contexts/SocketContext.tsx +1 -1
- package/src/contexts/index.ts +3 -0
- package/src/core/abstracts/ClientAbstractService.ts +255 -0
- package/src/core/abstracts/ServerAbstractService.ts +180 -0
- package/src/core/abstracts/index.ts +2 -0
- package/src/core/index.ts +32 -3
- package/src/discord/config.ts +15 -0
- package/src/discord/index.ts +1 -0
- package/src/features/auth/components/details/LandingComponent.tsx +2 -2
- package/src/features/auth/components/forms/AcceptInvitation.tsx +1 -1
- package/src/features/auth/components/forms/ActivateAccount.tsx +1 -1
- package/src/features/auth/components/forms/Cookies.tsx +2 -1
- package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
- package/src/features/auth/components/forms/Login.tsx +1 -1
- package/src/features/auth/components/forms/Logout.tsx +1 -1
- package/src/features/auth/components/forms/RefreshUser.tsx +2 -1
- package/src/features/auth/components/forms/Register.tsx +1 -1
- package/src/features/auth/components/forms/ResetPassword.tsx +1 -1
- package/src/features/auth/data/auth.service.ts +1 -1
- package/src/features/auth/data/index.ts +0 -1
- package/src/features/auth/utils/AuthCookies.ts +1 -1
- package/src/features/company/components/forms/CompanyConfigurationEditor.tsx +4 -2
- package/src/features/company/components/forms/CompanyDeleter.tsx +2 -1
- package/src/features/company/components/forms/CompanyEditor.tsx +6 -3
- package/src/features/company/components/forms/CompanyLicense.tsx +4 -2
- package/src/features/company/components/lists/CompaniesList.tsx +2 -1
- package/src/features/company/data/index.ts +0 -1
- package/src/features/content/components/lists/ContentsListById.tsx +2 -1
- package/src/features/content/components/lists/RelevantContentsList.tsx +2 -1
- package/src/features/content/data/index.ts +0 -1
- package/src/features/feature/data/index.ts +0 -1
- package/src/features/notification/components/lists/NotificationsList.tsx +2 -1
- package/src/features/notification/contexts/NotificationContext.tsx +2 -1
- package/src/features/notification/data/index.ts +0 -1
- package/src/features/push/data/index.ts +0 -1
- package/src/features/role/components/forms/RemoveUserFromRole.tsx +4 -2
- package/src/features/role/components/forms/UserRoleAdd.tsx +2 -1
- package/src/features/role/components/lists/RolesList.tsx +2 -1
- package/src/features/role/components/lists/UserRolesList.tsx +2 -1
- package/src/features/role/data/index.ts +0 -1
- package/src/features/s3/data/index.ts +0 -1
- package/src/features/user/components/forms/RoleUserAdd.tsx +4 -2
- package/src/features/user/components/forms/UserDeleter.tsx +2 -1
- package/src/features/user/components/forms/UserEditor.tsx +6 -3
- package/src/features/user/components/forms/UserMultiSelect.tsx +2 -1
- package/src/features/user/components/forms/UserReactivator.tsx +2 -1
- package/src/features/user/components/forms/UserResentInvitationEmail.tsx +2 -1
- package/src/features/user/components/forms/UserSelector.tsx +2 -1
- package/src/features/user/components/lists/AdminUsersList.tsx +2 -1
- package/src/features/user/components/lists/CompanyUsersList.tsx +2 -1
- package/src/features/user/components/lists/RelevantUsersList.tsx +2 -1
- package/src/features/user/components/lists/RoleUsersList.tsx +2 -1
- package/src/features/user/components/lists/UsersListByContentIds.tsx +2 -1
- package/src/features/user/data/index.ts +0 -1
- package/src/features/user/hooks/useUserSearch.ts +2 -1
- package/src/features/user/index.ts +1 -0
- package/src/hooks/useDataListRetriever.ts +4 -4
- package/src/hooks/usePageTracker.ts +1 -1
- package/src/hooks/usePushNotifications.ts +3 -2
- package/src/hooks/useSocket.ts +1 -1
- package/src/index.ts +7 -2
- package/src/roles/config.ts +0 -15
- package/src/roles/index.ts +1 -9
- package/src/server/JsonApiServer.ts +249 -0
- package/src/server/cache.ts +1 -1
- package/src/server/index.ts +13 -0
- package/src/server/request.ts +32 -18
- package/src/server/token.ts +1 -1
- package/dist/ApiData-DPKNfY-9.d.mts +0 -10
- package/dist/ApiData-DPKNfY-9.d.ts +0 -10
- package/dist/ApiDataInterface-DPP8s46n.d.mts +0 -21
- package/dist/ApiDataInterface-DPP8s46n.d.ts +0 -21
- package/dist/BlockNoteEditor-QV6ESIQA.js.map +0 -1
- package/dist/BlockNoteEditor-U2IHUVUF.mjs.map +0 -1
- package/dist/JsonApiRequest-UJ7FGIVI.js +0 -25
- package/dist/atoms/index.d.mts +0 -12
- package/dist/atoms/index.d.ts +0 -12
- package/dist/atoms/index.js +0 -9
- package/dist/atoms/index.js.map +0 -1
- package/dist/atoms/index.mjs +0 -9
- package/dist/chunk-2K3Q24UF.js.map +0 -1
- package/dist/chunk-3FBCC4G3.js +0 -8
- package/dist/chunk-3FBCC4G3.js.map +0 -1
- package/dist/chunk-3UELCPIN.js +0 -46
- package/dist/chunk-3UELCPIN.js.map +0 -1
- package/dist/chunk-5IET37O4.js +0 -4210
- package/dist/chunk-5IET37O4.js.map +0 -1
- package/dist/chunk-AYHKQWHH.js +0 -68
- package/dist/chunk-AYHKQWHH.js.map +0 -1
- package/dist/chunk-DEYKTLA3.js +0 -1131
- package/dist/chunk-DEYKTLA3.js.map +0 -1
- package/dist/chunk-E2HRC2OG.js.map +0 -1
- package/dist/chunk-EFJEWLRL.js.map +0 -1
- package/dist/chunk-FMBQZAIP.mjs +0 -490
- package/dist/chunk-FMBQZAIP.mjs.map +0 -1
- package/dist/chunk-HR4H2FP7.mjs.map +0 -1
- package/dist/chunk-HTLEKZND.mjs.map +0 -1
- package/dist/chunk-JGFWIT2E.mjs +0 -1131
- package/dist/chunk-JGFWIT2E.mjs.map +0 -1
- package/dist/chunk-P2F54I7Q.mjs +0 -4210
- package/dist/chunk-P2F54I7Q.mjs.map +0 -1
- package/dist/chunk-PO5Q3H5I.js +0 -1375
- package/dist/chunk-PO5Q3H5I.js.map +0 -1
- package/dist/chunk-Q2N6SQYW.mjs +0 -8
- package/dist/chunk-Q2N6SQYW.mjs.map +0 -1
- package/dist/chunk-Q4FXESVT.js +0 -490
- package/dist/chunk-Q4FXESVT.js.map +0 -1
- package/dist/chunk-R2ONK22M.mjs +0 -7985
- package/dist/chunk-R2ONK22M.mjs.map +0 -1
- package/dist/chunk-SM63SZCP.mjs +0 -68
- package/dist/chunk-SM63SZCP.mjs.map +0 -1
- package/dist/chunk-SZZYEG3P.mjs +0 -46
- package/dist/chunk-SZZYEG3P.mjs.map +0 -1
- package/dist/chunk-YF5XQZDR.mjs.map +0 -1
- package/dist/config-BmnK65TD.d.mts +0 -35
- package/dist/config-BmnK65TD.d.ts +0 -35
- package/dist/config-DQeAo9Kf.d.mts +0 -49
- package/dist/config-DQeAo9Kf.d.ts +0 -49
- package/dist/content.fields-cHPdM8GJ.d.mts +0 -27
- package/dist/content.fields-cHPdM8GJ.d.ts +0 -27
- package/dist/d3.link.interface-ClC4Irqp.d.mts +0 -21
- package/dist/d3.link.interface-ClC4Irqp.d.ts +0 -21
- package/dist/features/index.d.mts +0 -476
- package/dist/features/index.d.ts +0 -476
- package/dist/features/index.js +0 -87
- package/dist/features/index.js.map +0 -1
- package/dist/features/index.mjs +0 -87
- package/dist/hooks/index.d.mts +0 -69
- package/dist/hooks/index.d.ts +0 -69
- package/dist/hooks/index.js +0 -56
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/index.mjs +0 -56
- package/dist/hooks/index.mjs.map +0 -1
- package/dist/interfaces/index.d.mts +0 -4
- package/dist/interfaces/index.d.ts +0 -4
- package/dist/interfaces/index.js +0 -2
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/index.mjs +0 -2
- package/dist/interfaces/index.mjs.map +0 -1
- package/dist/notification.interface-BBgMUdLR.d.mts +0 -14
- package/dist/notification.interface-gyvT-Z2F.d.ts +0 -14
- package/dist/permissions/index.d.mts +0 -41
- package/dist/permissions/index.d.ts +0 -41
- package/dist/permissions/index.js +0 -14
- package/dist/permissions/index.js.map +0 -1
- package/dist/permissions/index.mjs +0 -14
- package/dist/permissions/index.mjs.map +0 -1
- package/dist/request-7FE3LJLV.mjs +0 -9
- package/dist/request-7FE3LJLV.mjs.map +0 -1
- package/dist/request-QFS7NEIE.js +0 -9
- package/dist/request-QFS7NEIE.js.map +0 -1
- package/dist/roles/index.d.mts +0 -39
- package/dist/roles/index.d.ts +0 -39
- package/dist/roles/index.js +0 -18
- package/dist/roles/index.js.map +0 -1
- package/dist/roles/index.mjs +0 -18
- package/dist/roles/index.mjs.map +0 -1
- package/dist/shadcnui/index.d.mts +0 -698
- package/dist/shadcnui/index.d.ts +0 -698
- package/dist/shadcnui/index.js +0 -468
- package/dist/shadcnui/index.js.map +0 -1
- package/dist/shadcnui/index.mjs +0 -467
- package/dist/shadcnui/index.mjs.map +0 -1
- package/dist/token-IJSPOMW6.mjs +0 -9
- package/dist/token-IJSPOMW6.mjs.map +0 -1
- package/dist/token-UYE7CV6X.js +0 -9
- package/dist/token-UYE7CV6X.js.map +0 -1
- package/dist/types-B2QRyqyK.d.ts +0 -39
- package/dist/types-CgvNmxTd.d.mts +0 -39
- package/dist/types-t2PyXhDu.d.mts +0 -116
- package/dist/types-t2PyXhDu.d.ts +0 -116
- package/dist/user.interface-CAsTIbuQ.d.mts +0 -85
- package/dist/user.interface-CbWqMaaU.d.ts +0 -85
- package/dist/utils/index.d.mts +0 -224
- package/dist/utils/index.d.ts +0 -224
- package/dist/utils/index.js +0 -46
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/index.mjs +0 -46
- package/dist/utils/index.mjs.map +0 -1
- /package/dist/{JsonApiRequest-6UR7DIAR.mjs.map → JsonApiRequest-VCCRO732.mjs.map} +0 -0
- /package/dist/{chunk-IKBA4AHN.mjs.map → chunk-F4Y3GZG4.mjs.map} +0 -0
- /package/dist/{chunk-HAG77QBV.mjs.map → chunk-K4W5QXL5.mjs.map} +0 -0
- /package/dist/{atoms/index.mjs.map → request-XABCMU25.mjs.map} +0 -0
- /package/dist/{features/index.mjs.map → token-EOK3N45S.mjs.map} +0 -0
package/dist/server/index.mjs
CHANGED
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
import {
|
|
2
2
|
serverRequest
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-KJ4ETLJB.mjs";
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
AuthService,
|
|
6
|
+
CompanyService,
|
|
7
|
+
ContentService,
|
|
8
|
+
FeatureService,
|
|
9
|
+
NotificationService,
|
|
10
|
+
PushService,
|
|
11
|
+
RoleService,
|
|
12
|
+
S3Service,
|
|
13
|
+
UserService
|
|
14
|
+
} from "../chunk-37NJZ2VD.mjs";
|
|
15
|
+
import "../chunk-F4Y3GZG4.mjs";
|
|
7
16
|
import {
|
|
8
17
|
checkPermissionsFromServer
|
|
9
|
-
} from "../chunk-
|
|
18
|
+
} from "../chunk-K4W5QXL5.mjs";
|
|
19
|
+
import "../chunk-KFL5ZFM4.mjs";
|
|
20
|
+
import "../chunk-C7C7VY4F.mjs";
|
|
21
|
+
import {
|
|
22
|
+
JsonApiDataFactory,
|
|
23
|
+
translateResponse
|
|
24
|
+
} from "../chunk-RBIVEH2K.mjs";
|
|
25
|
+
import {
|
|
26
|
+
getServerToken
|
|
27
|
+
} from "../chunk-F5UNXZ3J.mjs";
|
|
28
|
+
import "../chunk-AUXK7QSA.mjs";
|
|
10
29
|
import {
|
|
11
30
|
__name
|
|
12
31
|
} from "../chunk-PAWJFY3S.mjs";
|
|
@@ -87,9 +106,200 @@ var ServerSession = class {
|
|
|
87
106
|
});
|
|
88
107
|
}
|
|
89
108
|
};
|
|
109
|
+
|
|
110
|
+
// src/server/JsonApiServer.ts
|
|
111
|
+
var _serverConfig = null;
|
|
112
|
+
function configureServerJsonApi(config) {
|
|
113
|
+
_serverConfig = config;
|
|
114
|
+
if (config.bootstrapper) {
|
|
115
|
+
config.bootstrapper();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
__name(configureServerJsonApi, "configureServerJsonApi");
|
|
119
|
+
function getServerApiUrl() {
|
|
120
|
+
if (_serverConfig?.apiUrl) {
|
|
121
|
+
return _serverConfig.apiUrl;
|
|
122
|
+
}
|
|
123
|
+
const envUrl = process.env.NEXT_PUBLIC_API_URL;
|
|
124
|
+
if (!envUrl) {
|
|
125
|
+
throw new Error("API URL not configured. Use configureServerJsonApi() or set NEXT_PUBLIC_API_URL environment variable.");
|
|
126
|
+
}
|
|
127
|
+
return envUrl;
|
|
128
|
+
}
|
|
129
|
+
__name(getServerApiUrl, "getServerApiUrl");
|
|
130
|
+
function getServerAppUrl() {
|
|
131
|
+
if (_serverConfig?.appUrl) {
|
|
132
|
+
return _serverConfig.appUrl;
|
|
133
|
+
}
|
|
134
|
+
const envUrl = process.env.NEXT_PUBLIC_ADDRESS;
|
|
135
|
+
if (!envUrl) {
|
|
136
|
+
throw new Error("App URL not configured. Use configureServerJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.");
|
|
137
|
+
}
|
|
138
|
+
return envUrl.trim().replace(/\/+$/, "");
|
|
139
|
+
}
|
|
140
|
+
__name(getServerAppUrl, "getServerAppUrl");
|
|
141
|
+
function getServerTrackablePages() {
|
|
142
|
+
return _serverConfig?.trackablePages ?? [];
|
|
143
|
+
}
|
|
144
|
+
__name(getServerTrackablePages, "getServerTrackablePages");
|
|
145
|
+
function runServerBootstrapper() {
|
|
146
|
+
if (_serverConfig?.bootstrapper) {
|
|
147
|
+
_serverConfig.bootstrapper();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
__name(runServerBootstrapper, "runServerBootstrapper");
|
|
151
|
+
function buildServerUrl(endpoint) {
|
|
152
|
+
const apiUrl = getServerApiUrl();
|
|
153
|
+
return endpoint.startsWith("http") ? endpoint : `${apiUrl}${endpoint}`;
|
|
154
|
+
}
|
|
155
|
+
__name(buildServerUrl, "buildServerUrl");
|
|
156
|
+
async function ServerJsonApiGet(params) {
|
|
157
|
+
runServerBootstrapper();
|
|
158
|
+
const token = await getServerToken();
|
|
159
|
+
const apiResponse = await serverRequest({
|
|
160
|
+
method: "GET",
|
|
161
|
+
url: buildServerUrl(params.endpoint),
|
|
162
|
+
token,
|
|
163
|
+
cache: params.classKey.cache,
|
|
164
|
+
companyId: params.companyId,
|
|
165
|
+
language: params.language,
|
|
166
|
+
additionalHeaders: _serverConfig?.additionalHeaders
|
|
167
|
+
});
|
|
168
|
+
return translateResponse({
|
|
169
|
+
classKey: params.classKey,
|
|
170
|
+
apiResponse,
|
|
171
|
+
companyId: params.companyId,
|
|
172
|
+
language: params.language,
|
|
173
|
+
paginationHandler: /* @__PURE__ */ __name(async (endpoint) => ServerJsonApiGet({
|
|
174
|
+
classKey: params.classKey,
|
|
175
|
+
endpoint,
|
|
176
|
+
companyId: params.companyId,
|
|
177
|
+
language: params.language
|
|
178
|
+
}), "paginationHandler")
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
__name(ServerJsonApiGet, "ServerJsonApiGet");
|
|
182
|
+
async function ServerJsonApiPost(params) {
|
|
183
|
+
runServerBootstrapper();
|
|
184
|
+
const token = await getServerToken();
|
|
185
|
+
let body = params.body;
|
|
186
|
+
if (!body) {
|
|
187
|
+
body = {};
|
|
188
|
+
} else if (params.overridesJsonApiCreation !== true) {
|
|
189
|
+
body = JsonApiDataFactory.create(params.classKey, body);
|
|
190
|
+
}
|
|
191
|
+
const apiResponse = await serverRequest({
|
|
192
|
+
method: "POST",
|
|
193
|
+
url: buildServerUrl(params.endpoint),
|
|
194
|
+
token,
|
|
195
|
+
body,
|
|
196
|
+
files: params.files,
|
|
197
|
+
companyId: params.companyId,
|
|
198
|
+
language: params.language,
|
|
199
|
+
additionalHeaders: _serverConfig?.additionalHeaders
|
|
200
|
+
});
|
|
201
|
+
return translateResponse({
|
|
202
|
+
classKey: params.responseType ?? params.classKey,
|
|
203
|
+
apiResponse,
|
|
204
|
+
companyId: params.companyId,
|
|
205
|
+
language: params.language
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
__name(ServerJsonApiPost, "ServerJsonApiPost");
|
|
209
|
+
async function ServerJsonApiPut(params) {
|
|
210
|
+
runServerBootstrapper();
|
|
211
|
+
const token = await getServerToken();
|
|
212
|
+
let body = params.body;
|
|
213
|
+
if (!body) {
|
|
214
|
+
body = {};
|
|
215
|
+
} else {
|
|
216
|
+
body = JsonApiDataFactory.create(params.classKey, body);
|
|
217
|
+
}
|
|
218
|
+
const apiResponse = await serverRequest({
|
|
219
|
+
method: "PUT",
|
|
220
|
+
url: buildServerUrl(params.endpoint),
|
|
221
|
+
token,
|
|
222
|
+
body,
|
|
223
|
+
files: params.files,
|
|
224
|
+
companyId: params.companyId,
|
|
225
|
+
language: params.language,
|
|
226
|
+
additionalHeaders: _serverConfig?.additionalHeaders
|
|
227
|
+
});
|
|
228
|
+
return translateResponse({
|
|
229
|
+
classKey: params.responseType ?? params.classKey,
|
|
230
|
+
apiResponse,
|
|
231
|
+
companyId: params.companyId,
|
|
232
|
+
language: params.language
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
__name(ServerJsonApiPut, "ServerJsonApiPut");
|
|
236
|
+
async function ServerJsonApiPatch(params) {
|
|
237
|
+
runServerBootstrapper();
|
|
238
|
+
const token = await getServerToken();
|
|
239
|
+
let body = params.body;
|
|
240
|
+
if (!body) {
|
|
241
|
+
body = {};
|
|
242
|
+
} else if (params.overridesJsonApiCreation !== true) {
|
|
243
|
+
body = JsonApiDataFactory.create(params.classKey, body);
|
|
244
|
+
}
|
|
245
|
+
const apiResponse = await serverRequest({
|
|
246
|
+
method: "PATCH",
|
|
247
|
+
url: buildServerUrl(params.endpoint),
|
|
248
|
+
token,
|
|
249
|
+
body,
|
|
250
|
+
files: params.files,
|
|
251
|
+
companyId: params.companyId,
|
|
252
|
+
language: params.language,
|
|
253
|
+
additionalHeaders: _serverConfig?.additionalHeaders
|
|
254
|
+
});
|
|
255
|
+
return translateResponse({
|
|
256
|
+
classKey: params.responseType ?? params.classKey,
|
|
257
|
+
apiResponse,
|
|
258
|
+
companyId: params.companyId,
|
|
259
|
+
language: params.language
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
__name(ServerJsonApiPatch, "ServerJsonApiPatch");
|
|
263
|
+
async function ServerJsonApiDelete(params) {
|
|
264
|
+
runServerBootstrapper();
|
|
265
|
+
const token = await getServerToken();
|
|
266
|
+
const apiResponse = await serverRequest({
|
|
267
|
+
method: "DELETE",
|
|
268
|
+
url: buildServerUrl(params.endpoint),
|
|
269
|
+
token,
|
|
270
|
+
companyId: params.companyId,
|
|
271
|
+
language: params.language,
|
|
272
|
+
additionalHeaders: _serverConfig?.additionalHeaders
|
|
273
|
+
});
|
|
274
|
+
return translateResponse({
|
|
275
|
+
classKey: params.responseType ?? params.classKey,
|
|
276
|
+
apiResponse,
|
|
277
|
+
companyId: params.companyId,
|
|
278
|
+
language: params.language
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
__name(ServerJsonApiDelete, "ServerJsonApiDelete");
|
|
90
282
|
export {
|
|
283
|
+
AuthService as ServerAuthService,
|
|
284
|
+
CompanyService as ServerCompanyService,
|
|
285
|
+
ContentService as ServerContentService,
|
|
286
|
+
FeatureService as ServerFeatureService,
|
|
287
|
+
ServerJsonApiDelete,
|
|
288
|
+
ServerJsonApiGet,
|
|
289
|
+
ServerJsonApiPatch,
|
|
290
|
+
ServerJsonApiPost,
|
|
291
|
+
ServerJsonApiPut,
|
|
292
|
+
NotificationService as ServerNotificationService,
|
|
293
|
+
PushService as ServerPushService,
|
|
294
|
+
RoleService as ServerRoleService,
|
|
295
|
+
S3Service as ServerS3Service,
|
|
91
296
|
ServerSession,
|
|
297
|
+
UserService as ServerUserService,
|
|
298
|
+
configureServerJsonApi,
|
|
299
|
+
getServerApiUrl,
|
|
300
|
+
getServerAppUrl,
|
|
92
301
|
getServerToken,
|
|
302
|
+
getServerTrackablePages,
|
|
93
303
|
invalidateCacheTag,
|
|
94
304
|
invalidateCacheTags,
|
|
95
305
|
serverRequest
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/cache.ts","../../src/server/ServerSession.ts"],"sourcesContent":["\"use server\";\n\nimport { revalidateTag } from \"next/cache\";\n\nexport type CacheProfile = \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"weeks\" | \"max\" | \"default\";\n\n/**\n * Revalidate a cache tag to invalidate cached data.\n * Next.js 16+ requires a profile parameter.\n *\n * @param tag - The cache tag to invalidate\n * @param profile - The cache profile (defaults to \"max\" for immediate invalidation)\n */\nexport async function invalidateCacheTag(tag: string, profile: CacheProfile = \"max\"): Promise<void> {\n revalidateTag(tag, profile);\n}\n\n/**\n * Revalidate multiple cache tags.\n *\n * @param tags - Array of cache tags to invalidate\n * @param profile - The cache profile (defaults to \"max\" for immediate invalidation)\n */\nexport async function invalidateCacheTags(tags: string[], profile: CacheProfile = \"max\"): Promise<void> {\n for (const tag of tags) {\n revalidateTag(tag, profile);\n }\n}\n","import { cookies } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport zlib from \"zlib\";\nimport { Action, checkPermissionsFromServer, ModuleWithPermissions } from \"../permissions\";\n\nexport class ServerSession {\n static async isLogged() {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"token\");\n\n if (!token || !token.value) return false;\n return true;\n }\n\n static async isLicenseActive(): Promise<boolean> {\n const cookieStore = await cookies();\n const licenseExpirationDate = cookieStore.get(\"licenseExpirationDate\")?.value;\n\n if (!licenseExpirationDate) return false;\n\n const now = new Date();\n return new Date(licenseExpirationDate) > now;\n }\n\n static async companyId() {\n const cookieStore = await cookies();\n return cookieStore.get(\"companyId\")?.value ?? \"\";\n }\n\n static async userId() {\n const cookieStore = await cookies();\n return cookieStore.get(\"userId\")?.value ?? \"\";\n }\n\n static async checkPermission<M extends ModuleWithPermissions>(params: { module: M; action: Action; data?: any }) {\n if (!(await this.hasPermissionToModule(params))) redirect(`/401`);\n }\n\n static async hasRole(roleId: string): Promise<boolean> {\n const cookieStore = await cookies();\n const roles = cookieStore.get(\"roles\")?.value;\n\n if (!roles || !roles.includes(roleId)) return false;\n\n return true;\n }\n\n static async hasFeature(featureId: string): Promise<boolean> {\n const cookieStore = await cookies();\n const features = cookieStore.get(\"features\")?.value;\n\n if (!features || !features.includes(featureId)) return false;\n\n return true;\n }\n\n static async hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }): Promise<boolean> {\n const cookieStore = await cookies();\n\n if (params.module.feature) {\n const features = cookieStore.get(\"features\")?.value;\n\n if (features && !features.includes(params.module.feature)) return false;\n }\n\n const rawModules = cookieStore.get(\"modules\")?.value;\n if (!rawModules) return false;\n\n const modules: {\n id: string;\n permissions: {\n create: boolean | string;\n read: boolean | string;\n update: boolean | string;\n delete: boolean | string;\n };\n }[] = JSON.parse(zlib.gunzipSync(Buffer.from(rawModules, \"base64\")).toString());\n\n const selectedModule = modules.find((module) => module.id === params.module.moduleId);\n\n return checkPermissionsFromServer({\n module: params.module,\n action: params.action,\n data: params.data,\n userId: await this.userId(),\n selectedModule: selectedModule,\n });\n\n // if (!selectedModule) return false;\n\n // if (!selectedModule.permissions[params.action]) return false;\n // if (typeof selectedModule.permissions[params.action] === \"boolean\")\n // return selectedModule.permissions[params.action] as boolean;\n\n // if (!params.data) return false;\n\n // return params.data[selectedModule.permissions[params.action] as string] === this.userId;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAEA,SAAS,qBAAqB;AAW9B,eAAsB,mBAAmB,KAAa,UAAwB,OAAsB;AAClG,gBAAc,KAAK,OAAO;AAC5B;AAFsB;AAUtB,eAAsB,oBAAoB,MAAgB,UAAwB,OAAsB;AACtG,aAAW,OAAO,MAAM;AACtB,kBAAc,KAAK,OAAO;AAAA,EAC5B;AACF;AAJsB;;;ACvBtB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,OAAO,UAAU;AAGV,IAAM,gBAAN,MAAoB;AAAA,EAL3B,OAK2B;AAAA;AAAA;AAAA,EACzB,aAAa,WAAW;AACtB,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,QAAQ,YAAY,IAAI,OAAO;AAErC,QAAI,CAAC,SAAS,CAAC,MAAM,MAAO,QAAO;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,kBAAoC;AAC/C,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,wBAAwB,YAAY,IAAI,uBAAuB,GAAG;AAExE,QAAI,CAAC,sBAAuB,QAAO;AAEnC,UAAM,MAAM,oBAAI,KAAK;AACrB,WAAO,IAAI,KAAK,qBAAqB,IAAI;AAAA,EAC3C;AAAA,EAEA,aAAa,YAAY;AACvB,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,WAAW,GAAG,SAAS;AAAA,EAChD;AAAA,EAEA,aAAa,SAAS;AACpB,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,QAAQ,GAAG,SAAS;AAAA,EAC7C;AAAA,EAEA,aAAa,gBAAiD,QAAmD;AAC/G,QAAI,CAAE,MAAM,KAAK,sBAAsB,MAAM,EAAI,UAAS,MAAM;AAAA,EAClE;AAAA,EAEA,aAAa,QAAQ,QAAkC;AACrD,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,QAAQ,YAAY,IAAI,OAAO,GAAG;AAExC,QAAI,CAAC,SAAS,CAAC,MAAM,SAAS,MAAM,EAAG,QAAO;AAE9C,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAW,WAAqC;AAC3D,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,WAAW,YAAY,IAAI,UAAU,GAAG;AAE9C,QAAI,CAAC,YAAY,CAAC,SAAS,SAAS,SAAS,EAAG,QAAO;AAEvD,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,sBAAuD,QAI/C;AACnB,UAAM,cAAc,MAAM,QAAQ;AAElC,QAAI,OAAO,OAAO,SAAS;AACzB,YAAM,WAAW,YAAY,IAAI,UAAU,GAAG;AAE9C,UAAI,YAAY,CAAC,SAAS,SAAS,OAAO,OAAO,OAAO,EAAG,QAAO;AAAA,IACpE;AAEA,UAAM,aAAa,YAAY,IAAI,SAAS,GAAG;AAC/C,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,UAQA,KAAK,MAAM,KAAK,WAAW,OAAO,KAAK,YAAY,QAAQ,CAAC,EAAE,SAAS,CAAC;AAE9E,UAAM,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,OAAO,QAAQ;AAEpF,WAAO,2BAA2B;AAAA,MAChC,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,QAAQ,MAAM,KAAK,OAAO;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EAWH;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/cache.ts","../../src/server/ServerSession.ts","../../src/server/JsonApiServer.ts"],"sourcesContent":["// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { revalidateTag } from \"next/cache\";\n\nexport type CacheProfile = \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"weeks\" | \"max\" | \"default\";\n\n/**\n * Revalidate a cache tag to invalidate cached data.\n * Next.js 16+ requires a profile parameter.\n *\n * @param tag - The cache tag to invalidate\n * @param profile - The cache profile (defaults to \"max\" for immediate invalidation)\n */\nexport async function invalidateCacheTag(tag: string, profile: CacheProfile = \"max\"): Promise<void> {\n revalidateTag(tag, profile);\n}\n\n/**\n * Revalidate multiple cache tags.\n *\n * @param tags - Array of cache tags to invalidate\n * @param profile - The cache profile (defaults to \"max\" for immediate invalidation)\n */\nexport async function invalidateCacheTags(tags: string[], profile: CacheProfile = \"max\"): Promise<void> {\n for (const tag of tags) {\n revalidateTag(tag, profile);\n }\n}\n","import { cookies } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport zlib from \"zlib\";\nimport { Action, checkPermissionsFromServer, ModuleWithPermissions } from \"../permissions\";\n\nexport class ServerSession {\n static async isLogged() {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"token\");\n\n if (!token || !token.value) return false;\n return true;\n }\n\n static async isLicenseActive(): Promise<boolean> {\n const cookieStore = await cookies();\n const licenseExpirationDate = cookieStore.get(\"licenseExpirationDate\")?.value;\n\n if (!licenseExpirationDate) return false;\n\n const now = new Date();\n return new Date(licenseExpirationDate) > now;\n }\n\n static async companyId() {\n const cookieStore = await cookies();\n return cookieStore.get(\"companyId\")?.value ?? \"\";\n }\n\n static async userId() {\n const cookieStore = await cookies();\n return cookieStore.get(\"userId\")?.value ?? \"\";\n }\n\n static async checkPermission<M extends ModuleWithPermissions>(params: { module: M; action: Action; data?: any }) {\n if (!(await this.hasPermissionToModule(params))) redirect(`/401`);\n }\n\n static async hasRole(roleId: string): Promise<boolean> {\n const cookieStore = await cookies();\n const roles = cookieStore.get(\"roles\")?.value;\n\n if (!roles || !roles.includes(roleId)) return false;\n\n return true;\n }\n\n static async hasFeature(featureId: string): Promise<boolean> {\n const cookieStore = await cookies();\n const features = cookieStore.get(\"features\")?.value;\n\n if (!features || !features.includes(featureId)) return false;\n\n return true;\n }\n\n static async hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }): Promise<boolean> {\n const cookieStore = await cookies();\n\n if (params.module.feature) {\n const features = cookieStore.get(\"features\")?.value;\n\n if (features && !features.includes(params.module.feature)) return false;\n }\n\n const rawModules = cookieStore.get(\"modules\")?.value;\n if (!rawModules) return false;\n\n const modules: {\n id: string;\n permissions: {\n create: boolean | string;\n read: boolean | string;\n update: boolean | string;\n delete: boolean | string;\n };\n }[] = JSON.parse(zlib.gunzipSync(Buffer.from(rawModules, \"base64\")).toString());\n\n const selectedModule = modules.find((module) => module.id === params.module.moduleId);\n\n return checkPermissionsFromServer({\n module: params.module,\n action: params.action,\n data: params.data,\n userId: await this.userId(),\n selectedModule: selectedModule,\n });\n\n // if (!selectedModule) return false;\n\n // if (!selectedModule.permissions[params.action]) return false;\n // if (typeof selectedModule.permissions[params.action] === \"boolean\")\n // return selectedModule.permissions[params.action] as boolean;\n\n // if (!params.data) return false;\n\n // return params.data[selectedModule.permissions[params.action] as string] === this.userId;\n }\n}\n","// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { serverRequest } from \"./request\";\nimport { getServerToken } from \"./token\";\n\n// Config storage for server contexts\nlet _serverConfig: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API server client.\n * Call this in your Bootstrapper or server initialization.\n */\nexport function configureServerJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _serverConfig = config;\n if (config.bootstrapper) {\n config.bootstrapper();\n }\n}\n\nexport function getServerApiUrl(): string {\n if (_serverConfig?.apiUrl) {\n return _serverConfig.apiUrl;\n }\n const envUrl = process.env.NEXT_PUBLIC_API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureServerJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nexport function getServerAppUrl(): string {\n if (_serverConfig?.appUrl) {\n return _serverConfig.appUrl;\n }\n const envUrl = process.env.NEXT_PUBLIC_ADDRESS;\n if (!envUrl) {\n throw new Error(\"App URL not configured. Use configureServerJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\");\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getServerTrackablePages(): ModuleWithPermissions[] {\n return _serverConfig?.trackablePages ?? [];\n}\n\nfunction runServerBootstrapper(): void {\n if (_serverConfig?.bootstrapper) {\n _serverConfig.bootstrapper();\n }\n}\n\nfunction buildServerUrl(endpoint: string): string {\n const apiUrl = getServerApiUrl();\n return endpoint.startsWith(\"http\") ? endpoint : `${apiUrl}${endpoint}`;\n}\n\nexport async function ServerJsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\n\n const apiResponse = await serverRequest({\n method: \"GET\",\n url: buildServerUrl(params.endpoint),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n ServerJsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n }),\n });\n}\n\nexport async function ServerJsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await serverRequest({\n method: \"POST\",\n url: buildServerUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function ServerJsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await serverRequest({\n method: \"PUT\",\n url: buildServerUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function ServerJsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await serverRequest({\n method: \"PATCH\",\n url: buildServerUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function ServerJsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\n\n const apiResponse = await serverRequest({\n method: \"DELETE\",\n url: buildServerUrl(params.endpoint),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkYUO55Q5Ajs = require('./chunk-YUO55Q5A.js');
|
|
4
|
+
require('./chunk-7QVYU63E.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken;
|
|
8
|
+
//# sourceMappingURL=token-2UWQJY5T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/token-2UWQJY5T.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,yDAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/token-2UWQJY5T.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@carlonicora/nextjs-jsonapi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Next.js JSON:API client with server/client support and caching",
|
|
5
5
|
"author": "Carlo Nicora",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -17,16 +17,21 @@
|
|
|
17
17
|
"import": "./dist/index.mjs",
|
|
18
18
|
"require": "./dist/index.js"
|
|
19
19
|
},
|
|
20
|
-
"./atoms": {
|
|
21
|
-
"types": "./dist/atoms/index.d.ts",
|
|
22
|
-
"import": "./dist/atoms/index.mjs",
|
|
23
|
-
"require": "./dist/atoms/index.js"
|
|
24
|
-
},
|
|
25
20
|
"./core": {
|
|
26
21
|
"types": "./dist/core/index.d.ts",
|
|
27
22
|
"import": "./dist/core/index.mjs",
|
|
28
23
|
"require": "./dist/core/index.js"
|
|
29
24
|
},
|
|
25
|
+
"./server": {
|
|
26
|
+
"types": "./dist/server/index.d.ts",
|
|
27
|
+
"import": "./dist/server/index.mjs",
|
|
28
|
+
"require": "./dist/server/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./client": {
|
|
31
|
+
"types": "./dist/client/index.d.ts",
|
|
32
|
+
"import": "./dist/client/index.mjs",
|
|
33
|
+
"require": "./dist/client/index.js"
|
|
34
|
+
},
|
|
30
35
|
"./components": {
|
|
31
36
|
"types": "./dist/components/index.d.ts",
|
|
32
37
|
"import": "./dist/components/index.mjs",
|
|
@@ -36,55 +41,10 @@
|
|
|
36
41
|
"types": "./dist/contexts/index.d.ts",
|
|
37
42
|
"import": "./dist/contexts/index.mjs",
|
|
38
43
|
"require": "./dist/contexts/index.js"
|
|
39
|
-
},
|
|
40
|
-
"./client": {
|
|
41
|
-
"types": "./dist/client/index.d.ts",
|
|
42
|
-
"import": "./dist/client/index.mjs",
|
|
43
|
-
"require": "./dist/client/index.js"
|
|
44
|
-
},
|
|
45
|
-
"./server": {
|
|
46
|
-
"types": "./dist/server/index.d.ts",
|
|
47
|
-
"import": "./dist/server/index.mjs",
|
|
48
|
-
"require": "./dist/server/index.js"
|
|
49
|
-
},
|
|
50
|
-
"./permissions": {
|
|
51
|
-
"types": "./dist/permissions/index.d.ts",
|
|
52
|
-
"import": "./dist/permissions/index.mjs",
|
|
53
|
-
"require": "./dist/permissions/index.js"
|
|
54
|
-
},
|
|
55
|
-
"./utils": {
|
|
56
|
-
"types": "./dist/utils/index.d.ts",
|
|
57
|
-
"import": "./dist/utils/index.mjs",
|
|
58
|
-
"require": "./dist/utils/index.js"
|
|
59
|
-
},
|
|
60
|
-
"./interfaces": {
|
|
61
|
-
"types": "./dist/interfaces/index.d.ts",
|
|
62
|
-
"import": "./dist/interfaces/index.mjs",
|
|
63
|
-
"require": "./dist/interfaces/index.js"
|
|
64
|
-
},
|
|
65
|
-
"./shadcnui": {
|
|
66
|
-
"types": "./dist/shadcnui/index.d.ts",
|
|
67
|
-
"import": "./dist/shadcnui/index.mjs",
|
|
68
|
-
"require": "./dist/shadcnui/index.js"
|
|
69
|
-
},
|
|
70
|
-
"./hooks": {
|
|
71
|
-
"types": "./dist/hooks/index.d.ts",
|
|
72
|
-
"import": "./dist/hooks/index.mjs",
|
|
73
|
-
"require": "./dist/hooks/index.js"
|
|
74
|
-
},
|
|
75
|
-
"./features": {
|
|
76
|
-
"types": "./dist/features/index.d.ts",
|
|
77
|
-
"import": "./dist/features/index.mjs",
|
|
78
|
-
"require": "./dist/features/index.js"
|
|
79
|
-
},
|
|
80
|
-
"./roles": {
|
|
81
|
-
"types": "./dist/roles/index.d.ts",
|
|
82
|
-
"import": "./dist/roles/index.mjs",
|
|
83
|
-
"require": "./dist/roles/index.js"
|
|
84
44
|
}
|
|
85
45
|
},
|
|
86
46
|
"scripts": {
|
|
87
|
-
"build": "tsup && tsc -p scripts/generate-web-module/tsconfig.json",
|
|
47
|
+
"build": "NODE_OPTIONS='--max-old-space-size=8192' tsup && tsc -p scripts/generate-web-module/tsconfig.json",
|
|
88
48
|
"dev": "tsup --watch",
|
|
89
49
|
"clean": "rm -rf dist",
|
|
90
50
|
"lint": "eslint \"src/**/*.ts\" --fix",
|
|
@@ -108,11 +108,14 @@ export async function generateWebModule(options: GenerateWebModuleOptions): Prom
|
|
|
108
108
|
console.log(` ${bootstrapResult.success ? "✅" : "❌"} ${bootstrapResult.message}`);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
// Step 7: Update i18n (unless --no-register)
|
|
111
|
+
// Step 7: Update i18n for all languages (unless --no-register)
|
|
112
112
|
if (!noRegister) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
const languages = schema.languages || ["en"];
|
|
114
|
+
console.log(`\n🌐 Updating i18n for ${languages.length} language(s)...`);
|
|
115
|
+
for (const language of languages) {
|
|
116
|
+
const i18nResult = updateI18n(templateData, webBasePath, language, dryRun);
|
|
117
|
+
console.log(` ${i18nResult.success ? "✅" : "❌"} ${i18nResult.message}`);
|
|
118
|
+
}
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
console.log("\n✅ Generation complete!");
|
|
@@ -131,7 +134,7 @@ export async function generateWebModule(options: GenerateWebModuleOptions): Prom
|
|
|
131
134
|
function buildTemplateData(schema: JsonModuleDefinition): FrontendTemplateData {
|
|
132
135
|
const names = transformNames(schema.moduleName, schema.endpointName);
|
|
133
136
|
const targetDir = schema.targetDir as "features" | "foundations";
|
|
134
|
-
const extendsContent = detectExtendsContent(schema.fields);
|
|
137
|
+
const extendsContent = detectExtendsContent(schema.fields, schema.extendsContent);
|
|
135
138
|
|
|
136
139
|
// Map fields
|
|
137
140
|
const allFields = mapFields(schema.fields, names.camelCase);
|
|
@@ -26,7 +26,7 @@ program
|
|
|
26
26
|
.argument("<json-path>", "Path to JSON schema file (relative or absolute)")
|
|
27
27
|
.option("-d, --dry-run", "Preview files without writing them", false)
|
|
28
28
|
.option("-f, --force", "Overwrite existing files", false)
|
|
29
|
-
.option("-n, --no-register", "Skip Bootstrapper.ts and i18n updates"
|
|
29
|
+
.option("-n, --no-register", "Skip Bootstrapper.ts and i18n updates")
|
|
30
30
|
.action(async (jsonPath: string, options: { dryRun: boolean; force: boolean; register: boolean }) => {
|
|
31
31
|
// Resolve path
|
|
32
32
|
const resolvedPath = path.isAbsolute(jsonPath) ? jsonPath : path.resolve(process.cwd(), jsonPath);
|
|
@@ -8,7 +8,7 @@ import { FrontendTemplateData, FrontendField, FrontendRelationship } from "../..
|
|
|
8
8
|
import { toCamelCase, pluralize, toPascalCase } from "../../transformers/name-transformer";
|
|
9
9
|
import { AUTHOR_VARIANT } from "../../types/field-mapping.types";
|
|
10
10
|
import { getFormFieldJsx } from "../../transformers/field-mapper";
|
|
11
|
-
import { getRelationshipFormJsx, getDefaultValueExpression, getPayloadMapping } from "../../transformers/relationship-resolver";
|
|
11
|
+
import { getRelationshipFormJsx, getDefaultValueExpression, getPayloadMapping, isFoundationImport, FOUNDATION_PACKAGE } from "../../transformers/relationship-resolver";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Generate the editor component file content
|
|
@@ -154,7 +154,12 @@ function generateImports(data: FrontendTemplateData): string {
|
|
|
154
154
|
imports.push(`import { UserInterface } from "@/features/foundations/user/data/UserInterface";`);
|
|
155
155
|
} else {
|
|
156
156
|
const componentName = rel.single ? `${rel.name}Selector` : `${rel.name}MultiSelector`;
|
|
157
|
-
|
|
157
|
+
if (rel.isFoundation) {
|
|
158
|
+
// Foundation entities use named imports from the package
|
|
159
|
+
imports.push(`import { ${componentName} } from "${FOUNDATION_PACKAGE}";`);
|
|
160
|
+
} else {
|
|
161
|
+
imports.push(`import ${componentName} from "${rel.importPath}";`);
|
|
162
|
+
}
|
|
158
163
|
}
|
|
159
164
|
});
|
|
160
165
|
|
|
@@ -2,19 +2,26 @@
|
|
|
2
2
|
* Parent Class Detector
|
|
3
3
|
*
|
|
4
4
|
* Determines whether a module should extend Content or AbstractApiData
|
|
5
|
-
* based on the presence of Content-specific fields.
|
|
5
|
+
* based on the presence of Content-specific fields or explicit configuration.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { JsonFieldDefinition } from "../types/json-schema.interface";
|
|
9
9
|
import { CONTENT_INDICATOR_FIELDS } from "../types/field-mapping.types";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Check if a module should extend Content
|
|
12
|
+
* Check if a module should extend Content
|
|
13
13
|
*
|
|
14
14
|
* @param fields - Array of field definitions from JSON schema
|
|
15
|
+
* @param explicitValue - Optional explicit value from JSON schema
|
|
15
16
|
* @returns true if the module should extend Content
|
|
16
17
|
*/
|
|
17
|
-
export function detectExtendsContent(fields: JsonFieldDefinition[]): boolean {
|
|
18
|
+
export function detectExtendsContent(fields: JsonFieldDefinition[], explicitValue?: boolean): boolean {
|
|
19
|
+
// If explicitly set in JSON schema, use that value
|
|
20
|
+
if (explicitValue !== undefined) {
|
|
21
|
+
return explicitValue;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Otherwise, auto-detect based on fields
|
|
18
25
|
const fieldNames = fields.map((f) => f.name);
|
|
19
26
|
return CONTENT_INDICATOR_FIELDS.some((indicator) => fieldNames.includes(indicator));
|
|
20
27
|
}
|
|
@@ -10,6 +10,21 @@ import { FrontendRelationship, RelationshipServiceMethod } from "../types/templa
|
|
|
10
10
|
import { AUTHOR_VARIANT, AUTHOR_ZOD_SCHEMA, ENTITY_ZOD_SCHEMA } from "../types/field-mapping.types";
|
|
11
11
|
import { toCamelCase, toKebabCase, pluralize, toPascalCase } from "./name-transformer";
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Foundation package name constant for web imports
|
|
15
|
+
*/
|
|
16
|
+
export const FOUNDATION_PACKAGE = "@carlonicora/nextjs-jsonapi/features";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Check if a directory represents a foundation import (from the package)
|
|
20
|
+
*
|
|
21
|
+
* @param directory - The directory string from relationship definition
|
|
22
|
+
* @returns True if this should import from the foundation package
|
|
23
|
+
*/
|
|
24
|
+
export function isFoundationImport(directory: string): boolean {
|
|
25
|
+
return directory === "@foundation" || directory.startsWith("@foundation/");
|
|
26
|
+
}
|
|
27
|
+
|
|
13
28
|
/**
|
|
14
29
|
* Resolve a JSON relationship to frontend representation
|
|
15
30
|
*
|
|
@@ -56,11 +71,23 @@ export function resolveRelationship(rel: JsonRelationshipDefinition): FrontendRe
|
|
|
56
71
|
zodSchema = rel.nullable ? `z.array(${ENTITY_ZOD_SCHEMA}).optional()` : `z.array(${ENTITY_ZOD_SCHEMA})`;
|
|
57
72
|
}
|
|
58
73
|
|
|
59
|
-
// Import paths -
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
74
|
+
// Import paths - check for foundation imports
|
|
75
|
+
let importPath: string;
|
|
76
|
+
let interfaceImportPath: string;
|
|
77
|
+
let serviceImportPath: string;
|
|
78
|
+
|
|
79
|
+
if (isFoundationImport(rel.directory)) {
|
|
80
|
+
// Foundation entities import from the package
|
|
81
|
+
importPath = FOUNDATION_PACKAGE;
|
|
82
|
+
interfaceImportPath = FOUNDATION_PACKAGE;
|
|
83
|
+
serviceImportPath = FOUNDATION_PACKAGE;
|
|
84
|
+
} else {
|
|
85
|
+
// Feature entities use local paths
|
|
86
|
+
const webDirectory = mapDirectoryToWebPath(rel.directory);
|
|
87
|
+
importPath = `@/features/${webDirectory}/${modelKebab}/components/forms/${selectorComponent}`;
|
|
88
|
+
interfaceImportPath = `@/features/${webDirectory}/${modelKebab}/data/${rel.name}Interface`;
|
|
89
|
+
serviceImportPath = `@/features/${webDirectory}/${modelKebab}/data/${rel.name}Service`;
|
|
90
|
+
}
|
|
64
91
|
|
|
65
92
|
return {
|
|
66
93
|
name: rel.name,
|
|
@@ -68,6 +95,7 @@ export function resolveRelationship(rel: JsonRelationshipDefinition): FrontendRe
|
|
|
68
95
|
directory: rel.directory,
|
|
69
96
|
single: rel.single,
|
|
70
97
|
nullable: rel.nullable,
|
|
98
|
+
isFoundation: isFoundationImport(rel.directory),
|
|
71
99
|
formFieldId,
|
|
72
100
|
formFieldIdPlural,
|
|
73
101
|
payloadFieldId,
|
|
@@ -131,10 +159,9 @@ export function getSelectorImports(relationships: FrontendRelationship[]): strin
|
|
|
131
159
|
const imports = new Set<string>();
|
|
132
160
|
|
|
133
161
|
relationships.forEach((rel) => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
imports.add(`import { UserSelector } from "@/features/foundations/user/components/forms/UserSelector";`);
|
|
162
|
+
if (isFoundationImport(rel.directory)) {
|
|
163
|
+
// Foundation entities use named imports from the package
|
|
164
|
+
imports.add(`import { ${rel.selectorComponent} } from "${FOUNDATION_PACKAGE}";`);
|
|
138
165
|
} else {
|
|
139
166
|
imports.add(`import ${rel.selectorComponent} from "${rel.importPath}";`);
|
|
140
167
|
}
|
|
@@ -39,4 +39,6 @@ export interface JsonModuleDefinition {
|
|
|
39
39
|
languages: string[];
|
|
40
40
|
fields: JsonFieldDefinition[];
|
|
41
41
|
relationships: JsonRelationshipDefinition[];
|
|
42
|
+
/** Explicitly set whether this module extends Content. If not set, auto-detects based on fields. */
|
|
43
|
+
extendsContent?: boolean;
|
|
42
44
|
}
|
|
@@ -46,6 +46,7 @@ export interface FrontendRelationship {
|
|
|
46
46
|
directory: string; // e.g., "foundations"
|
|
47
47
|
single: boolean;
|
|
48
48
|
nullable: boolean;
|
|
49
|
+
isFoundation: boolean; // true if importing from @carlonicora/nextjs-jsonapi/features
|
|
49
50
|
// Derived properties
|
|
50
51
|
formFieldId: string; // e.g., "author" (lowercase variant) or "user"
|
|
51
52
|
formFieldIdPlural: string; // e.g., "topics" for multi-select
|