@carlonicora/nextjs-jsonapi 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +889 -0
  2. package/dist/AbstractService-BKlpJA61.d.mts +109 -0
  3. package/dist/AbstractService-D9eSVKNa.d.ts +109 -0
  4. package/dist/ApiData-DPKNfY-9.d.mts +10 -0
  5. package/dist/ApiData-DPKNfY-9.d.ts +10 -0
  6. package/dist/ApiDataInterface-DPP8s46n.d.mts +21 -0
  7. package/dist/ApiDataInterface-DPP8s46n.d.ts +21 -0
  8. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.mts +20 -0
  9. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.ts +20 -0
  10. package/dist/ApiResponseInterface-BHN5D9r5.d.mts +16 -0
  11. package/dist/ApiResponseInterface-DDI7QQPR.d.ts +16 -0
  12. package/dist/BlockNoteEditor-UVO3VZZE.mjs +396 -0
  13. package/dist/BlockNoteEditor-UVO3VZZE.mjs.map +1 -0
  14. package/dist/BlockNoteEditor-VFWG6LXI.js +396 -0
  15. package/dist/BlockNoteEditor-VFWG6LXI.js.map +1 -0
  16. package/dist/JsonApiRequest-S3ICLM7B.mjs +20 -0
  17. package/dist/JsonApiRequest-S3ICLM7B.mjs.map +1 -0
  18. package/dist/JsonApiRequest-ZZLSP26T.js +20 -0
  19. package/dist/JsonApiRequest-ZZLSP26T.js.map +1 -0
  20. package/dist/atoms/index.d.mts +12 -0
  21. package/dist/atoms/index.d.ts +12 -0
  22. package/dist/atoms/index.js +9 -0
  23. package/dist/atoms/index.js.map +1 -0
  24. package/dist/atoms/index.mjs +9 -0
  25. package/dist/atoms/index.mjs.map +1 -0
  26. package/dist/breadcrumb.item.data.interface-CgB4_1EE.d.mts +6 -0
  27. package/dist/breadcrumb.item.data.interface-CgB4_1EE.d.ts +6 -0
  28. package/dist/chunk-2K3Q24UF.js +89 -0
  29. package/dist/chunk-2K3Q24UF.js.map +1 -0
  30. package/dist/chunk-2LM6LCJW.mjs +1091 -0
  31. package/dist/chunk-2LM6LCJW.mjs.map +1 -0
  32. package/dist/chunk-366S2JCC.mjs +31 -0
  33. package/dist/chunk-366S2JCC.mjs.map +1 -0
  34. package/dist/chunk-3FBCC4G3.js +8 -0
  35. package/dist/chunk-3FBCC4G3.js.map +1 -0
  36. package/dist/chunk-4HCRAOS5.js +28 -0
  37. package/dist/chunk-4HCRAOS5.js.map +1 -0
  38. package/dist/chunk-5W6AKZE6.mjs +131 -0
  39. package/dist/chunk-5W6AKZE6.mjs.map +1 -0
  40. package/dist/chunk-6GKHCVF6.js +98 -0
  41. package/dist/chunk-6GKHCVF6.js.map +1 -0
  42. package/dist/chunk-7QVYU63E.js +7 -0
  43. package/dist/chunk-7QVYU63E.js.map +1 -0
  44. package/dist/chunk-A3J3AAYM.mjs +97 -0
  45. package/dist/chunk-A3J3AAYM.mjs.map +1 -0
  46. package/dist/chunk-A5DDIABK.js +4209 -0
  47. package/dist/chunk-A5DDIABK.js.map +1 -0
  48. package/dist/chunk-AUXK7QSA.mjs +15 -0
  49. package/dist/chunk-AUXK7QSA.mjs.map +1 -0
  50. package/dist/chunk-AWONBQQP.js +97 -0
  51. package/dist/chunk-AWONBQQP.js.map +1 -0
  52. package/dist/chunk-BLWVZK6J.mjs +28 -0
  53. package/dist/chunk-BLWVZK6J.mjs.map +1 -0
  54. package/dist/chunk-C7C7VY4F.mjs +77 -0
  55. package/dist/chunk-C7C7VY4F.mjs.map +1 -0
  56. package/dist/chunk-CXQOWQSY.js +55 -0
  57. package/dist/chunk-CXQOWQSY.js.map +1 -0
  58. package/dist/chunk-DD3KISNB.mjs +98 -0
  59. package/dist/chunk-DD3KISNB.mjs.map +1 -0
  60. package/dist/chunk-DKKMWBP4.mjs +1 -0
  61. package/dist/chunk-DKKMWBP4.mjs.map +1 -0
  62. package/dist/chunk-DO2HLAZO.js +48 -0
  63. package/dist/chunk-DO2HLAZO.js.map +1 -0
  64. package/dist/chunk-DZXDB3K2.mjs +17 -0
  65. package/dist/chunk-DZXDB3K2.mjs.map +1 -0
  66. package/dist/chunk-ECDTZBYO.mjs +230 -0
  67. package/dist/chunk-ECDTZBYO.mjs.map +1 -0
  68. package/dist/chunk-EFJEWLRL.js +16 -0
  69. package/dist/chunk-EFJEWLRL.js.map +1 -0
  70. package/dist/chunk-FY4SXJGU.js +806 -0
  71. package/dist/chunk-FY4SXJGU.js.map +1 -0
  72. package/dist/chunk-GYWPEPOH.mjs +1354 -0
  73. package/dist/chunk-GYWPEPOH.mjs.map +1 -0
  74. package/dist/chunk-H6FMOA6B.js +1 -0
  75. package/dist/chunk-H6FMOA6B.js.map +1 -0
  76. package/dist/chunk-HR4H2FP7.mjs +89 -0
  77. package/dist/chunk-HR4H2FP7.mjs.map +1 -0
  78. package/dist/chunk-I2REI7OA.js +462 -0
  79. package/dist/chunk-I2REI7OA.js.map +1 -0
  80. package/dist/chunk-IBS6NI7D.js +77 -0
  81. package/dist/chunk-IBS6NI7D.js.map +1 -0
  82. package/dist/chunk-IWFGEPAA.mjs +4209 -0
  83. package/dist/chunk-IWFGEPAA.mjs.map +1 -0
  84. package/dist/chunk-J4Q36PMP.js +31 -0
  85. package/dist/chunk-J4Q36PMP.js.map +1 -0
  86. package/dist/chunk-JC3WJK65.js +1091 -0
  87. package/dist/chunk-JC3WJK65.js.map +1 -0
  88. package/dist/chunk-L6EQEAXU.mjs +462 -0
  89. package/dist/chunk-L6EQEAXU.mjs.map +1 -0
  90. package/dist/chunk-LXKSUWAV.js +15 -0
  91. package/dist/chunk-LXKSUWAV.js.map +1 -0
  92. package/dist/chunk-MFO27OHB.mjs +48 -0
  93. package/dist/chunk-MFO27OHB.mjs.map +1 -0
  94. package/dist/chunk-PAWJFY3S.mjs +7 -0
  95. package/dist/chunk-PAWJFY3S.mjs.map +1 -0
  96. package/dist/chunk-Q2N6SQYW.mjs +8 -0
  97. package/dist/chunk-Q2N6SQYW.mjs.map +1 -0
  98. package/dist/chunk-RAF7PNLG.js +131 -0
  99. package/dist/chunk-RAF7PNLG.js.map +1 -0
  100. package/dist/chunk-RUR22SVM.js +17 -0
  101. package/dist/chunk-RUR22SVM.js.map +1 -0
  102. package/dist/chunk-TEGF6ZWG.js +109 -0
  103. package/dist/chunk-TEGF6ZWG.js.map +1 -0
  104. package/dist/chunk-TMVHSY3Y.js +230 -0
  105. package/dist/chunk-TMVHSY3Y.js.map +1 -0
  106. package/dist/chunk-V2JJPI7N.js +1354 -0
  107. package/dist/chunk-V2JJPI7N.js.map +1 -0
  108. package/dist/chunk-WWWMJZEF.mjs +806 -0
  109. package/dist/chunk-WWWMJZEF.mjs.map +1 -0
  110. package/dist/chunk-X4BIHJ2B.mjs +55 -0
  111. package/dist/chunk-X4BIHJ2B.mjs.map +1 -0
  112. package/dist/chunk-YDVTFM7X.mjs +109 -0
  113. package/dist/chunk-YDVTFM7X.mjs.map +1 -0
  114. package/dist/chunk-YF5XQZDR.mjs +16 -0
  115. package/dist/chunk-YF5XQZDR.mjs.map +1 -0
  116. package/dist/client/index.d.mts +252 -0
  117. package/dist/client/index.d.ts +252 -0
  118. package/dist/client/index.js +275 -0
  119. package/dist/client/index.js.map +1 -0
  120. package/dist/client/index.mjs +274 -0
  121. package/dist/client/index.mjs.map +1 -0
  122. package/dist/components/index.d.mts +441 -0
  123. package/dist/components/index.d.ts +441 -0
  124. package/dist/components/index.js +2474 -0
  125. package/dist/components/index.js.map +1 -0
  126. package/dist/components/index.mjs +2474 -0
  127. package/dist/components/index.mjs.map +1 -0
  128. package/dist/config-hXufftVS.d.mts +34 -0
  129. package/dist/config-hXufftVS.d.ts +34 -0
  130. package/dist/content.interface-BhyAiOFq.d.ts +35 -0
  131. package/dist/content.interface-Dg2lt_An.d.mts +35 -0
  132. package/dist/contexts/index.d.mts +56 -0
  133. package/dist/contexts/index.d.ts +56 -0
  134. package/dist/contexts/index.js +21 -0
  135. package/dist/contexts/index.js.map +1 -0
  136. package/dist/contexts/index.mjs +21 -0
  137. package/dist/contexts/index.mjs.map +1 -0
  138. package/dist/core/index.d.mts +152 -0
  139. package/dist/core/index.d.ts +152 -0
  140. package/dist/core/index.js +47 -0
  141. package/dist/core/index.js.map +1 -0
  142. package/dist/core/index.mjs +47 -0
  143. package/dist/core/index.mjs.map +1 -0
  144. package/dist/d3.link.interface-QMdB22bC.d.mts +20 -0
  145. package/dist/d3.link.interface-QMdB22bC.d.ts +20 -0
  146. package/dist/features/index.d.mts +553 -0
  147. package/dist/features/index.d.ts +553 -0
  148. package/dist/features/index.js +94 -0
  149. package/dist/features/index.js.map +1 -0
  150. package/dist/features/index.mjs +94 -0
  151. package/dist/features/index.mjs.map +1 -0
  152. package/dist/hooks/index.d.mts +94 -0
  153. package/dist/hooks/index.d.ts +94 -0
  154. package/dist/hooks/index.js +43 -0
  155. package/dist/hooks/index.js.map +1 -0
  156. package/dist/hooks/index.mjs +43 -0
  157. package/dist/hooks/index.mjs.map +1 -0
  158. package/dist/index.d.mts +72 -0
  159. package/dist/index.d.ts +72 -0
  160. package/dist/index.js +84 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/index.mjs +84 -0
  163. package/dist/index.mjs.map +1 -0
  164. package/dist/interfaces/index.d.mts +3 -0
  165. package/dist/interfaces/index.d.ts +3 -0
  166. package/dist/interfaces/index.js +2 -0
  167. package/dist/interfaces/index.js.map +1 -0
  168. package/dist/interfaces/index.mjs +2 -0
  169. package/dist/interfaces/index.mjs.map +1 -0
  170. package/dist/permissions/index.d.mts +41 -0
  171. package/dist/permissions/index.d.ts +41 -0
  172. package/dist/permissions/index.js +14 -0
  173. package/dist/permissions/index.js.map +1 -0
  174. package/dist/permissions/index.mjs +14 -0
  175. package/dist/permissions/index.mjs.map +1 -0
  176. package/dist/request-7FE3LJLV.mjs +9 -0
  177. package/dist/request-7FE3LJLV.mjs.map +1 -0
  178. package/dist/request-FYMQK5CX.mjs +9 -0
  179. package/dist/request-FYMQK5CX.mjs.map +1 -0
  180. package/dist/request-QFS7NEIE.js +9 -0
  181. package/dist/request-QFS7NEIE.js.map +1 -0
  182. package/dist/request-ZYY6RI5X.js +9 -0
  183. package/dist/request-ZYY6RI5X.js.map +1 -0
  184. package/dist/roles/index.d.mts +33 -0
  185. package/dist/roles/index.d.ts +33 -0
  186. package/dist/roles/index.js +12 -0
  187. package/dist/roles/index.js.map +1 -0
  188. package/dist/roles/index.mjs +12 -0
  189. package/dist/roles/index.mjs.map +1 -0
  190. package/dist/server/index.d.mts +44 -0
  191. package/dist/server/index.d.ts +44 -0
  192. package/dist/server/index.js +29 -0
  193. package/dist/server/index.js.map +1 -0
  194. package/dist/server/index.mjs +29 -0
  195. package/dist/server/index.mjs.map +1 -0
  196. package/dist/shadcnui/index.d.mts +698 -0
  197. package/dist/shadcnui/index.d.ts +698 -0
  198. package/dist/shadcnui/index.js +466 -0
  199. package/dist/shadcnui/index.js.map +1 -0
  200. package/dist/shadcnui/index.mjs +465 -0
  201. package/dist/shadcnui/index.mjs.map +1 -0
  202. package/dist/token-IJSPOMW6.mjs +9 -0
  203. package/dist/token-IJSPOMW6.mjs.map +1 -0
  204. package/dist/token-MJMC26ON.js +9 -0
  205. package/dist/token-MJMC26ON.js.map +1 -0
  206. package/dist/token-UADJQ7VC.mjs +9 -0
  207. package/dist/token-UADJQ7VC.mjs.map +1 -0
  208. package/dist/token-UYE7CV6X.js +9 -0
  209. package/dist/token-UYE7CV6X.js.map +1 -0
  210. package/dist/types-DluCaP1I.d.ts +95 -0
  211. package/dist/types-lQVA8d_P.d.mts +95 -0
  212. package/dist/useDataListRetriever-futhx3OP.d.mts +32 -0
  213. package/dist/useDataListRetriever-futhx3OP.d.ts +32 -0
  214. package/dist/user.interface-CAsTIbuQ.d.mts +85 -0
  215. package/dist/user.interface-CbWqMaaU.d.ts +85 -0
  216. package/dist/utils/index.d.mts +201 -0
  217. package/dist/utils/index.d.ts +201 -0
  218. package/dist/utils/index.js +32 -0
  219. package/dist/utils/index.js.map +1 -0
  220. package/dist/utils/index.mjs +32 -0
  221. package/dist/utils/index.mjs.map +1 -0
  222. package/package.json +205 -0
