@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.
- package/dist/packages/backend/dist/src/modules/base/base.procedure.d.mts +11 -1
- package/dist/packages/backend/dist/src/modules/base/base.procedure.d.mts.map +1 -1
- package/dist/packages/backend/dist/src/modules/base/base.procedure.d.ts +11 -1
- package/dist/packages/backend/dist/src/modules/base/base.procedure.d.ts.map +1 -1
- package/dist/packages/backend/dist/src/modules/base/base.service.d.mts +1 -1
- package/dist/packages/backend/dist/src/modules/base/base.service.d.mts.map +1 -1
- package/dist/packages/backend/dist/src/modules/base/base.service.d.ts +1 -1
- package/dist/packages/backend/dist/src/modules/base/base.service.d.ts.map +1 -1
- package/dist/src/modules/auth/auth.lib.d.mts +4 -4
- package/dist/src/modules/auth/auth.lib.d.ts +4 -4
- package/dist/src/modules/auth/components/AuthProvider.d.mts +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.mts.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.ts +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.ts.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.js +1 -1
- package/dist/src/modules/auth/components/AuthProvider.mjs +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.mts +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.mts.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.ts +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.ts.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.js +1 -1
- package/dist/src/modules/billing/components/BillingProvider.mjs +1 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.mts.map +1 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.ts.map +1 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.js +67 -2
- package/dist/src/modules/table/hooks/useNuqsQueryParams.js.map +1 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.mjs +68 -3
- package/dist/src/modules/table/hooks/useNuqsQueryParams.mjs.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.js +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.mjs +1 -1
- 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","
|
|
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","
|
|
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":";;;;;;;;KAUKY,aAAAA,GAAgBE,UAAAA,QAAkBX,MAAAA,CAAOU,KAAAA;AAAAA,KACzCE,aAAAA,GAAgBC,MAAAA,SAAeZ,IAAAA;AAAAA,KAC/Ba,UAAAA,GAAaD,MAAAA,SAAeZ,IAAAA;AAAAA,KAC5Bc,uBAAAA;EACHC,KAAAA,GAAQZ,kBAAAA;AAAAA,IACNS,MAAAA;AAAAA,KACCI,qBAAAA,GAAwBJ,MAAAA;AAAAA,KACxBK,2BAAAA,OAAkCC,CAAAA,oCAAqCC,OAAAA,CAAQD,CAAAA;AAPjC;AAAA,KAS9CE,8BAAAA,YAA0CE,WAAAA,CAAYL,2BAAAA,CAA4BI,OAAAA;AAAAA,KAClFE,0BAAAA,MAAgCL,CAAAA,GAAIrB,YAAAA,CAAaqB,CAAAA,IAAKM,OAAAA,CAAQN,CAAAA,GAAIrB,YAAAA,CAAaqB,CAAAA;AAAAA,KAC/EO,kCAAAA,GAAqCvB,UAAAA;AAAAA,KACrCwB,oCAAAA,WAA+CE,OAAAA,CAAQN,WAAAA,CAAYK,MAAAA,GAASpB,UAAAA;AAAAA,KAC5EsB,2BAAAA,eAA0C3B,UAAAA;EAC7Ca,KAAAA,EAAOd,KAAAA,CAAM6B,KAAAA;AAAAA;AAAAA,KAEVC,uCAAAA,2BAAkEN,kCAAAA,kBAAoDO,QAAAA,kBAA0BP,kCAAAA,oBAAsDO,QAAAA,2CAAmDA,QAAAA;AAAAA,KACzPC,gBAAAA,sBAAsCnB,uBAAAA,cAAqCqB,KAAAA,EAAOR,MAAAA,EAAQS,GAAAA,EAAKF,IAAAA,KAASpC,iBAAAA,CAAkBuB,OAAAA;AAAAA,KAC1HgB,oBAAAA,sBAA0CvB,uBAAAA,uBAA8CH,aAAAA,mBAAgCE,UAAAA,gBAA0BG,qBAAAA;EACrJmB,KAAAA,EAAOR,MAAAA;EACPS,GAAAA,EAAKF,IAAAA;EACLO,KAAAA,EAAOD,KAAAA;EACPE,UAAAA,EAAYJ,YAAAA;EACZK,OAAAA,EAASJ,QAAAA;EACTxC,MAAAA,EAAQS,aAAAA;AAAAA;AAAAA,KAELoC,oBAAAA,sBAA0C9B,uBAAAA,uBAA8CH,aAAAA,mBAAgCE,UAAAA,gBAA0BG,qBAAAA,0BAA+C6B,IAAAA,EAAMR,oBAAAA,CAAqBV,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,MAAWjB,0BAAAA,CAA2BN,2BAAAA,CAA4BI,OAAAA;AAAAA,KACpUyB,2BAAAA,sBAAiDhC,uBAAAA,uBAA8CH,aAAAA,mBAAgCE,UAAAA,gBAA0BG,qBAAAA,iBAAsC6B,IAAAA,EAAMR,oBAAAA,CAAqBV,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,MAAWjB,0BAAAA,CAA2BN,2BAAAA,CAA4B8B,UAAAA;AAAAA,KAClUC,uBAAAA,sBAA6ClC,uBAAAA,uBAA8CH,aAAAA,mBAAgCE,UAAAA,gBAA0BG,qBAAAA,cAAmC6B,IAAAA,EAAMR,oBAAAA,CAAqBV,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,MAAWjB,0BAAAA,CAA2BF,OAAAA;AAAAA,UAgB1RyC,uBAAAA,sBAA6ChD,uBAAAA,uBAA8CH,aAAAA,mBAAgCE,UAAAA,gBAA0BG,qBAAAA,GAAwBJ,MAAAA;EACrLmD,GAAAA,0CAA6CC,QAAAA,EAAUJ,QAAAA,EAAUK,IAAAA,EAAMrB,oBAAAA,CAAqBjB,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,EAAOnB,OAAAA,IAAWyC,uBAAAA,CAAwBnC,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,GAAQ5B,MAAAA,CAAOgD,QAAAA,EAAU3C,2BAAAA,CAA4BI,OAAAA;EAtCpL;;;;;EA4CnF6C,YAAAA,mCAA+CF,QAAAA,EAAUJ,QAAAA,EAAUK,IAAAA,EAAMrB,oBAAAA,CAAqBjB,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,EAAOnB,OAAAA,GAAU+C,OAAAA;IACnJD,eAAAA;EAAAA,IACEL,uBAAAA,CAAwBnC,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,GAAQ5B,MAAAA,CAAOgD,QAAAA,EAAUxC,8BAAAA,CAA+BC,OAAAA;EAC1HgD,QAAAA,sCAA8CL,QAAAA,EAAUJ,QAAAA,EAAUK,IAAAA,EAAMnB,2BAAAA,CAA4BnB,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,EAAOO,UAAAA,IAAce,uBAAAA,CAAwB7C,2BAAAA,CAA4B8B,UAAAA,GAAab,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,GAAQ5B,MAAAA,CAAOgD,QAAAA,EAAU3C,2BAAAA,CAA4B8B,UAAAA;EACnTuB,gBAAAA,2BAA2C7C,kCAAAA,4BAA8D8C,OAAAA,GAAUvC,QAAAA,GAAW8B,uBAAAA,CAAwBpC,oCAAAA,CAAqCC,MAAAA,GAASO,IAAAA,GAAOL,2BAAAA,CAA4BE,uCAAAA,CAAwCC,QAAAA,IAAYM,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA;IACjTgC,aAAAA,EAAe9C,oCAAAA,CAAqCC,MAAAA;EAAAA;EAEtD8C,WAAAA,eAA0BvE,UAAAA,WAAqBwE,KAAAA,GAAQ5C,KAAAA,GAAQgC,uBAAAA,CAAwBnC,MAAAA,EAAQO,IAAAA,GAAOL,2BAAAA,CAA4BC,KAAAA,GAAQQ,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA;EAClKmC,MAAAA,UAAgBC,OAAAA,EAAS5B,uBAAAA,CAAwBrB,MAAAA,EAAQO,IAAAA,EAAMI,YAAAA,EAAcC,QAAAA,EAAUC,KAAAA,EAAOnB,OAAAA,IAAWY,gBAAAA,CAAiBN,MAAAA,EAAQO,IAAAA,EAAMb,OAAAA;AAAAA"}
|
|
@@ -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":";;;;;;;
|
|
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":";;;;;;;
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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 |
|
|
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,
|
|
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 |
|
|
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,
|
|
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 |
|
|
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,
|
|
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 |
|
|
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,
|
|
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":";;;;;;;
|
|
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":";;;;;;;
|
|
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?] —
|
|
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
|
-
|
|
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":";;;;;;;AAeA,MAAM,mBAAmBA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAEnE,MAAM,uBAAA,GAAA,KAAA,cAA+C,UACnD,iBAAiB,MAAM,MAAM,CAC9B,CAAC,YAAY,EAAE,CAAC;AAEjB,MAAM,mBAAA,GAAA,KAAA,gBAAiCC,KAAAA,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,aAAaC,6CAAAA,aAAa,MAAM,KAAK,UAAU,QAAQ;CAC7D,MAAM,eAAeA,6CAAAA,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,SAASA,6CAAAA,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,YAAA,GAAA,KAAA,eAAiC,EAAE,IAAI,EAAED,KAAAA,cAAc,YAAY,GAAG,CAAC;CACpF,MAAM,CAAC,OAAO,aAAA,GAAA,KAAA,eAAiC,EAAE,IAAI,GAAA,GAAA,KAAA,sBAAuB,CAAC,OAAO,OAAO,CAAC,CAAC;CAC7F,MAAM,CAAC,MAAM,YAAA,GAAA,KAAA,eAAiC,EAAE,IAAI,EAAEE,KAAAA,eAAe,YAAY,EAAE,CAAC;CACpF,MAAM,CAAC,OAAO,aAAA,GAAA,KAAA,eAAkC,EAAE,IAAI,EAAEA,KAAAA,eAAe,YAAY,GAAG,CAAC;CACvF,MAAM,CAAC,MAAM,YAAA,GAAA,KAAA,eAAyB,EAAE,IAAI,EAAEF,KAAAA,cAAc;CAC5D,MAAM,CAAC,YAAY,kBAAA,GAAA,KAAA,eAA2C,EAAE,IAAI,EAAE,oBAAoB;CAE1F,MAAM,WAAA,GAAA,MAAA,eAAsC;EAC1C,MAAM,UAAU,WACb,KAAK,QAAQ,oBAAoB,IAAI,CAAC,CACtC,QAAQ,MAAwB,KAAK,KAAK;EAC7C,MAAM,SAASG,6CAAAA,cAAc,UAAU,QAAQ;AAC/C,SAAO,OAAO,UAAU,OAAO,OAAO,EAAE;IACvC,CAAC,WAAW,CAAC;CAEhB,MAAM,cAAA,GAAA,MAAA,cACH,SAAuB;AACjB,gBAAc,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,oBAAoB,CAAC;IAE9E,CAAC,cAAc,CAChB;CAED,MAAM,QAAA,GAAA,MAAA,cACH,UAAyB;AACnB,UAAQ,UAAU,MAAM,SAAS,OAAO,OAAO,MAAM;IAE5D,CAAC,QAAQ,CACV;CACD,MAAM,CAAC,aAAa,mBAAA,GAAA,KAAA,eAClB,EAAE,IAAI,GAAA,GAAA,KAAA,sBACe;EAAC;EAAS;EAAU;EAAW;EAAS,CAAC,CAAC,YAAY,QAAQ,CACpF;CACD,MAAM,CAAC,aAAa,mBAAA,GAAA,KAAA,eAA0C,EAAE,IAAI,EAAE,gBAAgB;CACtF,MAAM,WAA0B;CAEhC,MAAM,eAAA,GAAA,MAAA,cACH,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,WAAA,GAAA,MAAA,eAAwB;AAC5B,MAAI,CAAC,KACH,QAAO,EAAE;AAGX,SAAO,CAAC;GAAE,IAAI;GAAM,OADG,SAAS,WACa;GAAQ,CAAC;IACrD,CAAC,MAAM,MAAM,CAAC;CAEjB,MAAM,cAAA,GAAA,MAAA,gBAA4B;EAAE,WAAW,OAAO;EAAG,UAAU;EAAO,GAAG,CAAC,MAAM,MAAM,CAAC;CAE3F,MAAM,cAAA,GAAA,MAAA,cACH,YAAmC;EAMlC,MAAM,SADO,OAAO,YAAY,aAAa,QAJR,OACjC,CAAC;GAAE,IAAI;GAAM,OAAO,SAAS,WAAW;GAAQ,CAAC,GACjD,EAAE,CAE8D,GAAG,SACpD;AAEnB,MAAI,CAAC,SAAS,CAAC,MAAM,IAAI;AACvB,WAAQ,GAAG;AACX,YAAS,KAAK;AACd;;AAGF,UAAQ,MAAM,GAAG;AACjB,WAAS,MAAM,OAAO,SAAS,MAAM;IAEvC;EAAC;EAAM;EAAO;EAAS;EAAS,CACjC;AAED,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,QAAQ,CAAC,MACX,UAAS,MAAM;IAEhB;EAAC;EAAM;EAAO;EAAS,CAAC;CAG3B,MAAM,iBAAA,GAAA,MAAA,cACH,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,SAAA,GAAA,MAAA,gBACS;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
|
|
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,
|
|
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?] —
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m5kdev/frontend",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
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.
|
|
40
|
-
"@m5kdev/backend": "0.
|
|
39
|
+
"@m5kdev/config": "0.9.1",
|
|
40
|
+
"@m5kdev/backend": "0.9.1"
|
|
41
41
|
},
|
|
42
42
|
"exports": {
|
|
43
43
|
"./modules/auth/components/*": {
|