nextjs-cms 0.5.9 → 0.5.11

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 (258) hide show
  1. package/dist/api/axios/axiosInstance.d.ts +1 -1
  2. package/dist/api/axios/axiosInstance.js +8 -8
  3. package/dist/api/index.d.ts +855 -855
  4. package/dist/api/index.d.ts.map +1 -1
  5. package/dist/api/index.js +12 -12
  6. package/dist/api/lib/serverActions.d.ts +239 -239
  7. package/dist/api/lib/serverActions.d.ts.map +1 -1
  8. package/dist/api/lib/serverActions.js +834 -834
  9. package/dist/api/root.d.ts +828 -828
  10. package/dist/api/root.js +30 -30
  11. package/dist/api/routers/accountSettings.d.ts +60 -60
  12. package/dist/api/routers/accountSettings.js +108 -108
  13. package/dist/api/routers/admins.d.ts +105 -105
  14. package/dist/api/routers/admins.js +219 -219
  15. package/dist/api/routers/auth.d.ts +47 -47
  16. package/dist/api/routers/auth.js +25 -25
  17. package/dist/api/routers/categorySection.d.ts +103 -103
  18. package/dist/api/routers/categorySection.js +38 -38
  19. package/dist/api/routers/cmsSettings.d.ts +48 -48
  20. package/dist/api/routers/cmsSettings.js +51 -51
  21. package/dist/api/routers/cpanel.d.ts +83 -83
  22. package/dist/api/routers/cpanel.js +216 -216
  23. package/dist/api/routers/files.d.ts +47 -47
  24. package/dist/api/routers/files.js +23 -23
  25. package/dist/api/routers/gallery.d.ts +35 -35
  26. package/dist/api/routers/gallery.js +62 -62
  27. package/dist/api/routers/googleAnalytics.d.ts +30 -30
  28. package/dist/api/routers/googleAnalytics.js +7 -7
  29. package/dist/api/routers/hasItemsSection.d.ts +139 -139
  30. package/dist/api/routers/hasItemsSection.js +34 -34
  31. package/dist/api/routers/navigation.d.ts +51 -51
  32. package/dist/api/routers/navigation.js +11 -11
  33. package/dist/api/routers/simpleSection.d.ts +57 -57
  34. package/dist/api/routers/simpleSection.js +12 -12
  35. package/dist/api/trpc.d.ts +106 -106
  36. package/dist/api/trpc.js +72 -72
  37. package/dist/auth/axios/axiosInstance.d.ts +1 -1
  38. package/dist/auth/axios/axiosInstance.js +8 -8
  39. package/dist/auth/csrf.d.ts +29 -29
  40. package/dist/auth/csrf.js +76 -76
  41. package/dist/auth/hooks/index.d.ts +3 -3
  42. package/dist/auth/hooks/index.d.ts.map +1 -1
  43. package/dist/auth/hooks/index.js +3 -3
  44. package/dist/auth/hooks/useAxiosPrivate.d.ts +4 -4
  45. package/dist/auth/hooks/useAxiosPrivate.js +74 -74
  46. package/dist/auth/hooks/useRefreshToken.d.ts +6 -6
  47. package/dist/auth/hooks/useRefreshToken.js +79 -79
  48. package/dist/auth/index.d.ts +22 -22
  49. package/dist/auth/index.js +44 -44
  50. package/dist/auth/jwt.d.ts +5 -5
  51. package/dist/auth/jwt.js +25 -25
  52. package/dist/auth/lib/actions.d.ts +32 -32
  53. package/dist/auth/lib/actions.d.ts.map +1 -1
  54. package/dist/auth/lib/actions.js +209 -209
  55. package/dist/auth/lib/client.d.ts +3 -3
  56. package/dist/auth/lib/client.js +46 -46
  57. package/dist/auth/lib/index.d.ts +2 -2
  58. package/dist/auth/lib/index.d.ts.map +1 -1
  59. package/dist/auth/lib/index.js +2 -2
  60. package/dist/auth/react.d.ts +105 -105
  61. package/dist/auth/react.d.ts.map +1 -1
  62. package/dist/auth/react.js +347 -347
  63. package/dist/auth/trpc.d.ts +5 -5
  64. package/dist/auth/trpc.d.ts.map +1 -1
  65. package/dist/auth/trpc.js +81 -81
  66. package/dist/core/config/config-loader.d.ts +91 -91
  67. package/dist/core/config/config-loader.js +230 -230
  68. package/dist/core/config/index.d.ts +2 -2
  69. package/dist/core/config/index.d.ts.map +1 -1
  70. package/dist/core/config/index.js +1 -1
  71. package/dist/core/config/loader.d.ts +1 -1
  72. package/dist/core/config/loader.js +42 -42
  73. package/dist/core/db/index.d.ts +1 -1
  74. package/dist/core/db/index.d.ts.map +1 -1
  75. package/dist/core/db/index.js +1 -1
  76. package/dist/core/db/table-checker/DbTable.d.ts +5 -5
  77. package/dist/core/db/table-checker/DbTable.js +5 -5
  78. package/dist/core/db/table-checker/MysqlTable.d.ts +33 -33
  79. package/dist/core/db/table-checker/MysqlTable.d.ts.map +1 -1
  80. package/dist/core/db/table-checker/MysqlTable.js +94 -94
  81. package/dist/core/db/table-checker/index.d.ts +1 -1
  82. package/dist/core/db/table-checker/index.d.ts.map +1 -1
  83. package/dist/core/db/table-checker/index.js +1 -1
  84. package/dist/core/factories/FieldFactory.d.ts +123 -123
  85. package/dist/core/factories/FieldFactory.d.ts.map +1 -1
  86. package/dist/core/factories/FieldFactory.js +411 -411
  87. package/dist/core/factories/SectionFactory.d.ts +109 -109
  88. package/dist/core/factories/SectionFactory.d.ts.map +1 -1
  89. package/dist/core/factories/SectionFactory.js +415 -415
  90. package/dist/core/factories/index.d.ts +2 -2
  91. package/dist/core/factories/index.d.ts.map +1 -1
  92. package/dist/core/factories/index.js +2 -2
  93. package/dist/core/fields/checkbox.d.ts +62 -62
  94. package/dist/core/fields/checkbox.d.ts.map +1 -1
  95. package/dist/core/fields/checkbox.js +62 -62
  96. package/dist/core/fields/color.d.ts +83 -83
  97. package/dist/core/fields/color.d.ts.map +1 -1
  98. package/dist/core/fields/color.js +91 -91
  99. package/dist/core/fields/date.d.ts +99 -99
  100. package/dist/core/fields/date.d.ts.map +1 -1
  101. package/dist/core/fields/date.js +108 -108
  102. package/dist/core/fields/document.d.ts +179 -179
  103. package/dist/core/fields/document.d.ts.map +1 -1
  104. package/dist/core/fields/document.js +277 -277
  105. package/dist/core/fields/field-group.d.ts +17 -17
  106. package/dist/core/fields/field-group.d.ts.map +1 -1
  107. package/dist/core/fields/field-group.js +6 -6
  108. package/dist/core/fields/field.d.ts +125 -125
  109. package/dist/core/fields/field.d.ts.map +1 -1
  110. package/dist/core/fields/field.js +148 -148
  111. package/dist/core/fields/fileField.d.ts +14 -14
  112. package/dist/core/fields/fileField.d.ts.map +1 -1
  113. package/dist/core/fields/fileField.js +5 -5
  114. package/dist/core/fields/index.d.ts +64 -64
  115. package/dist/core/fields/index.d.ts.map +1 -1
  116. package/dist/core/fields/index.js +18 -18
  117. package/dist/core/fields/map.d.ts +166 -166
  118. package/dist/core/fields/map.d.ts.map +1 -1
  119. package/dist/core/fields/map.js +152 -152
  120. package/dist/core/fields/number.d.ts +185 -185
  121. package/dist/core/fields/number.d.ts.map +1 -1
  122. package/dist/core/fields/number.js +241 -241
  123. package/dist/core/fields/password.d.ts +108 -108
  124. package/dist/core/fields/password.d.ts.map +1 -1
  125. package/dist/core/fields/password.js +133 -133
  126. package/dist/core/fields/photo.d.ts +288 -288
  127. package/dist/core/fields/photo.d.ts.map +1 -1
  128. package/dist/core/fields/photo.js +410 -410
  129. package/dist/core/fields/richText.d.ts +294 -294
  130. package/dist/core/fields/richText.d.ts.map +1 -1
  131. package/dist/core/fields/richText.js +338 -338
  132. package/dist/core/fields/select.d.ts +365 -365
  133. package/dist/core/fields/select.d.ts.map +1 -1
  134. package/dist/core/fields/select.js +499 -499
  135. package/dist/core/fields/selectMultiple.d.ts +235 -235
  136. package/dist/core/fields/selectMultiple.d.ts.map +1 -1
  137. package/dist/core/fields/selectMultiple.js +417 -417
  138. package/dist/core/fields/tags.d.ts +130 -130
  139. package/dist/core/fields/tags.d.ts.map +1 -1
  140. package/dist/core/fields/tags.js +105 -105
  141. package/dist/core/fields/text.d.ts +135 -135
  142. package/dist/core/fields/text.d.ts.map +1 -1
  143. package/dist/core/fields/text.js +157 -157
  144. package/dist/core/fields/textArea.d.ts +106 -106
  145. package/dist/core/fields/textArea.d.ts.map +1 -1
  146. package/dist/core/fields/textArea.js +126 -126
  147. package/dist/core/fields/video.d.ts +147 -147
  148. package/dist/core/fields/video.d.ts.map +1 -1
  149. package/dist/core/fields/video.js +248 -248
  150. package/dist/core/helpers/entity.d.ts +7 -7
  151. package/dist/core/helpers/entity.js +27 -27
  152. package/dist/core/helpers/index.d.ts +4 -4
  153. package/dist/core/helpers/index.d.ts.map +1 -1
  154. package/dist/core/helpers/index.js +3 -3
  155. package/dist/core/index.d.ts +7 -7
  156. package/dist/core/index.d.ts.map +1 -1
  157. package/dist/core/index.js +7 -7
  158. package/dist/core/sections/category.d.ts +282 -282
  159. package/dist/core/sections/category.d.ts.map +1 -1
  160. package/dist/core/sections/category.js +147 -147
  161. package/dist/core/sections/hasItems.d.ts +631 -631
  162. package/dist/core/sections/hasItems.d.ts.map +1 -1
  163. package/dist/core/sections/hasItems.js +144 -144
  164. package/dist/core/sections/index.d.ts +4 -4
  165. package/dist/core/sections/index.d.ts.map +1 -1
  166. package/dist/core/sections/index.js +4 -4
  167. package/dist/core/sections/section.d.ts +225 -225
  168. package/dist/core/sections/section.d.ts.map +1 -1
  169. package/dist/core/sections/section.js +341 -341
  170. package/dist/core/sections/simple.d.ts +98 -98
  171. package/dist/core/sections/simple.d.ts.map +1 -1
  172. package/dist/core/sections/simple.js +95 -95
  173. package/dist/core/security/dom.d.ts +10 -10
  174. package/dist/core/security/dom.js +92 -92
  175. package/dist/core/submit/ItemEditSubmit.d.ts +75 -75
  176. package/dist/core/submit/ItemEditSubmit.js +186 -186
  177. package/dist/core/submit/NewItemSubmit.d.ts +13 -13
  178. package/dist/core/submit/NewItemSubmit.js +93 -93
  179. package/dist/core/submit/SimpleSectionSubmit.d.ts +12 -12
  180. package/dist/core/submit/SimpleSectionSubmit.js +93 -93
  181. package/dist/core/submit/index.d.ts +4 -4
  182. package/dist/core/submit/index.js +4 -4
  183. package/dist/core/submit/submit.d.ts +115 -115
  184. package/dist/core/submit/submit.js +479 -479
  185. package/dist/core/types/index.d.ts +279 -279
  186. package/dist/core/types/index.d.ts.map +1 -1
  187. package/dist/core/types/index.js +1 -1
  188. package/dist/db/client.d.ts +8 -8
  189. package/dist/db/client.d.ts.map +1 -1
  190. package/dist/db/client.js +19 -19
  191. package/dist/db/config.d.ts +5 -5
  192. package/dist/db/config.js +22 -22
  193. package/dist/db/drizzle.config.d.ts +5 -5
  194. package/dist/db/drizzle.config.js +18 -18
  195. package/dist/db/index.d.ts +2 -2
  196. package/dist/db/index.js +3 -3
  197. package/dist/db/schema.d.ts +638 -638
  198. package/dist/db/schema.js +73 -73
  199. package/dist/index.d.ts +7 -7
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +7 -7
  202. package/dist/translations/index.d.ts +2 -2
  203. package/dist/translations/index.js +15 -15
  204. package/dist/utils/CpanelApi.d.ts +24 -24
  205. package/dist/utils/CpanelApi.js +64 -64
  206. package/dist/utils/constants.d.ts +13 -13
  207. package/dist/utils/constants.js +61 -61
  208. package/dist/utils/index.d.ts +4 -4
  209. package/dist/utils/index.d.ts.map +1 -1
  210. package/dist/utils/index.js +4 -4
  211. package/dist/utils/utils.d.ts +59 -59
  212. package/dist/utils/utils.js +132 -132
  213. package/dist/validators/checkbox.d.ts +3 -3
  214. package/dist/validators/checkbox.d.ts.map +1 -1
  215. package/dist/validators/checkbox.js +12 -12
  216. package/dist/validators/color.d.ts +3 -3
  217. package/dist/validators/color.d.ts.map +1 -1
  218. package/dist/validators/color.js +7 -7
  219. package/dist/validators/date.d.ts +3 -3
  220. package/dist/validators/date.d.ts.map +1 -1
  221. package/dist/validators/date.js +5 -5
  222. package/dist/validators/document.d.ts +3 -3
  223. package/dist/validators/document.d.ts.map +1 -1
  224. package/dist/validators/document.js +57 -57
  225. package/dist/validators/index.d.ts +14 -14
  226. package/dist/validators/index.d.ts.map +1 -1
  227. package/dist/validators/index.js +14 -14
  228. package/dist/validators/map.d.ts +3 -3
  229. package/dist/validators/map.d.ts.map +1 -1
  230. package/dist/validators/map.js +5 -5
  231. package/dist/validators/number.d.ts +3 -3
  232. package/dist/validators/number.d.ts.map +1 -1
  233. package/dist/validators/number.js +20 -20
  234. package/dist/validators/password.d.ts +3 -3
  235. package/dist/validators/password.d.ts.map +1 -1
  236. package/dist/validators/password.js +11 -11
  237. package/dist/validators/photo.d.ts +3 -3
  238. package/dist/validators/photo.d.ts.map +1 -1
  239. package/dist/validators/photo.js +100 -100
  240. package/dist/validators/richText.d.ts +3 -3
  241. package/dist/validators/richText.d.ts.map +1 -1
  242. package/dist/validators/richText.js +8 -8
  243. package/dist/validators/select-multiple.d.ts +9 -9
  244. package/dist/validators/select-multiple.d.ts.map +1 -1
  245. package/dist/validators/select-multiple.js +20 -20
  246. package/dist/validators/select.d.ts +3 -3
  247. package/dist/validators/select.d.ts.map +1 -1
  248. package/dist/validators/select.js +5 -5
  249. package/dist/validators/text.d.ts +3 -3
  250. package/dist/validators/text.d.ts.map +1 -1
  251. package/dist/validators/text.js +7 -7
  252. package/dist/validators/textarea.d.ts +3 -3
  253. package/dist/validators/textarea.d.ts.map +1 -1
  254. package/dist/validators/textarea.js +7 -7
  255. package/dist/validators/video.d.ts +3 -3
  256. package/dist/validators/video.d.ts.map +1 -1
  257. package/dist/validators/video.js +57 -57
  258. package/package.json +4 -5
