@m5kdev/frontend 0.21.9 → 0.23.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 (100) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +23 -0
  2. package/dist/src/modules/app/components/AppConfigProvider.d.mts +2 -0
  3. package/dist/src/modules/app/components/AppConfigProvider.d.mts.map +1 -1
  4. package/dist/src/modules/app/components/AppConfigProvider.d.ts +2 -0
  5. package/dist/src/modules/app/components/AppConfigProvider.d.ts.map +1 -1
  6. package/dist/src/modules/app/components/AppConfigProvider.js +1 -0
  7. package/dist/src/modules/app/components/AppConfigProvider.js.map +1 -1
  8. package/dist/src/modules/app/components/AppConfigProvider.mjs.map +1 -1
  9. package/dist/src/modules/app/components/AppTrpcQueryProvider.js +1 -0
  10. package/dist/src/modules/app/components/AppTrpcQueryProvider.js.map +1 -1
  11. package/dist/src/modules/app/hooks/useAppConfig.d.mts +3 -0
  12. package/dist/src/modules/app/hooks/useAppConfig.d.mts.map +1 -1
  13. package/dist/src/modules/app/hooks/useAppConfig.d.ts +3 -0
  14. package/dist/src/modules/app/hooks/useAppConfig.d.ts.map +1 -1
  15. package/dist/src/modules/app/hooks/useAppConfig.js +1 -0
  16. package/dist/src/modules/app/hooks/useAppConfig.js.map +1 -1
  17. package/dist/src/modules/app/utils/locale.d.mts +8 -0
  18. package/dist/src/modules/app/utils/locale.d.mts.map +1 -0
  19. package/dist/src/modules/app/utils/locale.d.ts +8 -0
  20. package/dist/src/modules/app/utils/locale.d.ts.map +1 -0
  21. package/dist/src/modules/app/utils/locale.js +20 -0
  22. package/dist/src/modules/app/utils/locale.js.map +1 -0
  23. package/dist/src/modules/app/utils/locale.mjs +16 -0
  24. package/dist/src/modules/app/utils/locale.mjs.map +1 -0
  25. package/dist/src/modules/auth/auth.client.d.mts +1643 -102
  26. package/dist/src/modules/auth/auth.client.d.mts.map +1 -1
  27. package/dist/src/modules/auth/auth.client.d.ts +1643 -102
  28. package/dist/src/modules/auth/auth.client.d.ts.map +1 -1
  29. package/dist/src/modules/auth/auth.client.js +7 -3
  30. package/dist/src/modules/auth/auth.client.js.map +1 -1
  31. package/dist/src/modules/auth/auth.client.mjs +6 -3
  32. package/dist/src/modules/auth/auth.client.mjs.map +1 -1
  33. package/dist/src/modules/auth/auth.context.js +1 -0
  34. package/dist/src/modules/auth/auth.context.js.map +1 -1
  35. package/dist/src/modules/auth/auth.lib.d.mts +4 -2103
  36. package/dist/src/modules/auth/auth.lib.d.mts.map +1 -1
  37. package/dist/src/modules/auth/auth.lib.d.ts +4 -2103
  38. package/dist/src/modules/auth/auth.lib.d.ts.map +1 -1
  39. package/dist/src/modules/auth/auth.lib.js.map +1 -1
  40. package/dist/src/modules/auth/auth.lib.mjs.map +1 -1
  41. package/dist/src/modules/auth/components/AuthProvider.d.mts.map +1 -1
  42. package/dist/src/modules/auth/components/AuthProvider.d.ts.map +1 -1
  43. package/dist/src/modules/auth/components/AuthProvider.js +4 -0
  44. package/dist/src/modules/auth/components/AuthProvider.js.map +1 -1
  45. package/dist/src/modules/auth/components/AuthProvider.mjs +3 -0
  46. package/dist/src/modules/auth/components/AuthProvider.mjs.map +1 -1
  47. package/dist/src/modules/auth/hooks/useAuth.js +1 -0
  48. package/dist/src/modules/auth/hooks/useAuth.js.map +1 -1
  49. package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts +10 -1
  50. package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts.map +1 -1
  51. package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts +10 -1
  52. package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts.map +1 -1
  53. package/dist/src/modules/auth/hooks/useAuthAdmin.js +1 -0
  54. package/dist/src/modules/auth/hooks/useAuthAdmin.js.map +1 -1
  55. package/dist/src/modules/auth/hooks/useAuthClient.d.mts +2 -702
  56. package/dist/src/modules/auth/hooks/useAuthClient.d.mts.map +1 -1
  57. package/dist/src/modules/auth/hooks/useAuthClient.d.ts +2 -702
  58. package/dist/src/modules/auth/hooks/useAuthClient.d.ts.map +1 -1
  59. package/dist/src/modules/auth/hooks/useAuthClient.js +1 -0
  60. package/dist/src/modules/auth/hooks/useAuthClient.js.map +1 -1
  61. package/dist/src/modules/auth/hooks/useAuthClient.mjs.map +1 -1
  62. package/dist/src/modules/auth/hooks/useAuthLocale.d.mts +23 -0
  63. package/dist/src/modules/auth/hooks/useAuthLocale.d.mts.map +1 -0
  64. package/dist/src/modules/auth/hooks/useAuthLocale.d.ts +23 -0
  65. package/dist/src/modules/auth/hooks/useAuthLocale.d.ts.map +1 -0
  66. package/dist/src/modules/auth/hooks/useAuthLocale.js +25 -0
  67. package/dist/src/modules/auth/hooks/useAuthLocale.js.map +1 -0
  68. package/dist/src/modules/auth/hooks/useAuthLocale.mjs +23 -0
  69. package/dist/src/modules/auth/hooks/useAuthLocale.mjs.map +1 -0
  70. package/dist/src/modules/auth/hooks/useMemberInvite.js +1 -0
  71. package/dist/src/modules/auth/hooks/useMemberInvite.js.map +1 -1
  72. package/dist/src/modules/auth/hooks/useOrganizationAccess.d.mts +1 -1
  73. package/dist/src/modules/auth/hooks/useOrganizationAccess.d.ts +1 -1
  74. package/dist/src/modules/auth/hooks/useOrganizationAccess.js +1 -0
  75. package/dist/src/modules/auth/hooks/useOrganizationAccess.js.map +1 -1
  76. package/dist/src/modules/auth/hooks/useSession.js +1 -0
  77. package/dist/src/modules/auth/hooks/useSession.js.map +1 -1
  78. package/dist/src/modules/auth/hooks/useUserOrganizations.d.mts +2 -1
  79. package/dist/src/modules/auth/hooks/useUserOrganizations.d.ts +2 -1
  80. package/dist/src/modules/auth/hooks/useUserOrganizations.js +1 -0
  81. package/dist/src/modules/auth/hooks/useUserOrganizations.js.map +1 -1
  82. package/dist/src/modules/billing/components/BillingProvider.js +1 -0
  83. package/dist/src/modules/billing/components/BillingProvider.js.map +1 -1
  84. package/dist/src/modules/billing/hooks/useSubscription.js +1 -0
  85. package/dist/src/modules/billing/hooks/useSubscription.js.map +1 -1
  86. package/dist/src/modules/file/hooks/useS3DownloadUrl.js +1 -0
  87. package/dist/src/modules/file/hooks/useS3DownloadUrl.js.map +1 -1
  88. package/dist/src/modules/file/hooks/useS3Upload.js +1 -0
  89. package/dist/src/modules/file/hooks/useS3Upload.js.map +1 -1
  90. package/dist/src/modules/file/hooks/useUpload.js +1 -0
  91. package/dist/src/modules/file/hooks/useUpload.js.map +1 -1
  92. package/dist/src/modules/table/hooks/useQueryWithParams.js +1 -0
  93. package/dist/src/modules/table/hooks/useQueryWithParams.js.map +1 -1
  94. package/dist/src/modules/table/hooks/useTableQueryParams.js +1 -0
  95. package/dist/src/modules/table/hooks/useTableQueryParams.js.map +1 -1
  96. package/dist/src/modules/table/queryParams.js +1 -0
  97. package/dist/src/modules/table/queryParams.js.map +1 -1
  98. package/dist/src/utils/date.js +1 -0
  99. package/dist/src/utils/date.js.map +1 -1
  100. package/package.json +17 -5
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthClient.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"mappings":";;;;iBAIgB,aAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAGimD,kBAAA;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;UAA+wG,qBAAA,CAAA,WAAA;;;;;;;;;;;;;;;;;YAAx5D,YAAA;;;eAA2F,WAAA,IAAA,WAAA;;;;;eAA+U,eAAA;kBAA+C,kBAAA;;;WAAwG,WAAA;eAAwC,eAAA;;qBAAqF,cAAA;cAAyC,WAAA;gBAAgD,QAAA,EAAhD,qBAAA,CAAgD,eAAA,KAAA,OAAA;;;;;qBAAA,qBAAA,CAAA,UAAA;;;;;;;;;;;;;;;;;;;;kCAA27B,YAAA;;cAAA,qBAAA,CAAmG,gBAAA,UAAA,IAAA,UAAA,IAAA;kBAAA,qBAAA,CAAmG,gBAAA;;;;;uBAAuM,IAAA"}
1
+ {"version":3,"file":"useAuthClient.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"mappings":";;;iBAKgB,aAAA,CAAA,GAAiB,aAAA"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_auth_lib = require("../auth.lib.js");
3
4
  const require_src_modules_auth_auth_context = require("../auth.context.js");
4
5
  let react = require("react");
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthClient.js","names":["authProviderContext","getAuthClient"],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient() {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;;AAIA,SAAgB,gBAAgB;AAC9B,SAAA,GAAA,MAAA,YAAkBA,sCAAAA,oBAAoB,CAAC,cAAcC,kCAAAA,eAAe"}
1
+ {"version":3,"file":"useAuthClient.js","names":["authProviderContext","getAuthClient"],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport type { M5KAuthClient } from \"../auth.client\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient(): M5KAuthClient {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;;;AAKA,SAAgB,gBAA+B;AAC7C,SAAA,GAAA,MAAA,YAAkBA,sCAAAA,oBAAoB,CAAC,cAAcC,kCAAAA,eAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthClient.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient() {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;AAIA,SAAgB,gBAAgB;AAC9B,QAAO,WAAW,oBAAoB,CAAC,cAAc,eAAe"}
1
+ {"version":3,"file":"useAuthClient.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport type { M5KAuthClient } from \"../auth.client\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient(): M5KAuthClient {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;AAKA,SAAgB,gBAA+B;AAC7C,QAAO,WAAW,oBAAoB,CAAC,cAAc,eAAe"}
@@ -0,0 +1,23 @@
1
+ import * as _$_tanstack_react_query0 from "@tanstack/react-query";
2
+ import * as _$_trpc_client0 from "@trpc/client";
3
+ import * as _$_trpc_server0 from "@trpc/server";
4
+
5
+ //#region src/modules/auth/hooks/useAuthLocale.d.ts
6
+ declare function useAuthLocale(): {
7
+ locale: string | undefined;
8
+ isLoading: boolean;
9
+ setLocale: _$_tanstack_react_query0.UseMutateFunction<string, _$_trpc_client0.TRPCClientErrorLike<{
10
+ input: {
11
+ locale: string;
12
+ };
13
+ output: string;
14
+ transformer: true;
15
+ errorShape: _$_trpc_server0.TRPCDefaultErrorShape;
16
+ }>, {
17
+ locale: string;
18
+ }, undefined>;
19
+ isSettingLocale: boolean;
20
+ };
21
+ //#endregion
22
+ export { useAuthLocale };
23
+ //# sourceMappingURL=useAuthLocale.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.d.mts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"mappings":";;;;;iBAKgB,aAAA,CAAA;;;;;;;;;gBAAa,eAAA,CAAA,qBAAA;EAAA"}
@@ -0,0 +1,23 @@
1
+ import * as _$_tanstack_react_query0 from "@tanstack/react-query";
2
+ import * as _$_trpc_client0 from "@trpc/client";
3
+ import * as _$_trpc_server0 from "@trpc/server";
4
+
5
+ //#region src/modules/auth/hooks/useAuthLocale.d.ts
6
+ declare function useAuthLocale(): {
7
+ locale: string | undefined;
8
+ isLoading: boolean;
9
+ setLocale: _$_tanstack_react_query0.UseMutateFunction<string, _$_trpc_client0.TRPCClientErrorLike<{
10
+ input: {
11
+ locale: string;
12
+ };
13
+ output: string;
14
+ transformer: true;
15
+ errorShape: _$_trpc_server0.TRPCDefaultErrorShape;
16
+ }>, {
17
+ locale: string;
18
+ }, undefined>;
19
+ isSettingLocale: boolean;
20
+ };
21
+ //#endregion
22
+ export { useAuthLocale };
23
+ //# sourceMappingURL=useAuthLocale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"mappings":";;;;;iBAKgB,aAAA,CAAA;;;;;;;;;gBAAa,eAAA,CAAA,qBAAA;EAAA"}
@@ -0,0 +1,25 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
3
+ const require_src_modules_app_hooks_useAppTrpc = require("../../app/hooks/useAppTrpc.js");
4
+ const require_src_modules_app_utils_locale = require("../../app/utils/locale.js");
5
+ let _tanstack_react_query = require("@tanstack/react-query");
6
+ //#region src/modules/auth/hooks/useAuthLocale.ts
7
+ function useAuthLocale() {
8
+ const trpc = require_src_modules_app_hooks_useAppTrpc.useAppTRPC();
9
+ const queryClient = (0, _tanstack_react_query.useQueryClient)();
10
+ const localeQuery = (0, _tanstack_react_query.useQuery)(trpc.auth.getLocale.queryOptions());
11
+ const setLocaleMutation = (0, _tanstack_react_query.useMutation)(trpc.auth.setLocale.mutationOptions({ onSuccess: async (locale) => {
12
+ await require_src_modules_app_utils_locale.syncI18nLocale(locale);
13
+ await queryClient.invalidateQueries({ queryKey: trpc.auth.getLocale.queryKey() });
14
+ } }));
15
+ return {
16
+ locale: localeQuery.data,
17
+ isLoading: localeQuery.isLoading,
18
+ setLocale: setLocaleMutation.mutate,
19
+ isSettingLocale: setLocaleMutation.isPending
20
+ };
21
+ }
22
+ //#endregion
23
+ exports.useAuthLocale = useAuthLocale;
24
+
25
+ //# sourceMappingURL=useAuthLocale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.js","names":["useAppTRPC","syncI18nLocale"],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\nimport { syncI18nLocale } from \"../../app/utils/locale\";\r\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\n\r\nexport function useAuthLocale() {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const queryClient = useQueryClient();\r\n\r\n const localeQuery = useQuery(trpc.auth.getLocale.queryOptions());\r\n const setLocaleMutation = useMutation(\r\n trpc.auth.setLocale.mutationOptions({\r\n onSuccess: async (locale) => {\r\n await syncI18nLocale(locale);\r\n await queryClient.invalidateQueries({\r\n queryKey: trpc.auth.getLocale.queryKey(),\r\n });\r\n },\r\n })\r\n );\r\n\r\n return {\r\n locale: localeQuery.data,\r\n isLoading: localeQuery.isLoading,\r\n setLocale: setLocaleMutation.mutate,\r\n isSettingLocale: setLocaleMutation.isPending,\r\n };\r\n}\r\n"],"mappings":";;;;;;AAKA,SAAgB,gBAAgB;CAC9B,MAAM,OAAOA,yCAAAA,YAA+B;CAC5C,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CAEpC,MAAM,eAAA,GAAA,sBAAA,UAAuB,KAAK,KAAK,UAAU,cAAc,CAAC;CAChE,MAAM,qBAAA,GAAA,sBAAA,aACJ,KAAK,KAAK,UAAU,gBAAgB,EAClC,WAAW,OAAO,WAAW;AAC3B,QAAMC,qCAAAA,eAAe,OAAO;AAC5B,QAAM,YAAY,kBAAkB,EAClC,UAAU,KAAK,KAAK,UAAU,UAAU,EACzC,CAAC;IAEL,CAAC,CACH;AAED,QAAO;EACL,QAAQ,YAAY;EACpB,WAAW,YAAY;EACvB,WAAW,kBAAkB;EAC7B,iBAAiB,kBAAkB;EACpC"}
@@ -0,0 +1,23 @@
1
+ import { useAppTRPC } from "../../app/hooks/useAppTrpc.mjs";
2
+ import { syncI18nLocale } from "../../app/utils/locale.mjs";
3
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
+ //#region src/modules/auth/hooks/useAuthLocale.ts
5
+ function useAuthLocale() {
6
+ const trpc = useAppTRPC();
7
+ const queryClient = useQueryClient();
8
+ const localeQuery = useQuery(trpc.auth.getLocale.queryOptions());
9
+ const setLocaleMutation = useMutation(trpc.auth.setLocale.mutationOptions({ onSuccess: async (locale) => {
10
+ await syncI18nLocale(locale);
11
+ await queryClient.invalidateQueries({ queryKey: trpc.auth.getLocale.queryKey() });
12
+ } }));
13
+ return {
14
+ locale: localeQuery.data,
15
+ isLoading: localeQuery.isLoading,
16
+ setLocale: setLocaleMutation.mutate,
17
+ isSettingLocale: setLocaleMutation.isPending
18
+ };
19
+ }
20
+ //#endregion
21
+ export { useAuthLocale };
22
+
23
+ //# sourceMappingURL=useAuthLocale.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\nimport { syncI18nLocale } from \"../../app/utils/locale\";\r\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\n\r\nexport function useAuthLocale() {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const queryClient = useQueryClient();\r\n\r\n const localeQuery = useQuery(trpc.auth.getLocale.queryOptions());\r\n const setLocaleMutation = useMutation(\r\n trpc.auth.setLocale.mutationOptions({\r\n onSuccess: async (locale) => {\r\n await syncI18nLocale(locale);\r\n await queryClient.invalidateQueries({\r\n queryKey: trpc.auth.getLocale.queryKey(),\r\n });\r\n },\r\n })\r\n );\r\n\r\n return {\r\n locale: localeQuery.data,\r\n isLoading: localeQuery.isLoading,\r\n setLocale: setLocaleMutation.mutate,\r\n isSettingLocale: setLocaleMutation.isPending,\r\n };\r\n}\r\n"],"mappings":";;;;AAKA,SAAgB,gBAAgB;CAC9B,MAAM,OAAO,YAA+B;CAC5C,MAAM,cAAc,gBAAgB;CAEpC,MAAM,cAAc,SAAS,KAAK,KAAK,UAAU,cAAc,CAAC;CAChE,MAAM,oBAAoB,YACxB,KAAK,KAAK,UAAU,gBAAgB,EAClC,WAAW,OAAO,WAAW;AAC3B,QAAM,eAAe,OAAO;AAC5B,QAAM,YAAY,kBAAkB,EAClC,UAAU,KAAK,KAAK,UAAU,UAAU,EACzC,CAAC;IAEL,CAAC,CACH;AAED,QAAO;EACL,QAAQ,YAAY;EACpB,WAAW,YAAY;EACvB,WAAW,kBAAkB;EAC7B,iBAAiB,kBAAkB;EACpC"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_hooks_useAuthClient = require("./useAuthClient.js");
3
4
  const require_src_modules_auth_hooks_useOrganizationAccess = require("./useOrganizationAccess.js");
