@lockerverse/sdk 0.2.56 → 0.2.57

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 CHANGED
@@ -97,26 +97,27 @@ positive `requestTimeoutMs` value.
97
97
  ## Signup
98
98
 
99
99
  ```ts
100
- import { createLockerverseSignup } from "@lockerverse/sdk/signup";
100
+ import { createLockerverseSignupClient } from "@lockerverse/sdk/signup";
101
101
 
102
- const signup = createLockerverseSignup({
102
+ const signup = createLockerverseSignupClient({
103
103
  communitySlug: "auburn",
104
104
  signupSlug: "tailgate-guests",
105
105
  });
106
106
 
107
107
  const definition = await signup.load();
108
+ const submissionReference = crypto.randomUUID();
108
109
  const submission = await signup.submit({
109
110
  answers: [{ fieldId: "guest-type", value: "student" }],
110
111
  email: "customer@example.com",
111
112
  name: "Ada Lovelace",
112
113
  participantCount: 2,
113
- });
114
+ }, { submissionReference });
114
115
  ```
115
116
 
116
- Signup currently retains its small workflow facade. Its immutable states are
117
- `idle`, `loading`, `ready`, `submitting`, `submitted`, and `error`. When a
118
- submission times out, reuse `recoverableSubmissionReference` with the same
119
- values so Lockerverse can return the original submission.
117
+ The signup client is stateless. Calls to `load` and `submit` are independent.
118
+ Create a submission reference before a request. If an error has
119
+ `recoveryRecommended: true`, reuse that reference with the same values so
120
+ Lockerverse can return the original submission.
120
121
 
121
122
  ## Security and observability
122
123
 
package/dist/signup.d.ts CHANGED
@@ -61,36 +61,13 @@ type CreateLockerverseSignupOptions = CreateLockerverseSignupBaseOptions & ({
61
61
  apiBaseUrl?: undefined;
62
62
  environment?: "production";
63
63
  });
64
- type LockerverseSignupState = {
65
- phase: "idle";
66
- } | {
67
- phase: "loading";
68
- } | {
69
- phase: "ready";
70
- signup: LockerverseSignup;
71
- } | {
72
- phase: "submitting";
73
- signup: LockerverseSignup;
74
- submissionReference: string;
75
- } | {
76
- phase: "submitted";
77
- signup: LockerverseSignup;
78
- submission: LockerverseSignupSubmissionResult;
79
- } | {
80
- phase: "error";
81
- error: LockerverseSdkError;
82
- recoverableSubmissionReference: string | null;
83
- signup: LockerverseSignup | null;
84
- };
85
64
  type LockerverseSignupClient = {
86
- getState: () => LockerverseSignupState;
87
65
  load: () => Promise<LockerverseSignup>;
88
66
  submit: (submission: LockerverseSignupSubmission, options?: LockerverseSignupSubmitOptions) => Promise<LockerverseSignupSubmissionResult>;
89
- subscribe: (listener: (state: LockerverseSignupState) => void) => () => void;
90
67
  };
91
68
  //#endregion
92
69
  //#region src/signup.d.ts
93
- declare function createLockerverseSignup(options: CreateLockerverseSignupOptions): LockerverseSignupClient;
70
+ declare function createLockerverseSignupClient(options: CreateLockerverseSignupOptions): LockerverseSignupClient;
94
71
  //#endregion
95
- export { type CreateLockerverseSignupOptions, type LockerverseCustomField, type LockerverseCustomFieldAnswer, type LockerverseCustomFieldAnswerValue, type LockerverseCustomFieldOption, type LockerverseEnvironment, type LockerverseSignup, type LockerverseSignupAddress, type LockerverseSignupClient, type LockerverseSignupField, type LockerverseSignupFields, type LockerverseSignupState, type LockerverseSignupSubmission, type LockerverseSignupSubmissionResult, type LockerverseSignupSubmitOptions, createLockerverseSignup };
72
+ export { type CreateLockerverseSignupOptions, type LockerverseCustomField, type LockerverseCustomFieldAnswer, type LockerverseCustomFieldAnswerValue, type LockerverseCustomFieldOption, type LockerverseEnvironment, type LockerverseSdkError, type LockerverseSignup, type LockerverseSignupAddress, type LockerverseSignupClient, type LockerverseSignupField, type LockerverseSignupFields, type LockerverseSignupSubmission, type LockerverseSignupSubmissionResult, type LockerverseSignupSubmitOptions, createLockerverseSignupClient };
96
73
  //# sourceMappingURL=signup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signup.d.ts","names":[],"sources":["../src/signup-types.ts","../src/signup.ts"],"mappings":";;KAQY;EACV;EACA;;KAGU;EACV,SAAS;EACT,OAAO;EACP,MAAM;EACN,kBAAkB;EAClB,OAAO;;KAGG;EACV;EACA,cAAc;EACd;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV,UAAU;EACV,UAAU;EACV;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;;KAYU;EACV;;KAGG;EACH;EACA,eAAe,WAAW;EAC1B,WAAW,OAAO;EAClB;EACA;EACA;;KAGU,iCACV;EAGQ;EACA,aAAa;;EAGb;EACA;;KAIE;EACN;;EACA;;EACA;EAAgB,QAAQ;;EAExB;EACA,QAAQ;EACR;;EAGA;EACA,QAAQ;EACR,YAAY;;EAGZ;EACA,OAAO;EACP;EACA,QAAQ;;KAGF;EACV,gBAAgB;EAChB,YAAY,QAAQ;EACpB,SACE,YAAY,6BACZ,UAAU,mCACP,QAAQ;EACb,YAAY,WAAW,OAAO;;;;iBClFhB,wBACd,SAAS,iCACR"}
