{"version":3,"file":"params.cjs","sources":["../../src/params.ts"],"sourcesContent":["import {create as createCore, ParamsCore} from \"./core\";\nimport {\n    AllTypedOptions,\n    BuildArg,\n    Dispatch,\n    FinalOptions,\n    InferValue,\n    ListOptions,\n    OptionsBuilder,\n    Params,\n    RequiredOptions,\n    Schema,\n    Serializer,\n    Setter, SetterTransformMethod,\n    UrlOptions,\n    Validator\n} from \"./types\";\nimport {camelCaseToKebab, getValue, useMemoOptions} from \"./utils\";\nimport {\n    booleanSerializer,\n    createListSerializer,\n    dateSerializer,\n    datetimeSerializer,\n    defaultDecoder,\n    defaultEncoder,\n    encodeParam,\n    numberSerializer,\n    stringSerializer\n} from \"./encoding\";\nimport {once} from \"lodash-es\";\nimport {useMemo} from \"react\";\nimport {batch} from \"@tanstack/react-store\";\n\n\ntype OptionsConfig = {\n    [key in keyof OptionsBuilder]?: unknown\n}\n\nconst typeBasedOptions: OptionsConfig = {\n    string: {\n        ...stringSerializer,\n    },\n    enum: {\n        ...stringSerializer,\n    },\n    number: {\n        ...numberSerializer,\n    },\n    boolean: {\n        ...booleanSerializer,\n    },\n    datetime: {\n        ...datetimeSerializer,\n    },\n    date: {\n        ...dateSerializer,\n    },\n}\n\nclass InternalBuilder {\n    state: RequiredOptions<unknown>\n    customSetter: SetterTransformMethod<unknown, unknown> | null\n\n    constructor(state: RequiredOptions<unknown>) {\n        this.state = state;\n        this.customSetter = null\n    }\n\n    withSerializer(serializer: Serializer<unknown>) {\n        this.state = {\n            ...this.state,\n            ...serializer,\n        }\n        return this;\n    }\n\n    validate(validator: Validator<unknown>) {\n        this.state = {\n            ...this.state,\n            ...validator,\n        }\n        return this;\n    }\n\n    withDefault(value: NonNullable<unknown>) {\n        this.state = {\n            ...this.state,\n            defaultValue: value,\n        }\n        return this;\n    }\n\n    withCustomSetter<SetRes>(transformer: SetterTransformMethod<unknown, SetRes>) {\n        this.customSetter = transformer;\n        return this;\n    }\n}\n\nconst createInternalBuilder = (key: keyof OptionsBuilder, value?: UrlOptions) => {\n    const options = typeBasedOptions[key] || {};\n\n    const listOptions = key === \"list\" ? createListSerializer(value as ListOptions<unknown>) : {}\n    const defaultSerializers = {\n        encode: defaultEncoder,\n        decode: defaultDecoder,\n    }\n\n    const state = {\n        onError: () => {\n        },\n        validate: () => true,\n        defaultValue: null,\n        updateType: \"replaceIn\",\n        ...defaultSerializers,\n        ...options,\n        ...(value || {}),\n        ...listOptions\n    } satisfies RequiredOptions<unknown>\n\n    return new InternalBuilder(state);\n}\n\nexport const p = new Proxy({} as OptionsBuilder, {\n    get(_target, prop: string) {\n        return (value?: UrlOptions) => {\n            const key = prop as keyof OptionsBuilder;\n            return createInternalBuilder(key, value);\n        };\n    },\n});\n\n\nconst getWithPrefix = (prefix: string | undefined, prop: string) => {\n    return prefix ? `${prefix}-${prop}` : prop;\n}\n\nconst buildSingle = <T extends AllTypedOptions>({builder, params, prop, globalOptions}:\n                                                {\n                                                    builder: InternalBuilder,\n                                                    params: ParamsCore,\n                                                    prop: string,\n                                                    globalOptions?: UrlOptions\n                                                }) => {\n    const {useParamSet, useParam} = params;\n    const {state, customSetter} = builder;\n    const typedOptions = state as RequiredOptions<T>;\n\n    const createSetter = (setter: Dispatch<Setter<T>>) => {\n        return customSetter ? customSetter({setter: setter as Dispatch<unknown>}) : setter;\n    }\n\n    return {\n        useSet: (options?: FinalOptions<T>) => {\n            const memoedOptions = useMemoOptions(typedOptions, globalOptions, options);\n            const paramName = getWithPrefix(memoedOptions.prefix, prop);\n            const setter = useParamSet(paramName, memoedOptions) as Dispatch<Setter<T>>\n            return useMemo(() => createSetter(setter), [setter])\n        },\n        use: (options?: FinalOptions<T>) => {\n            const memoedOptions = useMemoOptions(typedOptions, globalOptions, options);\n            const paramName = getWithPrefix(memoedOptions.prefix, prop);\n            const [res, setter] = useParam(paramName, memoedOptions);\n            const setterTransformed = useMemo(() => createSetter(setter), [setter])\n\n            return [\n                res,\n                setterTransformed,\n            ]\n        }\n    }\n}\n\nlet core: ParamsCore | null = null;\n\nconst init = once(() => {\n    core = createCore();\n});\n\nexport function create<T extends Schema>(schema: T, globalOptions?: UrlOptions): Params<T> {\n    init();\n    let internalGlobalOptions = globalOptions;\n\n    const proxy = new Proxy({} as Params<T>, {\n        get(_target, prop: string) {\n            if (prop === \"withOptions\") {\n                return (globalOptions: UrlOptions) => {\n                    internalGlobalOptions = {\n                        ...internalGlobalOptions,\n                        ...globalOptions,\n                    }\n                    return proxy;\n                }\n            }\n            if (prop === 'build') {\n                return (values: BuildArg<T>) => {\n                    const params = Object.entries(values).map(([key, value]) => {\n                        const schemaKey = camelCaseToKebab(key);\n                        const builder = schema[schemaKey] as unknown as InternalBuilder\n                        const {defaultValue, encode} = builder.state;\n                        if (value === getValue(defaultValue)) {\n                            return undefined\n                        }\n                        const encodedValue = encodeParam(value, encode);\n                        return `${key}=${encodedValue}`;\n                    }).filter(Boolean);\n                    return params.join(\"&\");\n                }\n            }\n            if (prop === 'batch') {\n                return (fn: () => void) => {\n                    const {api} = core!\n                    batch(() => {\n                        api.batch(fn);\n                    })\n                }\n            }\n            const schemaField = camelCaseToKebab(prop);\n            const builder = schema[schemaField] as unknown as InternalBuilder;\n\n            return buildSingle({\n                builder,\n                params: core!,\n                prop,\n                globalOptions: internalGlobalOptions,\n            })\n        }\n    });\n    return proxy;\n}\n\nexport function createSingle<T extends AllTypedOptions>(prop: string, definition: T): InferValue<T> {\n    init();\n    const builder = definition as unknown as InternalBuilder;\n    return buildSingle({\n        builder,\n        params: core!,\n        prop,\n    }) as unknown as InferValue<T>\n}"],"names":["stringSerializer","numberSerializer","booleanSerializer","datetimeSerializer","dateSerializer","createListSerializer","defaultEncoder","defaultDecoder","useMemoOptions","useMemo","once","createCore","globalOptions","camelCaseToKebab","builder","getValue","encodeParam","batch"],"mappings":"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"}