@intlayer/api 9.6.0 → 9.7.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.
Files changed (177) hide show
  1. package/dist/cjs/distantDictionary/fetchDistantDictionaries.cjs.map +1 -1
  2. package/dist/cjs/distantDictionary/fetchDistantDictionary.cjs.map +1 -1
  3. package/dist/cjs/fetcher.cjs.map +1 -1
  4. package/dist/cjs/getIntlayerAPI/ai.cjs +76 -22
  5. package/dist/cjs/getIntlayerAPI/ai.cjs.map +1 -1
  6. package/dist/cjs/getIntlayerAPI/analytics.cjs +44 -10
  7. package/dist/cjs/getIntlayerAPI/analytics.cjs.map +1 -1
  8. package/dist/cjs/getIntlayerAPI/asset.cjs +38 -8
  9. package/dist/cjs/getIntlayerAPI/asset.cjs.map +1 -1
  10. package/dist/cjs/getIntlayerAPI/audit.cjs +70 -16
  11. package/dist/cjs/getIntlayerAPI/audit.cjs.map +1 -1
  12. package/dist/cjs/getIntlayerAPI/bitbucket.cjs +39 -9
  13. package/dist/cjs/getIntlayerAPI/bitbucket.cjs.map +1 -1
  14. package/dist/cjs/getIntlayerAPI/codeberg.cjs +21 -0
  15. package/dist/cjs/getIntlayerAPI/codeberg.cjs.map +1 -0
  16. package/dist/cjs/getIntlayerAPI/dictionary.cjs +59 -13
  17. package/dist/cjs/getIntlayerAPI/dictionary.cjs.map +1 -1
  18. package/dist/cjs/getIntlayerAPI/editor.cjs.map +1 -1
  19. package/dist/cjs/getIntlayerAPI/environment.cjs +44 -10
  20. package/dist/cjs/getIntlayerAPI/environment.cjs.map +1 -1
  21. package/dist/cjs/getIntlayerAPI/forge.cjs +64 -0
  22. package/dist/cjs/getIntlayerAPI/forge.cjs.map +1 -0
  23. package/dist/cjs/getIntlayerAPI/gitee.cjs +21 -0
  24. package/dist/cjs/getIntlayerAPI/gitee.cjs.map +1 -0
  25. package/dist/cjs/getIntlayerAPI/github.cjs +44 -10
  26. package/dist/cjs/getIntlayerAPI/github.cjs.map +1 -1
  27. package/dist/cjs/getIntlayerAPI/gitlab.cjs +39 -9
  28. package/dist/cjs/getIntlayerAPI/gitlab.cjs.map +1 -1
  29. package/dist/cjs/getIntlayerAPI/index.cjs +4 -0
  30. package/dist/cjs/getIntlayerAPI/index.cjs.map +1 -1
  31. package/dist/cjs/getIntlayerAPI/newsletter.cjs +28 -6
  32. package/dist/cjs/getIntlayerAPI/newsletter.cjs.map +1 -1
  33. package/dist/cjs/getIntlayerAPI/oAuth.cjs +31 -5
  34. package/dist/cjs/getIntlayerAPI/oAuth.cjs.map +1 -1
  35. package/dist/cjs/getIntlayerAPI/organization.cjs +72 -20
  36. package/dist/cjs/getIntlayerAPI/organization.cjs.map +1 -1
  37. package/dist/cjs/getIntlayerAPI/project.cjs +112 -29
  38. package/dist/cjs/getIntlayerAPI/project.cjs.map +1 -1
  39. package/dist/cjs/getIntlayerAPI/reviewer.cjs +142 -31
  40. package/dist/cjs/getIntlayerAPI/reviewer.cjs.map +1 -1
  41. package/dist/cjs/getIntlayerAPI/search.cjs +15 -3
  42. package/dist/cjs/getIntlayerAPI/search.cjs.map +1 -1
  43. package/dist/cjs/getIntlayerAPI/showcaseProject.cjs +61 -15
  44. package/dist/cjs/getIntlayerAPI/showcaseProject.cjs.map +1 -1
  45. package/dist/cjs/getIntlayerAPI/status.cjs +16 -3
  46. package/dist/cjs/getIntlayerAPI/status.cjs.map +1 -1
  47. package/dist/cjs/getIntlayerAPI/stripe.cjs +141 -35
  48. package/dist/cjs/getIntlayerAPI/stripe.cjs.map +1 -1
  49. package/dist/cjs/getIntlayerAPI/tag.cjs +33 -7
  50. package/dist/cjs/getIntlayerAPI/tag.cjs.map +1 -1
  51. package/dist/cjs/getIntlayerAPI/translate.cjs +46 -8
  52. package/dist/cjs/getIntlayerAPI/translate.cjs.map +1 -1
  53. package/dist/cjs/getIntlayerAPI/user.cjs +58 -14
  54. package/dist/cjs/getIntlayerAPI/user.cjs.map +1 -1
  55. package/dist/cjs/index.cjs +8 -0
  56. package/dist/cjs/proxy.cjs +4 -0
  57. package/dist/cjs/proxy.cjs.map +1 -1
  58. package/dist/cjs/public/createPublicClient.cjs +25 -5
  59. package/dist/cjs/public/createPublicClient.cjs.map +1 -1
  60. package/dist/esm/distantDictionary/fetchDistantDictionaries.mjs.map +1 -1
  61. package/dist/esm/distantDictionary/fetchDistantDictionary.mjs.map +1 -1
  62. package/dist/esm/fetcher.mjs.map +1 -1
  63. package/dist/esm/getIntlayerAPI/ai.mjs +76 -22
  64. package/dist/esm/getIntlayerAPI/ai.mjs.map +1 -1
  65. package/dist/esm/getIntlayerAPI/analytics.mjs +44 -10
  66. package/dist/esm/getIntlayerAPI/analytics.mjs.map +1 -1
  67. package/dist/esm/getIntlayerAPI/asset.mjs +38 -8
  68. package/dist/esm/getIntlayerAPI/asset.mjs.map +1 -1
  69. package/dist/esm/getIntlayerAPI/audit.mjs +70 -16
  70. package/dist/esm/getIntlayerAPI/audit.mjs.map +1 -1
  71. package/dist/esm/getIntlayerAPI/bitbucket.mjs +39 -9
  72. package/dist/esm/getIntlayerAPI/bitbucket.mjs.map +1 -1
  73. package/dist/esm/getIntlayerAPI/codeberg.mjs +19 -0
  74. package/dist/esm/getIntlayerAPI/codeberg.mjs.map +1 -0
  75. package/dist/esm/getIntlayerAPI/dictionary.mjs +59 -13
  76. package/dist/esm/getIntlayerAPI/dictionary.mjs.map +1 -1
  77. package/dist/esm/getIntlayerAPI/editor.mjs.map +1 -1
  78. package/dist/esm/getIntlayerAPI/environment.mjs +44 -10
  79. package/dist/esm/getIntlayerAPI/environment.mjs.map +1 -1
  80. package/dist/esm/getIntlayerAPI/forge.mjs +63 -0
  81. package/dist/esm/getIntlayerAPI/forge.mjs.map +1 -0
  82. package/dist/esm/getIntlayerAPI/gitee.mjs +19 -0
  83. package/dist/esm/getIntlayerAPI/gitee.mjs.map +1 -0
  84. package/dist/esm/getIntlayerAPI/github.mjs +44 -10
  85. package/dist/esm/getIntlayerAPI/github.mjs.map +1 -1
  86. package/dist/esm/getIntlayerAPI/gitlab.mjs +39 -9
  87. package/dist/esm/getIntlayerAPI/gitlab.mjs.map +1 -1
  88. package/dist/esm/getIntlayerAPI/index.mjs +4 -0
  89. package/dist/esm/getIntlayerAPI/index.mjs.map +1 -1
  90. package/dist/esm/getIntlayerAPI/newsletter.mjs +28 -6
  91. package/dist/esm/getIntlayerAPI/newsletter.mjs.map +1 -1
  92. package/dist/esm/getIntlayerAPI/oAuth.mjs +31 -5
  93. package/dist/esm/getIntlayerAPI/oAuth.mjs.map +1 -1
  94. package/dist/esm/getIntlayerAPI/organization.mjs +72 -20
  95. package/dist/esm/getIntlayerAPI/organization.mjs.map +1 -1
  96. package/dist/esm/getIntlayerAPI/project.mjs +112 -29
  97. package/dist/esm/getIntlayerAPI/project.mjs.map +1 -1
  98. package/dist/esm/getIntlayerAPI/reviewer.mjs +142 -31
  99. package/dist/esm/getIntlayerAPI/reviewer.mjs.map +1 -1
  100. package/dist/esm/getIntlayerAPI/search.mjs +15 -3
  101. package/dist/esm/getIntlayerAPI/search.mjs.map +1 -1
  102. package/dist/esm/getIntlayerAPI/showcaseProject.mjs +61 -15
  103. package/dist/esm/getIntlayerAPI/showcaseProject.mjs.map +1 -1
  104. package/dist/esm/getIntlayerAPI/status.mjs +16 -3
  105. package/dist/esm/getIntlayerAPI/status.mjs.map +1 -1
  106. package/dist/esm/getIntlayerAPI/stripe.mjs +141 -35
  107. package/dist/esm/getIntlayerAPI/stripe.mjs.map +1 -1
  108. package/dist/esm/getIntlayerAPI/tag.mjs +33 -7
  109. package/dist/esm/getIntlayerAPI/tag.mjs.map +1 -1
  110. package/dist/esm/getIntlayerAPI/translate.mjs +46 -8
  111. package/dist/esm/getIntlayerAPI/translate.mjs.map +1 -1
  112. package/dist/esm/getIntlayerAPI/user.mjs +58 -14
  113. package/dist/esm/getIntlayerAPI/user.mjs.map +1 -1
  114. package/dist/esm/index.mjs +4 -1
  115. package/dist/esm/proxy.mjs +4 -0
  116. package/dist/esm/proxy.mjs.map +1 -1
  117. package/dist/esm/public/createPublicClient.mjs +25 -5
  118. package/dist/esm/public/createPublicClient.mjs.map +1 -1
  119. package/dist/types/distantDictionary/fetchDistantDictionaries.d.ts +1 -1
  120. package/dist/types/distantDictionary/fetchDistantDictionary.d.ts +1 -1
  121. package/dist/types/fetcher.d.ts +1 -1
  122. package/dist/types/fetcher.d.ts.map +1 -1
  123. package/dist/types/getIntlayerAPI/ai.d.ts +1 -1
  124. package/dist/types/getIntlayerAPI/ai.d.ts.map +1 -1
  125. package/dist/types/getIntlayerAPI/analytics.d.ts +1 -1
  126. package/dist/types/getIntlayerAPI/analytics.d.ts.map +1 -1
  127. package/dist/types/getIntlayerAPI/asset.d.ts +1 -0
  128. package/dist/types/getIntlayerAPI/asset.d.ts.map +1 -1
  129. package/dist/types/getIntlayerAPI/audit.d.ts +47 -3
  130. package/dist/types/getIntlayerAPI/audit.d.ts.map +1 -1
  131. package/dist/types/getIntlayerAPI/bitbucket.d.ts.map +1 -1
  132. package/dist/types/getIntlayerAPI/codeberg.d.ts +23 -0
  133. package/dist/types/getIntlayerAPI/codeberg.d.ts.map +1 -0
  134. package/dist/types/getIntlayerAPI/dictionary.d.ts +1 -1
  135. package/dist/types/getIntlayerAPI/dictionary.d.ts.map +1 -1
  136. package/dist/types/getIntlayerAPI/editor.d.ts +2 -1
  137. package/dist/types/getIntlayerAPI/editor.d.ts.map +1 -1
  138. package/dist/types/getIntlayerAPI/environment.d.ts +1 -1
  139. package/dist/types/getIntlayerAPI/environment.d.ts.map +1 -1
  140. package/dist/types/getIntlayerAPI/forge.d.ts +17 -0
  141. package/dist/types/getIntlayerAPI/forge.d.ts.map +1 -0
  142. package/dist/types/getIntlayerAPI/gitee.d.ts +23 -0
  143. package/dist/types/getIntlayerAPI/gitee.d.ts.map +1 -0
  144. package/dist/types/getIntlayerAPI/github.d.ts.map +1 -1
  145. package/dist/types/getIntlayerAPI/gitlab.d.ts.map +1 -1
  146. package/dist/types/getIntlayerAPI/index.d.ts +4 -0
  147. package/dist/types/getIntlayerAPI/index.d.ts.map +1 -1
  148. package/dist/types/getIntlayerAPI/newsletter.d.ts +1 -1
  149. package/dist/types/getIntlayerAPI/newsletter.d.ts.map +1 -1
  150. package/dist/types/getIntlayerAPI/oAuth.d.ts +2 -0
  151. package/dist/types/getIntlayerAPI/oAuth.d.ts.map +1 -1
  152. package/dist/types/getIntlayerAPI/organization.d.ts +1 -3
  153. package/dist/types/getIntlayerAPI/organization.d.ts.map +1 -1
  154. package/dist/types/getIntlayerAPI/project.d.ts +2 -1
  155. package/dist/types/getIntlayerAPI/project.d.ts.map +1 -1
  156. package/dist/types/getIntlayerAPI/reviewer.d.ts +680 -35
  157. package/dist/types/getIntlayerAPI/reviewer.d.ts.map +1 -1
  158. package/dist/types/getIntlayerAPI/search.d.ts +1 -1
  159. package/dist/types/getIntlayerAPI/search.d.ts.map +1 -1
  160. package/dist/types/getIntlayerAPI/showcaseProject.d.ts +1 -1
  161. package/dist/types/getIntlayerAPI/showcaseProject.d.ts.map +1 -1
  162. package/dist/types/getIntlayerAPI/status.d.ts +3 -4
  163. package/dist/types/getIntlayerAPI/status.d.ts.map +1 -1
  164. package/dist/types/getIntlayerAPI/stripe.d.ts +1 -1
  165. package/dist/types/getIntlayerAPI/stripe.d.ts.map +1 -1
  166. package/dist/types/getIntlayerAPI/tag.d.ts +1 -1
  167. package/dist/types/getIntlayerAPI/tag.d.ts.map +1 -1
  168. package/dist/types/getIntlayerAPI/translate.d.ts +1 -1
  169. package/dist/types/getIntlayerAPI/translate.d.ts.map +1 -1
  170. package/dist/types/getIntlayerAPI/user.d.ts +4 -4
  171. package/dist/types/getIntlayerAPI/user.d.ts.map +1 -1
  172. package/dist/types/index.d.ts +7 -4
  173. package/dist/types/proxy.d.ts.map +1 -1
  174. package/dist/types/public/createPublicClient.d.ts +1 -7
  175. package/dist/types/public/createPublicClient.d.ts.map +1 -1
  176. package/dist/types/types.d.ts +5 -2
  177. package/package.json +20 -3