4
5
  let _tanstack_react_query = require("@tanstack/react-query");
@@ -1 +1 @@
1
- {"version":3,"file":"useMemberInvite.js","names":["useAuthClient","useOrganizationAccess"],"sources":["../../../../../src/modules/auth/hooks/useMemberInvite.ts"],"sourcesContent":["import { type UseMutationOptions, useMutation } from \"@tanstack/react-query\";\r\nimport { useAuthClient } from \"./useAuthClient\";\r\nimport {\r\n type AuthOrganizationRole,\r\n type UseOrganizationAccessProps,\r\n useOrganizationAccess,\r\n} from \"./useOrganizationAccess\";\r\n\r\ntype Variables = { email: string; role: AuthOrganizationRole };\r\n\r\nexport function useAuthMemberInvite(\r\n options: Omit<UseMutationOptions<void, Error, Variables, unknown>, \"mutationFn\">,\r\n props?: UseOrganizationAccessProps\r\n): ReturnType<typeof useMutation<void, Error, Variables, unknown>> {\r\n const { managerRoles = [\"admin\", \"owner\"], onInvalidateScopedQueries } = props ?? {};\r\n const { onSuccess, ...rest } = options;\r\n const authClient = useAuthClient();\r\n const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n });\r\n return useMutation({\r\n mutationFn: async ({ email, role }: { email: string; role: AuthOrganizationRole }) => {\r\n const { error } = await authClient.organization.inviteMember({\r\n organizationId: activeOrganizationId,\r\n email: email.trim(),\r\n role,\r\n });\r\n if (error) throw new Error(error.message);\r\n },\r\n\r\n onSuccess: async (data, variables, context) => {\r\n await refreshOrganizationQueries();\r\n await onSuccess?.(data, variables, context);\r\n },\r\n ...rest,\r\n });\r\n}\r\n"],"mappings":";;;;;AAUA,SAAgB,oBACd,SACA,OACiE;CACjE,MAAM,EAAE,eAAe,CAAC,SAAS,QAAQ,EAAE,8BAA8B,SAAS,EAAE;CACpF,MAAM,EAAE,WAAW,GAAG,SAAS;CAC/B,MAAM,aAAaA,6CAAAA,eAAe;CAClC,MAAM,EAAE,4BAA4B,yBAAyBC,qDAAAA,sBAAsB;EACjF;EACA;EACD,CAAC;AACF,SAAA,GAAA,sBAAA,aAAmB;EACjB,YAAY,OAAO,EAAE,OAAO,WAA0D;GACpF,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,aAAa;IAC3D,gBAAgB;IAChB,OAAO,MAAM,MAAM;IACnB;IACD,CAAC;AACF,OAAI,MAAO,OAAM,IAAI,MAAM,MAAM,QAAQ;;EAG3C,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,SAAM,4BAA4B;AAClC,SAAM,YAAY,MAAM,WAAW,QAAQ;;EAE7C,GAAG;EACJ,CAAC"}
1
+ {"version":3,"file":"useMemberInvite.js","names":["useAuthClient","useOrganizationAccess"],"sources":["../../../../../src/modules/auth/hooks/useMemberInvite.ts"],"sourcesContent":["import { type UseMutationOptions, useMutation } from \"@tanstack/react-query\";\r\nimport { useAuthClient } from \"./useAuthClient\";\r\nimport {\r\n type AuthOrganizationRole,\r\n type UseOrganizationAccessProps,\r\n useOrganizationAccess,\r\n} from \"./useOrganizationAccess\";\r\n\r\ntype Variables = { email: string; role: AuthOrganizationRole };\r\n\r\nexport function useAuthMemberInvite(\r\n options: Omit<UseMutationOptions<void, Error, Variables, unknown>, \"mutationFn\">,\r\n props?: UseOrganizationAccessProps\r\n): ReturnType<typeof useMutation<void, Error, Variables, unknown>> {\r\n const { managerRoles = [\"admin\", \"owner\"], onInvalidateScopedQueries } = props ?? {};\r\n const { onSuccess, ...rest } = options;\r\n const authClient = useAuthClient();\r\n const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n });\r\n return useMutation({\r\n mutationFn: async ({ email, role }: { email: string; role: AuthOrganizationRole }) => {\r\n const { error } = await authClient.organization.inviteMember({\r\n organizationId: activeOrganizationId,\r\n email: email.trim(),\r\n role,\r\n });\r\n if (error) throw new Error(error.message);\r\n },\r\n\r\n onSuccess: async (data, variables, context) => {\r\n await refreshOrganizationQueries();\r\n await onSuccess?.(data, variables, context);\r\n },\r\n ...rest,\r\n });\r\n}\r\n"],"mappings":";;;;;;AAUA,SAAgB,oBACd,SACA,OACiE;CACjE,MAAM,EAAE,eAAe,CAAC,SAAS,QAAQ,EAAE,8BAA8B,SAAS,EAAE;CACpF,MAAM,EAAE,WAAW,GAAG,SAAS;CAC/B,MAAM,aAAaA,6CAAAA,eAAe;CAClC,MAAM,EAAE,4BAA4B,yBAAyBC,qDAAAA,sBAAsB;EACjF;EACA;EACD,CAAC;AACF,SAAA,GAAA,sBAAA,aAAmB;EACjB,YAAY,OAAO,EAAE,OAAO,WAA0D;GACpF,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,aAAa;IAC3D,gBAAgB;IAChB,OAAO,MAAM,MAAM;IACnB;IACD,CAAC;AACF,OAAI,MAAO,OAAM,IAAI,MAAM,MAAM,QAAQ;;EAG3C,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,SAAM,4BAA4B;AAClC,SAAM,YAAY,MAAM,WAAW,QAAQ;;EAE7C,GAAG;EACJ,CAAC"}
@@ -9,7 +9,7 @@ declare function useOrganizationAccess({
9
9
  managerRoles,
10
10
  onInvalidateScopedQueries
11
11
  }: UseOrganizationAccessProps): {
12
- activeOrganizationId: any;
12
+ activeOrganizationId: string;
13
13
  activeOrganizationRole: string;
14
14
  canManageOrganization: boolean;
15
15
  refreshOrganizationQueries: () => Promise<void>;
@@ -9,7 +9,7 @@ declare function useOrganizationAccess({
9
9
  managerRoles,
10
10
  onInvalidateScopedQueries
11
11
  }: UseOrganizationAccessProps): {
12
- activeOrganizationId: any;
12
+ activeOrganizationId: string;
13
13
  activeOrganizationRole: string;
14
14
  canManageOrganization: boolean;
15
15
  refreshOrganizationQueries: () => Promise<void>;
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_hooks_useSession = require("./useSession.js");
3
4
  let react = require("react");
4
5
  let _tanstack_react_query = require("@tanstack/react-query");
@@ -1 +1 @@
1
- {"version":3,"file":"useOrganizationAccess.js","names":["useSession"],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"sourcesContent":["import { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useMemo } from \"react\";\r\nimport { useSession } from \"./useSession\";\r\n\r\n// TODO: move to commons\r\n\r\nconst ORGANIZATION_ROLES = [\"member\", \"admin\", \"owner\"] as const;\r\n\r\nexport type AuthOrganizationRole = (typeof ORGANIZATION_ROLES)[number];\r\n\r\nexport interface UseOrganizationAccessProps {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n}\r\n\r\nexport function useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: UseOrganizationAccessProps) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles ?? [\"admin\", \"owner\"]), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n };\r\n}\r\n"],"mappings":";;;;;AAeA,SAAgB,sBAAsB,EACpC,cACA,6BAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS,oBAAoBA,0CAAAA,YAAY;CACvD,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CAEpC,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;AAuBF,QAAO;EACL;EACA;EACA,wBAAA,GAAA,MAAA,eAzBmC,IAAI,IAAI,gBAAgB,CAAC,SAAS,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CACpD,IAAI,uBAAuB;EAyBtE,6BAAA,GAAA,MAAA,aAvB6C,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOlF"}
1
+ {"version":3,"file":"useOrganizationAccess.js","names":["useSession"],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"sourcesContent":["import { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useMemo } from \"react\";\r\nimport { useSession } from \"./useSession\";\r\n\r\n// TODO: move to commons\r\n\r\nconst ORGANIZATION_ROLES = [\"member\", \"admin\", \"owner\"] as const;\r\n\r\nexport type AuthOrganizationRole = (typeof ORGANIZATION_ROLES)[number];\r\n\r\nexport interface UseOrganizationAccessProps {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n}\r\n\r\nexport function useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: UseOrganizationAccessProps) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles ?? [\"admin\", \"owner\"]), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n };\r\n}\r\n"],"mappings":";;;;;;AAeA,SAAgB,sBAAsB,EACpC,cACA,6BAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS,oBAAoBA,0CAAAA,YAAY;CACvD,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CAEpC,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;AAuBF,QAAO;EACL;EACA;EACA,wBAAA,GAAA,MAAA,eAzBmC,IAAI,IAAI,gBAAgB,CAAC,SAAS,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CACpD,IAAI,uBAAuB;EAyBtE,6BAAA,GAAA,MAAA,aAvB6C,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOlF"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_auth_context = require("../auth.context.js");
3
4
  let react = require("react");
4
5
  //#region src/modules/auth/hooks/useSession.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useSession.js","names":["authProviderContext"],"sources":["../../../../../src/modules/auth/hooks/useSession.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\n\r\nexport function useSession() {\r\n const { authClient: _authClient, ...session } = useContext(authProviderContext);\r\n return session;\r\n}\r\n"],"mappings":";;;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,YAAY,aAAa,GAAG,aAAA,GAAA,MAAA,YAAuBA,sCAAAA,oBAAoB;AAC/E,QAAO"}
1
+ {"version":3,"file":"useSession.js","names":["authProviderContext"],"sources":["../../../../../src/modules/auth/hooks/useSession.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\n\r\nexport function useSession() {\r\n const { authClient: _authClient, ...session } = useContext(authProviderContext);\r\n return session;\r\n}\r\n"],"mappings":";;;;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,YAAY,aAAa,GAAG,aAAA,GAAA,MAAA,YAAuBA,sCAAAA,oBAAoB;AAC/E,QAAO"}
@@ -8,9 +8,10 @@ declare const useUserOrganizations: () => _$_tanstack_react_query0.UseQueryResul
8
8
  name: string;
9
9
  createdAt: Date;
10
10
  onboarding: number | null;
11
- type: string | null;
11
+ locale: string | null;
12
12
  slug: string | null;
13
13
  logo: string | null;
14
+ type: string | null;
14
15
  parentId: string | null;
15
16
  }[], _$_trpc_client0.TRPCClientErrorLike<{
16
17
  transformer: true;
@@ -8,9 +8,10 @@ declare const useUserOrganizations: () => _$_tanstack_react_query0.UseQueryResul
8
8
  name: string;
9
9
  createdAt: Date;
10
10
  onboarding: number | null;
11
- type: string | null;
11
+ locale: string | null;
12
12
  slug: string | null;
13
13
  logo: string | null;
14
+ type: string | null;
14
15
  parentId: string | null;
15
16
  }[], _$_trpc_client0.TRPCClientErrorLike<{
16
17
  transformer: true;
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppTrpc = require("../../app/hooks/useAppTrpc.js");
3
4
  const require_src_modules_auth_hooks_useSession = require("./useSession.js");
4
5
  let _tanstack_react_query = require("@tanstack/react-query");
@@ -1 +1 @@
1
- {"version":3,"file":"useUserOrganizations.js","names":["useAppTRPC","useSession"],"sources":["../../../../../src/modules/auth/hooks/useUserOrganizations.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useSession } from \"./useSession\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const useUserOrganizations = () => {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const { data, isLoading } = useSession();\r\n return useQuery(\r\n trpc.auth.listUserOrganizations.queryOptions(undefined, {\r\n enabled: !isLoading && Boolean(data?.session.userId),\r\n })\r\n );\r\n};\r\n"],"mappings":";;;;;AAKA,MAAa,6BAA6B;CACxC,MAAM,OAAOA,yCAAAA,YAA+B;CAC5C,MAAM,EAAE,MAAM,cAAcC,0CAAAA,YAAY;AACxC,SAAA,GAAA,sBAAA,UACE,KAAK,KAAK,sBAAsB,aAAa,KAAA,GAAW,EACtD,SAAS,CAAC,aAAa,QAAQ,MAAM,QAAQ,OAAO,EACrD,CAAC,CACH"}
1
+ {"version":3,"file":"useUserOrganizations.js","names":["useAppTRPC","useSession"],"sources":["../../../../../src/modules/auth/hooks/useUserOrganizations.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useSession } from \"./useSession\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const useUserOrganizations = () => {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const { data, isLoading } = useSession();\r\n return useQuery(\r\n trpc.auth.listUserOrganizations.queryOptions(undefined, {\r\n enabled: !isLoading && Boolean(data?.session.userId),\r\n })\r\n );\r\n};\r\n"],"mappings":";;;;;;AAKA,MAAa,6BAA6B;CACxC,MAAM,OAAOA,yCAAAA,YAA+B;CAC5C,MAAM,EAAE,MAAM,cAAcC,0CAAAA,YAAY;AACxC,SAAA,GAAA,sBAAA,UACE,KAAK,KAAK,sBAAsB,aAAa,KAAA,GAAW,EACtD,SAAS,CAAC,aAAa,QAAQ,MAAM,QAAQ,OAAO,EACrD,CAAC,CACH"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppTrpc = require("../../app/hooks/useAppTrpc.js");
3
4
  let react = require("react");
4
5
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -1 +1 @@
1
- {"version":3,"file":"BillingProvider.js","names":["useAppTRPC"],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport type { BillingSchema } from \"@m5kdev/commons/modules/billing/billing.schema\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { createContext } from \"react\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const billingProviderContext = createContext<{\r\n isLoading: boolean;\r\n data: BillingSchema | null;\r\n}>({\r\n isLoading: true,\r\n data: null,\r\n});\r\n\r\nexport function BillingProvider({\r\n children,\r\n loader,\r\n planPage,\r\n skipPlanCheck = false,\r\n}: {\r\n children: React.ReactNode;\r\n loader?: React.ReactNode;\r\n planPage: React.ReactNode;\r\n skipPlanCheck?: boolean;\r\n}) {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n\r\n const { data: activeSubscription, isLoading } = useQuery(\r\n trpc.billing.getActiveSubscription.queryOptions(undefined, {\r\n staleTime: 1000 * 60 * 60 * 4, // 4 hours\r\n enabled: !skipPlanCheck,\r\n })\r\n );\r\n\r\n if (skipPlanCheck) {\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading: false, data: null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n }\r\n\r\n // Show loading screen while checking subscription status\r\n if (isLoading) {\r\n return loader ? loader : \"Loading...\";\r\n }\r\n\r\n if (!activeSubscription) {\r\n return planPage;\r\n }\r\n\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading, data: activeSubscription ?? null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n}\r\n"],"mappings":";;;;;;AAMA,MAAa,0BAAA,GAAA,MAAA,eAGV;CACD,WAAW;CACX,MAAM;CACP,CAAC;AAEF,SAAgB,gBAAgB,EAC9B,UACA,QACA,UACA,gBAAgB,SAMf;CAGD,MAAM,EAAE,MAAM,oBAAoB,eAAA,GAAA,sBAAA,UAFrBA,yCAAAA,YAA+B,CAGrC,QAAQ,sBAAsB,aAAa,KAAA,GAAW;EACzD,WAAW,MAAO,KAAK,KAAK;EAC5B,SAAS,CAAC;EACX,CAAC,CACH;AAED,KAAI,cACF,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE,WAAW;GAAO,MAAM;GAAM;EACrE;EAC+B,CAAA;AAKtC,KAAI,UACF,QAAO,SAAS,SAAS;AAG3B,KAAI,CAAC,mBACH,QAAO;AAGT,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE;GAAW,MAAM,sBAAsB;GAAM;EACpF;EAC+B,CAAA"}
1
+ {"version":3,"file":"BillingProvider.js","names":["useAppTRPC"],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport type { BillingSchema } from \"@m5kdev/commons/modules/billing/billing.schema\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { createContext } from \"react\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const billingProviderContext = createContext<{\r\n isLoading: boolean;\r\n data: BillingSchema | null;\r\n}>({\r\n isLoading: true,\r\n data: null,\r\n});\r\n\r\nexport function BillingProvider({\r\n children,\r\n loader,\r\n planPage,\r\n skipPlanCheck = false,\r\n}: {\r\n children: React.ReactNode;\r\n loader?: React.ReactNode;\r\n planPage: React.ReactNode;\r\n skipPlanCheck?: boolean;\r\n}) {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n\r\n const { data: activeSubscription, isLoading } = useQuery(\r\n trpc.billing.getActiveSubscription.queryOptions(undefined, {\r\n staleTime: 1000 * 60 * 60 * 4, // 4 hours\r\n enabled: !skipPlanCheck,\r\n })\r\n );\r\n\r\n if (skipPlanCheck) {\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading: false, data: null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n }\r\n\r\n // Show loading screen while checking subscription status\r\n if (isLoading) {\r\n return loader ? loader : \"Loading...\";\r\n }\r\n\r\n if (!activeSubscription) {\r\n return planPage;\r\n }\r\n\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading, data: activeSubscription ?? null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n}\r\n"],"mappings":";;;;;;;AAMA,MAAa,0BAAA,GAAA,MAAA,eAGV;CACD,WAAW;CACX,MAAM;CACP,CAAC;AAEF,SAAgB,gBAAgB,EAC9B,UACA,QACA,UACA,gBAAgB,SAMf;CAGD,MAAM,EAAE,MAAM,oBAAoB,eAAA,GAAA,sBAAA,UAFrBA,yCAAAA,YAA+B,CAGrC,QAAQ,sBAAsB,aAAa,KAAA,GAAW;EACzD,WAAW,MAAO,KAAK,KAAK;EAC5B,SAAS,CAAC;EACX,CAAC,CACH;AAED,KAAI,cACF,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE,WAAW;GAAO,MAAM;GAAM;EACrE;EAC+B,CAAA;AAKtC,KAAI,UACF,QAAO,SAAS,SAAS;AAG3B,KAAI,CAAC,mBACH,QAAO;AAGT,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE;GAAW,MAAM,sBAAsB;GAAM;EACpF;EAC+B,CAAA"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_billing_components_BillingProvider = require("../components/BillingProvider.js");
3
4
  let react = require("react");
4
5
  //#region src/modules/billing/hooks/useSubscription.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useSubscription.js","names":["billingProviderContext"],"sources":["../../../../../src/modules/billing/hooks/useSubscription.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { billingProviderContext } from \"../components/BillingProvider\";\r\n\r\nexport function useSubscription() {\r\n return useContext(billingProviderContext);\r\n}\r\n"],"mappings":";;;;AAGA,SAAgB,kBAAkB;AAChC,SAAA,GAAA,MAAA,YAAkBA,uDAAAA,uBAAuB"}
1
+ {"version":3,"file":"useSubscription.js","names":["billingProviderContext"],"sources":["../../../../../src/modules/billing/hooks/useSubscription.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { billingProviderContext } from \"../components/BillingProvider\";\r\n\r\nexport function useSubscription() {\r\n return useContext(billingProviderContext);\r\n}\r\n"],"mappings":";;;;;AAGA,SAAgB,kBAAkB;AAChC,SAAA,GAAA,MAAA,YAAkBA,uDAAAA,uBAAuB"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppConfig = require("../../app/hooks/useAppConfig.js");
3
4
  let _tanstack_react_query = require("@tanstack/react-query");
4
5
  //#region src/modules/file/hooks/useS3DownloadUrl.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useS3DownloadUrl.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3DownloadUrl.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport async function fetchS3DownloadUrl(filePath: string, serverUrl?: string) {\r\n if (!serverUrl) {\r\n throw new Error(\"fetchS3DownloadUrl requires a serverUrl. In React, use useS3DownloadUrl.\");\r\n }\r\n\r\n const res = await fetch(`${serverUrl}/upload/files/${filePath}`);\r\n if (!res.ok) throw new Error(\"Failed to get download URL\");\r\n return (await res.json()).url as string;\r\n}\r\n\r\nexport function useS3DownloadUrl(filePath: string, serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n\r\n return useQuery<string, Error>({\r\n queryKey: [\"s3DownloadUrl\", resolvedServerUrl, filePath],\r\n queryFn: () => fetchS3DownloadUrl(filePath, resolvedServerUrl),\r\n enabled: Boolean(filePath),\r\n });\r\n}\r\n"],"mappings":";;;;AAGA,eAAsB,mBAAmB,UAAkB,WAAoB;AAC7E,KAAI,CAAC,UACH,OAAM,IAAI,MAAM,2EAA2E;CAG7F,MAAM,MAAM,MAAM,MAAM,GAAG,UAAU,gBAAgB,WAAW;AAChE,KAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAC1D,SAAQ,MAAM,IAAI,MAAM,EAAE;;AAG5B,SAAgB,iBAAiB,UAAkB,mBAA4B;CAC7E,MAAM,EAAE,cAAcA,2CAAAA,cAAc;CACpC,MAAM,oBAAoB,qBAAqB;AAE/C,SAAA,GAAA,sBAAA,UAA+B;EAC7B,UAAU;GAAC;GAAiB;GAAmB;GAAS;EACxD,eAAe,mBAAmB,UAAU,kBAAkB;EAC9D,SAAS,QAAQ,SAAS;EAC3B,CAAC"}
1
+ {"version":3,"file":"useS3DownloadUrl.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3DownloadUrl.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport async function fetchS3DownloadUrl(filePath: string, serverUrl?: string) {\r\n if (!serverUrl) {\r\n throw new Error(\"fetchS3DownloadUrl requires a serverUrl. In React, use useS3DownloadUrl.\");\r\n }\r\n\r\n const res = await fetch(`${serverUrl}/upload/files/${filePath}`);\r\n if (!res.ok) throw new Error(\"Failed to get download URL\");\r\n return (await res.json()).url as string;\r\n}\r\n\r\nexport function useS3DownloadUrl(filePath: string, serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n\r\n return useQuery<string, Error>({\r\n queryKey: [\"s3DownloadUrl\", resolvedServerUrl, filePath],\r\n queryFn: () => fetchS3DownloadUrl(filePath, resolvedServerUrl),\r\n enabled: Boolean(filePath),\r\n });\r\n}\r\n"],"mappings":";;;;;AAGA,eAAsB,mBAAmB,UAAkB,WAAoB;AAC7E,KAAI,CAAC,UACH,OAAM,IAAI,MAAM,2EAA2E;CAG7F,MAAM,MAAM,MAAM,MAAM,GAAG,UAAU,gBAAgB,WAAW;AAChE,KAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAC1D,SAAQ,MAAM,IAAI,MAAM,EAAE;;AAG5B,SAAgB,iBAAiB,UAAkB,mBAA4B;CAC7E,MAAM,EAAE,cAAcA,2CAAAA,cAAc;CACpC,MAAM,oBAAoB,qBAAqB;AAE/C,SAAA,GAAA,sBAAA,UAA+B;EAC7B,UAAU;GAAC;GAAiB;GAAmB;GAAS;EACxD,eAAe,mBAAmB,UAAU,kBAAkB;EAC9D,SAAS,QAAQ,SAAS;EAC3B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppConfig = require("../../app/hooks/useAppConfig.js");
3
4
  let react = require("react");
4
5
  //#region src/modules/file/hooks/useS3Upload.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useS3Upload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3Upload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport type S3UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\r\n\r\nexport type UploadBlobInput =\r\n | Blob\r\n | {\r\n uri: string;\r\n name?: string;\r\n type?: string;\r\n size?: number;\r\n };\r\n\r\nexport type ResolvedUploadBlob = {\r\n blob: Blob;\r\n name: string;\r\n type: string;\r\n size: number;\r\n};\r\n\r\nasync function getPresignedUrl(\r\n filename: string,\r\n filetype: string,\r\n serverUrl: string\r\n): Promise<string> {\r\n const res = await fetch(`${serverUrl}/upload/s3-presigned-url`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ filename, filetype }),\r\n });\r\n if (!res.ok) throw new Error(\"Failed to get presigned URL\");\r\n const data = (await res.json()) as { url: string };\r\n return data.url;\r\n}\r\n\r\nfunction isBlobInput(file: UploadBlobInput): file is Blob {\r\n return typeof Blob !== \"undefined\" && file instanceof Blob;\r\n}\r\n\r\nfunction getInputName(file: UploadBlobInput) {\r\n if (!isBlobInput(file)) {\r\n return file.name ?? `upload-${Date.now()}`;\r\n }\r\n\r\n return \"name\" in file && typeof file.name === \"string\" ? file.name : `upload-${Date.now()}`;\r\n}\r\n\r\nfunction getInputType(file: UploadBlobInput, blob: Blob) {\r\n if (!isBlobInput(file)) {\r\n return file.type ?? blob.type ?? \"application/octet-stream\";\r\n }\r\n\r\n return file.type || \"application/octet-stream\";\r\n}\r\n\r\nexport async function resolveUploadBlob(file: UploadBlobInput): Promise<ResolvedUploadBlob> {\r\n const blob = isBlobInput(file) ? file : await fetch(file.uri).then((response) => response.blob());\r\n return {\r\n blob,\r\n name: getInputName(file),\r\n type: getInputType(file, blob),\r\n size: \"size\" in file && typeof file.size === \"number\" ? file.size : blob.size,\r\n };\r\n}\r\n\r\nfunction createUploadId() {\r\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2, 11);\r\n}\r\n\r\nexport function useS3Upload(serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n const [progress, setProgress] = useState<number>(0);\r\n const [status, setStatus] = useState<S3UploadStatus>(\"idle\");\r\n const [error, setError] = useState<string | null>(null);\r\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(null);\r\n\r\n const upload = useCallback(\r\n async (file: UploadBlobInput, prefix?: string) => {\r\n setProgress(0);\r\n setStatus(\"uploading\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n try {\r\n const resolvedFile = await resolveUploadBlob(file);\r\n const originalFilename = resolvedFile.name;\r\n const extension = originalFilename.split(\".\").pop() || \"\";\r\n const uuid = createUploadId();\r\n const filename = prefix\r\n ? `${prefix}/${uuid}${extension ? `.${extension}` : \"\"}`\r\n : `${uuid}${extension ? `.${extension}` : \"\"}`;\r\n const filetype = resolvedFile.type;\r\n const presignedUrl = await getPresignedUrl(filename, filetype, resolvedServerUrl);\r\n\r\n return await new Promise<string>((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"PUT\", presignedUrl);\r\n xhr.setRequestHeader(\"Content-Type\", filetype);\r\n\r\n xhr.upload.onprogress = (event) => {\r\n if (event.lengthComputable) {\r\n setProgress(Math.round((event.loaded * 100) / event.total));\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n setProgress(100);\r\n setStatus(\"success\");\r\n // Remove query params to get the public URL\r\n setUploadedUrl(presignedUrl.split(\"?\")[0]);\r\n resolve(filename);\r\n } else {\r\n setStatus(\"error\");\r\n setError(`Upload failed with status ${xhr.status}`);\r\n reject(new Error(`Upload failed with status ${xhr.status}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n setStatus(\"error\");\r\n setError(\"Network error during upload\");\r\n reject(new Error(\"Network error during upload\"));\r\n };\r\n\r\n xhr.send(resolvedFile.blob);\r\n });\r\n } catch (err: unknown) {\r\n setStatus(\"error\");\r\n setError(err instanceof Error ? err.message : \"Unknown error\");\r\n return Promise.reject(err);\r\n }\r\n },\r\n [resolvedServerUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setProgress(0);\r\n setStatus(\"idle\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n }, []);\r\n\r\n return { upload, progress, status, error, uploadedUrl, reset };\r\n}\r\n"],"mappings":";;;;AAqBA,eAAe,gBACb,UACA,UACA,WACiB;CACjB,MAAM,MAAM,MAAM,MAAM,GAAG,UAAU,2BAA2B;EAC9D,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GAAE;GAAU;GAAU,CAAC;EAC7C,CAAC;AACF,KAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B;AAE3D,SADc,MAAM,IAAI,MAAM,EAClB;;AAGd,SAAS,YAAY,MAAqC;AACxD,QAAO,OAAO,SAAS,eAAe,gBAAgB;;AAGxD,SAAS,aAAa,MAAuB;AAC3C,KAAI,CAAC,YAAY,KAAK,CACpB,QAAO,KAAK,QAAQ,UAAU,KAAK,KAAK;AAG1C,QAAO,UAAU,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,UAAU,KAAK,KAAK;;AAG3F,SAAS,aAAa,MAAuB,MAAY;AACvD,KAAI,CAAC,YAAY,KAAK,CACpB,QAAO,KAAK,QAAQ,KAAK,QAAQ;AAGnC,QAAO,KAAK,QAAQ;;AAGtB,eAAsB,kBAAkB,MAAoD;CAC1F,MAAM,OAAO,YAAY,KAAK,GAAG,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC,MAAM,aAAa,SAAS,MAAM,CAAC;AACjG,QAAO;EACL;EACA,MAAM,aAAa,KAAK;EACxB,MAAM,aAAa,MAAM,KAAK;EAC9B,MAAM,UAAU,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAK;EAC1E;;AAGH,SAAS,iBAAiB;AACxB,QAAO,WAAW,QAAQ,cAAc,IAAI,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG;;AAGrF,SAAgB,YAAY,mBAA4B;CACtD,MAAM,EAAE,cAAcA,2CAAAA,cAAc;CACpC,MAAM,oBAAoB,qBAAqB;CAC/C,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,UAAgC,EAAE;CACnD,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAsC,OAAO;CAC5D,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAoC,KAAK;CACvD,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAA0C,KAAK;AAoEnE,QAAO;EAAE,SAAA,GAAA,MAAA,aAjEP,OAAO,MAAuB,WAAoB;AAChD,eAAY,EAAE;AACd,aAAU,YAAY;AACtB,YAAS,KAAK;AACd,kBAAe,KAAK;AACpB,OAAI;IACF,MAAM,eAAe,MAAM,kBAAkB,KAAK;IAElD,MAAM,YADmB,aAAa,KACH,MAAM,IAAI,CAAC,KAAK,IAAI;IACvD,MAAM,OAAO,gBAAgB;IAC7B,MAAM,WAAW,SACb,GAAG,OAAO,GAAG,OAAO,YAAY,IAAI,cAAc,OAClD,GAAG,OAAO,YAAY,IAAI,cAAc;IAC5C,MAAM,WAAW,aAAa;IAC9B,MAAM,eAAe,MAAM,gBAAgB,UAAU,UAAU,kBAAkB;AAEjF,WAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;KACpD,MAAM,MAAM,IAAI,gBAAgB;AAChC,SAAI,KAAK,OAAO,aAAa;AAC7B,SAAI,iBAAiB,gBAAgB,SAAS;AAE9C,SAAI,OAAO,cAAc,UAAU;AACjC,UAAI,MAAM,iBACR,aAAY,KAAK,MAAO,MAAM,SAAS,MAAO,MAAM,MAAM,CAAC;;AAI/D,SAAI,eAAe;AACjB,UAAI,IAAI,UAAU,OAAO,IAAI,SAAS,KAAK;AACzC,mBAAY,IAAI;AAChB,iBAAU,UAAU;AAEpB,sBAAe,aAAa,MAAM,IAAI,CAAC,GAAG;AAC1C,eAAQ,SAAS;aACZ;AACL,iBAAU,QAAQ;AAClB,gBAAS,6BAA6B,IAAI,SAAS;AACnD,8BAAO,IAAI,MAAM,6BAA6B,IAAI,SAAS,CAAC;;;AAIhE,SAAI,gBAAgB;AAClB,gBAAU,QAAQ;AAClB,eAAS,8BAA8B;AACvC,6BAAO,IAAI,MAAM,8BAA8B,CAAC;;AAGlD,SAAI,KAAK,aAAa,KAAK;MAC3B;YACK,KAAc;AACrB,cAAU,QAAQ;AAClB,aAAS,eAAe,QAAQ,IAAI,UAAU,gBAAgB;AAC9D,WAAO,QAAQ,OAAO,IAAI;;KAG9B,CAAC,kBAAkB,CACpB;EASgB;EAAU;EAAQ;EAAO;EAAa,QAAA,GAAA,MAAA,mBAPvB;AAC9B,eAAY,EAAE;AACd,aAAU,OAAO;AACjB,YAAS,KAAK;AACd,kBAAe,KAAK;KACnB,EAAE,CAAC;EAEwD"}
1
+ {"version":3,"file":"useS3Upload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3Upload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport type S3UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\r\n\r\nexport type UploadBlobInput =\r\n | Blob\r\n | {\r\n uri: string;\r\n name?: string;\r\n type?: string;\r\n size?: number;\r\n };\r\n\r\nexport type ResolvedUploadBlob = {\r\n blob: Blob;\r\n name: string;\r\n type: string;\r\n size: number;\r\n};\r\n\r\nasync function getPresignedUrl(\r\n filename: string,\r\n filetype: string,\r\n serverUrl: string\r\n): Promise<string> {\r\n const res = await fetch(`${serverUrl}/upload/s3-presigned-url`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ filename, filetype }),\r\n });\r\n if (!res.ok) throw new Error(\"Failed to get presigned URL\");\r\n const data = (await res.json()) as { url: string };\r\n return data.url;\r\n}\r\n\r\nfunction isBlobInput(file: UploadBlobInput): file is Blob {\r\n return typeof Blob !== \"undefined\" && file instanceof Blob;\r\n}\r\n\r\nfunction getInputName(file: UploadBlobInput) {\r\n if (!isBlobInput(file)) {\r\n return file.name ?? `upload-${Date.now()}`;\r\n }\r\n\r\n return \"name\" in file && typeof file.name === \"string\" ? file.name : `upload-${Date.now()}`;\r\n}\r\n\r\nfunction getInputType(file: UploadBlobInput, blob: Blob) {\r\n if (!isBlobInput(file)) {\r\n return file.type ?? blob.type ?? \"application/octet-stream\";\r\n }\r\n\r\n return file.type || \"application/octet-stream\";\r\n}\r\n\r\nexport async function resolveUploadBlob(file: UploadBlobInput): Promise<ResolvedUploadBlob> {\r\n const blob = isBlobInput(file) ? file : await fetch(file.uri).then((response) => response.blob());\r\n return {\r\n blob,\r\n name: getInputName(file),\r\n type: getInputType(file, blob),\r\n size: \"size\" in file && typeof file.size === \"number\" ? file.size : blob.size,\r\n };\r\n}\r\n\r\nfunction createUploadId() {\r\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2, 11);\r\n}\r\n\r\nexport function useS3Upload(serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n const [progress, setProgress] = useState<number>(0);\r\n const [status, setStatus] = useState<S3UploadStatus>(\"idle\");\r\n const [error, setError] = useState<string | null>(null);\r\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(null);\r\n\r\n const upload = useCallback(\r\n async (file: UploadBlobInput, prefix?: string) => {\r\n setProgress(0);\r\n setStatus(\"uploading\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n try {\r\n const resolvedFile = await resolveUploadBlob(file);\r\n const originalFilename = resolvedFile.name;\r\n const extension = originalFilename.split(\".\").pop() || \"\";\r\n const uuid = createUploadId();\r\n const filename = prefix\r\n ? `${prefix}/${uuid}${extension ? `.${extension}` : \"\"}`\r\n : `${uuid}${extension ? `.${extension}` : \"\"}`;\r\n const filetype = resolvedFile.type;\r\n const presignedUrl = await getPresignedUrl(filename, filetype, resolvedServerUrl);\r\n\r\n return await new Promise<string>((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"PUT\", presignedUrl);\r\n xhr.setRequestHeader(\"Content-Type\", filetype);\r\n\r\n xhr.upload.onprogress = (event) => {\r\n if (event.lengthComputable) {\r\n setProgress(Math.round((event.loaded * 100) / event.total));\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n setProgress(100);\r\n setStatus(\"success\");\r\n // Remove query params to get the public URL\r\n setUploadedUrl(presignedUrl.split(\"?\")[0]);\r\n resolve(filename);\r\n } else {\r\n setStatus(\"error\");\r\n setError(`Upload failed with status ${xhr.status}`);\r\n reject(new Error(`Upload failed with status ${xhr.status}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n setStatus(\"error\");\r\n setError(\"Network error during upload\");\r\n reject(new Error(\"Network error during upload\"));\r\n };\r\n\r\n xhr.send(resolvedFile.blob);\r\n });\r\n } catch (err: unknown) {\r\n setStatus(\"error\");\r\n setError(err instanceof Error ? err.message : \"Unknown error\");\r\n return Promise.reject(err);\r\n }\r\n },\r\n [resolvedServerUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setProgress(0);\r\n setStatus(\"idle\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n }, []);\r\n\r\n return { upload, progress, status, error, uploadedUrl, reset };\r\n}\r\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppConfig = require("../../app/hooks/useAppConfig.js");
3
4
  const require_src_modules_file_hooks_useS3Upload = require("./useS3Upload.js");
4
5
  let react = require("react");
@@ -1 +1 @@
1
- {"version":3,"file":"useUpload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useUpload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\nimport { resolveUploadBlob, type UploadBlobInput } from \"./useS3Upload\";\r\n\r\nexport type UploadStatus = \"pending\" | \"uploading\" | \"completed\" | \"error\";\r\n\r\nexport interface UploadFileTask {\r\n id: string;\r\n file: UploadBlobInput;\r\n progress: number;\r\n status: UploadStatus;\r\n errorMessage?: string;\r\n bytesUploaded: number;\r\n totalBytes: number;\r\n}\r\n\r\ninterface UploadCallbacks {\r\n onProgress: (progress: number, bytesUploaded: number) => void;\r\n onComplete: () => void;\r\n onError: (error: string) => void;\r\n}\r\n\r\n// Shared utility function to create upload promise\r\nconst createUploadPromise = <T>(\r\n type: string,\r\n file: UploadBlobInput,\r\n callbacks: UploadCallbacks,\r\n serverUrl: string\r\n): Promise<T> => {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n\r\n xhr.upload.onprogress = (event: ProgressEvent<EventTarget>) => {\r\n if (event.lengthComputable) {\r\n const progress = Math.round((event.loaded * 100) / event.total);\r\n callbacks.onProgress(progress, event.loaded);\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status === 200) {\r\n callbacks.onComplete();\r\n // if response has json header, parse it\r\n if (xhr.getResponseHeader(\"Content-Type\")?.includes(\"application/json\")) {\r\n resolve(JSON.parse(xhr.response) as T);\r\n } else {\r\n resolve(xhr.response as T);\r\n }\r\n } else {\r\n const errorMessage = `Upload failed with status ${xhr.status}`;\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n const errorMessage = \"Network error during upload\";\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n };\r\n\r\n xhr.open(\"POST\", `${serverUrl}/upload/file/${type}`);\r\n const formData = new FormData();\r\n resolveUploadBlob(file)\r\n .then(({ blob, name }) => {\r\n formData.append(\"file\", blob, name);\r\n xhr.send(formData);\r\n })\r\n .catch(reject);\r\n });\r\n};\r\n\r\n// Shared utility to create a task\r\nconst createUploadTask = (file: UploadBlobInput): UploadFileTask => ({\r\n id:\r\n typeof crypto !== \"undefined\" && crypto.randomUUID\r\n ? crypto.randomUUID()\r\n : Math.random().toString(36).substr(2, 9),\r\n file,\r\n progress: 0,\r\n status: \"pending\",\r\n bytesUploaded: 0,\r\n totalBytes: \"size\" in file && typeof file.size === \"number\" ? file.size : 0,\r\n});\r\n\r\n// Hook for single file upload\r\nexport function useFileUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadTask, setUploadTask] = useState<UploadFileTask | null>(null);\r\n\r\n const upload = useCallback(\r\n async <T>(type: string, file: UploadBlobInput): Promise<T> => {\r\n const task = createUploadTask(file);\r\n setUploadTask(task);\r\n\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n }\r\n : null\r\n );\r\n },\r\n onComplete: () => {\r\n setUploadTask((prev) => (prev ? { ...prev, status: \"completed\", progress: 100 } : null));\r\n },\r\n onError: (errorMessage) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n }\r\n : null\r\n );\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, file, callbacks, serverUrl);\r\n },\r\n [serverUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadTask(null);\r\n }, []);\r\n\r\n return {\r\n ...uploadTask,\r\n upload,\r\n reset,\r\n };\r\n}\r\n\r\n// Hook for multiple file uploads\r\nexport function useMultipartUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadQueue, setUploadQueue] = useState<UploadFileTask[]>([]);\r\n const [overallProgress, setOverallProgress] = useState<number>(0);\r\n\r\n const updateTask = useCallback((id: string, changes: Partial<UploadFileTask>) => {\r\n setUploadQueue((prev) => prev.map((task) => (task.id === id ? { ...task, ...changes } : task)));\r\n }, []);\r\n\r\n const updateOverallProgress = useCallback((queue: UploadFileTask[]) => {\r\n if (queue.length === 0) {\r\n setOverallProgress(100);\r\n return;\r\n }\r\n const totalBytes = queue.reduce((sum, task) => sum + task.totalBytes, 0);\r\n const uploadedBytes = queue.reduce((sum, task) => {\r\n if (task.status === \"completed\") {\r\n return sum + task.totalBytes;\r\n }\r\n if (task.status === \"uploading\") {\r\n return sum + (task.progress / 100) * task.totalBytes;\r\n }\r\n return sum;\r\n }, 0);\r\n setOverallProgress(totalBytes > 0 ? Math.floor((uploadedBytes / totalBytes) * 100) : 0);\r\n }, []);\r\n\r\n const uploadSingleFile = useCallback(\r\n async <T>(type: string, task: UploadFileTask): Promise<T> => {\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n updateTask(task.id, {\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n });\r\n setUploadQueue((currentQueue) => {\r\n const updatedQueue = currentQueue.map((q) =>\r\n q.id === task.id ? { ...q, progress, bytesUploaded } : q\r\n );\r\n updateOverallProgress(updatedQueue);\r\n return updatedQueue;\r\n });\r\n },\r\n onComplete: () => {\r\n updateTask(task.id, { status: \"completed\", progress: 100 });\r\n },\r\n onError: (errorMessage) => {\r\n updateTask(task.id, {\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n });\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, task.file, callbacks, serverUrl);\r\n },\r\n [serverUrl, updateTask, updateOverallProgress]\r\n );\r\n\r\n const uploadFiles = useCallback(\r\n async (type: string, files: UploadBlobInput[]) => {\r\n const initialQueue = files.map(createUploadTask);\r\n setUploadQueue(initialQueue);\r\n updateOverallProgress(initialQueue);\r\n\r\n for (const task of initialQueue) {\r\n try {\r\n await uploadSingleFile(type, task);\r\n } catch (_error) {}\r\n }\r\n },\r\n [uploadSingleFile, updateOverallProgress]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadQueue([]);\r\n setOverallProgress(0);\r\n }, []);\r\n\r\n return {\r\n uploadQueue,\r\n overallProgress,\r\n uploadFiles,\r\n reset,\r\n getTotalBytes: () => uploadQueue.reduce((sum, task) => sum + task.totalBytes, 0),\r\n getTotalBytesUploaded: () => uploadQueue.reduce((sum, task) => sum + task.bytesUploaded, 0),\r\n };\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"useUpload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useUpload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\nimport { resolveUploadBlob, type UploadBlobInput } from \"./useS3Upload\";\r\n\r\nexport type UploadStatus = \"pending\" | \"uploading\" | \"completed\" | \"error\";\r\n\r\nexport interface UploadFileTask {\r\n id: string;\r\n file: UploadBlobInput;\r\n progress: number;\r\n status: UploadStatus;\r\n errorMessage?: string;\r\n bytesUploaded: number;\r\n totalBytes: number;\r\n}\r\n\r\ninterface UploadCallbacks {\r\n onProgress: (progress: number, bytesUploaded: number) => void;\r\n onComplete: () => void;\r\n onError: (error: string) => void;\r\n}\r\n\r\n// Shared utility function to create upload promise\r\nconst createUploadPromise = <T>(\r\n type: string,\r\n file: UploadBlobInput,\r\n callbacks: UploadCallbacks,\r\n serverUrl: string\r\n): Promise<T> => {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n\r\n xhr.upload.onprogress = (event: ProgressEvent<EventTarget>) => {\r\n if (event.lengthComputable) {\r\n const progress = Math.round((event.loaded * 100) / event.total);\r\n callbacks.onProgress(progress, event.loaded);\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status === 200) {\r\n callbacks.onComplete();\r\n // if response has json header, parse it\r\n if (xhr.getResponseHeader(\"Content-Type\")?.includes(\"application/json\")) {\r\n resolve(JSON.parse(xhr.response) as T);\r\n } else {\r\n resolve(xhr.response as T);\r\n }\r\n } else {\r\n const errorMessage = `Upload failed with status ${xhr.status}`;\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n const errorMessage = \"Network error during upload\";\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n };\r\n\r\n xhr.open(\"POST\", `${serverUrl}/upload/file/${type}`);\r\n const formData = new FormData();\r\n resolveUploadBlob(file)\r\n .then(({ blob, name }) => {\r\n formData.append(\"file\", blob, name);\r\n xhr.send(formData);\r\n })\r\n .catch(reject);\r\n });\r\n};\r\n\r\n// Shared utility to create a task\r\nconst createUploadTask = (file: UploadBlobInput): UploadFileTask => ({\r\n id:\r\n typeof crypto !== \"undefined\" && crypto.randomUUID\r\n ? crypto.randomUUID()\r\n : Math.random().toString(36).substr(2, 9),\r\n file,\r\n progress: 0,\r\n status: \"pending\",\r\n bytesUploaded: 0,\r\n totalBytes: \"size\" in file && typeof file.size === \"number\" ? file.size : 0,\r\n});\r\n\r\n// Hook for single file upload\r\nexport function useFileUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadTask, setUploadTask] = useState<UploadFileTask | null>(null);\r\n\r\n const upload = useCallback(\r\n async <T>(type: string, file: UploadBlobInput): Promise<T> => {\r\n const task = createUploadTask(file);\r\n setUploadTask(task);\r\n\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n }\r\n : null\r\n );\r\n },\r\n onComplete: () => {\r\n setUploadTask((prev) => (prev ? { ...prev, status: \"completed\", progress: 100 } : null));\r\n },\r\n onError: (errorMessage) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n }\r\n : null\r\n );\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, file, callbacks, serverUrl);\r\n },\r\n [serverUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadTask(null);\r\n }, []);\r\n\r\n return {\r\n ...uploadTask,\r\n upload,\r\n reset,\r\n };\r\n}\r\n\r\n// Hook for multiple file uploads\r\nexport function useMultipartUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadQueue, setUploadQueue] = useState<UploadFileTask[]>([]);\r\n const [overallProgress, setOverallProgress] = useState<number>(0);\r\n\r\n const updateTask = useCallback((id: string, changes: Partial<UploadFileTask>) => {\r\n setUploadQueue((prev) => prev.map((task) => (task.id === id ? { ...task, ...changes } : task)));\r\n }, []);\r\n\r\n const updateOverallProgress = useCallback((queue: UploadFileTask[]) => {\r\n if (queue.length === 0) {\r\n setOverallProgress(100);\r\n return;\r\n }\r\n const totalBytes = queue.reduce((sum, task) => sum + task.totalBytes, 0);\r\n const uploadedBytes = queue.reduce((sum, task) => {\r\n if (task.status === \"completed\") {\r\n return sum + task.totalBytes;\r\n }\r\n if (task.status === \"uploading\") {\r\n return sum + (task.progress / 100) * task.totalBytes;\r\n }\r\n return sum;\r\n }, 0);\r\n setOverallProgress(totalBytes > 0 ? Math.floor((uploadedBytes / totalBytes) * 100) : 0);\r\n }, []);\r\n\r\n const uploadSingleFile = useCallback(\r\n async <T>(type: string, task: UploadFileTask): Promise<T> => {\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n updateTask(task.id, {\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n });\r\n setUploadQueue((currentQueue) => {\r\n const updatedQueue = currentQueue.map((q) =>\r\n q.id === task.id ? { ...q, progress, bytesUploaded } : q\r\n );\r\n updateOverallProgress(updatedQueue);\r\n return updatedQueue;\r\n });\r\n },\r\n onComplete: () => {\r\n updateTask(task.id, { status: \"completed\", progress: 100 });\r\n },\r\n onError: (errorMessage) => {\r\n updateTask(task.id, {\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n });\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, task.file, callbacks, serverUrl);\r\n },\r\n [serverUrl, updateTask, updateOverallProgress]\r\n );\r\n\r\n const uploadFiles = useCallback(\r\n async (type: string, files: UploadBlobInput[]) => {\r\n const initialQueue = files.map(createUploadTask);\r\n setUploadQueue(initialQueue);\r\n updateOverallProgress(initialQueue);\r\n\r\n for (const task of initialQueue) {\r\n try {\r\n await uploadSingleFile(type, task);\r\n } catch (_error) {}\r\n }\r\n },\r\n [uploadSingleFile, updateOverallProgress]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadQueue([]);\r\n setOverallProgress(0);\r\n }, []);\r\n\r\n return {\r\n uploadQueue,\r\n overallProgress,\r\n uploadFiles,\r\n reset,\r\n getTotalBytes: () => uploadQueue.reduce((sum, task) => sum + task.totalBytes, 0),\r\n getTotalBytesUploaded: () => uploadQueue.reduce((sum, task) => sum + task.bytesUploaded, 0),\r\n };\r\n}\r\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  let react = require("react");
3
4
  let _tanstack_react_query = require("@tanstack/react-query");
4
5
  //#region src/modules/table/hooks/useQueryWithParams.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useQueryWithParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useQueryWithParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { type UseQueryOptions, type UseQueryResult, useQuery } from \"@tanstack/react-query\";\r\nimport type { GroupingState } from \"@tanstack/react-table\";\r\nimport { useEffect, useMemo, useRef } from \"react\";\r\nimport type { QueryParamsState } from \"../queryParams\";\r\n\r\n/**\r\n * Flexible query options type that accepts both standard TanStack Query options\r\n * and tRPC's queryOptions function return type.\r\n * Uses permissive generics to handle type differences between TanStack Query and tRPC.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;\r\n\r\n/**\r\n * Function type that accepts both standard query options functions and tRPC's queryOptions.\r\n * tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;\r\n\r\nconst FETCH_ALL_LIMIT = 99999;\r\n\r\nexport interface QueryWithParamsOptions<TInput, TData> {\r\n getQueryOptions: GetQueryOptionsFn<TInput, TData>;\r\n queryParams?: TInput;\r\n queryState: Pick<QueryParamsState, \"filters\" | \"sort\" | \"order\" | \"page\" | \"limit\" | \"q\">;\r\n grouping?: GroupingState;\r\n additionalFilters?: QueryFilters;\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to integrate query state with React Query\r\n * Combines queryParams with queryState and manages data fetching\r\n */\r\nexport const useQueryWithParams = <TInput, TData>({\r\n getQueryOptions,\r\n queryParams = {} as TInput,\r\n queryState,\r\n grouping = [],\r\n additionalFilters,\r\n enabled = true,\r\n}: QueryWithParamsOptions<TInput, TData>): UseQueryResult<TData> => {\r\n const { filters, sort, order, page, limit, q } = queryState;\r\n const isGrouped = grouping.length > 0;\r\n\r\n const input = useMemo(() => {\r\n let mergedFilters: QueryFilters | undefined;\r\n if (additionalFilters?.length) {\r\n const additionalColumnIds = new Set(additionalFilters.map((f) => f.columnId));\r\n const ownFiltersOnly = (filters ?? []).filter((f) => !additionalColumnIds.has(f.columnId));\r\n mergedFilters = [...additionalFilters, ...ownFiltersOnly];\r\n } else {\r\n mergedFilters = filters;\r\n }\r\n\r\n const qTrimmed = q?.trim();\r\n const qPayload = qTrimmed && qTrimmed.length > 0 ? qTrimmed : undefined;\r\n\r\n return {\r\n ...queryParams,\r\n page: isGrouped ? 1 : page,\r\n limit: isGrouped ? FETCH_ALL_LIMIT : limit,\r\n sort,\r\n order: order ?? undefined,\r\n filters: mergedFilters,\r\n ...(qPayload !== undefined ? { q: qPayload } : {}),\r\n };\r\n }, [queryParams, page, limit, sort, order, filters, isGrouped, additionalFilters, q]);\r\n\r\n const prevIsGroupedRef = useRef(isGrouped);\r\n\r\n const groupingTransitioned = prevIsGroupedRef.current !== isGrouped;\r\n\r\n useEffect(() => {\r\n prevIsGroupedRef.current = isGrouped;\r\n }, [isGrouped]);\r\n\r\n const queryOptions = useMemo(\r\n () => ({\r\n ...getQueryOptions(input),\r\n placeholderData: groupingTransitioned\r\n ? undefined\r\n : (previousData: TData | undefined) => previousData,\r\n enabled,\r\n }),\r\n [getQueryOptions, input, enabled, groupingTransitioned]\r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return useQuery(queryOptions as any) as UseQueryResult<TData>;\r\n};\r\n"],"mappings":";;;;AAqBA,MAAM,kBAAkB;;;;;AAexB,MAAa,sBAAqC,EAChD,iBACA,cAAc,EAAE,EAChB,YACA,WAAW,EAAE,EACb,mBACA,UAAU,WACwD;CAClE,MAAM,EAAE,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM;CACjD,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAM,SAAA,GAAA,MAAA,eAAsB;EAC1B,IAAI;AACJ,MAAI,mBAAmB,QAAQ;GAC7B,MAAM,sBAAsB,IAAI,IAAI,kBAAkB,KAAK,MAAM,EAAE,SAAS,CAAC;GAC7E,MAAM,kBAAkB,WAAW,EAAE,EAAE,QAAQ,MAAM,CAAC,oBAAoB,IAAI,EAAE,SAAS,CAAC;AAC1F,mBAAgB,CAAC,GAAG,mBAAmB,GAAG,eAAe;QAEzD,iBAAgB;EAGlB,MAAM,WAAW,GAAG,MAAM;EAC1B,MAAM,WAAW,YAAY,SAAS,SAAS,IAAI,WAAW,KAAA;AAE9D,SAAO;GACL,GAAG;GACH,MAAM,YAAY,IAAI;GACtB,OAAO,YAAY,kBAAkB;GACrC;GACA,OAAO,SAAS,KAAA;GAChB,SAAS;GACT,GAAI,aAAa,KAAA,IAAY,EAAE,GAAG,UAAU,GAAG,EAAE;GAClD;IACA;EAAC;EAAa;EAAM;EAAO;EAAM;EAAO;EAAS;EAAW;EAAmB;EAAE,CAAC;CAErF,MAAM,oBAAA,GAAA,MAAA,QAA0B,UAAU;CAE1C,MAAM,uBAAuB,iBAAiB,YAAY;AAE1D,EAAA,GAAA,MAAA,iBAAgB;AACd,mBAAiB,UAAU;IAC1B,CAAC,UAAU,CAAC;AAcf,SAAA,GAAA,sBAAA,WAAA,GAAA,MAAA,gBAXS;EACL,GAAG,gBAAgB,MAAM;EACzB,iBAAiB,uBACb,KAAA,KACC,iBAAoC;EACzC;EACD,GACD;EAAC;EAAiB;EAAO;EAAS;EAAqB,CACxD,CAGmC"}
1
+ {"version":3,"file":"useQueryWithParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useQueryWithParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { type UseQueryOptions, type UseQueryResult, useQuery } from \"@tanstack/react-query\";\r\nimport type { GroupingState } from \"@tanstack/react-table\";\r\nimport { useEffect, useMemo, useRef } from \"react\";\r\nimport type { QueryParamsState } from \"../queryParams\";\r\n\r\n/**\r\n * Flexible query options type that accepts both standard TanStack Query options\r\n * and tRPC's queryOptions function return type.\r\n * Uses permissive generics to handle type differences between TanStack Query and tRPC.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;\r\n\r\n/**\r\n * Function type that accepts both standard query options functions and tRPC's queryOptions.\r\n * tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;\r\n\r\nconst FETCH_ALL_LIMIT = 99999;\r\n\r\nexport interface QueryWithParamsOptions<TInput, TData> {\r\n getQueryOptions: GetQueryOptionsFn<TInput, TData>;\r\n queryParams?: TInput;\r\n queryState: Pick<QueryParamsState, \"filters\" | \"sort\" | \"order\" | \"page\" | \"limit\" | \"q\">;\r\n grouping?: GroupingState;\r\n additionalFilters?: QueryFilters;\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to integrate query state with React Query\r\n * Combines queryParams with queryState and manages data fetching\r\n */\r\nexport const useQueryWithParams = <TInput, TData>({\r\n getQueryOptions,\r\n queryParams = {} as TInput,\r\n queryState,\r\n grouping = [],\r\n additionalFilters,\r\n enabled = true,\r\n}: QueryWithParamsOptions<TInput, TData>): UseQueryResult<TData> => {\r\n const { filters, sort, order, page, limit, q } = queryState;\r\n const isGrouped = grouping.length > 0;\r\n\r\n const input = useMemo(() => {\r\n let mergedFilters: QueryFilters | undefined;\r\n if (additionalFilters?.length) {\r\n const additionalColumnIds = new Set(additionalFilters.map((f) => f.columnId));\r\n const ownFiltersOnly = (filters ?? []).filter((f) => !additionalColumnIds.has(f.columnId));\r\n mergedFilters = [...additionalFilters, ...ownFiltersOnly];\r\n } else {\r\n mergedFilters = filters;\r\n }\r\n\r\n const qTrimmed = q?.trim();\r\n const qPayload = qTrimmed && qTrimmed.length > 0 ? qTrimmed : undefined;\r\n\r\n return {\r\n ...queryParams,\r\n page: isGrouped ? 1 : page,\r\n limit: isGrouped ? FETCH_ALL_LIMIT : limit,\r\n sort,\r\n order: order ?? undefined,\r\n filters: mergedFilters,\r\n ...(qPayload !== undefined ? { q: qPayload } : {}),\r\n };\r\n }, [queryParams, page, limit, sort, order, filters, isGrouped, additionalFilters, q]);\r\n\r\n const prevIsGroupedRef = useRef(isGrouped);\r\n\r\n const groupingTransitioned = prevIsGroupedRef.current !== isGrouped;\r\n\r\n useEffect(() => {\r\n prevIsGroupedRef.current = isGrouped;\r\n }, [isGrouped]);\r\n\r\n const queryOptions = useMemo(\r\n () => ({\r\n ...getQueryOptions(input),\r\n placeholderData: groupingTransitioned\r\n ? undefined\r\n : (previousData: TData | undefined) => previousData,\r\n enabled,\r\n }),\r\n [getQueryOptions, input, enabled, groupingTransitioned]\r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return useQuery(queryOptions as any) as UseQueryResult<TData>;\r\n};\r\n"],"mappings":";;;;;AAqBA,MAAM,kBAAkB;;;;;AAexB,MAAa,sBAAqC,EAChD,iBACA,cAAc,EAAE,EAChB,YACA,WAAW,EAAE,EACb,mBACA,UAAU,WACwD;CAClE,MAAM,EAAE,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM;CACjD,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAM,SAAA,GAAA,MAAA,eAAsB;EAC1B,IAAI;AACJ,MAAI,mBAAmB,QAAQ;GAC7B,MAAM,sBAAsB,IAAI,IAAI,kBAAkB,KAAK,MAAM,EAAE,SAAS,CAAC;GAC7E,MAAM,kBAAkB,WAAW,EAAE,EAAE,QAAQ,MAAM,CAAC,oBAAoB,IAAI,EAAE,SAAS,CAAC;AAC1F,mBAAgB,CAAC,GAAG,mBAAmB,GAAG,eAAe;QAEzD,iBAAgB;EAGlB,MAAM,WAAW,GAAG,MAAM;EAC1B,MAAM,WAAW,YAAY,SAAS,SAAS,IAAI,WAAW,KAAA;AAE9D,SAAO;GACL,GAAG;GACH,MAAM,YAAY,IAAI;GACtB,OAAO,YAAY,kBAAkB;GACrC;GACA,OAAO,SAAS,KAAA;GAChB,SAAS;GACT,GAAI,aAAa,KAAA,IAAY,EAAE,GAAG,UAAU,GAAG,EAAE;GAClD;IACA;EAAC;EAAa;EAAM;EAAO;EAAM;EAAO;EAAS;EAAW;EAAmB;EAAE,CAAC;CAErF,MAAM,oBAAA,GAAA,MAAA,QAA0B,UAAU;CAE1C,MAAM,uBAAuB,iBAAiB,YAAY;AAE1D,EAAA,GAAA,MAAA,iBAAgB;AACd,mBAAiB,UAAU;IAC1B,CAAC,UAAU,CAAC;AAcf,SAAA,GAAA,sBAAA,WAAA,GAAA,MAAA,gBAXS;EACL,GAAG,gBAAgB,MAAM;EACzB,iBAAiB,uBACb,KAAA,KACC,iBAAoC;EACzC;EACD,GACD;EAAC;EAAiB;EAAO;EAAS;EAAqB,CACxD,CAGmC"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  let react = require("react");
3
4
  //#region src/modules/table/hooks/useTableQueryParams.ts
4
5
  const useTableQueryParams = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useTableQueryParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useTableQueryParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport type { Granularity, Order, QueryParamsState } from \"../queryParams\";\r\n\r\nexport const useTableQueryParams = (): QueryParamsState => {\r\n const [sort, setSort] = useState(\"\");\r\n const [order, setOrder] = useState<Order | null>(null);\r\n const [page, setPage] = useState(1);\r\n const [limit, setLimit] = useState(10);\r\n const [qRaw, setQRaw] = useState<string | null>(null);\r\n const [filters, setFiltersRaw] = useState<QueryFilters>([]);\r\n const [granularity, setGranularity] = useState<Granularity>(\"daily\");\r\n const [grouping, setGroupingRaw] = useState<GroupingState>([]);\r\n\r\n const setFilters = useCallback((next: QueryFilters) => {\r\n setFiltersRaw(next);\r\n }, []);\r\n\r\n const setQ = useCallback((value: string | null) => {\r\n setQRaw(value === \"\" || value == null ? null : value);\r\n }, []);\r\n\r\n const setGrouping = useCallback((updater: Updater<GroupingState>) => {\r\n setGroupingRaw((current) => (typeof updater === \"function\" ? updater(current) : updater));\r\n }, []);\r\n\r\n const sorting = useMemo(() => {\r\n if (!sort) {\r\n return [];\r\n }\r\n const effectiveOrder = order ?? \"asc\";\r\n return [{ id: sort, desc: effectiveOrder === \"desc\" }];\r\n }, [sort, order]);\r\n\r\n const pagination = useMemo(() => ({ pageIndex: page - 1, pageSize: limit }), [page, limit]);\r\n\r\n const setSorting = useCallback(\r\n (updater: Updater<SortingState>) => {\r\n const currentSorting: SortingState = sort\r\n ? [{ id: sort, desc: (order ?? \"asc\") === \"desc\" }]\r\n : [];\r\n\r\n const next = typeof updater === \"function\" ? updater(currentSorting) : updater;\r\n const first = next[0];\r\n\r\n if (!first || !first.id) {\r\n setSort(\"\");\r\n setOrder(null);\r\n return;\r\n }\r\n\r\n setSort(first.id);\r\n setOrder(first.desc ? \"desc\" : \"asc\");\r\n },\r\n [sort, order]\r\n );\r\n\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n setPage((currentPage) => {\r\n const currentState = { pageIndex: currentPage - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setLimit(next.pageSize ?? 10);\r\n return (next.pageIndex ?? 0) + 1;\r\n });\r\n },\r\n [limit]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n q: qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n }),\r\n [\r\n qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n ]\r\n );\r\n};\r\n"],"mappings":";;;AAKA,MAAa,4BAA8C;CACzD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,GAAG;CACpC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAmC,KAAK;CACtD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,EAAE;CACnC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAqB,GAAG;CACtC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAmC,KAAK;CACrD,MAAM,CAAC,SAAS,kBAAA,GAAA,MAAA,UAAwC,EAAE,CAAC;CAC3D,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAwC,QAAQ;CACpE,MAAM,CAAC,UAAU,mBAAA,GAAA,MAAA,UAA0C,EAAE,CAAC;CAE9D,MAAM,cAAA,GAAA,MAAA,cAA0B,SAAuB;AACrD,gBAAc,KAAK;IAClB,EAAE,CAAC;CAEN,MAAM,QAAA,GAAA,MAAA,cAAoB,UAAyB;AACjD,UAAQ,UAAU,MAAM,SAAS,OAAO,OAAO,MAAM;IACpD,EAAE,CAAC;CAEN,MAAM,eAAA,GAAA,MAAA,cAA2B,YAAoC;AACnE,kBAAgB,YAAa,OAAO,YAAY,aAAa,QAAQ,QAAQ,GAAG,QAAS;IACxF,EAAE,CAAC;CAEN,MAAM,WAAA,GAAA,MAAA,eAAwB;AAC5B,MAAI,CAAC,KACH,QAAO,EAAE;AAGX,SAAO,CAAC;GAAE,IAAI;GAAM,OADG,SAAS,WACa;GAAQ,CAAC;IACrD,CAAC,MAAM,MAAM,CAAC;CAEjB,MAAM,cAAA,GAAA,MAAA,gBAA4B;EAAE,WAAW,OAAO;EAAG,UAAU;EAAO,GAAG,CAAC,MAAM,MAAM,CAAC;CAE3F,MAAM,cAAA,GAAA,MAAA,cACH,YAAmC;EAMlC,MAAM,SADO,OAAO,YAAY,aAAa,QAJR,OACjC,CAAC;GAAE,IAAI;GAAM,OAAO,SAAS,WAAW;GAAQ,CAAC,GACjD,EAAE,CAE8D,GAAG,SACpD;AAEnB,MAAI,CAAC,SAAS,CAAC,MAAM,IAAI;AACvB,WAAQ,GAAG;AACX,YAAS,KAAK;AACd;;AAGF,UAAQ,MAAM,GAAG;AACjB,WAAS,MAAM,OAAO,SAAS,MAAM;IAEvC,CAAC,MAAM,MAAM,CACd;CAED,MAAM,iBAAA,GAAA,MAAA,cACH,YAAsC;AACrC,WAAS,gBAAgB;GACvB,MAAM,eAAe;IAAE,WAAW,cAAc;IAAG,UAAU;IAAO;GACpE,MAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,aAAa,GAAG;AACrE,YAAS,KAAK,YAAY,GAAG;AAC7B,WAAQ,KAAK,aAAa,KAAK;IAC/B;IAEJ,CAAC,MAAM,CACR;AAED,SAAA,GAAA,MAAA,gBACS;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
1
+ {"version":3,"file":"useTableQueryParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useTableQueryParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport type { Granularity, Order, QueryParamsState } from \"../queryParams\";\r\n\r\nexport const useTableQueryParams = (): QueryParamsState => {\r\n const [sort, setSort] = useState(\"\");\r\n const [order, setOrder] = useState<Order | null>(null);\r\n const [page, setPage] = useState(1);\r\n const [limit, setLimit] = useState(10);\r\n const [qRaw, setQRaw] = useState<string | null>(null);\r\n const [filters, setFiltersRaw] = useState<QueryFilters>([]);\r\n const [granularity, setGranularity] = useState<Granularity>(\"daily\");\r\n const [grouping, setGroupingRaw] = useState<GroupingState>([]);\r\n\r\n const setFilters = useCallback((next: QueryFilters) => {\r\n setFiltersRaw(next);\r\n }, []);\r\n\r\n const setQ = useCallback((value: string | null) => {\r\n setQRaw(value === \"\" || value == null ? null : value);\r\n }, []);\r\n\r\n const setGrouping = useCallback((updater: Updater<GroupingState>) => {\r\n setGroupingRaw((current) => (typeof updater === \"function\" ? updater(current) : updater));\r\n }, []);\r\n\r\n const sorting = useMemo(() => {\r\n if (!sort) {\r\n return [];\r\n }\r\n const effectiveOrder = order ?? \"asc\";\r\n return [{ id: sort, desc: effectiveOrder === \"desc\" }];\r\n }, [sort, order]);\r\n\r\n const pagination = useMemo(() => ({ pageIndex: page - 1, pageSize: limit }), [page, limit]);\r\n\r\n const setSorting = useCallback(\r\n (updater: Updater<SortingState>) => {\r\n const currentSorting: SortingState = sort\r\n ? [{ id: sort, desc: (order ?? \"asc\") === \"desc\" }]\r\n : [];\r\n\r\n const next = typeof updater === \"function\" ? updater(currentSorting) : updater;\r\n const first = next[0];\r\n\r\n if (!first || !first.id) {\r\n setSort(\"\");\r\n setOrder(null);\r\n return;\r\n }\r\n\r\n setSort(first.id);\r\n setOrder(first.desc ? \"desc\" : \"asc\");\r\n },\r\n [sort, order]\r\n );\r\n\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n setPage((currentPage) => {\r\n const currentState = { pageIndex: currentPage - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setLimit(next.pageSize ?? 10);\r\n return (next.pageIndex ?? 0) + 1;\r\n });\r\n },\r\n [limit]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n q: qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n }),\r\n [\r\n qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n ]\r\n );\r\n};\r\n"],"mappings":";;;;AAKA,MAAa,4BAA8C;CACzD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,GAAG;CACpC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAmC,KAAK;CACtD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,EAAE;CACnC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAqB,GAAG;CACtC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAmC,KAAK;CACrD,MAAM,CAAC,SAAS,kBAAA,GAAA,MAAA,UAAwC,EAAE,CAAC;CAC3D,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAwC,QAAQ;CACpE,MAAM,CAAC,UAAU,mBAAA,GAAA,MAAA,UAA0C,EAAE,CAAC;CAE9D,MAAM,cAAA,GAAA,MAAA,cAA0B,SAAuB;AACrD,gBAAc,KAAK;IAClB,EAAE,CAAC;CAEN,MAAM,QAAA,GAAA,MAAA,cAAoB,UAAyB;AACjD,UAAQ,UAAU,MAAM,SAAS,OAAO,OAAO,MAAM;IACpD,EAAE,CAAC;CAEN,MAAM,eAAA,GAAA,MAAA,cAA2B,YAAoC;AACnE,kBAAgB,YAAa,OAAO,YAAY,aAAa,QAAQ,QAAQ,GAAG,QAAS;IACxF,EAAE,CAAC;CAEN,MAAM,WAAA,GAAA,MAAA,eAAwB;AAC5B,MAAI,CAAC,KACH,QAAO,EAAE;AAGX,SAAO,CAAC;GAAE,IAAI;GAAM,OADG,SAAS,WACa;GAAQ,CAAC;IACrD,CAAC,MAAM,MAAM,CAAC;CAEjB,MAAM,cAAA,GAAA,MAAA,gBAA4B;EAAE,WAAW,OAAO;EAAG,UAAU;EAAO,GAAG,CAAC,MAAM,MAAM,CAAC;CAE3F,MAAM,cAAA,GAAA,MAAA,cACH,YAAmC;EAMlC,MAAM,SADO,OAAO,YAAY,aAAa,QAJR,OACjC,CAAC;GAAE,IAAI;GAAM,OAAO,SAAS,WAAW;GAAQ,CAAC,GACjD,EAAE,CAE8D,GAAG,SACpD;AAEnB,MAAI,CAAC,SAAS,CAAC,MAAM,IAAI;AACvB,WAAQ,GAAG;AACX,YAAS,KAAK;AACd;;AAGF,UAAQ,MAAM,GAAG;AACjB,WAAS,MAAM,OAAO,SAAS,MAAM;IAEvC,CAAC,MAAM,MAAM,CACd;CAED,MAAM,iBAAA,GAAA,MAAA,cACH,YAAsC;AACrC,WAAS,gBAAgB;GACvB,MAAM,eAAe;IAAE,WAAW,cAAc;IAAG,UAAU;IAAO;GACpE,MAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,aAAa,GAAG;AACrE,YAAS,KAAK,YAAY,GAAG;AAC7B,WAAQ,KAAK,aAAa,KAAK;IAC/B;IAEJ,CAAC,MAAM,CACR;AAED,SAAA,GAAA,MAAA,gBACS;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../_virtual/_rolldown/runtime.js");
2
3
  let _m5kdev_commons_modules_schemas_query_schema = require("@m5kdev/commons/modules/schemas/query.schema");
3
4
  let zod = require("zod");
4
5
  //#region src/modules/table/queryParams.ts
@@ -1 +1 @@
1
- {"version":3,"file":"queryParams.js","names":["z","filterSchema","filtersSchema"],"sources":["../../../../src/modules/table/queryParams.ts"],"sourcesContent":["import type { QueryFilter, QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { filterSchema, filtersSchema } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport { z } from \"zod\";\r\n\r\n/** Each row: [columnId, type, method, value, valueTo?, endColumnId?] - validated after parse */\r\nconst filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));\r\n\r\n/** Escape `\\`, `|`, `;` so we can split filters without JSON quotes/brackets. */\r\nfunction escapeFilterField(raw: string): string {\r\n return raw.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\|/g, \"\\\\|\").replace(/;/g, \"\\\\;\");\r\n}\r\n\r\nfunction unescapeFilterField(encoded: string): string {\r\n let out = \"\";\r\n for (let i = 0; i < encoded.length; i++) {\r\n const c = encoded[i];\r\n if (c === \"\\\\\" && i + 1 < encoded.length) {\r\n const next = encoded[i + 1];\r\n if (next === \"\\\\\" || next === \"|\" || next === \";\") {\r\n out += next;\r\n i++;\r\n continue;\r\n }\r\n }\r\n out += c;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Split on `delimiter` only when not escaped as `\\` + delimiter.\r\n */\r\nfunction splitByEscapedDelimiter(s: string, delimiter: string): string[] {\r\n if (delimiter.length !== 1) {\r\n throw new Error(\"splitByEscapedDelimiter expects a single-character delimiter\");\r\n }\r\n const parts: string[] = [];\r\n let buf = \"\";\r\n for (let i = 0; i < s.length; i++) {\r\n const c = s[i];\r\n if (c === \"\\\\\" && i + 1 < s.length) {\r\n buf += c + s[i + 1];\r\n i++;\r\n continue;\r\n }\r\n if (c === delimiter) {\r\n parts.push(unescapeFilterField(buf));\r\n buf = \"\";\r\n continue;\r\n }\r\n buf += c;\r\n }\r\n parts.push(unescapeFilterField(buf));\r\n return parts;\r\n}\r\n\r\nexport function serializeFiltersParam(rows: string[][]): string {\r\n if (rows.length === 0) {\r\n return \"\";\r\n }\r\n return rows.map((row) => row.map(escapeFilterField).join(\"|\")).join(\";\");\r\n}\r\n\r\nexport function parseFiltersParam(value: string): string[][] | null {\r\n const trimmed = value.trim();\r\n if (trimmed === \"\") {\r\n return [];\r\n }\r\n const rowStrings = splitByEscapedDelimiter(trimmed, \";\");\r\n const rows: string[][] = [];\r\n for (const row of rowStrings) {\r\n if (row === \"\") {\r\n continue;\r\n }\r\n const fields = splitByEscapedDelimiter(row, \"|\");\r\n if (fields.length >= 4 && fields.length <= 6) {\r\n rows.push(fields);\r\n }\r\n }\r\n const parsed = filtersRawSchema.safeParse(rows);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nconst NULLISH_METHODS: ReadonlySet<QueryFilter[\"method\"]> = new Set([\r\n \"isEmpty\",\r\n \"isNotEmpty\",\r\n \"is_null\",\r\n \"is_not_null\",\r\n]);\r\n\r\nfunction encodeFilterValue(filter: QueryFilter): string {\r\n if (NULLISH_METHODS.has(filter.method)) {\r\n return typeof filter.value === \"string\" ? filter.value : \"\";\r\n }\r\n const { type, method, value } = filter;\r\n switch (type) {\r\n case \"number\":\r\n return String(value as number);\r\n case \"boolean\":\r\n return (value as boolean) ? \"true\" : \"false\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\" && Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n default:\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction decodeFilterValue(\r\n type: QueryFilter[\"type\"],\r\n method: QueryFilter[\"method\"],\r\n valueStr: string\r\n): QueryFilter[\"value\"] {\r\n if (NULLISH_METHODS.has(method)) {\r\n return valueStr;\r\n }\r\n switch (type) {\r\n case \"number\": {\r\n const n = Number.parseFloat(valueStr);\r\n return Number.isNaN(n) ? 0 : n;\r\n }\r\n case \"boolean\":\r\n return valueStr === \"true\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\") {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n return Array.isArray(parsed) ? parsed.map(String) : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n if (valueStr.startsWith(\"[\")) {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n if (Array.isArray(parsed)) {\r\n return parsed.map(String);\r\n }\r\n } catch {\r\n /* use raw string */\r\n }\r\n }\r\n return valueStr;\r\n default:\r\n return valueStr;\r\n }\r\n}\r\n\r\n/** Builds URL tuple; omits optional tails when unused (endColumnId requires valueTo slot - may be \"\"). */\r\nexport function encodeFilterToTuple(filter: QueryFilter): string[] {\r\n const tuple: string[] = [filter.columnId, filter.type, filter.method, encodeFilterValue(filter)];\r\n const hasValueTo = filter.valueTo != null && filter.valueTo !== \"\";\r\n const hasEndColumnId = filter.endColumnId != null && filter.endColumnId !== \"\";\r\n\r\n if (hasValueTo && filter.valueTo != null) {\r\n tuple.push(filter.valueTo);\r\n }\r\n\r\n if (hasEndColumnId && filter.endColumnId != null) {\r\n if (!hasValueTo) {\r\n tuple.push(\"\");\r\n }\r\n tuple.push(filter.endColumnId);\r\n }\r\n\r\n return tuple;\r\n}\r\n\r\nexport function decodeTupleToFilter(parts: readonly string[]): QueryFilter | null {\r\n if (parts.length < 4 || parts.length > 6) {\r\n return null;\r\n }\r\n\r\n const [columnId, typeStr, methodStr, valueStr, valueToStr, endColumnIdStr] = parts;\r\n\r\n const typeParsed = filterSchema.shape.type.safeParse(typeStr);\r\n const methodParsed = filterSchema.shape.method.safeParse(methodStr);\r\n if (!typeParsed.success || !methodParsed.success) {\r\n return null;\r\n }\r\n\r\n const type = typeParsed.data;\r\n const method = methodParsed.data;\r\n const value = decodeFilterValue(type, method, valueStr);\r\n\r\n const candidate: QueryFilter = {\r\n columnId,\r\n type,\r\n method,\r\n value,\r\n };\r\n\r\n if (valueToStr !== undefined) {\r\n candidate.valueTo = valueToStr;\r\n }\r\n if (endColumnIdStr !== undefined) {\r\n candidate.endColumnId = endColumnIdStr;\r\n }\r\n\r\n const parsed = filterSchema.safeParse(candidate);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nexport function decodeFilterTuples(rows: readonly string[][]): QueryFilters {\r\n const decoded = rows\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((filter): filter is QueryFilter => filter != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n}\r\n\r\nexport type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface QueryParamsState {\r\n /** Global search string; absent when not set. */\r\n q: string | null;\r\n setQ: (value: string | null) => void;\r\n filters?: QueryFilters;\r\n setFilters?: (filters: QueryFilters) => void;\r\n granularity?: Granularity;\r\n setGranularity?: (value: Granularity) => void;\r\n sort?: string;\r\n order?: Order | null;\r\n setSorting?: (updater: Updater<SortingState>) => void;\r\n sorting?: SortingState;\r\n page?: number;\r\n limit?: number;\r\n setPagination?: (updater: Updater<PaginationState>) => void;\r\n pagination?: PaginationState;\r\n grouping: GroupingState;\r\n setGrouping: (updater: Updater<GroupingState>) => void;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"queryParams.js","names":["z","filterSchema","filtersSchema"],"sources":["../../../../src/modules/table/queryParams.ts"],"sourcesContent":["import type { QueryFilter, QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { filterSchema, filtersSchema } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport { z } from \"zod\";\r\n\r\n/** Each row: [columnId, type, method, value, valueTo?, endColumnId?] - validated after parse */\r\nconst filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));\r\n\r\n/** Escape `\\`, `|`, `;` so we can split filters without JSON quotes/brackets. */\r\nfunction escapeFilterField(raw: string): string {\r\n return raw.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\|/g, \"\\\\|\").replace(/;/g, \"\\\\;\");\r\n}\r\n\r\nfunction unescapeFilterField(encoded: string): string {\r\n let out = \"\";\r\n for (let i = 0; i < encoded.length; i++) {\r\n const c = encoded[i];\r\n if (c === \"\\\\\" && i + 1 < encoded.length) {\r\n const next = encoded[i + 1];\r\n if (next === \"\\\\\" || next === \"|\" || next === \";\") {\r\n out += next;\r\n i++;\r\n continue;\r\n }\r\n }\r\n out += c;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Split on `delimiter` only when not escaped as `\\` + delimiter.\r\n */\r\nfunction splitByEscapedDelimiter(s: string, delimiter: string): string[] {\r\n if (delimiter.length !== 1) {\r\n throw new Error(\"splitByEscapedDelimiter expects a single-character delimiter\");\r\n }\r\n const parts: string[] = [];\r\n let buf = \"\";\r\n for (let i = 0; i < s.length; i++) {\r\n const c = s[i];\r\n if (c === \"\\\\\" && i + 1 < s.length) {\r\n buf += c + s[i + 1];\r\n i++;\r\n continue;\r\n }\r\n if (c === delimiter) {\r\n parts.push(unescapeFilterField(buf));\r\n buf = \"\";\r\n continue;\r\n }\r\n buf += c;\r\n }\r\n parts.push(unescapeFilterField(buf));\r\n return parts;\r\n}\r\n\r\nexport function serializeFiltersParam(rows: string[][]): string {\r\n if (rows.length === 0) {\r\n return \"\";\r\n }\r\n return rows.map((row) => row.map(escapeFilterField).join(\"|\")).join(\";\");\r\n}\r\n\r\nexport function parseFiltersParam(value: string): string[][] | null {\r\n const trimmed = value.trim();\r\n if (trimmed === \"\") {\r\n return [];\r\n }\r\n const rowStrings = splitByEscapedDelimiter(trimmed, \";\");\r\n const rows: string[][] = [];\r\n for (const row of rowStrings) {\r\n if (row === \"\") {\r\n continue;\r\n }\r\n const fields = splitByEscapedDelimiter(row, \"|\");\r\n if (fields.length >= 4 && fields.length <= 6) {\r\n rows.push(fields);\r\n }\r\n }\r\n const parsed = filtersRawSchema.safeParse(rows);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nconst NULLISH_METHODS: ReadonlySet<QueryFilter[\"method\"]> = new Set([\r\n \"isEmpty\",\r\n \"isNotEmpty\",\r\n \"is_null\",\r\n \"is_not_null\",\r\n]);\r\n\r\nfunction encodeFilterValue(filter: QueryFilter): string {\r\n if (NULLISH_METHODS.has(filter.method)) {\r\n return typeof filter.value === \"string\" ? filter.value : \"\";\r\n }\r\n const { type, method, value } = filter;\r\n switch (type) {\r\n case \"number\":\r\n return String(value as number);\r\n case \"boolean\":\r\n return (value as boolean) ? \"true\" : \"false\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\" && Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n default:\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction decodeFilterValue(\r\n type: QueryFilter[\"type\"],\r\n method: QueryFilter[\"method\"],\r\n valueStr: string\r\n): QueryFilter[\"value\"] {\r\n if (NULLISH_METHODS.has(method)) {\r\n return valueStr;\r\n }\r\n switch (type) {\r\n case \"number\": {\r\n const n = Number.parseFloat(valueStr);\r\n return Number.isNaN(n) ? 0 : n;\r\n }\r\n case \"boolean\":\r\n return valueStr === \"true\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\") {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n return Array.isArray(parsed) ? parsed.map(String) : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n if (valueStr.startsWith(\"[\")) {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n if (Array.isArray(parsed)) {\r\n return parsed.map(String);\r\n }\r\n } catch {\r\n /* use raw string */\r\n }\r\n }\r\n return valueStr;\r\n default:\r\n return valueStr;\r\n }\r\n}\r\n\r\n/** Builds URL tuple; omits optional tails when unused (endColumnId requires valueTo slot - may be \"\"). */\r\nexport function encodeFilterToTuple(filter: QueryFilter): string[] {\r\n const tuple: string[] = [filter.columnId, filter.type, filter.method, encodeFilterValue(filter)];\r\n const hasValueTo = filter.valueTo != null && filter.valueTo !== \"\";\r\n const hasEndColumnId = filter.endColumnId != null && filter.endColumnId !== \"\";\r\n\r\n if (hasValueTo && filter.valueTo != null) {\r\n tuple.push(filter.valueTo);\r\n }\r\n\r\n if (hasEndColumnId && filter.endColumnId != null) {\r\n if (!hasValueTo) {\r\n tuple.push(\"\");\r\n }\r\n tuple.push(filter.endColumnId);\r\n }\r\n\r\n return tuple;\r\n}\r\n\r\nexport function decodeTupleToFilter(parts: readonly string[]): QueryFilter | null {\r\n if (parts.length < 4 || parts.length > 6) {\r\n return null;\r\n }\r\n\r\n const [columnId, typeStr, methodStr, valueStr, valueToStr, endColumnIdStr] = parts;\r\n\r\n const typeParsed = filterSchema.shape.type.safeParse(typeStr);\r\n const methodParsed = filterSchema.shape.method.safeParse(methodStr);\r\n if (!typeParsed.success || !methodParsed.success) {\r\n return null;\r\n }\r\n\r\n const type = typeParsed.data;\r\n const method = methodParsed.data;\r\n const value = decodeFilterValue(type, method, valueStr);\r\n\r\n const candidate: QueryFilter = {\r\n columnId,\r\n type,\r\n method,\r\n value,\r\n };\r\n\r\n if (valueToStr !== undefined) {\r\n candidate.valueTo = valueToStr;\r\n }\r\n if (endColumnIdStr !== undefined) {\r\n candidate.endColumnId = endColumnIdStr;\r\n }\r\n\r\n const parsed = filterSchema.safeParse(candidate);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nexport function decodeFilterTuples(rows: readonly string[][]): QueryFilters {\r\n const decoded = rows\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((filter): filter is QueryFilter => filter != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n}\r\n\r\nexport type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface QueryParamsState {\r\n /** Global search string; absent when not set. */\r\n q: string | null;\r\n setQ: (value: string | null) => void;\r\n filters?: QueryFilters;\r\n setFilters?: (filters: QueryFilters) => void;\r\n granularity?: Granularity;\r\n setGranularity?: (value: Granularity) => void;\r\n sort?: string;\r\n order?: Order | null;\r\n setSorting?: (updater: Updater<SortingState>) => void;\r\n sorting?: SortingState;\r\n page?: number;\r\n limit?: number;\r\n setPagination?: (updater: Updater<PaginationState>) => void;\r\n pagination?: PaginationState;\r\n grouping: GroupingState;\r\n setGrouping: (updater: Updater<GroupingState>) => void;\r\n}\r\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../_virtual/_rolldown/runtime.js");
2
3
  let _internationalized_date = require("@internationalized/date");
3
4
  let luxon = require("luxon");
4
5
  //#region src/utils/date.ts