package/dist/auth/csrf.js CHANGED
@@ -1,76 +1,76 @@
1
- /**
2
- * Creates a cookie with the value 'token|hash',
3
- * where 'token' is the CSRF token and 'hash' is a hash made of the token and
4
- * the secret, and the two values are joined by a pipe '|'. By storing the
5
- * value and the hash of the value (with the secret used as a salt) we can
6
- * verify the cookie was set by the server and not by a malicious attacker.
7
- *
8
- * For more details, see the following OWASP links:
9
- * https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie
10
- * https://owasp.org/www-chapter-london/assets/slides/David_Johansson-Double_Defeat_of_Double-Submit_Cookie.pdf
11
- */
12
- export async function createCSRFToken(cookieValue) {
13
- /**
14
- * If there is a CSRF token cookie, we verify it
15
- */
16
- if (cookieValue) {
17
- /**
18
- * Split the cookie value into the token and the hash
19
- */
20
- const [csrfToken, csrfTokenHash] = cookieValue.split('|');
21
- if (csrfToken && csrfTokenHash) {
22
- /**
23
- * Create a hash of the CSRF token and the secret
24
- */
25
- const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
26
- /**
27
- * If hash matches then we trust the CSRF token value
28
- */
29
- if (csrfTokenHash === expectedCsrfTokenHash) {
30
- return { csrfToken };
31
- }
32
- }
33
- }
34
- /**
35
- * If this line is reached, then the CSRF token is not verified and we need to create a new one
36
- */
37
- const csrfToken = randomString(32);
38
- const csrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
39
- const cookie = `${csrfToken}|${csrfTokenHash}`;
40
- /**
41
- * Return the cookie and the CSRF token value
42
- */
43
- return { cookie, csrfToken };
44
- }
45
- /**
46
- * This function is used to validate the CSRF token in POST, PUT, DELETE requests (or any request that changes data)
47
- * @param cookieValue
48
- * @param bodyValue
49
- */
50
- export async function validateCSRFToken({ cookieValue, bodyValue }) {
51
- if (cookieValue) {
52
- const [csrfToken, csrfTokenHash] = cookieValue.split('|');
53
- const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
54
- if (csrfTokenHash === expectedCsrfTokenHash) {
55
- // If hash matches then we trust the CSRF token value
56
- // If this is a POST request and the CSRF Token in the POST request matches
57
- // the cookie we have already verified is the one we have set, then the token is verified!
58
- return csrfToken === bodyValue;
59
- }
60
- }
61
- return false;
62
- }
63
- export function randomString(size) {
64
- const i2hex = (i) => ('0' + i.toString(16)).slice(-2);
65
- const r = (a, i) => a + i2hex(i);
66
- const bytes = crypto.getRandomValues(new Uint8Array(size));
67
- return Array.from(bytes).reduce(r, '');
68
- }
69
- export async function createHash(message) {
70
- const data = new TextEncoder().encode(message);
71
- const hash = await crypto.subtle.digest('SHA-256', data);
72
- return Array.from(new Uint8Array(hash))
73
- .map((b) => b.toString(16).padStart(2, '0'))
74
- .join('')
75
- .toString();
76
- }
1
+ /**
2
+ * Creates a cookie with the value 'token|hash',
3
+ * where 'token' is the CSRF token and 'hash' is a hash made of the token and
4
+ * the secret, and the two values are joined by a pipe '|'. By storing the
5
+ * value and the hash of the value (with the secret used as a salt) we can
6
+ * verify the cookie was set by the server and not by a malicious attacker.
7
+ *
8
+ * For more details, see the following OWASP links:
9
+ * https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie
10
+ * https://owasp.org/www-chapter-london/assets/slides/David_Johansson-Double_Defeat_of_Double-Submit_Cookie.pdf
11
+ */
12
+ export async function createCSRFToken(cookieValue) {
13
+ /**
14
+ * If there is a CSRF token cookie, we verify it
15
+ */
16
+ if (cookieValue) {
17
+ /**
18
+ * Split the cookie value into the token and the hash
19
+ */
20
+ const [csrfToken, csrfTokenHash] = cookieValue.split('|');
21
+ if (csrfToken && csrfTokenHash) {
22
+ /**
23
+ * Create a hash of the CSRF token and the secret
24
+ */
25
+ const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
26
+ /**
27
+ * If hash matches then we trust the CSRF token value
28
+ */
29
+ if (csrfTokenHash === expectedCsrfTokenHash) {
30
+ return { csrfToken };
31
+ }
32
+ }
33
+ }
34
+ /**
35
+ * If this line is reached, then the CSRF token is not verified and we need to create a new one
36
+ */
37
+ const csrfToken = randomString(32);
38
+ const csrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
39
+ const cookie = `${csrfToken}|${csrfTokenHash}`;
40
+ /**
41
+ * Return the cookie and the CSRF token value
42
+ */
43
+ return { cookie, csrfToken };
44
+ }
45
+ /**
46
+ * This function is used to validate the CSRF token in POST, PUT, DELETE requests (or any request that changes data)
47
+ * @param cookieValue
48
+ * @param bodyValue
49
+ */
50
+ export async function validateCSRFToken({ cookieValue, bodyValue }) {
51
+ if (cookieValue) {
52
+ const [csrfToken, csrfTokenHash] = cookieValue.split('|');
53
+ const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
54
+ if (csrfTokenHash === expectedCsrfTokenHash) {
55
+ // If hash matches then we trust the CSRF token value
56
+ // If this is a POST request and the CSRF Token in the POST request matches
57
+ // the cookie we have already verified is the one we have set, then the token is verified!
58
+ return csrfToken === bodyValue;
59
+ }
60
+ }
61
+ return false;
62
+ }
63
+ export function randomString(size) {
64
+ const i2hex = (i) => ('0' + i.toString(16)).slice(-2);
65
+ const r = (a, i) => a + i2hex(i);
66
+ const bytes = crypto.getRandomValues(new Uint8Array(size));
67
+ return Array.from(bytes).reduce(r, '');
68
+ }
69
+ export async function createHash(message) {
70
+ const data = new TextEncoder().encode(message);
71
+ const hash = await crypto.subtle.digest('SHA-256', data);
72
+ return Array.from(new Uint8Array(hash))
73
+ .map((b) => b.toString(16).padStart(2, '0'))
74
+ .join('')
75
+ .toString();
76
+ }
@@ -1,4 +1,4 @@
1
- import useAxiosPrivate from "./useAxiosPrivate.js";
2
- import useRefreshToken from "./useRefreshToken.js";
3
- export { useAxiosPrivate, useRefreshToken };
1
+ import useAxiosPrivate from './useAxiosPrivate.js';
2
+ import useRefreshToken from './useRefreshToken.js';
3
+ export { useAxiosPrivate, useRefreshToken };
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,sBAAsB,CAAA;AAClD,OAAO,eAAe,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA"}
@@ -1,3 +1,3 @@
1
- import useAxiosPrivate from "./useAxiosPrivate.js";
2
- import useRefreshToken from "./useRefreshToken.js";
3
- export { useAxiosPrivate, useRefreshToken };
1
+ import useAxiosPrivate from './useAxiosPrivate.js';
2
+ import useRefreshToken from './useRefreshToken.js';
3
+ export { useAxiosPrivate, useRefreshToken };
@@ -1,5 +1,5 @@
1
- declare const useAxiosPrivate: (options?: {
2
- refreshTokenOn?: 401 | 404;
3
- }) => import("axios").AxiosInstance;
4
- export default useAxiosPrivate;
1
+ declare const useAxiosPrivate: (options?: {
2
+ refreshTokenOn?: 401 | 404;
3
+ }) => import("axios").AxiosInstance;
4
+ export default useAxiosPrivate;
5
5
  //# sourceMappingURL=useAxiosPrivate.d.ts.map
