wcz-test 6.23.1 → 6.24.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 (300) hide show
  1. package/dist/_virtual/___vite-browser-external.js +7 -0
  2. package/dist/_virtual/___vite-browser-external.js.map +1 -0
  3. package/dist/_virtual/__vite-browser-external.js +5 -0
  4. package/dist/_virtual/__vite-browser-external.js.map +1 -0
  5. package/dist/_virtual/_commonjsHelpers.js +37 -0
  6. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  7. package/dist/_virtual/index.js +8 -0
  8. package/dist/_virtual/index.js.map +1 -0
  9. package/dist/_virtual/index2.js +5 -0
  10. package/dist/_virtual/index2.js.map +1 -0
  11. package/dist/_virtual/index3.js +5 -0
  12. package/dist/_virtual/index3.js.map +1 -0
  13. package/dist/_virtual/index4.js +5 -0
  14. package/dist/_virtual/index4.js.map +1 -0
  15. package/dist/_virtual/index5.js +5 -0
  16. package/dist/_virtual/index5.js.map +1 -0
  17. package/dist/_virtual/index6.js +5 -0
  18. package/dist/_virtual/index6.js.map +1 -0
  19. package/dist/_virtual/re.js +5 -0
  20. package/dist/_virtual/re.js.map +1 -0
  21. package/dist/components/core/AppTitle.js +1 -1
  22. package/dist/components/core/AppTitle.js.map +1 -1
  23. package/dist/components/core/Fullscreen.js +2 -2
  24. package/dist/components/core/Fullscreen.js.map +1 -1
  25. package/dist/components/core/Layout.js +7 -8
  26. package/dist/components/core/Layout.js.map +1 -1
  27. package/dist/components/core/ToolbarAccount.js +123 -143
  28. package/dist/components/core/ToolbarAccount.js.map +1 -1
  29. package/dist/components/core/TypographyWithIcon.js +2 -2
  30. package/dist/components/core/TypographyWithIcon.js.map +1 -1
  31. package/dist/components/core/navigation/NavigationList.js +2 -2
  32. package/dist/components/core/navigation/NavigationList.js.map +1 -1
  33. package/dist/components/core/navigation/NavigationListItem.js +6 -6
  34. package/dist/components/core/navigation/NavigationListItem.js.map +1 -1
  35. package/dist/components/data-grid/EditableColumnHeader.js +1 -1
  36. package/dist/components/data-grid/EditableColumnHeader.js.map +1 -1
  37. package/dist/components/file/Dropzone.js +2 -2
  38. package/dist/components/file/Dropzone.js.map +1 -1
  39. package/dist/components/file/FileViewer.js +2 -2
  40. package/dist/components/file/FileViewer.js.map +1 -1
  41. package/dist/components/file/fileViewer/FileViewerGrid.js +1 -1
  42. package/dist/components/file/fileViewer/FileViewerGrid.js.map +1 -1
  43. package/dist/components/router/RouterError.js +2 -2
  44. package/dist/components/router/RouterError.js.map +1 -1
  45. package/dist/components/router/RouterNotFound.js +2 -2
  46. package/dist/components/router/RouterNotFound.js.map +1 -1
  47. package/dist/env.d.ts +5 -2
  48. package/dist/env.js +11 -7
  49. package/dist/env.js.map +1 -1
  50. package/dist/exports/hooks.d.ts +0 -1
  51. package/dist/exports/index.d.ts +1 -0
  52. package/dist/exports/models.d.ts +1 -0
  53. package/dist/exports/queries.d.ts +1 -1
  54. package/dist/exports/server.d.ts +3 -0
  55. package/dist/hooks.js +0 -2
  56. package/dist/hooks.js.map +1 -1
  57. package/dist/index.js +2 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/auth/api.d.ts +3 -0
  60. package/dist/lib/auth/api.js +97 -0
  61. package/dist/lib/auth/api.js.map +1 -0
  62. package/dist/lib/auth/entra.d.ts +2 -0
  63. package/dist/lib/auth/entra.js +13 -0
  64. package/dist/lib/auth/entra.js.map +1 -0
  65. package/dist/lib/auth/graph.d.ts +17 -0
  66. package/dist/lib/auth/graph.js +72 -0
  67. package/dist/lib/auth/graph.js.map +1 -0
  68. package/dist/lib/auth/session.d.ts +24 -0
  69. package/dist/lib/auth/session.js +76 -0
  70. package/dist/lib/auth/session.js.map +1 -0
  71. package/dist/lib/queryClient.d.ts +2 -0
  72. package/dist/lib/queryClient.js +6 -0
  73. package/dist/lib/queryClient.js.map +1 -0
  74. package/dist/lib/utils.js.map +1 -1
  75. package/dist/middleware/auth.d.ts +13 -4
  76. package/dist/models/User.d.ts +8 -3
  77. package/dist/models/User.js +18 -0
  78. package/dist/models/User.js.map +1 -0
  79. package/dist/node_modules/@oslojs/binary/dist/bits.js +7 -0
  80. package/dist/node_modules/@oslojs/binary/dist/bits.js.map +1 -0
  81. package/dist/node_modules/@oslojs/binary/dist/uint.js +80 -0
  82. package/dist/node_modules/@oslojs/binary/dist/uint.js.map +1 -0
  83. package/dist/node_modules/@oslojs/crypto/dist/sha2/sha256.js +182 -0
  84. package/dist/node_modules/@oslojs/crypto/dist/sha2/sha256.js.map +1 -0
  85. package/dist/node_modules/@oslojs/crypto/dist/sha2/sha512.js +83 -0
  86. package/dist/node_modules/@oslojs/crypto/dist/sha2/sha512.js.map +1 -0
  87. package/dist/node_modules/@oslojs/encoding/dist/base32.js +11 -0
  88. package/dist/node_modules/@oslojs/encoding/dist/base32.js.map +1 -0
  89. package/dist/node_modules/@oslojs/encoding/dist/base64.js +46 -0
  90. package/dist/node_modules/@oslojs/encoding/dist/base64.js.map +1 -0
  91. package/dist/node_modules/@oslojs/jwt/dist/index.js +28 -0
  92. package/dist/node_modules/@oslojs/jwt/dist/index.js.map +1 -0
  93. package/dist/node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base32.js +11 -0
  94. package/dist/node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base32.js.map +1 -0
  95. package/dist/node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base64.js +126 -0
  96. package/dist/node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base64.js.map +1 -0
  97. package/dist/node_modules/arctic/dist/client.js +12 -0
  98. package/dist/node_modules/arctic/dist/client.js.map +1 -0
  99. package/dist/node_modules/arctic/dist/oauth2.js +76 -0
  100. package/dist/node_modules/arctic/dist/oauth2.js.map +1 -0
  101. package/dist/node_modules/arctic/dist/oidc.js +14 -0
  102. package/dist/node_modules/arctic/dist/oidc.js.map +1 -0
  103. package/dist/node_modules/arctic/dist/providers/microsoft-entra-id.js +73 -0
  104. package/dist/node_modules/arctic/dist/providers/microsoft-entra-id.js.map +1 -0
  105. package/dist/node_modules/arctic/dist/request.js +149 -0
  106. package/dist/node_modules/arctic/dist/request.js.map +1 -0
  107. package/dist/node_modules/arctic/dist/utils.js +25 -0
  108. package/dist/node_modules/arctic/dist/utils.js.map +1 -0
  109. package/dist/node_modules/base64-js/index.js +103 -0
  110. package/dist/node_modules/base64-js/index.js.map +1 -0
  111. package/dist/node_modules/buffer/index.js +1598 -0
  112. package/dist/node_modules/buffer/index.js.map +1 -0
  113. package/dist/node_modules/buffer-equal-constant-time/index.js +39 -0
  114. package/dist/node_modules/buffer-equal-constant-time/index.js.map +1 -0
  115. package/dist/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js +140 -0
  116. package/dist/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js.map +1 -0
  117. package/dist/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js +28 -0
  118. package/dist/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js.map +1 -0
  119. package/dist/node_modules/ieee754/index.js +88 -0
  120. package/dist/node_modules/ieee754/index.js.map +1 -0
  121. package/dist/node_modules/jsonwebtoken/decode.js +38 -0
  122. package/dist/node_modules/jsonwebtoken/decode.js.map +1 -0
  123. package/dist/node_modules/jsonwebtoken/index.js +25 -0
  124. package/dist/node_modules/jsonwebtoken/index.js.map +1 -0
  125. package/dist/node_modules/jsonwebtoken/lib/JsonWebTokenError.js +23 -0
  126. package/dist/node_modules/jsonwebtoken/lib/JsonWebTokenError.js.map +1 -0
  127. package/dist/node_modules/jsonwebtoken/lib/NotBeforeError.js +21 -0
  128. package/dist/node_modules/jsonwebtoken/lib/NotBeforeError.js.map +1 -0
  129. package/dist/node_modules/jsonwebtoken/lib/TokenExpiredError.js +21 -0
  130. package/dist/node_modules/jsonwebtoken/lib/TokenExpiredError.js.map +1 -0
  131. package/dist/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js +14 -0
  132. package/dist/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js.map +1 -0
  133. package/dist/node_modules/jsonwebtoken/lib/psSupported.js +14 -0
  134. package/dist/node_modules/jsonwebtoken/lib/psSupported.js.map +1 -0
  135. package/dist/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js +14 -0
  136. package/dist/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js.map +1 -0
  137. package/dist/node_modules/jsonwebtoken/lib/timespan.js +27 -0
  138. package/dist/node_modules/jsonwebtoken/lib/timespan.js.map +1 -0
  139. package/dist/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js +60 -0
  140. package/dist/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js.map +1 -0
  141. package/dist/node_modules/jsonwebtoken/node_modules/semver/classes/comparator.js +123 -0
  142. package/dist/node_modules/jsonwebtoken/node_modules/semver/classes/comparator.js.map +1 -0
  143. package/dist/node_modules/jsonwebtoken/node_modules/semver/classes/range.js +388 -0
  144. package/dist/node_modules/jsonwebtoken/node_modules/semver/classes/range.js.map +1 -0
  145. package/dist/node_modules/jsonwebtoken/node_modules/semver/classes/semver.js +288 -0
  146. package/dist/node_modules/jsonwebtoken/node_modules/semver/classes/semver.js.map +1 -0
  147. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/clean.js +18 -0
  148. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/clean.js.map +1 -0
  149. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/cmp.js +60 -0
  150. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/cmp.js.map +1 -0
  151. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/coerce.js +53 -0
  152. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/coerce.js.map +1 -0
  153. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/compare-build.js +19 -0
  154. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/compare-build.js.map +1 -0
  155. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/compare-loose.js +15 -0
  156. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/compare-loose.js.map +1 -0
  157. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/compare.js +15 -0
  158. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/compare.js.map +1 -0
  159. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/diff.js +49 -0
  160. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/diff.js.map +1 -0
  161. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/eq.js +15 -0
  162. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/eq.js.map +1 -0
  163. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/gt.js +15 -0
  164. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/gt.js.map +1 -0
  165. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/gte.js +15 -0
  166. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/gte.js.map +1 -0
  167. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/inc.js +29 -0
  168. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/inc.js.map +1 -0
  169. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/lt.js +15 -0
  170. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/lt.js.map +1 -0
  171. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/lte.js +15 -0
  172. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/lte.js.map +1 -0
  173. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/major.js +15 -0
  174. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/major.js.map +1 -0
  175. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/minor.js +15 -0
  176. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/minor.js.map +1 -0
  177. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/neq.js +15 -0
  178. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/neq.js.map +1 -0
  179. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/parse.js +27 -0
  180. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/parse.js.map +1 -0
  181. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/patch.js +15 -0
  182. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/patch.js.map +1 -0
  183. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/prerelease.js +18 -0
  184. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/prerelease.js.map +1 -0
  185. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/rcompare.js +15 -0
  186. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/rcompare.js.map +1 -0
  187. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/rsort.js +15 -0
  188. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/rsort.js.map +1 -0
  189. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/satisfies.js +22 -0
  190. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/satisfies.js.map +1 -0
  191. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/sort.js +15 -0
  192. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/sort.js.map +1 -0
  193. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/valid.js +18 -0
  194. package/dist/node_modules/jsonwebtoken/node_modules/semver/functions/valid.js.map +1 -0
  195. package/dist/node_modules/jsonwebtoken/node_modules/semver/index.js +140 -0
  196. package/dist/node_modules/jsonwebtoken/node_modules/semver/index.js.map +1 -0
  197. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/constants.js +36 -0
  198. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/constants.js.map +1 -0
  199. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/debug.js +14 -0
  200. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/debug.js.map +1 -0
  201. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/identifiers.js +29 -0
  202. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/identifiers.js.map +1 -0
  203. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/lrucache.js +42 -0
  204. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/lrucache.js.map +1 -0
  205. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/parse-options.js +23 -0
  206. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/parse-options.js.map +1 -0
  207. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/re.js +96 -0
  208. package/dist/node_modules/jsonwebtoken/node_modules/semver/internal/re.js.map +1 -0
  209. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/gtr.js +15 -0
  210. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/gtr.js.map +1 -0
  211. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/intersects.js +19 -0
  212. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/intersects.js.map +1 -0
  213. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/ltr.js +15 -0
  214. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/ltr.js.map +1 -0
  215. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/max-satisfying.js +35 -0
  216. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/max-satisfying.js.map +1 -0
  217. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/min-satisfying.js +35 -0
  218. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/min-satisfying.js.map +1 -0
  219. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/min-version.js +66 -0
  220. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/min-version.js.map +1 -0
  221. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/outside.js +81 -0
  222. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/outside.js.map +1 -0
  223. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/simplify.js +56 -0
  224. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/simplify.js.map +1 -0
  225. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/subset.js +170 -0
  226. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/subset.js.map +1 -0
  227. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/to-comparators.js +15 -0
  228. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/to-comparators.js.map +1 -0
  229. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/valid.js +21 -0
  230. package/dist/node_modules/jsonwebtoken/node_modules/semver/ranges/valid.js.map +1 -0
  231. package/dist/node_modules/jsonwebtoken/sign.js +242 -0
  232. package/dist/node_modules/jsonwebtoken/sign.js.map +1 -0
  233. package/dist/node_modules/jsonwebtoken/verify.js +229 -0
  234. package/dist/node_modules/jsonwebtoken/verify.js.map +1 -0
  235. package/dist/node_modules/jwa/index.js +233 -0
  236. package/dist/node_modules/jwa/index.js.map +1 -0
  237. package/dist/node_modules/jws/index.js +40 -0
  238. package/dist/node_modules/jws/index.js.map +1 -0
  239. package/dist/node_modules/jws/lib/data-stream.js +55 -0
  240. package/dist/node_modules/jws/lib/data-stream.js.map +1 -0
  241. package/dist/node_modules/jws/lib/sign-stream.js +85 -0
  242. package/dist/node_modules/jws/lib/sign-stream.js.map +1 -0
  243. package/dist/node_modules/jws/lib/tostring.js +20 -0
  244. package/dist/node_modules/jws/lib/tostring.js.map +1 -0
  245. package/dist/node_modules/jws/lib/verify-stream.js +125 -0
  246. package/dist/node_modules/jws/lib/verify-stream.js.map +1 -0
  247. package/dist/node_modules/lodash.includes/index.js +181 -0
  248. package/dist/node_modules/lodash.includes/index.js.map +1 -0
  249. package/dist/node_modules/lodash.isboolean/index.js +21 -0
  250. package/dist/node_modules/lodash.isboolean/index.js.map +1 -0
  251. package/dist/node_modules/lodash.isinteger/index.js +67 -0
  252. package/dist/node_modules/lodash.isinteger/index.js.map +1 -0
  253. package/dist/node_modules/lodash.isnumber/index.js +21 -0
  254. package/dist/node_modules/lodash.isnumber/index.js.map +1 -0
  255. package/dist/node_modules/lodash.isplainobject/index.js +48 -0
  256. package/dist/node_modules/lodash.isplainobject/index.js.map +1 -0
  257. package/dist/node_modules/lodash.isstring/index.js +22 -0
  258. package/dist/node_modules/lodash.isstring/index.js.map +1 -0
  259. package/dist/node_modules/lodash.once/index.js +84 -0
  260. package/dist/node_modules/lodash.once/index.js.map +1 -0
  261. package/dist/node_modules/ms/index.js +121 -0
  262. package/dist/node_modules/ms/index.js.map +1 -0
  263. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +1 -1
  264. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -1
  265. package/dist/node_modules/react/cjs/react-jsx-runtime.production.js +1 -1
  266. package/dist/node_modules/react/cjs/react-jsx-runtime.production.js.map +1 -1
  267. package/dist/node_modules/safe-buffer/index.js +66 -0
  268. package/dist/node_modules/safe-buffer/index.js.map +1 -0
  269. package/dist/providers/LayoutProvider.js +2 -9
  270. package/dist/providers/LayoutProvider.js.map +1 -1
  271. package/dist/queries/ApprovalHooks.d.ts +24 -1
  272. package/dist/queries/ApprovalHooks.js +114 -31
  273. package/dist/queries/ApprovalHooks.js.map +1 -1
  274. package/dist/queries/FileHooks.js +53 -26
  275. package/dist/queries/FileHooks.js.map +1 -1
  276. package/dist/queries/PeopleSoftHooks.js +68 -26
  277. package/dist/queries/PeopleSoftHooks.js.map +1 -1
  278. package/dist/queries.js +3 -9
  279. package/dist/server.js +5 -1
  280. package/dist/server.js.map +1 -1
  281. package/package.json +25 -25
  282. package/dist/contexts/UserContext.d.ts +0 -7
  283. package/dist/contexts/UserContext.js +0 -6
  284. package/dist/contexts/UserContext.js.map +0 -1
  285. package/dist/hooks/UseHook.d.ts +0 -2
  286. package/dist/hooks/UseHook.js +0 -12
  287. package/dist/hooks/UseHook.js.map +0 -1
  288. package/dist/lib/auth/client.d.ts +0 -13
  289. package/dist/lib/auth/client.js +0 -63
  290. package/dist/lib/auth/client.js.map +0 -1
  291. package/dist/lib/auth/server.d.ts +0 -9
  292. package/dist/providers/UserProvider.d.ts +0 -4
  293. package/dist/providers/UserProvider.js +0 -94
  294. package/dist/providers/UserProvider.js.map +0 -1
  295. package/dist/queries/Approval.d.ts +0 -585
  296. package/dist/queries/Approval.js +0 -91
  297. package/dist/queries/Approval.js.map +0 -1
  298. package/dist/queries/UserHooks.d.ts +0 -11
  299. package/dist/queries/UserHooks.js +0 -157
  300. package/dist/queries/UserHooks.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { LayoutProvider, setSSRLanguage } from "./providers/LayoutProvider.js";
