@m5kdev/frontend 0.8.11 → 0.9.1

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 (31) hide show
  1. package/dist/packages/backend/dist/src/modules/base/base.procedure.d.mts +11 -1
  2. package/dist/packages/backend/dist/src/modules/base/base.procedure.d.mts.map +1 -1
  3. package/dist/packages/backend/dist/src/modules/base/base.procedure.d.ts +11 -1
  4. package/dist/packages/backend/dist/src/modules/base/base.procedure.d.ts.map +1 -1
  5. package/dist/packages/backend/dist/src/modules/base/base.service.d.mts +1 -1
  6. package/dist/packages/backend/dist/src/modules/base/base.service.d.mts.map +1 -1
  7. package/dist/packages/backend/dist/src/modules/base/base.service.d.ts +1 -1
  8. package/dist/packages/backend/dist/src/modules/base/base.service.d.ts.map +1 -1
  9. package/dist/src/modules/auth/auth.lib.d.mts +4 -4
  10. package/dist/src/modules/auth/auth.lib.d.ts +4 -4
  11. package/dist/src/modules/auth/components/AuthProvider.d.mts +1 -1
  12. package/dist/src/modules/auth/components/AuthProvider.d.mts.map +1 -1
  13. package/dist/src/modules/auth/components/AuthProvider.d.ts +1 -1
  14. package/dist/src/modules/auth/components/AuthProvider.d.ts.map +1 -1
  15. package/dist/src/modules/auth/components/AuthProvider.js +1 -1
  16. package/dist/src/modules/auth/components/AuthProvider.mjs +1 -1
  17. package/dist/src/modules/billing/components/BillingProvider.d.mts +1 -1
  18. package/dist/src/modules/billing/components/BillingProvider.d.mts.map +1 -1
  19. package/dist/src/modules/billing/components/BillingProvider.d.ts +1 -1
  20. package/dist/src/modules/billing/components/BillingProvider.d.ts.map +1 -1
  21. package/dist/src/modules/billing/components/BillingProvider.js +1 -1
  22. package/dist/src/modules/billing/components/BillingProvider.mjs +1 -1
  23. package/dist/src/modules/table/hooks/useNuqsQueryParams.d.mts.map +1 -1
  24. package/dist/src/modules/table/hooks/useNuqsQueryParams.d.ts.map +1 -1
  25. package/dist/src/modules/table/hooks/useNuqsQueryParams.js +67 -2
  26. package/dist/src/modules/table/hooks/useNuqsQueryParams.js.map +1 -1
  27. package/dist/src/modules/table/hooks/useNuqsQueryParams.mjs +68 -3
  28. package/dist/src/modules/table/hooks/useNuqsQueryParams.mjs.map +1 -1
  29. package/dist/src/modules/table/hooks/useQueryWithParams.js +1 -1
  30. package/dist/src/modules/table/hooks/useQueryWithParams.mjs +1 -1
  31. package/package.json +4 -4
@@ -14,6 +14,8 @@ type ServiceProcedureContext = {
14
14
  } & Record<string, unknown>;
15
15
  type ServiceProcedureState = Record<string, unknown>;
16
16
  type ServiceProcedureStoredValue<T> = [T] extends [undefined] ? undefined : Awaited<T>;
17
+ /** Value stored in procedure state after `loadResource` (loader may return null/undefined; state is narrowed). */
18
+ type ServiceProcedureLoadedResource<TOutput> = NonNullable<ServiceProcedureStoredValue<TOutput>>;
17
19
  type ServiceProcedureResultLike<T> = T | ServerResult<T> | Promise<T | ServerResult<T>>;
18
20
  type ServiceProcedureContextFilterScope = ActorScope;
19
21
  type ServiceProcedureContextFilteredInput<TInput> = Extract<NonNullable<TInput>, QueryInput>;
@@ -35,6 +37,14 @@ type ServiceProcedureInputMapper<TInput, TCtx extends ServiceProcedureContext, R
35
37
  type ServiceProcedureHandler<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TOutput> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<TOutput>;
36
38
  interface ServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>> {
37
39
  use<StepName extends string, TOutput = void>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TOutput>>>;
40
+ /**
41
+ * Loads a value from a `ServerResult` (or plain value) and stores it under `stepName`.
42
+ * Propagates `Err`; if the resolved value is falsy, returns `NOT_FOUND`.
43
+ * For valid numeric `0` or empty string, use `.use()` instead of this helper.
44
+ */
45
+ loadResource<StepName extends string, TOutput>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>, options?: {
46
+ notFoundMessage?: string;
47
+ }): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureLoadedResource<TOutput>>>;
38
48
  mapInput<StepName extends string, TNextInput>(stepName: StepName, step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>): ServiceProcedureBuilder<ServiceProcedureStoredValue<TNextInput>, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>>;