@@ -1,74 +1,74 @@
1
- import { axiosPrivate } from "../axios/axiosInstance.js";
2
- import { useEffect } from 'react';
3
- import useRefreshToken from "./useRefreshToken.js";
4
- import axios from 'axios';
5
- import { getCsrfToken } from "../react.js";
6
- const useAxiosPrivate = (options) => {
7
- const refresh = useRefreshToken();
8
- const { refreshTokenOn = 401 } = options || {};
9
- useEffect(() => {
10
- /**
11
- * Add a request interceptor
12
- */
13
- const requestIntercept = axiosPrivate.interceptors.request.use(
14
- /**
15
- * Do something before request is sent
16
- * @param config The request config object
17
- */
18
- async (config) => {
19
- if (config.method && ['post', 'put', 'delete'].includes(config.method.toLowerCase())) {
20
- /**
21
- * If the request is a POST, PUT, or DELETE request, the XSRF-TOKEN header is added to the request.
22
- */
23
- config.headers['x-csrf-token'] = await getCsrfToken();
24
- }
25
- /**
26
- * Return the config object
27
- */
28
- return config;
29
- }, (error) => Promise.reject(error));
30
- /**
31
- * This is the response interceptor
32
- */
33
- const responseIntercept = axiosPrivate.interceptors.response.use((response) => response, // Do nothing if the request is successful,
34
- async (error) => {
35
- // If the access token has expired, refresh it and retry the request
36
- const prevRequest = error?.config; // The request that caused the error (the one that returned 401) is saved in the error object
37
- if (error?.response?.status === refreshTokenOn && !prevRequest?.sent) {
38
- // If the error is 401 and the request hasn't been sent before
39
- prevRequest.sent = true; // Prevent infinite loops
40
- const refreshStatus = await refresh(); // Refresh the access token cookie
41
- if (refreshStatus === false)
42
- return Promise.reject(error); // If the refresh failed, reject the promise
43
- // NOTICE: This is needed to send the request as multipart form data,
44
- // because resending the request with axios resets the Content-Type to application/json for some reason
45
- // Use transformRequest to set Content-Type and include boundary for multipart form data
46
- prevRequest.headers['Content-Type'] = 'multipart/form-data';
47
- prevRequest.transformRequest = [
48
- (data, headers) => {
49
- // If the request data is FormData, set the boundary
50
- if (data instanceof FormData) {
51
- // @ts-ignore
52
- headers['Content-Type'] += `; boundary=${data._boundary}`;
53
- }
54
- return data;
55
- },
56
- ...axios.defaults.transformRequest, // Keep the default transformRequest functions
57
- ];
58
- return axiosPrivate(prevRequest); // The request that returned 401 is retried with the new access token
59
- }
60
- return Promise.reject(error);
61
- });
62
- // Remove the interceptors when the component unmounts
63
- // This is needed to prevent memory leaks
64
- return () => {
65
- // Eject the interceptors
66
- axiosPrivate.interceptors.request.eject(requestIntercept);
67
- axiosPrivate.interceptors.response.eject(responseIntercept);
68
- };
69
- }, [
70
- /*auth, refresh*/
71
- ]);
72
- return axiosPrivate;
73
- };
74
- export default useAxiosPrivate;
1
+ import { axiosPrivate } from '../axios/axiosInstance.js';
2
+ import { useEffect } from 'react';
3
+ import useRefreshToken from './useRefreshToken.js';
4
+ import axios from 'axios';
5
+ import { getCsrfToken } from '../react.js';
6
+ const useAxiosPrivate = (options) => {
7
+ const refresh = useRefreshToken();
8
+ const { refreshTokenOn = 401 } = options || {};
9
+ useEffect(() => {
10
+ /**
11
+ * Add a request interceptor
12
+ */
13
+ const requestIntercept = axiosPrivate.interceptors.request.use(
14
+ /**
15
+ * Do something before request is sent
16
+ * @param config The request config object
17
+ */
18
+ async (config) => {
19
+ if (config.method && ['post', 'put', 'delete'].includes(config.method.toLowerCase())) {
20
+ /**
21
+ * If the request is a POST, PUT, or DELETE request, the XSRF-TOKEN header is added to the request.
22
+ */
23
+ config.headers['x-csrf-token'] = await getCsrfToken();
24
+ }
25
+ /**
26
+ * Return the config object
27
+ */
28
+ return config;
29
+ }, (error) => Promise.reject(error));
30
+ /**
31
+ * This is the response interceptor
32
+ */
33
+ const responseIntercept = axiosPrivate.interceptors.response.use((response) => response, // Do nothing if the request is successful,
34
+ async (error) => {
35
+ // If the access token has expired, refresh it and retry the request
36
+ const prevRequest = error?.config; // The request that caused the error (the one that returned 401) is saved in the error object
37
+ if (error?.response?.status === refreshTokenOn && !prevRequest?.sent) {
38
+ // If the error is 401 and the request hasn't been sent before
39
+ prevRequest.sent = true; // Prevent infinite loops
40
+ const refreshStatus = await refresh(); // Refresh the access token cookie
41
+ if (refreshStatus === false)
42
+ return Promise.reject(error); // If the refresh failed, reject the promise
43
+ // NOTICE: This is needed to send the request as multipart form data,
44
+ // because resending the request with axios resets the Content-Type to application/json for some reason
45
+ // Use transformRequest to set Content-Type and include boundary for multipart form data
46
+ prevRequest.headers['Content-Type'] = 'multipart/form-data';
47
+ prevRequest.transformRequest = [
48
+ (data, headers) => {
49
+ // If the request data is FormData, set the boundary
50
+ if (data instanceof FormData) {
51
+ // @ts-ignore
52
+ headers['Content-Type'] += `; boundary=${data._boundary}`;
53
+ }
54
+ return data;
55
+ },
56
+ ...axios.defaults.transformRequest, // Keep the default transformRequest functions
57
+ ];
58
+ return axiosPrivate(prevRequest); // The request that returned 401 is retried with the new access token
59
+ }
60
+ return Promise.reject(error);
61
+ });
62
+ // Remove the interceptors when the component unmounts
63
+ // This is needed to prevent memory leaks
64
+ return () => {
65
+ // Eject the interceptors
66
+ axiosPrivate.interceptors.request.eject(requestIntercept);
67
+ axiosPrivate.interceptors.response.eject(responseIntercept);
68
+ };
69
+ }, [
70
+ /*auth, refresh*/
71
+ ]);
72
+ return axiosPrivate;
73
+ };
74
+ export default useAxiosPrivate;
@@ -1,7 +1,7 @@
1
- /**
2
- * This hook is used to refresh the access token when it expires.
3
- * It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
4
- */
5
- declare const useRefreshToken: () => () => Promise<unknown>;
6
- export default useRefreshToken;
1
+ /**
2
+ * This hook is used to refresh the access token when it expires.
3
+ * It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
4
+ */
5
+ declare const useRefreshToken: () => () => Promise<unknown>;
6
+ export default useRefreshToken;
7
7
  //# sourceMappingURL=useRefreshToken.d.ts.map