@@ -1,10 +1,120 @@
1
1
  import { fetcher } from "../fetcher.mjs";
2
2
  import { createEndpoint } from "../cms/createIntlayerCMS.mjs";
3
3
  import { editor } from "@intlayer/config/built";
4
+ import { buildRouteURL } from "@intlayer/backend-contract/defineRoute";
5
+ import { BACKEND_URL } from "@intlayer/config/defaultValues";
4
6
 
5
7
  //#region src/getIntlayerAPI/reviewer.ts
8
+ /** Prefix of the routes, checked against the backend contract. */
9
+ const reviewerGroup = { prefix: "/api/reviewer" };
10
+ /**
11
+ * Method and path of every route, checked against the backend contract at
12
+ * compile time (the contract's zod schemas are never loaded).
13
+ */
14
+ const reviewerEndpoints = {
15
+ getMarketplace: {
16
+ method: "GET",
17
+ path: "/marketplace"
18
+ },
19
+ getPriceDistribution: {
20
+ method: "GET",
21
+ path: "/marketplace/price-distribution"
22
+ },
23
+ getMyReviewerProfile: {
24
+ method: "GET",
25
+ path: "/me"
26
+ },
27
+ getReviewerReviews: {
28
+ method: "GET",
29
+ path: "/:reviewerId/reviews"
30
+ },
31
+ getReviewerById: {
32
+ method: "GET",
33
+ path: "/:reviewerId"
34
+ },
35
+ registerAsReviewer: {
36
+ method: "POST",
37
+ path: "/register"
38
+ },
39
+ updateReviewerProfile: {
40
+ method: "PUT",
41
+ path: "/"
42
+ },
43
+ deleteReviewerProfile: {
44
+ method: "DELETE",
45
+ path: "/"
46
+ },
47
+ uploadMainPicture: {
48
+ method: "POST",
49
+ path: "/me/picture/main"
50
+ },
51
+ uploadCoverPicture: {
52
+ method: "POST",
53
+ path: "/me/picture/cover"
54
+ },
55
+ estimateMission: {
56
+ method: "POST",
57
+ path: "/mission/estimate"
58
+ },
59
+ createMission: {
60
+ method: "POST",
61
+ path: "/mission"
62
+ },
63
+ getMyMissions: {
64
+ method: "GET",
65
+ path: "/mission"
66
+ },
67
+ getMissionById: {
68
+ method: "GET",
69
+ path: "/mission/:missionId"
70
+ },
71
+ updateMissionStatus: {
72
+ method: "PUT",
73
+ path: "/mission/:missionId/status"
74
+ },
75
+ submitReview: {
76
+ method: "POST",
77
+ path: "/mission/:missionId/review"
78
+ },
79
+ getChatHistory: {
80
+ method: "GET",
81
+ path: "/mission/:missionId/chat/history"
82
+ },
83
+ sendMessage: {
84
+ method: "POST",
85
+ path: "/mission/:missionId/chat"
86
+ },
87
+ chatSSE: {
88
+ method: "GET",
89
+ path: "/mission/:missionId/chat/stream"
90
+ },
91
+ createPaymentIntent: {
92
+ method: "POST",
93
+ path: "/mission/:missionId/payment/intent"
94
+ },
95
+ confirmPayment: {
96
+ method: "POST",
97
+ path: "/mission/:missionId/payment/confirm"
98
+ },
99
+ requestPayout: {
100
+ method: "POST",
101
+ path: "/payout"
102
+ },
103
+ contactReviewer: {
104
+ method: "POST",
105
+ path: "/:reviewerId/contact"
106
+ },
107
+ getAdminReviewers: {
108
+ method: "GET",
109
+ path: "/admin/reviewers"
110
+ },
111
+ validateReviewerProfile: {
112
+ method: "PUT",
113
+ path: "/:reviewerId/validate"
114
+ }
115
+ };
6
116
  const getReviewerAPI = (authAPIOptions = {}, intlayerConfig) => {
7
- const BASE = `${intlayerConfig?.editor?.backendURL ?? editor.backendURL}/api/reviewer`;
117
+ const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;
8
118
  const getMarketplace = (params = {}, otherOptions = {}) => {
9
119
  const searchParams = new URLSearchParams();
10
120
  for (const [key, value] of Object.entries(params)) {
@@ -15,7 +125,7 @@ const getReviewerAPI = (authAPIOptions = {}, intlayerConfig) => {
15
125
  else searchParams.append(key, String(value));
16
126
  }
17
127
  const query = searchParams.toString();
18
- return fetcher(`${BASE}/marketplace${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
128
+ return fetcher(`${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getMarketplace)}${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
19
129
  };
20
130
  const getPriceDistribution = (params = {}, otherOptions = {}) => {
21
131
  const searchParams = new URLSearchParams();
@@ -27,60 +137,61 @@ const getReviewerAPI = (authAPIOptions = {}, intlayerConfig) => {
27
137
  else searchParams.append(key, String(value));
28
138
  }
29
139
  const query = searchParams.toString();
30
- return fetcher(`${BASE}/marketplace/price-distribution${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
140
+ return fetcher(`${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getPriceDistribution)}${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
31
141
  };
32
- const getReviewerById = (reviewerId, otherOptions = {}) => fetcher(`${BASE}/${reviewerId}`, authAPIOptions, otherOptions, { method: "GET" });
142
+ const getReviewerById = (reviewerId, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getReviewerById, { reviewerId }), authAPIOptions, otherOptions, { method: reviewerEndpoints.getReviewerById.method });
33
143
  const getReviewerReviews = (reviewerId, params = {}, otherOptions = {}) => {
34
144
  const query = new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== void 0).map(([k, v]) => [k, String(v)]))).toString();
35
- return fetcher(`${BASE}/${reviewerId}/reviews${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
145
+ return fetcher(`${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getReviewerReviews, { reviewerId })}${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
36
146
  };
37
- const getMyReviewerProfile = (otherOptions = {}) => fetcher(`${BASE}/me`, authAPIOptions, otherOptions, { method: "GET" });
38
- const registerAsReviewer = (body, otherOptions = {}) => fetcher(`${BASE}/register`, authAPIOptions, otherOptions, {
39
- method: "POST",
147
+ const getMyReviewerProfile = (otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getMyReviewerProfile), authAPIOptions, otherOptions, { method: reviewerEndpoints.getMyReviewerProfile.method });
148
+ const registerAsReviewer = (body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.registerAsReviewer), authAPIOptions, otherOptions, {
149
+ method: reviewerEndpoints.registerAsReviewer.method,
40
150
  body
41
151
  });
42
- const updateReviewerProfile = (body, otherOptions = {}) => fetcher(`${BASE}/`, authAPIOptions, otherOptions, {
43
- method: "PUT",
152
+ const updateReviewerProfile = (body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.updateReviewerProfile), authAPIOptions, otherOptions, {
153
+ method: reviewerEndpoints.updateReviewerProfile.method,
44
154
  body
45
155
  });
46
- const deleteReviewerProfile = (otherOptions = {}) => fetcher(BASE, authAPIOptions, otherOptions, { method: "DELETE" });
47
- const contactReviewer = (reviewerId, body, otherOptions = {}) => fetcher(`${BASE}/${reviewerId}/contact`, authAPIOptions, otherOptions, {
48
- method: "POST",
156
+ const deleteReviewerProfile = (otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.deleteReviewerProfile), authAPIOptions, otherOptions, { method: reviewerEndpoints.deleteReviewerProfile.method });
157
+ const contactReviewer = (reviewerId, body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.contactReviewer, { reviewerId }), authAPIOptions, otherOptions, {
158
+ method: reviewerEndpoints.contactReviewer.method,
49
159
  body
50
160
  });
51
- const estimateMission = (body, otherOptions = {}) => fetcher(`${BASE}/mission/estimate`, authAPIOptions, otherOptions, {
52
- method: "POST",
161
+ const estimateMission = (body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.estimateMission), authAPIOptions, otherOptions, {
162
+ method: reviewerEndpoints.estimateMission.method,
53
163
  body
54
164
  });
55
- const createMission = (body, otherOptions = {}) => fetcher(`${BASE}/mission`, authAPIOptions, otherOptions, {
56
- method: "POST",
165
+ const createMission = (body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.createMission), authAPIOptions, otherOptions, {
166
+ method: reviewerEndpoints.createMission.method,
57
167
  body
58
168
  });
59
169
  const getMyMissions = (params = {}, otherOptions = {}) => {
60
170
  const query = new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== void 0).map(([k, v]) => [k, String(v)]))).toString();
61
- return fetcher(`${BASE}/mission${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
171
+ return fetcher(`${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getMyMissions)}${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
62
172
  };
63
- const getMissionById = (missionId, otherOptions = {}) => fetcher(`${BASE}/mission/${missionId}`, authAPIOptions, otherOptions, { method: "GET" });
64
- const updateMissionStatus = (missionId, body, otherOptions = {}) => fetcher(`${BASE}/mission/${missionId}/status`, authAPIOptions, otherOptions, {
65
- method: "PUT",
173
+ const getMissionById = (missionId, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getMissionById, { missionId }), authAPIOptions, otherOptions, { method: reviewerEndpoints.getMissionById.method });
174
+ const updateMissionStatus = (missionId, body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.updateMissionStatus, { missionId }), authAPIOptions, otherOptions, {
175
+ method: reviewerEndpoints.updateMissionStatus.method,
66
176
  body
67
177
  });
68
- const submitReview = (missionId, body, otherOptions = {}) => fetcher(`${BASE}/mission/${missionId}/review`, authAPIOptions, otherOptions, {
69
- method: "POST",
178
+ const submitReview = (missionId, body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.submitReview, { missionId }), authAPIOptions, otherOptions, {
179
+ method: reviewerEndpoints.submitReview.method,
70
180
  body
71
181
  });
72
- const getChatHistory = (missionId, otherOptions = {}) => fetcher(`${BASE}/mission/${missionId}/chat/history`, authAPIOptions, otherOptions, { method: "GET" });
73
- const sendMessage = (missionId, body, otherOptions = {}) => fetcher(`${BASE}/mission/${missionId}/chat`, authAPIOptions, otherOptions, {
74
- method: "POST",
182
+ const getChatHistory = (missionId, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getChatHistory, { missionId }), authAPIOptions, otherOptions, { method: reviewerEndpoints.getChatHistory.method });
183
+ const sendMessage = (missionId, body, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.sendMessage, { missionId }), authAPIOptions, otherOptions, {
184
+ method: reviewerEndpoints.sendMessage.method,
75
185
  body
76
186
  });
77
- const getChatStreamUrl = (missionId) => `${BASE}/mission/${missionId}/chat/stream`;
187
+ const getChatStreamUrl = (missionId) => buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.chatSSE, { missionId });
78
188
  const uploadPicture = async (kind, file, otherOptions = {}) => {
79
189
  const buffer = await file.arrayBuffer();
80
190
  const baseHeaders = { "Content-Type": file.type || "image/jpeg" };
81
191
  const authHeaders = authAPIOptions.headers ?? {};
82
- const response = await fetch(`${BASE}/me/picture/${kind}`, {
83
- method: "POST",
192
+ const endpoint = kind === "main" ? reviewerEndpoints.uploadMainPicture : reviewerEndpoints.uploadCoverPicture;
193
+ const response = await fetch(buildRouteURL(backendURL, reviewerGroup, endpoint), {
194
+ method: endpoint.method,
84
195
  credentials: "include",
85
196
  headers: {
86
197
  ...authHeaders,
@@ -97,10 +208,10 @@ const getReviewerAPI = (authAPIOptions = {}, intlayerConfig) => {
97
208
  };
98
209
  const uploadMainPicture = (file, otherOptions = {}) => uploadPicture("main", file, otherOptions);
99
210
  const uploadCoverPicture = (file, otherOptions = {}) => uploadPicture("cover", file, otherOptions);
100
- const validateReviewerProfile = (reviewerId, otherOptions = {}) => fetcher(`${BASE}/${reviewerId}/validate`, authAPIOptions, otherOptions, { method: "PUT" });
211
+ const validateReviewerProfile = (reviewerId, otherOptions = {}) => fetcher(buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.validateReviewerProfile, { reviewerId }), authAPIOptions, otherOptions, { method: reviewerEndpoints.validateReviewerProfile.method });
101
212
  const getAdminReviewers = (params = {}, otherOptions = {}) => {
102
213
  const query = new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== void 0).map(([k, v]) => [k, String(v)]))).toString();
103
- return fetcher(`${BASE}/admin/reviewers${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
214
+ return fetcher(`${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getAdminReviewers)}${query ? `?${query}` : ""}`, authAPIOptions, otherOptions, { method: "GET" });
104
215
  };
105
216
  return {
106
217
  getMarketplace,
@@ -1 +1 @@
1
- {"version":3,"file":"reviewer.mjs","names":[],"sources":["../../../src/getIntlayerAPI/reviewer.ts"],"sourcesContent":["import type {\n CreateMissionBody,\n EstimateMissionBody,\n GetMarketplaceQuery,\n MissionEstimate,\n PaginatedResponse,\n PriceDistributionData,\n RegisterReviewerBody,\n ResponseData,\n ReviewerMessageAPI,\n ReviewerProfileAPI,\n ReviewerReviewAPI,\n SendMessageBody,\n SubmitReviewBody,\n TranslationMissionAPI,\n UpdateMissionStatusBody,\n UpdateReviewerBody,\n UploadReviewerPictureResult,\n} from '@intlayer/backend';\nimport { editor } from '@intlayer/config/built';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\nexport const getReviewerAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL;\n const BASE = `${backendURL}/api/reviewer`;\n\n // ── Marketplace ────────────────────────────────────────────────────────────\n\n const getMarketplace = (\n params: GetMarketplaceQuery = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((item) => {\n searchParams.append(key, String(item));\n });\n } else {\n searchParams.append(key, String(value));\n }\n }\n const query = searchParams.toString();\n\n return fetcher<PaginatedResponse<ReviewerProfileAPI>>(\n `${BASE}/marketplace${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n const getPriceDistribution = (\n params: Pick<\n GetMarketplaceQuery,\n 'fromLocale' | 'toLocale' | 'minRating' | 'categories'\n > = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((item) => {\n searchParams.append(key, String(item));\n });\n } else {\n searchParams.append(key, String(value));\n }\n }\n const query = searchParams.toString();\n return fetcher<ResponseData<PriceDistributionData>>(\n `${BASE}/marketplace/price-distribution${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n const getReviewerById = (\n reviewerId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n `${BASE}/${reviewerId}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n\n const getReviewerReviews = (\n reviewerId: string,\n params: { page?: number; pageSize?: number } = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString();\n return fetcher<PaginatedResponse<ReviewerReviewAPI>>(\n `${BASE}/${reviewerId}/reviews${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n // ── My profile ─────────────────────────────────────────────────────────────\n\n const getMyReviewerProfile = (otherOptions: FetcherOptions = {}) =>\n fetcher<ResponseData<ReviewerProfileAPI | null>>(\n `${BASE}/me`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n\n const registerAsReviewer = (\n body: RegisterReviewerBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n `${BASE}/register`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const updateReviewerProfile = (\n body: UpdateReviewerBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n `${BASE}/`,\n authAPIOptions,\n otherOptions,\n { method: 'PUT', body }\n );\n\n const deleteReviewerProfile = (otherOptions: FetcherOptions = {}) =>\n fetcher<ResponseData<null>>(BASE, authAPIOptions, otherOptions, {\n method: 'DELETE',\n });\n\n // ── Contact ────────────────────────────────────────────────────────────────\n\n const contactReviewer = (\n reviewerId: string,\n body: { message: string },\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<null>>(\n `${BASE}/${reviewerId}/contact`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n // ── Missions ───────────────────────────────────────────────────────────────\n\n const estimateMission = (\n body: EstimateMissionBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<MissionEstimate>>(\n `${BASE}/mission/estimate`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const createMission = (\n body: CreateMissionBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<TranslationMissionAPI>>(\n `${BASE}/mission`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const getMyMissions = (\n params: {\n role?: 'client' | 'reviewer';\n page?: number;\n pageSize?: number;\n } = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString();\n return fetcher<PaginatedResponse<TranslationMissionAPI>>(\n `${BASE}/mission${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n const getMissionById = (\n missionId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<TranslationMissionAPI>>(\n `${BASE}/mission/${missionId}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n\n const updateMissionStatus = (\n missionId: string,\n body: UpdateMissionStatusBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<TranslationMissionAPI>>(\n `${BASE}/mission/${missionId}/status`,\n authAPIOptions,\n otherOptions,\n { method: 'PUT', body }\n );\n\n // ── Reviews ────────────────────────────────────────────────────────────────\n\n const submitReview = (\n missionId: string,\n body: SubmitReviewBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerReviewAPI>>(\n `${BASE}/mission/${missionId}/review`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n // ── Chat ───────────────────────────────────────────────────────────────────\n\n const getChatHistory = (\n missionId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerMessageAPI[]>>(\n `${BASE}/mission/${missionId}/chat/history`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n\n const sendMessage = (\n missionId: string,\n body: SendMessageBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerMessageAPI>>(\n `${BASE}/mission/${missionId}/chat`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const getChatStreamUrl = (missionId: string) =>\n `${BASE}/mission/${missionId}/chat/stream`;\n\n // ── Picture uploads ────────────────────────────────────────────────────────\n\n const uploadPicture = async (\n kind: 'main' | 'cover',\n file: File,\n otherOptions: FetcherOptions = {}\n ): Promise<UploadReviewerPictureResult> => {\n const buffer = await file.arrayBuffer();\n\n const baseHeaders: Record<string, string> = {\n 'Content-Type': file.type || 'image/jpeg',\n };\n\n const authHeaders =\n (authAPIOptions.headers as Record<string, string> | undefined) ?? {};\n\n const response = await fetch(`${BASE}/me/picture/${kind}`, {\n method: 'POST',\n credentials: 'include',\n headers: { ...authHeaders, ...baseHeaders },\n body: buffer,\n signal: otherOptions.signal as AbortSignal | undefined,\n });\n\n if (!response.ok) {\n const result = await response.json();\n throw new Error(JSON.stringify(result.error) ?? 'Picture upload failed');\n }\n\n return (await response.json()) as UploadReviewerPictureResult;\n };\n\n const uploadMainPicture = (file: File, otherOptions: FetcherOptions = {}) =>\n uploadPicture('main', file, otherOptions);\n\n const uploadCoverPicture = (file: File, otherOptions: FetcherOptions = {}) =>\n uploadPicture('cover', file, otherOptions);\n\n // ── Admin ──────────────────────────────────────────────────────────────────\n\n const validateReviewerProfile = (\n reviewerId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n `${BASE}/${reviewerId}/validate`,\n authAPIOptions,\n otherOptions,\n { method: 'PUT' }\n );\n\n const getAdminReviewers = (\n params: { page?: number; pageSize?: number; status?: string } = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString();\n return fetcher<PaginatedResponse<ReviewerProfileAPI>>(\n `${BASE}/admin/reviewers${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n return {\n getMarketplace,\n getPriceDistribution,\n getReviewerById,\n getReviewerReviews,\n getMyReviewerProfile,\n registerAsReviewer,\n updateReviewerProfile,\n deleteReviewerProfile,\n estimateMission,\n createMission,\n getMyMissions,\n getMissionById,\n updateMissionStatus,\n submitReview,\n contactReviewer,\n getChatHistory,\n sendMessage,\n getChatStreamUrl,\n uploadMainPicture,\n uploadCoverPicture,\n validateReviewerProfile,\n getAdminReviewers,\n };\n};\n\n/**\n * Authenticated `reviewer` endpoint bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const reviewerEndpoint = createEndpoint(getReviewerAPI);\n"],"mappings":"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"}
1
+ {"version":3,"file":"reviewer.mjs","names":[],"sources":["../../../src/getIntlayerAPI/reviewer.ts"],"sourcesContent":["import type { RouteEndpoints } from '@intlayer/backend-contract/defineRoute';\nimport { buildRouteURL } from '@intlayer/backend-contract/defineRoute';\nimport type {\n PaginatedResponse,\n ResponseData,\n} from '@intlayer/backend-contract/responseData';\nimport type {\n CreateMissionBody,\n EstimateMissionBody,\n GetMarketplaceQuery,\n MissionEstimate,\n PriceDistributionData,\n RegisterReviewerBody,\n ReviewerMessageAPI,\n ReviewerProfileAPI,\n ReviewerReviewAPI,\n ReviewerRoutes,\n reviewerContract,\n SendMessageBody,\n SubmitReviewBody,\n TranslationMissionAPI,\n UpdateMissionStatusBody,\n UpdateReviewerBody,\n UploadReviewerPictureResult,\n} from '@intlayer/backend-contract/reviewer';\nimport { editor } from '@intlayer/config/built';\nimport { BACKEND_URL } from '@intlayer/config/defaultValues';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\n/** Prefix of the routes, checked against the backend contract. */\nconst reviewerGroup = {\n prefix: '/api/reviewer',\n} as const satisfies Pick<typeof reviewerContract, 'prefix'>;\n\n/**\n * Method and path of every route, checked against the backend contract at\n * compile time (the contract's zod schemas are never loaded).\n */\nconst reviewerEndpoints = {\n getMarketplace: { method: 'GET', path: '/marketplace' },\n getPriceDistribution: {\n method: 'GET',\n path: '/marketplace/price-distribution',\n },\n getMyReviewerProfile: { method: 'GET', path: '/me' },\n getReviewerReviews: { method: 'GET', path: '/:reviewerId/reviews' },\n getReviewerById: { method: 'GET', path: '/:reviewerId' },\n registerAsReviewer: { method: 'POST', path: '/register' },\n updateReviewerProfile: { method: 'PUT', path: '/' },\n deleteReviewerProfile: { method: 'DELETE', path: '/' },\n uploadMainPicture: { method: 'POST', path: '/me/picture/main' },\n uploadCoverPicture: { method: 'POST', path: '/me/picture/cover' },\n estimateMission: { method: 'POST', path: '/mission/estimate' },\n createMission: { method: 'POST', path: '/mission' },\n getMyMissions: { method: 'GET', path: '/mission' },\n getMissionById: { method: 'GET', path: '/mission/:missionId' },\n updateMissionStatus: { method: 'PUT', path: '/mission/:missionId/status' },\n submitReview: { method: 'POST', path: '/mission/:missionId/review' },\n getChatHistory: { method: 'GET', path: '/mission/:missionId/chat/history' },\n sendMessage: { method: 'POST', path: '/mission/:missionId/chat' },\n chatSSE: { method: 'GET', path: '/mission/:missionId/chat/stream' },\n createPaymentIntent: {\n method: 'POST',\n path: '/mission/:missionId/payment/intent',\n },\n confirmPayment: {\n method: 'POST',\n path: '/mission/:missionId/payment/confirm',\n },\n requestPayout: { method: 'POST', path: '/payout' },\n contactReviewer: { method: 'POST', path: '/:reviewerId/contact' },\n getAdminReviewers: { method: 'GET', path: '/admin/reviewers' },\n validateReviewerProfile: { method: 'PUT', path: '/:reviewerId/validate' },\n} as const satisfies RouteEndpoints<ReviewerRoutes>;\n\nexport const getReviewerAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL =\n intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;\n\n // ── Marketplace ────────────────────────────────────────────────────────────\n\n const getMarketplace = (\n params: GetMarketplaceQuery = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((item) => {\n searchParams.append(key, String(item));\n });\n } else {\n searchParams.append(key, String(value));\n }\n }\n const query = searchParams.toString();\n\n return fetcher<PaginatedResponse<ReviewerProfileAPI>>(\n `${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getMarketplace)}${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n const getPriceDistribution = (\n params: Pick<\n GetMarketplaceQuery,\n 'fromLocale' | 'toLocale' | 'minRating' | 'categories'\n > = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((item) => {\n searchParams.append(key, String(item));\n });\n } else {\n searchParams.append(key, String(value));\n }\n }\n const query = searchParams.toString();\n return fetcher<ResponseData<PriceDistributionData>>(\n `${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getPriceDistribution)}${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n const getReviewerById = (\n reviewerId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.getReviewerById,\n { reviewerId }\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.getReviewerById.method }\n );\n\n const getReviewerReviews = (\n reviewerId: string,\n params: { page?: number; pageSize?: number } = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString();\n return fetcher<PaginatedResponse<ReviewerReviewAPI>>(\n `${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getReviewerReviews, { reviewerId })}${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n // ── My profile ─────────────────────────────────────────────────────────────\n\n const getMyReviewerProfile = (otherOptions: FetcherOptions = {}) =>\n fetcher<ResponseData<ReviewerProfileAPI | null>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.getMyReviewerProfile\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.getMyReviewerProfile.method }\n );\n\n const registerAsReviewer = (\n body: RegisterReviewerBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.registerAsReviewer\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.registerAsReviewer.method, body }\n );\n\n const updateReviewerProfile = (\n body: UpdateReviewerBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.updateReviewerProfile\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.updateReviewerProfile.method, body }\n );\n\n const deleteReviewerProfile = (otherOptions: FetcherOptions = {}) =>\n fetcher<ResponseData<null>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.deleteReviewerProfile\n ),\n authAPIOptions,\n otherOptions,\n {\n method: reviewerEndpoints.deleteReviewerProfile.method,\n }\n );\n\n // ── Contact ────────────────────────────────────────────────────────────────\n\n const contactReviewer = (\n reviewerId: string,\n body: { message: string },\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<null>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.contactReviewer,\n { reviewerId }\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.contactReviewer.method, body }\n );\n\n // ── Missions ───────────────────────────────────────────────────────────────\n\n const estimateMission = (\n body: EstimateMissionBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<MissionEstimate>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.estimateMission\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.estimateMission.method, body }\n );\n\n const createMission = (\n body: CreateMissionBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<TranslationMissionAPI>>(\n buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.createMission),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.createMission.method, body }\n );\n\n const getMyMissions = (\n params: {\n role?: 'client' | 'reviewer';\n page?: number;\n pageSize?: number;\n } = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString();\n return fetcher<PaginatedResponse<TranslationMissionAPI>>(\n `${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getMyMissions)}${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n const getMissionById = (\n missionId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<TranslationMissionAPI>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.getMissionById,\n { missionId }\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.getMissionById.method }\n );\n\n const updateMissionStatus = (\n missionId: string,\n body: UpdateMissionStatusBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<TranslationMissionAPI>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.updateMissionStatus,\n { missionId }\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.updateMissionStatus.method, body }\n );\n\n // ── Reviews ────────────────────────────────────────────────────────────────\n\n const submitReview = (\n missionId: string,\n body: SubmitReviewBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerReviewAPI>>(\n buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.submitReview, {\n missionId,\n }),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.submitReview.method, body }\n );\n\n // ── Chat ───────────────────────────────────────────────────────────────────\n\n const getChatHistory = (\n missionId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerMessageAPI[]>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.getChatHistory,\n { missionId }\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.getChatHistory.method }\n );\n\n const sendMessage = (\n missionId: string,\n body: SendMessageBody,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerMessageAPI>>(\n buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.sendMessage, {\n missionId,\n }),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.sendMessage.method, body }\n );\n\n const getChatStreamUrl = (missionId: string) =>\n buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.chatSSE, {\n missionId,\n });\n\n // ── Picture uploads ────────────────────────────────────────────────────────\n\n const uploadPicture = async (\n kind: 'main' | 'cover',\n file: File,\n otherOptions: FetcherOptions = {}\n ): Promise<UploadReviewerPictureResult> => {\n const buffer = await file.arrayBuffer();\n\n const baseHeaders: Record<string, string> = {\n 'Content-Type': file.type || 'image/jpeg',\n };\n\n const authHeaders =\n (authAPIOptions.headers as Record<string, string> | undefined) ?? {};\n\n const endpoint =\n kind === 'main'\n ? reviewerEndpoints.uploadMainPicture\n : reviewerEndpoints.uploadCoverPicture;\n const response = await fetch(\n buildRouteURL(backendURL, reviewerGroup, endpoint),\n {\n method: endpoint.method,\n credentials: 'include',\n headers: { ...authHeaders, ...baseHeaders },\n body: buffer,\n signal: otherOptions.signal as AbortSignal | undefined,\n }\n );\n\n if (!response.ok) {\n const result = await response.json();\n throw new Error(JSON.stringify(result.error) ?? 'Picture upload failed');\n }\n\n return (await response.json()) as UploadReviewerPictureResult;\n };\n\n const uploadMainPicture = (file: File, otherOptions: FetcherOptions = {}) =>\n uploadPicture('main', file, otherOptions);\n\n const uploadCoverPicture = (file: File, otherOptions: FetcherOptions = {}) =>\n uploadPicture('cover', file, otherOptions);\n\n // ── Admin ──────────────────────────────────────────────────────────────────\n\n const validateReviewerProfile = (\n reviewerId: string,\n otherOptions: FetcherOptions = {}\n ) =>\n fetcher<ResponseData<ReviewerProfileAPI>>(\n buildRouteURL(\n backendURL,\n reviewerGroup,\n reviewerEndpoints.validateReviewerProfile,\n { reviewerId }\n ),\n authAPIOptions,\n otherOptions,\n { method: reviewerEndpoints.validateReviewerProfile.method }\n );\n\n const getAdminReviewers = (\n params: { page?: number; pageSize?: number; status?: string } = {},\n otherOptions: FetcherOptions = {}\n ) => {\n const query = new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString();\n return fetcher<PaginatedResponse<ReviewerProfileAPI>>(\n `${buildRouteURL(backendURL, reviewerGroup, reviewerEndpoints.getAdminReviewers)}${query ? `?${query}` : ''}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n };\n\n return {\n getMarketplace,\n getPriceDistribution,\n getReviewerById,\n getReviewerReviews,\n getMyReviewerProfile,\n registerAsReviewer,\n updateReviewerProfile,\n deleteReviewerProfile,\n estimateMission,\n createMission,\n getMyMissions,\n getMissionById,\n updateMissionStatus,\n submitReview,\n contactReviewer,\n getChatHistory,\n sendMessage,\n getChatStreamUrl,\n uploadMainPicture,\n uploadCoverPicture,\n validateReviewerProfile,\n getAdminReviewers,\n };\n};\n\n/**\n * Authenticated `reviewer` endpoint bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const reviewerEndpoint = createEndpoint(getReviewerAPI);\n"],"mappings":"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"}
@@ -1,17 +1,29 @@
1
1
  import { fetcher } from "../fetcher.mjs";
2
2
  import { createEndpoint } from "../cms/createIntlayerCMS.mjs";
3
3
  import { editor } from "@intlayer/config/built";
4
+ import { buildRouteURL } from "@intlayer/backend-contract/defineRoute";
5
+ import { BACKEND_URL } from "@intlayer/config/defaultValues";
4
6
 
5
7
  //#region src/getIntlayerAPI/search.ts
8
+ /** Prefix of the routes, checked against the backend contract. */
9
+ const searchGroup = { prefix: "/api/search" };
10
+ /**
11
+ * Method and path of every route, checked against the backend contract at
12
+ * compile time (the contract's zod schemas are never loaded).
13
+ */
14
+ const searchEndpoints = { doc: {
15
+ method: "GET",
16
+ path: "/doc"
17
+ } };
6
18
  const getSearchAPI = (authAPIOptions = {}, intlayerConfig) => {
7
- const AI_API_ROUTE = `${intlayerConfig?.editor?.backendURL ?? editor.backendURL}/api/search`;
19
+ const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;
8
20
  /**
9
21
  * Search documentation
10
22
  * @param params - Search parameters containing the input query.
11
23
  * @returns Search results with GitHub URLs.
12
24
  */
13
- const searchDoc = async (params, otherOptions = {}) => await fetcher(`${AI_API_ROUTE}/doc`, authAPIOptions, otherOptions, {
14
- method: "GET",
25
+ const searchDoc = async (params, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, searchGroup, searchEndpoints.doc), authAPIOptions, otherOptions, {
26
+ method: searchEndpoints.doc.method,
15
27
  params
16
28
  });
17
29
  return { searchDoc };
@@ -1 +1 @@
1
- {"version":3,"file":"search.mjs","names":[],"sources":["../../../src/getIntlayerAPI/search.ts"],"sourcesContent":["import type {\n SearchDocUtilParams,\n SearchDocUtilResult,\n} from '@intlayer/backend';\nimport { editor } from '@intlayer/config/built';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\nexport const getSearchAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL;\n\n const AI_API_ROUTE = `${backendURL}/api/search`;\n\n /**\n * Search documentation\n * @param params - Search parameters containing the input query.\n * @returns Search results with GitHub URLs.\n */\n const searchDoc = async (\n params?: SearchDocUtilParams,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<SearchDocUtilResult>(\n `${AI_API_ROUTE}/doc`,\n authAPIOptions,\n otherOptions,\n {\n method: 'GET',\n params: params,\n }\n );\n\n return {\n searchDoc,\n };\n};\n\n/**\n * Authenticated `search` endpoint bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const searchEndpoint = createEndpoint(getSearchAPI);\n"],"mappings":";;;;;AASA,MAAa,gBACX,iBAAiC,CAAC,GAClC,mBACG;CAGH,MAAM,eAAe,GAFF,gBAAgB,QAAQ,cAAc,OAAO,WAE7B;;;;;;CAOnC,MAAM,YAAY,OAChB,QACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,aAAa,OAChB,gBACA,cACA;EACE,QAAQ;EACA;CACV,CACF;CAEF,OAAO,EACL,UACF;AACF;;;;;;;AAQA,MAAa,iBAAiB,eAAe,YAAY"}
1
+ {"version":3,"file":"search.mjs","names":[],"sources":["../../../src/getIntlayerAPI/search.ts"],"sourcesContent":["import type { RouteEndpoints } from '@intlayer/backend-contract/defineRoute';\nimport { buildRouteURL } from '@intlayer/backend-contract/defineRoute';\nimport type {\n SearchDocUtilParams,\n SearchDocUtilResult,\n SearchRoutes,\n searchContract,\n} from '@intlayer/backend-contract/search';\nimport { editor } from '@intlayer/config/built';\nimport { BACKEND_URL } from '@intlayer/config/defaultValues';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\n/** Prefix of the routes, checked against the backend contract. */\nconst searchGroup = {\n prefix: '/api/search',\n} as const satisfies Pick<typeof searchContract, 'prefix'>;\n\n/**\n * Method and path of every route, checked against the backend contract at\n * compile time (the contract's zod schemas are never loaded).\n */\nconst searchEndpoints = {\n doc: { method: 'GET', path: '/doc' },\n} as const satisfies RouteEndpoints<SearchRoutes>;\n\nexport const getSearchAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL =\n intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;\n\n /**\n * Search documentation\n * @param params - Search parameters containing the input query.\n * @returns Search results with GitHub URLs.\n */\n const searchDoc = async (\n params?: SearchDocUtilParams,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<SearchDocUtilResult>(\n buildRouteURL(backendURL, searchGroup, searchEndpoints.doc),\n authAPIOptions,\n otherOptions,\n {\n method: searchEndpoints.doc.method,\n params: params,\n }\n );\n\n return {\n searchDoc,\n };\n};\n\n/**\n * Authenticated `search` endpoint bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const searchEndpoint = createEndpoint(getSearchAPI);\n"],"mappings":";;;;;;;;AAeA,MAAM,cAAc,EAClB,QAAQ,cACV;;;;;AAMA,MAAM,kBAAkB,EACtB,KAAK;CAAE,QAAQ;CAAO,MAAM;AAAO,EACrC;AAEA,MAAa,gBACX,iBAAiC,CAAC,GAClC,mBACG;CACH,MAAM,aACJ,gBAAgB,QAAQ,cAAc,OAAO,cAAc;;;;;;CAO7D,MAAM,YAAY,OAChB,QACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,cAAc,YAAY,aAAa,gBAAgB,GAAG,GAC1D,gBACA,cACA;EACE,QAAQ,gBAAgB,IAAI;EACpB;CACV,CACF;CAEF,OAAO,EACL,UACF;AACF;;;;;;;AAQA,MAAa,iBAAiB,eAAe,YAAY"}
@@ -1,10 +1,56 @@
1
1
  import { fetcher } from "../fetcher.mjs";
2
2
  import { createEndpoint } from "../cms/createIntlayerCMS.mjs";
3
3
  import { editor } from "@intlayer/config/built";
4
+ import { buildRouteURL } from "@intlayer/backend-contract/defineRoute";
5
+ import { BACKEND_URL } from "@intlayer/config/defaultValues";
4
6
 
5
7
  //#region src/getIntlayerAPI/showcaseProject.ts
8
+ /** Prefix of the routes, checked against the backend contract. */
9
+ const showcaseProjectGroup = { prefix: "/api/showcase-project" };
10
+ /**
11
+ * Method and path of every route, checked against the backend contract at
12
+ * compile time (the contract's zod schemas are never loaded).
13
+ */
14
+ const showcaseProjectEndpoints = {
15
+ getShowcaseProjects: {
16
+ method: "GET",
17
+ path: "/"
18
+ },
19
+ submitShowcaseProject: {
20
+ method: "POST",
21
+ path: "/submit"
22
+ },
23
+ getOtherShowcaseProjects: {
24
+ method: "GET",
25
+ path: "/others"
26
+ },
27
+ toggleShowcaseUpvote: {
28
+ method: "POST",
29
+ path: "/upvote"
30
+ },
31
+ toggleShowcaseDownvote: {
32
+ method: "POST",
33
+ path: "/downvote"
34
+ },
35
+ getShowcaseProjectById: {
36
+ method: "GET",
37
+ path: "/:projectId"
38
+ },
39
+ scanShowcaseProject: {
40
+ method: "GET",
41
+ path: "/:projectId/scan"
42
+ },
43
+ deleteShowcaseProject: {
44
+ method: "DELETE",
45
+ path: "/:projectId"
46
+ },
47
+ updateShowcaseProject: {
48
+ method: "PATCH",
49
+ path: "/:projectId"
50
+ }
51
+ };
6
52
  const getShowcaseProjectAPI = (authAPIOptions = {}, intlayerConfig) => {
7
- const SHOWCASE_API_ROUTE = `${intlayerConfig?.editor?.backendURL ?? editor.backendURL}/api/showcase-project`;
53
+ const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;
8
54
  const getShowcaseProjects = async (query, otherOptions = {}) => {
9
55
  const params = {};
10
56
  if (query?.page !== void 0) params.page = String(query.page);
@@ -12,35 +58,35 @@ const getShowcaseProjectAPI = (authAPIOptions = {}, intlayerConfig) => {
12
58
  if (query?.search !== void 0) params.search = query.search;
13
59
  if (query?.isOpenSource !== void 0) params.isOpenSource = String(query.isOpenSource);
14
60
  if (query?.selectedUseCases?.length) params.selectedUseCases = query.selectedUseCases;
15
- return await fetcher(SHOWCASE_API_ROUTE, authAPIOptions, otherOptions, {
16
- method: "GET",
61
+ return await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.getShowcaseProjects), authAPIOptions, otherOptions, {
62
+ method: showcaseProjectEndpoints.getShowcaseProjects.method,
17
63
  params
18
64
  });
19
65
  };
20
- const getShowcaseProjectById = async (projectId, otherOptions = {}) => await fetcher(`${SHOWCASE_API_ROUTE}/${projectId}`, authAPIOptions, otherOptions, { method: "GET" });
66
+ const getShowcaseProjectById = async (projectId, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.getShowcaseProjectById, { projectId }), authAPIOptions, otherOptions, { method: showcaseProjectEndpoints.getShowcaseProjectById.method });
21
67
  const getOtherShowcaseProjects = async (query, otherOptions = {}) => {
22
68
  const params = { excludeId: query.excludeId };
23
69
  if (query.limit !== void 0) params.limit = String(query.limit);
24
- return await fetcher(`${SHOWCASE_API_ROUTE}/others`, authAPIOptions, otherOptions, {
25
- method: "GET",
70
+ return await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.getOtherShowcaseProjects), authAPIOptions, otherOptions, {
71
+ method: showcaseProjectEndpoints.getOtherShowcaseProjects.method,
26
72
  params
27
73
  });
28
74
  };
29
- const submitShowcaseProject = async (body, otherOptions = {}) => await fetcher(`${SHOWCASE_API_ROUTE}/submit`, authAPIOptions, otherOptions, {
30
- method: "POST",
75
+ const submitShowcaseProject = async (body, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.submitShowcaseProject), authAPIOptions, otherOptions, {
76
+ method: showcaseProjectEndpoints.submitShowcaseProject.method,
31
77
  body
32
78
  });
33
- const toggleShowcaseUpvote = async (body, otherOptions = {}) => await fetcher(`${SHOWCASE_API_ROUTE}/upvote`, authAPIOptions, otherOptions, {
34
- method: "POST",
79
+ const toggleShowcaseUpvote = async (body, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.toggleShowcaseUpvote), authAPIOptions, otherOptions, {
80
+ method: showcaseProjectEndpoints.toggleShowcaseUpvote.method,
35
81
  body
36
82
  });
37
- const toggleShowcaseDownvote = async (body, otherOptions = {}) => await fetcher(`${SHOWCASE_API_ROUTE}/downvote`, authAPIOptions, otherOptions, {
38
- method: "POST",
83
+ const toggleShowcaseDownvote = async (body, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.toggleShowcaseDownvote), authAPIOptions, otherOptions, {
84
+ method: showcaseProjectEndpoints.toggleShowcaseDownvote.method,
39
85
  body
40
86
  });
41
- const deleteShowcaseProject = async (projectId, otherOptions = {}) => await fetcher(`${SHOWCASE_API_ROUTE}/${projectId}`, authAPIOptions, otherOptions, { method: "DELETE" });
42
- const updateShowcaseProject = async (projectId, body, otherOptions = {}) => await fetcher(`${SHOWCASE_API_ROUTE}/${projectId}`, authAPIOptions, otherOptions, {
43
- method: "PATCH",
87
+ const deleteShowcaseProject = async (projectId, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.deleteShowcaseProject, { projectId }), authAPIOptions, otherOptions, { method: showcaseProjectEndpoints.deleteShowcaseProject.method });
88
+ const updateShowcaseProject = async (projectId, body, otherOptions = {}) => await fetcher(buildRouteURL(backendURL, showcaseProjectGroup, showcaseProjectEndpoints.updateShowcaseProject, { projectId }), authAPIOptions, otherOptions, {
89
+ method: showcaseProjectEndpoints.updateShowcaseProject.method,
44
90
  body
45
91
  });
46
92
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"showcaseProject.mjs","names":[],"sources":["../../../src/getIntlayerAPI/showcaseProject.ts"],"sourcesContent":["import type {\n GetOtherShowcaseProjectsResult,\n GetShowcaseProjectByIdParams,\n GetShowcaseProjectByIdResult,\n GetShowcaseProjectsResult,\n SubmitShowcaseProjectBody,\n SubmitShowcaseProjectResult,\n ToggleShowcaseDownvoteBody,\n ToggleShowcaseDownvoteResult,\n ToggleShowcaseUpvoteBody,\n ToggleShowcaseUpvoteResult,\n UpdateShowcaseProjectBody,\n UpdateShowcaseProjectResult,\n} from '@intlayer/backend';\nimport { editor } from '@intlayer/config/built';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\n// Client-side query types use proper JS types (numbers/booleans) rather than\n// the backend querystring types which are always strings.\nexport type ShowcaseProjectsQuery = {\n page?: number;\n pageSize?: number;\n search?: string;\n selectedUseCases?: string[];\n isOpenSource?: boolean;\n};\n\nexport type OtherShowcaseProjectsQuery = {\n excludeId: string;\n limit?: number;\n};\n\nexport const getShowcaseProjectAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL;\n\n const SHOWCASE_API_ROUTE = `${backendURL}/api/showcase-project`;\n\n const getShowcaseProjects = async (\n query?: ShowcaseProjectsQuery,\n otherOptions: FetcherOptions = {}\n ) => {\n const params: Record<string, string | string[]> = {};\n if (query?.page !== undefined) params.page = String(query.page);\n if (query?.pageSize !== undefined) params.pageSize = String(query.pageSize);\n if (query?.search !== undefined) params.search = query.search;\n if (query?.isOpenSource !== undefined)\n params.isOpenSource = String(query.isOpenSource);\n if (query?.selectedUseCases?.length)\n params.selectedUseCases = query.selectedUseCases;\n\n return await fetcher<GetShowcaseProjectsResult>(\n SHOWCASE_API_ROUTE,\n authAPIOptions,\n otherOptions,\n { method: 'GET', params: params as any }\n );\n };\n\n const getShowcaseProjectById = async (\n projectId: GetShowcaseProjectByIdParams['projectId'],\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<GetShowcaseProjectByIdResult>(\n `${SHOWCASE_API_ROUTE}/${projectId}`,\n authAPIOptions,\n otherOptions,\n { method: 'GET' }\n );\n\n const getOtherShowcaseProjects = async (\n query: OtherShowcaseProjectsQuery,\n otherOptions: FetcherOptions = {}\n ) => {\n const params: Record<string, string> = { excludeId: query.excludeId };\n if (query.limit !== undefined) params.limit = String(query.limit);\n return await fetcher<GetOtherShowcaseProjectsResult>(\n `${SHOWCASE_API_ROUTE}/others`,\n authAPIOptions,\n otherOptions,\n { method: 'GET', params: params as any }\n );\n };\n\n const submitShowcaseProject = async (\n body: SubmitShowcaseProjectBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<SubmitShowcaseProjectResult>(\n `${SHOWCASE_API_ROUTE}/submit`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const toggleShowcaseUpvote = async (\n body: ToggleShowcaseUpvoteBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<ToggleShowcaseUpvoteResult>(\n `${SHOWCASE_API_ROUTE}/upvote`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const toggleShowcaseDownvote = async (\n body: ToggleShowcaseDownvoteBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<ToggleShowcaseDownvoteResult>(\n `${SHOWCASE_API_ROUTE}/downvote`,\n authAPIOptions,\n otherOptions,\n { method: 'POST', body }\n );\n\n const deleteShowcaseProject = async (\n projectId: GetShowcaseProjectByIdParams['projectId'],\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<{ data: { success: boolean } }>(\n `${SHOWCASE_API_ROUTE}/${projectId}`,\n authAPIOptions,\n otherOptions,\n { method: 'DELETE' }\n );\n\n const updateShowcaseProject = async (\n projectId: GetShowcaseProjectByIdParams['projectId'],\n body: UpdateShowcaseProjectBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<UpdateShowcaseProjectResult>(\n `${SHOWCASE_API_ROUTE}/${projectId}`,\n authAPIOptions,\n otherOptions,\n { method: 'PATCH', body }\n );\n\n return {\n getShowcaseProjects,\n getShowcaseProjectById,\n getOtherShowcaseProjects,\n submitShowcaseProject,\n toggleShowcaseUpvote,\n toggleShowcaseDownvote,\n deleteShowcaseProject,\n updateShowcaseProject,\n };\n};\n\n/**\n * Authenticated `showcaseProject` endpoint bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const showcaseProjectEndpoint = createEndpoint(getShowcaseProjectAPI);\n"],"mappings":";;;;;AAkCA,MAAa,yBACX,iBAAiC,CAAC,GAClC,mBACG;CAGH,MAAM,qBAAqB,GAFR,gBAAgB,QAAQ,cAAc,OAAO,WAEvB;CAEzC,MAAM,sBAAsB,OAC1B,OACA,eAA+B,CAAC,MAC7B;EACH,MAAM,SAA4C,CAAC;EACnD,IAAI,OAAO,SAAS,QAAW,OAAO,OAAO,OAAO,MAAM,IAAI;EAC9D,IAAI,OAAO,aAAa,QAAW,OAAO,WAAW,OAAO,MAAM,QAAQ;EAC1E,IAAI,OAAO,WAAW,QAAW,OAAO,SAAS,MAAM;EACvD,IAAI,OAAO,iBAAiB,QAC1B,OAAO,eAAe,OAAO,MAAM,YAAY;EACjD,IAAI,OAAO,kBAAkB,QAC3B,OAAO,mBAAmB,MAAM;EAElC,OAAO,MAAM,QACX,oBACA,gBACA,cACA;GAAE,QAAQ;GAAe;EAAc,CACzC;CACF;CAEA,MAAM,yBAAyB,OAC7B,WACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,mBAAmB,GAAG,aACzB,gBACA,cACA,EAAE,QAAQ,MAAM,CAClB;CAEF,MAAM,2BAA2B,OAC/B,OACA,eAA+B,CAAC,MAC7B;EACH,MAAM,SAAiC,EAAE,WAAW,MAAM,UAAU;EACpE,IAAI,MAAM,UAAU,QAAW,OAAO,QAAQ,OAAO,MAAM,KAAK;EAChE,OAAO,MAAM,QACX,GAAG,mBAAmB,UACtB,gBACA,cACA;GAAE,QAAQ;GAAe;EAAc,CACzC;CACF;CAEA,MAAM,wBAAwB,OAC5B,MACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,mBAAmB,UACtB,gBACA,cACA;EAAE,QAAQ;EAAQ;CAAK,CACzB;CAEF,MAAM,uBAAuB,OAC3B,MACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,mBAAmB,UACtB,gBACA,cACA;EAAE,QAAQ;EAAQ;CAAK,CACzB;CAEF,MAAM,yBAAyB,OAC7B,MACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,mBAAmB,YACtB,gBACA,cACA;EAAE,QAAQ;EAAQ;CAAK,CACzB;CAEF,MAAM,wBAAwB,OAC5B,WACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,mBAAmB,GAAG,aACzB,gBACA,cACA,EAAE,QAAQ,SAAS,CACrB;CAEF,MAAM,wBAAwB,OAC5B,WACA,MACA,eAA+B,CAAC,MAEhC,MAAM,QACJ,GAAG,mBAAmB,GAAG,aACzB,gBACA,cACA;EAAE,QAAQ;EAAS;CAAK,CAC1B;CAEF,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;;;;AAQA,MAAa,0BAA0B,eAAe,qBAAqB"}
1
+ {"version":3,"file":"showcaseProject.mjs","names":[],"sources":["../../../src/getIntlayerAPI/showcaseProject.ts"],"sourcesContent":["import type { RouteEndpoints } from '@intlayer/backend-contract/defineRoute';\nimport { buildRouteURL } from '@intlayer/backend-contract/defineRoute';\nimport type {\n GetOtherShowcaseProjectsResult,\n GetShowcaseProjectByIdParams,\n GetShowcaseProjectByIdResult,\n GetShowcaseProjectsResult,\n ShowcaseProjectRoutes,\n SubmitShowcaseProjectBody,\n SubmitShowcaseProjectResult,\n showcaseProjectContract,\n ToggleShowcaseDownvoteBody,\n ToggleShowcaseDownvoteResult,\n ToggleShowcaseUpvoteBody,\n ToggleShowcaseUpvoteResult,\n UpdateShowcaseProjectBody,\n UpdateShowcaseProjectResult,\n} from '@intlayer/backend-contract/showcaseProject';\nimport { editor } from '@intlayer/config/built';\nimport { BACKEND_URL } from '@intlayer/config/defaultValues';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\n// Client-side query types use proper JS types (numbers/booleans) rather than\n// the backend querystring types which are always strings.\nexport type ShowcaseProjectsQuery = {\n page?: number;\n pageSize?: number;\n search?: string;\n selectedUseCases?: string[];\n isOpenSource?: boolean;\n};\n\nexport type OtherShowcaseProjectsQuery = {\n excludeId: string;\n limit?: number;\n};\n\n/** Prefix of the routes, checked against the backend contract. */\nconst showcaseProjectGroup = {\n prefix: '/api/showcase-project',\n} as const satisfies Pick<typeof showcaseProjectContract, 'prefix'>;\n\n/**\n * Method and path of every route, checked against the backend contract at\n * compile time (the contract's zod schemas are never loaded).\n */\nconst showcaseProjectEndpoints = {\n getShowcaseProjects: { method: 'GET', path: '/' },\n submitShowcaseProject: { method: 'POST', path: '/submit' },\n getOtherShowcaseProjects: { method: 'GET', path: '/others' },\n toggleShowcaseUpvote: { method: 'POST', path: '/upvote' },\n toggleShowcaseDownvote: { method: 'POST', path: '/downvote' },\n getShowcaseProjectById: { method: 'GET', path: '/:projectId' },\n scanShowcaseProject: { method: 'GET', path: '/:projectId/scan' },\n deleteShowcaseProject: { method: 'DELETE', path: '/:projectId' },\n updateShowcaseProject: { method: 'PATCH', path: '/:projectId' },\n} as const satisfies RouteEndpoints<ShowcaseProjectRoutes>;\n\nexport const getShowcaseProjectAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL =\n intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;\n\n const getShowcaseProjects = async (\n query?: ShowcaseProjectsQuery,\n otherOptions: FetcherOptions = {}\n ) => {\n const params: Record<string, string | string[]> = {};\n if (query?.page !== undefined) params.page = String(query.page);\n if (query?.pageSize !== undefined) params.pageSize = String(query.pageSize);\n if (query?.search !== undefined) params.search = query.search;\n if (query?.isOpenSource !== undefined)\n params.isOpenSource = String(query.isOpenSource);\n if (query?.selectedUseCases?.length)\n params.selectedUseCases = query.selectedUseCases;\n\n return await fetcher<GetShowcaseProjectsResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.getShowcaseProjects\n ),\n authAPIOptions,\n otherOptions,\n {\n method: showcaseProjectEndpoints.getShowcaseProjects.method,\n params: params as any,\n }\n );\n };\n\n const getShowcaseProjectById = async (\n projectId: GetShowcaseProjectByIdParams['projectId'],\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<GetShowcaseProjectByIdResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.getShowcaseProjectById,\n { projectId }\n ),\n authAPIOptions,\n otherOptions,\n { method: showcaseProjectEndpoints.getShowcaseProjectById.method }\n );\n\n const getOtherShowcaseProjects = async (\n query: OtherShowcaseProjectsQuery,\n otherOptions: FetcherOptions = {}\n ) => {\n const params: Record<string, string> = { excludeId: query.excludeId };\n if (query.limit !== undefined) params.limit = String(query.limit);\n return await fetcher<GetOtherShowcaseProjectsResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.getOtherShowcaseProjects\n ),\n authAPIOptions,\n otherOptions,\n {\n method: showcaseProjectEndpoints.getOtherShowcaseProjects.method,\n params: params as any,\n }\n );\n };\n\n const submitShowcaseProject = async (\n body: SubmitShowcaseProjectBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<SubmitShowcaseProjectResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.submitShowcaseProject\n ),\n authAPIOptions,\n otherOptions,\n { method: showcaseProjectEndpoints.submitShowcaseProject.method, body }\n );\n\n const toggleShowcaseUpvote = async (\n body: ToggleShowcaseUpvoteBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<ToggleShowcaseUpvoteResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.toggleShowcaseUpvote\n ),\n authAPIOptions,\n otherOptions,\n { method: showcaseProjectEndpoints.toggleShowcaseUpvote.method, body }\n );\n\n const toggleShowcaseDownvote = async (\n body: ToggleShowcaseDownvoteBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<ToggleShowcaseDownvoteResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.toggleShowcaseDownvote\n ),\n authAPIOptions,\n otherOptions,\n { method: showcaseProjectEndpoints.toggleShowcaseDownvote.method, body }\n );\n\n const deleteShowcaseProject = async (\n projectId: GetShowcaseProjectByIdParams['projectId'],\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<{ data: { success: boolean } }>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.deleteShowcaseProject,\n { projectId }\n ),\n authAPIOptions,\n otherOptions,\n { method: showcaseProjectEndpoints.deleteShowcaseProject.method }\n );\n\n const updateShowcaseProject = async (\n projectId: GetShowcaseProjectByIdParams['projectId'],\n body: UpdateShowcaseProjectBody,\n otherOptions: FetcherOptions = {}\n ) =>\n await fetcher<UpdateShowcaseProjectResult>(\n buildRouteURL(\n backendURL,\n showcaseProjectGroup,\n showcaseProjectEndpoints.updateShowcaseProject,\n { projectId }\n ),\n authAPIOptions,\n otherOptions,\n { method: showcaseProjectEndpoints.updateShowcaseProject.method, body }\n );\n\n return {\n getShowcaseProjects,\n getShowcaseProjectById,\n getOtherShowcaseProjects,\n submitShowcaseProject,\n toggleShowcaseUpvote,\n toggleShowcaseDownvote,\n deleteShowcaseProject,\n updateShowcaseProject,\n };\n};\n\n/**\n * Authenticated `showcaseProject` endpoint bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const showcaseProjectEndpoint = createEndpoint(getShowcaseProjectAPI);\n"],"mappings":"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"}
@@ -1,8 +1,21 @@
1
1
  import { fetcher } from "../fetcher.mjs";
2
2
  import { createEndpoint } from "../cms/createIntlayerCMS.mjs";
3
3
  import { editor } from "@intlayer/config/built";
4
+ import { buildRouteURL } from "@intlayer/backend-contract/defineRoute";
5
+ import { BACKEND_URL } from "@intlayer/config/defaultValues";
4
6
 
5
7
  //#region src/getIntlayerAPI/status.ts
8
+ /** Routes used here, checked against the backend contract. */
9
+ const userGroup = { prefix: "/api/user" };
10
+ const setupStatusEndpoint = {
11
+ method: "GET",
12
+ path: "/setup"
13
+ };
14
+ const demoGroup = { prefix: "/api/demo" };
15
+ const demoEndpoints = { getDemoSession: {
16
+ method: "GET",
17
+ path: "/session"
18
+ } };
6
19
  /**
7
20
  * Instance/entry status endpoints. These back the decisions made when an
8
21
  * unauthenticated visitor reaches the app root:
@@ -13,21 +26,21 @@ import { editor } from "@intlayer/config/built";
13
26
  * response).
14
27
  */
15
28
  const getStatusAPI = (authAPIOptions = {}, intlayerConfig) => {
16
- const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL;
29
+ const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;
17
30
  /**
18
31
  * Reports whether the instance still needs its initial setup (creation of
19
32
  * the first super-admin). Only ever `true` on a self-hosted deployment with
20
33
  * an empty users collection. Public endpoint — no authentication required.
21
34
  * @returns `{ isSetupRequired: boolean }`.
22
35
  */
23
- const getSetupStatus = async (otherOptions = {}) => await fetcher(`${backendURL}/api/user/setup`, authAPIOptions, otherOptions, { cache: "no-store" });
36
+ const getSetupStatus = async (otherOptions = {}) => await fetcher(buildRouteURL(backendURL, userGroup, setupStatusEndpoint), authAPIOptions, otherOptions, { cache: "no-store" });
24
37
  /**
25
38
  * Signs the current browser into the shared demo account. The backend
26
39
  * responds with a `Set-Cookie` header establishing the demo session, so this
27
40
  * must run with credentials included (the default in the fetcher).
28
41
  * @returns `{ ok: boolean }`.
29
42
  */
30
- const getDemoSession = async (otherOptions = {}) => await fetcher(`${backendURL}/api/demo/session`, authAPIOptions, otherOptions, { cache: "no-store" });
43
+ const getDemoSession = async (otherOptions = {}) => await fetcher(buildRouteURL(backendURL, demoGroup, demoEndpoints.getDemoSession), authAPIOptions, otherOptions, { cache: "no-store" });
31
44
  return {
32
45
  getSetupStatus,
33
46
  getDemoSession
@@ -1 +1 @@
1
- {"version":3,"file":"status.mjs","names":[],"sources":["../../../src/getIntlayerAPI/status.ts"],"sourcesContent":["import type { GetSetupStatusResult } from '@intlayer/backend';\nimport { editor } from '@intlayer/config/built';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\n/** Result of the demo-session bootstrap endpoint. */\nexport type GetDemoSessionResult = { ok: boolean };\n\n/**\n * Instance/entry status endpoints. These back the decisions made when an\n * unauthenticated visitor reaches the app root:\n * - `getSetupStatus` — on a self-hosted instance, whether the first\n * super-admin still needs to be created.\n * - `getDemoSession` — on the hosted cloud, signs the visitor into the shared\n * read-only demo account (the backend sets the session cookie on the\n * response).\n */\nexport const getStatusAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL = intlayerConfig?.editor?.backendURL ?? editor.backendURL;\n\n /**\n * Reports whether the instance still needs its initial setup (creation of\n * the first super-admin). Only ever `true` on a self-hosted deployment with\n * an empty users collection. Public endpoint — no authentication required.\n * @returns `{ isSetupRequired: boolean }`.\n */\n const getSetupStatus = async (otherOptions: FetcherOptions = {}) =>\n await fetcher<GetSetupStatusResult>(\n `${backendURL}/api/user/setup`,\n authAPIOptions,\n otherOptions,\n {\n cache: 'no-store',\n }\n );\n\n /**\n * Signs the current browser into the shared demo account. The backend\n * responds with a `Set-Cookie` header establishing the demo session, so this\n * must run with credentials included (the default in the fetcher).\n * @returns `{ ok: boolean }`.\n */\n const getDemoSession = async (otherOptions: FetcherOptions = {}) =>\n await fetcher<GetDemoSessionResult>(\n `${backendURL}/api/demo/session`,\n authAPIOptions,\n otherOptions,\n {\n cache: 'no-store',\n }\n );\n\n return {\n getSetupStatus,\n getDemoSession,\n };\n};\n\n/**\n * Instance status endpoints bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const statusEndpoint = createEndpoint(getStatusAPI);\n"],"mappings":";;;;;;;;;;;;;;AAkBA,MAAa,gBACX,iBAAiC,CAAC,GAClC,mBACG;CACH,MAAM,aAAa,gBAAgB,QAAQ,cAAc,OAAO;;;;;;;CAQhE,MAAM,iBAAiB,OAAO,eAA+B,CAAC,MAC5D,MAAM,QACJ,GAAG,WAAW,kBACd,gBACA,cACA,EACE,OAAO,WACT,CACF;;;;;;;CAQF,MAAM,iBAAiB,OAAO,eAA+B,CAAC,MAC5D,MAAM,QACJ,GAAG,WAAW,oBACd,gBACA,cACA,EACE,OAAO,WACT,CACF;CAEF,OAAO;EACL;EACA;CACF;AACF;;;;;;;AAQA,MAAa,iBAAiB,eAAe,YAAY"}
1
+ {"version":3,"file":"status.mjs","names":[],"sources":["../../../src/getIntlayerAPI/status.ts"],"sourcesContent":["import type { RouteEndpoints } from '@intlayer/backend-contract/defineRoute';\nimport { buildRouteURL } from '@intlayer/backend-contract/defineRoute';\nimport type {\n DemoRoutes,\n demoContract,\n GetDemoSessionResult,\n} from '@intlayer/backend-contract/demo';\nimport type {\n GetSetupStatusResult,\n UserRoutes,\n userContract,\n} from '@intlayer/backend-contract/user';\nimport { editor } from '@intlayer/config/built';\nimport { BACKEND_URL } from '@intlayer/config/defaultValues';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport { createEndpoint } from '../cms/createIntlayerCMS';\nimport { type FetcherOptions, fetcher } from '../fetcher';\n\n/** Result of the demo-session bootstrap endpoint. */\nexport type { GetDemoSessionResult };\n\n/** Routes used here, checked against the backend contract. */\nconst userGroup = {\n prefix: '/api/user',\n} as const satisfies Pick<typeof userContract, 'prefix'>;\nconst setupStatusEndpoint = {\n method: 'GET',\n path: '/setup',\n} as const satisfies Pick<UserRoutes['getSetupStatus'], 'method' | 'path'>;\nconst demoGroup = {\n prefix: '/api/demo',\n} as const satisfies Pick<typeof demoContract, 'prefix'>;\nconst demoEndpoints = {\n getDemoSession: { method: 'GET', path: '/session' },\n} as const satisfies RouteEndpoints<DemoRoutes>;\n\n/**\n * Instance/entry status endpoints. These back the decisions made when an\n * unauthenticated visitor reaches the app root:\n * - `getSetupStatus` — on a self-hosted instance, whether the first\n * super-admin still needs to be created.\n * - `getDemoSession` — on the hosted cloud, signs the visitor into the shared\n * read-only demo account (the backend sets the session cookie on the\n * response).\n */\nexport const getStatusAPI = (\n authAPIOptions: FetcherOptions = {},\n intlayerConfig?: IntlayerConfig\n) => {\n const backendURL =\n intlayerConfig?.editor?.backendURL ?? editor.backendURL ?? BACKEND_URL;\n\n /**\n * Reports whether the instance still needs its initial setup (creation of\n * the first super-admin). Only ever `true` on a self-hosted deployment with\n * an empty users collection. Public endpoint — no authentication required.\n * @returns `{ isSetupRequired: boolean }`.\n */\n const getSetupStatus = async (otherOptions: FetcherOptions = {}) =>\n await fetcher<GetSetupStatusResult>(\n buildRouteURL(backendURL, userGroup, setupStatusEndpoint),\n authAPIOptions,\n otherOptions,\n {\n cache: 'no-store',\n }\n );\n\n /**\n * Signs the current browser into the shared demo account. The backend\n * responds with a `Set-Cookie` header establishing the demo session, so this\n * must run with credentials included (the default in the fetcher).\n * @returns `{ ok: boolean }`.\n */\n const getDemoSession = async (otherOptions: FetcherOptions = {}) =>\n await fetcher<GetDemoSessionResult>(\n buildRouteURL(backendURL, demoGroup, demoEndpoints.getDemoSession),\n authAPIOptions,\n otherOptions,\n {\n cache: 'no-store',\n }\n );\n\n return {\n getSetupStatus,\n getDemoSession,\n };\n};\n\n/**\n * Instance status endpoints bound to an Intlayer CMS authenticator.\n *\n * Pass an authenticator created with `createIntlayerCMS`, or omit it to use\n * the build-time configuration (`@intlayer/config/built`).\n */\nexport const statusEndpoint = createEndpoint(getStatusAPI);\n"],"mappings":";;;;;;;;AAsBA,MAAM,YAAY,EAChB,QAAQ,YACV;AACA,MAAM,sBAAsB;CAC1B,QAAQ;CACR,MAAM;AACR;AACA,MAAM,YAAY,EAChB,QAAQ,YACV;AACA,MAAM,gBAAgB,EACpB,gBAAgB;CAAE,QAAQ;CAAO,MAAM;AAAW,EACpD;;;;;;;;;;AAWA,MAAa,gBACX,iBAAiC,CAAC,GAClC,mBACG;CACH,MAAM,aACJ,gBAAgB,QAAQ,cAAc,OAAO,cAAc;;;;;;;CAQ7D,MAAM,iBAAiB,OAAO,eAA+B,CAAC,MAC5D,MAAM,QACJ,cAAc,YAAY,WAAW,mBAAmB,GACxD,gBACA,cACA,EACE,OAAO,WACT,CACF;;;;;;;CAQF,MAAM,iBAAiB,OAAO,eAA+B,CAAC,MAC5D,MAAM,QACJ,cAAc,YAAY,WAAW,cAAc,cAAc,GACjE,gBACA,cACA,EACE,OAAO,WACT,CACF;CAEF,OAAO;EACL;EACA;CACF;AACF;;;;;;;AAQA,MAAa,iBAAiB,eAAe,YAAY"}