2
2
  import { rootRouteHead } from "./lib/utils.js";
3
+ import { getSessionUser } from "./lib/auth/graph.js";
3
4
  export {
4
5
  LayoutProvider,
6
+ getSessionUser,
5
7
  rootRouteHead,
6
8
  setSSRLanguage
7
9
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,3 @@
1
+ export declare const login: (request: Request) => Promise<Response>;
2
+ export declare const callback: (request: Request) => Promise<Response>;
3
+ export declare const logout: (request: Request) => Promise<Response>;
@@ -0,0 +1,97 @@
1
+ import { setCookie, getCookie, deleteCookie } from "@tanstack/react-start/server";
2
+ import "../../node_modules/arctic/dist/client.js";
3
+ import "../../node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base32.js";
4
+ import "../../node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base64.js";
5
+ import "../../node_modules/@oslojs/encoding/dist/base32.js";
6
+ import "../../node_modules/@oslojs/encoding/dist/base64.js";
7
+ import { generateState, generateCodeVerifier } from "../../node_modules/arctic/dist/oauth2.js";
8
+ import { decodeIdToken } from "../../node_modules/arctic/dist/oidc.js";
9
+ import { serverEnv } from "../../env.js";
10
+ import { entraId } from "./entra.js";
11
+ import { setSessionCookie, setSessionAccessTokenCookie } from "./session.js";
12
+ const login = async (request) => {
13
+ const url = new URL(request.url);
14
+ const redirectUri = url.searchParams.get("redirect_uri") || "/";
15
+ const state = generateState();
16
+ const codeVerifier = generateCodeVerifier();
17
+ const scopes = ["openid", "profile", "offline_access", "User.Read"];
18
+ const authorizationURL = entraId.createAuthorizationURL(state, codeVerifier, scopes);
19
+ setCookie("entra_oauth_state", state, {
20
+ secure: serverEnv.NODE_ENV === "production",
21
+ path: "/",
22
+ httpOnly: true,
23
+ sameSite: "lax",
24
+ maxAge: 60 * 10
25
+ // 10 minutes
26
+ });
27
+ setCookie("entra_code_verifier", codeVerifier, {
28
+ secure: serverEnv.NODE_ENV === "production",
29
+ path: "/",
30
+ httpOnly: true,
31
+ sameSite: "lax",
32
+ maxAge: 60 * 10
33
+ // 10 minutes,
34
+ });
35
+ setCookie("entra_redirect_uri", redirectUri, {
36
+ secure: serverEnv.NODE_ENV === "production",
37
+ path: "/",
38
+ httpOnly: true,
39
+ sameSite: "lax",
40
+ maxAge: 60 * 10
41
+ // 10 minutes,
42
+ });
43
+ return Response.redirect(authorizationURL.href);
44
+ };
45
+ const callback = async (request) => {
46
+ const url = new URL(request.url);
47
+ const code = url.searchParams.get("code");
48
+ if (!code) return new Response("Missing code", {
49
+ status: 400
50
+ });
51
+ const state = url.searchParams.get("state");
52
+ const storedState = getCookie("entra_oauth_state") ?? null;
53
+ const codeVerifier = getCookie("entra_code_verifier") ?? null;
54
+ const redirectUri = getCookie("entra_redirect_uri") ?? "/";
55
+ if (!state || !storedState || !codeVerifier || !redirectUri) throw new Response("Missing entra oauth data in cookies", {
56
+ status: 400
57
+ });
58
+ if (state !== storedState) return new Response("Invalid oauth state", {
59
+ status: 400
60
+ });
61
+ deleteCookie("entra_oauth_state");
62
+ deleteCookie("entra_code_verifier");
63
+ deleteCookie("entra_redirect_uri");
64
+ const tokens = await entraId.validateAuthorizationCode(code, codeVerifier);
65
+ const idToken = tokens.idToken();
66
+ const claims = decodeIdToken(idToken);
67
+ await setSessionCookie({
68
+ refreshToken: tokens.refreshToken(),
69
+ user: {
70
+ id: claims.oid,
71
+ name: claims.name.split("/")[0],
72
+ email: claims.preferred_username
73
+ }
74
+ });
75
+ await setSessionAccessTokenCookie(tokens.accessToken());
76
+ return new Response(null, {
77
+ status: 302,
78
+ headers: {
79
+ Location: redirectUri
80
+ }
81
+ });
82
+ };
83
+ const logout = async (request) => {
84
+ const url = new URL(request.url);
85
+ return new Response(null, {
86
+ status: 302,
87
+ headers: {
88
+ Location: url.href
89
+ }
90
+ });
91
+ };
92
+ export {
93
+ callback,
94
+ login,
95
+ logout
96
+ };
97
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sources":["../../../src/lib/auth/api.ts"],"sourcesContent":["import { deleteCookie, getCookie, setCookie } from \"@tanstack/react-start/server\";\r\nimport { decodeIdToken, generateCodeVerifier, generateState } from \"arctic\";\r\nimport type jwt from \"jsonwebtoken\";\r\nimport { serverEnv } from \"~/env\";\r\nimport { entraId } from \"~/lib/auth/entra\";\r\nimport { setSessionAccessTokenCookie, setSessionCookie } from \"~/lib/auth/session\";\r\n\r\nexport const login = async (request: Request): Promise<Response> => {\r\n const url = new URL(request.url);\r\n const redirectUri = url.searchParams.get(\"redirect_uri\") || \"/\";\r\n\r\n const state = generateState();\r\n const codeVerifier = generateCodeVerifier();\r\n const scopes = [\"openid\", \"profile\", \"offline_access\", \"User.Read\"];\r\n const authorizationURL = entraId.createAuthorizationURL(state, codeVerifier, scopes);\r\n\r\n setCookie(\"entra_oauth_state\", state, {\r\n secure: serverEnv.NODE_ENV === \"production\",\r\n path: \"/\",\r\n httpOnly: true,\r\n sameSite: \"lax\",\r\n maxAge: 60 * 10 // 10 minutes\r\n });\r\n\r\n setCookie(\"entra_code_verifier\", codeVerifier, {\r\n secure: serverEnv.NODE_ENV === \"production\",\r\n path: \"/\",\r\n httpOnly: true,\r\n sameSite: \"lax\",\r\n maxAge: 60 * 10 // 10 minutes,\r\n });\r\n\r\n setCookie(\"entra_redirect_uri\", redirectUri, {\r\n secure: serverEnv.NODE_ENV === \"production\",\r\n path: \"/\",\r\n httpOnly: true,\r\n sameSite: \"lax\",\r\n maxAge: 60 * 10 // 10 minutes,\r\n });\r\n\r\n return Response.redirect(authorizationURL.href);\r\n};\r\n\r\nexport const callback = async (request: Request): Promise<Response> => {\r\n const url = new URL(request.url);\r\n const code = url.searchParams.get(\"code\");\r\n if (!code) return new Response(\"Missing code\", { status: 400 });\r\n const state = url.searchParams.get(\"state\");\r\n const storedState = getCookie(\"entra_oauth_state\") ?? null;\r\n const codeVerifier = getCookie(\"entra_code_verifier\") ?? null;\r\n const redirectUri = getCookie(\"entra_redirect_uri\") ?? \"/\";\r\n\r\n if (!state || !storedState || !codeVerifier || !redirectUri) throw new Response(\"Missing entra oauth data in cookies\", { status: 400 });\r\n if (state !== storedState) return new Response(\"Invalid oauth state\", { status: 400 });\r\n\r\n deleteCookie(\"entra_oauth_state\");\r\n deleteCookie(\"entra_code_verifier\");\r\n deleteCookie(\"entra_redirect_uri\");\r\n\r\n const tokens = await entraId.validateAuthorizationCode(code, codeVerifier);\r\n\r\n const idToken = tokens.idToken();\r\n const claims = decodeIdToken(idToken) as jwt.JwtPayload;\r\n\r\n await setSessionCookie({\r\n refreshToken: tokens.refreshToken(),\r\n user: {\r\n id: claims.oid,\r\n name: claims.name.split(\"/\")[0],\r\n email: claims.preferred_username,\r\n }\r\n });\r\n\r\n await setSessionAccessTokenCookie(tokens.accessToken());\r\n\r\n return new Response(null, {\r\n status: 302,\r\n headers: { Location: redirectUri },\r\n });\r\n};\r\n\r\nexport const logout = async (request: Request): Promise<Response> => {\r\n const url = new URL(request.url);\r\n\r\n // const { session } = await validateRequest();\r\n // if (!session) {\r\n // return new Response(null, { status: 302, headers: { Location: \"/\" } });\r\n // }\r\n // setCookie(SESSION_COOKIE_NAME, \"\", {\r\n // httpOnly: true,\r\n // sameSite: \"lax\",\r\n // secure: serverEnv.NODE_ENV === \"production\",\r\n // maxAge: 0,\r\n // path: \"/\",\r\n // });\r\n\r\n return new Response(null, { status: 302, headers: { Location: url.href } });\r\n};\r\n"],"names":["login","request","url","URL","redirectUri","searchParams","get","state","generateState","codeVerifier","generateCodeVerifier","scopes","authorizationURL","entraId","createAuthorizationURL","setCookie","secure","serverEnv","NODE_ENV","path","httpOnly","sameSite","maxAge","Response","redirect","href","callback","code","status","storedState","getCookie","deleteCookie","tokens","validateAuthorizationCode","idToken","claims","decodeIdToken","setSessionCookie","refreshToken","user","id","oid","name","split","email","preferred_username","setSessionAccessTokenCookie","accessToken","headers","Location","logout"],"mappings":";;;;;;;;;;;AAOO,MAAMA,QAAQ,OAAOC,YAAwC;AAChE,QAAMC,MAAM,IAAIC,IAAIF,QAAQC,GAAG;AAC/B,QAAME,cAAcF,IAAIG,aAAaC,IAAI,cAAc,KAAK;AAE5D,QAAMC,QAAQC,cAAAA;AACd,QAAMC,eAAeC,qBAAAA;AACrB,QAAMC,SAAS,CAAC,UAAU,WAAW,kBAAkB,WAAW;AAClE,QAAMC,mBAAmBC,QAAQC,uBAAuBP,OAAOE,cAAcE,MAAM;AAEnFI,YAAU,qBAAqBR,OAAO;AAAA,IAClCS,QAAQC,UAAUC,aAAa;AAAA,IAC/BC,MAAM;AAAA,IACNC,UAAU;AAAA,IACVC,UAAU;AAAA,IACVC,QAAQ,KAAK;AAAA;AAAA,EAAA,CAChB;AAEDP,YAAU,uBAAuBN,cAAc;AAAA,IAC3CO,QAAQC,UAAUC,aAAa;AAAA,IAC/BC,MAAM;AAAA,IACNC,UAAU;AAAA,IACVC,UAAU;AAAA,IACVC,QAAQ,KAAK;AAAA;AAAA,EAAA,CAChB;AAEDP,YAAU,sBAAsBX,aAAa;AAAA,IACzCY,QAAQC,UAAUC,aAAa;AAAA,IAC/BC,MAAM;AAAA,IACNC,UAAU;AAAA,IACVC,UAAU;AAAA,IACVC,QAAQ,KAAK;AAAA;AAAA,EAAA,CAChB;AAED,SAAOC,SAASC,SAASZ,iBAAiBa,IAAI;AAClD;AAEO,MAAMC,WAAW,OAAOzB,YAAwC;AACnE,QAAMC,MAAM,IAAIC,IAAIF,QAAQC,GAAG;AAC/B,QAAMyB,OAAOzB,IAAIG,aAAaC,IAAI,MAAM;AACxC,MAAI,CAACqB,KAAM,QAAO,IAAIJ,SAAS,gBAAgB;AAAA,IAAEK,QAAQ;AAAA,EAAA,CAAK;AAC9D,QAAMrB,QAAQL,IAAIG,aAAaC,IAAI,OAAO;AAC1C,QAAMuB,cAAcC,UAAU,mBAAmB,KAAK;AACtD,QAAMrB,eAAeqB,UAAU,qBAAqB,KAAK;AACzD,QAAM1B,cAAc0B,UAAU,oBAAoB,KAAK;AAEvD,MAAI,CAACvB,SAAS,CAACsB,eAAe,CAACpB,gBAAgB,CAACL,YAAa,OAAM,IAAImB,SAAS,uCAAuC;AAAA,IAAEK,QAAQ;AAAA,EAAA,CAAK;AACtI,MAAIrB,UAAUsB,YAAa,QAAO,IAAIN,SAAS,uBAAuB;AAAA,IAAEK,QAAQ;AAAA,EAAA,CAAK;AAErFG,eAAa,mBAAmB;AAChCA,eAAa,qBAAqB;AAClCA,eAAa,oBAAoB;AAEjC,QAAMC,SAAS,MAAMnB,QAAQoB,0BAA0BN,MAAMlB,YAAY;AAEzE,QAAMyB,UAAUF,OAAOE,QAAAA;AACvB,QAAMC,SAASC,cAAcF,OAAO;AAEpC,QAAMG,iBAAiB;AAAA,IACnBC,cAAcN,OAAOM,aAAAA;AAAAA,IACrBC,MAAM;AAAA,MACFC,IAAIL,OAAOM;AAAAA,MACXC,MAAMP,OAAOO,KAAKC,MAAM,GAAG,EAAE,CAAC;AAAA,MAC9BC,OAAOT,OAAOU;AAAAA,IAAAA;AAAAA,EAClB,CACH;AAED,QAAMC,4BAA4Bd,OAAOe,aAAa;AAEtD,SAAO,IAAIxB,SAAS,MAAM;AAAA,IACtBK,QAAQ;AAAA,IACRoB,SAAS;AAAA,MAAEC,UAAU7C;AAAAA,IAAAA;AAAAA,EAAY,CACpC;AACL;AAEO,MAAM8C,SAAS,OAAOjD,YAAwC;AACjE,QAAMC,MAAM,IAAIC,IAAIF,QAAQC,GAAG;AAc/B,SAAO,IAAIqB,SAAS,MAAM;AAAA,IAAEK,QAAQ;AAAA,IAAKoB,SAAS;AAAA,MAAEC,UAAU/C,IAAIuB;AAAAA,IAAAA;AAAAA,EAAK,CAAG;AAC9E;"}
@@ -0,0 +1,2 @@
1
+ import { MicrosoftEntraId } from 'arctic';
2
+ export declare const entraId: MicrosoftEntraId;
@@ -0,0 +1,13 @@
1
+ import "../../node_modules/arctic/dist/client.js";
2
+ import "../../node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base32.js";
3
+ import "../../node_modules/@oslojs/jwt/node_modules/@oslojs/encoding/dist/base64.js";
4
+ import "../../node_modules/@oslojs/encoding/dist/base32.js";
5
+ import "../../node_modules/@oslojs/encoding/dist/base64.js";
6
+ import "../../node_modules/@oslojs/crypto/dist/sha2/sha512.js";
7
+ import { MicrosoftEntraId } from "../../node_modules/arctic/dist/providers/microsoft-entra-id.js";
8
+ import { serverEnv } from "../../env.js";
9
+ const entraId = new MicrosoftEntraId(serverEnv.MICROSOFT_TENANT_ID, serverEnv.MICROSOFT_CLIENT_ID, serverEnv.MICROSOFT_CLIENT_SECRET, serverEnv.MICROSOFT_REDIRECT_URI);
10
+ export {
11
+ entraId
12
+ };
13
+ //# sourceMappingURL=entra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entra.js","sources":["../../../src/lib/auth/entra.ts"],"sourcesContent":["import { MicrosoftEntraId } from \"arctic\";\r\nimport { serverEnv } from \"~/env\";\r\n\r\nexport const entraId = new MicrosoftEntraId(\r\n serverEnv.MICROSOFT_TENANT_ID,\r\n serverEnv.MICROSOFT_CLIENT_ID,\r\n serverEnv.MICROSOFT_CLIENT_SECRET,\r\n serverEnv.MICROSOFT_REDIRECT_URI,\r\n);\r\n"],"names":["entraId","MicrosoftEntraId","serverEnv","MICROSOFT_TENANT_ID","MICROSOFT_CLIENT_ID","MICROSOFT_CLIENT_SECRET","MICROSOFT_REDIRECT_URI"],"mappings":";;;;;;;;AAGO,MAAMA,UAAU,IAAIC,iBACvBC,UAAUC,qBACVD,UAAUE,qBACVF,UAAUG,yBACVH,UAAUI,sBACd;"}
@@ -0,0 +1,17 @@
1
+ import { default as z } from 'zod';
2
+ export declare const getSessionUser: import('@tanstack/start-client-core').RequiredFetcher<undefined, z.ZodObject<{
3
+ redirectUri: z.ZodString;
4
+ }, z.core.$strip>, Promise<{
5
+ groups: string[];
6
+ id: string;
7
+ name: string;
8
+ email: string;
9
+ }>>;
10
+ export declare const getSessionUserDetail: import('@tanstack/start-client-core').OptionalFetcher<undefined, undefined, Promise<{
11
+ id: string;
12
+ displayName: string;
13
+ jobTitle: string;
14
+ mail: string;
15
+ mobilePhone: string;
16
+ }>>;
17
+ export declare const getSessionUserPhoto: import('@tanstack/start-client-core').OptionalFetcher<undefined, undefined, Promise<string>>;
@@ -0,0 +1,72 @@
1
+ import { createServerFn } from "@tanstack/react-start";
2
+ import axios from "axios";
3
+ import z__default from "zod";
4
+ import { queryClient } from "../queryClient.js";
5
+ import { requireSession, getAccessToken } from "./session.js";
6
+ const getSessionUser = createServerFn().inputValidator(z__default.object({
7
+ redirectUri: z__default.string()
8
+ })).handler(async ({
9
+ data
10
+ }) => {
11
+ const session = await requireSession(data.redirectUri);
12
+ const groups = await queryClient.fetchQuery({
13
+ queryKey: ["graph", "me", "memberOf"],
14
+ queryFn: async () => axios.request({
15
+ method: "GET",
16
+ url: "https://graph.microsoft.com/v1.0/me/memberOf?$select=displayName",
17
+ headers: {
18
+ Authorization: `Bearer ${await getAccessToken()}`
19
+ }
20
+ }).then((response) => response.data.value.map((group) => group.displayName)),
21
+ staleTime: Infinity,
22
+ gcTime: Infinity
23
+ });
24
+ return {
25
+ ...session.user,
26
+ groups
27
+ };
28
+ });
29
+ const getSessionUserDetail = createServerFn({
30
+ method: "GET"
31
+ }).handler(async () => {
32
+ return await queryClient.fetchQuery({
33
+ queryKey: ["graph", "me"],
34
+ queryFn: async () => await axios.request({
35
+ method: "GET",
36
+ url: "https://graph.microsoft.com/v1.0/me?$select=id,displayName,jobTitle,mail,mobilePhone",
37
+ headers: {
38
+ Authorization: `Bearer ${await getAccessToken()}`
39
+ }
40
+ }).then((response) => response.data),
41
+ staleTime: Infinity,
42
+ gcTime: Infinity
43
+ });
44
+ });
45
+ const getSessionUserPhoto = createServerFn({
46
+ method: "GET"
47
+ }).handler(async () => {
48
+ return await queryClient.fetchQuery({
49
+ queryKey: ["graph", "me", "photo"],
50
+ queryFn: async () => {
51
+ const response = await axios.request({
52
+ method: "GET",
53
+ url: "https://graph.microsoft.com/v1.0/me/photo/$value",
54
+ headers: {
55
+ Authorization: `Bearer ${await getAccessToken()}`
56
+ },
57
+ responseType: "arraybuffer"
58
+ });
59
+ const contentType = response.headers["content-type"] ?? "image/jpeg";
60
+ const base64 = Buffer.from(response.data).toString("base64");
61
+ return `data:${contentType};base64,${base64}`;
62
+ },
63
+ staleTime: Infinity,
64
+ gcTime: Infinity
65
+ });
66
+ });
67
+ export {
68
+ getSessionUser,
69
+ getSessionUserDetail,
70
+ getSessionUserPhoto
71
+ };
72
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sources":["../../../src/lib/auth/graph.ts"],"sourcesContent":["import { createServerFn } from \"@tanstack/react-start\";\r\nimport axios from \"axios\";\r\nimport z from \"zod\";\r\nimport { queryClient } from \"../queryClient\";\r\nimport { getAccessToken, requireSession } from \"./session\";\r\nimport type { GraphUser, User } from \"~/models/User\";\r\n\r\nexport const getSessionUser = createServerFn()\r\n .inputValidator(z.object({ redirectUri: z.string() }))\r\n .handler(async ({ data }) => {\r\n const session = await requireSession(data.redirectUri);\r\n\r\n const groups = await queryClient.fetchQuery({\r\n queryKey: [\"graph\", \"me\", \"memberOf\"],\r\n queryFn: async () => axios.request<{ value: Array<{ displayName: string }> }>({\r\n method: \"GET\",\r\n url: \"https://graph.microsoft.com/v1.0/me/memberOf?$select=displayName\",\r\n headers: { Authorization: `Bearer ${await getAccessToken()}` },\r\n }).then(response => response.data.value.map((group) => group.displayName)),\r\n staleTime: Infinity,\r\n gcTime: Infinity,\r\n });\r\n\r\n return { ...session.user, groups } satisfies User;\r\n });\r\n\r\nexport const getSessionUserDetail = createServerFn({ method: \"GET\" })\r\n .handler(async () => {\r\n return await queryClient.fetchQuery({\r\n queryKey: [\"graph\", \"me\"],\r\n queryFn: async () => await axios.request<GraphUser>({\r\n method: \"GET\",\r\n url: \"https://graph.microsoft.com/v1.0/me?$select=id,displayName,jobTitle,mail,mobilePhone\",\r\n headers: { Authorization: `Bearer ${await getAccessToken()}` },\r\n }).then(response => response.data),\r\n staleTime: Infinity,\r\n gcTime: Infinity,\r\n });\r\n });\r\n\r\n\r\nexport const getSessionUserPhoto = createServerFn({ method: \"GET\" })\r\n .handler(async () => {\r\n return await queryClient.fetchQuery({\r\n queryKey: [\"graph\", \"me\", \"photo\"],\r\n queryFn: async () => {\r\n const response = await axios.request<ArrayBuffer>({\r\n method: \"GET\",\r\n url: \"https://graph.microsoft.com/v1.0/me/photo/$value\",\r\n headers: { Authorization: `Bearer ${await getAccessToken()}` },\r\n responseType: \"arraybuffer\",\r\n });\r\n const contentType = (response.headers[\"content-type\"] as string | undefined) ?? \"image/jpeg\";\r\n const base64 = Buffer.from(response.data).toString(\"base64\");\r\n return `data:${contentType};base64,${base64}`;\r\n },\r\n staleTime: Infinity,\r\n gcTime: Infinity,\r\n });\r\n });\r\n"],"names":["getSessionUser","createServerFn","inputValidator","z","object","redirectUri","string","handler","data","session","requireSession","groups","queryClient","fetchQuery","queryKey","queryFn","axios","request","method","url","headers","Authorization","getAccessToken","then","response","value","map","group","displayName","staleTime","Infinity","gcTime","user","getSessionUserDetail","getSessionUserPhoto","responseType","contentType","base64","Buffer","from","toString"],"mappings":";;;;;AAOO,MAAMA,iBAAiBC,eAAAA,EACzBC,eAAeC,WAAEC,OAAO;AAAA,EAAEC,aAAaF,WAAEG,OAAAA;AAAS,CAAC,CAAC,EACpDC,QAAQ,OAAO;AAAA,EAAEC;AAAK,MAAM;AACzB,QAAMC,UAAU,MAAMC,eAAeF,KAAKH,WAAW;AAErD,QAAMM,SAAS,MAAMC,YAAYC,WAAW;AAAA,IACxCC,UAAU,CAAC,SAAS,MAAM,UAAU;AAAA,IACpCC,SAAS,YAAYC,MAAMC,QAAmD;AAAA,MAC1EC,QAAQ;AAAA,MACRC,KAAK;AAAA,MACLC,SAAS;AAAA,QAAEC,eAAe,UAAU,MAAMC,gBAAgB;AAAA,MAAA;AAAA,IAAG,CAChE,EAAEC,KAAKC,CAAAA,aAAYA,SAAShB,KAAKiB,MAAMC,IAAKC,CAAAA,UAAUA,MAAMC,WAAW,CAAC;AAAA,IACzEC,WAAWC;AAAAA,IACXC,QAAQD;AAAAA,EAAAA,CACX;AAED,SAAO;AAAA,IAAE,GAAGrB,QAAQuB;AAAAA,IAAMrB;AAAAA,EAAAA;AAC9B,CAAC;AAEE,MAAMsB,uBAAuBhC,eAAe;AAAA,EAAEiB,QAAQ;AAAM,CAAC,EAC/DX,QAAQ,YAAY;AACjB,SAAO,MAAMK,YAAYC,WAAW;AAAA,IAChCC,UAAU,CAAC,SAAS,IAAI;AAAA,IACxBC,SAAS,YAAY,MAAMC,MAAMC,QAAmB;AAAA,MAChDC,QAAQ;AAAA,MACRC,KAAK;AAAA,MACLC,SAAS;AAAA,QAAEC,eAAe,UAAU,MAAMC,gBAAgB;AAAA,MAAA;AAAA,IAAG,CAChE,EAAEC,KAAKC,CAAAA,aAAYA,SAAShB,IAAI;AAAA,IACjCqB,WAAWC;AAAAA,IACXC,QAAQD;AAAAA,EAAAA,CACX;AACL,CAAC;AAGE,MAAMI,sBAAsBjC,eAAe;AAAA,EAAEiB,QAAQ;AAAM,CAAC,EAC9DX,QAAQ,YAAY;AACjB,SAAO,MAAMK,YAAYC,WAAW;AAAA,IAChCC,UAAU,CAAC,SAAS,MAAM,OAAO;AAAA,IACjCC,SAAS,YAAY;AACjB,YAAMS,WAAW,MAAMR,MAAMC,QAAqB;AAAA,QAC9CC,QAAQ;AAAA,QACRC,KAAK;AAAA,QACLC,SAAS;AAAA,UAAEC,eAAe,UAAU,MAAMC,gBAAgB;AAAA,QAAA;AAAA,QAC1Da,cAAc;AAAA,MAAA,CACjB;AACD,YAAMC,cAAeZ,SAASJ,QAAQ,cAAc,KAA4B;AAChF,YAAMiB,SAASC,OAAOC,KAAKf,SAAShB,IAAI,EAAEgC,SAAS,QAAQ;AAC3D,aAAO,QAAQJ,WAAW,WAAWC,MAAM;AAAA,IAC/C;AAAA,IACAR,WAAWC;AAAAA,IACXC,QAAQD;AAAAA,EAAAA,CACX;AACL,CAAC;"}
@@ -0,0 +1,24 @@
1
+ import { default as jwt } from 'jsonwebtoken';
2
+ import { default as z } from 'zod';
3
+ declare const SessionSchema: z.ZodObject<{
4
+ refreshToken: z.ZodString;
5
+ user: z.ZodObject<{
6
+ id: z.ZodString;
7
+ name: z.ZodString;
8
+ email: z.ZodEmail;
9
+ }, z.core.$strip>;
10
+ }, z.core.$strip>;
11
+ type Session = z.infer<typeof SessionSchema>;
12
+ export declare const requireSession: (redirectUri?: string) => Promise<{
13
+ refreshToken: string;
14
+ user: {
15
+ id: string;
16
+ name: string;
17
+ email: string;
18
+ };
19
+ }>;
20
+ export declare const getAccessToken: () => Promise<string>;
21
+ export declare const validateAccessToken: (token: string) => Promise<jwt.JwtPayload>;
22
+ export declare const setSessionCookie: (session: Session) => Promise<void>;
23
+ export declare const setSessionAccessTokenCookie: (accessToken: string) => Promise<void>;
24
+ export {};
@@ -0,0 +1,76 @@
1
+ import { redirect } from "@tanstack/react-router";
2
+ import { getCookie, deleteCookie, setCookie } from "@tanstack/react-start/server";
3
+ import jwt from "../../_virtual/index.js";
4
+ import z__default from "zod";
5
+ import "jwks-rsa";
6
+ import { entraId } from "./entra.js";
7
+ import { serverEnv } from "../../env.js";
8
+ import { UserSchema } from "../../models/User.js";
9
+ const SESSION_COOKIE_NAME = "session";
10
+ const ACCESS_TOKEN_COOKIE_NAME = "access_token";
11
+ const AFTER_LOGIN_URL = "/";
12
+ const SessionSchema = z__default.object({
13
+ refreshToken: z__default.string(),
14
+ user: UserSchema.omit({
15
+ groups: true
16
+ })
17
+ });
18
+ const requireSession = async (redirectUri) => {
19
+ const sessionCookie = getCookie(SESSION_COOKIE_NAME);
20
+ if (!sessionCookie) {
21
+ throw redirect({
22
+ href: `/api/auth/login?redirect_uri=${encodeURIComponent(redirectUri ?? AFTER_LOGIN_URL)}`
23
+ });
24
+ }
25
+ const payloadRaw = jwt.verify(sessionCookie, serverEnv.SESSION_SECRET);
26
+ const sessionResult = SessionSchema.safeParse(payloadRaw);
27
+ if (!sessionResult.success) {
28
+ deleteCookie(SESSION_COOKIE_NAME);
29
+ throw redirect({
30
+ href: `/api/auth/login?redirect_uri=${encodeURIComponent(redirectUri ?? AFTER_LOGIN_URL)}`
31
+ });
32
+ }
33
+ return sessionResult.data;
34
+ };
35
+ const getAccessToken = async () => {
36
+ const accessTokenCookie = getCookie(ACCESS_TOKEN_COOKIE_NAME);
37
+ if (accessTokenCookie) return accessTokenCookie;
38
+ const session = await requireSession();
39
+ const tokens = await entraId.refreshAccessToken(session.refreshToken, []);
40
+ await setSessionCookie({
41
+ ...session,
42
+ refreshToken: tokens.refreshToken()
43
+ });
44
+ await setSessionAccessTokenCookie(tokens.accessToken());
45
+ return tokens.accessToken();
46
+ };
47
+ const setSessionCookie = async (session) => {
48
+ const sessionJwt = jwt.sign(session, serverEnv.SESSION_SECRET, {
49
+ expiresIn: "7d"
50
+ });
51
+ setCookie(SESSION_COOKIE_NAME, sessionJwt, {
52
+ secure: serverEnv.NODE_ENV === "production",
53
+ path: "/",
54
+ httpOnly: true,
55
+ sameSite: "lax",
56
+ maxAge: 7 * 24 * 60 * 60
57
+ // 7 days
58
+ });
59
+ };
60
+ const setSessionAccessTokenCookie = async (accessToken) => {
61
+ setCookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {
62
+ secure: serverEnv.NODE_ENV === "production",
63
+ path: "/",
64
+ httpOnly: true,
65
+ sameSite: "lax",
66
+ maxAge: 5 * 60
67
+ // 5 minutes
68
+ });
69
+ };
70
+ export {
71
+ getAccessToken,
72
+ requireSession,
73
+ setSessionAccessTokenCookie,
74
+ setSessionCookie
75
+ };
76
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sources":["../../../src/lib/auth/session.ts"],"sourcesContent":["import { redirect } from \"@tanstack/react-router\";\r\nimport { deleteCookie, getCookie, setCookie } from \"@tanstack/react-start/server\";\r\nimport jwt from \"jsonwebtoken\";\r\nimport z from \"zod\";\r\nimport jwksRsa from \"jwks-rsa\";\r\nimport { entraId } from \"./entra\";\r\nimport { serverEnv } from \"~/env\";\r\nimport { UserSchema } from \"~/models/User\";\r\n\r\nconst SESSION_COOKIE_NAME = \"session\";\r\nconst ACCESS_TOKEN_COOKIE_NAME = \"access_token\";\r\nconst AFTER_LOGIN_URL = \"/\";\r\n\r\nconst SessionSchema = z.object({\r\n refreshToken: z.string(),\r\n user: UserSchema.omit({ groups: true }),\r\n});\r\n\r\ntype Session = z.infer<typeof SessionSchema>;\r\n\r\nexport const requireSession = async (redirectUri?: string) => {\r\n const sessionCookie = getCookie(SESSION_COOKIE_NAME);\r\n if (!sessionCookie) {\r\n throw redirect({ href: `/api/auth/login?redirect_uri=${encodeURIComponent(redirectUri ?? AFTER_LOGIN_URL)}` });\r\n }\r\n\r\n const payloadRaw = jwt.verify(sessionCookie, serverEnv.SESSION_SECRET);\r\n const sessionResult = SessionSchema.safeParse(payloadRaw);\r\n if (!sessionResult.success) {\r\n deleteCookie(SESSION_COOKIE_NAME);\r\n throw redirect({ href: `/api/auth/login?redirect_uri=${encodeURIComponent(redirectUri ?? AFTER_LOGIN_URL)}` });\r\n }\r\n\r\n return sessionResult.data;\r\n};\r\n\r\nexport const getAccessToken = async () => {\r\n const accessTokenCookie = getCookie(ACCESS_TOKEN_COOKIE_NAME);\r\n if (accessTokenCookie) return accessTokenCookie;\r\n\r\n const session = await requireSession();\r\n\r\n const tokens = await entraId.refreshAccessToken(session.refreshToken, []);\r\n\r\n await setSessionCookie({\r\n ...session,\r\n refreshToken: tokens.refreshToken()\r\n });\r\n\r\n await setSessionAccessTokenCookie(tokens.accessToken());\r\n\r\n return tokens.accessToken();\r\n};\r\n\r\nexport const validateAccessToken = async (token: string): Promise<jwt.JwtPayload> => {\r\n const client = jwksRsa({\r\n cache: true,\r\n rateLimit: true,\r\n jwksRequestsPerMinute: 5,\r\n jwksUri: \"https://login.microsoftonline.com/common/discovery/v2.0/keys\",\r\n });\r\n\r\n const decodedHeader = jwt.decode(token, { complete: true });\r\n if (!decodedHeader?.header.kid) throw new Error(\"Invalid token: Missing kid\");\r\n\r\n const key = await client.getSigningKey(decodedHeader.header.kid);\r\n const signingKey = key.getPublicKey();\r\n\r\n const payload = jwt.verify(token, signingKey) as jwt.JwtPayload;\r\n\r\n if (typeof payload.iss !== \"string\" || !payload.iss.startsWith(\"https://login.microsoftonline.com/\"))\r\n throw new Error(\"Invalid issuer\");\r\n\r\n return payload;\r\n};\r\n\r\nexport const setSessionCookie = async (session: Session) => {\r\n const sessionJwt = jwt.sign(session, serverEnv.SESSION_SECRET, { expiresIn: \"7d\" });\r\n\r\n setCookie(SESSION_COOKIE_NAME, sessionJwt, {\r\n secure: serverEnv.NODE_ENV === \"production\",\r\n path: \"/\",\r\n httpOnly: true,\r\n sameSite: \"lax\",\r\n maxAge: 7 * 24 * 60 * 60, // 7 days\r\n });\r\n};\r\n\r\nexport const setSessionAccessTokenCookie = async (accessToken: string) => {\r\n setCookie(ACCESS_TOKEN_COOKIE_NAME, accessToken, {\r\n secure: serverEnv.NODE_ENV === \"production\",\r\n path: \"/\",\r\n httpOnly: true,\r\n sameSite: \"lax\",\r\n maxAge: 5 * 60, // 5 minutes\r\n });\r\n};\r\n"],"names":["SESSION_COOKIE_NAME","ACCESS_TOKEN_COOKIE_NAME","AFTER_LOGIN_URL","SessionSchema","z","object","refreshToken","string","user","UserSchema","omit","groups","requireSession","redirectUri","sessionCookie","getCookie","redirect","href","encodeURIComponent","payloadRaw","jwt","verify","serverEnv","SESSION_SECRET","sessionResult","safeParse","success","deleteCookie","data","getAccessToken","accessTokenCookie","session","tokens","entraId","refreshAccessToken","setSessionCookie","setSessionAccessTokenCookie","accessToken","sessionJwt","sign","expiresIn","setCookie","secure","NODE_ENV","path","httpOnly","sameSite","maxAge"],"mappings":";;;;;;;;AASA,MAAMA,sBAAsB;AAC5B,MAAMC,2BAA2B;AACjC,MAAMC,kBAAkB;AAExB,MAAMC,gBAAgBC,WAAEC,OAAO;AAAA,EAC3BC,cAAcF,WAAEG,OAAAA;AAAAA,EAChBC,MAAMC,WAAWC,KAAK;AAAA,IAAEC,QAAQ;AAAA,EAAA,CAAM;AAC1C,CAAC;AAIM,MAAMC,iBAAiB,OAAOC,gBAAyB;AAC1D,QAAMC,gBAAgBC,UAAUf,mBAAmB;AACnD,MAAI,CAACc,eAAe;AAChB,UAAME,SAAS;AAAA,MAAEC,MAAM,gCAAgCC,mBAAmBL,eAAeX,eAAe,CAAC;AAAA,IAAA,CAAI;AAAA,EACjH;AAEA,QAAMiB,aAAaC,IAAIC,OAAOP,eAAeQ,UAAUC,cAAc;AACrE,QAAMC,gBAAgBrB,cAAcsB,UAAUN,UAAU;AACxD,MAAI,CAACK,cAAcE,SAAS;AACxBC,iBAAa3B,mBAAmB;AAChC,UAAMgB,SAAS;AAAA,MAAEC,MAAM,gCAAgCC,mBAAmBL,eAAeX,eAAe,CAAC;AAAA,IAAA,CAAI;AAAA,EACjH;AAEA,SAAOsB,cAAcI;AACzB;AAEO,MAAMC,iBAAiB,YAAY;AACtC,QAAMC,oBAAoBf,UAAUd,wBAAwB;AAC5D,MAAI6B,kBAAmB,QAAOA;AAE9B,QAAMC,UAAU,MAAMnB,eAAAA;AAEtB,QAAMoB,SAAS,MAAMC,QAAQC,mBAAmBH,QAAQzB,cAAc,EAAE;AAExE,QAAM6B,iBAAiB;AAAA,IACnB,GAAGJ;AAAAA,IACHzB,cAAc0B,OAAO1B,aAAAA;AAAAA,EAAa,CACrC;AAED,QAAM8B,4BAA4BJ,OAAOK,aAAa;AAEtD,SAAOL,OAAOK,YAAAA;AAClB;AAwBO,MAAMF,mBAAmB,OAAOJ,YAAqB;AACxD,QAAMO,aAAalB,IAAImB,KAAKR,SAAST,UAAUC,gBAAgB;AAAA,IAAEiB,WAAW;AAAA,EAAA,CAAM;AAElFC,YAAUzC,qBAAqBsC,YAAY;AAAA,IACvCI,QAAQpB,UAAUqB,aAAa;AAAA,IAC/BC,MAAM;AAAA,IACNC,UAAU;AAAA,IACVC,UAAU;AAAA,IACVC,QAAQ,IAAI,KAAK,KAAK;AAAA;AAAA,EAAA,CACzB;AACL;AAEO,MAAMX,8BAA8B,OAAOC,gBAAwB;AACtEI,YAAUxC,0BAA0BoC,aAAa;AAAA,IAC7CK,QAAQpB,UAAUqB,aAAa;AAAA,IAC/BC,MAAM;AAAA,IACNC,UAAU;AAAA,IACVC,UAAU;AAAA,IACVC,QAAQ,IAAI;AAAA;AAAA,EAAA,CACf;AACL;"}
@@ -0,0 +1,2 @@
1
+ import { QueryClient } from '@tanstack/react-query';
2
+ export declare const queryClient: QueryClient;
@@ -0,0 +1,6 @@
1
+ import { QueryClient } from "@tanstack/react-query";
2
+ const queryClient = new QueryClient();
3
+ export {
4
+ queryClient
5
+ };
6
+ //# sourceMappingURL=queryClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryClient.js","sources":["../../src/lib/queryClient.ts"],"sourcesContent":["import { QueryClient } from \"@tanstack/react-query\";\r\n\r\nexport const queryClient = new QueryClient();\r\n"],"names":["queryClient","QueryClient"],"mappings":";AAEO,MAAMA,cAAc,IAAIC,YAAAA;"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/lib/utils.ts"],"sourcesContent":["import axios from \"axios\";\nimport type { AnyFieldApi } from \"@tanstack/react-form\";\nimport { clientEnv } from \"~/env\";\n\nexport const WISTRON_PRIMARY_COLOR = \"#00506E\";\nexport const WISTRON_SECONDARY_COLOR = \"#64DC00\";\n\nexport class Platform {\n static get isAndroid() { return /android/i.test(this.userAgent); }\n static get isIOS() { return /iPad|iPhone|iPod/.test(this.userAgent); }\n static get isWindows() { return /windows/i.test(this.userAgent); }\n static get isMacOS() { return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent); }\n\n private static get userAgent() { return typeof navigator === \"undefined\" ? \"\" : navigator.userAgent; }\n}\n\nexport const rootRouteHead = () => ({\n meta: [\n { charSet: \"utf-8\" },\n { name: \"viewport\", content: \"width=device-width, initial-scale=1\" },\n { title: clientEnv.VITE_APP_TITLE },\n { name: \"og:type\", content: \"website\" },\n { name: \"og:title\", content: clientEnv.VITE_APP_TITLE },\n { name: \"og:image\", content: \"/favicon-32x32.png\" }\n ],\n links: [\n { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"/apple-touch-icon.png\", },\n { rel: \"icon\", type: \"image/png\", sizes: \"32x32\", href: \"/favicon-32x32.png\", },\n { rel: \"icon\", type: \"image/png\", sizes: \"16x16\", href: \"/favicon-16x16.png\", },\n { rel: \"manifest\", href: \"/manifest.webmanifest\" },\n { rel: \"icon\", href: \"/favicon.ico\" },\n ],\n});\n\nexport const httpClient = axios.create({\n baseURL: clientEnv.VITE_API_URL // TODO: Not working in children projects\n});\n\n/* Internal Utils */\nexport type FormOmittedProps =\n \"name\" |\n \"value\" |\n \"onChange\" |\n \"onBlur\" |\n \"error\" |\n \"helperText\" |\n \"renderInput\" |\n \"type\" |\n \"aria-label\";\n\nexport const getFieldStatus = (field: AnyFieldApi) => {\n const { meta } = field.state;\n\n const isTouched = meta.isTouched;\n const hasError = !!meta.errors.length;\n const helperText = meta.errors[0]?.message;\n\n return { isTouched, hasError, helperText };\n};\n\nexport const toKebabCase = (str: string): string => {\n return str\n .replaceAll(/([a-z])([A-Z])/g, \"$1-$2\")\n .replaceAll(/[\\s_]+/g, \"-\")\n .replaceAll(/[^a-zA-Z0-9-]/g, \"\")\n .toLowerCase()\n .replaceAll(/-+/g, \"-\")\n .replaceAll(/(^-|-$)/g, \"\");\n};\n"],"names":["WISTRON_PRIMARY_COLOR","WISTRON_SECONDARY_COLOR","Platform","isAndroid","test","userAgent","isIOS","isWindows","isMacOS","navigator","rootRouteHead","meta","charSet","name","content","title","clientEnv","VITE_APP_TITLE","links","rel","sizes","href","type","httpClient","axios","create","baseURL","VITE_API_URL","getFieldStatus","field","state","isTouched","hasError","errors","length","helperText","message","toKebabCase","str","replaceAll","toLowerCase"],"mappings":";;AAIO,MAAMA,wBAAwB;AAC9B,MAAMC,0BAA0B;AAEhC,MAAMC,SAAS;AAAA,EAClB,WAAWC,YAAY;AAAE,WAAO,WAAWC,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EACjE,WAAWC,QAAQ;AAAE,WAAO,mBAAmBF,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EACrE,WAAWE,YAAY;AAAE,WAAO,WAAWH,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EACjE,WAAWG,UAAU;AAAE,WAAO,mCAAmCJ,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EAEvF,WAAmBA,YAAY;AAAE,WAAO,OAAOI,cAAc,cAAc,KAAKA,UAAUJ;AAAAA,EAAW;AACzG;AAEO,MAAMK,gBAAgBA,OAAO;AAAA,EAChCC,MAAM,CACF;AAAA,IAAEC,SAAS;AAAA,EAAA,GACX;AAAA,IAAEC,MAAM;AAAA,IAAYC,SAAS;AAAA,EAAA,GAC7B;AAAA,IAAEC,OAAOC,UAAUC;AAAAA,EAAAA,GACnB;AAAA,IAAEJ,MAAM;AAAA,IAAWC,SAAS;AAAA,EAAA,GAC5B;AAAA,IAAED,MAAM;AAAA,IAAYC,SAASE,UAAUC;AAAAA,EAAAA,GACvC;AAAA,IAAEJ,MAAM;AAAA,IAAYC,SAAS;AAAA,EAAA,CAAsB;AAAA,EAEvDI,OAAO,CACH;AAAA,IAAEC,KAAK;AAAA,IAAoBC,OAAO;AAAA,IAAWC,MAAM;AAAA,EAAA,GACnD;AAAA,IAAEF,KAAK;AAAA,IAAQG,MAAM;AAAA,IAAaF,OAAO;AAAA,IAASC,MAAM;AAAA,EAAA,GACxD;AAAA,IAAEF,KAAK;AAAA,IAAQG,MAAM;AAAA,IAAaF,OAAO;AAAA,IAASC,MAAM;AAAA,EAAA,GACxD;AAAA,IAAEF,KAAK;AAAA,IAAYE,MAAM;AAAA,EAAA,GACzB;AAAA,IAAEF,KAAK;AAAA,IAAQE,MAAM;AAAA,EAAA,CAAgB;AAE7C;AAEO,MAAME,aAAaC,MAAMC,OAAO;AAAA,EACnCC,SAASV,UAAUW;AAAAA;AACvB,CAAC;AAcM,MAAMC,iBAAiBA,CAACC,UAAuB;AAClD,QAAM;AAAA,IAAElB;AAAAA,EAAAA,IAASkB,MAAMC;AAEvB,QAAMC,YAAYpB,KAAKoB;AACvB,QAAMC,WAAW,CAAC,CAACrB,KAAKsB,OAAOC;AAC/B,QAAMC,aAAaxB,KAAKsB,OAAO,CAAC,GAAGG;AAEnC,SAAO;AAAA,IAAEL;AAAAA,IAAWC;AAAAA,IAAUG;AAAAA,EAAAA;AAClC;AAEO,MAAME,cAAcA,CAACC,QAAwB;AAChD,SAAOA,IACFC,WAAW,mBAAmB,OAAO,EACrCA,WAAW,WAAW,GAAG,EACzBA,WAAW,kBAAkB,EAAE,EAC/BC,cACAD,WAAW,OAAO,GAAG,EACrBA,WAAW,YAAY,EAAE;AAClC;"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/lib/utils.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport type { AnyFieldApi } from \"@tanstack/react-form\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nexport const WISTRON_PRIMARY_COLOR = \"#00506E\";\r\nexport const WISTRON_SECONDARY_COLOR = \"#64DC00\";\r\n\r\nexport class Platform {\r\n static get isAndroid() { return /android/i.test(this.userAgent); }\r\n static get isIOS() { return /iPad|iPhone|iPod/.test(this.userAgent); }\r\n static get isWindows() { return /windows/i.test(this.userAgent); }\r\n static get isMacOS() { return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent); }\r\n\r\n private static get userAgent() { return typeof navigator === \"undefined\" ? \"\" : navigator.userAgent; }\r\n}\r\n\r\nexport const rootRouteHead = () => ({\r\n meta: [\r\n { charSet: \"utf-8\" },\r\n { name: \"viewport\", content: \"width=device-width, initial-scale=1\" },\r\n { title: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:type\", content: \"website\" },\r\n { name: \"og:title\", content: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:image\", content: \"/favicon-32x32.png\" }\r\n ],\r\n links: [\r\n { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"/apple-touch-icon.png\", },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"32x32\", href: \"/favicon-32x32.png\", },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"16x16\", href: \"/favicon-16x16.png\", },\r\n { rel: \"manifest\", href: \"/manifest.webmanifest\" },\r\n { rel: \"icon\", href: \"/favicon.ico\" },\r\n ],\r\n});\r\n\r\nexport const httpClient = axios.create({\r\n baseURL: clientEnv.VITE_API_URL // TODO: Not working in children projects\r\n});\r\n\r\n/* Internal Utils */\r\nexport type FormOmittedProps =\r\n \"name\" |\r\n \"value\" |\r\n \"onChange\" |\r\n \"onBlur\" |\r\n \"error\" |\r\n \"helperText\" |\r\n \"renderInput\" |\r\n \"type\" |\r\n \"aria-label\";\r\n\r\nexport const getFieldStatus = (field: AnyFieldApi) => {\r\n const { meta } = field.state;\r\n\r\n const isTouched = meta.isTouched;\r\n const hasError = !!meta.errors.length;\r\n const helperText = meta.errors[0]?.message;\r\n\r\n return { isTouched, hasError, helperText };\r\n};\r\n\r\nexport const toKebabCase = (str: string): string => {\r\n return str\r\n .replaceAll(/([a-z])([A-Z])/g, \"$1-$2\")\r\n .replaceAll(/[\\s_]+/g, \"-\")\r\n .replaceAll(/[^a-zA-Z0-9-]/g, \"\")\r\n .toLowerCase()\r\n .replaceAll(/-+/g, \"-\")\r\n .replaceAll(/(^-|-$)/g, \"\");\r\n};\r\n"],"names":["WISTRON_PRIMARY_COLOR","WISTRON_SECONDARY_COLOR","Platform","isAndroid","test","userAgent","isIOS","isWindows","isMacOS","navigator","rootRouteHead","meta","charSet","name","content","title","clientEnv","VITE_APP_TITLE","links","rel","sizes","href","type","httpClient","axios","create","baseURL","VITE_API_URL","getFieldStatus","field","state","isTouched","hasError","errors","length","helperText","message","toKebabCase","str","replaceAll","toLowerCase"],"mappings":";;AAIO,MAAMA,wBAAwB;AAC9B,MAAMC,0BAA0B;AAEhC,MAAMC,SAAS;AAAA,EAClB,WAAWC,YAAY;AAAE,WAAO,WAAWC,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EACjE,WAAWC,QAAQ;AAAE,WAAO,mBAAmBF,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EACrE,WAAWE,YAAY;AAAE,WAAO,WAAWH,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EACjE,WAAWG,UAAU;AAAE,WAAO,mCAAmCJ,KAAK,KAAKC,SAAS;AAAA,EAAG;AAAA,EAEvF,WAAmBA,YAAY;AAAE,WAAO,OAAOI,cAAc,cAAc,KAAKA,UAAUJ;AAAAA,EAAW;AACzG;AAEO,MAAMK,gBAAgBA,OAAO;AAAA,EAChCC,MAAM,CACF;AAAA,IAAEC,SAAS;AAAA,EAAA,GACX;AAAA,IAAEC,MAAM;AAAA,IAAYC,SAAS;AAAA,EAAA,GAC7B;AAAA,IAAEC,OAAOC,UAAUC;AAAAA,EAAAA,GACnB;AAAA,IAAEJ,MAAM;AAAA,IAAWC,SAAS;AAAA,EAAA,GAC5B;AAAA,IAAED,MAAM;AAAA,IAAYC,SAASE,UAAUC;AAAAA,EAAAA,GACvC;AAAA,IAAEJ,MAAM;AAAA,IAAYC,SAAS;AAAA,EAAA,CAAsB;AAAA,EAEvDI,OAAO,CACH;AAAA,IAAEC,KAAK;AAAA,IAAoBC,OAAO;AAAA,IAAWC,MAAM;AAAA,EAAA,GACnD;AAAA,IAAEF,KAAK;AAAA,IAAQG,MAAM;AAAA,IAAaF,OAAO;AAAA,IAASC,MAAM;AAAA,EAAA,GACxD;AAAA,IAAEF,KAAK;AAAA,IAAQG,MAAM;AAAA,IAAaF,OAAO;AAAA,IAASC,MAAM;AAAA,EAAA,GACxD;AAAA,IAAEF,KAAK;AAAA,IAAYE,MAAM;AAAA,EAAA,GACzB;AAAA,IAAEF,KAAK;AAAA,IAAQE,MAAM;AAAA,EAAA,CAAgB;AAE7C;AAEO,MAAME,aAAaC,MAAMC,OAAO;AAAA,EACnCC,SAASV,UAAUW;AAAAA;AACvB,CAAC;AAcM,MAAMC,iBAAiBA,CAACC,UAAuB;AAClD,QAAM;AAAA,IAAElB;AAAAA,EAAAA,IAASkB,MAAMC;AAEvB,QAAMC,YAAYpB,KAAKoB;AACvB,QAAMC,WAAW,CAAC,CAACrB,KAAKsB,OAAOC;AAC/B,QAAMC,aAAaxB,KAAKsB,OAAO,CAAC,GAAGG;AAEnC,SAAO;AAAA,IAAEL;AAAAA,IAAWC;AAAAA,IAAUG;AAAAA,EAAAA;AAClC;AAEO,MAAME,cAAcA,CAACC,QAAwB;AAChD,SAAOA,IACFC,WAAW,mBAAmB,OAAO,EACrCA,WAAW,WAAW,GAAG,EACzBA,WAAW,kBAAkB,EAAE,EAC/BC,cACAD,WAAW,OAAO,GAAG,EACrBA,WAAW,YAAY,EAAE;AAClC;"}
@@ -1,13 +1,22 @@
1
1
  export declare const authenticationMiddleware: import('@tanstack/start-client-core').RequestMiddlewareAfterServer<{}, undefined, {
2
- user: import('../lib/auth/server').AuthenticatedUser;
2
+ user: {
3
+ id: any;
4
+ name: any;
5
+ email: any;
6
+ };
3
7
  }>;