@@ -1,79 +1,79 @@
1
- import { logout, refreshSession } from "../react.js";
2
- /**
3
- * This hook is used to refresh the access token when it expires.
4
- * It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
5
- */
6
- const useRefreshToken = () => {
7
- let isRefreshing = false; // Is a refresh request being sent?
8
- let failedQueue = []; // An array of requests that failed because of 401
9
- const processQueue = (error, token = null) => {
10
- failedQueue.forEach((prom) => {
11
- if (error) {
12
- prom.reject(error);
13
- }
14
- else {
15
- prom.resolve(token);
16
- }
17
- });
18
- failedQueue = [];
19
- };
20
- const refresh = async () => {
21
- try {
22
- const response = await fetch('/api/auth/refresh');
23
- const data = await response.json();
24
- /**
25
- * The refresh request is done
26
- */
27
- isRefreshing = false;
28
- if (response.status !== 200) {
29
- /**
30
- * If the refresh token is invalid, we log out the user
31
- */
32
- await logout({
33
- /**
34
- * No need to delete the cookies, because they are both invalid.
35
- */
36
- deleteCookies: false,
37
- });
38
- return false;
39
- }
40
- else {
41
- /**
42
- * update the session
43
- */
44
- await refreshSession();
45
- }
46
- /**
47
- * Process the failed requests
48
- */
49
- processQueue(null, data?.accessToken);
50
- return true;
51
- }
52
- catch (error) {
53
- /**
54
- * If the refresh token is invalid, we log out the user
55
- */
56
- await logout({
57
- /**
58
- * No need to delete the cookies, because they are both invalid.
59
- */
60
- deleteCookies: false,
61
- });
62
- return false;
63
- }
64
- };
65
- // TODO: Apply this inside useAxiosPrivate.tsx to prevent even the 401 errors from happening
66
- // Let's use semaphores to prevent multiple refreshes at the same time
67
- return async () => {
68
- if (isRefreshing) {
69
- // If a refresh request is being sent, we return a promise
70
- // that will be resolved when the refresh request is done
71
- return new Promise((resolve, reject) => {
72
- failedQueue.push({ resolve, reject });
73
- });
74
- }
75
- isRefreshing = true; // A refresh request is being sent
76
- return await refresh(); // Send the refresh request and return the new access token
77
- };
78
- };
79
- export default useRefreshToken;
1
+ import { logout, refreshSession } from '../react.js';
2
+ /**
3
+ * This hook is used to refresh the access token when it expires.
4
+ * It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
5
+ */
6
+ const useRefreshToken = () => {
7
+ let isRefreshing = false; // Is a refresh request being sent?
8
+ let failedQueue = []; // An array of requests that failed because of 401
9
+ const processQueue = (error, token = null) => {
10
+ failedQueue.forEach((prom) => {
11
+ if (error) {
12
+ prom.reject(error);
13
+ }
14
+ else {
15
+ prom.resolve(token);
16
+ }
17
+ });
18
+ failedQueue = [];
19
+ };
20
+ const refresh = async () => {
21
+ try {
22
+ const response = await fetch('/api/auth/refresh');
23
+ const data = await response.json();
24
+ /**
25
+ * The refresh request is done
26
+ */
27
+ isRefreshing = false;
28
+ if (response.status !== 200) {
29
+ /**
30
+ * If the refresh token is invalid, we log out the user
31
+ */
32
+ await logout({
33
+ /**
34
+ * No need to delete the cookies, because they are both invalid.
35
+ */
36
+ deleteCookies: false,
37
+ });
38
+ return false;
39
+ }
40
+ else {
41
+ /**
42
+ * update the session
43
+ */
44
+ await refreshSession();
45
+ }
46
+ /**
47
+ * Process the failed requests
48
+ */
49
+ processQueue(null, data?.accessToken);
50
+ return true;
51
+ }
52
+ catch (error) {
53
+ /**
54
+ * If the refresh token is invalid, we log out the user
55
+ */
56
+ await logout({
57
+ /**
58
+ * No need to delete the cookies, because they are both invalid.
59
+ */
60
+ deleteCookies: false,
61
+ });
62
+ return false;
63
+ }
64
+ };
65
+ // TODO: Apply this inside useAxiosPrivate.tsx to prevent even the 401 errors from happening
66
+ // Let's use semaphores to prevent multiple refreshes at the same time
67
+ return async () => {
68
+ if (isRefreshing) {
69
+ // If a refresh request is being sent, we return a promise
70
+ // that will be resolved when the refresh request is done
71
+ return new Promise((resolve, reject) => {
72
+ failedQueue.push({ resolve, reject });
73
+ });
74
+ }
75
+ isRefreshing = true; // A refresh request is being sent
76
+ return await refresh(); // Send the refresh request and return the new access token
77
+ };
78
+ };
79
+ export default useRefreshToken;
@@ -1,23 +1,23 @@
1
- export interface Session {
2
- user: User;
3
- }
4
- export interface User {
5
- id: string;
6
- name: string;
7
- locale?: string | null;
8
- email?: string | null;
9
- image?: string | null;
10
- }
11
- /**
12
- * Internal function to get the auth session
13
- */
14
- declare function __auth__internal(): Promise<Session | null>;
15
- /**
16
- * Cache the auth session to avoid unnecessary requests per a single server request.
17
- */
18
- declare const auth: typeof __auth__internal;
19
- /**
20
- * Export the auth function
21
- */
22
- export default auth;
1
+ export interface Session {
2
+ user: User;
3
+ }
4
+ export interface User {
5
+ id: string;
6
+ name: string;
7
+ locale?: string | null;
8
+ email?: string | null;
9
+ image?: string | null;
10
+ }
11
+ /**
12
+ * Internal function to get the auth session
13
+ */
14
+ declare function __auth__internal(): Promise<Session | null>;
15
+ /**
16
+ * Cache the auth session to avoid unnecessary requests per a single server request.
17
+ */
18
+ declare const auth: typeof __auth__internal;
19
+ /**
20
+ * Export the auth function
21
+ */
22
+ export default auth;
23
23
  //# sourceMappingURL=index.d.ts.map
