@zeitvu97/cms-sdk 0.1.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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +478 -0
  3. package/dist/chunks/_shared-48T7q0V3.js +26 -0
  4. package/dist/chunks/_shared-48T7q0V3.js.map +1 -0
  5. package/dist/chunks/auth.constant-DO7ZmsKg.js +68 -0
  6. package/dist/chunks/auth.constant-DO7ZmsKg.js.map +1 -0
  7. package/dist/chunks/mt5Retcode-DlZLQOLA.js +178 -0
  8. package/dist/chunks/mt5Retcode-DlZLQOLA.js.map +1 -0
  9. package/dist/chunks/storage.constant--64BDSPW.js +44 -0
  10. package/dist/chunks/storage.constant--64BDSPW.js.map +1 -0
  11. package/dist/common/constants/auth.constant.d.ts +54 -0
  12. package/dist/common/constants/auth.constant.d.ts.map +1 -0
  13. package/dist/common/constants/bars.constant.d.ts +15 -0
  14. package/dist/common/constants/bars.constant.d.ts.map +1 -0
  15. package/dist/common/constants/content-types.constant.d.ts +29 -0
  16. package/dist/common/constants/content-types.constant.d.ts.map +1 -0
  17. package/dist/common/constants/content.constant.d.ts +114 -0
  18. package/dist/common/constants/content.constant.d.ts.map +1 -0
  19. package/dist/common/constants/executions.constant.d.ts +56 -0
  20. package/dist/common/constants/executions.constant.d.ts.map +1 -0
  21. package/dist/common/constants/gov.constant.d.ts +118 -0
  22. package/dist/common/constants/gov.constant.d.ts.map +1 -0
  23. package/dist/common/constants/history.constant.d.ts +108 -0
  24. package/dist/common/constants/history.constant.d.ts.map +1 -0
  25. package/dist/common/constants/http.constant.d.ts +46 -0
  26. package/dist/common/constants/http.constant.d.ts.map +1 -0
  27. package/dist/common/constants/index.d.ts +16 -0
  28. package/dist/common/constants/index.d.ts.map +1 -0
  29. package/dist/common/constants/kalshi.constant.d.ts +35 -0
  30. package/dist/common/constants/kalshi.constant.d.ts.map +1 -0
  31. package/dist/common/constants/llm.constant.d.ts +37 -0
  32. package/dist/common/constants/llm.constant.d.ts.map +1 -0
  33. package/dist/common/constants/mt5-action.constant.d.ts +131 -0
  34. package/dist/common/constants/mt5-action.constant.d.ts.map +1 -0
  35. package/dist/common/constants/mt5.constant.d.ts +254 -0
  36. package/dist/common/constants/mt5.constant.d.ts.map +1 -0
  37. package/dist/common/constants/notifications.constant.d.ts +45 -0
  38. package/dist/common/constants/notifications.constant.d.ts.map +1 -0
  39. package/dist/common/constants/people.constant.d.ts +269 -0
  40. package/dist/common/constants/people.constant.d.ts.map +1 -0
  41. package/dist/common/constants/rules.constant.d.ts +14 -0
  42. package/dist/common/constants/rules.constant.d.ts.map +1 -0
  43. package/dist/common/constants/settings.constant.d.ts +17 -0
  44. package/dist/common/constants/settings.constant.d.ts.map +1 -0
  45. package/dist/common/constants/sort.constant.d.ts +14 -0
  46. package/dist/common/constants/sort.constant.d.ts.map +1 -0
  47. package/dist/common/constants/storage.constant.d.ts +74 -0
  48. package/dist/common/constants/storage.constant.d.ts.map +1 -0
  49. package/dist/common/helpers/format.d.ts +7 -0
  50. package/dist/common/helpers/format.d.ts.map +1 -0
  51. package/dist/common/helpers/format.js +20 -0
  52. package/dist/common/helpers/format.js.map +1 -0
  53. package/dist/common/helpers/mt5Retcode.d.ts +18 -0
  54. package/dist/common/helpers/mt5Retcode.d.ts.map +1 -0
  55. package/dist/common/helpers/mt5Retcode.js +2 -0
  56. package/dist/common/helpers/mt5Retcode.js.map +1 -0
  57. package/dist/common/utils/case.d.ts +12 -0
  58. package/dist/common/utils/case.d.ts.map +1 -0
  59. package/dist/common/utils/clone.d.ts +9 -0
  60. package/dist/common/utils/clone.d.ts.map +1 -0
  61. package/dist/composables/cbsStateKey.d.ts +27 -0
  62. package/dist/composables/cbsStateKey.d.ts.map +1 -0
  63. package/dist/core/createApi.d.ts +69 -0
  64. package/dist/core/createApi.d.ts.map +1 -0
  65. package/dist/core/createCmsSDK.d.ts +19 -0
  66. package/dist/core/createCmsSDK.d.ts.map +1 -0
  67. package/dist/core/credentials/TokenManager.d.ts +38 -0
  68. package/dist/core/credentials/TokenManager.d.ts.map +1 -0
  69. package/dist/core/credentials/credential.type.d.ts +16 -0
  70. package/dist/core/credentials/credential.type.d.ts.map +1 -0
  71. package/dist/core/credentials/resolveStorage.d.ts +6 -0
  72. package/dist/core/credentials/resolveStorage.d.ts.map +1 -0
  73. package/dist/core/credentials/storages/cookieStorage.d.ts +18 -0
  74. package/dist/core/credentials/storages/cookieStorage.d.ts.map +1 -0
  75. package/dist/core/credentials/storages/localStorageAdapter.d.ts +8 -0
  76. package/dist/core/credentials/storages/localStorageAdapter.d.ts.map +1 -0
  77. package/dist/core/credentials/storages/memoryStorage.d.ts +7 -0
  78. package/dist/core/credentials/storages/memoryStorage.d.ts.map +1 -0
  79. package/dist/core/errors.d.ts +26 -0
  80. package/dist/core/errors.d.ts.map +1 -0
  81. package/dist/core/sdk.type.d.ts +115 -0
  82. package/dist/core/sdk.type.d.ts.map +1 -0
  83. package/dist/core/ws/createEaeraWebSocket.d.ts +21 -0
  84. package/dist/core/ws/createEaeraWebSocket.d.ts.map +1 -0
  85. package/dist/core/ws/index.d.ts +4 -0
  86. package/dist/core/ws/index.d.ts.map +1 -0
  87. package/dist/core/ws/ws.constants.d.ts +246 -0
  88. package/dist/core/ws/ws.constants.d.ts.map +1 -0
  89. package/dist/core/ws/ws.events.d.ts +264 -0
  90. package/dist/core/ws/ws.events.d.ts.map +1 -0
  91. package/dist/core/ws/ws.type.d.ts +225 -0
  92. package/dist/core/ws/ws.type.d.ts.map +1 -0
  93. package/dist/index.d.ts +130 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +8416 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/nuxt.d.ts +49 -0
  98. package/dist/nuxt.d.ts.map +1 -0
  99. package/dist/nuxt.js +47 -0
  100. package/dist/nuxt.js.map +1 -0
  101. package/dist/runtime/plugin.d.ts +6 -0
  102. package/dist/runtime/plugin.js +188 -0
  103. package/dist/runtime/plugin.js.map +1 -0
  104. package/dist/server/auth/cbs-callback.post.js +42 -0
  105. package/dist/server/auth/cbs-callback.post.js.map +1 -0
  106. package/dist/server/auth/cbs-start.post.js +34 -0
  107. package/dist/server/auth/cbs-start.post.js.map +1 -0
  108. package/dist/server/auth/idp-callback.get.js +52 -0
  109. package/dist/server/auth/idp-callback.get.js.map +1 -0
  110. package/dist/server/auth/idp-link.post.js +38 -0
  111. package/dist/server/auth/idp-link.post.js.map +1 -0
  112. package/dist/server/auth/idp-login.get.js +42 -0
  113. package/dist/server/auth/idp-login.get.js.map +1 -0
  114. package/dist/server/auth/idp-unlink.delete.js +38 -0
  115. package/dist/server/auth/idp-unlink.delete.js.map +1 -0
  116. package/dist/server/auth/login.post.js +42 -0
  117. package/dist/server/auth/login.post.js.map +1 -0
  118. package/dist/server/auth/logout.post.js +31 -0
  119. package/dist/server/auth/logout.post.js.map +1 -0
  120. package/dist/server/auth/refresh.post.js +46 -0
  121. package/dist/server/auth/refresh.post.js.map +1 -0
  122. package/dist/server/clear-token.delete.js +12 -0
  123. package/dist/server/clear-token.delete.js.map +1 -0
  124. package/dist/server/persist.post.js +31 -0
  125. package/dist/server/persist.post.js.map +1 -0
  126. package/dist/server/set-token.post.js +27 -0
  127. package/dist/server/set-token.post.js.map +1 -0
  128. package/dist/services/auth/auth.type.d.ts +66 -0
  129. package/dist/services/auth/auth.type.d.ts.map +1 -0
  130. package/dist/services/auth/index.d.ts +127 -0
  131. package/dist/services/auth/index.d.ts.map +1 -0
  132. package/dist/services/auth/mock.d.ts +13 -0
  133. package/dist/services/auth/mock.d.ts.map +1 -0
  134. package/dist/services/bars/bars.type.d.ts +78 -0
  135. package/dist/services/bars/bars.type.d.ts.map +1 -0
  136. package/dist/services/bars/index.d.ts +24 -0
  137. package/dist/services/bars/index.d.ts.map +1 -0
  138. package/dist/services/bars/mock.d.ts +23 -0
  139. package/dist/services/bars/mock.d.ts.map +1 -0
  140. package/dist/services/content/content.type.d.ts +832 -0
  141. package/dist/services/content/content.type.d.ts.map +1 -0
  142. package/dist/services/content/filter.d.ts +46 -0
  143. package/dist/services/content/filter.d.ts.map +1 -0
  144. package/dist/services/content/index.d.ts +35 -0
  145. package/dist/services/content/index.d.ts.map +1 -0
  146. package/dist/services/content/mock.d.ts +16 -0
  147. package/dist/services/content/mock.d.ts.map +1 -0
  148. package/dist/services/content-types/content-types.type.d.ts +70 -0
  149. package/dist/services/content-types/content-types.type.d.ts.map +1 -0
  150. package/dist/services/content-types/index.d.ts +18 -0
  151. package/dist/services/content-types/index.d.ts.map +1 -0
  152. package/dist/services/content-types/mock.d.ts +15 -0
  153. package/dist/services/content-types/mock.d.ts.map +1 -0
  154. package/dist/services/executions/executions.type.d.ts +67 -0
  155. package/dist/services/executions/executions.type.d.ts.map +1 -0
  156. package/dist/services/executions/index.d.ts +30 -0
  157. package/dist/services/executions/index.d.ts.map +1 -0
  158. package/dist/services/executions/mock.d.ts +29 -0
  159. package/dist/services/executions/mock.d.ts.map +1 -0
  160. package/dist/services/gov/gov.type.d.ts +740 -0
  161. package/dist/services/gov/gov.type.d.ts.map +1 -0
  162. package/dist/services/gov/index.d.ts +84 -0
  163. package/dist/services/gov/index.d.ts.map +1 -0
  164. package/dist/services/history/history.type.d.ts +167 -0
  165. package/dist/services/history/history.type.d.ts.map +1 -0
  166. package/dist/services/history/index.d.ts +38 -0
  167. package/dist/services/history/index.d.ts.map +1 -0
  168. package/dist/services/history/mock.d.ts +21 -0
  169. package/dist/services/history/mock.d.ts.map +1 -0
  170. package/dist/services/kalshi/index.d.ts +19 -0
  171. package/dist/services/kalshi/index.d.ts.map +1 -0
  172. package/dist/services/kalshi/kalshi.type.d.ts +99 -0
  173. package/dist/services/kalshi/kalshi.type.d.ts.map +1 -0
  174. package/dist/services/kalshi/mock.d.ts +5 -0
  175. package/dist/services/kalshi/mock.d.ts.map +1 -0
  176. package/dist/services/llm/index.d.ts +38 -0
  177. package/dist/services/llm/index.d.ts.map +1 -0
  178. package/dist/services/llm/llm.type.d.ts +106 -0
  179. package/dist/services/llm/llm.type.d.ts.map +1 -0
  180. package/dist/services/notifications/index.d.ts +38 -0
  181. package/dist/services/notifications/index.d.ts.map +1 -0
  182. package/dist/services/notifications/mock.d.ts +39 -0
  183. package/dist/services/notifications/mock.d.ts.map +1 -0
  184. package/dist/services/notifications/notifications.type.d.ts +75 -0
  185. package/dist/services/notifications/notifications.type.d.ts.map +1 -0
  186. package/dist/services/people/_invoke.d.ts +26 -0
  187. package/dist/services/people/_invoke.d.ts.map +1 -0
  188. package/dist/services/people/copilot/index.d.ts +132 -0
  189. package/dist/services/people/copilot/index.d.ts.map +1 -0
  190. package/dist/services/people/identity/actions.d.ts +116 -0
  191. package/dist/services/people/identity/actions.d.ts.map +1 -0
  192. package/dist/services/people/identity/ct.types.d.ts +133 -0
  193. package/dist/services/people/identity/ct.types.d.ts.map +1 -0
  194. package/dist/services/people/identity/index.d.ts +14 -0
  195. package/dist/services/people/identity/index.d.ts.map +1 -0
  196. package/dist/services/people/identity/projections.d.ts +63 -0
  197. package/dist/services/people/identity/projections.d.ts.map +1 -0
  198. package/dist/services/people/index.d.ts +31 -0
  199. package/dist/services/people/index.d.ts.map +1 -0
  200. package/dist/services/people/legal/actions.d.ts +161 -0
  201. package/dist/services/people/legal/actions.d.ts.map +1 -0
  202. package/dist/services/people/legal/ct.types.d.ts +186 -0
  203. package/dist/services/people/legal/ct.types.d.ts.map +1 -0
  204. package/dist/services/people/legal/index.d.ts +15 -0
  205. package/dist/services/people/legal/index.d.ts.map +1 -0
  206. package/dist/services/people/packops/index.d.ts +70 -0
  207. package/dist/services/people/packops/index.d.ts.map +1 -0
  208. package/dist/services/people/packops/packops.type.d.ts +183 -0
  209. package/dist/services/people/packops/packops.type.d.ts.map +1 -0
  210. package/dist/services/people/perms/actions.d.ts +214 -0
  211. package/dist/services/people/perms/actions.d.ts.map +1 -0
  212. package/dist/services/people/perms/ct.types.d.ts +140 -0
  213. package/dist/services/people/perms/ct.types.d.ts.map +1 -0
  214. package/dist/services/people/perms/index.d.ts +14 -0
  215. package/dist/services/people/perms/index.d.ts.map +1 -0
  216. package/dist/services/people/perms/projections.d.ts +47 -0
  217. package/dist/services/people/perms/projections.d.ts.map +1 -0
  218. package/dist/services/people/process/actions.d.ts +154 -0
  219. package/dist/services/people/process/actions.d.ts.map +1 -0
  220. package/dist/services/people/process/ct.types.d.ts +304 -0
  221. package/dist/services/people/process/ct.types.d.ts.map +1 -0
  222. package/dist/services/people/process/index.d.ts +12 -0
  223. package/dist/services/people/process/index.d.ts.map +1 -0
  224. package/dist/services/people/shared.types.d.ts +36 -0
  225. package/dist/services/people/shared.types.d.ts.map +1 -0
  226. package/dist/services/rules/conditions.d.ts +264 -0
  227. package/dist/services/rules/conditions.d.ts.map +1 -0
  228. package/dist/services/rules/index.d.ts +49 -0
  229. package/dist/services/rules/index.d.ts.map +1 -0
  230. package/dist/services/rules/llm-rule.constant.d.ts +84 -0
  231. package/dist/services/rules/llm-rule.constant.d.ts.map +1 -0
  232. package/dist/services/rules/mock.d.ts +20 -0
  233. package/dist/services/rules/mock.d.ts.map +1 -0
  234. package/dist/services/rules/rules.type.d.ts +262 -0
  235. package/dist/services/rules/rules.type.d.ts.map +1 -0
  236. package/dist/services/rules/triggers.d.ts +140 -0
  237. package/dist/services/rules/triggers.d.ts.map +1 -0
  238. package/dist/services/settings/index.d.ts +36 -0
  239. package/dist/services/settings/index.d.ts.map +1 -0
  240. package/dist/services/settings/mock.d.ts +14 -0
  241. package/dist/services/settings/mock.d.ts.map +1 -0
  242. package/dist/services/settings/settings.type.d.ts +39 -0
  243. package/dist/services/settings/settings.type.d.ts.map +1 -0
  244. package/dist/stores/auth.d.ts +192 -0
  245. package/dist/stores/auth.d.ts.map +1 -0
  246. package/dist/stores/bars.d.ts +288 -0
  247. package/dist/stores/bars.d.ts.map +1 -0
  248. package/dist/stores/content.d.ts +4101 -0
  249. package/dist/stores/content.d.ts.map +1 -0
  250. package/dist/stores/executions.d.ts +249 -0
  251. package/dist/stores/executions.d.ts.map +1 -0
  252. package/dist/stores/gov.d.ts +238 -0
  253. package/dist/stores/gov.d.ts.map +1 -0
  254. package/dist/stores/history.d.ts +833 -0
  255. package/dist/stores/history.d.ts.map +1 -0
  256. package/dist/stores/index.d.ts +15 -0
  257. package/dist/stores/index.d.ts.map +1 -0
  258. package/dist/stores/kalshi.d.ts +728 -0
  259. package/dist/stores/kalshi.d.ts.map +1 -0
  260. package/dist/stores/llm-providers.d.ts +97 -0
  261. package/dist/stores/llm-providers.d.ts.map +1 -0
  262. package/dist/stores/llm.d.ts +102 -0
  263. package/dist/stores/llm.d.ts.map +1 -0
  264. package/dist/stores/people.d.ts +596 -0
  265. package/dist/stores/people.d.ts.map +1 -0
  266. package/dist/stores/persist.d.ts +58 -0
  267. package/dist/stores/persist.d.ts.map +1 -0
  268. package/dist/stores/rules.d.ts +485 -0
  269. package/dist/stores/rules.d.ts.map +1 -0
  270. package/dist/stores/settings.d.ts +36 -0
  271. package/dist/stores/settings.d.ts.map +1 -0
  272. package/dist/stores/ws.d.ts +66 -0
  273. package/dist/stores/ws.d.ts.map +1 -0
  274. package/package.json +90 -0
