@lehnihon/bit-form 2.2.6 → 2.2.7
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/README.md +80 -24
- package/dist/angular/index.cjs +1 -1
- package/dist/angular/index.cjs.map +1 -1
- package/dist/angular/index.d.cts +18 -20
- package/dist/angular/index.d.ts +18 -20
- package/dist/angular/index.js +1 -1
- package/dist/angular/index.js.map +1 -1
- package/dist/array-controller-C1A5VKYd.d.cts +23 -0
- package/dist/array-controller-DtkmcnUr.d.ts +23 -0
- package/dist/{bus-B4zZmB9C.d.ts → bus-DgilLszS.d.ts} +83 -15
- package/dist/{bus-BeAeZwWu.d.cts → bus-rcUiufS7.d.cts} +83 -15
- package/dist/chunk-DIEE6LUO.js +2 -0
- package/dist/chunk-DIEE6LUO.js.map +1 -0
- package/dist/chunk-FUUQB4DV.cjs +2 -0
- package/dist/chunk-FUUQB4DV.cjs.map +1 -0
- package/dist/chunk-IV32WXCF.cjs +2 -0
- package/dist/chunk-IV32WXCF.cjs.map +1 -0
- package/dist/chunk-K5X37E3U.js +2 -0
- package/dist/chunk-K5X37E3U.js.map +1 -0
- package/dist/chunk-KWLLYQOL.cjs +2 -0
- package/dist/chunk-KWLLYQOL.cjs.map +1 -0
- package/dist/chunk-LIYZPSWM.js +2 -0
- package/dist/chunk-LIYZPSWM.js.map +1 -0
- package/dist/chunk-O5UPA33R.js +2 -0
- package/dist/chunk-O5UPA33R.js.map +1 -0
- package/dist/chunk-QAL6J5GQ.cjs +2 -0
- package/dist/chunk-QAL6J5GQ.cjs.map +1 -0
- package/dist/chunk-QKGTVKBU.cjs +2 -0
- package/dist/chunk-QKGTVKBU.cjs.map +1 -0
- package/dist/chunk-SA47B5OP.js +2 -0
- package/dist/chunk-SA47B5OP.js.map +1 -0
- package/dist/cli/index.cjs +22 -22
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +122 -0
- package/dist/core.d.ts +122 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/devtools/bridge.cjs +1 -1
- package/dist/devtools/bridge.cjs.map +1 -1
- package/dist/devtools/bridge.d.cts +4 -1
- package/dist/devtools/bridge.d.ts +4 -1
- package/dist/devtools/bridge.js +1 -1
- package/dist/devtools/bridge.js.map +1 -1
- package/dist/devtools/index.cjs +18 -18
- package/dist/devtools/index.cjs.map +1 -1
- package/dist/devtools/index.d.cts +26 -2
- package/dist/devtools/index.d.ts +26 -2
- package/dist/devtools/index.js +18 -18
- package/dist/devtools/index.js.map +1 -1
- package/dist/devtools/protocol.cjs +2 -0
- package/dist/devtools/protocol.cjs.map +1 -0
- package/dist/devtools/protocol.d.cts +54 -0
- package/dist/devtools/protocol.d.ts +54 -0
- package/dist/devtools/protocol.js +2 -0
- package/dist/devtools/protocol.js.map +1 -0
- package/dist/field-binding-Bi1g-D8X.d.ts +25 -0
- package/dist/field-binding-X5TkvfUt.d.cts +25 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -171
- package/dist/index.d.ts +64 -171
- package/dist/index.js +1 -1
- package/dist/mask.d.cts +2 -2
- package/dist/mask.d.ts +2 -2
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +8 -7
- package/dist/react/index.d.ts +8 -7
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-native/index.cjs +1 -1
- package/dist/react-native/index.cjs.map +1 -1
- package/dist/react-native/index.d.cts +7 -6
- package/dist/react-native/index.d.ts +7 -6
- package/dist/react-native/index.js +1 -1
- package/dist/react-native/index.js.map +1 -1
- package/dist/resolvers/index.cjs +1 -1
- package/dist/resolvers/index.cjs.map +1 -1
- package/dist/resolvers/index.d.cts +2 -2
- package/dist/resolvers/index.d.ts +2 -2
- package/dist/resolvers/index.js +1 -1
- package/dist/resolvers/joi.d.cts +2 -2
- package/dist/resolvers/joi.d.ts +2 -2
- package/dist/resolvers/yup.d.cts +2 -2
- package/dist/resolvers/yup.d.ts +2 -2
- package/dist/resolvers/zod.d.cts +2 -2
- package/dist/resolvers/zod.d.ts +2 -2
- package/dist/store-api-types-9ipdute1.d.ts +187 -0
- package/dist/store-api-types-B6_bPoVI.d.cts +187 -0
- package/dist/{types-D8DgIUhJ.d.cts → types-CUXh7PqD.d.cts} +1 -1
- package/dist/{types-D8DgIUhJ.d.ts → types-CUXh7PqD.d.ts} +1 -1
- package/dist/{use-bit-persist-Dk3fUrds.d.ts → use-bit-persist-Bc06fmqZ.d.ts} +12 -14
- package/dist/{use-bit-persist-D_gimC9A.d.cts → use-bit-persist-CIKFwtdM.d.cts} +12 -14
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +15 -18
- package/dist/vue/index.d.ts +15 -18
- package/dist/vue/index.js +1 -1
- package/dist/vue/index.js.map +1 -1
- package/package.json +20 -11
- package/dist/chunk-2CVKNPWX.js +0 -2
- package/dist/chunk-2CVKNPWX.js.map +0 -1
- package/dist/chunk-3EDD3V43.cjs +0 -2
- package/dist/chunk-3EDD3V43.cjs.map +0 -1
- package/dist/chunk-PX6WKENM.js +0 -2
- package/dist/chunk-PX6WKENM.js.map +0 -1
- package/dist/chunk-QWH2NBVB.js +0 -2
- package/dist/chunk-QWH2NBVB.js.map +0 -1
- package/dist/chunk-T3FR7D5V.js +0 -2
- package/dist/chunk-T3FR7D5V.js.map +0 -1
- package/dist/chunk-VQ7MK5VB.cjs +0 -2
- package/dist/chunk-VQ7MK5VB.cjs.map +0 -1
- package/dist/chunk-Y2ONHDRE.cjs +0 -2
- package/dist/chunk-Y2ONHDRE.cjs.map +0 -1
- package/dist/chunk-YCSWULEN.cjs +0 -2
- package/dist/chunk-YCSWULEN.cjs.map +0 -1
- package/dist/field-binding-BXw0Ku2c.d.cts +0 -12
- package/dist/field-binding-BXw0Ku2c.d.ts +0 -12
- package/dist/public-types-Cd9ai20P.d.cts +0 -97
- package/dist/public-types-DdZxD6Op.d.ts +0 -97
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/angular/provider.ts","../../src/angular/inject-bit-form.ts","../../src/angular/inject-bit-field.ts","../../src/angular/inject-bit-array.ts","../../src/angular/inject-bit-history.ts","../../src/angular/inject-bit-scope.ts","../../src/angular/inject-bit-steps.ts","../../src/angular/inject-bit-watch.ts","../../src/angular/inject-bit-upload.ts","../../src/angular/inject-bit-persist.ts"],"sourcesContent":["import { inject, InjectionToken, Provider } from \"@angular/core\";\nimport type { BitStoreApi, BitStoreHooksApi } from \"../core\";\nimport { resolveBitStoreForHooks } from \"../core\";\n\nexport const BIT_STORE_TOKEN = new InjectionToken<BitStoreHooksApi<any>>(\n \"BIT_STORE\",\n);\n\nexport function provideBitStore<T extends object>(\n store: BitStoreApi<T>,\n): Provider {\n return { provide: BIT_STORE_TOKEN, useValue: resolveBitStoreForHooks(store) };\n}\n\nexport function useBitStore<T extends object>() {\n const store = inject(BIT_STORE_TOKEN, { optional: true });\n\n if (!store) {\n throw new Error(\n \"BitForm: Não foi possível encontrar a BitStore. \" +\n 'Certifique-se de que você adicionou \"provideBitStore(store)\" nos providers do seu componente.',\n );\n }\n\n return store as BitStoreHooksApi<T>;\n}\n","import { signal, computed, inject, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport {\n createFormController,\n createStoreFormActions,\n} from \"../core/form-controller\";\nimport type { InjectBitFormResult } from \"./types\";\n\nexport function injectBitForm<T extends object>(): InjectBitFormResult<T> {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n const stateSignal = signal({\n isValid: store.getState().isValid,\n isSubmitting: store.getState().isSubmitting,\n isDirty: store.getState().isDirty,\n });\n const submitError = signal<Error | null>(null);\n const lastResponse = signal<unknown>(null);\n\n const sub = store.subscribeSelector(\n (state) => ({\n isValid: state.isValid,\n isSubmitting: state.isSubmitting,\n isDirty: state.isDirty,\n }),\n (nextState) => {\n stateSignal.set(nextState);\n },\n { paths: [\"isValid\", \"isSubmitting\", \"isDirty\"] },\n );\n\n destroyRef.onDestroy(() => sub());\n\n const isValid = computed(() => stateSignal().isValid);\n const isSubmitting = computed(() => stateSignal().isSubmitting);\n const isDirty = computed(() => stateSignal().isDirty);\n\n const controller = createFormController(\n store,\n {\n clearSubmissionState: () => {\n submitError.set(null);\n lastResponse.set(null);\n },\n setSubmissionResult: (result) => {\n lastResponse.set(result);\n },\n setSubmissionError: (error) => {\n submitError.set(error);\n },\n },\n { stopPropagation: true },\n );\n const actions = createStoreFormActions(store);\n\n const meta = {\n isValid,\n isDirty,\n isSubmitting,\n submitError: submitError.asReadonly(),\n lastResponse: lastResponse.asReadonly(),\n };\n\n return {\n // Metadata (grouped)\n meta,\n // Getters\n getValues: controller.getValues,\n getErrors: controller.getErrors,\n getTouched: controller.getTouched,\n getDirtyValues: controller.getDirtyValues,\n // Main actions (frequent use - flat)\n submit: controller.submit,\n onSubmit: controller.onSubmit,\n reset: controller.reset,\n ...actions,\n };\n}\n","import { inject, DestroyRef, computed, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport { BitPath, BitPathValue } from \"../core\";\nimport {\n createMaskedFieldController,\n subscribeFieldState,\n} from \"../core/field-controller\";\nimport { isBitFieldInputEventObject } from \"../core/mask/field-binding\";\nimport type {\n BitFieldInputEvent,\n InjectBitFieldMeta,\n InjectBitFieldResult,\n} from \"./types\";\n\nexport function injectBitField<\n TValue = any,\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): InjectBitFieldResult<TForm, P> {\n const store = inject(BIT_STORE_TOKEN);\n\n const stateSignal = signal(store.getFieldState(path));\n\n const unsubscribe = subscribeFieldState(store, path, (nextState) => {\n stateSignal.set(nextState);\n });\n\n inject(DestroyRef).onDestroy(() => {\n unsubscribe();\n if (store.unregisterField) {\n store.unregisterField(path as string);\n }\n });\n\n const value = computed(() => stateSignal().value as BitPathValue<TForm, P>);\n const rawError = computed(() => stateSignal().error);\n const touched = computed(() => stateSignal().touched);\n const error = computed(() => (touched() ? rawError() : undefined));\n\n const isDirty = computed(() => stateSignal().isDirty);\n\n const isValidating = computed(() => stateSignal().isValidating);\n\n const isHidden = computed(() => stateSignal().isHidden);\n\n const isRequired = computed(() => stateSignal().isRequired);\n\n const invalid = computed(() => touched() && !!rawError());\n\n const resolvedMask = store.resolveMask(path as string);\n const fieldController = createMaskedFieldController(\n store,\n path,\n resolvedMask,\n );\n\n const displayValue = computed(() => fieldController.displayValue(value()));\n\n const setValue = (\n val: BitPathValue<TForm, P> | string | number | null | undefined,\n ) => {\n fieldController.setValue(val);\n };\n\n const setBlur = () => fieldController.setBlur();\n\n const hasError = computed(() => !!rawError());\n\n const update = (e: BitFieldInputEvent) =>\n setValue(isBitFieldInputEventObject(e) ? (e.target?.value ?? null) : e);\n\n return {\n // Main handlers and values (flat)\n value,\n displayValue,\n setValue,\n setBlur,\n update,\n // Metadata (grouped)\n meta: {\n error,\n touched,\n invalid,\n isDirty,\n isValidating,\n isHidden,\n isRequired,\n hasError,\n },\n };\n}\n","import { DestroyRef, signal, computed, inject, untracked } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport {\n getDeepValue,\n BitArrayPath,\n BitPathValue,\n BitArrayItem,\n BitPath,\n} from \"../core\";\n\nexport function injectBitArray<\n TForm extends object = any,\n P extends BitArrayPath<TForm> = BitArrayPath<TForm>,\n>(path: P) {\n const store = inject(BIT_STORE_TOKEN);\n const destroyRef = inject(DestroyRef);\n\n const createId = (index?: number) =>\n store.config.idFactory({\n scope: \"array\",\n path: path as string,\n index,\n });\n\n const getRaw = () => {\n const val = getDeepValue(\n store.getState().values,\n path as string,\n ) as BitPathValue<TForm, P>;\n return Array.isArray(val)\n ? (val as BitArrayItem<BitPathValue<TForm, P>>[])\n : [];\n };\n\n const valuesSig = signal<BitArrayItem<BitPathValue<TForm, P>>[]>(getRaw());\n const idsSig = signal<string[]>(\n valuesSig().map((_, index) => createId(index)),\n );\n\n const unsub = store.subscribePath(path, (value) => {\n const next = Array.isArray(value)\n ? (value as BitArrayItem<BitPathValue<TForm, P>>[])\n : [];\n const ids = untracked(idsSig);\n valuesSig.set(next);\n\n if (next.length !== ids.length) {\n if (next.length > ids.length) {\n idsSig.set([\n ...ids,\n ...Array.from({ length: next.length - ids.length }, (_, i) =>\n createId(ids.length + i),\n ),\n ]);\n } else {\n idsSig.set(ids.slice(0, next.length));\n }\n }\n });\n\n destroyRef.onDestroy(() => {\n unsub();\n if (store.unregisterPrefix) store.unregisterPrefix(`${path as string}.`);\n });\n\n return {\n fields: computed(() =>\n valuesSig().map((v, i) => ({\n key: idsSig()[i] || `temp-${i}`,\n value: v,\n index: i,\n })),\n ),\n length: computed(() => valuesSig().length),\n append: (v: BitArrayItem<BitPathValue<TForm, P>>) => {\n idsSig.update((ids) => [...ids, createId(ids.length)]);\n store.pushItem(path, v);\n },\n prepend: (v: BitArrayItem<BitPathValue<TForm, P>>) => {\n idsSig.update((ids) => [createId(0), ...ids]);\n store.prependItem(path, v);\n },\n remove: (i: number) => {\n idsSig.update((ids) => ids.filter((_, idx) => idx !== i));\n store.removeItem(path, i);\n },\n insert: (index: number, v: BitArrayItem<BitPathValue<TForm, P>>) => {\n idsSig.update((ids) => {\n const c = [...ids];\n c.splice(index, 0, createId(index));\n return c;\n });\n store.insertItem(path, index, v);\n },\n swap: (a: number, b: number) => {\n idsSig.update((ids) => {\n const c = [...ids];\n [c[a], c[b]] = [c[b], c[a]];\n return c;\n });\n store.swapItems(path, a, b);\n },\n move: (f: number, t: number) => {\n idsSig.update((ids) => {\n const c = [...ids];\n const [it] = c.splice(f, 1);\n c.splice(t, 0, it);\n return c;\n });\n store.moveItem(path, f, t);\n },\n replace: (items: BitArrayItem<BitPathValue<TForm, P>>[]) => {\n idsSig.set(items.map((_, index) => createId(index)));\n store.setField(\n path as unknown as BitPath<TForm>,\n items as unknown as BitPathValue<TForm, BitPath<TForm>>,\n );\n },\n clear: () => {\n idsSig.set([]);\n store.setField(\n path as unknown as BitPath<TForm>,\n [] as unknown as BitPathValue<TForm, BitPath<TForm>>,\n );\n },\n };\n}\n","import { computed, DestroyRef, inject, signal } from \"@angular/core\";\nimport { isHistoryMetaEqual } from \"../core/history-status\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitHistoryResult } from \"./types\";\n\nexport function injectBitHistory<\n T extends object = any,\n>(): InjectBitHistoryResult {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n\n const meta = signal(store.getHistoryMetadata());\n\n const sub = store.subscribe(() => {\n const nextMeta = store.getHistoryMetadata();\n if (!isHistoryMetaEqual(meta(), nextMeta)) {\n meta.set(nextMeta);\n }\n });\n\n destroyRef.onDestroy(() => sub());\n\n return {\n canUndo: computed(() => meta().canUndo),\n canRedo: computed(() => meta().canRedo),\n historyIndex: computed(() => meta().historyIndex),\n historySize: computed(() => meta().historySize),\n undo: () => store.undo(),\n redo: () => store.redo(),\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport {\n getScopeSubscriptionPaths,\n isScopeStatusEqual,\n} from \"../core/scope-status\";\nimport { useBitStore } from \"./provider\";\n\nexport type { ScopeStatus, ValidateScopeResult };\n\nexport function injectBitScope(scopeName: string) {\n const store = useBitStore();\n const scopeFields = store.getScopeFields(scopeName);\n const initialStatus = store.getStepStatus(scopeName);\n\n const status = signal<ScopeStatus>(initialStatus);\n\n const unsubscribe = store.subscribeSelector(\n (state) => ({ errors: state.errors, isDirty: state.isDirty }),\n () => {\n const newStatus = store.getStepStatus(scopeName);\n const current = status();\n if (!isScopeStatusEqual(current, newStatus)) {\n status.set(newStatus);\n }\n },\n { paths: getScopeSubscriptionPaths(scopeFields) },\n );\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.getStepErrors(scopeName);\n\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n scopeName,\n status,\n errors,\n validate,\n getErrors,\n isValid,\n isDirty,\n unsubscribe,\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport {\n getScopeSubscriptionPaths,\n isScopeStatusEqual,\n} from \"../core/scope-status\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitStepsResult } from \"./types\";\n\nexport function injectBitSteps(scopeNames: string[]): InjectBitStepsResult {\n const store = useBitStore();\n const stepIndex = signal(0);\n\n const scope = computed(() => scopeNames[stepIndex()] ?? \"\");\n\n const getCurrentScope = () => scopeNames[stepIndex()] ?? \"\";\n const status = signal<ScopeStatus>(store.getStepStatus(getCurrentScope()));\n\n const updateStatus = () => {\n const scopeName = getCurrentScope();\n const newStatus = store.getStepStatus(scopeName);\n const current = status();\n if (!isScopeStatusEqual(current, newStatus)) {\n status.set(newStatus);\n }\n };\n\n const unsubscribe = store.subscribeSelector(\n (state) => ({ errors: state.errors, isDirty: state.isDirty }),\n updateStatus,\n {\n paths: getScopeSubscriptionPaths(store.getScopeFields(getCurrentScope())),\n },\n );\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const scopeName = getCurrentScope();\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.getStepErrors(getCurrentScope());\n\n const next = async (): Promise<boolean> => {\n const scopeName = getCurrentScope();\n\n const scopeFields = store.getScopeFields(scopeName);\n if (store.hasValidationsInProgress(scopeFields)) {\n return false;\n }\n\n const valid = await store.validate({ scope: scopeName });\n if (valid) {\n const newIndex = Math.min(stepIndex() + 1, scopeNames.length - 1);\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n } else {\n const errors = store.getStepErrors(scopeName);\n const pathsWithErrors = Object.keys(errors);\n if (pathsWithErrors.length > 0) {\n store.markFieldsTouched(pathsWithErrors);\n }\n }\n return valid;\n };\n\n const prev = () => {\n const newIndex = Math.max(stepIndex() - 1, 0);\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n };\n\n const goTo = (targetStep: number) => {\n const newIndex = Math.max(\n 0,\n Math.min(targetStep - 1, scopeNames.length - 1),\n );\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n };\n\n const step = computed(() => stepIndex() + 1);\n const isFirst = computed(() => stepIndex() === 0);\n const isLast = computed(() => stepIndex() >= scopeNames.length - 1);\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n step,\n stepIndex,\n scope,\n next,\n prev,\n goTo,\n isFirst,\n isLast,\n status,\n errors,\n isValid,\n isDirty,\n validate,\n getErrors,\n };\n}\n","import { DestroyRef, signal, Signal, inject } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport {\n getDeepValue,\n deepEqual,\n BitPath,\n BitPathValue,\n} from \"../core\";\n\nexport function injectBitWatch<\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): Signal<BitPathValue<TForm, P>> {\n const store = useBitStore<TForm>();\n const destroyRef = inject(DestroyRef);\n const valueSig = signal<BitPathValue<TForm, P>>(\n getDeepValue(store.getState().values, path as string) as BitPathValue<\n TForm,\n P\n >,\n { equal: deepEqual },\n );\n\n const unsub = store.watch(path, (v) => {\n valueSig.set(v as BitPathValue<TForm, P>);\n });\n\n destroyRef.onDestroy(unsub);\n\n return valueSig.asReadonly();\n}\n","/**\n * Angular Dependency Injection for File Upload\n *\n * Minimal upload API integrated with global field validation lifecycle.\n */\n\nimport { computed, inject, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport { injectBitField } from \"./inject-bit-field\";\nimport { BitUploadFn, BitDeleteUploadFn } from \"../core\";\nimport { createUploadHandler, createRemoveHandler } from \"../core/adapters\";\nimport type { InjectBitUploadResult } from \"./types\";\n\nexport function injectBitUpload(\n fieldPath: string,\n uploadFn: BitUploadFn,\n deleteFile?: BitDeleteUploadFn,\n): InjectBitUploadResult {\n const store = inject(BIT_STORE_TOKEN);\n const field = injectBitField(fieldPath);\n let uploadKey: string | null = null;\n const isUploading = signal(false);\n\n const kernelCallbacks = {\n setLoading: (val: boolean) => isUploading.set(val),\n setError: (path: string, msg: string | undefined) =>\n store.setError(path, msg),\n setValue: (val: string | null) => field.setValue(val),\n getUploadKey: () => uploadKey,\n setUploadKey: (key: string | null) => {\n uploadKey = key;\n },\n };\n\n const upload = createUploadHandler(fieldPath, uploadFn, kernelCallbacks);\n const remove = createRemoveHandler(fieldPath, deleteFile, kernelCallbacks);\n\n return {\n value: computed(() => field.value()),\n setValue: field.setValue,\n error: computed(() => field.meta.error()),\n isValidating: computed(() => !!field.meta.isValidating() || isUploading()),\n upload,\n remove,\n };\n}\n","import { computed, inject, signal, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitPersistResult } from \"./types\";\n\nexport function injectBitPersist<\n T extends object = any,\n>(): InjectBitPersistResult {\n const store = useBitStore<T>();\n const persist = signal(store.getPersistMetadata());\n\n const unsubscribe = store.subscribeSelector(\n (state) => state.persist,\n (nextPersist) => {\n persist.set(nextPersist);\n },\n { paths: [\"persist\"] },\n );\n\n try {\n inject(DestroyRef).onDestroy(() => unsubscribe());\n } catch {}\n\n const restore = async (): Promise<boolean> => {\n return store.restorePersisted();\n };\n\n const save = async (): Promise<void> => {\n await store.forceSave();\n };\n\n const clear = async (): Promise<void> => {\n await store.clearPersisted();\n };\n\n return {\n restore,\n save,\n clear,\n meta: {\n isSaving: computed(() => persist().isSaving),\n isRestoring: computed(() => persist().isRestoring),\n error: computed(() => persist().error),\n },\n };\n}\n"],"mappings":"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","names":["inject","InjectionToken","BIT_STORE_TOKEN","InjectionToken","provideBitStore","store","resolveBitStoreForHooks","useBitStore","inject","signal","computed","inject","DestroyRef","injectBitForm","store","useBitStore","destroyRef","inject","DestroyRef","stateSignal","signal","submitError","lastResponse","sub","state","nextState","isValid","computed","isSubmitting","isDirty","controller","createFormController","result","error","actions","createStoreFormActions","inject","DestroyRef","computed","signal","injectBitField","path","store","inject","BIT_STORE_TOKEN","stateSignal","signal","unsubscribe","subscribeFieldState","nextState","DestroyRef","value","computed","rawError","touched","error","isDirty","isValidating","isHidden","isRequired","invalid","resolvedMask","fieldController","createMaskedFieldController","displayValue","setValue","val","setBlur","hasError","e","isBitFieldInputEventObject","DestroyRef","signal","computed","inject","untracked","injectBitArray","path","store","inject","BIT_STORE_TOKEN","destroyRef","DestroyRef","createId","index","valuesSig","signal","val","getDeepValue","idsSig","_","unsub","value","next","ids","untracked","i","computed","v","idx","c","a","b","f","t","it","items","computed","DestroyRef","inject","signal","injectBitHistory","store","useBitStore","destroyRef","inject","DestroyRef","meta","signal","sub","nextMeta","isHistoryMetaEqual","computed","signal","computed","DestroyRef","inject","injectBitScope","scopeName","store","useBitStore","scopeFields","initialStatus","status","signal","unsubscribe","state","newStatus","current","isScopeStatusEqual","getScopeSubscriptionPaths","inject","DestroyRef","validate","valid","errors","getErrors","isValid","computed","isDirty","signal","computed","DestroyRef","inject","injectBitSteps","scopeNames","store","useBitStore","stepIndex","signal","scope","computed","getCurrentScope","status","updateStatus","scopeName","newStatus","current","isScopeStatusEqual","unsubscribe","state","getScopeSubscriptionPaths","inject","DestroyRef","validate","valid","errors","getErrors","next","scopeFields","newIndex","pathsWithErrors","prev","goTo","targetStep","step","isFirst","isLast","isValid","isDirty","DestroyRef","signal","inject","injectBitWatch","path","store","useBitStore","destroyRef","inject","DestroyRef","valueSig","signal","getDeepValue","deepEqual","unsub","v","computed","inject","signal","injectBitUpload","fieldPath","uploadFn","deleteFile","store","inject","BIT_STORE_TOKEN","field","injectBitField","uploadKey","isUploading","signal","kernelCallbacks","val","path","msg","key","upload","createUploadHandler","remove","createRemoveHandler","computed","computed","inject","signal","DestroyRef","injectBitPersist","store","useBitStore","persist","signal","unsubscribe","state","nextPersist","inject","DestroyRef","computed"]}
|
|
1
|
+
{"version":3,"sources":["../../src/angular/provider.ts","../../src/angular/inject-bit-form.ts","../../src/angular/inject-bit-field.ts","../../src/angular/inject-bit-array.ts","../../src/angular/inject-bit-history.ts","../../src/angular/inject-bit-scope.ts","../../src/angular/inject-bit-steps.ts","../../src/angular/inject-bit-watch.ts","../../src/angular/inject-bit-upload.ts","../../src/angular/inject-bit-persist.ts"],"sourcesContent":["import { inject, InjectionToken, Provider } from \"@angular/core\";\nimport type { BitFormBindingApi, BitStoreHooksApi } from \"../core\";\nimport { resolveBitStoreForHooks } from \"../core\";\n\nexport const BIT_STORE_TOKEN = new InjectionToken<BitFormBindingApi<any>>(\n \"BIT_STORE\",\n);\n\nexport function provideBitStore<T extends object>(\n store: BitStoreHooksApi<T>,\n): Provider {\n return { provide: BIT_STORE_TOKEN, useValue: resolveBitStoreForHooks(store) };\n}\n\nexport function useBitStore<T extends object>() {\n const store = inject(BIT_STORE_TOKEN, { optional: true });\n\n if (!store) {\n throw new Error(\n \"BitForm: Não foi possível encontrar a BitStore. \" +\n 'Certifique-se de que você adicionou \"provideBitStore(store)\" nos providers do seu componente.',\n );\n }\n\n return store as BitFormBindingApi<T>;\n}\n","import { signal, computed, inject, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport { createFrameworkFormBinding, observeFormMetaSnapshot } from \"../core\";\nimport type { InjectBitFormResult } from \"./types\";\n\nexport function injectBitForm<T extends object>(): InjectBitFormResult<T> {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n const stateSignal = signal({\n isValid: true,\n isDirty: false,\n isSubmitting: false,\n });\n const submitError = signal<Error | null>(null);\n const lastResponse = signal<unknown>(null);\n\n const sub = observeFormMetaSnapshot(store, (nextMeta) => {\n stateSignal.set(nextMeta);\n });\n\n destroyRef.onDestroy(() => sub());\n\n const isValid = computed(() => stateSignal().isValid);\n const isSubmitting = computed(() => stateSignal().isSubmitting);\n const isDirty = computed(() => stateSignal().isDirty);\n\n const { controller, actions } = createFrameworkFormBinding(\n store,\n {\n clearSubmissionState: () => {\n submitError.set(null);\n lastResponse.set(null);\n },\n setSubmissionResult: (result) => {\n lastResponse.set(result);\n },\n setSubmissionError: (error) => {\n submitError.set(error);\n },\n },\n { stopPropagation: true },\n );\n\n const meta = {\n isValid,\n isDirty,\n isSubmitting,\n submitError: submitError.asReadonly(),\n lastResponse: lastResponse.asReadonly(),\n };\n\n return {\n // Metadata (grouped)\n meta,\n // Getters\n getValues: controller.getValues,\n getErrors: controller.getErrors,\n getTouched: controller.getTouched,\n getDirtyValues: controller.getDirtyValues,\n // Main actions (frequent use - flat)\n submit: controller.submit,\n onSubmit: controller.onSubmit,\n reset: controller.reset,\n ...actions,\n };\n}\n","import { inject, DestroyRef, computed, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport {\n BitPath,\n BitPathValue,\n cleanupRegisteredField,\n createFrameworkMaskedFieldBinding,\n deriveFieldMeta,\n isBitFieldInputEventObject,\n subscribeFieldState,\n} from \"../core\";\nimport type {\n BitFieldInputEvent,\n InjectBitFieldMeta,\n InjectBitFieldResult,\n} from \"./types\";\n\nexport function injectBitField<\n TValue = any,\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): InjectBitFieldResult<TForm, P> {\n const store = inject(BIT_STORE_TOKEN);\n\n const stateSignal = signal(store.getFieldState(path));\n\n const unsubscribe = subscribeFieldState(store, path, (nextState) => {\n stateSignal.set(nextState);\n });\n\n inject(DestroyRef).onDestroy(() => {\n unsubscribe();\n cleanupRegisteredField(store, path as string);\n });\n\n const value = computed(() => stateSignal().value as BitPathValue<TForm, P>);\n const metaState = computed(() => deriveFieldMeta(stateSignal()));\n const error = computed(() => metaState().error);\n const touched = computed(() => metaState().touched);\n const invalid = computed(() => metaState().invalid);\n const isDirty = computed(() => metaState().isDirty);\n const isValidating = computed(() => metaState().isValidating);\n const isHidden = computed(() => metaState().isHidden);\n const isRequired = computed(() => metaState().isRequired);\n\n const { fieldController } = createFrameworkMaskedFieldBinding(store, path);\n\n const displayValue = computed(() => fieldController.displayValue(value()));\n\n const setValue = (\n val: BitPathValue<TForm, P> | string | number | null | undefined,\n ) => {\n fieldController.setValue(val);\n };\n\n const setBlur = () => fieldController.setBlur();\n\n const hasError = computed(() => metaState().hasError);\n\n const update = (e: BitFieldInputEvent) =>\n setValue(isBitFieldInputEventObject(e) ? (e.target?.value ?? null) : e);\n\n return {\n // Main handlers and values (flat)\n value,\n displayValue,\n setValue,\n setBlur,\n update,\n // Metadata (grouped)\n meta: {\n error,\n touched,\n invalid,\n isDirty,\n isValidating,\n isHidden,\n isRequired,\n hasError,\n },\n };\n}\n","import { DestroyRef, signal, computed, inject } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport {\n createArrayBindingController,\n BitArrayPath,\n BitPathValue,\n BitArrayItem,\n cleanupRegisteredPrefix,\n} from \"../core\";\n\nexport function injectBitArray<\n TForm extends object = any,\n P extends BitArrayPath<TForm> = BitArrayPath<TForm>,\n>(path: P) {\n const store = inject(BIT_STORE_TOKEN);\n const destroyRef = inject(DestroyRef);\n const controller = createArrayBindingController<TForm, P>(store, path);\n\n const valuesSig = signal<BitArrayItem<BitPathValue<TForm, P>>[]>(\n controller.readItems(),\n );\n\n const unsub = store.subscribePath(path, () => {\n valuesSig.set(controller.readItems());\n });\n\n destroyRef.onDestroy(() => {\n unsub();\n cleanupRegisteredPrefix(store, `${path as string}.`);\n });\n\n return {\n fields: computed(() => controller.getFields(valuesSig())),\n length: computed(() => valuesSig().length),\n append: controller.append,\n prepend: controller.prepend,\n remove: controller.remove,\n insert: controller.insert,\n swap: controller.swap,\n move: controller.move,\n replace: controller.replace,\n clear: controller.clear,\n };\n}\n","import { computed, DestroyRef, inject, signal } from \"@angular/core\";\nimport { observeHistoryMetaSnapshot, readHistoryMetaSnapshot } from \"../core\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitHistoryResult } from \"./types\";\n\nexport function injectBitHistory<\n T extends object = any,\n>(): InjectBitHistoryResult {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n\n const meta = signal(readHistoryMetaSnapshot(store));\n\n const sub = observeHistoryMetaSnapshot(store, (nextMeta) => {\n meta.set(nextMeta);\n });\n\n destroyRef.onDestroy(() => sub());\n\n return {\n canUndo: computed(() => meta().canUndo),\n canRedo: computed(() => meta().canRedo),\n historyIndex: computed(() => meta().historyIndex),\n historySize: computed(() => meta().historySize),\n undo: () => store.undo(),\n redo: () => store.redo(),\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { observeScopeStatusSnapshot } from \"../core\";\nimport { useBitStore } from \"./provider\";\n\nexport type { ScopeStatus, ValidateScopeResult };\n\nexport function injectBitScope(scopeName: string) {\n const store = useBitStore();\n const initialStatus = store.getStepStatus(scopeName);\n\n const status = signal<ScopeStatus>(initialStatus);\n\n const unsubscribe = observeScopeStatusSnapshot(\n store,\n scopeName,\n (nextStatus) => {\n status.set(nextStatus);\n },\n );\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.getStepErrors(scopeName);\n\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n scopeName,\n status,\n errors,\n validate,\n getErrors,\n isValid,\n isDirty,\n unsubscribe,\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { isScopeStatusEqual } from \"../core\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitStepsResult } from \"./types\";\n\nexport function injectBitSteps(scopeNames: string[]): InjectBitStepsResult {\n const store = useBitStore();\n const stepIndex = signal(0);\n\n const scope = computed(() => scopeNames[stepIndex()] ?? \"\");\n\n const getCurrentScope = () => scopeNames[stepIndex()] ?? \"\";\n const status = signal<ScopeStatus>(store.getStepStatus(getCurrentScope()));\n\n const updateStatus = () => {\n const scopeName = getCurrentScope();\n const newStatus = store.getStepStatus(scopeName);\n const current = status();\n if (!isScopeStatusEqual(current, newStatus)) {\n status.set(newStatus);\n }\n };\n\n let unsubscribe = store.subscribeScopeStatus(getCurrentScope(), updateStatus);\n\n const rebindScopeSubscription = () => {\n unsubscribe();\n unsubscribe = store.subscribeScopeStatus(getCurrentScope(), updateStatus);\n };\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const scopeName = getCurrentScope();\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.getStepErrors(getCurrentScope());\n\n const next = async (): Promise<boolean> => {\n const scopeName = getCurrentScope();\n\n const scopeFields = store.getScopeFields(scopeName);\n if (store.hasValidationsInProgress(scopeFields)) {\n return false;\n }\n\n const valid = await store.validate({ scope: scopeName });\n if (valid) {\n const newIndex = Math.min(stepIndex() + 1, scopeNames.length - 1);\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n rebindScopeSubscription();\n } else {\n const errors = store.getStepErrors(scopeName);\n const pathsWithErrors = Object.keys(errors);\n if (pathsWithErrors.length > 0) {\n store.markFieldsTouched(pathsWithErrors);\n }\n }\n return valid;\n };\n\n const prev = () => {\n const newIndex = Math.max(stepIndex() - 1, 0);\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n rebindScopeSubscription();\n };\n\n const goTo = (targetStep: number) => {\n const newIndex = Math.max(\n 0,\n Math.min(targetStep - 1, scopeNames.length - 1),\n );\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n rebindScopeSubscription();\n };\n\n const step = computed(() => stepIndex() + 1);\n const isFirst = computed(() => stepIndex() === 0);\n const isLast = computed(() => stepIndex() >= scopeNames.length - 1);\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n step,\n stepIndex,\n scope,\n next,\n prev,\n goTo,\n isFirst,\n isLast,\n status,\n errors,\n isValid,\n isDirty,\n validate,\n getErrors,\n };\n}\n","import { DestroyRef, signal, Signal, inject } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport { getDeepValue, valueEqual, BitPath, BitPathValue } from \"../core\";\n\nexport function injectBitWatch<\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): Signal<BitPathValue<TForm, P>> {\n const store = useBitStore<TForm>();\n const destroyRef = inject(DestroyRef);\n const valueSig = signal<BitPathValue<TForm, P>>(\n getDeepValue(store.getState().values, path as string) as BitPathValue<\n TForm,\n P\n >,\n { equal: valueEqual },\n );\n\n const unsub = store.subscribePath(path, (v) => {\n valueSig.set(v as BitPathValue<TForm, P>);\n });\n\n destroyRef.onDestroy(unsub);\n\n return valueSig.asReadonly();\n}\n","/**\n * Angular Dependency Injection for File Upload\n *\n * Minimal upload API integrated with global field validation lifecycle.\n */\n\nimport { computed, inject, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport { injectBitField } from \"./inject-bit-field\";\nimport { BitUploadFn, BitDeleteUploadFn } from \"../core\";\nimport { createUploadHandler, createRemoveHandler } from \"../core/adapters\";\nimport type { InjectBitUploadResult } from \"./types\";\n\nexport function injectBitUpload(\n fieldPath: string,\n uploadFn: BitUploadFn,\n deleteFile?: BitDeleteUploadFn,\n): InjectBitUploadResult {\n const store = inject(BIT_STORE_TOKEN);\n const field = injectBitField(fieldPath);\n let uploadKey: string | null = null;\n const isUploading = signal(false);\n\n const kernelCallbacks = {\n setLoading: (val: boolean) => isUploading.set(val),\n setError: (path: string, msg: string | undefined) =>\n store.setError(path, msg),\n setValue: (val: string | null) => field.setValue(val),\n getUploadKey: () => uploadKey,\n setUploadKey: (key: string | null) => {\n uploadKey = key;\n },\n };\n\n const upload = createUploadHandler(fieldPath, uploadFn, kernelCallbacks);\n const remove = createRemoveHandler(fieldPath, deleteFile, kernelCallbacks);\n\n return {\n value: computed(() => field.value()),\n setValue: field.setValue,\n error: computed(() => field.meta.error()),\n isValidating: computed(() => !!field.meta.isValidating() || isUploading()),\n upload,\n remove,\n };\n}\n","import { computed, inject, signal, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport { observePersistMetaSnapshot } from \"../core\";\nimport type { InjectBitPersistResult } from \"./types\";\n\nexport function injectBitPersist<\n T extends object = any,\n>(): InjectBitPersistResult {\n const store = useBitStore<T>();\n const persist = signal(store.getPersistMetadata());\n\n const unsubscribe = observePersistMetaSnapshot(store, (nextPersist) => {\n persist.set(nextPersist);\n });\n\n try {\n inject(DestroyRef).onDestroy(() => unsubscribe());\n } catch {}\n\n const restore = async (): Promise<boolean> => {\n return store.restorePersisted();\n };\n\n const save = async (): Promise<void> => {\n await store.forceSave();\n };\n\n const clear = async (): Promise<void> => {\n await store.clearPersisted();\n };\n\n return {\n restore,\n save,\n clear,\n meta: {\n isSaving: computed(() => persist().isSaving),\n isRestoring: computed(() => persist().isRestoring),\n error: computed(() => persist().error),\n },\n };\n}\n"],"mappings":"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","names":["inject","InjectionToken","BIT_STORE_TOKEN","InjectionToken","provideBitStore","store","resolveBitStoreForHooks","useBitStore","inject","signal","computed","inject","DestroyRef","injectBitForm","store","useBitStore","destroyRef","inject","DestroyRef","stateSignal","signal","submitError","lastResponse","sub","observeFormMetaSnapshot","nextMeta","isValid","computed","isSubmitting","isDirty","controller","actions","createFrameworkFormBinding","result","error","inject","DestroyRef","computed","signal","injectBitField","path","store","inject","BIT_STORE_TOKEN","stateSignal","signal","unsubscribe","subscribeFieldState","nextState","DestroyRef","cleanupRegisteredField","value","computed","metaState","deriveFieldMeta","error","touched","invalid","isDirty","isValidating","isHidden","isRequired","fieldController","createFrameworkMaskedFieldBinding","displayValue","setValue","val","setBlur","hasError","e","isBitFieldInputEventObject","DestroyRef","signal","computed","inject","injectBitArray","path","store","inject","BIT_STORE_TOKEN","destroyRef","DestroyRef","controller","createArrayBindingController","valuesSig","signal","unsub","cleanupRegisteredPrefix","computed","computed","DestroyRef","inject","signal","injectBitHistory","store","useBitStore","destroyRef","inject","DestroyRef","meta","signal","readHistoryMetaSnapshot","sub","observeHistoryMetaSnapshot","nextMeta","computed","signal","computed","DestroyRef","inject","injectBitScope","scopeName","store","useBitStore","initialStatus","status","signal","unsubscribe","observeScopeStatusSnapshot","nextStatus","inject","DestroyRef","validate","valid","errors","getErrors","isValid","computed","isDirty","signal","computed","DestroyRef","inject","injectBitSteps","scopeNames","store","useBitStore","stepIndex","signal","scope","computed","getCurrentScope","status","updateStatus","scopeName","newStatus","current","isScopeStatusEqual","unsubscribe","rebindScopeSubscription","inject","DestroyRef","validate","valid","errors","getErrors","next","scopeFields","newIndex","pathsWithErrors","prev","goTo","targetStep","step","isFirst","isLast","isValid","isDirty","DestroyRef","signal","inject","injectBitWatch","path","store","useBitStore","destroyRef","inject","DestroyRef","valueSig","signal","getDeepValue","valueEqual","unsub","v","computed","inject","signal","injectBitUpload","fieldPath","uploadFn","deleteFile","store","inject","BIT_STORE_TOKEN","field","injectBitField","uploadKey","isUploading","signal","kernelCallbacks","val","path","msg","key","upload","createUploadHandler","remove","createRemoveHandler","computed","computed","inject","signal","DestroyRef","injectBitPersist","store","useBitStore","persist","signal","unsubscribe","observePersistMetaSnapshot","nextPersist","inject","DestroyRef","computed"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { B as BitArrayPath, a as BitArrayItem, b as BitPathValue } from './bus-rcUiufS7.cjs';
|
|
2
|
+
import { B as BitArrayBindingApi } from './store-api-types-B6_bPoVI.cjs';
|
|
3
|
+
|
|
4
|
+
interface BitArrayBindingField<TItem> {
|
|
5
|
+
key: string;
|
|
6
|
+
value: TItem;
|
|
7
|
+
index: number;
|
|
8
|
+
}
|
|
9
|
+
interface BitArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>> {
|
|
10
|
+
readItems(): BitArrayItem<BitPathValue<TForm, P>>[];
|
|
11
|
+
getFields(items: BitArrayItem<BitPathValue<TForm, P>>[]): BitArrayBindingField<BitArrayItem<BitPathValue<TForm, P>>>[];
|
|
12
|
+
append(value: BitArrayItem<BitPathValue<TForm, P>>): void;
|
|
13
|
+
prepend(value: BitArrayItem<BitPathValue<TForm, P>>): void;
|
|
14
|
+
insert(index: number, value: BitArrayItem<BitPathValue<TForm, P>>): void;
|
|
15
|
+
remove(index: number): void;
|
|
16
|
+
move(from: number, to: number): void;
|
|
17
|
+
swap(indexA: number, indexB: number): void;
|
|
18
|
+
replace(items: BitArrayItem<BitPathValue<TForm, P>>[]): void;
|
|
19
|
+
clear(): void;
|
|
20
|
+
}
|
|
21
|
+
declare function createArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>>(store: BitArrayBindingApi<TForm>, path: P): BitArrayBindingController<TForm, P>;
|
|
22
|
+
|
|
23
|
+
export { type BitArrayBindingField as B, type BitArrayBindingController as a, createArrayBindingController as c };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { B as BitArrayPath, a as BitArrayItem, b as BitPathValue } from './bus-DgilLszS.js';
|
|
2
|
+
import { B as BitArrayBindingApi } from './store-api-types-9ipdute1.js';
|
|
3
|
+
|
|
4
|
+
interface BitArrayBindingField<TItem> {
|
|
5
|
+
key: string;
|
|
6
|
+
value: TItem;
|
|
7
|
+
index: number;
|
|
8
|
+
}
|
|
9
|
+
interface BitArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>> {
|
|
10
|
+
readItems(): BitArrayItem<BitPathValue<TForm, P>>[];
|
|
11
|
+
getFields(items: BitArrayItem<BitPathValue<TForm, P>>[]): BitArrayBindingField<BitArrayItem<BitPathValue<TForm, P>>>[];
|
|
12
|
+
append(value: BitArrayItem<BitPathValue<TForm, P>>): void;
|
|
13
|
+
prepend(value: BitArrayItem<BitPathValue<TForm, P>>): void;
|
|
14
|
+
insert(index: number, value: BitArrayItem<BitPathValue<TForm, P>>): void;
|
|
15
|
+
remove(index: number): void;
|
|
16
|
+
move(from: number, to: number): void;
|
|
17
|
+
swap(indexA: number, indexB: number): void;
|
|
18
|
+
replace(items: BitArrayItem<BitPathValue<TForm, P>>[]): void;
|
|
19
|
+
clear(): void;
|
|
20
|
+
}
|
|
21
|
+
declare function createArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>>(store: BitArrayBindingApi<TForm>, path: P): BitArrayBindingController<TForm, P>;
|
|
22
|
+
|
|
23
|
+
export { type BitArrayBindingField as B, type BitArrayBindingController as a, createArrayBindingController as c };
|
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
import { B as BitMask,
|
|
1
|
+
import { B as BitMask, b as BitMaskName } from './types-CUXh7PqD.js';
|
|
2
2
|
|
|
3
|
+
type BitBusListener<T extends object = any> = (storeId: string, newState: BitState<T>) => void;
|
|
4
|
+
interface BitFormGlobal {
|
|
5
|
+
stores: Record<string, unknown>;
|
|
6
|
+
listeners: Set<BitBusListener>;
|
|
7
|
+
dispatch: (storeId: string, state: BitState<any>) => void;
|
|
8
|
+
subscribe: (fn: BitBusListener) => () => void;
|
|
9
|
+
}
|
|
10
|
+
/** Alias for {@link BitFormGlobal}. Prefer this name in user-facing APIs. */
|
|
11
|
+
type BitBus = BitFormGlobal;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable scheduler used for validation debounce.
|
|
15
|
+
* Replace the default (setTimeout-based) with a framework-aware scheduler
|
|
16
|
+
* to integrate with React's concurrent mode, Vue's nextTick, etc.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // React concurrent mode integration:
|
|
20
|
+
* const scheduler: BitScheduler = {
|
|
21
|
+
* schedule: (fn, delay) => {
|
|
22
|
+
* const id = setTimeout(() => startTransition(fn), delay);
|
|
23
|
+
* return () => clearTimeout(id);
|
|
24
|
+
* },
|
|
25
|
+
* };
|
|
26
|
+
*/
|
|
27
|
+
interface BitScheduler {
|
|
28
|
+
/**
|
|
29
|
+
* Schedule `fn` to run after `delayMs` milliseconds.
|
|
30
|
+
* Must return a cleanup function that cancels the scheduled call.
|
|
31
|
+
*/
|
|
32
|
+
schedule(fn: () => void, delayMs: number): () => void;
|
|
33
|
+
}
|
|
3
34
|
type DeepPartial<T> = T extends object ? {
|
|
4
35
|
[P in keyof T]?: DeepPartial<T[P]>;
|
|
5
36
|
} : T;
|
|
@@ -51,22 +82,32 @@ interface BitFieldConditional<T extends object = any> {
|
|
|
51
82
|
}
|
|
52
83
|
/** Field-level validation: async validation only. */
|
|
53
84
|
interface BitFieldValidation<T extends object = any> {
|
|
85
|
+
/**
|
|
86
|
+
* Breaking change: async validation now defaults to `blur` instead of eager `change`.
|
|
87
|
+
* `validate()`/submit still execute async validators for the targeted fields.
|
|
88
|
+
*/
|
|
89
|
+
asyncValidateOn?: "change" | "blur";
|
|
54
90
|
asyncValidate?: (value: any, values: T) => Promise<string | null | undefined>;
|
|
55
91
|
asyncValidateDelay?: number;
|
|
56
92
|
}
|
|
57
|
-
|
|
58
|
-
interface BitFieldDefinition<T extends object = any> {
|
|
93
|
+
interface BitFieldDefinitionBase<T extends object = any> {
|
|
59
94
|
conditional?: BitFieldConditional<T>;
|
|
60
95
|
validation?: BitFieldValidation<T>;
|
|
61
96
|
transform?: BitTransformFn<T>;
|
|
62
|
-
computed?: BitComputedFn<T>;
|
|
63
|
-
/** Explicit dependencies for computed optimization. Falls back to conditional.dependsOn when omitted. */
|
|
64
|
-
computedDependsOn?: string[];
|
|
65
97
|
/** Mask name (built-in or custom registry key) or BitMask instance. */
|
|
66
98
|
mask?: BitMask | BitMaskName;
|
|
67
99
|
/** Scope name (e.g. wizard step). */
|
|
68
100
|
scope?: string;
|
|
69
101
|
}
|
|
102
|
+
/** Full field definition: conditional, validation, transform, computed, mask, scope. */
|
|
103
|
+
type BitFieldDefinition<T extends object = any> = (BitFieldDefinitionBase<T> & {
|
|
104
|
+
computed?: undefined;
|
|
105
|
+
computedDependsOn?: never;
|
|
106
|
+
}) | (BitFieldDefinitionBase<T> & {
|
|
107
|
+
computed: BitComputedFn<T>;
|
|
108
|
+
/** Explicit dependencies are mandatory in v4 for deterministic computed scheduling. */
|
|
109
|
+
computedDependsOn: string[];
|
|
110
|
+
});
|
|
70
111
|
interface DevToolsOptions {
|
|
71
112
|
enabled?: boolean;
|
|
72
113
|
mode?: "local" | "remote";
|
|
@@ -181,6 +222,10 @@ interface BitValidationConfig<T extends object> {
|
|
|
181
222
|
/** History config. */
|
|
182
223
|
interface BitHistoryConfig {
|
|
183
224
|
enabled?: boolean;
|
|
225
|
+
/**
|
|
226
|
+
* Maximum number of undo/redo steps to retain.
|
|
227
|
+
* @default 50
|
|
228
|
+
*/
|
|
184
229
|
limit?: number;
|
|
185
230
|
}
|
|
186
231
|
/**
|
|
@@ -206,6 +251,26 @@ interface BitConfig<T extends object = any> {
|
|
|
206
251
|
persist?: BitPersistConfig<T>;
|
|
207
252
|
/** Plugins de lifecycle (observabilidade) */
|
|
208
253
|
plugins?: BitPlugin<T>[];
|
|
254
|
+
/**
|
|
255
|
+
* Maximum number of entries for internal subscription path caches.
|
|
256
|
+
* Lower = less memory; higher = fewer cache evictions in large dynamic forms.
|
|
257
|
+
* @default 500
|
|
258
|
+
*/
|
|
259
|
+
subscriptionCacheSize?: number;
|
|
260
|
+
/**
|
|
261
|
+
* Pluggable scheduler for validation debounce.
|
|
262
|
+
* Defaults to a `setTimeout`-based scheduler.
|
|
263
|
+
* Inject a framework-aware scheduler (e.g. React `startTransition`) for
|
|
264
|
+
* better integration with concurrent rendering.
|
|
265
|
+
*/
|
|
266
|
+
scheduler?: BitScheduler;
|
|
267
|
+
/**
|
|
268
|
+
* Custom bus instance for DevTools/observability. When omitted, the
|
|
269
|
+
* shared browser-global bus (`bitBus`) is used — suitable for most apps.
|
|
270
|
+
* Pass a `createBitBus()` instance when running in SSR/Edge environments
|
|
271
|
+
* where a global singleton is unsafe (e.g. Next.js Edge Runtime).
|
|
272
|
+
*/
|
|
273
|
+
bus?: BitFormGlobal;
|
|
209
274
|
}
|
|
210
275
|
/** Return type of BitStore.getStepStatus, used by useBitScope/injectBitScope. */
|
|
211
276
|
interface ScopeStatus {
|
|
@@ -231,17 +296,20 @@ type BitPathValue<T, P extends string> = P extends `${infer K}.${infer Rest}` ?
|
|
|
231
296
|
type BitArrayPath<T> = BitPath<T> extends infer P ? P extends string ? BitPathValue<T, P> extends readonly any[] ? P : never : never : never;
|
|
232
297
|
type BitArrayItem<A> = A extends readonly (infer U)[] ? U : A extends (infer U)[] ? U : never;
|
|
233
298
|
|
|
234
|
-
type BitBusListener<T extends object = any> = (storeId: string, newState: BitState<T>) => void;
|
|
235
|
-
interface BitFormGlobal {
|
|
236
|
-
stores: Record<string, unknown>;
|
|
237
|
-
listeners: Set<BitBusListener>;
|
|
238
|
-
dispatch: (storeId: string, state: BitState<any>) => void;
|
|
239
|
-
subscribe: (fn: BitBusListener) => () => void;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
299
|
declare global {
|
|
243
300
|
var __BIT_FORM__: BitFormGlobal | undefined;
|
|
244
301
|
}
|
|
245
302
|
declare const bitBus: BitFormGlobal;
|
|
303
|
+
/**
|
|
304
|
+
* Creates an isolated bus instance — not connected to the browser global.
|
|
305
|
+
* Use this in SSR / Edge Runtime environments (e.g. Next.js Edge) where a
|
|
306
|
+
* shared `globalThis` singleton is unsafe across request contexts.
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* // _app.tsx (SSR-safe)
|
|
310
|
+
* const bus = createBitBus();
|
|
311
|
+
* const store = createBitStore({ bus, initialValues: { ... } });
|
|
312
|
+
*/
|
|
313
|
+
declare function createBitBus(): BitFormGlobal;
|
|
246
314
|
|
|
247
|
-
export { type
|
|
315
|
+
export { type BitFieldConditional as A, type BitArrayPath as B, type BitFieldValidation as C, type DeepPartial as D, type BitHistoryConfig as E, type BitPersistConfig as F, type BitPersistMode as G, type BitPersistStorageAdapter as H, type BitPluginContext as I, type BitPluginErrorEvent as J, type BitPluginHooks as K, type BitTransformFn as L, type BitValidationConfig as M, bitBus as N, createBitBus as O, type ScopeStatus as S, type ValidateScopeResult as V, type BitArrayItem as a, type BitPathValue as b, type BitErrors as c, type BitBus as d, type BitPath as e, type BitState as f, type BitFieldState as g, type BitFieldDefinition as h, type BitPersistMetadata as i, type BitConfig as j, type ValidatorFn as k, type DevToolsOptions as l, type BitPersistResolvedConfig as m, type BitIdFactory as n, type BitPlugin as o, type BitScheduler as p, type BitFormGlobal as q, type BitTouched as r, type BitAfterSubmitEvent as s, type BitAfterValidateEvent as t, type BitBeforeSubmitEvent as u, type BitBeforeValidateEvent as v, type BitBusListener as w, type BitComputedFn as x, type BitFieldChangeEvent as y, type BitFieldChangeMeta as z };
|
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
import { B as BitMask,
|
|
1
|
+
import { B as BitMask, b as BitMaskName } from './types-CUXh7PqD.cjs';
|
|
2
2
|
|
|
3
|
+
type BitBusListener<T extends object = any> = (storeId: string, newState: BitState<T>) => void;
|
|
4
|
+
interface BitFormGlobal {
|
|
5
|
+
stores: Record<string, unknown>;
|
|
6
|
+
listeners: Set<BitBusListener>;
|
|
7
|
+
dispatch: (storeId: string, state: BitState<any>) => void;
|
|
8
|
+
subscribe: (fn: BitBusListener) => () => void;
|
|
9
|
+
}
|
|
10
|
+
/** Alias for {@link BitFormGlobal}. Prefer this name in user-facing APIs. */
|
|
11
|
+
type BitBus = BitFormGlobal;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Pluggable scheduler used for validation debounce.
|
|
15
|
+
* Replace the default (setTimeout-based) with a framework-aware scheduler
|
|
16
|
+
* to integrate with React's concurrent mode, Vue's nextTick, etc.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // React concurrent mode integration:
|
|
20
|
+
* const scheduler: BitScheduler = {
|
|
21
|
+
* schedule: (fn, delay) => {
|
|
22
|
+
* const id = setTimeout(() => startTransition(fn), delay);
|
|
23
|
+
* return () => clearTimeout(id);
|
|
24
|
+
* },
|
|
25
|
+
* };
|
|
26
|
+
*/
|
|
27
|
+
interface BitScheduler {
|
|
28
|
+
/**
|
|
29
|
+
* Schedule `fn` to run after `delayMs` milliseconds.
|
|
30
|
+
* Must return a cleanup function that cancels the scheduled call.
|
|
31
|
+
*/
|
|
32
|
+
schedule(fn: () => void, delayMs: number): () => void;
|
|
33
|
+
}
|
|
3
34
|
type DeepPartial<T> = T extends object ? {
|
|
4
35
|
[P in keyof T]?: DeepPartial<T[P]>;
|
|
5
36
|
} : T;
|
|
@@ -51,22 +82,32 @@ interface BitFieldConditional<T extends object = any> {
|
|
|
51
82
|
}
|
|
52
83
|
/** Field-level validation: async validation only. */
|
|
53
84
|
interface BitFieldValidation<T extends object = any> {
|
|
85
|
+
/**
|
|
86
|
+
* Breaking change: async validation now defaults to `blur` instead of eager `change`.
|
|
87
|
+
* `validate()`/submit still execute async validators for the targeted fields.
|
|
88
|
+
*/
|
|
89
|
+
asyncValidateOn?: "change" | "blur";
|
|
54
90
|
asyncValidate?: (value: any, values: T) => Promise<string | null | undefined>;
|
|
55
91
|
asyncValidateDelay?: number;
|
|
56
92
|
}
|
|
57
|
-
|
|
58
|
-
interface BitFieldDefinition<T extends object = any> {
|
|
93
|
+
interface BitFieldDefinitionBase<T extends object = any> {
|
|
59
94
|
conditional?: BitFieldConditional<T>;
|
|
60
95
|
validation?: BitFieldValidation<T>;
|
|
61
96
|
transform?: BitTransformFn<T>;
|
|
62
|
-
computed?: BitComputedFn<T>;
|
|
63
|
-
/** Explicit dependencies for computed optimization. Falls back to conditional.dependsOn when omitted. */
|
|
64
|
-
computedDependsOn?: string[];
|
|
65
97
|
/** Mask name (built-in or custom registry key) or BitMask instance. */
|
|
66
98
|
mask?: BitMask | BitMaskName;
|
|
67
99
|
/** Scope name (e.g. wizard step). */
|
|
68
100
|
scope?: string;
|
|
69
101
|
}
|
|
102
|
+
/** Full field definition: conditional, validation, transform, computed, mask, scope. */
|
|
103
|
+
type BitFieldDefinition<T extends object = any> = (BitFieldDefinitionBase<T> & {
|
|
104
|
+
computed?: undefined;
|
|
105
|
+
computedDependsOn?: never;
|
|
106
|
+
}) | (BitFieldDefinitionBase<T> & {
|
|
107
|
+
computed: BitComputedFn<T>;
|
|
108
|
+
/** Explicit dependencies are mandatory in v4 for deterministic computed scheduling. */
|
|
109
|
+
computedDependsOn: string[];
|
|
110
|
+
});
|
|
70
111
|
interface DevToolsOptions {
|
|
71
112
|
enabled?: boolean;
|
|
72
113
|
mode?: "local" | "remote";
|
|
@@ -181,6 +222,10 @@ interface BitValidationConfig<T extends object> {
|
|
|
181
222
|
/** History config. */
|
|
182
223
|
interface BitHistoryConfig {
|
|
183
224
|
enabled?: boolean;
|
|
225
|
+
/**
|
|
226
|
+
* Maximum number of undo/redo steps to retain.
|
|
227
|
+
* @default 50
|
|
228
|
+
*/
|
|
184
229
|
limit?: number;
|
|
185
230
|
}
|
|
186
231
|
/**
|
|
@@ -206,6 +251,26 @@ interface BitConfig<T extends object = any> {
|
|
|
206
251
|
persist?: BitPersistConfig<T>;
|
|
207
252
|
/** Plugins de lifecycle (observabilidade) */
|
|
208
253
|
plugins?: BitPlugin<T>[];
|
|
254
|
+
/**
|
|
255
|
+
* Maximum number of entries for internal subscription path caches.
|
|
256
|
+
* Lower = less memory; higher = fewer cache evictions in large dynamic forms.
|
|
257
|
+
* @default 500
|
|
258
|
+
*/
|
|
259
|
+
subscriptionCacheSize?: number;
|
|
260
|
+
/**
|
|
261
|
+
* Pluggable scheduler for validation debounce.
|
|
262
|
+
* Defaults to a `setTimeout`-based scheduler.
|
|
263
|
+
* Inject a framework-aware scheduler (e.g. React `startTransition`) for
|
|
264
|
+
* better integration with concurrent rendering.
|
|
265
|
+
*/
|
|
266
|
+
scheduler?: BitScheduler;
|
|
267
|
+
/**
|
|
268
|
+
* Custom bus instance for DevTools/observability. When omitted, the
|
|
269
|
+
* shared browser-global bus (`bitBus`) is used — suitable for most apps.
|
|
270
|
+
* Pass a `createBitBus()` instance when running in SSR/Edge environments
|
|
271
|
+
* where a global singleton is unsafe (e.g. Next.js Edge Runtime).
|
|
272
|
+
*/
|
|
273
|
+
bus?: BitFormGlobal;
|
|
209
274
|
}
|
|
210
275
|
/** Return type of BitStore.getStepStatus, used by useBitScope/injectBitScope. */
|
|
211
276
|
interface ScopeStatus {
|
|
@@ -231,17 +296,20 @@ type BitPathValue<T, P extends string> = P extends `${infer K}.${infer Rest}` ?
|
|
|
231
296
|
type BitArrayPath<T> = BitPath<T> extends infer P ? P extends string ? BitPathValue<T, P> extends readonly any[] ? P : never : never : never;
|
|
232
297
|
type BitArrayItem<A> = A extends readonly (infer U)[] ? U : A extends (infer U)[] ? U : never;
|
|
233
298
|
|
|
234
|
-
type BitBusListener<T extends object = any> = (storeId: string, newState: BitState<T>) => void;
|
|
235
|
-
interface BitFormGlobal {
|
|
236
|
-
stores: Record<string, unknown>;
|
|
237
|
-
listeners: Set<BitBusListener>;
|
|
238
|
-
dispatch: (storeId: string, state: BitState<any>) => void;
|
|
239
|
-
subscribe: (fn: BitBusListener) => () => void;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
299
|
declare global {
|
|
243
300
|
var __BIT_FORM__: BitFormGlobal | undefined;
|
|
244
301
|
}
|
|
245
302
|
declare const bitBus: BitFormGlobal;
|
|
303
|
+
/**
|
|
304
|
+
* Creates an isolated bus instance — not connected to the browser global.
|
|
305
|
+
* Use this in SSR / Edge Runtime environments (e.g. Next.js Edge) where a
|
|
306
|
+
* shared `globalThis` singleton is unsafe across request contexts.
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* // _app.tsx (SSR-safe)
|
|
310
|
+
* const bus = createBitBus();
|
|
311
|
+
* const store = createBitStore({ bus, initialValues: { ... } });
|
|
312
|
+
*/
|
|
313
|
+
declare function createBitBus(): BitFormGlobal;
|
|
246
314
|
|
|
247
|
-
export { type
|
|
315
|
+
export { type BitFieldConditional as A, type BitArrayPath as B, type BitFieldValidation as C, type DeepPartial as D, type BitHistoryConfig as E, type BitPersistConfig as F, type BitPersistMode as G, type BitPersistStorageAdapter as H, type BitPluginContext as I, type BitPluginErrorEvent as J, type BitPluginHooks as K, type BitTransformFn as L, type BitValidationConfig as M, bitBus as N, createBitBus as O, type ScopeStatus as S, type ValidateScopeResult as V, type BitArrayItem as a, type BitPathValue as b, type BitErrors as c, type BitBus as d, type BitPath as e, type BitState as f, type BitFieldState as g, type BitFieldDefinition as h, type BitPersistMetadata as i, type BitConfig as j, type ValidatorFn as k, type DevToolsOptions as l, type BitPersistResolvedConfig as m, type BitIdFactory as n, type BitPlugin as o, type BitScheduler as p, type BitFormGlobal as q, type BitTouched as r, type BitAfterSubmitEvent as s, type BitAfterValidateEvent as t, type BitBeforeSubmitEvent as u, type BitBeforeValidateEvent as v, type BitBusListener as w, type BitComputedFn as x, type BitFieldChangeEvent as y, type BitFieldChangeMeta as z };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as c,c as h}from"./chunk-K5X37E3U.js";import{j as v}from"./chunk-SA47B5OP.js";function b(e){if(!e||typeof e!="object")return!1;let o=e;return typeof o.getState=="function"&&typeof o.getHistoryMetadata=="function"}function B(e){if(!b(e))return!1;let o=e;return typeof o.undo=="function"&&typeof o.redo=="function"&&typeof o.reset=="function"}function D(e,o){let t=e[o];return B(t)?t:null}function w(e){return{values:e.values,errors:e.errors,touched:e.touched,isValid:e.isValid,isDirty:e.isDirty,isSubmitting:e.isSubmitting,isValidating:e.isValidating,persist:e.persist}}function I(e){let o=e.getHistoryMetadata();return{...w(e.getState()),_meta:{canUndo:o.canUndo,canRedo:o.canRedo,totalSteps:o.historySize,currentIndex:o.historyIndex}}}function y(e){let o={};for(let[t,i]of Object.entries(e))b(i)&&(o[t]=I(i));return o}var S=null,x=50;function _(e,o=v){S&&(console.warn("[bit-form] Reiniciando ponte do DevTools (Fast Refresh detectado)."),S());let t=null,i=null,f,n=null,a=new Set,T=!1,d=r=>{t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(r))},R=()=>{if(a.size===0)return;let r=y(Array.from(a).reduce((s,l)=>{let u=o.stores[l];return u&&(s[l]=u),s},{}));a.clear(),n=null,Object.keys(r).length>0&&d({type:"STATE_UPDATE",protocolVersion:1,payload:r})},k=()=>{n||(n=setTimeout(()=>{R()},x))},m=()=>{T=!1,t=new WebSocket(e),t.onopen=()=>{console.log("[bit-form] \u{1F50C} Conectado ao CLI DevTools via WebSocket."),d({type:"HELLO",protocolVersion:1,payload:{role:"server",protocolVersion:1}});let r=y(o.stores);Object.keys(r).length>0&&d({type:"STATE_UPDATE",protocolVersion:1,payload:r}),i=o.subscribe((s,l)=>{a.add(s),k()}),f=setInterval(()=>{d({type:"PING",protocolVersion:1})},3e4)},t.onmessage=r=>{try{let s=JSON.parse(r.data);if(h(s)){let{storeId:l,action:u}=s.payload,p=D(o.stores,l);if(!p)return;switch(u){case"undo":p.undo();break;case"redo":p.redo();break;case"reset":p.reset();break}}}catch(s){console.warn("[bit-form] Erro ao processar comando do CLI:",s)}},t.onclose=()=>{i&&i(),clearInterval(f),n&&(clearTimeout(n),n=null),a.clear(),T?console.log("[bit-form] Ponte antiga encerrada com sucesso."):(console.log("[bit-form] Conex\xE3o perdida. Reconectando em 3s..."),setTimeout(m,3e3))}};m();let g=()=>{T=!0,i&&i(),clearInterval(f),n&&(clearTimeout(n),n=null),a.clear(),t&&(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close(),S=null};return S=g,g}export{D as a,y as b,_ as c};
|
|
2
|
+
//# sourceMappingURL=chunk-DIEE6LUO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/devtools/store-port.ts","../src/devtools/store-snapshot.ts","../src/devtools/bridge.ts"],"sourcesContent":["import type { BitHistoryMetadata, BitState } from \"../core\";\n\nexport interface BitDevToolsReadableStore<T extends object = object> {\n getState: () => Readonly<BitState<T>>;\n getHistoryMetadata: () => BitHistoryMetadata;\n}\n\nexport interface BitDevToolsActionableStore<\n T extends object = object,\n> extends BitDevToolsReadableStore<T> {\n undo: () => void;\n redo: () => void;\n reset: () => void;\n}\n\nexport function isDevToolsReadableStore(\n value: unknown,\n): value is BitDevToolsReadableStore<object> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as unknown as Record<string, unknown>;\n\n return (\n typeof candidate.getState === \"function\" &&\n typeof candidate.getHistoryMetadata === \"function\"\n );\n}\n\nexport function isDevToolsActionableStore(\n value: unknown,\n): value is BitDevToolsActionableStore<object> {\n if (!isDevToolsReadableStore(value)) {\n return false;\n }\n\n const candidate = value as unknown as Record<string, unknown>;\n\n return (\n typeof candidate.undo === \"function\" &&\n typeof candidate.redo === \"function\" &&\n typeof candidate.reset === \"function\"\n );\n}\n\nexport function getDevToolsActionableStore(\n stores: Record<string, unknown>,\n storeId: string,\n): BitDevToolsActionableStore<object> | null {\n const store = stores[storeId];\n return isDevToolsActionableStore(store) ? store : null;\n}\n","import type { BitState } from \"../core\";\nimport type { DevToolsStoreSnapshot, DevToolsStoreSnapshots } from \"./protocol\";\nimport { isDevToolsReadableStore } from \"./store-port\";\n\nfunction normalizeStoreState<T extends object>(\n state: Readonly<BitState<T>>,\n): Omit<DevToolsStoreSnapshot, \"_meta\"> {\n return {\n values: state.values,\n errors: state.errors as Record<string, unknown>,\n touched: state.touched as Record<string, unknown>,\n isValid: state.isValid,\n isDirty: state.isDirty,\n isSubmitting: state.isSubmitting,\n isValidating: state.isValidating as Record<string, unknown>,\n persist: state.persist,\n };\n}\n\nexport function createDevToolsStoreSnapshot<T extends object>(store: {\n getState: () => Readonly<BitState<T>>;\n getHistoryMetadata: () => {\n canUndo: boolean;\n canRedo: boolean;\n historySize: number;\n historyIndex: number;\n };\n}): DevToolsStoreSnapshot {\n const historyMeta = store.getHistoryMetadata();\n\n return {\n ...normalizeStoreState(store.getState()),\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n}\n\nexport function createDevToolsSnapshotMap(\n stores: Record<string, unknown>,\n): DevToolsStoreSnapshots {\n const snapshots: DevToolsStoreSnapshots = {};\n\n for (const [storeId, instance] of Object.entries(stores)) {\n if (!isDevToolsReadableStore(instance)) {\n continue;\n }\n\n snapshots[storeId] = createDevToolsStoreSnapshot(instance);\n }\n\n return snapshots;\n}\n","import { bitBus } from \"../core\";\nimport type { BitBus } from \"../core\";\nimport { DEVTOOLS_PROTOCOL_VERSION, isDevToolsActionMessage } from \"./protocol\";\nimport { createDevToolsSnapshotMap } from \"./store-snapshot\";\nimport { getDevToolsActionableStore } from \"./store-port\";\n\nlet activeBridgeCleanup: (() => void) | null = null;\nconst STATE_BATCH_INTERVAL_MS = 50;\n\nexport function setupRemoteBridge(url: string, bus: BitBus = bitBus) {\n if (activeBridgeCleanup) {\n console.warn(\n \"[bit-form] Reiniciando ponte do DevTools (Fast Refresh detectado).\",\n );\n activeBridgeCleanup();\n }\n\n let socket: WebSocket | null = null;\n let unsubscribeBus: (() => void) | null = null;\n let heartbeatInterval: ReturnType<typeof setInterval>;\n let batchFlushTimeout: ReturnType<typeof setTimeout> | null = null;\n const pendingStoreIds = new Set<string>();\n let isIntentionalDisconnect = false;\n\n const sendWhenOpen = (message: Record<string, unknown>) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return;\n }\n\n socket.send(JSON.stringify(message));\n };\n\n const flushPendingStoreUpdates = () => {\n if (pendingStoreIds.size === 0) {\n return;\n }\n\n const payload = createDevToolsSnapshotMap(\n Array.from(pendingStoreIds).reduce<Record<string, unknown>>(\n (acc, storeId) => {\n const storeInstance = bus.stores[storeId];\n if (storeInstance) {\n acc[storeId] = storeInstance;\n }\n return acc;\n },\n {},\n ),\n );\n\n pendingStoreIds.clear();\n batchFlushTimeout = null;\n\n if (Object.keys(payload).length > 0) {\n sendWhenOpen({\n type: \"STATE_UPDATE\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload,\n });\n }\n };\n\n const scheduleStoreFlush = () => {\n if (batchFlushTimeout) {\n return;\n }\n\n batchFlushTimeout = setTimeout(() => {\n flushPendingStoreUpdates();\n }, STATE_BATCH_INTERVAL_MS);\n };\n\n const connect = () => {\n isIntentionalDisconnect = false;\n socket = new WebSocket(url);\n\n socket.onopen = () => {\n console.log(\"[bit-form] 🔌 Conectado ao CLI DevTools via WebSocket.\");\n\n sendWhenOpen({\n type: \"HELLO\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload: { role: \"server\", protocolVersion: DEVTOOLS_PROTOCOL_VERSION },\n });\n\n const initialState = createDevToolsSnapshotMap(bus.stores);\n if (Object.keys(initialState).length > 0) {\n sendWhenOpen({\n type: \"STATE_UPDATE\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload: initialState,\n });\n }\n\n unsubscribeBus = bus.subscribe((storeId, _newState) => {\n pendingStoreIds.add(storeId);\n scheduleStoreFlush();\n });\n\n heartbeatInterval = setInterval(() => {\n sendWhenOpen({\n type: \"PING\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n });\n }, 30000);\n };\n\n socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as unknown;\n\n if (isDevToolsActionMessage(message)) {\n const { storeId, action } = message.payload;\n const store = getDevToolsActionableStore(bus.stores, storeId);\n\n if (!store) {\n return;\n }\n\n switch (action) {\n case \"undo\":\n store.undo();\n break;\n case \"redo\":\n store.redo();\n break;\n case \"reset\":\n store.reset();\n break;\n }\n }\n } catch (e) {\n console.warn(\"[bit-form] Erro ao processar comando do CLI:\", e);\n }\n };\n\n socket.onclose = () => {\n if (unsubscribeBus) unsubscribeBus();\n clearInterval(heartbeatInterval);\n if (batchFlushTimeout) {\n clearTimeout(batchFlushTimeout);\n batchFlushTimeout = null;\n }\n pendingStoreIds.clear();\n\n if (!isIntentionalDisconnect) {\n console.log(\"[bit-form] Conexão perdida. Reconectando em 3s...\");\n setTimeout(connect, 3000);\n } else {\n console.log(\"[bit-form] Ponte antiga encerrada com sucesso.\");\n }\n };\n };\n\n connect();\n\n const cleanup = () => {\n isIntentionalDisconnect = true;\n\n if (unsubscribeBus) unsubscribeBus();\n clearInterval(heartbeatInterval);\n if (batchFlushTimeout) {\n clearTimeout(batchFlushTimeout);\n batchFlushTimeout = null;\n }\n pendingStoreIds.clear();\n if (\n socket &&\n (socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING)\n ) {\n socket.close();\n }\n activeBridgeCleanup = null;\n };\n\n activeBridgeCleanup = cleanup;\n\n return cleanup;\n}\n"],"mappings":"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","names":["isDevToolsReadableStore","value","candidate","isDevToolsActionableStore","getDevToolsActionableStore","stores","storeId","store","normalizeStoreState","state","createDevToolsStoreSnapshot","store","historyMeta","createDevToolsSnapshotMap","stores","snapshots","storeId","instance","isDevToolsReadableStore","activeBridgeCleanup","STATE_BATCH_INTERVAL_MS","setupRemoteBridge","url","bus","bitBus","socket","unsubscribeBus","heartbeatInterval","batchFlushTimeout","pendingStoreIds","isIntentionalDisconnect","sendWhenOpen","message","flushPendingStoreUpdates","payload","createDevToolsSnapshotMap","acc","storeId","storeInstance","scheduleStoreFlush","connect","initialState","_newState","event","isDevToolsActionMessage","action","store","getDevToolsActionableStore","e","cleanup"]}
|