4
8
  export declare const authorizationMiddleware: (allowedGroups: Array<string>) => import('@tanstack/start-client-core').RequestMiddlewareAfterServer<{}, readonly [import('@tanstack/start-client-core').RequestMiddlewareAfterServer<{}, undefined, {
5
- user: import('../lib/auth/server').AuthenticatedUser;
9
+ user: {
10
+ id: any;
11
+ name: any;
12
+ email: any;
13
+ };
6
14
  }>], {
7
15
  user: {
8
16
  groups: string[];
9
- name: string;
10
- email: string;
17
+ id: any;
18
+ name: any;
19
+ email: any;
11
20
  };
12
21
  }>;
13
22
  export declare const serverFnAccessTokenMiddleware: import('@tanstack/start-client-core').FunctionMiddlewareAfterClient<{}, unknown, undefined, undefined, undefined>;
@@ -2,10 +2,15 @@ import * as z from "zod";
2
2
  export declare const UserSchema: z.ZodObject<{
3
3
  id: z.ZodString;
4
4
  name: z.ZodString;
5
- jobTitle: z.ZodString;
6
5
  email: z.ZodEmail;
7
- mobilePhone: z.ZodString;
8
- photo: z.ZodNullable<z.ZodString>;
9
6
  groups: z.ZodArray<z.ZodString>;
10
7
  }, z.core.$strip>;