39
49
  addContextFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined>(include?: TInclude): ServiceProcedureBuilder<ServiceProcedureContextFilteredInput<TInput>, TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>, Repositories, Services, State & {
40
50
  contextFilter: ServiceProcedureContextFilteredInput<TInput>;
@@ -43,5 +53,5 @@ interface ServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext,
43
53
  handle<TOutput>(handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedure<TInput, TCtx, TOutput>;
44
54
  }
45
55
  //#endregion
46
- export { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper };
56
+ export { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper, ServiceProcedureLoadedResource };
47
57
  //# sourceMappingURL=base.procedure.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.procedure.d.mts","names":["ServerError","ServerResult","ServerResultAsync","logger","Base","Actor","ActorScope","AuthenticatedActor","Entity","ResourceActionGrant","TRPC_ERROR_CODE_KEY","QueryInput","ServiceLogger","child","ReturnType","RepositoryMap","Record","ServiceMap","ServiceProcedureContext","actor","ServiceProcedureState","ServiceProcedureStoredValue","T","Awaited","ServiceProcedureResultLike","Promise","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","TInput","NonNullable","Extract","ServiceProcedureAuthContext","Scope","ServiceProcedureRequiredScopeFromFilter","TInclude","ServiceProcedure","TCtx","TOutput","input","ctx","ServiceProcedureArgs","Repositories","Services","State","state","repository","service","ServiceProcedureStep","args","ServiceProcedureInputMapper","TNextInput","ServiceProcedureHandler","ServiceProcedureEntityResolver","TEntities","ServiceProcedureAccessBaseConfig","action","grants","ServiceProcedureEntityStepName","Key","ServiceProcedureAccessEntitiesConfig","entities","entityStep","ServiceProcedureAccessStateConfig","StepName","ServiceProcedureAccessConfig","ServiceProcedureBuilder","use","stepName","step","mapInput","addContextFilter","include","contextFilter","requireAuth","scope","handle","handler","PermissionServiceProcedureBuilder","access","config","BaseServiceProcedureHost","user","organization","team","query","error","code","message","cause","clientMessage","log","options","throwableAsync","fn","handleUnknownError","PermissionServiceProcedureHost","checkPermission","checkPermissionAsync","getEntities","ProcedureRuntimeStep","stage","run","ProcedureBuilderConfig","name","steps","createServiceProcedureBuilder","host","createPermissionServiceProcedureBuilder"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.procedure.d.mts"],"mappings":"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"}
1
+ {"version":3,"file":"base.procedure.d.mts","names":["ServerError","ServerResult","ServerResultAsync","logger","Base","Actor","ActorScope","AuthenticatedActor","Entity","ResourceActionGrant","TRPC_ERROR_CODE_KEY","QueryInput","ServiceLogger","child","ReturnType","RepositoryMap","Record","ServiceMap","ServiceProcedureContext","actor","ServiceProcedureState","ServiceProcedureStoredValue","T","Awaited","ServiceProcedureLoadedResource","TOutput","NonNullable","ServiceProcedureResultLike","Promise","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","TInput","Extract","ServiceProcedureAuthContext","Scope","ServiceProcedureRequiredScopeFromFilter","TInclude","ServiceProcedure","TCtx","input","ctx","ServiceProcedureArgs","Repositories","Services","State","state","repository","service","ServiceProcedureStep","args","ServiceProcedureInputMapper","TNextInput","ServiceProcedureHandler","ServiceProcedureEntityResolver","TEntities","ServiceProcedureAccessBaseConfig","action","grants","ServiceProcedureEntityStepName","Key","ServiceProcedureAccessEntitiesConfig","entities","entityStep","ServiceProcedureAccessStateConfig","StepName","ServiceProcedureAccessConfig","ServiceProcedureBuilder","use","stepName","step","loadResource","notFoundMessage","options","mapInput","addContextFilter","include","contextFilter","requireAuth","scope","handle","handler","PermissionServiceProcedureBuilder","access","config","BaseServiceProcedureHost","user","organization","team","query","error","code","message","cause","clientMessage","log","throwableAsync","fn","handleUnknownError","PermissionServiceProcedureHost","checkPermission","checkPermissionAsync","getEntities","ProcedureRuntimeStep","stage","run","ProcedureBuilderConfig","name","steps","createServiceProcedureBuilder","host","createPermissionServiceProcedureBuilder"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.procedure.d.mts"],"mappings":"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"}
@@ -14,6 +14,8 @@ type ServiceProcedureContext = {
14
14
  } & Record<string, unknown>;
15
15
  type ServiceProcedureState = Record<string, unknown>;
16
16
  type ServiceProcedureStoredValue<T> = [T] extends [undefined] ? undefined : Awaited<T>;
17
+ /** Value stored in procedure state after `loadResource` (loader may return null/undefined; state is narrowed). */
18
+ type ServiceProcedureLoadedResource<TOutput> = NonNullable<ServiceProcedureStoredValue<TOutput>>;
17
19
  type ServiceProcedureResultLike<T> = T | ServerResult<T> | Promise<T | ServerResult<T>>;
18
20
  type ServiceProcedureContextFilterScope = ActorScope;
19
21
  type ServiceProcedureContextFilteredInput<TInput> = Extract<NonNullable<TInput>, QueryInput>;
@@ -35,6 +37,14 @@ type ServiceProcedureInputMapper<TInput, TCtx extends ServiceProcedureContext, R
35
37
  type ServiceProcedureHandler<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TOutput> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<TOutput>;
36
38
  interface ServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>> {
37
39
  use<StepName extends string, TOutput = void>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TOutput>>>;
40
+ /**
41
+ * Loads a value from a `ServerResult` (or plain value) and stores it under `stepName`.
42
+ * Propagates `Err`; if the resolved value is falsy, returns `NOT_FOUND`.
43
+ * For valid numeric `0` or empty string, use `.use()` instead of this helper.
44
+ */
45
+ loadResource<StepName extends string, TOutput>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>, options?: {
46
+ notFoundMessage?: string;
47
+ }): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureLoadedResource<TOutput>>>;
38
48
  mapInput<StepName extends string, TNextInput>(stepName: StepName, step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>): ServiceProcedureBuilder<ServiceProcedureStoredValue<TNextInput>, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>>;
39
49
  addContextFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined>(include?: TInclude): ServiceProcedureBuilder<ServiceProcedureContextFilteredInput<TInput>, TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>, Repositories, Services, State & {
40
50
  contextFilter: ServiceProcedureContextFilteredInput<TInput>;
@@ -43,5 +53,5 @@ interface ServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext,
43
53
  handle<TOutput>(handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedure<TInput, TCtx, TOutput>;
44
54
  }
45
55
  //#endregion
46
- export { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper };
56
+ export { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper, ServiceProcedureLoadedResource };
47
57
  //# sourceMappingURL=base.procedure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.procedure.d.ts","names":["ServerError","ServerResult","ServerResultAsync","logger","Base","Actor","ActorScope","AuthenticatedActor","Entity","ResourceActionGrant","TRPC_ERROR_CODE_KEY","QueryInput","ServiceLogger","child","ReturnType","RepositoryMap","Record","ServiceMap","ServiceProcedureContext","actor","ServiceProcedureState","ServiceProcedureStoredValue","T","Awaited","ServiceProcedureResultLike","Promise","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","TInput","NonNullable","Extract","ServiceProcedureAuthContext","Scope","ServiceProcedureRequiredScopeFromFilter","TInclude","ServiceProcedure","TCtx","TOutput","input","ctx","ServiceProcedureArgs","Repositories","Services","State","state","repository","service","ServiceProcedureStep","args","ServiceProcedureInputMapper","TNextInput","ServiceProcedureHandler","ServiceProcedureEntityResolver","TEntities","ServiceProcedureAccessBaseConfig","action","grants","ServiceProcedureEntityStepName","Key","ServiceProcedureAccessEntitiesConfig","entities","entityStep","ServiceProcedureAccessStateConfig","StepName","ServiceProcedureAccessConfig","ServiceProcedureBuilder","use","stepName","step","mapInput","addContextFilter","include","contextFilter","requireAuth","scope","handle","handler","PermissionServiceProcedureBuilder","access","config","BaseServiceProcedureHost","user","organization","team","query","error","code","message","cause","clientMessage","log","options","throwableAsync","fn","handleUnknownError","PermissionServiceProcedureHost","checkPermission","checkPermissionAsync","getEntities","ProcedureRuntimeStep","stage","run","ProcedureBuilderConfig","name","steps","createServiceProcedureBuilder","host","createPermissionServiceProcedureBuilder"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.procedure.d.mts"],"mappings":"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"}
1
+ {"version":3,"file":"base.procedure.d.ts","names":["ServerError","ServerResult","ServerResultAsync","logger","Base","Actor","ActorScope","AuthenticatedActor","Entity","ResourceActionGrant","TRPC_ERROR_CODE_KEY","QueryInput","ServiceLogger","child","ReturnType","RepositoryMap","Record","ServiceMap","ServiceProcedureContext","actor","ServiceProcedureState","ServiceProcedureStoredValue","T","Awaited","ServiceProcedureLoadedResource","TOutput","NonNullable","ServiceProcedureResultLike","Promise","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","TInput","Extract","ServiceProcedureAuthContext","Scope","ServiceProcedureRequiredScopeFromFilter","TInclude","ServiceProcedure","TCtx","input","ctx","ServiceProcedureArgs","Repositories","Services","State","state","repository","service","ServiceProcedureStep","args","ServiceProcedureInputMapper","TNextInput","ServiceProcedureHandler","ServiceProcedureEntityResolver","TEntities","ServiceProcedureAccessBaseConfig","action","grants","ServiceProcedureEntityStepName","Key","ServiceProcedureAccessEntitiesConfig","entities","entityStep","ServiceProcedureAccessStateConfig","StepName","ServiceProcedureAccessConfig","ServiceProcedureBuilder","use","stepName","step","loadResource","notFoundMessage","options","mapInput","addContextFilter","include","contextFilter","requireAuth","scope","handle","handler","PermissionServiceProcedureBuilder","access","config","BaseServiceProcedureHost","user","organization","team","query","error","code","message","cause","clientMessage","log","throwableAsync","fn","handleUnknownError","PermissionServiceProcedureHost","checkPermission","checkPermissionAsync","getEntities","ProcedureRuntimeStep","stage","run","ProcedureBuilderConfig","name","steps","createServiceProcedureBuilder","host","createPermissionServiceProcedureBuilder"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.procedure.d.mts"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Base } from "./base.abstract.mjs";
2
2
  import { AuthenticatedActor } from "./base.actor.mjs";
3
- import { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper } from "./base.procedure.mjs";
3
+ import { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper, ServiceProcedureLoadedResource } from "./base.procedure.mjs";
4
4
  import { QueryFilter, QueryInput } from "@m5kdev/commons/modules/schemas/query.schema";
5
5
 
6
6
  //#region ../backend/dist/src/modules/base/base.service.d.mts
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.d.mts","names":["ServerResult","ServerResultAsync","Base","AuthenticatedActor","Entity","ResourceActionGrant","ResourceGrant","PermissionServiceProcedureBuilder","ServiceProcedure","ServiceProcedureAccessConfig","ServiceProcedureAccessEntitiesConfig","ServiceProcedureAccessStateConfig","ServiceProcedureArgs","ServiceProcedureBuilder","ServiceProcedureContext","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","ServiceProcedureEntityStepName","ServiceProcedureInputMapper","QueryFilter","QueryInput","BaseService","TQuery","TInput","TCtx","Repositories","Services","DefaultContext","Record","repository","service","constructor","addUserFilter","value","query","columnId","method","procedure","name","addContextFilter","actor","user","organization","team","include","map","BasePermissionService","T","grants","accessGuard","action","entities","accessGuardAsync","getEntities","checkPermission","checkPermissionAsync"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.service.d.mts"],"mappings":";;;;;;;cAQcqB,WAAAA,sBAAiCO,MAAAA,SAAe1B,IAAAA,oBAAwB0B,MAAAA,SAAe1B,IAAAA,0BAA8BY,uBAAAA,GAA0BA,uBAAAA,UAAiCZ,IAAAA;EAC5L2B,UAAAA,EAAYJ,YAAAA;EACZK,OAAAA,EAASJ,QAAAA;EACTK,WAAAA,CAAYF,UAAAA,GAAaJ,YAAAA,EAAcK,OAAAA,GAAUJ,QAAAA;EACjDM,aAAAA,CAAcC,KAAAA,UAAeC,KAAAA,cAAmBC,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBC,UAAAA;EACpGY,aAAAA,gBAA6BZ,UAAAA,CAAAA,CAAYa,KAAAA,UAAeC,KAAAA,EAAOZ,MAAAA,EAAQa,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBG,MAAAA;EAAAA,UACjHe,SAAAA,sBAA+BvB,uBAAAA,GAA0Ba,cAAAA,CAAAA,CAAgBW,IAAAA,WAAezB,uBAAAA,CAAwBU,MAAAA,EAAQC,IAAAA,EAAMC,YAAAA,EAAcC,QAAAA;EACtJa,gBAAAA,CAAiBC,KAAAA,EAAOrC,kBAAAA,EAAoByC,OAAAA;IAC1CH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,GACCT,KAAAA,cAAmBW,GAAAA,GAAMjB,MAAAA;IAC1BO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLC,UAAAA;EACLmB,gBAAAA,gBAAgCnB,UAAAA,CAAAA,CAAYoB,KAAAA,EAAOrC,kBAAAA,EAAoByC,OAAAA;IACrEH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,eACaT,KAAAA,EAAOZ,MAAAA,EAAQuB,GAAAA,GAAMjB,MAAAA;IAClCO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLG,MAAAA;AAAAA"}
1
+ {"version":3,"file":"base.service.d.mts","names":["ServerResult","ServerResultAsync","Base","AuthenticatedActor","Entity","ResourceActionGrant","ResourceGrant","PermissionServiceProcedureBuilder","ServiceProcedure","ServiceProcedureAccessConfig","ServiceProcedureAccessEntitiesConfig","ServiceProcedureAccessStateConfig","ServiceProcedureArgs","ServiceProcedureBuilder","ServiceProcedureContext","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","ServiceProcedureEntityStepName","ServiceProcedureInputMapper","ServiceProcedureLoadedResource","QueryFilter","QueryInput","BaseService","TQuery","TInput","TCtx","Repositories","Services","DefaultContext","Record","repository","service","constructor","addUserFilter","value","query","columnId","method","procedure","name","addContextFilter","actor","user","organization","team","include","map","BasePermissionService","T","grants","accessGuard","action","entities","accessGuardAsync","getEntities","checkPermission","checkPermissionAsync"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.service.d.mts"],"mappings":";;;;;;;cAQcsB,WAAAA,sBAAiCO,MAAAA,SAAe3B,IAAAA,oBAAwB2B,MAAAA,SAAe3B,IAAAA,0BAA8BY,uBAAAA,GAA0BA,uBAAAA,UAAiCZ,IAAAA;EAC5L4B,UAAAA,EAAYJ,YAAAA;EACZK,OAAAA,EAASJ,QAAAA;EACTK,WAAAA,CAAYF,UAAAA,GAAaJ,YAAAA,EAAcK,OAAAA,GAAUJ,QAAAA;EACjDM,aAAAA,CAAcC,KAAAA,UAAeC,KAAAA,cAAmBC,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBC,UAAAA;EACpGY,aAAAA,gBAA6BZ,UAAAA,CAAAA,CAAYa,KAAAA,UAAeC,KAAAA,EAAOZ,MAAAA,EAAQa,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBG,MAAAA;EAAAA,UACjHe,SAAAA,sBAA+BxB,uBAAAA,GAA0Bc,cAAAA,CAAAA,CAAgBW,IAAAA,WAAe1B,uBAAAA,CAAwBW,MAAAA,EAAQC,IAAAA,EAAMC,YAAAA,EAAcC,QAAAA;EACtJa,gBAAAA,CAAiBC,KAAAA,EAAOtC,kBAAAA,EAAoB0C,OAAAA;IAC1CH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,GACCT,KAAAA,cAAmBW,GAAAA,GAAMjB,MAAAA;IAC1BO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLC,UAAAA;EACLmB,gBAAAA,gBAAgCnB,UAAAA,CAAAA,CAAYoB,KAAAA,EAAOtC,kBAAAA,EAAoB0C,OAAAA;IACrEH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,eACaT,KAAAA,EAAOZ,MAAAA,EAAQuB,GAAAA,GAAMjB,MAAAA;IAClCO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLG,MAAAA;AAAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Base } from "./base.abstract.js";
2
2
  import { AuthenticatedActor } from "./base.actor.js";
3
- import { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper } from "./base.procedure.js";
3
+ import { ServiceProcedure, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureInputMapper, ServiceProcedureLoadedResource } from "./base.procedure.js";
4
4
  import { QueryFilter, QueryInput } from "@m5kdev/commons/modules/schemas/query.schema";
5
5
 
6
6
  //#region ../backend/dist/src/modules/base/base.service.d.mts
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.d.ts","names":["ServerResult","ServerResultAsync","Base","AuthenticatedActor","Entity","ResourceActionGrant","ResourceGrant","PermissionServiceProcedureBuilder","ServiceProcedure","ServiceProcedureAccessConfig","ServiceProcedureAccessEntitiesConfig","ServiceProcedureAccessStateConfig","ServiceProcedureArgs","ServiceProcedureBuilder","ServiceProcedureContext","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","ServiceProcedureEntityStepName","ServiceProcedureInputMapper","QueryFilter","QueryInput","BaseService","TQuery","TInput","TCtx","Repositories","Services","DefaultContext","Record","repository","service","constructor","addUserFilter","value","query","columnId","method","procedure","name","addContextFilter","actor","user","organization","team","include","map","BasePermissionService","T","grants","accessGuard","action","entities","accessGuardAsync","getEntities","checkPermission","checkPermissionAsync"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.service.d.mts"],"mappings":";;;;;;;cAQcqB,WAAAA,sBAAiCO,MAAAA,SAAe1B,IAAAA,oBAAwB0B,MAAAA,SAAe1B,IAAAA,0BAA8BY,uBAAAA,GAA0BA,uBAAAA,UAAiCZ,IAAAA;EAC5L2B,UAAAA,EAAYJ,YAAAA;EACZK,OAAAA,EAASJ,QAAAA;EACTK,WAAAA,CAAYF,UAAAA,GAAaJ,YAAAA,EAAcK,OAAAA,GAAUJ,QAAAA;EACjDM,aAAAA,CAAcC,KAAAA,UAAeC,KAAAA,cAAmBC,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBC,UAAAA;EACpGY,aAAAA,gBAA6BZ,UAAAA,CAAAA,CAAYa,KAAAA,UAAeC,KAAAA,EAAOZ,MAAAA,EAAQa,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBG,MAAAA;EAAAA,UACjHe,SAAAA,sBAA+BvB,uBAAAA,GAA0Ba,cAAAA,CAAAA,CAAgBW,IAAAA,WAAezB,uBAAAA,CAAwBU,MAAAA,EAAQC,IAAAA,EAAMC,YAAAA,EAAcC,QAAAA;EACtJa,gBAAAA,CAAiBC,KAAAA,EAAOrC,kBAAAA,EAAoByC,OAAAA;IAC1CH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,GACCT,KAAAA,cAAmBW,GAAAA,GAAMjB,MAAAA;IAC1BO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLC,UAAAA;EACLmB,gBAAAA,gBAAgCnB,UAAAA,CAAAA,CAAYoB,KAAAA,EAAOrC,kBAAAA,EAAoByC,OAAAA;IACrEH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,eACaT,KAAAA,EAAOZ,MAAAA,EAAQuB,GAAAA,GAAMjB,MAAAA;IAClCO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLG,MAAAA;AAAAA"}
1
+ {"version":3,"file":"base.service.d.ts","names":["ServerResult","ServerResultAsync","Base","AuthenticatedActor","Entity","ResourceActionGrant","ResourceGrant","PermissionServiceProcedureBuilder","ServiceProcedure","ServiceProcedureAccessConfig","ServiceProcedureAccessEntitiesConfig","ServiceProcedureAccessStateConfig","ServiceProcedureArgs","ServiceProcedureBuilder","ServiceProcedureContext","ServiceProcedureContextFilterScope","ServiceProcedureContextFilteredInput","ServiceProcedureEntityStepName","ServiceProcedureInputMapper","ServiceProcedureLoadedResource","QueryFilter","QueryInput","BaseService","TQuery","TInput","TCtx","Repositories","Services","DefaultContext","Record","repository","service","constructor","addUserFilter","value","query","columnId","method","procedure","name","addContextFilter","actor","user","organization","team","include","map","BasePermissionService","T","grants","accessGuard","action","entities","accessGuardAsync","getEntities","checkPermission","checkPermissionAsync"],"sources":["../../../../../../../../backend/dist/src/modules/base/base.service.d.mts"],"mappings":";;;;;;;cAQcsB,WAAAA,sBAAiCO,MAAAA,SAAe3B,IAAAA,oBAAwB2B,MAAAA,SAAe3B,IAAAA,0BAA8BY,uBAAAA,GAA0BA,uBAAAA,UAAiCZ,IAAAA;EAC5L4B,UAAAA,EAAYJ,YAAAA;EACZK,OAAAA,EAASJ,QAAAA;EACTK,WAAAA,CAAYF,UAAAA,GAAaJ,YAAAA,EAAcK,OAAAA,GAAUJ,QAAAA;EACjDM,aAAAA,CAAcC,KAAAA,UAAeC,KAAAA,cAAmBC,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBC,UAAAA;EACpGY,aAAAA,gBAA6BZ,UAAAA,CAAAA,CAAYa,KAAAA,UAAeC,KAAAA,EAAOZ,MAAAA,EAAQa,QAAAA,WAAmBC,MAAAA,GAASjB,WAAAA,aAAwBG,MAAAA;EAAAA,UACjHe,SAAAA,sBAA+BxB,uBAAAA,GAA0Bc,cAAAA,CAAAA,CAAgBW,IAAAA,WAAe1B,uBAAAA,CAAwBW,MAAAA,EAAQC,IAAAA,EAAMC,YAAAA,EAAcC,QAAAA;EACtJa,gBAAAA,CAAiBC,KAAAA,EAAOtC,kBAAAA,EAAoB0C,OAAAA;IAC1CH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,GACCT,KAAAA,cAAmBW,GAAAA,GAAMjB,MAAAA;IAC1BO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLC,UAAAA;EACLmB,gBAAAA,gBAAgCnB,UAAAA,CAAAA,CAAYoB,KAAAA,EAAOtC,kBAAAA,EAAoB0C,OAAAA;IACrEH,IAAAA;IACAC,YAAAA;IACAC,IAAAA;EAAAA,eACaT,KAAAA,EAAOZ,MAAAA,EAAQuB,GAAAA,GAAMjB,MAAAA;IAClCO,QAAAA;IACAC,MAAAA,EAAQjB,WAAAA;EAAAA,KACLG,MAAAA;AAAAA"}
@@ -669,7 +669,7 @@ declare const authClient: {
669
669
  sortDirection?: "asc" | "desc" | undefined;
670
670
  filterField?: string | undefined;
671
671
  filterValue?: string | number | boolean | undefined;
672
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
672
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
673
673
  organizationId?: string | undefined;
674
674
  organizationSlug?: string | undefined;
675
675
  }> & Record<string, any>, Record<string, any> | undefined>>(data_0?: _$better_auth0.Prettify<{
@@ -680,7 +680,7 @@ declare const authClient: {
680
680
  sortDirection?: "asc" | "desc" | undefined;
681
681
  filterField?: string | undefined;
682
682
  filterValue?: string | number | boolean | undefined;
683
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
683
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
684
684
  organizationId?: string | undefined;
685
685
  organizationSlug?: string | undefined;
686
686
  } | undefined;
@@ -1042,7 +1042,7 @@ declare const authClient: {
1042
1042
  sortDirection?: "asc" | "desc" | undefined;
1043
1043
  filterField?: string | undefined;
1044
1044
  filterValue?: string | number | boolean | undefined;
1045
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
1045
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
1046
1046
  }> & Record<string, any>, Record<string, any> | undefined>>(data_0: _$better_auth0.Prettify<{
1047
1047
  query: {
1048
1048
  searchValue?: string | undefined;
@@ -1054,7 +1054,7 @@ declare const authClient: {
1054
1054
  sortDirection?: "asc" | "desc" | undefined;
1055
1055
  filterField?: string | undefined;
1056
1056
  filterValue?: string | number | boolean | undefined;
1057
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
1057
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
1058
1058
  };
1059
1059
  fetchOptions?: FetchOptions | undefined;
1060
1060
  }>, data_1?: FetchOptions | undefined) => Promise<_$better_auth_client0.BetterFetchResponse<NonNullable<{
@@ -669,7 +669,7 @@ declare const authClient: {
669
669
  sortDirection?: "asc" | "desc" | undefined;
670
670
  filterField?: string | undefined;
671
671
  filterValue?: string | number | boolean | undefined;
672
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
672
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
673
673
  organizationId?: string | undefined;
674
674
  organizationSlug?: string | undefined;
675
675
  }> & Record<string, any>, Record<string, any> | undefined>>(data_0?: _$better_auth0.Prettify<{
@@ -680,7 +680,7 @@ declare const authClient: {
680
680
  sortDirection?: "asc" | "desc" | undefined;
681
681
  filterField?: string | undefined;
682
682
  filterValue?: string | number | boolean | undefined;
683
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
683
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
684
684
  organizationId?: string | undefined;
685
685
  organizationSlug?: string | undefined;
686
686
  } | undefined;
@@ -1042,7 +1042,7 @@ declare const authClient: {
1042
1042
  sortDirection?: "asc" | "desc" | undefined;
1043
1043
  filterField?: string | undefined;
1044
1044
  filterValue?: string | number | boolean | undefined;
1045
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
1045
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
1046
1046
  }> & Record<string, any>, Record<string, any> | undefined>>(data_0: _$better_auth0.Prettify<{
1047
1047
  query: {
1048
1048
  searchValue?: string | undefined;
@@ -1054,7 +1054,7 @@ declare const authClient: {
1054
1054
  sortDirection?: "asc" | "desc" | undefined;
1055
1055
  filterField?: string | undefined;
1056
1056
  filterValue?: string | number | boolean | undefined;
1057
- filterOperator?: "contains" | "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | undefined;
1057
+ filterOperator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte" | "contains" | undefined;
1058
1058
  };
1059
1059
  fetchOptions?: FetchOptions | undefined;
1060
1060
  }>, data_1?: FetchOptions | undefined) => Promise<_$better_auth_client0.BetterFetchResponse<NonNullable<{
@@ -18,7 +18,7 @@ declare function AuthProvider({
18
18
  children: React.ReactNode;
19
19
  loader?: React.ReactNode;
20
20
  onSession?: (session: Session | null) => void;
21
- }): string | number | bigint | true | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined>;
21
+ }): string | number | bigint | true | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | _$react_jsx_runtime0.JSX.Element;
22
22
  //#endregion
23
23
  export { AuthProvider, authProviderContext };
24
24
  //# sourceMappingURL=AuthProvider.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.mts","names":[],"sources":["../../../../../src/modules/auth/components/AuthProvider.tsx"],"mappings":";;;;;KAIK,OAAA,GAAU,UAAA,QAAkB,UAAA,CAAW,UAAA;AAAA,cAO/B,mBAAA,EAEE,OAAA,CAFiB,OAAA;;QAExB,OAAA;;oBAEY,SAAA;AAAA;AAAA,iBAQJ,YAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA,sCACvB,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"AuthProvider.d.mts","names":[],"sources":["../../../../../src/modules/auth/components/AuthProvider.tsx"],"mappings":";;;;;KAIK,OAAA,GAAU,UAAA,QAAkB,UAAA,CAAW,UAAA;AAAA,cAO/B,mBAAA,EAEE,OAAA,CAFiB,OAAA;;QAExB,OAAA;;oBAEY,SAAA;AAAA;AAAA,iBAQJ,YAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA,sCACvB,QAAA,CAD8B,OAAA,CAC9B,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA,wBAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -18,7 +18,7 @@ declare function AuthProvider({
18
18
  children: React.ReactNode;
19
19
  loader?: React.ReactNode;
20
20
  onSession?: (session: Session | null) => void;
21
- }): string | number | bigint | true | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined>;
21
+ }): string | number | bigint | true | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | _$react_jsx_runtime0.JSX.Element;
22
22
  //#endregion
23
23
  export { AuthProvider, authProviderContext };
24
24
  //# sourceMappingURL=AuthProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.ts","names":[],"sources":["../../../../../src/modules/auth/components/AuthProvider.tsx"],"mappings":";;;;;KAIK,OAAA,GAAU,UAAA,QAAkB,UAAA,CAAW,UAAA;AAAA,cAO/B,mBAAA,EAEE,OAAA,CAFiB,OAAA;;QAExB,OAAA;;oBAEY,SAAA;AAAA;AAAA,iBAQJ,YAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA,sCACvB,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"AuthProvider.d.ts","names":[],"sources":["../../../../../src/modules/auth/components/AuthProvider.tsx"],"mappings":";;;;;KAIK,OAAA,GAAU,UAAA,QAAkB,UAAA,CAAW,UAAA;AAAA,cAO/B,mBAAA,EAEE,OAAA,CAFiB,OAAA;;QAExB,OAAA;;oBAEY,SAAA;AAAA;AAAA,iBAQJ,YAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA,sCACvB,QAAA,CAD8B,OAAA,CAC9B,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA,wBAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_src_modules_auth_auth_lib = require("../auth.lib.js");
3
- let react = require("react");
4
3
  let posthog_js_react_dist_umd_index_js = require("posthog-js/react/dist/umd/index.js");
4
+ let react = require("react");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  //#region src/modules/auth/components/AuthProvider.tsx
7
7
  function isImpersonatedSession(session) {
@@ -1,6 +1,6 @@
1
1
  import { authClient } from "../auth.lib.mjs";
2
- import { createContext, useCallback, useEffect, useState } from "react";
3
2
  import { usePostHog } from "posthog-js/react/dist/esm/index.js";
3
+ import { createContext, useCallback, useEffect, useState } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/modules/auth/components/AuthProvider.tsx
6
6
  function isImpersonatedSession(session) {
@@ -20,7 +20,7 @@ declare function BillingProvider({
20
20
  loader?: React.ReactNode;
21
21
  planPage: React.ReactNode;
22
22
  skipPlanCheck?: boolean;
23
- }): string | number | bigint | boolean | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | null | undefined;
23
+ }): string | number | bigint | boolean | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | _$react_jsx_runtime0.JSX.Element | null | undefined;
24
24
  //#endregion
25
25
  export { BillingProvider, billingProviderContext };
26
26
  //# sourceMappingURL=BillingProvider.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BillingProvider.d.mts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;;cAKa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,OAAA;EACA,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,OAAA,EAAS,cAAA;EACT,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"BillingProvider.d.mts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;;cAKa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,OAAA;EACA,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,OAAA,EAAS,cAAA;EACT,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,QAAA,CAF0B,OAAA,CAE1B,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA,wBAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -20,7 +20,7 @@ declare function BillingProvider({
20
20
  loader?: React.ReactNode;
21
21
  planPage: React.ReactNode;
22
22
  skipPlanCheck?: boolean;
23
- }): string | number | bigint | boolean | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | null | undefined;
23
+ }): string | number | bigint | boolean | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | _$react_jsx_runtime0.JSX.Element | null | undefined;
24
24
  //#endregion
25
25
  export { BillingProvider, billingProviderContext };
26
26
  //# sourceMappingURL=BillingProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BillingProvider.d.ts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;;cAKa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,OAAA;EACA,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,OAAA,EAAS,cAAA;EACT,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"BillingProvider.d.ts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;;cAKa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,OAAA;EACA,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,OAAA,EAAS,cAAA;EACT,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,QAAA,CAF0B,OAAA,CAE1B,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA,wBAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- let _tanstack_react_query = require("@tanstack/react-query");
3
2
  let react = require("react");
4
3
  let react_jsx_runtime = require("react/jsx-runtime");
4
+ let _tanstack_react_query = require("@tanstack/react-query");
5
5
  //#region src/modules/billing/components/BillingProvider.tsx
6
6
  const billingProviderContext = (0, react.createContext)({
7
7
  isLoading: true,
@@ -1,6 +1,6 @@
1
- import { useQuery } from "@tanstack/react-query";
2
1
  import { createContext } from "react";
3
2
  import { jsx } from "react/jsx-runtime";
3
+ import { useQuery } from "@tanstack/react-query";
4
4
  //#region src/modules/billing/components/BillingProvider.tsx
5
5
  const billingProviderContext = createContext({
6
6
  isLoading: true,
@@ -1 +1 @@
1
- {"version":3,"file":"useNuqsQueryParams.d.mts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"mappings":";;;;;;;KAsJY,KAAA;AAAA,KAEA,WAAA;AAAA,UAEK,eAAA;;EAEf,CAAA;EACA,IAAA,GAAO,KAAA;EACP,OAAA,GAAU,YAAA;EACV,UAAA,IAAc,OAAA,EAAS,YAAA;EACvB,WAAA,GAAc,WAAA;EACd,cAAA,IAAkB,KAAA,EAAO,WAAA;EACzB,IAAA;EACA,KAAA,GAAQ,KAAA;EACR,UAAA,IAAc,OAAA,EAAS,OAAA,CAAQ,YAAA;EAC/B,OAAA,GAAU,YAAA;EACV,IAAA;EACA,KAAA;EACA,aAAA,IAAiB,OAAA,EAAS,OAAA,CAAQ,eAAA;EAClC,UAAA,GAAa,eAAA;EACb,QAAA,EAAU,aAAA;EACV,WAAA,GAAc,OAAA,EAAS,OAAA,CAAQ,aAAA;AAAA;;;;;;cAQpB,kBAAA,GAAsB,MAAA,cAAkB,eAAA"}
1
+ {"version":3,"file":"useNuqsQueryParams.d.mts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"mappings":";;;;;;;KAoOY,KAAA;AAAA,KAEA,WAAA;AAAA,UAEK,eAAA;;EAEf,CAAA;EACA,IAAA,GAAO,KAAA;EACP,OAAA,GAAU,YAAA;EACV,UAAA,IAAc,OAAA,EAAS,YAAA;EACvB,WAAA,GAAc,WAAA;EACd,cAAA,IAAkB,KAAA,EAAO,WAAA;EACzB,IAAA;EACA,KAAA,GAAQ,KAAA;EACR,UAAA,IAAc,OAAA,EAAS,OAAA,CAAQ,YAAA;EAC/B,OAAA,GAAU,YAAA;EACV,IAAA;EACA,KAAA;EACA,aAAA,IAAiB,OAAA,EAAS,OAAA,CAAQ,eAAA;EAClC,UAAA,GAAa,eAAA;EACb,QAAA,EAAU,aAAA;EACV,WAAA,GAAc,OAAA,EAAS,OAAA,CAAQ,aAAA;AAAA;;;;;;cAQpB,kBAAA,GAAsB,MAAA,cAAkB,eAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"useNuqsQueryParams.d.ts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"mappings":";;;;;;;KAsJY,KAAA;AAAA,KAEA,WAAA;AAAA,UAEK,eAAA;;EAEf,CAAA;EACA,IAAA,GAAO,KAAA;EACP,OAAA,GAAU,YAAA;EACV,UAAA,IAAc,OAAA,EAAS,YAAA;EACvB,WAAA,GAAc,WAAA;EACd,cAAA,IAAkB,KAAA,EAAO,WAAA;EACzB,IAAA;EACA,KAAA,GAAQ,KAAA;EACR,UAAA,IAAc,OAAA,EAAS,OAAA,CAAQ,YAAA;EAC/B,OAAA,GAAU,YAAA;EACV,IAAA;EACA,KAAA;EACA,aAAA,IAAiB,OAAA,EAAS,OAAA,CAAQ,eAAA;EAClC,UAAA,GAAa,eAAA;EACb,QAAA,EAAU,aAAA;EACV,WAAA,GAAc,OAAA,EAAS,OAAA,CAAQ,aAAA;AAAA;;;;;;cAQpB,kBAAA,GAAsB,MAAA,cAAkB,eAAA"}
1
+ {"version":3,"file":"useNuqsQueryParams.d.ts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"mappings":";;;;;;;KAoOY,KAAA;AAAA,KAEA,WAAA;AAAA,UAEK,eAAA;;EAEf,CAAA;EACA,IAAA,GAAO,KAAA;EACP,OAAA,GAAU,YAAA;EACV,UAAA,IAAc,OAAA,EAAS,YAAA;EACvB,WAAA,GAAc,WAAA;EACd,cAAA,IAAkB,KAAA,EAAO,WAAA;EACzB,IAAA;EACA,KAAA,GAAQ,KAAA;EACR,UAAA,IAAc,OAAA,EAAS,OAAA,CAAQ,YAAA;EAC/B,OAAA,GAAU,YAAA;EACV,IAAA;EACA,KAAA;EACA,aAAA,IAAiB,OAAA,EAAS,OAAA,CAAQ,eAAA;EAClC,UAAA,GAAa,eAAA;EACb,QAAA,EAAU,aAAA;EACV,WAAA,GAAc,OAAA,EAAS,OAAA,CAAQ,aAAA;AAAA;;;;;;cAQpB,kBAAA,GAAsB,MAAA,cAAkB,eAAA"}
@@ -4,9 +4,74 @@ let _m5kdev_commons_modules_schemas_query_schema = require("@m5kdev/commons/modu
4
4
  let nuqs = require("nuqs");
5
5
  let zod = require("zod");
6
6
  //#region src/modules/table/hooks/useNuqsQueryParams.ts
7
- /** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — all strings in the URL */
7
+ /** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — validated after parse */
8
8
  const filtersRawSchema = zod.z.array(zod.z.array(zod.z.string()).min(4).max(6));
9
- const parseAsFilterTuples = (0, nuqs.parseAsJson)((value) => filtersRawSchema.parse(value)).withDefault([]);
9
+ /** Escape `\`, `|`, `;` so we can split filters without JSON quotes/brackets. */
10
+ function escapeFilterField(raw) {
11
+ return raw.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/;/g, "\\;");
12
+ }
13
+ function unescapeFilterField(encoded) {
14
+ let out = "";
15
+ for (let i = 0; i < encoded.length; i++) {
16
+ const c = encoded[i];
17
+ if (c === "\\" && i + 1 < encoded.length) {
18
+ const next = encoded[i + 1];
19
+ if (next === "\\" || next === "|" || next === ";") {
20
+ out += next;
21
+ i++;
22
+ continue;
23
+ }
24
+ }
25
+ out += c;
26
+ }
27
+ return out;
28
+ }
29
+ /**
30
+ * Split on `delimiter` only when not escaped as `\` + delimiter.
31
+ */
32
+ function splitByEscapedDelimiter(s, delimiter) {
33
+ if (delimiter.length !== 1) throw new Error("splitByEscapedDelimiter expects a single-character delimiter");
34
+ const parts = [];
35
+ let buf = "";
36
+ for (let i = 0; i < s.length; i++) {
37
+ const c = s[i];
38
+ if (c === "\\" && i + 1 < s.length) {
39
+ buf += c + s[i + 1];
40
+ i++;
41
+ continue;
42
+ }
43
+ if (c === delimiter) {
44
+ parts.push(unescapeFilterField(buf));
45
+ buf = "";
46
+ continue;
47
+ }
48
+ buf += c;
49
+ }
50
+ parts.push(unescapeFilterField(buf));
51
+ return parts;
52
+ }
53
+ function serializeFiltersParam(rows) {
54
+ if (rows.length === 0) return "";
55
+ return rows.map((row) => row.map(escapeFilterField).join("|")).join(";");
56
+ }
57
+ function parseFiltersParam(value) {
58
+ const trimmed = value.trim();
59
+ if (trimmed === "") return [];
60
+ const rowStrings = splitByEscapedDelimiter(trimmed, ";");
61
+ const rows = [];
62
+ for (const row of rowStrings) {
63
+ if (row === "") continue;
64
+ const fields = splitByEscapedDelimiter(row, "|");
65
+ if (fields.length >= 4 && fields.length <= 6) rows.push(fields);
66
+ }
67
+ const parsed = filtersRawSchema.safeParse(rows);
68
+ return parsed.success ? parsed.data : null;
69
+ }
70
+ const parseAsFilterTuples = (0, nuqs.createParser)({
71
+ parse: (value) => parseFiltersParam(value),
72
+ serialize: (rows) => serializeFiltersParam(rows),
73
+ eq: (a, b) => JSON.stringify(a) === JSON.stringify(b)
74
+ }).withDefault([]);
10
75
  const parseAsGrouping = (0, nuqs.parseAsArrayOf)(nuqs.parseAsString).withDefault([]);
11
76
  const NULLISH_METHODS = new Set([
12
77
  "isEmpty",
@@ -1 +1 @@
1
- {"version":3,"file":"useNuqsQueryParams.js","names":["z","parseAsString","filterSchema","parseAsInteger","filtersSchema"],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.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 {\r\n parseAsArrayOf,\r\n parseAsInteger,\r\n parseAsJson,\r\n parseAsString,\r\n parseAsStringLiteral,\r\n useQueryState,\r\n} from \"nuqs\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { z } from \"zod\";\r\n\r\n/** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — all strings in the URL */\r\nconst filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));\r\n\r\nconst parseAsFilterTuples = parseAsJson<string[][]>((value) =>\r\n filtersRawSchema.parse(value)\r\n).withDefault([]);\r\n\r\nconst parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);\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\nfunction 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\nfunction 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 type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface NuqsQueryParams {\r\n /** Global search string from URL (`q`); absent when not in URL. */\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\r\n/**\r\n * Hook to manage all query parameters via nuqs (URL query parameters)\r\n * Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`\r\n * Accepts an optional prefix to namespace params when multiple tables share a view.\r\n */\r\nexport const useNuqsQueryParams = (prefix?: string): NuqsQueryParams => {\r\n const k = (name: string) => (prefix ? `${prefix}_${name}` : name);\r\n\r\n const [sort, setSort] = useQueryState<string>(k(\"s\"), parseAsString.withDefault(\"\"));\r\n const [order, setOrder] = useQueryState<Order>(k(\"o\"), parseAsStringLiteral([\"asc\", \"desc\"]));\r\n const [page, setPage] = useQueryState<number>(k(\"p\"), parseAsInteger.withDefault(1));\r\n const [limit, setLimit] = useQueryState<number>(k(\"l\"), parseAsInteger.withDefault(10));\r\n const [qRaw, setQRaw] = useQueryState(k(\"q\"), parseAsString);\r\n const [filtersRaw, setFiltersRaw] = useQueryState<string[][]>(k(\"f\"), parseAsFilterTuples);\r\n\r\n const filters = useMemo((): QueryFilters => {\r\n const decoded = filtersRaw\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((f): f is QueryFilter => f != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n }, [filtersRaw]);\r\n\r\n const setFilters = useCallback(\r\n (next: QueryFilters) => {\r\n void setFiltersRaw(next.length === 0 ? null : next.map(encodeFilterToTuple));\r\n },\r\n [setFiltersRaw]\r\n );\r\n\r\n const setQ = useCallback(\r\n (value: string | null) => {\r\n void setQRaw(value === \"\" || value == null ? null : value);\r\n },\r\n [setQRaw]\r\n );\r\n const [granularity, setGranularity] = useQueryState<Granularity>(\r\n k(\"r\"),\r\n parseAsStringLiteral([\"daily\", \"weekly\", \"monthly\", \"yearly\"]).withDefault(\"daily\")\r\n );\r\n const [groupingRaw, setGroupingRaw] = useQueryState<string[]>(k(\"g\"), parseAsGrouping);\r\n const grouping: GroupingState = groupingRaw;\r\n\r\n const setGrouping = useCallback(\r\n (updater: Updater<GroupingState>) => {\r\n const next = typeof updater === \"function\" ? updater(groupingRaw) : updater;\r\n setGroupingRaw(next.length > 0 ? next : null);\r\n },\r\n [groupingRaw, setGroupingRaw]\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, setSort, setOrder]\r\n );\r\n\r\n useEffect(() => {\r\n if (sort && !order) {\r\n setOrder(\"asc\");\r\n }\r\n }, [sort, order, setOrder]);\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: dependent on page and limit only\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n const currentState = { pageIndex: page - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setPage((next.pageIndex ?? 0) + 1);\r\n setLimit(next.pageSize ?? 10);\r\n },\r\n [page, 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 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};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"useNuqsQueryParams.js","names":["z","parseAsString","filterSchema","parseAsInteger","filtersSchema"],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.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 {\r\n createParser,\r\n parseAsArrayOf,\r\n parseAsInteger,\r\n parseAsString,\r\n parseAsStringLiteral,\r\n useQueryState,\r\n} from \"nuqs\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\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\nfunction 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\nfunction 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 parseAsFilterTuples = createParser<string[][]>({\r\n parse: (value) => parseFiltersParam(value),\r\n serialize: (rows) => serializeFiltersParam(rows),\r\n eq: (a, b) => JSON.stringify(a) === JSON.stringify(b),\r\n}).withDefault([]);\r\n\r\nconst parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);\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\nfunction 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\nfunction 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 type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface NuqsQueryParams {\r\n /** Global search string from URL (`q`); absent when not in URL. */\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\r\n/**\r\n * Hook to manage all query parameters via nuqs (URL query parameters)\r\n * Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`\r\n * Accepts an optional prefix to namespace params when multiple tables share a view.\r\n */\r\nexport const useNuqsQueryParams = (prefix?: string): NuqsQueryParams => {\r\n const k = (name: string) => (prefix ? `${prefix}_${name}` : name);\r\n\r\n const [sort, setSort] = useQueryState<string>(k(\"s\"), parseAsString.withDefault(\"\"));\r\n const [order, setOrder] = useQueryState<Order>(k(\"o\"), parseAsStringLiteral([\"asc\", \"desc\"]));\r\n const [page, setPage] = useQueryState<number>(k(\"p\"), parseAsInteger.withDefault(1));\r\n const [limit, setLimit] = useQueryState<number>(k(\"l\"), parseAsInteger.withDefault(10));\r\n const [qRaw, setQRaw] = useQueryState(k(\"q\"), parseAsString);\r\n const [filtersRaw, setFiltersRaw] = useQueryState<string[][]>(k(\"f\"), parseAsFilterTuples);\r\n\r\n const filters = useMemo((): QueryFilters => {\r\n const decoded = filtersRaw\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((f): f is QueryFilter => f != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n }, [filtersRaw]);\r\n\r\n const setFilters = useCallback(\r\n (next: QueryFilters) => {\r\n void setFiltersRaw(next.length === 0 ? null : next.map(encodeFilterToTuple));\r\n },\r\n [setFiltersRaw]\r\n );\r\n\r\n const setQ = useCallback(\r\n (value: string | null) => {\r\n void setQRaw(value === \"\" || value == null ? null : value);\r\n },\r\n [setQRaw]\r\n );\r\n const [granularity, setGranularity] = useQueryState<Granularity>(\r\n k(\"r\"),\r\n parseAsStringLiteral([\"daily\", \"weekly\", \"monthly\", \"yearly\"]).withDefault(\"daily\")\r\n );\r\n const [groupingRaw, setGroupingRaw] = useQueryState<string[]>(k(\"g\"), parseAsGrouping);\r\n const grouping: GroupingState = groupingRaw;\r\n\r\n const setGrouping = useCallback(\r\n (updater: Updater<GroupingState>) => {\r\n const next = typeof updater === \"function\" ? updater(groupingRaw) : updater;\r\n setGroupingRaw(next.length > 0 ? next : null);\r\n },\r\n [groupingRaw, setGroupingRaw]\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, setSort, setOrder]\r\n );\r\n\r\n useEffect(() => {\r\n if (sort && !order) {\r\n setOrder(\"asc\");\r\n }\r\n }, [sort, order, setOrder]);\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: dependent on page and limit only\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n const currentState = { pageIndex: page - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setPage((next.pageIndex ?? 0) + 1);\r\n setLimit(next.pageSize ?? 10);\r\n },\r\n [page, 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 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};\r\n"],"mappings":"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"}
@@ -1,11 +1,76 @@
1
1
  import { useCallback, useEffect, useMemo } from "react";
2
2
  import { filterSchema, filtersSchema } from "@m5kdev/commons/modules/schemas/query.schema";
3
- import { parseAsArrayOf, parseAsInteger, parseAsJson, parseAsString, parseAsStringLiteral, useQueryState } from "nuqs";
3
+ import { createParser, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringLiteral, useQueryState } from "nuqs";
4
4
  import { z } from "zod";
5
5
  //#region src/modules/table/hooks/useNuqsQueryParams.ts
6
- /** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — all strings in the URL */
6
+ /** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — validated after parse */
7
7
  const filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));
8
- const parseAsFilterTuples = parseAsJson((value) => filtersRawSchema.parse(value)).withDefault([]);
8
+ /** Escape `\`, `|`, `;` so we can split filters without JSON quotes/brackets. */
9
+ function escapeFilterField(raw) {
10
+ return raw.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/;/g, "\\;");
11
+ }
12
+ function unescapeFilterField(encoded) {
13
+ let out = "";
14
+ for (let i = 0; i < encoded.length; i++) {
15
+ const c = encoded[i];
16
+ if (c === "\\" && i + 1 < encoded.length) {
17
+ const next = encoded[i + 1];
18
+ if (next === "\\" || next === "|" || next === ";") {
19
+ out += next;
20
+ i++;
21
+ continue;
22
+ }
23
+ }
24
+ out += c;
25
+ }
26
+ return out;
27
+ }
28
+ /**
29
+ * Split on `delimiter` only when not escaped as `\` + delimiter.
30
+ */
31
+ function splitByEscapedDelimiter(s, delimiter) {
32
+ if (delimiter.length !== 1) throw new Error("splitByEscapedDelimiter expects a single-character delimiter");
33
+ const parts = [];
34
+ let buf = "";
35
+ for (let i = 0; i < s.length; i++) {
36
+ const c = s[i];
37
+ if (c === "\\" && i + 1 < s.length) {
38
+ buf += c + s[i + 1];
39
+ i++;
40
+ continue;
41
+ }
42
+ if (c === delimiter) {
43
+ parts.push(unescapeFilterField(buf));
44
+ buf = "";
45
+ continue;
46
+ }
47
+ buf += c;
48
+ }
49
+ parts.push(unescapeFilterField(buf));
50
+ return parts;
51
+ }
52
+ function serializeFiltersParam(rows) {
53
+ if (rows.length === 0) return "";
54
+ return rows.map((row) => row.map(escapeFilterField).join("|")).join(";");
55
+ }
56
+ function parseFiltersParam(value) {
57
+ const trimmed = value.trim();
58
+ if (trimmed === "") return [];
59
+ const rowStrings = splitByEscapedDelimiter(trimmed, ";");
60
+ const rows = [];
61
+ for (const row of rowStrings) {
62
+ if (row === "") continue;
63
+ const fields = splitByEscapedDelimiter(row, "|");
64
+ if (fields.length >= 4 && fields.length <= 6) rows.push(fields);
65
+ }
66
+ const parsed = filtersRawSchema.safeParse(rows);
67
+ return parsed.success ? parsed.data : null;
68
+ }
69
+ const parseAsFilterTuples = createParser({
70
+ parse: (value) => parseFiltersParam(value),
71
+ serialize: (rows) => serializeFiltersParam(rows),
72
+ eq: (a, b) => JSON.stringify(a) === JSON.stringify(b)
73
+ }).withDefault([]);
9
74
  const parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);
10
75
  const NULLISH_METHODS = new Set([
11
76
  "isEmpty",
@@ -1 +1 @@
1
- {"version":3,"file":"useNuqsQueryParams.mjs","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.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 {\r\n parseAsArrayOf,\r\n parseAsInteger,\r\n parseAsJson,\r\n parseAsString,\r\n parseAsStringLiteral,\r\n useQueryState,\r\n} from \"nuqs\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { z } from \"zod\";\r\n\r\n/** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — all strings in the URL */\r\nconst filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));\r\n\r\nconst parseAsFilterTuples = parseAsJson<string[][]>((value) =>\r\n filtersRawSchema.parse(value)\r\n).withDefault([]);\r\n\r\nconst parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);\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\nfunction 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\nfunction 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 type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface NuqsQueryParams {\r\n /** Global search string from URL (`q`); absent when not in URL. */\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\r\n/**\r\n * Hook to manage all query parameters via nuqs (URL query parameters)\r\n * Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`\r\n * Accepts an optional prefix to namespace params when multiple tables share a view.\r\n */\r\nexport const useNuqsQueryParams = (prefix?: string): NuqsQueryParams => {\r\n const k = (name: string) => (prefix ? `${prefix}_${name}` : name);\r\n\r\n const [sort, setSort] = useQueryState<string>(k(\"s\"), parseAsString.withDefault(\"\"));\r\n const [order, setOrder] = useQueryState<Order>(k(\"o\"), parseAsStringLiteral([\"asc\", \"desc\"]));\r\n const [page, setPage] = useQueryState<number>(k(\"p\"), parseAsInteger.withDefault(1));\r\n const [limit, setLimit] = useQueryState<number>(k(\"l\"), parseAsInteger.withDefault(10));\r\n const [qRaw, setQRaw] = useQueryState(k(\"q\"), parseAsString);\r\n const [filtersRaw, setFiltersRaw] = useQueryState<string[][]>(k(\"f\"), parseAsFilterTuples);\r\n\r\n const filters = useMemo((): QueryFilters => {\r\n const decoded = filtersRaw\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((f): f is QueryFilter => f != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n }, [filtersRaw]);\r\n\r\n const setFilters = useCallback(\r\n (next: QueryFilters) => {\r\n void setFiltersRaw(next.length === 0 ? null : next.map(encodeFilterToTuple));\r\n },\r\n [setFiltersRaw]\r\n );\r\n\r\n const setQ = useCallback(\r\n (value: string | null) => {\r\n void setQRaw(value === \"\" || value == null ? null : value);\r\n },\r\n [setQRaw]\r\n );\r\n const [granularity, setGranularity] = useQueryState<Granularity>(\r\n k(\"r\"),\r\n parseAsStringLiteral([\"daily\", \"weekly\", \"monthly\", \"yearly\"]).withDefault(\"daily\")\r\n );\r\n const [groupingRaw, setGroupingRaw] = useQueryState<string[]>(k(\"g\"), parseAsGrouping);\r\n const grouping: GroupingState = groupingRaw;\r\n\r\n const setGrouping = useCallback(\r\n (updater: Updater<GroupingState>) => {\r\n const next = typeof updater === \"function\" ? updater(groupingRaw) : updater;\r\n setGroupingRaw(next.length > 0 ? next : null);\r\n },\r\n [groupingRaw, setGroupingRaw]\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, setSort, setOrder]\r\n );\r\n\r\n useEffect(() => {\r\n if (sort && !order) {\r\n setOrder(\"asc\");\r\n }\r\n }, [sort, order, setOrder]);\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: dependent on page and limit only\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n const currentState = { pageIndex: page - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setPage((next.pageIndex ?? 0) + 1);\r\n setLimit(next.pageSize ?? 10);\r\n },\r\n [page, 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 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};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"useNuqsQueryParams.mjs","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.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 {\r\n createParser,\r\n parseAsArrayOf,\r\n parseAsInteger,\r\n parseAsString,\r\n parseAsStringLiteral,\r\n useQueryState,\r\n} from \"nuqs\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\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\nfunction 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\nfunction 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 parseAsFilterTuples = createParser<string[][]>({\r\n parse: (value) => parseFiltersParam(value),\r\n serialize: (rows) => serializeFiltersParam(rows),\r\n eq: (a, b) => JSON.stringify(a) === JSON.stringify(b),\r\n}).withDefault([]);\r\n\r\nconst parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);\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\nfunction 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\nfunction 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 type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface NuqsQueryParams {\r\n /** Global search string from URL (`q`); absent when not in URL. */\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\r\n/**\r\n * Hook to manage all query parameters via nuqs (URL query parameters)\r\n * Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`\r\n * Accepts an optional prefix to namespace params when multiple tables share a view.\r\n */\r\nexport const useNuqsQueryParams = (prefix?: string): NuqsQueryParams => {\r\n const k = (name: string) => (prefix ? `${prefix}_${name}` : name);\r\n\r\n const [sort, setSort] = useQueryState<string>(k(\"s\"), parseAsString.withDefault(\"\"));\r\n const [order, setOrder] = useQueryState<Order>(k(\"o\"), parseAsStringLiteral([\"asc\", \"desc\"]));\r\n const [page, setPage] = useQueryState<number>(k(\"p\"), parseAsInteger.withDefault(1));\r\n const [limit, setLimit] = useQueryState<number>(k(\"l\"), parseAsInteger.withDefault(10));\r\n const [qRaw, setQRaw] = useQueryState(k(\"q\"), parseAsString);\r\n const [filtersRaw, setFiltersRaw] = useQueryState<string[][]>(k(\"f\"), parseAsFilterTuples);\r\n\r\n const filters = useMemo((): QueryFilters => {\r\n const decoded = filtersRaw\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((f): f is QueryFilter => f != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n }, [filtersRaw]);\r\n\r\n const setFilters = useCallback(\r\n (next: QueryFilters) => {\r\n void setFiltersRaw(next.length === 0 ? null : next.map(encodeFilterToTuple));\r\n },\r\n [setFiltersRaw]\r\n );\r\n\r\n const setQ = useCallback(\r\n (value: string | null) => {\r\n void setQRaw(value === \"\" || value == null ? null : value);\r\n },\r\n [setQRaw]\r\n );\r\n const [granularity, setGranularity] = useQueryState<Granularity>(\r\n k(\"r\"),\r\n parseAsStringLiteral([\"daily\", \"weekly\", \"monthly\", \"yearly\"]).withDefault(\"daily\")\r\n );\r\n const [groupingRaw, setGroupingRaw] = useQueryState<string[]>(k(\"g\"), parseAsGrouping);\r\n const grouping: GroupingState = groupingRaw;\r\n\r\n const setGrouping = useCallback(\r\n (updater: Updater<GroupingState>) => {\r\n const next = typeof updater === \"function\" ? updater(groupingRaw) : updater;\r\n setGroupingRaw(next.length > 0 ? next : null);\r\n },\r\n [groupingRaw, setGroupingRaw]\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, setSort, setOrder]\r\n );\r\n\r\n useEffect(() => {\r\n if (sort && !order) {\r\n setOrder(\"asc\");\r\n }\r\n }, [sort, order, setOrder]);\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: dependent on page and limit only\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n const currentState = { pageIndex: page - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setPage((next.pageIndex ?? 0) + 1);\r\n setLimit(next.pageSize ?? 10);\r\n },\r\n [page, 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 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};\r\n"],"mappings":";;;;;;AAeA,MAAM,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;;AAGnE,SAAS,kBAAkB,KAAqB;AAC9C,QAAO,IAAI,QAAQ,OAAO,OAAO,CAAC,QAAQ,OAAO,MAAM,CAAC,QAAQ,MAAM,MAAM;;AAG9E,SAAS,oBAAoB,SAAyB;CACpD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,IAAI,QAAQ;AAClB,MAAI,MAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ;GACxC,MAAM,OAAO,QAAQ,IAAI;AACzB,OAAI,SAAS,QAAQ,SAAS,OAAO,SAAS,KAAK;AACjD,WAAO;AACP;AACA;;;AAGJ,SAAO;;AAET,QAAO;;;;;AAMT,SAAS,wBAAwB,GAAW,WAA6B;AACvE,KAAI,UAAU,WAAW,EACvB,OAAM,IAAI,MAAM,+DAA+D;CAEjF,MAAM,QAAkB,EAAE;CAC1B,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;EACjC,MAAM,IAAI,EAAE;AACZ,MAAI,MAAM,QAAQ,IAAI,IAAI,EAAE,QAAQ;AAClC,UAAO,IAAI,EAAE,IAAI;AACjB;AACA;;AAEF,MAAI,MAAM,WAAW;AACnB,SAAM,KAAK,oBAAoB,IAAI,CAAC;AACpC,SAAM;AACN;;AAEF,SAAO;;AAET,OAAM,KAAK,oBAAoB,IAAI,CAAC;AACpC,QAAO;;AAGT,SAAS,sBAAsB,MAA0B;AACvD,KAAI,KAAK,WAAW,EAClB,QAAO;AAET,QAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,kBAAkB,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI;;AAG1E,SAAS,kBAAkB,OAAkC;CAC3D,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,YAAY,GACd,QAAO,EAAE;CAEX,MAAM,aAAa,wBAAwB,SAAS,IAAI;CACxD,MAAM,OAAmB,EAAE;AAC3B,MAAK,MAAM,OAAO,YAAY;AAC5B,MAAI,QAAQ,GACV;EAEF,MAAM,SAAS,wBAAwB,KAAK,IAAI;AAChD,MAAI,OAAO,UAAU,KAAK,OAAO,UAAU,EACzC,MAAK,KAAK,OAAO;;CAGrB,MAAM,SAAS,iBAAiB,UAAU,KAAK;AAC/C,QAAO,OAAO,UAAU,OAAO,OAAO;;AAGxC,MAAM,sBAAsB,aAAyB;CACnD,QAAQ,UAAU,kBAAkB,MAAM;CAC1C,YAAY,SAAS,sBAAsB,KAAK;CAChD,KAAK,GAAG,MAAM,KAAK,UAAU,EAAE,KAAK,KAAK,UAAU,EAAE;CACtD,CAAC,CAAC,YAAY,EAAE,CAAC;AAElB,MAAM,kBAAkB,eAAe,cAAc,CAAC,YAAY,EAAE,CAAC;AAErE,MAAM,kBAAsD,IAAI,IAAI;CAClE;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,kBAAkB,QAA6B;AACtD,KAAI,gBAAgB,IAAI,OAAO,OAAO,CACpC,QAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;CAE3D,MAAM,EAAE,MAAM,QAAQ,UAAU;AAChC,SAAQ,MAAR;EACE,KAAK,SACH,QAAO,OAAO,MAAgB;EAChC,KAAK,UACH,QAAQ,QAAoB,SAAS;EACvC,KAAK;EACL,KAAK;AACH,OAAI,WAAW,WAAW,MAAM,QAAQ,MAAM,CAC5C,QAAO,KAAK,UAAU,MAAM;AAE9B,OAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,KAAK,UAAU,MAAM;AAE9B,UAAO,OAAO,MAAM;EACtB,QACE,QAAO,OAAO,MAAM;;;AAI1B,SAAS,kBACP,MACA,QACA,UACsB;AACtB,KAAI,gBAAgB,IAAI,OAAO,CAC7B,QAAO;AAET,SAAQ,MAAR;EACE,KAAK,UAAU;GACb,MAAM,IAAI,OAAO,WAAW,SAAS;AACrC,UAAO,OAAO,MAAM,EAAE,GAAG,IAAI;;EAE/B,KAAK,UACH,QAAO,aAAa;EACtB,KAAK;EACL,KAAK;AACH,OAAI,WAAW,QACb,KAAI;IACF,MAAM,SAAS,KAAK,MAAM,SAAS;AACnC,WAAO,MAAM,QAAQ,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,EAAE;WAChD;AACN,WAAO,EAAE;;AAGb,OAAI,SAAS,WAAW,IAAI,CAC1B,KAAI;IACF,MAAM,SAAS,KAAK,MAAM,SAAS;AACnC,QAAI,MAAM,QAAQ,OAAO,CACvB,QAAO,OAAO,IAAI,OAAO;WAErB;AAIV,UAAO;EACT,QACE,QAAO;;;;AAKb,SAAS,oBAAoB,QAA+B;CAC1D,MAAM,QAAkB;EAAC,OAAO;EAAU,OAAO;EAAM,OAAO;EAAQ,kBAAkB,OAAO;EAAC;CAChG,MAAM,aAAa,OAAO,WAAW,QAAQ,OAAO,YAAY;CAChE,MAAM,iBAAiB,OAAO,eAAe,QAAQ,OAAO,gBAAgB;AAE5E,KAAI,cAAc,OAAO,WAAW,KAClC,OAAM,KAAK,OAAO,QAAQ;AAG5B,KAAI,kBAAkB,OAAO,eAAe,MAAM;AAChD,MAAI,CAAC,WACH,OAAM,KAAK,GAAG;AAEhB,QAAM,KAAK,OAAO,YAAY;;AAGhC,QAAO;;AAGT,SAAS,oBAAoB,OAA8C;AACzE,KAAI,MAAM,SAAS,KAAK,MAAM,SAAS,EACrC,QAAO;CAGT,MAAM,CAAC,UAAU,SAAS,WAAW,UAAU,YAAY,kBAAkB;CAE7E,MAAM,aAAa,aAAa,MAAM,KAAK,UAAU,QAAQ;CAC7D,MAAM,eAAe,aAAa,MAAM,OAAO,UAAU,UAAU;AACnE,KAAI,CAAC,WAAW,WAAW,CAAC,aAAa,QACvC,QAAO;CAGT,MAAM,OAAO,WAAW;CACxB,MAAM,SAAS,aAAa;CAG5B,MAAM,YAAyB;EAC7B;EACA;EACA;EACA,OANY,kBAAkB,MAAM,QAAQ,SAAS;EAOtD;AAED,KAAI,eAAe,KAAA,EACjB,WAAU,UAAU;AAEtB,KAAI,mBAAmB,KAAA,EACrB,WAAU,cAAc;CAG1B,MAAM,SAAS,aAAa,UAAU,UAAU;AAChD,QAAO,OAAO,UAAU,OAAO,OAAO;;;;;;;AAgCxC,MAAa,sBAAsB,WAAqC;CACtE,MAAM,KAAK,SAAkB,SAAS,GAAG,OAAO,GAAG,SAAS;CAE5D,MAAM,CAAC,MAAM,WAAW,cAAsB,EAAE,IAAI,EAAE,cAAc,YAAY,GAAG,CAAC;CACpF,MAAM,CAAC,OAAO,YAAY,cAAqB,EAAE,IAAI,EAAE,qBAAqB,CAAC,OAAO,OAAO,CAAC,CAAC;CAC7F,MAAM,CAAC,MAAM,WAAW,cAAsB,EAAE,IAAI,EAAE,eAAe,YAAY,EAAE,CAAC;CACpF,MAAM,CAAC,OAAO,YAAY,cAAsB,EAAE,IAAI,EAAE,eAAe,YAAY,GAAG,CAAC;CACvF,MAAM,CAAC,MAAM,WAAW,cAAc,EAAE,IAAI,EAAE,cAAc;CAC5D,MAAM,CAAC,YAAY,iBAAiB,cAA0B,EAAE,IAAI,EAAE,oBAAoB;CAE1F,MAAM,UAAU,cAA4B;EAC1C,MAAM,UAAU,WACb,KAAK,QAAQ,oBAAoB,IAAI,CAAC,CACtC,QAAQ,MAAwB,KAAK,KAAK;EAC7C,MAAM,SAAS,cAAc,UAAU,QAAQ;AAC/C,SAAO,OAAO,UAAU,OAAO,OAAO,EAAE;IACvC,CAAC,WAAW,CAAC;CAEhB,MAAM,aAAa,aAChB,SAAuB;AACjB,gBAAc,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,oBAAoB,CAAC;IAE9E,CAAC,cAAc,CAChB;CAED,MAAM,OAAO,aACV,UAAyB;AACnB,UAAQ,UAAU,MAAM,SAAS,OAAO,OAAO,MAAM;IAE5D,CAAC,QAAQ,CACV;CACD,MAAM,CAAC,aAAa,kBAAkB,cACpC,EAAE,IAAI,EACN,qBAAqB;EAAC;EAAS;EAAU;EAAW;EAAS,CAAC,CAAC,YAAY,QAAQ,CACpF;CACD,MAAM,CAAC,aAAa,kBAAkB,cAAwB,EAAE,IAAI,EAAE,gBAAgB;CACtF,MAAM,WAA0B;CAEhC,MAAM,cAAc,aACjB,YAAoC;EACnC,MAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,YAAY,GAAG;AACpE,iBAAe,KAAK,SAAS,IAAI,OAAO,KAAK;IAE/C,CAAC,aAAa,eAAe,CAC9B;CAED,MAAM,UAAU,cAAc;AAC5B,MAAI,CAAC,KACH,QAAO,EAAE;AAGX,SAAO,CAAC;GAAE,IAAI;GAAM,OADG,SAAS,WACa;GAAQ,CAAC;IACrD,CAAC,MAAM,MAAM,CAAC;CAEjB,MAAM,aAAa,eAAe;EAAE,WAAW,OAAO;EAAG,UAAU;EAAO,GAAG,CAAC,MAAM,MAAM,CAAC;CAE3F,MAAM,aAAa,aAChB,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;EAAC;EAAM;EAAO;EAAS;EAAS,CACjC;AAED,iBAAgB;AACd,MAAI,QAAQ,CAAC,MACX,UAAS,MAAM;IAEhB;EAAC;EAAM;EAAO;EAAS,CAAC;CAG3B,MAAM,gBAAgB,aACnB,YAAsC;EACrC,MAAM,eAAe;GAAE,WAAW,OAAO;GAAG,UAAU;GAAO;EAC7D,MAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,aAAa,GAAG;AACrE,WAAS,KAAK,aAAa,KAAK,EAAE;AAClC,WAAS,KAAK,YAAY,GAAG;IAE/B,CAAC,MAAM,MAAM,CACd;AAED,QAAO,eACE;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;EACA;EACD,CACF"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- let _tanstack_react_query = require("@tanstack/react-query");
3
2
  let react = require("react");
3
+ let _tanstack_react_query = require("@tanstack/react-query");
4
4
  //#region src/modules/table/hooks/useQueryWithParams.ts
5
5
  const FETCH_ALL_LIMIT = 99999;
6
6
  /**
@@ -1,5 +1,5 @@
1
- import { useQuery } from "@tanstack/react-query";
2
1
  import { useEffect, useMemo, useRef } from "react";
2
+ import { useQuery } from "@tanstack/react-query";
3
3
  //#region src/modules/table/hooks/useQueryWithParams.ts
4
4
  const FETCH_ALL_LIMIT = 99999;
5
5
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m5kdev/frontend",
3
- "version": "0.8.11",
3
+ "version": "0.9.1",
4
4
  "license": "GPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,7 +24,7 @@
24
24
  "react": "19.2.1",
25
25
  "react-dom": "19.2.1",
26
26
  "zod": "4.2.1",
27
- "@m5kdev/commons": "0.8.11"
27
+ "@m5kdev/commons": "0.9.1"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@heroui/react": "2.8.10",
@@ -36,8 +36,8 @@
36
36
  "tsdown": "0.21.7",
37
37
  "typescript": "5.9.2",
38
38
  "vite": "7.0.4",
39
- "@m5kdev/config": "0.8.11",
40
- "@m5kdev/backend": "0.8.11"
39
+ "@m5kdev/config": "0.9.1",
40
+ "@m5kdev/backend": "0.9.1"
41
41
  },
42
42
  "exports": {
43
43
  "./modules/auth/components/*": {