@@ -0,0 +1,38 @@
1
+ import { defineEventHandler, createError, getQuery, parseCookies } from 'h3';
2
+ import { $fetch } from 'ofetch';
3
+ import { c as AUTH_ENDPOINT, b as HTTP_HEADER } from '../../chunks/auth.constant-DO7ZmsKg.js';
4
+ import { r as readSdkConfig } from '../../chunks/_shared-48T7q0V3.js';
5
+ import { T as TOKEN_STORAGE_KEY } from '../../chunks/storage.constant--64BDSPW.js';
6
+
7
+ const idpUnlink_delete = defineEventHandler(async (event) => {
8
+ const { cmsUrl, clientId } = readSdkConfig(event);
9
+ if (!cmsUrl) throw createError({ statusCode: 500, message: "CMS URL not configured" });
10
+ const query = getQuery(event);
11
+ const provider = (query.provider ?? "").trim();
12
+ if (!provider) throw createError({ statusCode: 400, message: "provider is required" });
13
+ const cookies = parseCookies(event);
14
+ const token = cookies[TOKEN_STORAGE_KEY] || "";
15
+ if (!token) throw createError({ statusCode: 401, message: "Not authenticated" });
16
+ try {
17
+ return await $fetch(AUTH_ENDPOINT.idpUnlink(provider), {
18
+ baseURL: cmsUrl,
19
+ method: "DELETE",
20
+ headers: {
21
+ [HTTP_HEADER.CLIENT_ID]: clientId || "",
22
+ [HTTP_HEADER.AUTHORIZATION]: `Bearer ${token}`
23
+ }
24
+ });
25
+ } catch (err) {
26
+ const beData = err?.data ?? {};
27
+ const detail = beData.detail ?? {};
28
+ const message = detail.errorDescription ?? detail.error ?? beData.error ?? err?.message;
29
+ throw createError({
30
+ statusCode: err?.response?.status || err?.statusCode || 500,
31
+ message: message || "IdP unlink failed",
32
+ data: beData
33
+ });
34
+ }
35
+ });
36
+
37
+ export { idpUnlink_delete as default };
38
+ //# sourceMappingURL=idp-unlink.delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idp-unlink.delete.js","sources":["../../../src/server/auth/idp-unlink.delete.ts"],"sourcesContent":["import { defineEventHandler, parseCookies, getQuery, createError } from 'h3';\nimport { $fetch } from 'ofetch';\nimport { AUTH_ENDPOINT } from '../../common/constants/auth.constant';\nimport { HTTP_HEADER } from '../../common/constants/http.constant';\nimport { readSdkConfig, TOKEN_STORAGE_KEY } from './_shared';\n\n/**\n * Thin auth proxy: DELETE /api/cms/idp-unlink → backend DELETE /api/auth/{provider}/unlink.\n *\n * Unlinks the IdP provider from the CURRENTLY signed-in CMS user. The backend\n * requires an authenticated caller, so the httpOnly access-token cookie is\n * forwarded as `Authorization: Bearer <token>`.\n */\nexport default defineEventHandler(async (event) => {\n const { cmsUrl, clientId } = readSdkConfig(event);\n if (!cmsUrl) throw createError({ statusCode: 500, message: 'CMS URL not configured' });\n\n const query = getQuery(event) as { provider?: string };\n const provider = (query.provider ?? '').trim();\n if (!provider) throw createError({ statusCode: 400, message: 'provider is required' });\n\n const cookies = parseCookies(event);\n const token = cookies[TOKEN_STORAGE_KEY] || '';\n if (!token) throw createError({ statusCode: 401, message: 'Not authenticated' });\n\n try {\n return await $fetch(AUTH_ENDPOINT.idpUnlink(provider), {\n baseURL: cmsUrl,\n method: 'DELETE',\n headers: {\n [HTTP_HEADER.CLIENT_ID]: clientId || '',\n [HTTP_HEADER.AUTHORIZATION]: `Bearer ${token}`,\n },\n });\n } catch (err: any) {\n // The CMS nests the real error one level down:\n // `{ error: \"HTTPException\", detail: { error, errorDescription } }`.\n const beData = (err?.data ?? {}) as Record<string, any>;\n const detail = (beData.detail ?? {}) as Record<string, any>;\n const message = detail.errorDescription ?? detail.error ?? beData.error ?? err?.message;\n throw createError({\n statusCode: err?.response?.status || err?.statusCode || 500,\n message: message || 'IdP unlink failed',\n data: beData,\n });\n }\n});\n"],"names":[],"mappings":";;;;;;AAaA,yBAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,cAAc,KAAK,CAAA;AAChD,EAAA,IAAI,CAAC,QAAQ,MAAM,WAAA,CAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,wBAAA,EAA0B,CAAA;AAErF,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAA,CAAY,KAAA,CAAM,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAC7C,EAAA,IAAI,CAAC,UAAU,MAAM,WAAA,CAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,sBAAA,EAAwB,CAAA;AAErF,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,iBAAiB,CAAA,IAAK,EAAA;AAC5C,EAAA,IAAI,CAAC,OAAO,MAAM,WAAA,CAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,mBAAA,EAAqB,CAAA;AAE/E,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,MACrD,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,CAAC,WAAA,CAAY,SAAS,GAAG,QAAA,IAAY,EAAA;AAAA,QACrC,CAAC,WAAA,CAAY,aAAa,GAAG,UAAU,KAAK,CAAA;AAAA;AAC9C,KACD,CAAA;AAAA,EACH,SAAS,GAAA,EAAU;AAGjB,IAAA,MAAM,MAAA,GAAU,GAAA,EAAK,IAAA,IAAQ,EAAC;AAC9B,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,IAAU,EAAC;AAClC,IAAA,MAAM,UAAU,MAAA,CAAO,gBAAA,IAAoB,OAAO,KAAA,IAAS,MAAA,CAAO,SAAS,GAAA,EAAK,OAAA;AAChF,IAAA,MAAM,WAAA,CAAY;AAAA,MAChB,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,MAAA,IAAU,KAAK,UAAA,IAAc,GAAA;AAAA,MACxD,SAAS,OAAA,IAAW,mBAAA;AAAA,MACpB,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
@@ -0,0 +1,42 @@
1
+ import { defineEventHandler, createError, readBody, parseCookies, getRequestHeader, setCookie } from 'h3';
2
+ import { $fetch } from 'ofetch';
3
+ import { b as HTTP_HEADER, c as AUTH_ENDPOINT } from '../../chunks/auth.constant-DO7ZmsKg.js';
4
+ import { r as readSdkConfig, T as TOKEN_COOKIE_OPTIONS } from '../../chunks/_shared-48T7q0V3.js';
5
+ import { T as TOKEN_STORAGE_KEY, R as REFRESH_TOKEN_STORAGE_KEY } from '../../chunks/storage.constant--64BDSPW.js';
6
+
7
+ const login_post = defineEventHandler(async (event) => {
8
+ const { cmsUrl, clientId } = readSdkConfig(event);
9
+ if (!cmsUrl) throw createError({ statusCode: 500, message: "CMS URL not configured" });
10
+ const body = await readBody(event);
11
+ const cookies = parseCookies(event);
12
+ const userAgent = getRequestHeader(event, HTTP_HEADER.USER_AGENT) || "";
13
+ try {
14
+ const response = await $fetch.raw(AUTH_ENDPOINT.LOGIN, {
15
+ baseURL: cmsUrl,
16
+ method: "POST",
17
+ body,
18
+ headers: {
19
+ [HTTP_HEADER.CLIENT_ID]: clientId || "",
20
+ [HTTP_HEADER.DEVICE_ID]: cookies.device_id || "",
21
+ [HTTP_HEADER.DEVICE_IP]: cookies.device_ip || "",
22
+ [HTTP_HEADER.USER_AGENT]: userAgent
23
+ }
24
+ });
25
+ const data = response._data ?? {};
26
+ const token = data.accessToken ?? data.access_token ?? "";
27
+ const refreshToken = data.refreshToken ?? data.refresh_token ?? "";
28
+ if (token) setCookie(event, TOKEN_STORAGE_KEY, token, TOKEN_COOKIE_OPTIONS);
29
+ if (refreshToken)
30
+ setCookie(event, REFRESH_TOKEN_STORAGE_KEY, refreshToken, TOKEN_COOKIE_OPTIONS);
31
+ return { ...data, token };
32
+ } catch (err) {
33
+ throw createError({
34
+ statusCode: err?.response?.status || err?.statusCode || 500,
35
+ message: err?.data?.error || err?.data?.message || err?.message || "Login failed",
36
+ data: err?.data
37
+ });
38
+ }
39
+ });
40
+
41
+ export { login_post as default };
42
+ //# sourceMappingURL=login.post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.post.js","sources":["../../../src/server/auth/login.post.ts"],"sourcesContent":["import {\n defineEventHandler,\n readBody,\n parseCookies,\n getRequestHeader,\n setCookie,\n createError,\n} from 'h3';\nimport { $fetch } from 'ofetch';\nimport { AUTH_ENDPOINT } from '../../common/constants/auth.constant';\nimport { HTTP_HEADER } from '../../common/constants/http.constant';\nimport {\n readSdkConfig,\n REFRESH_TOKEN_STORAGE_KEY,\n TOKEN_COOKIE_OPTIONS,\n TOKEN_STORAGE_KEY,\n} from './_shared';\n\n/**\n * Thin auth proxy: POST /api/cms/login → backend POST /api/auth/login.\n *\n * The real backend returns the access token in the response BODY as\n * `accessToken` (camelCase). This route reads it from the body, stores it as an\n * httpOnly cookie, and returns the body augmented with a `token` field so the\n * client can mirror the token in memory (the httpOnly cookie is the durable\n * copy used for SSR).\n *\n * Device id/ip and user-agent are forwarded from the incoming request.\n */\nexport default defineEventHandler(async (event) => {\n const { cmsUrl, clientId } = readSdkConfig(event);\n if (!cmsUrl) throw createError({ statusCode: 500, message: 'CMS URL not configured' });\n\n const body = await readBody(event);\n const cookies = parseCookies(event);\n const userAgent = getRequestHeader(event, HTTP_HEADER.USER_AGENT) || '';\n\n try {\n const response = await $fetch.raw(AUTH_ENDPOINT.LOGIN, {\n baseURL: cmsUrl,\n method: 'POST',\n body,\n headers: {\n [HTTP_HEADER.CLIENT_ID]: clientId || '',\n [HTTP_HEADER.DEVICE_ID]: cookies.device_id || '',\n [HTTP_HEADER.DEVICE_IP]: cookies.device_ip || '',\n [HTTP_HEADER.USER_AGENT]: userAgent,\n },\n });\n const data = (response._data ?? {}) as Record<string, unknown>;\n // camelCase is the backend default; fall back to snake_case just in case.\n const token =\n (data.accessToken as string | undefined) ?? (data.access_token as string | undefined) ?? '';\n const refreshToken =\n (data.refreshToken as string | undefined) ?? (data.refresh_token as string | undefined) ?? '';\n if (token) setCookie(event, TOKEN_STORAGE_KEY, token, TOKEN_COOKIE_OPTIONS);\n // Persist the refresh token as an httpOnly cookie so the SDK can rotate the\n // access token silently when it expires.\n if (refreshToken)\n setCookie(event, REFRESH_TOKEN_STORAGE_KEY, refreshToken, TOKEN_COOKIE_OPTIONS);\n return { ...data, token };\n } catch (err: any) {\n throw createError({\n statusCode: err?.response?.status || err?.statusCode || 500,\n message: err?.data?.error || err?.data?.message || err?.message || 'Login failed',\n data: err?.data,\n });\n }\n});\n"],"names":[],"mappings":";;;;;;AA6BA,mBAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,cAAc,KAAK,CAAA;AAChD,EAAA,IAAI,CAAC,QAAQ,MAAM,WAAA,CAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,wBAAA,EAA0B,CAAA;AAErF,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,KAAK,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,KAAA,EAAO,WAAA,CAAY,UAAU,CAAA,IAAK,EAAA;AAErE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAI,cAAc,KAAA,EAAO;AAAA,MACrD,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,CAAC,WAAA,CAAY,SAAS,GAAG,QAAA,IAAY,EAAA;AAAA,QACrC,CAAC,WAAA,CAAY,SAAS,GAAG,QAAQ,SAAA,IAAa,EAAA;AAAA,QAC9C,CAAC,WAAA,CAAY,SAAS,GAAG,QAAQ,SAAA,IAAa,EAAA;AAAA,QAC9C,CAAC,WAAA,CAAY,UAAU,GAAG;AAAA;AAC5B,KACD,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,QAAA,CAAS,KAAA,IAAS,EAAC;AAEjC,IAAA,MAAM,KAAA,GACH,IAAA,CAAK,WAAA,IAAuC,IAAA,CAAK,YAAA,IAAuC,EAAA;AAC3F,IAAA,MAAM,YAAA,GACH,IAAA,CAAK,YAAA,IAAwC,IAAA,CAAK,aAAA,IAAwC,EAAA;AAC7F,IAAA,IAAI,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,iBAAA,EAAmB,OAAO,oBAAoB,CAAA;AAG1E,IAAA,IAAI,YAAA;AACF,MAAA,SAAA,CAAU,KAAA,EAAO,yBAAA,EAA2B,YAAA,EAAc,oBAAoB,CAAA;AAChF,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1B,SAAS,GAAA,EAAU;AACjB,IAAA,MAAM,WAAA,CAAY;AAAA,MAChB,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,MAAA,IAAU,KAAK,UAAA,IAAc,GAAA;AAAA,MACxD,OAAA,EAAS,KAAK,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,EAAM,OAAA,IAAW,KAAK,OAAA,IAAW,cAAA;AAAA,MACnE,MAAM,GAAA,EAAK;AAAA,KACZ,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
@@ -0,0 +1,31 @@
1
+ import { defineEventHandler, parseCookies, deleteCookie } from 'h3';
2
+ import { $fetch } from 'ofetch';
3
+ import { c as AUTH_ENDPOINT, b as HTTP_HEADER } from '../../chunks/auth.constant-DO7ZmsKg.js';
4
+ import { r as readSdkConfig, T as TOKEN_COOKIE_OPTIONS } from '../../chunks/_shared-48T7q0V3.js';
5
+ import { T as TOKEN_STORAGE_KEY, R as REFRESH_TOKEN_STORAGE_KEY } from '../../chunks/storage.constant--64BDSPW.js';
6
+
7
+ const logout_post = defineEventHandler(async (event) => {
8
+ const { cmsUrl, clientId } = readSdkConfig(event);
9
+ const cookies = parseCookies(event);
10
+ const token = cookies[TOKEN_STORAGE_KEY] || "";
11
+ try {
12
+ if (cmsUrl && token) {
13
+ await $fetch.raw(AUTH_ENDPOINT.LOGOUT, {
14
+ baseURL: cmsUrl,
15
+ method: "POST",
16
+ headers: {
17
+ // The cookie stores the raw JWT; the backend expects a bearer header.
18
+ [HTTP_HEADER.AUTHORIZATION]: `Bearer ${token}`,
19
+ [HTTP_HEADER.CLIENT_ID]: clientId || ""
20
+ }
21
+ });
22
+ }
23
+ } catch {
24
+ }
25
+ deleteCookie(event, TOKEN_STORAGE_KEY, { path: TOKEN_COOKIE_OPTIONS.path });
26
+ deleteCookie(event, REFRESH_TOKEN_STORAGE_KEY, { path: TOKEN_COOKIE_OPTIONS.path });
27
+ return { success: true };
28
+ });
29
+
30
+ export { logout_post as default };
31
+ //# sourceMappingURL=logout.post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.post.js","sources":["../../../src/server/auth/logout.post.ts"],"sourcesContent":["import { defineEventHandler, parseCookies, deleteCookie } from 'h3';\nimport { $fetch } from 'ofetch';\nimport { AUTH_ENDPOINT } from '../../common/constants/auth.constant';\nimport { HTTP_HEADER } from '../../common/constants/http.constant';\nimport {\n readSdkConfig,\n REFRESH_TOKEN_STORAGE_KEY,\n TOKEN_COOKIE_OPTIONS,\n TOKEN_STORAGE_KEY,\n} from './_shared';\n\n/**\n * Thin auth proxy: POST /api/cms/logout → backend POST /api/auth/logout.\n *\n * Best-effort backend logout using the token from the httpOnly cookie (the real\n * backend expects `Authorization: Bearer <jwt>`), then clears the cookie\n * regardless of backend outcome.\n */\nexport default defineEventHandler(async (event) => {\n const { cmsUrl, clientId } = readSdkConfig(event);\n const cookies = parseCookies(event);\n const token = cookies[TOKEN_STORAGE_KEY] || '';\n\n try {\n if (cmsUrl && token) {\n await $fetch.raw(AUTH_ENDPOINT.LOGOUT, {\n baseURL: cmsUrl,\n method: 'POST',\n headers: {\n // The cookie stores the raw JWT; the backend expects a bearer header.\n [HTTP_HEADER.AUTHORIZATION]: `Bearer ${token}`,\n [HTTP_HEADER.CLIENT_ID]: clientId || '',\n },\n });\n }\n } catch {\n // Backend logout failure should not prevent clearing the local cookie.\n }\n\n deleteCookie(event, TOKEN_STORAGE_KEY, { path: TOKEN_COOKIE_OPTIONS.path });\n deleteCookie(event, REFRESH_TOKEN_STORAGE_KEY, { path: TOKEN_COOKIE_OPTIONS.path });\n return { success: true };\n});\n"],"names":[],"mappings":";;;;;;AAkBA,oBAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,cAAc,KAAK,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,iBAAiB,CAAA,IAAK,EAAA;AAE5C,EAAA,IAAI;AACF,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,aAAA,CAAc,MAAA,EAAQ;AAAA,QACrC,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA;AAAA,UAEP,CAAC,WAAA,CAAY,aAAa,GAAG,UAAU,KAAK,CAAA,CAAA;AAAA,UAC5C,CAAC,WAAA,CAAY,SAAS,GAAG,QAAA,IAAY;AAAA;AACvC,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,YAAA,CAAa,OAAO,iBAAA,EAAmB,EAAE,IAAA,EAAM,oBAAA,CAAqB,MAAM,CAAA;AAC1E,EAAA,YAAA,CAAa,OAAO,yBAAA,EAA2B,EAAE,IAAA,EAAM,oBAAA,CAAqB,MAAM,CAAA;AAClF,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB,CAAC,CAAA;;;;"}
@@ -0,0 +1,46 @@
1
+ import { defineEventHandler, createError, parseCookies, setCookie } from 'h3';
2
+ import { $fetch } from 'ofetch';
3
+ import { c as AUTH_ENDPOINT, b as HTTP_HEADER, R as RESPONSE_CASING_VALUE } from '../../chunks/auth.constant-DO7ZmsKg.js';
4
+ import { r as readSdkConfig, T as TOKEN_COOKIE_OPTIONS } from '../../chunks/_shared-48T7q0V3.js';
5
+ import { R as REFRESH_TOKEN_STORAGE_KEY, T as TOKEN_STORAGE_KEY } from '../../chunks/storage.constant--64BDSPW.js';
6
+
7
+ const refresh_post = defineEventHandler(async (event) => {
8
+ const { cmsUrl, clientId, requestCasing, responseCasing } = readSdkConfig(event);
9
+ if (!cmsUrl) throw createError({ statusCode: 500, message: "CMS URL not configured" });
10
+ const cookies = parseCookies(event);
11
+ const refreshToken = cookies[REFRESH_TOKEN_STORAGE_KEY] || "";
12
+ if (!refreshToken) {
13
+ throw createError({ statusCode: 401, message: "No refresh token" });
14
+ }
15
+ const snake = requestCasing === RESPONSE_CASING_VALUE.SNAKE;
16
+ const body = snake ? { grant_type: "refresh_token", refresh_token: refreshToken } : { grantType: "refresh_token", refreshToken };
17
+ const headers = {
18
+ [HTTP_HEADER.CLIENT_ID]: clientId || ""
19
+ };
20
+ if (snake) headers[HTTP_HEADER.REQUEST_CASING] = RESPONSE_CASING_VALUE.SNAKE;
21
+ if (responseCasing === RESPONSE_CASING_VALUE.SNAKE) {
22
+ headers[HTTP_HEADER.RESPONSE_CASING] = RESPONSE_CASING_VALUE.SNAKE;
23
+ }
24
+ try {
25
+ const data = await $fetch(AUTH_ENDPOINT.REFRESH, {
26
+ baseURL: cmsUrl,
27
+ method: "POST",
28
+ body,
29
+ headers
30
+ });
31
+ const token = data.accessToken ?? data.access_token ?? "";
32
+ const newRefresh = data.refreshToken ?? data.refresh_token ?? "";
33
+ if (token) setCookie(event, TOKEN_STORAGE_KEY, token, TOKEN_COOKIE_OPTIONS);
34
+ if (newRefresh) setCookie(event, REFRESH_TOKEN_STORAGE_KEY, newRefresh, TOKEN_COOKIE_OPTIONS);
35
+ return { ...data, token };
36
+ } catch (err) {
37
+ throw createError({
38
+ statusCode: err?.response?.status || err?.statusCode || 401,
39
+ message: err?.data?.error || err?.data?.message || err?.message || "Token refresh failed",
40
+ data: err?.data
41
+ });
42
+ }
43
+ });
44
+
45
+ export { refresh_post as default };
46
+ //# sourceMappingURL=refresh.post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.post.js","sources":["../../../src/server/auth/refresh.post.ts"],"sourcesContent":["import { defineEventHandler, parseCookies, setCookie, createError } from 'h3';\nimport { $fetch } from 'ofetch';\nimport { AUTH_ENDPOINT } from '../../common/constants/auth.constant';\nimport { HTTP_HEADER, RESPONSE_CASING_VALUE } from '../../common/constants/http.constant';\nimport {\n readSdkConfig,\n REFRESH_TOKEN_STORAGE_KEY,\n TOKEN_COOKIE_OPTIONS,\n TOKEN_STORAGE_KEY,\n} from './_shared';\n\n/**\n * Thin auth proxy: POST /api/cms/refresh → backend POST /api/oauth/token.\n *\n * Exchanges the httpOnly `cms_refresh_token` cookie for a new access (+ refresh)\n * token via the backend OAuth token endpoint (`grant_type=refresh_token`), then\n * rotates both httpOnly cookies. Returns the new access token in the body\n * (`{ token }`) so the client can mirror it in memory.\n *\n * Request body casing: camelCase by default (`{ grantType, refreshToken }`);\n * when `requestCasing: 'snake'` is configured, sends snake_case keys +\n * `x-request-casing: snake`. Response keys are read with a snake fallback so\n * the proxy is robust to either casing.\n */\nexport default defineEventHandler(async (event) => {\n const { cmsUrl, clientId, requestCasing, responseCasing } = readSdkConfig(event);\n if (!cmsUrl) throw createError({ statusCode: 500, message: 'CMS URL not configured' });\n\n const cookies = parseCookies(event);\n const refreshToken = cookies[REFRESH_TOKEN_STORAGE_KEY] || '';\n if (!refreshToken) {\n throw createError({ statusCode: 401, message: 'No refresh token' });\n }\n\n const snake = requestCasing === RESPONSE_CASING_VALUE.SNAKE;\n const body = snake\n ? { grant_type: 'refresh_token', refresh_token: refreshToken }\n : { grantType: 'refresh_token', refreshToken };\n\n const headers: Record<string, string> = {\n [HTTP_HEADER.CLIENT_ID]: clientId || '',\n };\n if (snake) headers[HTTP_HEADER.REQUEST_CASING] = RESPONSE_CASING_VALUE.SNAKE;\n if (responseCasing === RESPONSE_CASING_VALUE.SNAKE) {\n headers[HTTP_HEADER.RESPONSE_CASING] = RESPONSE_CASING_VALUE.SNAKE;\n }\n\n try {\n const data = (await $fetch(AUTH_ENDPOINT.REFRESH, {\n baseURL: cmsUrl,\n method: 'POST',\n body,\n headers,\n })) as Record<string, unknown>;\n\n const token =\n (data.accessToken as string | undefined) ?? (data.access_token as string | undefined) ?? '';\n const newRefresh =\n (data.refreshToken as string | undefined) ?? (data.refresh_token as string | undefined) ?? '';\n\n if (token) setCookie(event, TOKEN_STORAGE_KEY, token, TOKEN_COOKIE_OPTIONS);\n if (newRefresh) setCookie(event, REFRESH_TOKEN_STORAGE_KEY, newRefresh, TOKEN_COOKIE_OPTIONS);\n\n return { ...data, token };\n } catch (err: any) {\n throw createError({\n statusCode: err?.response?.status || err?.statusCode || 401,\n message: err?.data?.error || err?.data?.message || err?.message || 'Token refresh failed',\n data: err?.data,\n });\n }\n});\n"],"names":[],"mappings":";;;;;;AAwBA,qBAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,eAAe,cAAA,EAAe,GAAI,cAAc,KAAK,CAAA;AAC/E,EAAA,IAAI,CAAC,QAAQ,MAAM,WAAA,CAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,wBAAA,EAA0B,CAAA;AAErF,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,yBAAyB,CAAA,IAAK,EAAA;AAC3D,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,YAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,oBAAoB,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAkB,qBAAA,CAAsB,KAAA;AACtD,EAAA,MAAM,IAAA,GAAO,KAAA,GACT,EAAE,UAAA,EAAY,eAAA,EAAiB,aAAA,EAAe,YAAA,EAAa,GAC3D,EAAE,SAAA,EAAW,eAAA,EAAiB,YAAA,EAAa;AAE/C,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,CAAC,WAAA,CAAY,SAAS,GAAG,QAAA,IAAY;AAAA,GACvC;AACA,EAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,cAAc,IAAI,qBAAA,CAAsB,KAAA;AACvE,EAAA,IAAI,cAAA,KAAmB,sBAAsB,KAAA,EAAO;AAClD,IAAA,OAAA,CAAQ,WAAA,CAAY,eAAe,CAAA,GAAI,qBAAA,CAAsB,KAAA;AAAA,EAC/D;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAQ,MAAM,MAAA,CAAO,aAAA,CAAc,OAAA,EAAS;AAAA,MAChD,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAAA,GACH,IAAA,CAAK,WAAA,IAAuC,IAAA,CAAK,YAAA,IAAuC,EAAA;AAC3F,IAAA,MAAM,UAAA,GACH,IAAA,CAAK,YAAA,IAAwC,IAAA,CAAK,aAAA,IAAwC,EAAA;AAE7F,IAAA,IAAI,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,iBAAA,EAAmB,OAAO,oBAAoB,CAAA;AAC1E,IAAA,IAAI,UAAA,EAAY,SAAA,CAAU,KAAA,EAAO,yBAAA,EAA2B,YAAY,oBAAoB,CAAA;AAE5F,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1B,SAAS,GAAA,EAAU;AACjB,IAAA,MAAM,WAAA,CAAY;AAAA,MAChB,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,MAAA,IAAU,KAAK,UAAA,IAAc,GAAA;AAAA,MACxD,OAAA,EAAS,KAAK,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,EAAM,OAAA,IAAW,KAAK,OAAA,IAAW,sBAAA;AAAA,MACnE,MAAM,GAAA,EAAK;AAAA,KACZ,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
@@ -0,0 +1,12 @@
1
+ import { defineEventHandler, deleteCookie } from 'h3';
2
+ import { T as TOKEN_STORAGE_KEY, a as COOKIE_DEFAULTS } from '../chunks/storage.constant--64BDSPW.js';
3
+
4
+ const clearToken_delete = defineEventHandler(async (event) => {
5
+ deleteCookie(event, TOKEN_STORAGE_KEY, {
6
+ path: COOKIE_DEFAULTS.PATH
7
+ });
8
+ return { success: true };
9
+ });
10
+
11
+ export { clearToken_delete as default };
12
+ //# sourceMappingURL=clear-token.delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-token.delete.js","sources":["../../src/server/clear-token.delete.ts"],"sourcesContent":["import { defineEventHandler, deleteCookie } from 'h3';\nimport { COOKIE_DEFAULTS, TOKEN_STORAGE_KEY } from '../common/constants/storage.constant';\n\nexport default defineEventHandler(async (event) => {\n deleteCookie(event, TOKEN_STORAGE_KEY, {\n path: COOKIE_DEFAULTS.PATH,\n });\n return { success: true };\n});\n"],"names":[],"mappings":";;;AAGA,0BAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,YAAA,CAAa,OAAO,iBAAA,EAAmB;AAAA,IACrC,MAAM,eAAA,CAAgB;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB,CAAC,CAAA;;;;"}
@@ -0,0 +1,31 @@
1
+ import { defineEventHandler, readBody, createError, deleteCookie, setCookie } from 'h3';
2
+ import { b as PERSIST_ALLOWED_KEYS, T as TOKEN_STORAGE_KEY, a as COOKIE_DEFAULTS, c as PERSIST_MAX_BYTES } from '../chunks/storage.constant--64BDSPW.js';
3
+
4
+ const PERSIST_COOKIE_OPTIONS = {
5
+ httpOnly: COOKIE_DEFAULTS.HTTP_ONLY,
6
+ secure: COOKIE_DEFAULTS.SECURE,
7
+ sameSite: COOKIE_DEFAULTS.SAME_SITE.toLowerCase(),
8
+ path: COOKIE_DEFAULTS.PATH,
9
+ maxAge: COOKIE_DEFAULTS.MAX_AGE_SECONDS
10
+ };
11
+ const ALLOWED_KEYS = new Set(PERSIST_ALLOWED_KEYS);
12
+ const persist_post = defineEventHandler(async (event) => {
13
+ const body = await readBody(event);
14
+ const key = body?.key;
15
+ const value = body?.value ?? null;
16
+ if (typeof key !== "string" || !ALLOWED_KEYS.has(key) || key === TOKEN_STORAGE_KEY) {
17
+ throw createError({ statusCode: 400, message: "Invalid persist key" });
18
+ }
19
+ if (value === null) {
20
+ deleteCookie(event, key, { path: PERSIST_COOKIE_OPTIONS.path });
21
+ return { ok: true };
22
+ }
23
+ if (typeof value !== "string" || value.length >= PERSIST_MAX_BYTES) {
24
+ throw createError({ statusCode: 400, message: "Invalid or too large persist value" });
25
+ }
26
+ setCookie(event, key, value, PERSIST_COOKIE_OPTIONS);
27
+ return { ok: true };
28
+ });
29
+
30
+ export { persist_post as default };
31
+ //# sourceMappingURL=persist.post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.post.js","sources":["../../src/server/persist.post.ts"],"sourcesContent":["import { defineEventHandler, readBody, setCookie, deleteCookie, createError } from 'h3';\nimport {\n PERSIST_ALLOWED_KEYS,\n PERSIST_MAX_BYTES,\n TOKEN_STORAGE_KEY,\n} from '../common/constants/storage.constant';\nimport { COOKIE_DEFAULTS } from '../common/constants/storage.constant';\n\n/**\n * Common persistence endpoint. The internal Pinia persistence plugin POSTs\n * client-side httpOnly writes here so the server sets the httpOnly cookie (a\n * client cannot set an httpOnly cookie itself).\n *\n * Security guards (mandatory):\n * - `key` must be in `PERSIST_ALLOWED_KEYS` (and never the token key).\n * - cookie options are fixed (httpOnly/secure/sameSite/path) — the client\n * cannot weaken them.\n * - value size is capped (< PERSIST_MAX_BYTES).\n */\nconst PERSIST_COOKIE_OPTIONS = {\n httpOnly: COOKIE_DEFAULTS.HTTP_ONLY,\n secure: COOKIE_DEFAULTS.SECURE,\n sameSite: COOKIE_DEFAULTS.SAME_SITE.toLowerCase() as 'lax',\n path: COOKIE_DEFAULTS.PATH,\n maxAge: COOKIE_DEFAULTS.MAX_AGE_SECONDS,\n};\n\nconst ALLOWED_KEYS = new Set<string>(PERSIST_ALLOWED_KEYS);\n\ninterface IPersistBody {\n key?: unknown;\n value?: unknown;\n}\n\nexport default defineEventHandler(async (event) => {\n const body = await readBody<IPersistBody>(event);\n const key = body?.key;\n const value = body?.value ?? null;\n\n if (typeof key !== 'string' || !ALLOWED_KEYS.has(key) || key === TOKEN_STORAGE_KEY) {\n throw createError({ statusCode: 400, message: 'Invalid persist key' });\n }\n\n if (value === null) {\n deleteCookie(event, key, { path: PERSIST_COOKIE_OPTIONS.path });\n return { ok: true };\n }\n\n if (typeof value !== 'string' || value.length >= PERSIST_MAX_BYTES) {\n throw createError({ statusCode: 400, message: 'Invalid or too large persist value' });\n }\n\n setCookie(event, key, value, PERSIST_COOKIE_OPTIONS);\n return { ok: true };\n});\n"],"names":[],"mappings":";;;AAmBA,MAAM,sBAAA,GAAyB;AAAA,EAC7B,UAAU,eAAA,CAAgB,SAAA;AAAA,EAC1B,QAAQ,eAAA,CAAgB,MAAA;AAAA,EACxB,QAAA,EAAU,eAAA,CAAgB,SAAA,CAAU,WAAA,EAAY;AAAA,EAChD,MAAM,eAAA,CAAgB,IAAA;AAAA,EACtB,QAAQ,eAAA,CAAgB;AAC1B,CAAA;AAEA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAY,oBAAoB,CAAA;AAOzD,qBAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAuB,KAAK,CAAA;AAC/C,EAAA,MAAM,MAAM,IAAA,EAAM,GAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,IAAA;AAE7B,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,CAAC,aAAa,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,KAAQ,iBAAA,EAAmB;AAClF,IAAA,MAAM,YAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,uBAAuB,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,YAAA,CAAa,OAAO,GAAA,EAAK,EAAE,IAAA,EAAM,sBAAA,CAAuB,MAAM,CAAA;AAC9D,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,UAAU,iBAAA,EAAmB;AAClE,IAAA,MAAM,YAAY,EAAE,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,sCAAsC,CAAA;AAAA,EACtF;AAEA,EAAA,SAAA,CAAU,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,sBAAsB,CAAA;AACnD,EAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AACpB,CAAC,CAAA;;;;"}
@@ -0,0 +1,27 @@
1
+ import { defineEventHandler, readBody, setCookie } from 'h3';
2
+ import { T as TOKEN_STORAGE_KEY, a as COOKIE_DEFAULTS } from '../chunks/storage.constant--64BDSPW.js';
3
+
4
+ const setToken_post = defineEventHandler(async (event) => {
5
+ try {
6
+ const body = await readBody(event);
7
+ const token = body?.token || body?.accessToken || "";
8
+ if (!token) {
9
+ event.node.res.statusCode = 400;
10
+ return { error: "Missing token in request body" };
11
+ }
12
+ setCookie(event, TOKEN_STORAGE_KEY, token, {
13
+ httpOnly: COOKIE_DEFAULTS.HTTP_ONLY,
14
+ secure: COOKIE_DEFAULTS.SECURE,
15
+ sameSite: COOKIE_DEFAULTS.SAME_SITE.toLowerCase(),
16
+ path: COOKIE_DEFAULTS.PATH,
17
+ maxAge: COOKIE_DEFAULTS.MAX_AGE_SECONDS
18
+ });
19
+ return { success: true };
20
+ } catch (err) {
21
+ event.node.res.statusCode = err?.statusCode || 500;
22
+ return { error: err?.message || "Failed to set token" };
23
+ }
24
+ });
25
+
26
+ export { setToken_post as default };
27
+ //# sourceMappingURL=set-token.post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-token.post.js","sources":["../../src/server/set-token.post.ts"],"sourcesContent":["import { defineEventHandler, readBody, setCookie } from 'h3';\nimport { COOKIE_DEFAULTS, TOKEN_STORAGE_KEY } from '../common/constants/storage.constant';\n\nexport default defineEventHandler(async (event) => {\n try {\n const body = await readBody(event);\n const token = body?.token || body?.accessToken || '';\n\n if (!token) {\n event.node.res.statusCode = 400;\n return { error: 'Missing token in request body' };\n }\n\n setCookie(event, TOKEN_STORAGE_KEY, token, {\n httpOnly: COOKIE_DEFAULTS.HTTP_ONLY,\n secure: COOKIE_DEFAULTS.SECURE,\n sameSite: COOKIE_DEFAULTS.SAME_SITE.toLowerCase() as 'lax',\n path: COOKIE_DEFAULTS.PATH,\n maxAge: COOKIE_DEFAULTS.MAX_AGE_SECONDS,\n });\n\n return { success: true };\n } catch (err: any) {\n event.node.res.statusCode = err?.statusCode || 500;\n return { error: err?.message || 'Failed to set token' };\n }\n});\n"],"names":[],"mappings":";;;AAGA,sBAAe,kBAAA,CAAmB,OAAO,KAAA,KAAU;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,KAAK,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,IAAA,EAAM,WAAA,IAAe,EAAA;AAElD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,GAAa,GAAA;AAC5B,MAAA,OAAO,EAAE,OAAO,+BAAA,EAAgC;AAAA,IAClD;AAEA,IAAA,SAAA,CAAU,KAAA,EAAO,mBAAmB,KAAA,EAAO;AAAA,MACzC,UAAU,eAAA,CAAgB,SAAA;AAAA,MAC1B,QAAQ,eAAA,CAAgB,MAAA;AAAA,MACxB,QAAA,EAAU,eAAA,CAAgB,SAAA,CAAU,WAAA,EAAY;AAAA,MAChD,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,QAAQ,eAAA,CAAgB;AAAA,KACzB,CAAA;AAED,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB,SAAS,GAAA,EAAU;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,GAAA,EAAK,UAAA,IAAc,GAAA;AAC/C,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,OAAA,IAAW,qBAAA,EAAsB;AAAA,EACxD;AACF,CAAC,CAAA;;;;"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Auth domain DTOs.
3
+ *
4
+ * Field names are camelCase to align with the CMS backend contract and the
5
+ * project naming convention for all public SDK data shapes.
6
+ *
7
+ * The access token is NOT part of these DTOs — it travels in the response
8
+ * header and is captured by the `createApi` `onResponse` hook into
9
+ * `TokenManager` (single source of truth).
10
+ */
11
+ export interface IAuthUser {
12
+ id: number;
13
+ /** `users.uuid` — the People pack identity ref (registry §3.19). */
14
+ uuid?: string;
15
+ email: string;
16
+ name?: string;
17
+ firstName?: string;
18
+ lastName?: string;
19
+ phone?: string;
20
+ country?: string;
21
+ state?: string;
22
+ allowRoutes?: string[];
23
+ kycId?: number;
24
+ clientId?: number;
25
+ }
26
+ export interface IEmployee {
27
+ id: number;
28
+ email?: string;
29
+ name?: string;
30
+ }
31
+ /** Response of login — a subset session profile. */
32
+ export interface IAuthSessionResponse {
33
+ user?: IAuthUser;
34
+ employee?: IEmployee;
35
+ }
36
+ export interface ILoginPayload {
37
+ email: string;
38
+ password: string;
39
+ }
40
+ /**
41
+ * Row of `GET /api/auth/users` — the CMS user registry. The backend may
42
+ * return any subset of label fields; every field except `id` is optional.
43
+ */
44
+ export interface ICmsUser {
45
+ id: number;
46
+ /** `users.uuid` — the People pack identity ref (registry §3.19:
47
+ * `subject_ref`/`requester_ref` = users.uuid). Optional until every
48
+ * engine deployment projects it. */
49
+ uuid?: string;
50
+ email?: string;
51
+ name?: string;
52
+ firstName?: string;
53
+ lastName?: string;
54
+ username?: string;
55
+ fullName?: string;
56
+ phone?: string;
57
+ clientId?: number;
58
+ }
59
+ /** Query for `GET /api/auth/users`. */
60
+ export interface IUsersQuery {
61
+ page?: number;
62
+ perPage?: number;
63
+ /** Free-text search across the user label fields (backend-defined). */
64
+ search?: string;
65
+ }
66
+ //# sourceMappingURL=auth.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.type.d.ts","sourceRoot":"","sources":["../../../src/services/auth/auth.type.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX;;wCAEoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,127 @@
1
+ import { $Fetch } from 'ofetch';
2
+ import { IAuthSessionResponse, ICmsUser, ILoginPayload, IUsersQuery } from './auth.type';
3
+ export interface IAuthServiceOptions {
4
+ /** The CMS `$Fetch` instance (one of `sdk.apis`). */
5
+ api: $Fetch;
6
+ /**
7
+ * Optional `$Fetch` for token-lifecycle flows (login/logout/token). The
8
+ * Nuxt module points this at `/api/cms/*` server routes so those flows set
9
+ * the httpOnly cookie atomically and return the token in the body. When
10
+ * omitted, token-lifecycle flows call the backend directly via `api` (token
11
+ * captured by the `createApi` `onResponse` hook).
12
+ */
13
+ routeApi?: $Fetch;
14
+ /** Lazy flag — when true, the service returns fake data. */
15
+ mock: () => boolean;
16
+ }
17
+ /** Session response possibly augmented with `token` (when served via a route). */
18
+ export type IAuthRouteResponse = IAuthSessionResponse & {
19
+ token?: string;
20
+ };
21
+ /** Response of the OAuth token (refresh) endpoint. */
22
+ export interface ITokenResponse {
23
+ /** New access token (present when served via the Nuxt proxy). */
24
+ token?: string;
25
+ accessToken?: string;
26
+ refreshToken?: string;
27
+ [key: string]: unknown;
28
+ }
29
+ /** Response of `POST /api/v1/auth/oauth/cbs/start` ("Login with CBS" init). */
30
+ export interface ICbsStartResponse {
31
+ /** CBS `/oauth/authorize` URL (carries the PKCE challenge) the browser navigates to. */
32
+ authorizeUrl: string;
33
+ /** Opaque handle echoed back to `/cbs-callback`; pairs the flow with the server-side PKCE/state. */
34
+ stateKey: string;
35
+ /** Same as `authorizeUrl` (kept for client-API symmetry). */
36
+ redirectTarget: string;
37
+ }
38
+ /**
39
+ * Registered IdP SSO provider names (api_references §2). Only providers the
40
+ * engine has credentials for are active — others 404 on the login init.
41
+ */
42
+ export type AuthIdpProvider = 'microsoft' | (string & {});
43
+ /** Response of the IdP SSO login init (`GET /api/auth/{provider}/login`). */
44
+ export interface IIdpLoginStartResponse {
45
+ /** Provider authorize URL (e.g. `login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize`) — the browser navigates here. */
46
+ authorizationUrl: string;
47
+ /** One-use state bound to the flow (TTL 600s); echo it back on the callback. */
48
+ state: string;
49
+ }
50
+ /**
51
+ * Response of the IdP SSO callback (`GET /api/auth/{provider}/callback`).
52
+ * The access token is a JWT resolved via JWKS — usable as a normal Bearer
53
+ * credential for every protected API.
54
+ */
55
+ export interface IIdpCallbackResponse extends IAuthSessionResponse {
56
+ /** CMS user id behind the IdP identity. */
57
+ userId?: number;
58
+ /** True when the callback created a new CMS user. */
59
+ isNewUser?: boolean;
60
+ /** Provider name (e.g. `microsoft`). */
61
+ provider?: string;
62
+ /** Access token mirror (present when served via the Nuxt proxy). */
63
+ token?: string;
64
+ accessToken?: string;
65
+ refreshToken?: string;
66
+ /** Access-token lifetime in seconds. */
67
+ expiresIn?: number;
68
+ }
69
+ /** Response of `GET /api/auth/users` — list envelope (paginated or bare array). */
70
+ export interface IUsersResponse {
71
+ items: ICmsUser[];
72
+ total?: number;
73
+ page?: number;
74
+ perPage?: number;
75
+ }
76
+ export interface IAuthService {
77
+ login(payload: ILoginPayload, userAgent?: string): Promise<IAuthRouteResponse>;
78
+ logout(): Promise<unknown>;
79
+ /** Exchange the refresh token for a new access token (`POST /api/oauth/token`). */
80
+ token(): Promise<ITokenResponse>;
81
+ /**
82
+ * User registry (`GET /api/auth/users`) — the CMS auth users. Accepts
83
+ * pagination + free-text search; normalizes bare-array responses into
84
+ * `{ items }`.
85
+ */
86
+ users(query?: IUsersQuery): Promise<IUsersResponse>;
87
+ /** Initialise a "Login with CBS" attempt (`POST /api/v1/auth/oauth/cbs/start`). */
88
+ cbsStart(): Promise<ICbsStartResponse>;
89
+ /** Complete a "Login with CBS" attempt (`POST /api/v1/auth/oauth/cbs/callback`). */
90
+ cbsCallback(code: string, state: string, stateKey: string): Promise<IAuthRouteResponse>;
91
+ /**
92
+ * Initialise an IdP SSO login (`GET /api/auth/{provider}/login`). Returns the
93
+ * provider authorize URL + one-use state; navigate the browser there.
94
+ */
95
+ idpLogin(provider: AuthIdpProvider, redirectUri: string): Promise<IIdpLoginStartResponse>;
96
+ /**
97
+ * Complete an IdP SSO login (`GET /api/auth/{provider}/callback`). Exchanges
98
+ * `{code, state, redirectUri}` for a CMS JWT + refresh token; when served via
99
+ * the Nuxt proxy the httpOnly cookies are already set and `token` mirrors the
100
+ * access token.
101
+ */
102
+ idpCallback(provider: AuthIdpProvider, code: string, state: string, redirectUri: string): Promise<IIdpCallbackResponse>;
103
+ /** Link the signed-in user to the provider (`POST /api/auth/{provider}/link`). */
104
+ idpLink(provider: AuthIdpProvider): Promise<unknown>;
105
+ /** Unlink the provider from the signed-in user (`DELETE /api/auth/{provider}/unlink`). */
106
+ idpUnlink(provider: AuthIdpProvider): Promise<unknown>;
107
+ }
108
+ /**
109
+ * Auth domain service. Mirrors the CMS backend auth surface, which exposes
110
+ * exactly three endpoints:
111
+ *
112
+ * POST /api/auth/login → login (confirmed — real backend)
113
+ * POST /api/auth/logout → logout (confirmed — real backend, POST)
114
+ * POST /api/oauth/token → token (confirmed — OAuth, grant_type=refresh_token)
115
+ *
116
+ * The access token is NOT returned in the login body — it travels in the
117
+ * response header and is auto-captured by the `createApi` `onResponse` hook
118
+ * into `TokenManager`. Callers therefore only deal with session domain data.
119
+ * The `token()` method (refresh) returns the new access token in the body
120
+ * (`{ token }`) so the caller can mirror it in memory.
121
+ *
122
+ * When a `routeApi` (Nuxt module) is configured, all three flows route through
123
+ * the app-origin proxies (`/api/cms/login`, `/api/cms/logout`, `/api/cms/refresh`)
124
+ * so the httpOnly cookies are set/cleared/rotated atomically.
125
+ */
126
+ export declare function createAuthService(opts: IAuthServiceOptions): IAuthService;
127
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,OAAO,CAAC;CACrB;AAED,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE1D,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB;IACrC,6HAA6H;IAC7H,gBAAgB,EAAE,MAAM,CAAC;IACzB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/E,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,mFAAmF;IACnF,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,mFAAmF;IACnF,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,oFAAoF;IACpF,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxF;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC1F;;;;;OAKG;IACH,WAAW,CACT,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,kFAAkF;IAClF,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,0FAA0F;IAC1F,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAkLzE"}
@@ -0,0 +1,13 @@
1
+ import { IAuthSessionResponse, IAuthUser } from './auth.type';
2
+ /**
3
+ * Fake auth data for mock mode.
4
+ *
5
+ * NOTE: in mock mode the request never reaches the network, so the
6
+ * `createApi` `onResponse` hook (which captures the token from the response
7
+ * header) does NOT fire. To simulate a logged-in session under mock, call
8
+ * `sdk.tokenManager.set('<fake-token>')` explicitly, or wire it from the
9
+ * store's mock login branch.
10
+ */
11
+ export declare const MOCK_AUTH_USER: IAuthUser;
12
+ export declare const MOCK_SESSION: IAuthSessionResponse;
13
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/services/auth/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,SAY5B,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,oBAG1B,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { MT5_INTERVAL, MT5Interval } from '../../common/constants/mt5.constant';
2
+ /** Single source-interval value (always M1; doc §5.5.2). */
3
+ type M1Only = typeof MT5_INTERVAL.M1;
4
+ /**
5
+ * Chart-bars query — mirrors BE `GET /api/v1/chart/bars` (doc §5.5.1).
6
+ * All fields use camelCase; the service forwards them verbatim to the backend.
7
+ */
8
+ export interface BarsQuery {
9
+ symbol: string;
10
+ /**
11
+ * Accepts FE-style ('1m','5m','15m','30m','1h','4h','1d','1w','1M')
12
+ * OR MT5-style ('M1'…'MN1'). Passed through verbatim; the backend maps
13
+ * both to the same bucket width.
14
+ */
15
+ interval: MT5Interval | ChartIntervalFe | (string & {});
16
+ /** ISO-8601, inclusive lower bound. */
17
+ fromTime: string;
18
+ /** ISO-8601, exclusive upper bound, strictly > fromTime. */
19
+ toTime: string;
20
+ /** MT5 server filter. Defaults to MT5_SERVER_NAME when omitted. */
21
+ serverName?: string;
22
+ /** 1..5000, applied AFTER aggregation. Default 1000. */
23
+ limit?: number;
24
+ /** 'asc' (oldest first, default) | 'desc' (newest first). */
25
+ sortDirection?: BarsSortDirection;
26
+ }
27
+ export type BarsSortDirection = 'asc' | 'desc';
28
+ /** Aggregation-source label for a derived bar (doc §5.5.2). Distinct from
29
+ * MT5ChartBarSource (raw Mt5ChartBar.data.source, doc §4.6). */
30
+ export type BarsItemSource = 'aggregated' | 'live' | 'backfill';
31
+ export interface BarItem {
32
+ symbol: string;
33
+ /** Canonical MT5-style bucket width. */
34
+ interval: MT5Interval;
35
+ /** ISO-8601 UTC; bucket-start for aggregated bars. */
36
+ mt5Ts: string;
37
+ open: number;
38
+ high: number;
39
+ low: number;
40
+ close: number;
41
+ tickVolume: number | null;
42
+ volume: number | null;
43
+ spread: number | null;
44
+ source: BarsItemSource | null;
45
+ }
46
+ export interface BarsResponse {
47
+ items: BarItem[];
48
+ symbol: string;
49
+ /** Canonical label returned by the backend. */
50
+ interval: MT5Interval;
51
+ /** ISO-8601 UTC (= parsed fromTime). */
52
+ fromTime: string;
53
+ /** ISO-8601 UTC (= parsed toTime). */
54
+ toTime: string;
55
+ /** Always 'M1' — the only persisted interval. */
56
+ sourceInterval: M1Only;
57
+ /** items.length. */
58
+ count: number;
59
+ /** true iff interval !== 'M1' and bucketing occurred. */
60
+ aggregated: boolean;
61
+ }
62
+ /** FE-style timeframe labels accepted by GET /api/v1/chart/bars (doc §5.5.1). */
63
+ export declare const CHART_INTERVAL: {
64
+ readonly M1: "1m";
65
+ readonly M5: "5m";
66
+ readonly M15: "15m";
67
+ readonly M30: "30m";
68
+ readonly H1: "1h";
69
+ readonly H4: "4h";
70
+ readonly D1: "1d";
71
+ readonly W1: "1w";
72
+ readonly MN1: "1M";
73
+ };
74
+ export type ChartIntervalFe = (typeof CHART_INTERVAL)[keyof typeof CHART_INTERVAL];
75
+ /** Map either dialect to the canonical MT5 label. */
76
+ export declare function normalizeChartInterval(input: MT5Interval | ChartIntervalFe | string): MT5Interval;
77
+ export {};
78
+ //# sourceMappingURL=bars.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bars.type.d.ts","sourceRoot":"","sources":["../../../src/services/bars/bars.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAErF,4DAA4D;AAC5D,KAAK,MAAM,GAAG,OAAO,YAAY,CAAC,EAAE,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,EAAE,WAAW,GAAG,eAAe,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACxD,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/C;iEACiE;AACjE,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,QAAQ,EAAE,WAAW,CAAC;IACtB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,QAAQ,EAAE,WAAW,CAAC;IACtB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,iFAAiF;AACjF,eAAO,MAAM,cAAc;;;;;;;;;;CAUjB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAenF,qDAAqD;AACrD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,GAAG,MAAM,GAAG,WAAW,CAGjG"}
@@ -0,0 +1,24 @@
1
+ import { $Fetch } from 'ofetch';
2
+ import { BarsQuery, BarsResponse } from './bars.type';
3
+ export interface IBarsServiceOptions {
4
+ /** The CMS `$Fetch` instance (one of `sdk.apis`). */
5
+ api: $Fetch;
6
+ /** Lazy flag — when true, the service returns fake data. */
7
+ mock: () => boolean;
8
+ }
9
+ export interface IBarsService {
10
+ getBars(query: BarsQuery): Promise<BarsResponse>;
11
+ }
12
+ /**
13
+ * Chart-bars service (read-only). Wraps `GET /api/v1/chart/bars` — the
14
+ * canonical OHLC read path for chart rendering of any timeframe. Storage
15
+ * is always M1; larger timeframes are derived on demand via bucket-and-reduce.
16
+ *
17
+ * Endpoint contract (`eaera_cms/chart/routes.py`, doc §5.5):
18
+ * GET /api/v1/chart/bars → BarsResponse
19
+ *
20
+ * While `mock()` returns true, all methods resolve against the local fake
21
+ * dataset and never touch `api`.
22
+ */
23
+ export declare function createBarsService(opts: IBarsServiceOptions): IBarsService;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/bars/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,IAAI,EAAE,MAAM,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAmCzE"}