@picked/react 0.0.1-dev.1773807602703 → 0.0.1-dev.1774224866171

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/component.js CHANGED
@@ -1 +1 @@
1
- const a=(e,t)=>({frameworkName:"react",component:e,style:t}),r=e=>e.frameworkName==="react";export{a as adaptReactComponent,r as isValidAdaptedComponent};
1
+ var e=(e,t)=>({frameworkName:`react`,component:e,style:t}),t=e=>e.frameworkName===`react`;export{e as adaptReactComponent,t as isValidAdaptedComponent};
package/dist/context.js CHANGED
@@ -1 +1 @@
1
- import{createContext as e}from"react";const t=e(null),n=t.Provider,o=e(null),i=o.Provider;export{t as ClientContext,n as ClientProvider,o as ExperienceContext,i as ExperienceProvider};
1
+ import{createContext as e}from"react";var t=e(null),n=t.Provider,r=e(null),i=r.Provider;export{t as ClientContext,n as ClientProvider,r as ExperienceContext,i as ExperienceProvider};
@@ -1,16 +1,28 @@
1
- import { ValidationError } from '@picked/client';
2
- interface GetFormOptions {
3
- id: string;
1
+ import { FormInstance as CoreFormInstance, ErrorCallback, SubmitCallback, SuccessCallback } from '@picked/client/form';
2
+ interface UseFormOptions {
3
+ formId: string;
4
4
  title: string;
5
- onSuccess?: () => void | Promise<void>;
6
- onError?: (errors: ValidationError[]) => void | Promise<void>;
5
+ fieldIds: string[];
7
6
  }
8
- export declare function useForm(options: GetFormOptions): {
9
- form: {
10
- onsubmit: (event: SubmitEvent & {
11
- currentTarget: EventTarget & HTMLFormElement;
12
- }) => Promise<void>;
7
+ /**
8
+ * React FormInstance — identical to core but callback registration returns void
9
+ * (cleanup is handled automatically via useEffect, not by the consumer).
10
+ */
11
+ interface FormInstance<TFieldIds extends string = string> extends Omit<CoreFormInstance<TFieldIds>, 'form'> {
12
+ form: Omit<CoreFormInstance<TFieldIds>['form'], 'onSubmit' | 'onSuccess' | 'onError'> & {
13
+ onSubmit: (callback: SubmitCallback<TFieldIds>) => void;
14
+ onSuccess: (callback: SuccessCallback<TFieldIds>) => void;
15
+ onError: (callback: ErrorCallback) => void;
13
16
  };
14
- };
17
+ }
18
+ /**
19
+ * React hook wrapping the framework-agnostic createForm from @picked/client/form.
20
+ *
21
+ * - Injects client and experienceInstance from React context
22
+ * - Collects unsubscribe functions from callback registration and cleans them
23
+ * up on unmount via a single useEffect
24
+ * - Consumer DX: `form.onSuccess(cb)` — no hooks or lifecycle awareness needed
25
+ */
26
+ export declare function useForm({ formId, title, fieldIds }: UseFormOptions): FormInstance;
15
27
  export {};
16
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAQxE,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc;;0BAKd,WAAW,GAAG;YAAE,aAAa,EAAE,WAAW,GAAG,eAAe,CAAA;SAAE;;EA+G9F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,IAAI,gBAAgB,EACrC,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAA;AAG5B,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;GAGG;AACH,UAAU,YAAY,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,CACtD,SAAQ,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IACjD,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC,GAAG;QACtF,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;QACvD,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;QACzD,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAA;KAC3C,CAAA;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,YAAY,CAyCjF"}
@@ -1 +1 @@
1
- import{usePicked as d,useExperience as y}from"../hooks/client.js";import"../hooks/step.js";import"react";import"@picked/client";function A(u){const a=d(),o=y(),{id:l,title:c}=u;async function p(f){f.preventDefault(),a.eventBus({type:"form_submit",form:{id:l,title:c},experience:o});const m=new FormData(f.currentTarget),i={data:{},push(r){const t=r.questionId,e=this.data[t];e?Array.isArray(e)&&Array.isArray(r.value)?Array.isArray(e)&&Array.isArray(r.value)&&(typeof e[0]=="string"?this.data[t]=[...e,...r.value].map(String):typeof e[0]=="number"?this.data[t]=[...e,...r.value].map(Number):typeof e[0]=="boolean"?this.data[t]=[...e,...r.value].map(s=>!!s):this.data[t]=r.value):this.data[t]=r.value:this.data[t]=r.value}};for(const[r,t]of m.entries()){const e=a.fields.getById(r).getState();if(!e)continue;const s=e.id;switch(e.type){case"text":i.push({questionId:s,value:e.multiple?[String(t)]:String(t)});break;case"number":i.push({questionId:s,value:e.multiple?[Number(t)]:Number(t)});break;case"boolean":i.push({questionId:s,value:e.multiple?[t==="true"]:t==="true"});break}}const{errors:n}=await a.responses.commit(i.data);if(n.length>0){a.eventBus({type:"form_submit_error",form:{id:l,title:c},exception:{reason:n},experience:o}),n.forEach(r=>{a.eventBus({type:"field_validation_error",exception:{reason:[r]},experience:o})}),await u.onError?.(n);return}a.eventBus({type:"form_submit_success",form:{id:l,title:c},experience:o}),await u.onSuccess?.()}return{form:{onsubmit:p}}}export{A as useForm};
1
+ import{useExperience as e,usePicked as t}from"../hooks/client.js";import"../hooks/index.js";import{useEffect as n,useMemo as r,useRef as i}from"react";import{createStore as a}from"effector";import{createForm as o}from"@picked/client/form";function s({formId:s,title:c,fieldIds:l}){let u=t(),d=e(),f=r(()=>a(c),[c]),p=r(()=>a(l),[l]),m=r(()=>o({client:u,experienceInstance:d},s,f,p),[u,d,s,f,p]),h=i([]);return n(()=>()=>{h.current.forEach(e=>e()),h.current=[]},[]),{form:r(()=>({...m.form,onSubmit:e=>{h.current.push(m.form.onSubmit(e))},onSuccess:e=>{h.current.push(m.form.onSuccess(e))},onError:e=>{h.current.push(m.form.onError(e))}}),[m]),fields:m.fields}}export{s as useForm};
@@ -1,16 +1,16 @@
1
1
  import { ExperienceInstance, Picked } from '@picked/client';
2
2
  /**
3
- * Retrieves the Picked Client for the Experience Instance.
4
- * @returns The Picked client instance that provides access to experiences, steps, and other Picked functionality.
5
- * @example
6
- * const client = usePicked()
3
+ * Retrieves the Picked Client for the Experience Instance
4
+ *
5
+ * @returns The Picked client instance that provides access to experiences, steps, and other Picked functionality
7
6
  */
8
7
  export declare function usePicked(): Picked;
9
8
  /**
10
- * Retrieves the Experience Store for the current Experience Instance.
11
- * @returns The Experience store instance that provides access to experience configuration and state.
12
- * @example
13
- * const experience = useExperience()
9
+ * Retrieves the Experience Store for the current Experience Instance
10
+ *
11
+ * @returns The Experience store instance that provides access to experience configuration and state
14
12
  */
15
13
  export declare function useExperience(): ExperienceInstance;
14
+ export declare const getPicked: typeof usePicked;
15
+ export declare const getExperience: typeof useExperience;
16
16
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/hooks/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAGhE;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAOlC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAOlD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/hooks/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAGhE;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAOlC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAOlD;AAGD,eAAO,MAAM,SAAS,kBAAY,CAAA;AAClC,eAAO,MAAM,aAAa,sBAAgB,CAAA"}
@@ -1 +1 @@
1
- import{useContext as t}from"react";import{ExperienceContext as r,ClientContext as n}from"../context.js";function u(){const e=t(n);if(!e)throw new Error("usePicked must be used within a ClientProvider");return e}function c(){const e=t(r);if(!e)throw new Error("useExperience must be used within an ExperienceProvider");return e}export{c as useExperience,u as usePicked};
1
+ import{ClientContext as e,ExperienceContext as t}from"../context.js";import{useContext as n}from"react";function r(){let t=n(e);if(!t)throw Error(`usePicked must be used within a ClientProvider`);return t}function i(){let e=n(t);if(!e)throw Error(`useExperience must be used within an ExperienceProvider`);return e}var a=r,o=i;export{o as getExperience,a as getPicked,i as useExperience,r as usePicked};
@@ -4,5 +4,5 @@ export interface GetFieldResponse {
4
4
  value: Store<FieldValue>;
5
5
  field: Store<Field | null>;
6
6
  }
7
- export declare function getField(key: string): GetFieldResponse;
7
+ export declare function getField(id: string): GetFieldResponse;
8
8
  //# sourceMappingURL=field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/hooks/field.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAGrC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IACxB,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;CAC3B;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAQtD"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/hooks/field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAGrC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IACxB,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;CAC3B;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAQrD"}
@@ -1 +1 @@
1
- import{usePicked as o}from"./client.js";function r(e){const t=o(),s=t.fields.getByKey(e),n=t.responses.getByFieldKey(e);return{field:s,value:n}}export{r as getField};
1
+ import{getPicked as e}from"./client.js";function t(t){let n=e();return{field:n.fields.getById(t),value:n.responses.getByFieldId(t)}}export{t as getField};
@@ -1,10 +1,5 @@
1
- /**
2
- * @file Public re-exports for the hooks entry point.
3
- */
4
- export { usePicked, useExperience } from './client';
1
+ export { usePicked, useExperience, getPicked, getExperience } from './client';
5
2
  export { useStep, useSetStepContext } from './step';
6
- export type { StepContext } from './step';
7
3
  export { useSessionStorage, useLocalStorage } from './storage';
8
- export type { UseStorageOptions } from './storage';
9
4
  export * from './field';
10
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC9D,cAAc,SAAS,CAAA"}
@@ -1 +1 @@
1
- import{useExperience as t,usePicked as r}from"./client.js";import{useSetStepContext as p,useStep as u}from"./step.js";import{useLocalStorage as S,useSessionStorage as f}from"./storage.js";import{getField as m}from"./field.js";export{m as getField,t as useExperience,S as useLocalStorage,r as usePicked,f as useSessionStorage,p as useSetStepContext,u as useStep};
1
+ import{getExperience as e,getPicked as t,useExperience as n,usePicked as r}from"./client.js";import{useSetStepContext as i,useStep as a}from"./step.js";import{useLocalStorage as o,useSessionStorage as s}from"./storage.js";import{getField as c}from"./field.js";export{e as getExperience,c as getField,t as getPicked,n as useExperience,o as useLocalStorage,r as usePicked,s as useSessionStorage,i as useSetStepContext,a as useStep};
@@ -2,36 +2,21 @@ import { Field, Response } from '@picked/client';
2
2
  type FieldWithValue = Field & {
3
3
  value: Response | undefined;
4
4
  };
5
- interface StepWithLabel {
5
+ type StepWithLabel = {
6
6
  id: string;
7
7
  label: string;
8
- }
8
+ };
9
9
  export interface StepContext {
10
10
  step: StepWithLabel;
11
11
  fields: FieldWithValue[];
12
12
  isActiveStep?: boolean;
13
13
  }
14
14
  export declare const StepContextProvider: import('react').Context<StepContext | null>;
15
- /**
16
- * Returns the current step context, including step metadata and evaluated fields.
17
- * Must be used within a component wrapped by `StepContextProvider`.
18
- * @returns The step, its evaluated fields, and whether this is the active step.
19
- * @example
20
- * const { step, fields, isActiveStep } = useStep()
21
- */
22
15
  export declare function useStep(): {
23
16
  step: StepWithLabel;
24
17
  fields: FieldWithValue[];
25
18
  isActiveStep: boolean;
26
19
  };
27
- /**
28
- * Creates and returns step context stores for the given step ID.
29
- * Evaluates field conditions reactively whenever fields or responses change.
30
- * @param stepId - The ID of the step to set context for.
31
- * @returns The step metadata, evaluated fields, and active step indicator.
32
- * @example
33
- * const { step, fields, isActiveStep } = useSetStepContext('step-123')
34
- */
35
20
  export declare function useSetStepContext(stepId: string): {
36
21
  step: StepWithLabel;
37
22
  fields: FieldWithValue[];
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/hooks/step.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAoC,MAAM,gBAAgB,CAAA;AAMvF,KAAK,cAAc,GAAG,KAAK,GAAG;IAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAA;AAC7D,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAOD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,mBAAmB,6CAA0C,CAAA;AAE1E;;;;;;GAMG;AACH,wBAAgB,OAAO;;;;EAWtB;AAeD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;EA8G/C"}
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/hooks/step.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAoC,MAAM,gBAAgB,CAAA;AAMvF,KAAK,cAAc,GAAG,KAAK,GAAG;IAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAA;AAC7D,KAAK,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAOlD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAA;IACnB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,mBAAmB,6CAA0C,CAAA;AAE1E,wBAAgB,OAAO;;;;EAWtB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;EA+F/C"}
@@ -1 +1 @@
1
- import{createContext as y,useMemo as m,useContext as E}from"react";import{combine as S,attach as F,createEffect as P,createStore as R,sample as k}from"effector";import{evaluateRuleLogic as A}from"@picked/client";import{useUnit as g}from"effector-react";import{useStepRouter as K}from"../router/context.js";import{useExperience as _,usePicked as B}from"./client.js";const D=y(null);function G(){const t=E(D);if(!t)throw new Error("useStep must be used within a StepContextProvider");return{step:t.step,fields:t.fields,isActiveStep:t.isActiveStep??!1}}function H(t){const l=_(),s=B(),{activeStep:f}=K(),x=m(()=>f?.id===t,[f?.id,t]),{stepContext:v}=m(()=>{const C=l.treeStore.map(o=>o.steps),h=S(C,s.steps.listStore,(o,i)=>i.filter(c=>o.includes(c.id))),r=F({source:S({steps:h,fields:s.fields.listStore,responses:s.responses.listStore}),mapParams:(o,i)=>i,effect:P(async({steps:o,fields:i,responses:c})=>{const n=o.find(e=>e.id===t);if(!n)throw new Error(`Step with id "${t}" not found in the experience tree.`);const w=i.filter(e=>(n.fieldIds??[]).includes(e.id)),p=[];for(const e of w)e.condition?await A(s,e.condition)&&p.push(e):p.push(e);const a={};for(const e of c)a[e.fieldKey]=e;const b=p.map(e=>({...e,value:a[e.key]?.value}));return{step:{id:n.id,label:n.name??n.label},fields:b}})}),u=R({step:{id:t,label:""},fields:[]});return u.on(r.doneData,(o,i)=>i),k({clock:[s.fields.listStore,s.responses.listStore],target:r}),r(),{stepContextFx:r,stepContext:u}},[t,s,l]),d=g(v);return{step:d.step,fields:d.fields,isActiveStep:x}}export{D as StepContextProvider,H as useSetStepContext,G as useStep};
1
+ import{useExperience as e,usePicked as t}from"./client.js";import{useStepRouter as n}from"../router/context.js";import{createContext as r,useContext as i,useMemo as a}from"react";import{attach as o,combine as s,createEffect as c,createStore as l,sample as u}from"effector";import{evaluateRuleLogic as d}from"@picked/client";import{useUnit as f}from"effector-react";var p=r(null);function m(){let e=i(p);if(!e)throw Error(`useStep must be used within a StepContextProvider`);return{step:e.step,fields:e.fields,isActiveStep:e.isActiveStep??!1}}function h(r){let i=e(),p=t(),{activeStep:m}=n(),h=a(()=>m?.id===r,[m?.id,r]),{stepContext:g}=a(()=>{let e=o({source:s({steps:i.treeStore.map(e=>e.steps),fields:p.fields.listStore,responses:p.responses.listStore}),effect:c(async({steps:e,fields:t,responses:n})=>{let i=e.find(e=>e.id===r);if(!i)throw Error(`Step with id "${r}" not found in the experience tree.`);let a=t.filter(e=>i.fieldIds.includes(e.id)),o=[];for(let e of a)e.condition?await d(p,e.condition)&&o.push(e):o.push(e);let s=o.map(e=>{let t=n.find(t=>t.fieldId===e.id)?.value;return{...e,value:t}});return{step:{id:i.id,label:i.label},fields:s}})}),t=l({step:{id:r,label:``},fields:[]});return t.on(e.doneData,(e,t)=>t),u({clock:[p.fields.listStore,p.responses.listStore],target:e}),e(),{stepContextFx:e,stepContext:t}},[r,p,i]),_=f(g);return{step:_?.step,fields:_?.fields||[],isActiveStep:h}}export{p as StepContextProvider,h as useSetStepContext,m as useStep};
@@ -1 +1 @@
1
- import{useState as x,useEffect as a,useCallback as d}from"react";import{createStorageKey as k,sessionStore as v,localStore as E,supportsSessionStorage as K,supportsLocalStorage as L}from"@picked/client";import{useExperience as h}from"./client.js";const y={fallback:null,scope:"global"};function u(o,n,l){const{fallback:i,scope:f}={...y,...l},p=h(),s=o==="session"?v:E,r=o==="session"?K:L,[S,c]=x(i??null),t=k(n,f,p);a(()=>{if(r()){const e=s.get(t).text();e!==null&&c(e)}},[s,t,r]),a(()=>{if(!r())return;const e=m=>{c(m.text())},b=s.subscribe(t,e);return()=>{b()}},[s,t,r]);const g=d(e=>{c(e),r()&&(e?s.set(t,e):s.remove(t))},[s,t,r]);return[S,g]}function j(o,n){return u("session",o,n)}function q(o,n){return u("local",o,n)}export{q as useLocalStorage,j as useSessionStorage};
1
+ import{useExperience as e}from"./client.js";import{useCallback as t,useEffect as n,useState as r}from"react";import{createStorageKey as i,localStore as a,sessionStore as o,supportsLocalStorage as s,supportsSessionStorage as c}from"@picked/client";var l={fallback:null,scope:`global`};function u(u,d,f){let{fallback:p,scope:m}={...l,...f},h=e(),g=u===`session`?o:a,_=u===`session`?c:s,[v,y]=r(p??null),b=i(d,m,h);return n(()=>{if(_()){let e=g.get(b).text();e!==null&&y(e)}},[g,b,_]),n(()=>{if(!_())return;let e=g.subscribe(b,e=>{y(e.text())});return()=>{e()}},[g,b,_]),[v,t(e=>{y(e),_()&&(e?g.set(b,e):g.remove(b))},[g,b,_])]}function d(e,t){return u(`session`,e,t)}function f(e,t){return u(`local`,e,t)}export{f as useLocalStorage,d as useSessionStorage};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{adaptReactComponent as a,isValidAdaptedComponent as e}from"./component.js";export{a as adaptReactComponent,e as isValidAdaptedComponent};
1
+ import{adaptReactComponent as e,isValidAdaptedComponent as t}from"./component.js";export{e as adaptReactComponent,t as isValidAdaptedComponent};
@@ -1 +1 @@
1
- import{reactFrameworkPlugin as o}from"./plugin.js";export{o as reactFrameworkPlugin};
1
+ import{reactFrameworkPlugin as e}from"./plugin.js";export{e as reactFrameworkPlugin};
@@ -1 +1 @@
1
- import{adaptReactComponent as o}from"../../component.js";import{renderReactComponent as m}from"../../render/browser.js";const a=e=>({name:"react-framework",setup:t=>{t.registerFramework({name:"react",render(...n){return m(...n,{stylesheets:e.stylesheets,css:e.css})}});const r=e.components.experience;r&&t.registerComponent("experience",o(r.component,r.style))}});export{a as reactFrameworkPlugin};
1
+ import{adaptReactComponent as e}from"../../component.js";import{renderReactComponent as t}from"../../render/browser.js";var n=n=>({name:`react-framework`,setup:r=>{r.registerFramework({name:`react`,render(...e){return t(...e,{stylesheets:n.stylesheets,css:n.css})}});let i=n.components.experience;i&&r.registerComponent(`experience`,e(i.component,i.style))}});export{n as reactFrameworkPlugin};
@@ -1 +1 @@
1
- import o from"react";import{createRoot as y}from"react-dom/client";import{isLazyLoader as E}from"@picked/client";import{isValidAdaptedComponent as h}from"../component.js";import{ClientProvider as C,ExperienceProvider as A}from"../context.js";import{mergeArrays as u}from"../utils/array.js";const i=new WeakMap,j=async(r,e,c,l,a)=>{if(!h(e))throw new Error("The component is invalid.");const m=u(e.style?.sheets,a.stylesheets),d=u(e.style?.css,a.css);m.length&&m.forEach(s=>{const t=document.createElement("link");t.setAttribute("rel","stylesheet"),t.setAttribute("href",s),t.setAttribute("type","text/css"),t.setAttribute("picked-injected","true"),r.appendChild(t)}),d.length&&d.forEach(s=>{const t=document.createElement("style");t.textContent=s,t.setAttribute("type","text/css"),t.setAttribute("picked-injected","true"),r.appendChild(t)});const p=document.createElement("div");r.appendChild(p);const f=y(p);i.set(r,f);let n;E(e.component)?n=(await e.component.load()).default:e.component instanceof Promise?n=(await e.component).default:n=e.component,f.render(o.createElement(C,{value:c},o.createElement(A,{value:l},o.createElement(n,{client:c,experience:l}))))},w=r=>{const e=i.get(r);e&&(e.unmount(),i.delete(r))};export{j as renderReactComponent,w as unRenderReactComponent};
1
+ import{isValidAdaptedComponent as e}from"../component.js";import{ClientProvider as t,ExperienceProvider as n}from"../context.js";import{mergeArrays as r}from"../utils/array.js";import i from"react";import{isLazyLoader as a}from"@picked/client";import{createRoot as o}from"react-dom/client";var s=new WeakMap,c=async(c,l,u,d,f)=>{if(!e(l))throw Error(`The component is invalid.`);let p=r(l.style?.sheets,f.stylesheets),m=r(l.style?.css,f.css);p.length&&p.forEach(e=>{let t=document.createElement(`link`);t.setAttribute(`rel`,`stylesheet`),t.setAttribute(`href`,e),t.setAttribute(`type`,`text/css`),t.setAttribute(`picked-injected`,`true`),c.appendChild(t)}),m.length&&m.forEach(e=>{let t=document.createElement(`style`);t.textContent=e,t.setAttribute(`type`,`text/css`),t.setAttribute(`picked-injected`,`true`),c.appendChild(t)});let h=document.createElement(`div`);c.appendChild(h);let g=o(h);s.set(c,g);let _;_=a(l.component)?(await l.component.load()).default:l.component instanceof Promise?(await l.component).default:l.component,g.render(i.createElement(t,{value:u},i.createElement(n,{value:d},i.createElement(_,{client:u,experience:d}))))},l=e=>{let t=s.get(e);t&&(t.unmount(),s.delete(e))};export{c as renderReactComponent,l as unRenderReactComponent};
@@ -1 +1 @@
1
- import r from"react";import{renderToString as d}from"react-dom/server";import{isLazyLoader as f}from"@picked/client";import{isValidAdaptedComponent as p}from"../component.js";import{ClientProvider as y,ExperienceProvider as h}from"../context.js";import{mergeArrays as i}from"../utils/array.js";const R=async(e,s,o,a)=>{if(!p(e))throw new Error("The component is invalid.");const m=i(e.style?.sheets,a.stylesheets),n=i(e.style?.css,a.css),l="";let t;f(e.component)?t=(await e.component.load()).default:e.component instanceof Promise?t=(await e.component).default:t=e.component;const c=d(r.createElement(y,{value:s},r.createElement(h,{value:o},r.createElement(t,{client:s,experience:o}))));return{stylesheets:m,css:n,body:c,head:l}};export{R as staticRenderReactComponent};
1
+ import{isValidAdaptedComponent as e}from"../component.js";import{ClientProvider as t,ExperienceProvider as n}from"../context.js";import{mergeArrays as r}from"../utils/array.js";import i from"react";import{isLazyLoader as a}from"@picked/client";import{renderToString as o}from"react-dom/server";var s=async(s,c,l,u)=>{if(!e(s))throw Error(`The component is invalid.`);let d=r(s.style?.sheets,u.stylesheets),f=r(s.style?.css,u.css),p;return p=a(s.component)?(await s.component.load()).default:s.component instanceof Promise?(await s.component).default:s.component,{stylesheets:d,css:f,body:o(i.createElement(t,{value:c},i.createElement(n,{value:l},i.createElement(p,{client:c,experience:l})))),head:``}};export{s as staticRenderReactComponent};
@@ -1 +1 @@
1
- import{jsx as f}from"react/jsx-runtime";import{useState as c,useEffect as n}from"react";import{useSetStepContext as d,StepContextProvider as p}from"../hooks/step.js";import{useStepRouter as v}from"./context.js";const g=({id:i,component:e,children:S})=>{const r={id:i},{registerStep:s,unregisterStep:o}=v(),[l,u]=c(null),a=d(i);return n(()=>(s(r),()=>o(r)),[s,o,r]),n(()=>{e&&typeof e!="function"?Promise.resolve(e).then(t=>{typeof t=="object"&&"default"in t?u(()=>t.default):u(()=>t)}):typeof e=="function"&&u(()=>e)},[e]),e?l?f(p.Provider,{value:a,children:f(l,{})}):null:f(p.Provider,{value:a,children:S})};export{g as default};
1
+ import{useStepRouter as e}from"./context.js";import{StepContextProvider as t,useSetStepContext as n}from"../hooks/step.js";import{useEffect as r,useState as i}from"react";import{jsx as a}from"react/jsx-runtime";var o=({id:o,component:s,children:c})=>{let l={id:o},{registerStep:u,unregisterStep:d}=e(),[f,p]=i(null),m=n(o);return r(()=>(u(l),()=>d(l)),[u,d,l]),r(()=>{s&&typeof s!=`function`?Promise.resolve(s).then(e=>{typeof e==`object`&&`default`in e?p(()=>e.default):p(()=>e)}):typeof s==`function`&&p(()=>s)},[s]),s?f?a(t.Provider,{value:m,children:a(f,{})}):null:a(t.Provider,{value:m,children:c})};export{o as default};
@@ -1 +1 @@
1
- import{jsx as x}from"react/jsx-runtime";import{useState as c,useRef as g,useCallback as u,useEffect as R}from"react";import{supportsWindow as h}from"@picked/client";import{useUnit as A}from"effector-react";import{useExperience as E}from"../hooks/client.js";import"../hooks/step.js";import{StepRouterProvider as M}from"./context.js";const V=({children:p})=>{const f=E(),{currentStepStore:l}=f,e=A(l),[S,i]=c(null),o=g(!1),[s,n]=c([]),m=u(t=>{if(h())n(r=>[...r,t]);else{if(o.current)return;t.id===e?.id&&(i(t),o.current=!0)}},[e?.id]),a=u(t=>{n(r=>r.filter(v=>v!==t))},[]);R(()=>{i(s.find(t=>t.id===e?.id)||null)},[s,e?.id]);const d={activeStep:S,registerStep:m,unregisterStep:a};return e?.id?x(M,{value:d,children:p}):null};export{V as default};
1
+ import{useExperience as e}from"../hooks/client.js";import{StepRouterProvider as t}from"./context.js";import"../hooks/index.js";import{useCallback as n,useEffect as r,useRef as i,useState as a}from"react";import{supportsWindow as o}from"@picked/client";import{useUnit as s}from"effector-react";import{jsx as c}from"react/jsx-runtime";var l=({children:l})=>{let{currentStepStore:u}=e(),d=s(u),[f,p]=a(null),m=i(!1),[h,g]=a([]),_=n(e=>{if(o())g(t=>[...t,e]);else{if(m.current)return;e.id===d?.id&&(p(e),m.current=!0)}},[d?.id]),v=n(e=>{g(t=>t.filter(t=>t!==e))},[]);r(()=>{p(h.find(e=>e.id===d?.id)||null)},[h,d?.id]);let y={activeStep:f,registerStep:_,unregisterStep:v};return d?.id?c(t,{value:y,children:l}):null};export{l as default};
@@ -1 +1 @@
1
- import{createContext as o,useContext as r}from"react";const e=o(null),u=e.Provider,s=()=>{const t=r(e);if(!t)throw new Error("useStepRouter must be used within a StepRouterProvider");return t};export{u as StepRouterProvider,s as useStepRouter};
1
+ import{createContext as e,useContext as t}from"react";var n=e(null),r=n.Provider,i=()=>{let e=t(n);if(!e)throw Error(`useStepRouter must be used within a StepRouterProvider`);return e};export{r as StepRouterProvider,i as useStepRouter};
@@ -1 +1 @@
1
- import{default as r}from"./StepRouter.js";import{default as p}from"./Step.js";import{StepRouterProvider as f,useStepRouter as a}from"./context.js";export{p as Step,r as StepRouter,f as StepRouterProvider,a as useStepRouter};
1
+ import{StepRouterProvider as e,useStepRouter as t}from"./context.js";import n from"./StepRouter.js";import r from"./Step.js";export{r as Step,n as StepRouter,e as StepRouterProvider,t as useStepRouter};
@@ -1 +1 @@
1
- import{isValidAdaptedComponent as n}from"../component.js";import{staticRenderReactComponent as d}from"../render/server.js";const m={isValidComponent:n,render:async(o,t,r)=>{const e=await d(o,t,r,{});return{head:e.head,body:e.body}}};export{m as renderer};
1
+ import{isValidAdaptedComponent as e}from"../component.js";import{staticRenderReactComponent as t}from"../render/server.js";var n={isValidComponent:e,render:async(e,n,r)=>{let i=await t(e,n,r,{});return{head:i.head,body:i.body}}};export{n as renderer};
@@ -1 +1 @@
1
- const t=(r,e)=>[...r||[],...e||[]];export{t as mergeArrays};
1
+ var e=(e,t)=>[...e||[],...t||[]];export{e as mergeArrays};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@picked/react",
3
- "version": "0.0.1-dev.1773807602703",
3
+ "version": "0.0.1-dev.1774224866171",
4
4
  "devDependencies": {
5
5
  "@picked/client": "workspace:*",
6
6
  "@repo/eslint-config": "workspace:*",
@@ -10,8 +10,8 @@
10
10
  "@types/node": "^22",
11
11
  "@types/react": "19.2.4",
12
12
  "@types/react-dom": "19.2.3",
13
- "@vitejs/plugin-react": "^4.5.2",
14
- "@vitest/coverage-v8": "^4.0.17",
13
+ "@vitejs/plugin-react": "^6.0.1",
14
+ "@vitest/coverage-v8": "^4.1.0",
15
15
  "effector": "^23.3.0",
16
16
  "effector-react": "^23.3.0",
17
17
  "fast-glob": "^3.3.3",
@@ -19,9 +19,9 @@
19
19
  "size-limit": "^12.0.0",
20
20
  "typedoc": "^0.28.5",
21
21
  "typedoc-plugin-markdown": "^4.6.3",
22
- "vite": "^7.3.1",
22
+ "vite": "^8.0.1",
23
23
  "vite-plugin-dts": "^4.5.4",
24
- "vitest": "^4.0.17"
24
+ "vitest": "^4.1.0"
25
25
  },
26
26
  "exports": {
27
27
  ".": {
@@ -59,33 +59,16 @@
59
59
  "dist"
60
60
  ],
61
61
  "knip": {
62
- "entry": [
63
- "src/index.ts",
64
- "src/server/index.ts",
65
- "src/router/index.ts",
66
- "src/form/index.ts",
67
- "src/hooks/index.ts",
68
- "src/plugins/framework/index.ts"
69
- ],
70
- "ignore": [
71
- "eslint.config.js"
72
- ],
73
62
  "ignoreBinaries": [
74
- "attw",
75
63
  "knip",
76
64
  "jscpd",
77
65
  "eslint",
78
- "tsc"
79
- ],
80
- "ignoreDependencies": [
81
- "@picked/client",
82
- "@repo/eslint-config",
83
- "@repo/typescript-config"
66
+ "tsgo"
84
67
  ]
85
68
  },
86
69
  "module": "./dist/index.js",
87
70
  "peerDependencies": {
88
- "@picked/client": "0.0.1-dev.1773807602703",
71
+ "@picked/client": "0.0.1-dev.1774224866171",
89
72
  "effector": "^23.3.0",
90
73
  "effector-react": "^23.3.0",
91
74
  "react": "19.2.2",
@@ -108,7 +91,7 @@
108
91
  "test:coverage": "vitest run --coverage",
109
92
  "test:packaged-types": "attw --pack",
110
93
  "test:watch": "vitest",
111
- "type-check": "tsc -p . --noEmit"
94
+ "type-check": "tsgo -p . --noEmit"
112
95
  },
113
96
  "size-limit": [
114
97
  {