@@ -1,44 +1,44 @@
1
- import { decodeJWT } from "./jwt.js";
2
- import { cookies } from 'next/headers';
3
- import { cache } from 'react';
4
- /**
5
- * Get the authenticated user from the access token
6
- * @param accessToken
7
- */
8
- const getAuthedUser = (accessToken) => {
9
- if (!accessToken)
10
- return null;
11
- try {
12
- return decodeJWT(accessToken);
13
- }
14
- catch (err) {
15
- return null;
16
- }
17
- };
18
- /**
19
- * Internal function to get the auth session
20
- */
21
- async function __auth__internal() {
22
- const cookieJar = await cookies();
23
- const jwt = getAuthedUser(cookieJar.get('access_token')?.value);
24
- if (jwt) {
25
- return {
26
- user: {
27
- id: jwt.id,
28
- name: jwt.sub,
29
- locale: jwt.locale,
30
- },
31
- };
32
- }
33
- else {
34
- return null;
35
- }
36
- }
37
- /**
38
- * Cache the auth session to avoid unnecessary requests per a single server request.
39
- */
40
- const auth = cache(__auth__internal);
41
- /**
42
- * Export the auth function
43
- */
44
- export default auth;
1
+ import { decodeJWT } from './jwt.js';
2
+ import { cookies } from 'next/headers';
3
+ import { cache } from 'react';
4
+ /**
5
+ * Get the authenticated user from the access token
6
+ * @param accessToken
7
+ */
8
+ const getAuthedUser = (accessToken) => {
9
+ if (!accessToken)
10
+ return null;
11
+ try {
12
+ return decodeJWT(accessToken);
13
+ }
14
+ catch (err) {
15
+ return null;
16
+ }
17
+ };
18
+ /**
19
+ * Internal function to get the auth session
20
+ */
21
+ async function __auth__internal() {
22
+ const cookieJar = await cookies();
23
+ const jwt = getAuthedUser(cookieJar.get('access_token')?.value);
24
+ if (jwt) {
25
+ return {
26
+ user: {
27
+ id: jwt.id,
28
+ name: jwt.sub,
29
+ locale: jwt.locale,
30
+ },
31
+ };
32
+ }
33
+ else {
34
+ return null;
35
+ }
36
+ }
37
+ /**
38
+ * Cache the auth session to avoid unnecessary requests per a single server request.
39
+ */
40
+ const auth = cache(__auth__internal);
41
+ /**
42
+ * Export the auth function
43
+ */
44
+ export default auth;