@@ -0,0 +1,15 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-PAWJFY3S.mjs";
4
+
5
+ // src/client/token.ts
6
+ import { getCookie } from "cookies-next";
7
+ async function getClientToken() {
8
+ return await getCookie("token");
9
+ }
10
+ __name(getClientToken, "getClientToken");
11
+
12
+ export {
13
+ getClientToken
14
+ };
15
+ //# sourceMappingURL=chunk-AUXK7QSA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/token.ts"],"sourcesContent":["\"use client\";\n\nimport { getCookie } from \"cookies-next\";\n\n/**\n * Get the authentication token from cookies (client-side only)\n */\nexport async function getClientToken(): Promise<string | undefined> {\n return await getCookie(\"token\");\n}\n"],"mappings":";;;;;AAEA,SAAS,iBAAiB;AAK1B,eAAsB,iBAA8C;AAClE,SAAO,MAAM,UAAU,OAAO;AAChC;AAFsB;","names":[]}
@@ -0,0 +1,97 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+ var _chunkA5DDIABKjs = require('./chunk-A5DDIABK.js');
10
+
11
+
12
+ var _chunkJC3WJK65js = require('./chunk-JC3WJK65.js');
13
+
14
+
15
+ var _chunkFY4SXJGUjs = require('./chunk-FY4SXJGU.js');
16
+
17
+
18
+ var _chunkI2REI7OAjs = require('./chunk-I2REI7OA.js');
19
+
20
+
21
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
22
+
23
+ // src/features/user/components/widgets/UserAvatar.tsx
24
+ var _jsxruntime = require('react/jsx-runtime');
25
+ function UserAvatar({ user, className, showFull, showLink }) {
26
+ const generateUrl = _chunkFY4SXJGUjs.usePageUrlGenerator.call(void 0, );
27
+ const getInitial = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (param) => {
28
+ if (!param) return "";
29
+ return param[0].toUpperCase();
30
+ }, "getInitial");
31
+ const getInitials = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (name) => {
32
+ const words = name.split(" ");
33
+ const initials = words.length > 1 ? getInitial(words[0][0]) + getInitial(words[words.length - 1][0]) : getInitial(words[0][0]);
34
+ return _nullishCoalesce(initials, () => ( ""));
35
+ }, "getInitials");
36
+ const getAvatar = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => {
37
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "*:ring-border *:ring-1", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkA5DDIABKjs.Avatar, { className: `h-6 w-6 ${className}`, children: [
38
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkA5DDIABKjs.AvatarImage, { className: "object-cover", src: _optionalChain([user, 'optionalAccess', _ => _.avatar]) }),
39
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkA5DDIABKjs.AvatarFallback, { children: getInitials(user.name) })
40
+ ] }) });
41
+ }, "getAvatar");
42
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkA5DDIABKjs.Tooltip, { children: [
43
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkA5DDIABKjs.TooltipTrigger, { asChild: true, children: showLink === false ? (
44
+ // If showLink is explicitly false, never show a link
45
+ showFull ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkJC3WJK65js.cn.call(void 0, `mb-2 flex w-full flex-row items-center justify-start gap-x-2 text-sm`, className), children: [
46
+ getAvatar(),
47
+ user.name
48
+ ] }) : getAvatar()
49
+ ) : showFull ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
50
+ _chunkA5DDIABKjs.Link,
51
+ {
52
+ href: generateUrl({ page: _chunkI2REI7OAjs.Modules.User, id: user.id }),
53
+ className: _chunkJC3WJK65js.cn.call(void 0, `mb-2 flex w-full flex-row items-center justify-start gap-x-2 text-sm`, className),
54
+ onClick: (e) => e.stopPropagation(),
55
+ children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-row items-center gap-x-2", children: [
56
+ getAvatar(),
57
+ user.name
58
+ ] })
59
+ }
60
+ ) : showLink ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkA5DDIABKjs.Link, { href: generateUrl({ page: _chunkI2REI7OAjs.Modules.User, id: user.id }), className, children: getAvatar() }) : getAvatar() }),
61
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkA5DDIABKjs.TooltipContent, { children: user.name })
62
+ ] });
63
+ }
64
+ _chunk7QVYU63Ejs.__name.call(void 0, UserAvatar, "UserAvatar");
65
+
66
+ // src/features/user/components/lists/ContributorsList.tsx
67
+
68
+ function ContributorsList({ content }) {
69
+ const generateUrl = _chunkFY4SXJGUjs.usePageUrlGenerator.call(void 0, );
70
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-row items-center", children: [
71
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
72
+ _chunkA5DDIABKjs.Link,
73
+ {
74
+ href: generateUrl({ page: _chunkI2REI7OAjs.Modules.User, id: content.author.id }),
75
+ onClick: (e) => e.stopPropagation(),
76
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserAvatar, { user: content.author, className: "mr-1 h-6 w-6" })
77
+ },
78
+ content.author.id
79
+ ),
80
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-row-reverse justify-end -space-x-1 space-x-reverse", children: content.editors.filter((editor) => editor.id !== content.author.id).map((editor) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
81
+ _chunkA5DDIABKjs.Link,
82
+ {
83
+ href: generateUrl({ page: _chunkI2REI7OAjs.Modules.User, id: editor.id }),
84
+ onClick: (e) => e.stopPropagation(),
85
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserAvatar, { user: editor, className: "h-5 w-5" })
86
+ },
87
+ editor.id
88
+ )) })
89
+ ] });
90
+ }
91
+ _chunk7QVYU63Ejs.__name.call(void 0, ContributorsList, "ContributorsList");
92
+
93
+
94
+
95
+
96
+ exports.UserAvatar = UserAvatar; exports.ContributorsList = ContributorsList;
97
+ //# sourceMappingURL=chunk-AWONBQQP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-AWONBQQP.js","../src/features/user/components/widgets/UserAvatar.tsx","../src/features/user/components/lists/ContributorsList.tsx"],"names":["jsx"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACoBQ,+CAAA;AAnBD,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,SAAS,CAAA,EAAoB;AACnF,EAAA,MAAM,YAAA,EAAc,kDAAA,CAAoB;AAExC,EAAA,MAAM,WAAA,kBAAa,qCAAA,CAAC,KAAA,EAAA,GAAmB;AACrC,IAAA,GAAA,CAAI,CAAC,KAAA,EAAO,OAAO,EAAA;AACnB,IAAA,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,CAAY,CAAA;AAAA,EAC9B,CAAA,EAHmB,YAAA,CAAA;AAKnB,EAAA,MAAM,YAAA,kBAAc,qCAAA,CAAC,IAAA,EAAA,GAAiB;AACpC,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,SAAA,EACJ,KAAA,CAAM,OAAA,EAAS,EAAA,EAAI,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAA,EAAI,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA,CAAE,CAAC,CAAC,EAAA,EAAI,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAE9G,IAAA,wBAAO,QAAA,UAAY,IAAA;AAAA,EACrB,CAAA,EANoB,aAAA,CAAA;AAQpB,EAAA,MAAM,UAAA,kBAAY,qCAAA,CAAA,EAAA,GAAM;AACtB,IAAA,uBACE,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,kBAAA,8BAAA,uBAAC,EAAA,EAAO,SAAA,EAAW,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA;AACoB,sBAAA;AACjB,sBAAA;AAE5C,IAAA;AAPc,EAAA;AAad,EAAA;AACgB,oBAAA;AAAA;AAIP,MAAA;AAAU,QAAA;AACL,QAAA;AAGE,MAAA;AAGZ,IAAA;AAAC,MAAA;AAAA,MAAA;AACsD,QAAA;AAC0C,QAAA;AAC7D,QAAA;AAG/B,QAAA;AAAU,UAAA;AACL,UAAA;AACR,QAAA;AAAA,MAAA;AAOF,IAAA;AAGuB,oBAAA;AAC7B,EAAA;AAEJ;AA9DgB;ADyCsI;AACA;AEhDlJ;AAJiE;AAC3B,EAAA;AAIpC,EAAA;AAAAA,oBAAAA;AAAC,MAAA;AAAA,MAAA;AAEgE,QAAA;AAC7B,QAAA;AAEyB,QAAA;AAAA,MAAA;AAJvC,MAAA;AAKtB,IAAA;AAGa,oBAAA;AAEN,MAAA;AAAA,MAAA;AAEwD,QAAA;AACrB,QAAA;AAEY,QAAA;AAAA,MAAA;AAJlC,MAAA;AAOpB,IAAA;AACF,EAAA;AAEJ;AA3BgB;AF8EsI;AACA;AACA;AACA;AACA","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-AWONBQQP.js","sourcesContent":[null,"\"use client\";\n\nimport { Modules } from \"../../../../core\";\nimport { usePageUrlGenerator } from \"../../../../hooks\";\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Link,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../../../../shadcnui\";\nimport { cn } from \"../../../../utils\";\nimport { UserInterface } from \"../../data\";\n\ntype UserAvatarProps = {\n user: UserInterface;\n className?: string;\n showFull?: boolean;\n showLink?: boolean;\n};\n\nexport function UserAvatar({ user, className, showFull, showLink }: UserAvatarProps) {\n const generateUrl = usePageUrlGenerator();\n\n const getInitial = (param?: string) => {\n if (!param) return \"\";\n return param[0].toUpperCase();\n };\n\n const getInitials = (name: string) => {\n const words = name.split(\" \");\n const initials =\n words.length > 1 ? getInitial(words[0][0]) + getInitial(words[words.length - 1][0]) : getInitial(words[0][0]);\n\n return initials ?? \"\";\n };\n\n const getAvatar = () => {\n return (\n <div className=\"*:ring-border *:ring-1\">\n <Avatar className={`h-6 w-6 ${className}`}>\n <AvatarImage className=\"object-cover\" src={user?.avatar} />\n <AvatarFallback>{getInitials(user.name)}</AvatarFallback>\n </Avatar>\n </div>\n );\n };\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {showLink === false ? (\n // If showLink is explicitly false, never show a link\n showFull ? (\n <div className={cn(`mb-2 flex w-full flex-row items-center justify-start gap-x-2 text-sm`, className)}>\n {getAvatar()}\n {user.name}\n </div>\n ) : (\n getAvatar()\n )\n ) : showFull ? (\n <Link\n href={generateUrl({ page: Modules.User, id: user.id })}\n className={cn(`mb-2 flex w-full flex-row items-center justify-start gap-x-2 text-sm`, className)}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex w-full flex-row items-center gap-x-2\">\n {getAvatar()}\n {user.name}\n </div>\n </Link>\n ) : showLink ? (\n <Link href={generateUrl({ page: Modules.User, id: user.id })} className={className}>\n {getAvatar()}\n </Link>\n ) : (\n getAvatar()\n )}\n </TooltipTrigger>\n <TooltipContent>{user.name}</TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport { Modules } from \"../../../../core\";\nimport { usePageUrlGenerator } from \"../../../../hooks\";\nimport { Link } from \"../../../../shadcnui\";\nimport { ContentInterface } from \"../../../content\";\nimport { UserInterface } from \"../../data\";\nimport { UserAvatar } from \"../widgets\";\n\ntype ContributorsListProps = {\n content: ContentInterface;\n};\n\nexport function ContributorsList({ content }: ContributorsListProps) {\n const generateUrl = usePageUrlGenerator();\n\n return (\n <div className=\"flex flex-row items-center\">\n <Link\n key={content.author.id}\n href={generateUrl({ page: Modules.User, id: content.author.id })}\n onClick={(e) => e.stopPropagation()}\n >\n <UserAvatar user={content.author} className=\"mr-1 h-6 w-6\" />\n </Link>\n <div className=\"flex flex-row-reverse justify-end -space-x-1 space-x-reverse\">\n {content.editors\n .filter((editor: UserInterface) => editor.id !== content.author.id)\n .map((editor: UserInterface) => (\n <Link\n key={editor.id}\n href={generateUrl({ page: Modules.User, id: editor.id })}\n onClick={(e) => e.stopPropagation()}\n >\n <UserAvatar user={editor} className=\"h-5 w-5\" />\n </Link>\n ))}\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-PAWJFY3S.mjs";
4
+
5
+ // src/roles/config.ts
6
+ var _roleId = null;
7
+ function configureRoles(roleId) {
8
+ _roleId = roleId;
9
+ }
10
+ __name(configureRoles, "configureRoles");
11
+ function getRoleId() {
12
+ if (!_roleId) {
13
+ throw new Error("Roles not configured. Call configureRoles() at app startup.");
14
+ }
15
+ return _roleId;
16
+ }
17
+ __name(getRoleId, "getRoleId");
18
+ function isRolesConfigured() {
19
+ return _roleId !== null;
20
+ }
21
+ __name(isRolesConfigured, "isRolesConfigured");
22
+
23
+ export {
24
+ configureRoles,
25
+ getRoleId,
26
+ isRolesConfigured
27
+ };
28
+ //# sourceMappingURL=chunk-BLWVZK6J.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/roles/config.ts"],"sourcesContent":["/**\n * Role ID configuration interface\n * Apps provide their role IDs via configureRoles()\n */\nexport interface RoleIdConfig {\n Administrator: string;\n CompanyAdministrator: string;\n [key: string]: string; // Allow additional roles\n}\n\n// Private storage for the injected role IDs\nlet _roleId: RoleIdConfig | null = null;\n\n/**\n * Configure role IDs for the library\n * Call this at app startup to provide role ID constants\n *\n * @example\n * ```typescript\n * import { configureRoles } from \"@carlonicora/nextjs-jsonapi\";\n * import { RoleId } from \"@phlow/shared\";\n *\n * configureRoles(RoleId);\n * ```\n */\nexport function configureRoles(roleId: RoleIdConfig): void {\n _roleId = roleId;\n}\n\n/**\n * Get configured role IDs\n * @throws Error if roles not configured\n */\nexport function getRoleId(): RoleIdConfig {\n if (!_roleId) {\n throw new Error(\"Roles not configured. Call configureRoles() at app startup.\");\n }\n return _roleId;\n}\n\n/**\n * Check if roles have been configured\n */\nexport function isRolesConfigured(): boolean {\n return _roleId !== null;\n}\n"],"mappings":";;;;;AAWA,IAAI,UAA+B;AAc5B,SAAS,eAAe,QAA4B;AACzD,YAAU;AACZ;AAFgB;AAQT,SAAS,YAA0B;AACxC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,SAAO;AACT;AALgB;AAUT,SAAS,oBAA6B;AAC3C,SAAO,YAAY;AACrB;AAFgB;","names":[]}
@@ -0,0 +1,77 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-PAWJFY3S.mjs";
4
+
5
+ // src/client/request.ts
6
+ async function directFetch(params) {
7
+ const response = {
8
+ data: void 0,
9
+ ok: false,
10
+ status: 0,
11
+ statusText: ""
12
+ };
13
+ const additionalHeaders = { ...params.additionalHeaders };
14
+ if (params.companyId) {
15
+ additionalHeaders["x-companyid"] = params.companyId;
16
+ }
17
+ additionalHeaders["x-language"] = params.language;
18
+ let requestBody = void 0;
19
+ if (params.files) {
20
+ const formData = new FormData();
21
+ if (params.body && typeof params.body === "object") {
22
+ for (const key in params.body) {
23
+ if (Object.prototype.hasOwnProperty.call(params.body, key)) {
24
+ formData.append(
25
+ key,
26
+ typeof params.body[key] === "object" ? JSON.stringify(params.body[key]) : params.body[key]
27
+ );
28
+ }
29
+ }
30
+ }
31
+ if (params.files instanceof Blob) {
32
+ formData.append("file", params.files);
33
+ } else if (typeof params.files === "object" && params.files !== null) {
34
+ for (const key in params.files) {
35
+ if (Object.prototype.hasOwnProperty.call(params.files, key)) {
36
+ formData.append(key, params.files[key]);
37
+ }
38
+ }
39
+ }
40
+ requestBody = formData;
41
+ } else if (params.body !== void 0) {
42
+ requestBody = JSON.stringify(params.body);
43
+ additionalHeaders["Content-Type"] = "application/json";
44
+ }
45
+ const options = {
46
+ method: params.method,
47
+ headers: { Accept: "application/json", ...additionalHeaders }
48
+ };
49
+ if (requestBody !== void 0) {
50
+ options.body = requestBody;
51
+ }
52
+ if (params.token) {
53
+ options.headers = { ...options.headers, Authorization: `Bearer ${params.token}` };
54
+ }
55
+ try {
56
+ const apiResponse = await fetch(params.url, options);
57
+ response.ok = apiResponse.ok;
58
+ response.status = apiResponse.status;
59
+ response.statusText = apiResponse.statusText;
60
+ try {
61
+ response.data = await apiResponse.json();
62
+ } catch {
63
+ response.data = void 0;
64
+ }
65
+ } catch {
66
+ response.ok = false;
67
+ response.status = 500;
68
+ response.data = void 0;
69
+ }
70
+ return response;
71
+ }
72
+ __name(directFetch, "directFetch");
73
+
74
+ export {
75
+ directFetch
76
+ };
77
+ //# sourceMappingURL=chunk-C7C7VY4F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/request.ts"],"sourcesContent":["\"use client\";\n\nimport { ApiData } from \"../core/interfaces/ApiData\";\n\nexport interface DirectFetchParams {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}\n\n/**\n * Client-side direct fetch to bypass server action overhead.\n * Use this for client-side API calls.\n */\nexport async function directFetch(params: DirectFetchParams): Promise<ApiData> {\n const response: ApiData = {\n data: undefined,\n ok: false,\n status: 0,\n statusText: \"\",\n };\n\n const additionalHeaders: Record<string, string> = { ...params.additionalHeaders };\n\n if (params.companyId) {\n additionalHeaders[\"x-companyid\"] = params.companyId;\n }\n additionalHeaders[\"x-language\"] = params.language;\n\n let requestBody: BodyInit | undefined = undefined;\n\n if (params.files) {\n const formData = new FormData();\n if (params.body && typeof params.body === \"object\") {\n for (const key in params.body) {\n if (Object.prototype.hasOwnProperty.call(params.body, key)) {\n formData.append(\n key,\n typeof params.body[key] === \"object\" ? JSON.stringify(params.body[key]) : params.body[key],\n );\n }\n }\n }\n\n if (params.files instanceof Blob) {\n formData.append(\"file\", params.files);\n } else if (typeof params.files === \"object\" && params.files !== null) {\n for (const key in params.files) {\n if (Object.prototype.hasOwnProperty.call(params.files, key)) {\n formData.append(key, params.files[key]);\n }\n }\n }\n\n requestBody = formData;\n } else if (params.body !== undefined) {\n requestBody = JSON.stringify(params.body);\n additionalHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n const options: RequestInit = {\n method: params.method,\n headers: { Accept: \"application/json\", ...additionalHeaders },\n };\n\n if (requestBody !== undefined) {\n options.body = requestBody;\n }\n\n if (params.token) {\n options.headers = { ...options.headers, Authorization: `Bearer ${params.token}` };\n }\n\n try {\n const apiResponse = await fetch(params.url, options);\n\n response.ok = apiResponse.ok;\n response.status = apiResponse.status;\n response.statusText = apiResponse.statusText;\n try {\n response.data = await apiResponse.json();\n } catch {\n response.data = undefined;\n }\n } catch {\n response.ok = false;\n response.status = 500;\n response.data = undefined;\n }\n\n return response;\n}\n"],"mappings":";;;;;AAmBA,eAAsB,YAAY,QAA6C;AAC7E,QAAM,WAAoB;AAAA,IACxB,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,QAAM,oBAA4C,EAAE,GAAG,OAAO,kBAAkB;AAEhF,MAAI,OAAO,WAAW;AACpB,sBAAkB,aAAa,IAAI,OAAO;AAAA,EAC5C;AACA,oBAAkB,YAAY,IAAI,OAAO;AAEzC,MAAI,cAAoC;AAExC,MAAI,OAAO,OAAO;AAChB,UAAM,WAAW,IAAI,SAAS;AAC9B,QAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AAClD,iBAAW,OAAO,OAAO,MAAM;AAC7B,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,GAAG,GAAG;AAC1D,mBAAS;AAAA,YACP;AAAA,YACA,OAAO,OAAO,KAAK,GAAG,MAAM,WAAW,KAAK,UAAU,OAAO,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,iBAAiB,MAAM;AAChC,eAAS,OAAO,QAAQ,OAAO,KAAK;AAAA,IACtC,WAAW,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM;AACpE,iBAAW,OAAO,OAAO,OAAO;AAC9B,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO,GAAG,GAAG;AAC3D,mBAAS,OAAO,KAAK,OAAO,MAAM,GAAG,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB,WAAW,OAAO,SAAS,QAAW;AACpC,kBAAc,KAAK,UAAU,OAAO,IAAI;AACxC,sBAAkB,cAAc,IAAI;AAAA,EACtC;AAEA,QAAM,UAAuB;AAAA,IAC3B,QAAQ,OAAO;AAAA,IACf,SAAS,EAAE,QAAQ,oBAAoB,GAAG,kBAAkB;AAAA,EAC9D;AAEA,MAAI,gBAAgB,QAAW;AAC7B,YAAQ,OAAO;AAAA,EACjB;AAEA,MAAI,OAAO,OAAO;AAChB,YAAQ,UAAU,EAAE,GAAG,QAAQ,SAAS,eAAe,UAAU,OAAO,KAAK,GAAG;AAAA,EAClF;AAEA,MAAI;AACF,UAAM,cAAc,MAAM,MAAM,OAAO,KAAK,OAAO;AAEnD,aAAS,KAAK,YAAY;AAC1B,aAAS,SAAS,YAAY;AAC9B,aAAS,aAAa,YAAY;AAClC,QAAI;AACF,eAAS,OAAO,MAAM,YAAY,KAAK;AAAA,IACzC,QAAQ;AACN,eAAS,OAAO;AAAA,IAClB;AAAA,EACF,QAAQ;AACN,aAAS,KAAK;AACd,aAAS,SAAS;AAClB,aAAS,OAAO;AAAA,EAClB;AAEA,SAAO;AACT;AA7EsB;","names":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
4
+
5
+ // src/i18n/config.ts
6
+ var _config = null;
7
+ function configureI18n(config) {
8
+ _config = config;
9
+ }
10
+ _chunk7QVYU63Ejs.__name.call(void 0, configureI18n, "configureI18n");
11
+ function useI18nRouter() {
12
+ if (!_optionalChain([_config, 'optionalAccess', _ => _.useRouter])) {
13
+ throw new Error("i18n not configured. Call configureI18n() at app startup.");
14
+ }
15
+ return _config.useRouter();
16
+ }
17
+ _chunk7QVYU63Ejs.__name.call(void 0, useI18nRouter, "useI18nRouter");
18
+ function useI18nTranslations(namespace) {
19
+ if (!_optionalChain([_config, 'optionalAccess', _2 => _2.useTranslations])) {
20
+ return (key) => key;
21
+ }
22
+ return _config.useTranslations(namespace);
23
+ }
24
+ _chunk7QVYU63Ejs.__name.call(void 0, useI18nTranslations, "useI18nTranslations");
25
+ function getI18nLink() {
26
+ if (!_optionalChain([_config, 'optionalAccess', _3 => _3.Link])) {
27
+ throw new Error("i18n not configured. Call configureI18n() at app startup.");
28
+ }
29
+ return _config.Link;
30
+ }
31
+ _chunk7QVYU63Ejs.__name.call(void 0, getI18nLink, "getI18nLink");
32
+ function useI18nLocale() {
33
+ if (_optionalChain([_config, 'optionalAccess', _4 => _4.useLocale])) {
34
+ return _config.useLocale();
35
+ }
36
+ return "en";
37
+ }
38
+ _chunk7QVYU63Ejs.__name.call(void 0, useI18nLocale, "useI18nLocale");
39
+ function useI18nDateFnsLocale() {
40
+ if (_optionalChain([_config, 'optionalAccess', _5 => _5.useDateFnsLocale])) {
41
+ return _config.useDateFnsLocale();
42
+ }
43
+ return void 0;
44
+ }
45
+ _chunk7QVYU63Ejs.__name.call(void 0, useI18nDateFnsLocale, "useI18nDateFnsLocale");
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+ exports.configureI18n = configureI18n; exports.useI18nRouter = useI18nRouter; exports.useI18nTranslations = useI18nTranslations; exports.getI18nLink = getI18nLink; exports.useI18nLocale = useI18nLocale; exports.useI18nDateFnsLocale = useI18nDateFnsLocale;
55
+ //# sourceMappingURL=chunk-CXQOWQSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-CXQOWQSY.js","../src/i18n/config.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACwBA,IAAI,QAAA,EAA6B,IAAA;AAG1B,SAAS,aAAA,CAAc,MAAA,EAA0B;AACtD,EAAA,QAAA,EAAU,MAAA;AACZ;AAFgB,qCAAA,aAAA,EAAA,eAAA,CAAA;AAKT,SAAS,aAAA,CAAA,EAA4B;AAC1C,EAAA,GAAA,CAAI,iBAAC,OAAA,2BAAS,WAAA,EAAW;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,2DAA2D,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,CAAA;AAC3B;AALgB,qCAAA,aAAA,EAAA,eAAA,CAAA;AAOT,SAAS,mBAAA,CAAoB,SAAA,EAA2E;AAC7G,EAAA,GAAA,CAAI,iBAAC,OAAA,6BAAS,iBAAA,EAAiB;AAE7B,IAAA,OAAO,CAAC,GAAA,EAAA,GAAgB,GAAA;AAAA,EAC1B;AACA,EAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,SAAS,CAAA;AAC1C;AANgB,qCAAA,mBAAA,EAAA,qBAAA,CAAA;AAQT,SAAS,WAAA,CAAA,EAA6B;AAC3C,EAAA,GAAA,CAAI,iBAAC,OAAA,6BAAS,MAAA,EAAM;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,2DAA2D,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,OAAA,CAAQ,IAAA;AACjB;AALgB,qCAAA,WAAA,EAAA,aAAA,CAAA;AAOT,SAAS,aAAA,CAAA,EAAwB;AACtC,EAAA,GAAA,iBAAI,OAAA,6BAAS,WAAA,EAAW;AACtB,IAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,IAAA;AACT;AANgB,qCAAA,aAAA,EAAA,eAAA,CAAA;AAQT,SAAS,oBAAA,CAAA,EAA4B;AAC1C,EAAA,GAAA,iBAAI,OAAA,6BAAS,kBAAA,EAAkB;AAC7B,IAAA,OAAO,OAAA,CAAQ,gBAAA,CAAiB,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,KAAA,CAAA;AACT;AANgB,qCAAA,oBAAA,EAAA,sBAAA,CAAA;ADrBhB;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,+PAAC","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-CXQOWQSY.js","sourcesContent":[null,"import { ComponentType } from \"react\";\n\n// Types for injected hooks\nexport interface I18nRouter {\n push: (href: string) => void;\n replace: (href: string) => void;\n back: () => void;\n forward: () => void;\n refresh: () => void;\n prefetch: (href: string) => void;\n}\n\nexport type UseRouterHook = () => I18nRouter;\nexport type UseTranslationsHook = (namespace?: string) => (key: string, values?: Record<string, any>) => string;\nexport type UseLocaleHook = () => string;\n\nexport type UseDateFnsLocaleHook = () => any; // date-fns Locale type\nexport type LinkComponent = ComponentType<{ href: string; children: React.ReactNode; [key: string]: any }>;\n\nexport interface I18nConfig {\n useRouter: UseRouterHook;\n useTranslations: UseTranslationsHook;\n useLocale?: UseLocaleHook;\n useDateFnsLocale?: UseDateFnsLocaleHook;\n Link: LinkComponent;\n}\n\n// Private storage\nlet _config: I18nConfig | null = null;\n\n// Configuration function (called by app at startup)\nexport function configureI18n(config: I18nConfig): void {\n _config = config;\n}\n\n// Hooks for library components to use\nexport function useI18nRouter(): I18nRouter {\n if (!_config?.useRouter) {\n throw new Error(\"i18n not configured. Call configureI18n() at app startup.\");\n }\n return _config.useRouter();\n}\n\nexport function useI18nTranslations(namespace?: string): (key: string, values?: Record<string, any>) => string {\n if (!_config?.useTranslations) {\n // Fallback: return key as-is (safe for server/client)\n return (key: string) => key;\n }\n return _config.useTranslations(namespace);\n}\n\nexport function getI18nLink(): LinkComponent {\n if (!_config?.Link) {\n throw new Error(\"i18n not configured. Call configureI18n() at app startup.\");\n }\n return _config.Link;\n}\n\nexport function useI18nLocale(): string {\n if (_config?.useLocale) {\n return _config.useLocale();\n }\n // Fallback to English (safe for server/client)\n return \"en\";\n}\n\nexport function useI18nDateFnsLocale(): any {\n if (_config?.useDateFnsLocale) {\n return _config.useDateFnsLocale();\n }\n // Fallback to undefined (Calendar will use default)\n return undefined;\n}\n"]}
@@ -0,0 +1,98 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-PAWJFY3S.mjs";
4
+
5
+ // src/permissions/types.ts
6
+ var Action = /* @__PURE__ */ ((Action2) => {
7
+ Action2["Read"] = "read";
8
+ Action2["Create"] = "create";
9
+ Action2["Update"] = "update";
10
+ Action2["Delete"] = "delete";
11
+ return Action2;
12
+ })(Action || {});
13
+
14
+ // src/permissions/check.ts
15
+ function checkPermissions(params) {
16
+ const selectedModule = params.user.modules.find((module) => module.id === params.module.moduleId);
17
+ if (!selectedModule) return false;
18
+ const permissionConfig = selectedModule.permissions[params.action];
19
+ if (!permissionConfig) return false;
20
+ if (typeof permissionConfig === "boolean") return permissionConfig;
21
+ if (!params.data) return true;
22
+ try {
23
+ const singlePermissionConfig = permissionConfig.split("|").map((p) => p.trim());
24
+ for (const path of singlePermissionConfig) {
25
+ if (getValueFromPath(params.data, path, params.user.id)) return true;
26
+ }
27
+ return false;
28
+ } catch {
29
+ if (typeof permissionConfig === "string") {
30
+ return getValueFromPath(params.data, permissionConfig, params.user.id);
31
+ }
32
+ }
33
+ return false;
34
+ }
35
+ __name(checkPermissions, "checkPermissions");
36
+ function checkPermissionsFromServer(params) {
37
+ if (!params.selectedModule) return false;
38
+ const permissionConfig = params.selectedModule.permissions[params.action];
39
+ if (!permissionConfig) return false;
40
+ if (typeof permissionConfig === "boolean") return permissionConfig;
41
+ if (!params.data) return true;
42
+ try {
43
+ const singlePermissionConfig = permissionConfig.split("|").map((p) => p.trim());
44
+ for (const path of singlePermissionConfig) {
45
+ if (getValueFromPath(params.data, path, params.userId)) return true;
46
+ }
47
+ return false;
48
+ } catch {
49
+ if (typeof permissionConfig === "string") {
50
+ return getValueFromPath(params.data, permissionConfig, params.userId);
51
+ }
52
+ }
53
+ return false;
54
+ }
55
+ __name(checkPermissionsFromServer, "checkPermissionsFromServer");
56
+ function getValueFromPath(obj, path, userId) {
57
+ const parts = path.split(".");
58
+ let current = obj;
59
+ for (const part of parts) {
60
+ if (!current) return false;
61
+ if (Array.isArray(current)) {
62
+ let found = false;
63
+ for (const item of current) {
64
+ const result = getValueFromPath(item, parts.slice(parts.indexOf(part)).join("."), userId);
65
+ if (result === userId || result === true) {
66
+ found = true;
67
+ break;
68
+ }
69
+ }
70
+ return found;
71
+ } else if (current[part] !== void 0) {
72
+ current = current[part];
73
+ } else {
74
+ return false;
75
+ }
76
+ }
77
+ if (Array.isArray(current)) {
78
+ return current.some((item) => {
79
+ if (typeof item === "object" && item.id !== void 0) {
80
+ return item.id.toString() === userId;
81
+ }
82
+ return item.toString() === userId;
83
+ });
84
+ }
85
+ if (typeof current === "object" && current.id !== void 0) {
86
+ return current.id.toString() === userId;
87
+ }
88
+ return current.toString() === userId;
89
+ }
90
+ __name(getValueFromPath, "getValueFromPath");
91
+
92
+ export {
93
+ Action,
94
+ checkPermissions,
95
+ checkPermissionsFromServer,
96
+ getValueFromPath
97
+ };
98
+ //# sourceMappingURL=chunk-DD3KISNB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/permissions/types.ts","../src/permissions/check.ts"],"sourcesContent":["import { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { FieldSelector } from \"../core/fields/FieldSelector\";\n\n/**\n * Permission actions\n */\nexport enum Action {\n Read = \"read\",\n Create = \"create\",\n Update = \"update\",\n Delete = \"delete\",\n}\n\n/**\n * Generic permission check type.\n * Can be a boolean or a function that checks permissions dynamically.\n * @template T - The data type being checked\n * @template U - The user type (defaults to PermissionUser)\n */\nexport type PermissionCheck<T, U = PermissionUser> = boolean | ((user?: U | string, data?: T) => boolean);\n\n/**\n * Page URL configuration for modules\n */\nexport type PageUrl = {\n pageUrl?: string;\n};\n\n/**\n * Module permission definition wrapper\n */\nexport type ModulePermissionDefinition<T> = {\n interface: T;\n};\n\n/**\n * Base module definition\n */\nexport type ModuleDefinition = {\n pageUrl?: string;\n name: string;\n model: any;\n feature?: string;\n moduleId?: string;\n};\n\n/**\n * Permission configuration for a module.\n * Can be a boolean (allow/deny all) or a string path for dynamic checks.\n */\nexport interface PermissionConfig {\n create: boolean | string;\n read: boolean | string;\n update: boolean | string;\n delete: boolean | string;\n}\n\n/**\n * Generic interface for a module that has permissions.\n * Apps should ensure their Module class implements this.\n */\nexport interface PermissionModule {\n id: string;\n permissions: PermissionConfig;\n}\n\n/**\n * Generic interface for a user that has modules with permissions.\n * Apps should ensure their User class implements this.\n */\nexport interface PermissionUser {\n id: string;\n modules: PermissionModule[];\n}\n\n/**\n * Module definition with permissions - extends ApiRequestDataTypeInterface\n */\nexport type ModuleWithPermissions = ApiRequestDataTypeInterface & {\n pageUrl?: string;\n feature?: string;\n moduleId?: string;\n inclusions?: Record<\n string,\n {\n types?: string[];\n fields?: FieldSelector<any>[];\n }\n >;\n};\n\n/**\n * Factory type for creating module definitions\n */\nexport type ModuleFactory = (params: {\n pageUrl?: string;\n name: string;\n cache?: string | \"days\" | \"default\" | \"hours\" | \"max\" | \"minutes\" | \"seconds\" | \"weeks\";\n model: any;\n feature?: string;\n moduleId?: string;\n inclusions?: Record<\n string,\n {\n types?: string[];\n fields?: FieldSelector<any>[];\n }\n >;\n}) => ModuleWithPermissions;\n","import { Action, ModuleWithPermissions, PermissionModule, PermissionUser } from \"./types\";\n\n/**\n * Check if a user has permission to perform an action on a module.\n *\n * @param module - The module to check permissions for\n * @param action - The action to check (read, create, update, delete)\n * @param user - The user with their modules and permissions\n * @param data - Optional data object for path-based permission checks\n */\nexport function checkPermissions<T extends PermissionUser>(params: {\n module: ModuleWithPermissions;\n action: Action;\n user: T;\n data?: any;\n}): boolean {\n const selectedModule = params.user.modules.find((module: PermissionModule) => module.id === params.module.moduleId);\n\n if (!selectedModule) return false;\n const permissionConfig = selectedModule.permissions[params.action];\n\n if (!permissionConfig) return false;\n if (typeof permissionConfig === \"boolean\") return permissionConfig as boolean;\n\n if (!params.data) return true;\n\n try {\n const singlePermissionConfig = permissionConfig.split(\"|\").map((p) => p.trim());\n\n for (const path of singlePermissionConfig) {\n if (getValueFromPath(params.data, path, params.user.id)) return true;\n }\n return false;\n } catch {\n if (typeof permissionConfig === \"string\") {\n return getValueFromPath(params.data, permissionConfig, params.user.id);\n }\n }\n\n return false;\n}\n\n/**\n * Check permissions from server context where user object is not fully available.\n *\n * @param module - The module to check permissions for\n * @param action - The action to check\n * @param userId - The user's ID\n * @param selectedModule - The selected module with its permissions\n * @param data - Optional data object for path-based permission checks\n */\nexport function checkPermissionsFromServer(params: {\n module: ModuleWithPermissions;\n action: Action;\n userId: string;\n selectedModule?: PermissionModule;\n data?: any;\n}): boolean {\n if (!params.selectedModule) return false;\n const permissionConfig = params.selectedModule.permissions[params.action];\n\n if (!permissionConfig) return false;\n if (typeof permissionConfig === \"boolean\") return permissionConfig as boolean;\n\n if (!params.data) return true;\n\n try {\n const singlePermissionConfig = permissionConfig.split(\"|\").map((p) => p.trim());\n\n for (const path of singlePermissionConfig) {\n if (getValueFromPath(params.data, path, params.userId)) return true;\n }\n return false;\n } catch {\n if (typeof permissionConfig === \"string\") {\n return getValueFromPath(params.data, permissionConfig, params.userId);\n }\n }\n\n return false;\n}\n\n/**\n * Traverse an object path and check if the value matches the user ID.\n * Handles nested objects, arrays, and various data structures.\n */\nexport function getValueFromPath(obj: any, path: string, userId: string): any {\n const parts = path.split(\".\");\n let current = obj;\n\n for (const part of parts) {\n if (!current) return false;\n\n if (Array.isArray(current)) {\n let found = false;\n for (const item of current) {\n const result = getValueFromPath(item, parts.slice(parts.indexOf(part)).join(\".\"), userId);\n if (result === userId || result === true) {\n found = true;\n break;\n }\n }\n return found;\n } else if (current[part] !== undefined) {\n current = current[part];\n } else {\n return false;\n }\n }\n\n if (Array.isArray(current)) {\n // If final value is an array, check if any element has id matching userId\n return current.some((item: any) => {\n if (typeof item === \"object\" && item.id !== undefined) {\n return item.id.toString() === userId;\n }\n return item.toString() === userId;\n });\n }\n\n // Direct comparison for primitive values or objects with id\n if (typeof current === \"object\" && current.id !== undefined) {\n return current.id.toString() === userId;\n }\n\n return current.toString() === userId;\n}\n"],"mappings":";;;;;AAMO,IAAK,SAAL,kBAAKA,YAAL;AACL,EAAAA,QAAA,UAAO;AACP,EAAAA,QAAA,YAAS;AACT,EAAAA,QAAA,YAAS;AACT,EAAAA,QAAA,YAAS;AAJC,SAAAA;AAAA,GAAA;;;ACIL,SAAS,iBAA2C,QAK/C;AACV,QAAM,iBAAiB,OAAO,KAAK,QAAQ,KAAK,CAAC,WAA6B,OAAO,OAAO,OAAO,OAAO,QAAQ;AAElH,MAAI,CAAC,eAAgB,QAAO;AAC5B,QAAM,mBAAmB,eAAe,YAAY,OAAO,MAAM;AAEjE,MAAI,CAAC,iBAAkB,QAAO;AAC9B,MAAI,OAAO,qBAAqB,UAAW,QAAO;AAElD,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,MAAI;AACF,UAAM,yBAAyB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAE9E,eAAW,QAAQ,wBAAwB;AACzC,UAAI,iBAAiB,OAAO,MAAM,MAAM,OAAO,KAAK,EAAE,EAAG,QAAO;AAAA,IAClE;AACA,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,OAAO,qBAAqB,UAAU;AACxC,aAAO,iBAAiB,OAAO,MAAM,kBAAkB,OAAO,KAAK,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AACT;AA9BgB;AAyCT,SAAS,2BAA2B,QAM/B;AACV,MAAI,CAAC,OAAO,eAAgB,QAAO;AACnC,QAAM,mBAAmB,OAAO,eAAe,YAAY,OAAO,MAAM;AAExE,MAAI,CAAC,iBAAkB,QAAO;AAC9B,MAAI,OAAO,qBAAqB,UAAW,QAAO;AAElD,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,MAAI;AACF,UAAM,yBAAyB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAE9E,eAAW,QAAQ,wBAAwB;AACzC,UAAI,iBAAiB,OAAO,MAAM,MAAM,OAAO,MAAM,EAAG,QAAO;AAAA,IACjE;AACA,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,OAAO,qBAAqB,UAAU;AACxC,aAAO,iBAAiB,OAAO,MAAM,kBAAkB,OAAO,MAAM;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AACT;AA7BgB;AAmCT,SAAS,iBAAiB,KAAU,MAAc,QAAqB;AAC5E,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,UAAI,QAAQ;AACZ,iBAAW,QAAQ,SAAS;AAC1B,cAAM,SAAS,iBAAiB,MAAM,MAAM,MAAM,MAAM,QAAQ,IAAI,CAAC,EAAE,KAAK,GAAG,GAAG,MAAM;AACxF,YAAI,WAAW,UAAU,WAAW,MAAM;AACxC,kBAAQ;AACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,WAAW,QAAQ,IAAI,MAAM,QAAW;AACtC,gBAAU,QAAQ,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,WAAO,QAAQ,KAAK,CAAC,SAAc;AACjC,UAAI,OAAO,SAAS,YAAY,KAAK,OAAO,QAAW;AACrD,eAAO,KAAK,GAAG,SAAS,MAAM;AAAA,MAChC;AACA,aAAO,KAAK,SAAS,MAAM;AAAA,IAC7B,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,YAAY,YAAY,QAAQ,OAAO,QAAW;AAC3D,WAAO,QAAQ,GAAG,SAAS,MAAM;AAAA,EACnC;AAEA,SAAO,QAAQ,SAAS,MAAM;AAChC;AAxCgB;","names":["Action"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-DKKMWBP4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _class;
2
+
3
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
4
+
5
+ // src/core/registry/DataClassRegistry.ts
6
+ var DataClassRegistry = (_class = class {
7
+ static {
8
+ _chunk7QVYU63Ejs.__name.call(void 0, this, "DataClassRegistry");
9
+ }
10
+ static __initStatic() {this._map = /* @__PURE__ */ new Map()}
11
+ static registerObjectClass(key, classConstructor) {
12
+ const classKey = key.name;
13
+ if (!this._map.has(classKey)) {
14
+ this._map.set(classKey, classConstructor);
15
+ }
16
+ }
17
+ static get(classKey) {
18
+ const response = this._map.get(classKey.name);
19
+ if (!response) {
20
+ throw new Error(`Class not registered for key: ${typeof classKey === "string" ? classKey : classKey.name}`);
21
+ }
22
+ return response;
23
+ }
24
+ /**
25
+ * Bootstrap the registry with all modules.
26
+ * This is a convenience method for apps to register all their modules at once.
27
+ *
28
+ * @param modules - An object with module definitions (like the app's Modules class)
29
+ */
30
+ static bootstrap(modules) {
31
+ Object.values(modules).forEach((module) => {
32
+ if (module && module.model) {
33
+ this.registerObjectClass(module, module.model);
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * Clear all registered classes. Useful for testing.
39
+ */
40
+ static clear() {
41
+ this._map.clear();
42
+ }
43
+ }, _class.__initStatic(), _class);
44
+
45
+
46
+
47
+ exports.DataClassRegistry = DataClassRegistry;
48
+ //# sourceMappingURL=chunk-DO2HLAZO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-DO2HLAZO.js","../src/core/registry/DataClassRegistry.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACDO,IAAM,kBAAA,YAAN,MAAwB;AAAA,EAH/B,OAG+B;AAAA,IAAA,qCAAA,IAAA,EAAA,mBAAA,CAAA;AAAA,EAAA;AAAA,EAC7B,4BAAe,KAAA,kBAAO,IAAI,GAAA,CAA0C,EAAA;AAAA,EAEpE,OAAc,mBAAA,CACZ,GAAA,EACA,gBAAA,EACM;AACN,IAAA,MAAM,SAAA,EAAW,GAAA,CAAI,IAAA;AACrB,IAAA,GAAA,CAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,gBAAgB,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,OAAc,GAAA,CAAI,QAAA,EAEhB;AACA,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AAC5C,IAAA,GAAA,CAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,OAAO,SAAA,IAAa,SAAA,EAAW,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA,CAAA;AAC1G,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQoF,EAAA;AACvC,IAAA;AACb,MAAA;AACmB,QAAA;AAC/C,MAAA;AACD,IAAA;AACH,EAAA;AAAA;AAAA;AAAA;AAK4B,EAAA;AACV,IAAA;AAClB,EAAA;AACF;ADJ+G;AACA;AACA;AACA","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-DO2HLAZO.js","sourcesContent":[null,"import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\n\nexport class DataClassRegistry {\n private static _map = new Map<string, { new (): ApiDataInterface }>();\n\n public static registerObjectClass(\n key: ApiRequestDataTypeInterface,\n classConstructor: { new (): ApiDataInterface },\n ): void {\n const classKey = key.name;\n if (!this._map.has(classKey)) {\n this._map.set(classKey, classConstructor);\n }\n }\n\n public static get(classKey: ApiRequestDataTypeInterface): {\n new (): ApiDataInterface;\n } {\n const response = this._map.get(classKey.name);\n if (!response) {\n throw new Error(`Class not registered for key: ${typeof classKey === \"string\" ? classKey : classKey.name}`);\n }\n\n return response;\n }\n\n /**\n * Bootstrap the registry with all modules.\n * This is a convenience method for apps to register all their modules at once.\n *\n * @param modules - An object with module definitions (like the app's Modules class)\n */\n public static bootstrap(modules: Record<string, ApiRequestDataTypeInterface>): void {\n Object.values(modules).forEach((module) => {\n if (module && module.model) {\n this.registerObjectClass(module, module.model);\n }\n });\n }\n\n /**\n * Clear all registered classes. Useful for testing.\n */\n public static clear(): void {\n this._map.clear();\n }\n}\n\n// Export alias for backward compatibility\nexport { DataClassRegistry as DataClass };\n"]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-PAWJFY3S.mjs";
4
+
5
+ // src/components/errors/errorToast.ts
6
+ import { toast } from "sonner";
7
+ function errorToast(params) {
8
+ toast.error(params?.title ?? "Error", {
9
+ description: params.error instanceof Error ? params.error.message : String(params.error)
10
+ });
11
+ }
12
+ __name(errorToast, "errorToast");
13
+
14
+ export {
15
+ errorToast
16
+ };
17
+ //# sourceMappingURL=chunk-DZXDB3K2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/errors/errorToast.ts"],"sourcesContent":["// import { toast } from \"@/hooks/use-toast\";\n\nimport { toast } from \"sonner\";\n\nexport function errorToast(params: { title?: string; error: any }) {\n toast.error(params?.title ?? \"Error\", {\n description: params.error instanceof Error ? params.error.message : String(params.error),\n });\n}\n"],"mappings":";;;;;AAEA,SAAS,aAAa;AAEf,SAAS,WAAW,QAAwC;AACjE,QAAM,MAAM,QAAQ,SAAS,SAAS;AAAA,IACpC,aAAa,OAAO,iBAAiB,QAAQ,OAAO,MAAM,UAAU,OAAO,OAAO,KAAK;AAAA,EACzF,CAAC;AACH;AAJgB;","names":[]}