1
+ {"version":3,"file":"signup.d.ts","names":[],"sources":["../src/signup-types.ts","../src/signup.ts"],"mappings":";;KAQY;EACV;EACA;;KAGU;EACV,SAAS;EACT,OAAO;EACP,MAAM;EACN,kBAAkB;EAClB,OAAO;;KAGG;EACV;EACA,cAAc;EACd;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV,UAAU;EACV,UAAU;EACV;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;;KAYU;EACV;;KAGG;EACH;EACA,eAAe,WAAW;EAC1B,WAAW,OAAO;EAClB;EACA;EACA;;KAGU,iCACV;EAGQ;EACA,aAAa;;EAGb;EACA;;KAIE;EACV,YAAY,QAAQ;EACpB,SACE,YAAY,6BACZ,UAAU,mCACP,QAAQ;;;;iBC9DC,8BACd,SAAS,iCACR"}
package/dist/signup.js CHANGED
@@ -1,2 +1,2 @@
1
- import{A as e,C as t,D as n,M as r,T as i,a,c as o,f as s,h as c,j as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v,w as y,x as b}from"./transport.js";import{n as x}from"./types.js";const S=e({city:l(),country:l(),line1:l(),line2:y(b(l())),postalCode:l(),state:l()}),C=i(e({address:y(b(S)),answers:y(m(p)),email:y(b(l())),honeypot:y(l()),name:o,participantCount:y(b(v(0))),phone:y(b(l()))})),w=t({enabled:d(),required:d()}),T=n(t({config:t({builtInFields:t({address:w,email:w,name:w,participantCount:w,phone:w}),customFields:g}),coverImageUrl:u,description:u,id:o,isActive:d(),name:o,slug:o,title:u}),r(({config:e,...t})=>({...t,customFields:e.customFields,fields:e.builtInFields}))),E=n(a,c(({id:e})=>!!e.trim(),`Invalid signup submission ID.`)),D=i(T),O=i(E);function k(e){let t=h(e),n=new Set;return{commit(e){t=h(e);for(let e of[...n])try{e(t)}catch{}},getState(){return t},subscribe(e){n.add(e);try{e(t)}catch{}return()=>{n.delete(e)}}}}function A(e,t,n){return e instanceof x?e:n(new x({code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`,recoveryRecommended:t,reportable:t}))}function j(e){let t=s(e),n=k({phase:`idle`}),r=null,i=!1,a=!1,o=f({communitySlug:t.communitySlugValue,environment:t.environment,getContext:()=>({signupSlug:t.signupSlugValue}),onError:t.onError,resourceContextName:`lockerverse_signup`,sentryDsn:t.sentryDsn}),{requestJson:c}=_(t.fetchImplementation,e=>o(e.operation===`submit_signup`&&!e.recoveryRecommended?new x({code:e.code,message:e.message,operation:e.operation,recoveryRecommended:!0,reportable:e.reportable}):e),t.requestTimeoutMs);return{getState:n.getState,async load(){let e={code:`signup_load_failed`,message:`Unable to load Lockerverse signup.`,operation:`load_signup`};if(i||a)throw o(new x({...e,reportable:!1}));i=!0,r=null,n.commit({phase:`loading`});try{let i;try{i=await c(`${t.apiBaseUrl}/community/${t.communitySlug}/sign-up-widgets/${t.signupSlug}`,void 0,D,e,e)}catch(e){throw e instanceof x&&n.commit({error:e,phase:`error`,recoverableSubmissionReference:null,signup:null}),e}if(!i.ok){let t=o(new x({...e,reportable:i.response.status>=500,status:i.response.status}));throw n.commit({error:t,phase:`error`,recoverableSubmissionReference:null,signup:null}),t}let a=h(i.value);return r=a,n.commit({phase:`ready`,signup:a}),a}finally{i=!1}},async submit(e,i){let s=r,l=i?.submissionReference??globalThis.crypto.randomUUID(),u={code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`};if(!s?.isActive||a)throw o(new x({...u,reportable:!1}));let d;try{d=C(e)}catch{let e=o(new x({...u,message:`Lockerverse signup input is invalid.`,reportable:!1}));throw n.commit({error:e,phase:`error`,recoverableSubmissionReference:null,signup:s}),e}a=!0,n.commit({phase:`submitting`,signup:s,submissionReference:l});let f=!1;try{let e=JSON.stringify({...d,submissionReference:l});f=!0;let r=await c(`${t.apiBaseUrl}/community/${t.communitySlug}/sign-up-widgets/${t.signupSlug}/submissions`,{body:e,headers:{"content-type":`application/json`},method:`POST`},O,u,u);if(!r.ok)throw o(new x({...u,recoveryRecommended:r.response.status>=500,reportable:r.response.status>=500,status:r.response.status}));let i=h(r.value);if(i.id!==l)throw o(new x({...u,recoveryRecommended:!0,reportable:!0}));return n.commit({phase:`submitted`,signup:s,submission:i}),i}catch(e){let t=A(e,f,o);throw n.commit({error:t,phase:`error`,recoverableSubmissionReference:t.recoveryRecommended?l:null,signup:s}),t}finally{a=!1}},subscribe:n.subscribe}}export{j as createLockerverseSignup};
1
+ import{A as e,C as t,D as n,M as r,T as i,a,c as o,f as s,h as c,j as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v,w as y,x as b}from"./transport.js";import{n as x}from"./types.js";const S=e({city:l(),country:l(),line1:l(),line2:y(b(l())),postalCode:l(),state:l()}),C=i(e({address:y(b(S)),answers:y(m(p)),email:y(b(l())),honeypot:y(l()),name:o,participantCount:y(b(v(0))),phone:y(b(l()))})),w=t({enabled:d(),required:d()}),T=n(t({config:t({builtInFields:t({address:w,email:w,name:w,participantCount:w,phone:w}),customFields:g}),coverImageUrl:u,description:u,id:o,isActive:d(),name:o,slug:o,title:u}),r(({config:e,...t})=>({...t,customFields:e.customFields,fields:e.builtInFields}))),E=n(a,c(({id:e})=>!!e.trim(),`Invalid signup submission ID.`)),D=i(T),O=i(E);function k(e,t,n){return e instanceof x?e:n(new x({code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`,recoveryRecommended:t,reportable:t}))}function A(e){let t=s(e),n=f({communitySlug:t.communitySlugValue,environment:t.environment,getContext:()=>({signupSlug:t.signupSlugValue}),onError:t.onError,resourceContextName:`lockerverse_signup`,sentryDsn:t.sentryDsn}),{requestJson:r}=_(t.fetchImplementation,e=>n(e.operation===`submit_signup`&&!e.recoveryRecommended?new x({code:e.code,message:e.message,operation:e.operation,recoveryRecommended:!0,reportable:e.reportable}):e),t.requestTimeoutMs),i=`${t.apiBaseUrl}/community/${t.communitySlug}/sign-up-widgets/${t.signupSlug}`;return{async load(){let e={code:`signup_load_failed`,message:`Unable to load Lockerverse signup.`,operation:`load_signup`},t=await r(i,void 0,D,e,e);if(!t.ok)throw n(new x({...e,reportable:t.response.status>=500,status:t.response.status}));return h(t.value)},async submit(e,t){let a=t?.submissionReference??globalThis.crypto.randomUUID(),o={code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`},s;try{s=C(e)}catch{throw n(new x({...o,message:`Lockerverse signup input is invalid.`,reportable:!1}))}let c=!1;try{let e=JSON.stringify({...s,submissionReference:a});c=!0;let t=await r(`${i}/submissions`,{body:e,headers:{"content-type":`application/json`},method:`POST`},O,o,o);if(!t.ok)throw n(new x({...o,recoveryRecommended:t.response.status>=500,reportable:t.response.status>=500,status:t.response.status}));let l=h(t.value);if(l.id!==a)throw n(new x({...o,recoveryRecommended:!0,reportable:!0}));return l}catch(e){throw k(e,c,n)}}}}export{A as createLockerverseSignupClient};
2
2
  //# sourceMappingURL=signup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signup.js","names":[],"sources":["../src/signup-input-schema.ts","../src/signup-schemas.ts","../src/state.ts","../src/signup.ts"],"sourcesContent":["import {\n array,\n nullable,\n optional,\n parser,\n strictObject,\n string,\n} from \"valibot\";\n\nimport {\n customFieldAnswerSchema,\n nonEmptyStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupAddressSchema = strictObject({\n city: string(),\n country: string(),\n line1: string(),\n line2: optional(nullable(string())),\n postalCode: string(),\n state: string(),\n});\n\nexport const parseSignupSubmission = parser(\n strictObject({\n address: optional(nullable(signupAddressSchema)),\n answers: optional(array(customFieldAnswerSchema)),\n email: optional(nullable(string())),\n honeypot: optional(string()),\n name: nonEmptyStringSchema,\n participantCount: optional(nullable(safeIntegerSchema(0))),\n phone: optional(nullable(string())),\n })\n);\n","import { boolean, check, object, parser, pipe, transform } from \"valibot\";\n\nimport { vPublicSignUpWidgetSubmissionResponseDto } from \"./generated/public-api/valibot.gen.ts\";\nimport {\n customFieldsSchema,\n nonEmptyStringSchema,\n optionalNullableStringSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupFieldSchema = object({\n enabled: boolean(),\n required: boolean(),\n});\n\nexport const publicSignupSchema = pipe(\n object({\n config: object({\n builtInFields: object({\n address: signupFieldSchema,\n email: signupFieldSchema,\n name: signupFieldSchema,\n participantCount: signupFieldSchema,\n phone: signupFieldSchema,\n }),\n customFields: customFieldsSchema,\n }),\n coverImageUrl: optionalNullableStringSchema,\n description: optionalNullableStringSchema,\n id: nonEmptyStringSchema,\n isActive: boolean(),\n name: nonEmptyStringSchema,\n slug: nonEmptyStringSchema,\n title: optionalNullableStringSchema,\n }),\n transform(({ config, ...signup }) => ({\n ...signup,\n customFields: config.customFields,\n fields: config.builtInFields,\n }))\n);\n\nexport const signupSubmissionResultSchema = pipe(\n vPublicSignUpWidgetSubmissionResponseDto,\n check(({ id }) => Boolean(id.trim()), \"Invalid signup submission ID.\")\n);\n\nexport const parsePublicSignup = parser(publicSignupSchema);\nexport const parseSignupSubmissionResult = parser(signupSubmissionResultSchema);\n","import { deepFreeze } from \"./deep-freeze.ts\";\n\nexport function createStateStore<State>(initialState: State) {\n let state = deepFreeze(initialState);\n const listeners = new Set<(nextState: State) => void>();\n\n return {\n commit(nextState: State) {\n state = deepFreeze(nextState);\n for (const listener of [...listeners]) {\n try {\n listener(state);\n } catch {\n // Host listeners cannot interrupt SDK state transitions.\n }\n }\n },\n getState() {\n return state;\n },\n subscribe(listener: (nextState: State) => void) {\n listeners.add(listener);\n try {\n listener(state);\n } catch {\n // A failing initial render must not prevent subscription or checkout.\n }\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","import { deepFreeze } from \"./deep-freeze.ts\";\nimport { resolveSignupEnvironment } from \"./environment.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport { parseSignupSubmission } from \"./signup-input-schema.ts\";\nimport {\n parsePublicSignup,\n parseSignupSubmissionResult,\n} from \"./signup-schemas.ts\";\nimport type {\n CreateLockerverseSignupOptions,\n LockerverseSignup,\n LockerverseSignupClient,\n LockerverseSignupState,\n LockerverseSignupSubmission,\n} from \"./signup-types.ts\";\nimport { createStateStore } from \"./state.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport { LockerverseSdkError } from \"./types.ts\";\n\nfunction classifySubmissionError(\n error: unknown,\n requestAttempted: boolean,\n reportError: (error: LockerverseSdkError) => LockerverseSdkError\n) {\n if (error instanceof LockerverseSdkError) {\n return error;\n }\n return reportError(\n new LockerverseSdkError({\n code: \"signup_submit_failed\",\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\",\n recoveryRecommended: requestAttempted,\n reportable: requestAttempted,\n })\n );\n}\n\nexport function createLockerverseSignup(\n options: CreateLockerverseSignupOptions\n): LockerverseSignupClient {\n const runtime = resolveSignupEnvironment(options);\n const stateStore = createStateStore<LockerverseSignupState>({\n phase: \"idle\",\n });\n let loadedSignup: LockerverseSignup | null = null;\n let loading = false;\n let submitting = false;\n\n const reportError = createSdkErrorReporter({\n communitySlug: runtime.communitySlugValue,\n environment: runtime.environment,\n getContext: () => ({ signupSlug: runtime.signupSlugValue }),\n onError: runtime.onError,\n resourceContextName: \"lockerverse_signup\",\n sentryDsn: runtime.sentryDsn,\n });\n\n const { requestJson } = createTransport(\n runtime.fetchImplementation,\n (error) =>\n reportError(\n error.operation === \"submit_signup\" && !error.recoveryRecommended\n ? new LockerverseSdkError({\n code: error.code,\n message: error.message,\n operation: error.operation,\n recoveryRecommended: true,\n reportable: error.reportable,\n })\n : error\n ),\n runtime.requestTimeoutMs\n );\n\n return {\n getState: stateStore.getState,\n async load() {\n const errorContext = {\n code: \"signup_load_failed\" as const,\n message: \"Unable to load Lockerverse signup.\",\n operation: \"load_signup\" as const,\n };\n if (loading || submitting) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n reportable: false,\n })\n );\n }\n\n loading = true;\n loadedSignup = null;\n stateStore.commit({ phase: \"loading\" });\n try {\n let signupResponse: Awaited<\n ReturnType<typeof requestJson<LockerverseSignup>>\n >;\n try {\n signupResponse = await requestJson(\n `${runtime.apiBaseUrl}/community/${runtime.communitySlug}/sign-up-widgets/${runtime.signupSlug}`,\n undefined,\n parsePublicSignup,\n errorContext,\n errorContext\n );\n } catch (error) {\n if (error instanceof LockerverseSdkError) {\n stateStore.commit({\n error,\n phase: \"error\",\n recoverableSubmissionReference: null,\n signup: null,\n });\n }\n throw error;\n }\n if (!signupResponse.ok) {\n const error = reportError(\n new LockerverseSdkError({\n ...errorContext,\n reportable: signupResponse.response.status >= 500,\n status: signupResponse.response.status,\n })\n );\n stateStore.commit({\n error,\n phase: \"error\",\n recoverableSubmissionReference: null,\n signup: null,\n });\n throw error;\n }\n const signup = deepFreeze(signupResponse.value);\n loadedSignup = signup;\n stateStore.commit({ phase: \"ready\", signup });\n return signup;\n } finally {\n loading = false;\n }\n },\n async submit(submission: LockerverseSignupSubmission, submitOptions) {\n const signup = loadedSignup;\n const submissionReference =\n submitOptions?.submissionReference ?? globalThis.crypto.randomUUID();\n const errorContext = {\n code: \"signup_submit_failed\" as const,\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\" as const,\n };\n if (!signup?.isActive || submitting) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n reportable: false,\n })\n );\n }\n\n let parsedSubmission: ReturnType<typeof parseSignupSubmission>;\n try {\n parsedSubmission = parseSignupSubmission(submission);\n } catch {\n const error = reportError(\n new LockerverseSdkError({\n ...errorContext,\n message: \"Lockerverse signup input is invalid.\",\n reportable: false,\n })\n );\n stateStore.commit({\n error,\n phase: \"error\",\n recoverableSubmissionReference: null,\n signup,\n });\n // biome-ignore lint/style/useErrorCause: Raw validation errors must not escape the SDK boundary.\n throw error;\n }\n\n submitting = true;\n stateStore.commit({ phase: \"submitting\", signup, submissionReference });\n let requestAttempted = false;\n try {\n const body = JSON.stringify({\n ...parsedSubmission,\n submissionReference,\n });\n requestAttempted = true;\n const submissionResponse = await requestJson(\n `${runtime.apiBaseUrl}/community/${runtime.communitySlug}/sign-up-widgets/${runtime.signupSlug}/submissions`,\n {\n body,\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n },\n parseSignupSubmissionResult,\n errorContext,\n errorContext\n );\n if (!submissionResponse.ok) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: submissionResponse.response.status >= 500,\n reportable: submissionResponse.response.status >= 500,\n status: submissionResponse.response.status,\n })\n );\n }\n const result = deepFreeze(submissionResponse.value);\n if (result.id !== submissionReference) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: true,\n reportable: true,\n })\n );\n }\n stateStore.commit({ phase: \"submitted\", signup, submission: result });\n return result;\n } catch (error) {\n const sdkError = classifySubmissionError(\n error,\n requestAttempted,\n reportError\n );\n stateStore.commit({\n error: sdkError,\n phase: \"error\",\n recoverableSubmissionReference: sdkError.recoveryRecommended\n ? submissionReference\n : null,\n signup,\n });\n throw sdkError;\n } finally {\n submitting = false;\n }\n },\n subscribe: stateStore.subscribe,\n };\n}\n"],"mappings":"yMAeA,MAAM,EAAsB,EAAa,CACvC,KAAM,EAAO,EACb,QAAS,EAAO,EAChB,MAAO,EAAO,EACd,MAAO,EAAS,EAAS,EAAO,CAAC,CAAC,EAClC,WAAY,EAAO,EACnB,MAAO,EAAO,CAChB,CAAC,EAEY,EAAwB,EACnC,EAAa,CACX,QAAS,EAAS,EAAS,CAAmB,CAAC,EAC/C,QAAS,EAAS,EAAM,CAAuB,CAAC,EAChD,MAAO,EAAS,EAAS,EAAO,CAAC,CAAC,EAClC,SAAU,EAAS,EAAO,CAAC,EAC3B,KAAM,EACN,iBAAkB,EAAS,EAAS,EAAkB,CAAC,CAAC,CAAC,EACzD,MAAO,EAAS,EAAS,EAAO,CAAC,CAAC,CACpC,CAAC,CACH,ECzBM,EAAoB,EAAO,CAC/B,QAAS,EAAQ,EACjB,SAAU,EAAQ,CACpB,CAAC,EAEY,EAAqB,EAChC,EAAO,CACL,OAAQ,EAAO,CACb,cAAe,EAAO,CACpB,QAAS,EACT,MAAO,EACP,KAAM,EACN,iBAAkB,EAClB,MAAO,CACT,CAAC,EACD,aAAc,CAChB,CAAC,EACD,cAAe,EACf,YAAa,EACb,GAAI,EACJ,SAAU,EAAQ,EAClB,KAAM,EACN,KAAM,EACN,MAAO,CACT,CAAC,EACD,GAAW,CAAE,SAAQ,GAAG,MAAc,CACpC,GAAG,EACH,aAAc,EAAO,aACrB,OAAQ,EAAO,aACjB,EAAE,CACJ,EAEa,EAA+B,EAC1C,EACA,GAAO,CAAE,QAAS,EAAQ,EAAG,KAAK,EAAI,+BAA+B,CACvE,EAEa,EAAoB,EAAO,CAAkB,EAC7C,EAA8B,EAAO,CAA4B,EC7C9E,SAAgB,EAAwB,EAAqB,CAC3D,IAAI,EAAQ,EAAW,CAAY,EAC7B,EAAY,IAAI,IAEtB,MAAO,CACL,OAAO,EAAkB,CACvB,EAAQ,EAAW,CAAS,EAC5B,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAClC,GAAI,CACF,EAAS,CAAK,CAChB,MAAQ,CAER,CAEJ,EACA,UAAW,CACT,OAAO,CACT,EACA,UAAU,EAAsC,CAC9C,EAAU,IAAI,CAAQ,EACtB,GAAI,CACF,EAAS,CAAK,CAChB,MAAQ,CAER,CACA,UAAa,CACX,EAAU,OAAO,CAAQ,CAC3B,CACF,CACF,CACF,CCbA,SAAS,EACP,EACA,EACA,EACA,CAIA,OAHI,aAAiB,EACZ,EAEF,EACL,IAAI,EAAoB,CACtB,KAAM,uBACN,QAAS,uCACT,UAAW,gBACX,oBAAqB,EACrB,WAAY,CACd,CAAC,CACH,CACF,CAEA,SAAgB,EACd,EACyB,CACzB,IAAM,EAAU,EAAyB,CAAO,EAC1C,EAAa,EAAyC,CAC1D,MAAO,MACT,CAAC,EACG,EAAyC,KACzC,EAAU,GACV,EAAa,GAEX,EAAc,EAAuB,CACzC,cAAe,EAAQ,mBACvB,YAAa,EAAQ,YACrB,gBAAmB,CAAE,WAAY,EAAQ,eAAgB,GACzD,QAAS,EAAQ,QACjB,oBAAqB,qBACrB,UAAW,EAAQ,SACrB,CAAC,EAEK,CAAE,eAAgB,EACtB,EAAQ,oBACP,GACC,EACE,EAAM,YAAc,iBAAmB,CAAC,EAAM,oBAC1C,IAAI,EAAoB,CACtB,KAAM,EAAM,KACZ,QAAS,EAAM,QACf,UAAW,EAAM,UACjB,oBAAqB,GACrB,WAAY,EAAM,UACpB,CAAC,EACD,CACN,EACF,EAAQ,gBACV,EAEA,MAAO,CACL,SAAU,EAAW,SACrB,MAAM,MAAO,CACX,IAAM,EAAe,CACnB,KAAM,qBACN,QAAS,qCACT,UAAW,aACb,EACA,GAAI,GAAW,EACb,MAAM,EACJ,IAAI,EAAoB,CACtB,GAAG,EACH,WAAY,EACd,CAAC,CACH,EAGF,EAAU,GACV,EAAe,KACf,EAAW,OAAO,CAAE,MAAO,SAAU,CAAC,EACtC,GAAI,CACF,IAAI,EAGJ,GAAI,CACF,EAAiB,MAAM,EACrB,GAAG,EAAQ,WAAW,aAAa,EAAQ,cAAc,mBAAmB,EAAQ,aACpF,IAAA,GACA,EACA,EACA,CACF,CACF,OAAS,EAAO,CASd,MARI,aAAiB,GACnB,EAAW,OAAO,CAChB,QACA,MAAO,QACP,+BAAgC,KAChC,OAAQ,IACV,CAAC,EAEG,CACR,CACA,GAAI,CAAC,EAAe,GAAI,CACtB,IAAM,EAAQ,EACZ,IAAI,EAAoB,CACtB,GAAG,EACH,WAAY,EAAe,SAAS,QAAU,IAC9C,OAAQ,EAAe,SAAS,MAClC,CAAC,CACH,EAOA,MANA,EAAW,OAAO,CAChB,QACA,MAAO,QACP,+BAAgC,KAChC,OAAQ,IACV,CAAC,EACK,CACR,CACA,IAAM,EAAS,EAAW,EAAe,KAAK,EAG9C,MAFA,GAAe,EACf,EAAW,OAAO,CAAE,MAAO,QAAS,QAAO,CAAC,EACrC,CACT,QAAU,CACR,EAAU,EACZ,CACF,EACA,MAAM,OAAO,EAAyC,EAAe,CACnE,IAAM,EAAS,EACT,EACJ,GAAe,qBAAuB,WAAW,OAAO,WAAW,EAC/D,EAAe,CACnB,KAAM,uBACN,QAAS,uCACT,UAAW,eACb,EACA,GAAI,CAAC,GAAQ,UAAY,EACvB,MAAM,EACJ,IAAI,EAAoB,CACtB,GAAG,EACH,WAAY,EACd,CAAC,CACH,EAGF,IAAI,EACJ,GAAI,CACF,EAAmB,EAAsB,CAAU,CACrD,MAAQ,CACN,IAAM,EAAQ,EACZ,IAAI,EAAoB,CACtB,GAAG,EACH,QAAS,uCACT,WAAY,EACd,CAAC,CACH,EAQA,MAPA,EAAW,OAAO,CAChB,QACA,MAAO,QACP,+BAAgC,KAChC,QACF,CAAC,EAEK,CACR,CAEA,EAAa,GACb,EAAW,OAAO,CAAE,MAAO,aAAc,SAAQ,qBAAoB,CAAC,EACtE,IAAI,EAAmB,GACvB,GAAI,CACF,IAAM,EAAO,KAAK,UAAU,CAC1B,GAAG,EACH,qBACF,CAAC,EACD,EAAmB,GACnB,IAAM,EAAqB,MAAM,EAC/B,GAAG,EAAQ,WAAW,aAAa,EAAQ,cAAc,mBAAmB,EAAQ,WAAW,cAC/F,CACE,OACA,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,OAAQ,MACV,EACA,EACA,EACA,CACF,EACA,GAAI,CAAC,EAAmB,GACtB,MAAM,EACJ,IAAI,EAAoB,CACtB,GAAG,EACH,oBAAqB,EAAmB,SAAS,QAAU,IAC3D,WAAY,EAAmB,SAAS,QAAU,IAClD,OAAQ,EAAmB,SAAS,MACtC,CAAC,CACH,EAEF,IAAM,EAAS,EAAW,EAAmB,KAAK,EAClD,GAAI,EAAO,KAAO,EAChB,MAAM,EACJ,IAAI,EAAoB,CACtB,GAAG,EACH,oBAAqB,GACrB,WAAY,EACd,CAAC,CACH,EAGF,OADA,EAAW,OAAO,CAAE,MAAO,YAAa,SAAQ,WAAY,CAAO,CAAC,EAC7D,CACT,OAAS,EAAO,CACd,IAAM,EAAW,EACf,EACA,EACA,CACF,EASA,MARA,EAAW,OAAO,CAChB,MAAO,EACP,MAAO,QACP,+BAAgC,EAAS,oBACrC,EACA,KACJ,QACF,CAAC,EACK,CACR,QAAU,CACR,EAAa,EACf,CACF,EACA,UAAW,EAAW,SACxB,CACF"}