11
8
  export type User = z.infer<typeof UserSchema>;
9
+ export declare const GraphUserSchema: z.ZodObject<{
10
+ id: z.ZodString;
11
+ displayName: z.ZodString;
12
+ jobTitle: z.ZodString;
13
+ mail: z.ZodEmail;
14
+ mobilePhone: z.ZodString;
15
+ }, z.core.$strip>;
16
+ export type GraphUser = z.infer<typeof GraphUserSchema>;
@@ -0,0 +1,18 @@
1
+ import * as z from "zod";
2
+ const UserSchema = z.object({
3
+ id: z.string(),
4
+ name: z.string(),
5
+ email: z.email(),
6
+ groups: z.array(z.string())
7
+ });
8
+ z.object({
9
+ id: z.string(),
10
+ displayName: z.string(),
11
+ jobTitle: z.string(),
12
+ mail: z.email(),
13
+ mobilePhone: z.string()
14
+ });
15
+ export {
16
+ UserSchema
17
+ };
18
+ //# sourceMappingURL=User.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.js","sources":["../../src/models/User.ts"],"sourcesContent":["import * as z from \"zod\";\r\n\r\nexport const UserSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n email: z.email(),\r\n groups: z.array(z.string()),\r\n});\r\n\r\nexport type User = z.infer<typeof UserSchema>;\r\n\r\nexport const GraphUserSchema = z.object({\r\n id: z.string(),\r\n displayName: z.string(),\r\n jobTitle: z.string(),\r\n mail: z.email(),\r\n mobilePhone: z.string(),\r\n});\r\n\r\nexport type GraphUser = z.infer<typeof GraphUserSchema>;\r\n"],"names":["UserSchema","z","object","id","string","name","email","groups","array","displayName","jobTitle","mail","mobilePhone"],"mappings":";AAEO,MAAMA,aAAaC,EAAEC,OAAO;AAAA,EAC/BC,IAAIF,EAAEG,OAAAA;AAAAA,EACNC,MAAMJ,EAAEG,OAAAA;AAAAA,EACRE,OAAOL,EAAEK,MAAAA;AAAAA,EACTC,QAAQN,EAAEO,MAAMP,EAAEG,QAAQ;AAC9B,CAAC;AAI8BH,EAAEC,OAAO;AAAA,EACpCC,IAAIF,EAAEG,OAAAA;AAAAA,EACNK,aAAaR,EAAEG,OAAAA;AAAAA,EACfM,UAAUT,EAAEG,OAAAA;AAAAA,EACZO,MAAMV,EAAEK,MAAAA;AAAAA,EACRM,aAAaX,EAAEG,OAAAA;AACnB,CAAC;"}
@@ -0,0 +1,7 @@
1
+ function rotr32(x, n) {
2
+ return (x << 32 - n | x >>> n) >>> 0;
3
+ }
4
+ export {
5
+ rotr32
6
+ };
7
+ //# sourceMappingURL=bits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bits.js","sources":["../../../../../node_modules/@oslojs/binary/dist/bits.js"],"sourcesContent":["export function rotl32(x, n) {\n return ((x << n) | (x >>> (32 - n))) >>> 0;\n}\nexport function rotr32(x, n) {\n return ((x << (32 - n)) | (x >>> n)) >>> 0;\n}\nexport function rotr64(x, n) {\n return ((x << BigInt(64 - n)) | (x >> BigInt(n))) & 0xffffffffffffffffn;\n}\nexport function rotl64(x, n) {\n return ((x << BigInt(n)) | (x >> BigInt(64 - n))) & 0xffffffffffffffffn;\n}\n"],"names":[],"mappings":"AAGO,SAAS,OAAO,GAAG,GAAG;AACzB,UAAS,KAAM,KAAK,IAAO,MAAM,OAAQ;AAC7C;","x_google_ignoreList":[0]}
@@ -0,0 +1,80 @@
1
+ class BigEndian {
2
+ uint8(data, offset) {
3
+ if (data.byteLength < offset + 1) {
4
+ throw new TypeError("Insufficient bytes");
5
+ }
6
+ return data[offset];
7
+ }
8
+ uint16(data, offset) {
9
+ if (data.byteLength < offset + 2) {
10
+ throw new TypeError("Insufficient bytes");
11
+ }
12
+ return data[offset] << 8 | data[offset + 1];
13
+ }
14
+ uint32(data, offset) {
15
+ if (data.byteLength < offset + 4) {
16
+ throw new TypeError("Insufficient bytes");
17
+ }
18
+ let result = 0;
19
+ for (let i = 0; i < 4; i++) {
20
+ result |= data[offset + i] << 24 - i * 8;
21
+ }
22
+ return result;
23
+ }
24
+ uint64(data, offset) {
25
+ if (data.byteLength < offset + 8) {
26
+ throw new TypeError("Insufficient bytes");
27
+ }
28
+ let result = 0n;
29
+ for (let i = 0; i < 8; i++) {
30
+ result |= BigInt(data[offset + i]) << BigInt(56 - i * 8);
31
+ }
32
+ return result;
33
+ }
34
+ putUint8(target, value, offset) {
35
+ if (target.length < offset + 1) {
36
+ throw new TypeError("Not enough space");
37
+ }
38
+ if (value < 0 || value > 255) {
39
+ throw new TypeError("Invalid uint8 value");
40
+ }
41
+ target[offset] = value;
42
+ }
43
+ putUint16(target, value, offset) {
44
+ if (target.length < offset + 2) {
45
+ throw new TypeError("Not enough space");
46
+ }
47
+ if (value < 0 || value > 65535) {
48
+ throw new TypeError("Invalid uint16 value");
49
+ }
50
+ target[offset] = value >> 8;
51
+ target[offset + 1] = value & 255;
52
+ }
53
+ putUint32(target, value, offset) {
54
+ if (target.length < offset + 4) {
55
+ throw new TypeError("Not enough space");
56
+ }
57
+ if (value < 0 || value > 4294967295) {
58
+ throw new TypeError("Invalid uint32 value");
59
+ }
60
+ for (let i = 0; i < 4; i++) {
61
+ target[offset + i] = value >> (3 - i) * 8 & 255;
62
+ }
63
+ }
64
+ putUint64(target, value, offset) {
65
+ if (target.length < offset + 8) {
66
+ throw new TypeError("Not enough space");
67
+ }
68
+ if (value < 0 || value > 18446744073709551615n) {
69
+ throw new TypeError("Invalid uint64 value");
70
+ }
71
+ for (let i = 0; i < 8; i++) {
72
+ target[offset + i] = Number(value >> BigInt((7 - i) * 8) & 0xffn);
73
+ }
74
+ }
75
+ }
76
+ const bigEndian = new BigEndian();
77
+ export {
78
+ bigEndian
79
+ };
80
+ //# sourceMappingURL=uint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uint.js","sources":["../../../../../node_modules/@oslojs/binary/dist/uint.js"],"sourcesContent":["class BigEndian {\n uint8(data, offset) {\n if (data.byteLength < offset + 1) {\n throw new TypeError(\"Insufficient bytes\");\n }\n return data[offset];\n }\n uint16(data, offset) {\n if (data.byteLength < offset + 2) {\n throw new TypeError(\"Insufficient bytes\");\n }\n return (data[offset] << 8) | data[offset + 1];\n }\n uint32(data, offset) {\n if (data.byteLength < offset + 4) {\n throw new TypeError(\"Insufficient bytes\");\n }\n let result = 0;\n for (let i = 0; i < 4; i++) {\n result |= data[offset + i] << (24 - i * 8);\n }\n return result;\n }\n uint64(data, offset) {\n if (data.byteLength < offset + 8) {\n throw new TypeError(\"Insufficient bytes\");\n }\n let result = 0n;\n for (let i = 0; i < 8; i++) {\n result |= BigInt(data[offset + i]) << BigInt(56 - i * 8);\n }\n return result;\n }\n putUint8(target, value, offset) {\n if (target.length < offset + 1) {\n throw new TypeError(\"Not enough space\");\n }\n if (value < 0 || value > 255) {\n throw new TypeError(\"Invalid uint8 value\");\n }\n target[offset] = value;\n }\n putUint16(target, value, offset) {\n if (target.length < offset + 2) {\n throw new TypeError(\"Not enough space\");\n }\n if (value < 0 || value > 65535) {\n throw new TypeError(\"Invalid uint16 value\");\n }\n target[offset] = value >> 8;\n target[offset + 1] = value & 0xff;\n }\n putUint32(target, value, offset) {\n if (target.length < offset + 4) {\n throw new TypeError(\"Not enough space\");\n }\n if (value < 0 || value > 4294967295) {\n throw new TypeError(\"Invalid uint32 value\");\n }\n for (let i = 0; i < 4; i++) {\n target[offset + i] = (value >> ((3 - i) * 8)) & 0xff;\n }\n }\n putUint64(target, value, offset) {\n if (target.length < offset + 8) {\n throw new TypeError(\"Not enough space\");\n }\n if (value < 0 || value > 18446744073709551615n) {\n throw new TypeError(\"Invalid uint64 value\");\n }\n for (let i = 0; i < 8; i++) {\n target[offset + i] = Number((value >> BigInt((7 - i) * 8)) & 0xffn);\n }\n }\n}\nclass LittleEndian {\n uint8(data, offset) {\n if (data.byteLength < offset + 1) {\n throw new TypeError(\"Insufficient bytes\");\n }\n return data[offset];\n }\n uint16(data, offset) {\n if (data.byteLength < offset + 2) {\n throw new TypeError(\"Insufficient bytes\");\n }\n return data[offset] | (data[offset + 1] << 8);\n }\n uint32(data, offset) {\n if (data.byteLength < offset + 4) {\n throw new TypeError(\"Insufficient bytes\");\n }\n let result = 0;\n for (let i = 0; i < 4; i++) {\n result |= data[offset + i] << (i * 8);\n }\n return result;\n }\n uint64(data, offset) {\n if (data.byteLength < offset + 8) {\n throw new TypeError(\"Insufficient bytes\");\n }\n let result = 0n;\n for (let i = 0; i < 8; i++) {\n result |= BigInt(data[offset + i]) << BigInt(i * 8);\n }\n return result;\n }\n putUint8(target, value, offset) {\n if (target.length < 1 + offset) {\n throw new TypeError(\"Insufficient space\");\n }\n if (value < 0 || value > 255) {\n throw new TypeError(\"Invalid uint8 value\");\n }\n target[offset] = value;\n }\n putUint16(target, value, offset) {\n if (target.length < 2 + offset) {\n throw new TypeError(\"Insufficient space\");\n }\n if (value < 0 || value > 65535) {\n throw new TypeError(\"Invalid uint16 value\");\n }\n target[offset + 1] = value >> 8;\n target[offset] = value & 0xff;\n }\n putUint32(target, value, offset) {\n if (target.length < 4 + offset) {\n throw new TypeError(\"Insufficient space\");\n }\n if (value < 0 || value > 4294967295) {\n throw new TypeError(\"Invalid uint32 value\");\n }\n for (let i = 0; i < 4; i++) {\n target[offset + i] = (value >> (i * 8)) & 0xff;\n }\n }\n putUint64(target, value, offset) {\n if (target.length < 8 + offset) {\n throw new TypeError(\"Insufficient space\");\n }\n if (value < 0 || value > 18446744073709551615n) {\n throw new TypeError(\"Invalid uint64 value\");\n }\n for (let i = 0; i < 8; i++) {\n target[offset + i] = Number((value >> BigInt(i * 8)) & 0xffn);\n }\n }\n}\nexport const bigEndian = new BigEndian();\nexport const littleEndian = new LittleEndian();\n"],"names":[],"mappings":"AAAA,MAAM,UAAU;AAAA,EACZ,MAAM,MAAM,QAAQ;AAChB,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,YAAM,IAAI,UAAU,oBAAoB;AAAA,IAC5C;AACA,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EACA,OAAO,MAAM,QAAQ;AACjB,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,YAAM,IAAI,UAAU,oBAAoB;AAAA,IAC5C;AACA,WAAQ,KAAK,MAAM,KAAK,IAAK,KAAK,SAAS,CAAC;AAAA,EAChD;AAAA,EACA,OAAO,MAAM,QAAQ;AACjB,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,YAAM,IAAI,UAAU,oBAAoB;AAAA,IAC5C;AACA,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,gBAAU,KAAK,SAAS,CAAC,KAAM,KAAK,IAAI;AAAA,IAC5C;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,MAAM,QAAQ;AACjB,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,YAAM,IAAI,UAAU,oBAAoB;AAAA,IAC5C;AACA,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,gBAAU,OAAO,KAAK,SAAS,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,IAC3D;AACA,WAAO;AAAA,EACX;AAAA,EACA,SAAS,QAAQ,OAAO,QAAQ;AAC5B,QAAI,OAAO,SAAS,SAAS,GAAG;AAC5B,YAAM,IAAI,UAAU,kBAAkB;AAAA,IAC1C;AACA,QAAI,QAAQ,KAAK,QAAQ,KAAK;AAC1B,YAAM,IAAI,UAAU,qBAAqB;AAAA,IAC7C;AACA,WAAO,MAAM,IAAI;AAAA,EACrB;AAAA,EACA,UAAU,QAAQ,OAAO,QAAQ;AAC7B,QAAI,OAAO,SAAS,SAAS,GAAG;AAC5B,YAAM,IAAI,UAAU,kBAAkB;AAAA,IAC1C;AACA,QAAI,QAAQ,KAAK,QAAQ,OAAO;AAC5B,YAAM,IAAI,UAAU,sBAAsB;AAAA,IAC9C;AACA,WAAO,MAAM,IAAI,SAAS;AAC1B,WAAO,SAAS,CAAC,IAAI,QAAQ;AAAA,EACjC;AAAA,EACA,UAAU,QAAQ,OAAO,QAAQ;AAC7B,QAAI,OAAO,SAAS,SAAS,GAAG;AAC5B,YAAM,IAAI,UAAU,kBAAkB;AAAA,IAC1C;AACA,QAAI,QAAQ,KAAK,QAAQ,YAAY;AACjC,YAAM,IAAI,UAAU,sBAAsB;AAAA,IAC9C;AACA,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,aAAO,SAAS,CAAC,IAAK,UAAW,IAAI,KAAK,IAAM;AAAA,IACpD;AAAA,EACJ;AAAA,EACA,UAAU,QAAQ,OAAO,QAAQ;AAC7B,QAAI,OAAO,SAAS,SAAS,GAAG;AAC5B,YAAM,IAAI,UAAU,kBAAkB;AAAA,IAC1C;AACA,QAAI,QAAQ,KAAK,QAAQ,uBAAuB;AAC5C,YAAM,IAAI,UAAU,sBAAsB;AAAA,IAC9C;AACA,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,aAAO,SAAS,CAAC,IAAI,OAAQ,SAAS,QAAQ,IAAI,KAAK,CAAC,IAAK,KAAK;AAAA,IACtE;AAAA,EACJ;AACJ;AA4EY,MAAC,YAAY,IAAI,UAAS;","x_google_ignoreList":[0]}