1
+ {"version":3,"file":"signup.js","names":[],"sources":["../src/signup-input-schema.ts","../src/signup-schemas.ts","../src/signup.ts"],"sourcesContent":["import {\n array,\n nullable,\n optional,\n parser,\n strictObject,\n string,\n} from \"valibot\";\n\nimport {\n customFieldAnswerSchema,\n nonEmptyStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupAddressSchema = strictObject({\n city: string(),\n country: string(),\n line1: string(),\n line2: optional(nullable(string())),\n postalCode: string(),\n state: string(),\n});\n\nexport const parseSignupSubmission = parser(\n strictObject({\n address: optional(nullable(signupAddressSchema)),\n answers: optional(array(customFieldAnswerSchema)),\n email: optional(nullable(string())),\n honeypot: optional(string()),\n name: nonEmptyStringSchema,\n participantCount: optional(nullable(safeIntegerSchema(0))),\n phone: optional(nullable(string())),\n })\n);\n","import { boolean, check, object, parser, pipe, transform } from \"valibot\";\n\nimport { vPublicSignUpWidgetSubmissionResponseDto } from \"./generated/public-api/valibot.gen.ts\";\nimport {\n customFieldsSchema,\n nonEmptyStringSchema,\n optionalNullableStringSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupFieldSchema = object({\n enabled: boolean(),\n required: boolean(),\n});\n\nexport const publicSignupSchema = pipe(\n object({\n config: object({\n builtInFields: object({\n address: signupFieldSchema,\n email: signupFieldSchema,\n name: signupFieldSchema,\n participantCount: signupFieldSchema,\n phone: signupFieldSchema,\n }),\n customFields: customFieldsSchema,\n }),\n coverImageUrl: optionalNullableStringSchema,\n description: optionalNullableStringSchema,\n id: nonEmptyStringSchema,\n isActive: boolean(),\n name: nonEmptyStringSchema,\n slug: nonEmptyStringSchema,\n title: optionalNullableStringSchema,\n }),\n transform(({ config, ...signup }) => ({\n ...signup,\n customFields: config.customFields,\n fields: config.builtInFields,\n }))\n);\n\nexport const signupSubmissionResultSchema = pipe(\n vPublicSignUpWidgetSubmissionResponseDto,\n check(({ id }) => Boolean(id.trim()), \"Invalid signup submission ID.\")\n);\n\nexport const parsePublicSignup = parser(publicSignupSchema);\nexport const parseSignupSubmissionResult = parser(signupSubmissionResultSchema);\n","import { deepFreeze } from \"./deep-freeze.ts\";\nimport { resolveSignupEnvironment } from \"./environment.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport { parseSignupSubmission } from \"./signup-input-schema.ts\";\nimport {\n parsePublicSignup,\n parseSignupSubmissionResult,\n} from \"./signup-schemas.ts\";\nimport type {\n CreateLockerverseSignupOptions,\n LockerverseSignupClient,\n LockerverseSignupSubmission,\n} from \"./signup-types.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport { LockerverseSdkError } from \"./types.ts\";\n\nfunction classifySubmissionError(\n error: unknown,\n requestAttempted: boolean,\n reportError: (error: LockerverseSdkError) => LockerverseSdkError\n) {\n if (error instanceof LockerverseSdkError) {\n return error;\n }\n return reportError(\n new LockerverseSdkError({\n code: \"signup_submit_failed\",\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\",\n recoveryRecommended: requestAttempted,\n reportable: requestAttempted,\n })\n );\n}\n\nexport function createLockerverseSignupClient(\n options: CreateLockerverseSignupOptions\n): LockerverseSignupClient {\n const runtime = resolveSignupEnvironment(options);\n const reportError = createSdkErrorReporter({\n communitySlug: runtime.communitySlugValue,\n environment: runtime.environment,\n getContext: () => ({ signupSlug: runtime.signupSlugValue }),\n onError: runtime.onError,\n resourceContextName: \"lockerverse_signup\",\n sentryDsn: runtime.sentryDsn,\n });\n const { requestJson } = createTransport(\n runtime.fetchImplementation,\n (error) =>\n reportError(\n error.operation === \"submit_signup\" && !error.recoveryRecommended\n ? new LockerverseSdkError({\n code: error.code,\n message: error.message,\n operation: error.operation,\n recoveryRecommended: true,\n reportable: error.reportable,\n })\n : error\n ),\n runtime.requestTimeoutMs\n );\n const signupUrl = `${runtime.apiBaseUrl}/community/${runtime.communitySlug}/sign-up-widgets/${runtime.signupSlug}`;\n\n return {\n async load() {\n const errorContext = {\n code: \"signup_load_failed\" as const,\n message: \"Unable to load Lockerverse signup.\",\n operation: \"load_signup\" as const,\n };\n const signupResponse = await requestJson(\n signupUrl,\n undefined,\n parsePublicSignup,\n errorContext,\n errorContext\n );\n if (!signupResponse.ok) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n reportable: signupResponse.response.status >= 500,\n status: signupResponse.response.status,\n })\n );\n }\n return deepFreeze(signupResponse.value);\n },\n async submit(submission: LockerverseSignupSubmission, submitOptions) {\n const submissionReference =\n submitOptions?.submissionReference ?? globalThis.crypto.randomUUID();\n const errorContext = {\n code: \"signup_submit_failed\" as const,\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\" as const,\n };\n let parsedSubmission: ReturnType<typeof parseSignupSubmission>;\n try {\n parsedSubmission = parseSignupSubmission(submission);\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw validation errors must not escape the SDK boundary.\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n message: \"Lockerverse signup input is invalid.\",\n reportable: false,\n })\n );\n }\n\n let requestAttempted = false;\n try {\n const body = JSON.stringify({\n ...parsedSubmission,\n submissionReference,\n });\n requestAttempted = true;\n const submissionResponse = await requestJson(\n `${signupUrl}/submissions`,\n {\n body,\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n },\n parseSignupSubmissionResult,\n errorContext,\n errorContext\n );\n if (!submissionResponse.ok) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: submissionResponse.response.status >= 500,\n reportable: submissionResponse.response.status >= 500,\n status: submissionResponse.response.status,\n })\n );\n }\n const result = deepFreeze(submissionResponse.value);\n if (result.id !== submissionReference) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: true,\n reportable: true,\n })\n );\n }\n return result;\n } catch (error) {\n throw classifySubmissionError(error, requestAttempted, reportError);\n }\n },\n };\n}\n"],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=`0.2.56`;var t=class extends Error{code;operation;reportable;recoveryRecommended;sdkVersion;status;constructor({code:t,message:n,operation:r,reportable:i,recoveryRecommended:a=!1,status:o}){super(n),this.name=`LockerverseSdkError`,this.code=t,this.operation=r,this.reportable=i,this.recoveryRecommended=a,this.sdkVersion=e,this.status=o}};export{t as n,e as t};
1
+ const e=`0.2.57`;var t=class extends Error{code;operation;reportable;recoveryRecommended;sdkVersion;status;constructor({code:t,message:n,operation:r,reportable:i,recoveryRecommended:a=!1,status:o}){super(n),this.name=`LockerverseSdkError`,this.code=t,this.operation=r,this.reportable=i,this.recoveryRecommended=a,this.sdkVersion=e,this.status=o}};export{t as n,e as t};
2
2
  //# sourceMappingURL=types.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/sdk",
3
- "version": "0.2.56",
3
+ "version": "0.2.57",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Lockerverse/lockerverse-sdk.git",