@formhaus/core 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/{check-definition-B-YU_XN6.d.ts → check-definition-DuLExofm.d.ts} +2 -2
- package/dist/chunk-35SAVPYL.js +2 -0
- package/dist/chunk-35SAVPYL.js.map +1 -0
- package/dist/chunk-76YV4J3Q.js +3 -0
- package/dist/chunk-76YV4J3Q.js.map +1 -0
- package/dist/chunk-PBTYUSZR.js +2 -0
- package/dist/chunk-PBTYUSZR.js.map +1 -0
- package/dist/chunk-PZEBYRGE.js +2 -0
- package/dist/chunk-PZEBYRGE.js.map +1 -0
- package/dist/chunk-RN5GQHKN.js +5 -0
- package/dist/chunk-RN5GQHKN.js.map +1 -0
- package/dist/{chunk-KXLWZLOO.js → chunk-YTUVSJUF.js} +3 -3
- package/dist/{chunk-KXLWZLOO.js.map → chunk-YTUVSJUF.js.map} +1 -1
- package/dist/cloud.d.ts +3 -3
- package/dist/cloud.js +1 -1
- package/dist/{controller-DXb698eH.d.ts → controller-Ds_kbXSU.d.ts} +1 -1
- package/dist/default-messages-yS4QtrYi.d.ts +23 -0
- package/dist/{definition-PdtKhxBh.d.ts → definition-B4OIy_wH.d.ts} +44 -1
- package/dist/i18n.d.ts +60 -0
- package/dist/i18n.js +2 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +11 -12
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +24 -6
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/{runtime-Dn2_UIxt.d.ts → runtime-BN2PuKD7.d.ts} +6 -2
- package/dist/server.d.ts +6 -4
- package/dist/server.iife.js +4 -4
- package/dist/server.iife.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/validate-field-ND_UxoJU.d.ts +7 -0
- package/fixtures/submissions/choices.json +3 -8
- package/fixtures/submissions/messages.json +155 -0
- package/fixtures/submissions/single-step.json +3 -4
- package/package.json +6 -1
- package/schema/form-definition.schema.json +236 -0
- package/schema/form-translation.schema.json +222 -0
- package/dist/chunk-OBVVPPVA.js +0 -3
- package/dist/chunk-OBVVPPVA.js.map +0 -1
- package/dist/chunk-OZ352IOK.js +0 -5
- package/dist/chunk-OZ352IOK.js.map +0 -1
- package/dist/validate-field-dZd5yZAp.d.ts +0 -19
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var M="This form was updated. Please review your answers and submit again.",V="Please answer again.",c={message:"Something went wrong. Try again.",action:"retry"},v={message:"Could not send. Try again.",action:"retry"},l={message:"Could not send. Reload the page and try again.",action:"reload"},y={network:{message:"Could not reach the form server. Check your connection and try again.",action:"retry"},timeout:{message:"The form server did not respond. Try again.",action:"retry"},invalid:{message:"Some answers were not accepted.",action:null},rate_limited:{message:"Too many attempts. Wait a minute and try again.",action:"retry"},limit_reached:{message:"This form is not accepting responses right now.",action:null},not_found:{message:"This form no longer exists.",action:null},paused:{message:"This form is paused.",action:null},expired:{message:"This form has expired.",action:null},body_too_large:{message:"Your answers are too long. Shorten them and try again.",action:null},idempotency_key_reused:{message:"Your answers changed while sending. Try again.",action:"retry"},form_updated:{message:"This form was updated. Reload the page.",action:"reload"},client_outdated:{message:"This form needs a newer version of this page.",action:null},malformed_body:l,unsupported_media_type:l,invalid_idempotency_key:l,invalid_response:c,unavailable:c,internal:c},E={0:"network",400:"malformed_body",402:"limit_reached",404:"not_found",409:"paused",410:"expired",413:"body_too_large",422:"invalid",426:"client_outdated",429:"rate_limited"};function w(e,n=""){let t=y[n]??y[E[e]??""];return t||(e>=500?c:v)}var d=class extends Error{constructor(n,t,o,r,i){let s=w(n,t);super(s.message),this.name="CloudError",this.status=n,this.code=t,this.errors=o,this.version=r,this.action=s.action,this.cause=i;}get retryable(){return this.action==="retry"}};function h(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var x=new Map([["Form paused","paused"],["Form not found","not_found"],["Form expired","expired"],["internal error","internal"]]);function k(e,n="network"){return new d(0,n,void 0,void 0,e)}async function f(e){try{return await e.json()}catch(n){throw new d(e.status,"invalid_response",void 0,void 0,n)}}async function m(e){let n=await e.json().catch(()=>null);if(!h(n))return new d(e.status,"unknown");let t=h(n.errors)?n.errors:void 0,o=typeof n.version=="number"&&Number.isInteger(n.version)?n.version:void 0,r=typeof n.error=="string"?x.get(n.error)??n.error:"unknown";return new d(e.status,r,t,o)}var A=["Formhaus-Form-Version","Formhaus-Version"];function g(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function b(e){let n=Number(e);return e!==null&&e!==""&&Number.isInteger(n)&&n>0?n:void 0}function C(e){for(let n of A){let t=b(e.headers?.get(n));if(t!==void 0)return t}}function u(e){return typeof e=="string"&&e!==""?e:void 0}function F(e){if(!g(e))return {};let n=u(e.redirectUrl);return {...u(e.successMessage)&&{successMessage:u(e.successMessage)},...n&&/^https?:\/\//i.test(n)&&{redirectUrl:n},...typeof e.allowAnother=="boolean"&&{allowAnother:e.allowAnother}}}function _(e,n){if(!g(e))throw new d(n.status,"invalid_response");if(!("definition"in e))return {definition:e,version:C(n),settings:{}};if(!g(e.definition))throw new d(n.status,"invalid_response");return {definition:e.definition,version:b(e.version)??C(n),settings:F(e.settings),...u(e.renderToken)&&{renderToken:u(e.renderToken)}}}function S(){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=crypto.getRandomValues(new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let n=Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");return `${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}var D="https://api.formhaus.dev",p="core=0.
|
|
2
|
-
export{M as a,V as b,w as c,d,k as e,F as f,U as g,H as h,z as i,X as j,Z as k};//# sourceMappingURL=chunk-
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
var M="This form was updated. Please review your answers and submit again.",V="Please answer again.",c={message:"Something went wrong. Try again.",action:"retry"},v={message:"Could not send. Try again.",action:"retry"},l={message:"Could not send. Reload the page and try again.",action:"reload"},y={network:{message:"Could not reach the form server. Check your connection and try again.",action:"retry"},timeout:{message:"The form server did not respond. Try again.",action:"retry"},invalid:{message:"Some answers were not accepted.",action:null},rate_limited:{message:"Too many attempts. Wait a minute and try again.",action:"retry"},limit_reached:{message:"This form is not accepting responses right now.",action:null},not_found:{message:"This form no longer exists.",action:null},paused:{message:"This form is paused.",action:null},expired:{message:"This form has expired.",action:null},body_too_large:{message:"Your answers are too long. Shorten them and try again.",action:null},idempotency_key_reused:{message:"Your answers changed while sending. Try again.",action:"retry"},form_updated:{message:"This form was updated. Reload the page.",action:"reload"},client_outdated:{message:"This form needs a newer version of this page.",action:null},malformed_body:l,unsupported_media_type:l,invalid_idempotency_key:l,invalid_response:c,unavailable:c,internal:c},E={0:"network",400:"malformed_body",402:"limit_reached",404:"not_found",409:"paused",410:"expired",413:"body_too_large",422:"invalid",426:"client_outdated",429:"rate_limited"};function w(e,n=""){let t=y[n]??y[E[e]??""];return t||(e>=500?c:v)}var d=class extends Error{constructor(n,t,o,r,i){let s=w(n,t);super(s.message),this.name="CloudError",this.status=n,this.code=t,this.errors=o,this.version=r,this.action=s.action,this.cause=i;}get retryable(){return this.action==="retry"}};function h(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var x=new Map([["Form paused","paused"],["Form not found","not_found"],["Form expired","expired"],["internal error","internal"]]);function k(e,n="network"){return new d(0,n,void 0,void 0,e)}async function f(e){try{return await e.json()}catch(n){throw new d(e.status,"invalid_response",void 0,void 0,n)}}async function m(e){let n=await e.json().catch(()=>null);if(!h(n))return new d(e.status,"unknown");let t=h(n.errors)?n.errors:void 0,o=typeof n.version=="number"&&Number.isInteger(n.version)?n.version:void 0,r=typeof n.error=="string"?x.get(n.error)??n.error:"unknown";return new d(e.status,r,t,o)}var A=["Formhaus-Form-Version","Formhaus-Version"];function g(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function b(e){let n=Number(e);return e!==null&&e!==""&&Number.isInteger(n)&&n>0?n:void 0}function C(e){for(let n of A){let t=b(e.headers?.get(n));if(t!==void 0)return t}}function u(e){return typeof e=="string"&&e!==""?e:void 0}function F(e){if(!g(e))return {};let n=u(e.redirectUrl);return {...u(e.successMessage)&&{successMessage:u(e.successMessage)},...n&&/^https?:\/\//i.test(n)&&{redirectUrl:n},...typeof e.allowAnother=="boolean"&&{allowAnother:e.allowAnother}}}function _(e,n){if(!g(e))throw new d(n.status,"invalid_response");if(!("definition"in e))return {definition:e,version:C(n),settings:{}};if(!g(e.definition))throw new d(n.status,"invalid_response");return {definition:e.definition,version:b(e.version)??C(n),settings:F(e.settings),...u(e.renderToken)&&{renderToken:u(e.renderToken)}}}function S(){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=crypto.getRandomValues(new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let n=Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");return `${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}var D="https://api.formhaus.dev",p="core=0.13.1";function R({id:e,apiBase:n=D}){return `${n.replace(/\/+$/,"")}/f/${encodeURIComponent(e)}`}var I=15e3,O=3e4;async function T(e,n,t={},o){let r=new AbortController,i=()=>r.abort(),s=setTimeout(i,n);o?.aborted&&i(),o?.addEventListener("abort",i);try{return await fetch(e,{...t,signal:r.signal})}catch(a){throw o?.aborted?a:k(a,r.signal.aborted?"timeout":"network")}finally{clearTimeout(s),o?.removeEventListener("abort",i);}}async function U(e,n,t){let o=t===void 0?p:`${p}&v=${t}`,r=await T(`${R(e)}/form?${o}`,I,{},n);if(!r.ok)throw await m(r);return _(await f(r),r)}async function H(e,n){return (await U(e,n)).definition}function z(e){let n=null;return async(t,o=[])=>{let r=JSON.stringify({...e.extraBody?.(),values:t,skippedSteps:o,version:e.version,_fh_rt:e.renderToken,...e.firstRenderToken&&{_fh_rt_first:e.firstRenderToken}});n?.body!==r&&(n={body:r,key:S()});let i=await T(`${R(e)}?${p}`,O,{method:"POST",headers:{"Content-Type":"application/json","Idempotency-Key":n.key},body:r});if(!i.ok)throw await m(i);let s=await f(i);return n=null,s}}var $=new Set(["password","file"]),P=10080*60*1e3;function X(e,n){let t=[...e.fields??[],...(e.steps??[]).flatMap(r=>r.fields)],o={};for(let r of t)!$.has(r.type)&&n[r.key]!==void 0&&(o[r.key]=n[r.key]);return o}var N=()=>globalThis.sessionStorage;function Z(e=P,n=N){let t=r=>`formhaus:draft:${r}`,o=(r,i)=>{try{let s=n();return s?r(s):i}catch{return i}};return {load:(r,i)=>o(s=>{let a=JSON.parse(s.getItem(t(r))??"null");return a&&a.version===i&&Date.now()-a.savedAt<e?a.values:null},null),save:(r,i,s)=>o(a=>a.setItem(t(r),JSON.stringify({version:i,savedAt:Date.now(),values:s})),void 0),clear:r=>o(i=>i.removeItem(t(r)),void 0)}}
|
|
2
|
+
export{M as a,V as b,w as c,d,k as e,F as f,U as g,H as h,z as i,X as j,Z as k};//# sourceMappingURL=chunk-YTUVSJUF.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-YTUVSJUF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cloud/failures.ts","../src/cloud/error.ts","../src/cloud/envelope.ts","../src/cloud/uuid.ts","../src/cloud/client.ts","../src/cloud/draft.ts"],"names":["FORM_UPDATED_MESSAGE","ANSWER_AGAIN","SERVER","GENERIC","BROKEN","BY_CODE","CODE_BY_STATUS","failureFor","status","code","known","CloudError","errors","version","cause","failure","isRecord","value","LEGACY_CODES","networkError","readJson","response","error","toCloudError","body","VERSION_HEADERS","toVersion","headerVersion","name","text","parseSettings","redirect","parseForm","randomId","bytes","hex","byte","DEFAULT_API_BASE","CORE","endpoint","id","apiBase","LOAD_TIMEOUT","SUBMIT_TIMEOUT","send","url","timeout","init","signal","controller","abort","timer","fetchForm","options","after","query","fetchDefinition","createSubmitter","pending","values","skippedSteps","submission","SENSITIVE","WEEK","draftValues","definition","fields","step","kept","field","sessionStorageOf","sessionDraftStore","maxAge","storageOf","key","attempt","action","fallback","storage","draft"],"mappings":"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","file":"chunk-KXLWZLOO.js","sourcesContent":["export type CloudAction = 'retry' | 'reload' | null;\n\nexport interface CloudFailure {\n message: string;\n action: CloudAction;\n}\n\nexport const FORM_UPDATED_MESSAGE = 'This form was updated. Please review your answers and submit again.';\nexport const ANSWER_AGAIN = 'Please answer again.';\n\nconst SERVER: CloudFailure = { message: 'Something went wrong. Try again.', action: 'retry' };\nconst GENERIC: CloudFailure = { message: 'Could not send. Try again.', action: 'retry' };\nconst BROKEN: CloudFailure = { message: 'Could not send. Reload the page and try again.', action: 'reload' };\n\nconst BY_CODE: Record<string, CloudFailure> = {\n network: { message: 'Could not reach the form server. Check your connection and try again.', action: 'retry' },\n timeout: { message: 'The form server did not respond. Try again.', action: 'retry' },\n invalid: { message: 'Some answers were not accepted.', action: null },\n rate_limited: { message: 'Too many attempts. Wait a minute and try again.', action: 'retry' },\n limit_reached: { message: 'This form is not accepting responses right now.', action: null },\n not_found: { message: 'This form no longer exists.', action: null },\n paused: { message: 'This form is paused.', action: null },\n expired: { message: 'This form has expired.', action: null },\n body_too_large: { message: 'Your answers are too long. Shorten them and try again.', action: null },\n idempotency_key_reused: { message: 'Your answers changed while sending. Try again.', action: 'retry' },\n form_updated: { message: 'This form was updated. Reload the page.', action: 'reload' },\n client_outdated: { message: 'This form needs a newer version of this page.', action: null },\n malformed_body: BROKEN,\n unsupported_media_type: BROKEN,\n invalid_idempotency_key: BROKEN,\n invalid_response: SERVER,\n unavailable: SERVER,\n internal: SERVER,\n};\n\nconst CODE_BY_STATUS: Record<number, string> = {\n 0: 'network',\n 400: 'malformed_body',\n 402: 'limit_reached',\n 404: 'not_found',\n 409: 'paused',\n 410: 'expired',\n 413: 'body_too_large',\n 422: 'invalid',\n 426: 'client_outdated',\n 429: 'rate_limited',\n};\n\nexport function failureFor(status: number, code = ''): CloudFailure {\n const known = BY_CODE[code] ?? BY_CODE[CODE_BY_STATUS[status] ?? ''];\n if (known) return known;\n return status >= 500 ? SERVER : GENERIC;\n}\n","import { failureFor, type CloudAction } from './failures';\n\nexport class CloudError extends Error {\n readonly status: number;\n readonly code: string;\n readonly errors?: Record<string, string>;\n readonly version?: number;\n readonly action: CloudAction;\n readonly cause?: unknown;\n\n constructor(status: number, code: string, errors?: Record<string, string>, version?: number, cause?: unknown) {\n const failure = failureFor(status, code);\n super(failure.message);\n this.name = 'CloudError';\n this.status = status;\n this.code = code;\n this.errors = errors;\n this.version = version;\n this.action = failure.action;\n this.cause = cause;\n }\n\n get retryable(): boolean {\n return this.action === 'retry';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst LEGACY_CODES = new Map([\n ['Form paused', 'paused'],\n ['Form not found', 'not_found'],\n ['Form expired', 'expired'],\n ['internal error', 'internal'],\n]);\n\nexport function networkError(cause: unknown, code = 'network'): CloudError {\n return new CloudError(0, code, undefined, undefined, cause);\n}\n\nexport async function readJson(response: CloudResponse): Promise<unknown> {\n try {\n return await response.json();\n } catch (error) {\n throw new CloudError(response.status, 'invalid_response', undefined, undefined, error);\n }\n}\n\nexport async function toCloudError(response: CloudResponse): Promise<CloudError> {\n const body: unknown = await response.json().catch(() => null);\n if (!isRecord(body)) return new CloudError(response.status, 'unknown');\n const errors = isRecord(body.errors) ? body.errors as Record<string, string> : undefined;\n const version = typeof body.version === 'number' && Number.isInteger(body.version) ? body.version : undefined;\n const code = typeof body.error === 'string' ? LEGACY_CODES.get(body.error) ?? body.error : 'unknown';\n return new CloudError(response.status, code, errors, version);\n}\n","import type { FormDefinition } from '../types';\nimport { CloudError } from './error';\n\nexport interface CloudSettings {\n successMessage?: string;\n redirectUrl?: string;\n allowAnother?: boolean;\n}\n\nexport interface PublishedForm {\n definition: FormDefinition;\n version?: number;\n settings?: CloudSettings;\n renderToken?: string;\n}\n\nconst VERSION_HEADERS = ['Formhaus-Form-Version', 'Formhaus-Version'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction toVersion(value: unknown): number | undefined {\n const version = Number(value);\n return value !== null && value !== '' && Number.isInteger(version) && version > 0 ? version : undefined;\n}\n\nfunction headerVersion(response: CloudResponse): number | undefined {\n for (const name of VERSION_HEADERS) {\n const version = toVersion(response.headers?.get(name));\n if (version !== undefined) return version;\n }\n return undefined;\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport function parseSettings(value: unknown): CloudSettings {\n if (!isRecord(value)) return {};\n const redirect = text(value.redirectUrl);\n return {\n ...(text(value.successMessage) && { successMessage: text(value.successMessage) }),\n ...(redirect && /^https?:\\/\\//i.test(redirect) && { redirectUrl: redirect }),\n ...(typeof value.allowAnother === 'boolean' && { allowAnother: value.allowAnother }),\n };\n}\n\nexport function parseForm(body: unknown, response: CloudResponse): PublishedForm {\n if (!isRecord(body)) throw new CloudError(response.status, 'invalid_response');\n if (!('definition' in body)) return { definition: body as unknown as FormDefinition, version: headerVersion(response), settings: {} };\n if (!isRecord(body.definition)) throw new CloudError(response.status, 'invalid_response');\n return {\n definition: body.definition as unknown as FormDefinition,\n version: toVersion(body.version) ?? headerVersion(response),\n settings: parseSettings(body.settings),\n ...(text(body.renderToken) && { renderToken: text(body.renderToken) }),\n };\n}\n","export function randomId(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 15) | 64;\n bytes[8] = (bytes[8] & 63) | 128;\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import type { FormDefinition } from '../types';\nimport { networkError, readJson, toCloudError } from './error';\nimport { parseForm, type PublishedForm } from './envelope';\nimport { randomId } from './uuid';\n\nconst DEFAULT_API_BASE = 'https://api.formhaus.dev';\nconst CORE = `core=${__FORMHAUS_CORE_VERSION__}`;\n\nexport interface CloudSubmission {\n id: string;\n values: Record<string, unknown>;\n}\n\nexport interface CloudClientOptions {\n id: string;\n apiBase?: string;\n}\n\nfunction endpoint({ id, apiBase = DEFAULT_API_BASE }: CloudClientOptions): string {\n return `${apiBase.replace(/\\/+$/, '')}/f/${encodeURIComponent(id)}`;\n}\n\nconst LOAD_TIMEOUT = 15_000;\nconst SUBMIT_TIMEOUT = 30_000;\n\nasync function send(url: string, timeout: number, init: CloudRequestInit = {}, signal?: AbortSignal): Promise<CloudResponse> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n const timer = setTimeout(abort, timeout);\n if (signal?.aborted) abort();\n signal?.addEventListener('abort', abort);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (error) {\n if (signal?.aborted) throw error;\n throw networkError(error, controller.signal.aborted ? 'timeout' : 'network');\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n }\n}\n\nexport async function fetchForm(options: CloudClientOptions, signal?: AbortSignal, after?: number): Promise<PublishedForm> {\n const query = after === undefined ? CORE : `${CORE}&v=${after}`;\n const response = await send(`${endpoint(options)}/form?${query}`, LOAD_TIMEOUT, {}, signal);\n if (!response.ok) throw await toCloudError(response);\n return parseForm(await readJson(response), response);\n}\n\nexport async function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition> {\n return (await fetchForm(options, signal)).definition;\n}\n\nexport interface CloudSubmitterOptions extends CloudClientOptions {\n version?: number;\n renderToken?: string;\n firstRenderToken?: string;\n extraBody?: () => Record<string, unknown>;\n}\n\nexport function createSubmitter(options: CloudSubmitterOptions) {\n let pending: { body: string; key: string } | null = null;\n\n return async (values: Record<string, unknown>, skippedSteps: string[] = []): Promise<CloudSubmission> => {\n const body = JSON.stringify({ ...options.extraBody?.(), values, skippedSteps, version: options.version, _fh_rt: options.renderToken, ...(options.firstRenderToken && { _fh_rt_first: options.firstRenderToken }) });\n if (pending?.body !== body) pending = { body, key: randomId() };\n const response = await send(`${endpoint(options)}?${CORE}`, SUBMIT_TIMEOUT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Idempotency-Key': pending.key },\n body,\n });\n if (!response.ok) throw await toCloudError(response);\n const submission = await readJson(response) as CloudSubmission;\n pending = null;\n return submission;\n };\n}\n","import type { FormDefinition } from '../types';\n\nexport interface DraftStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface DraftStore {\n load(id: string, version: number | undefined): Record<string, unknown> | null;\n save(id: string, version: number | undefined, values: Record<string, unknown>): void;\n clear(id: string): void;\n}\n\nconst SENSITIVE = new Set(['password', 'file']);\nconst WEEK = 7 * 24 * 60 * 60 * 1000;\n\nexport function draftValues(definition: FormDefinition, values: Record<string, unknown>): Record<string, unknown> {\n const fields = [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n const kept: Record<string, unknown> = {};\n for (const field of fields) {\n if (!SENSITIVE.has(field.type) && values[field.key] !== undefined) kept[field.key] = values[field.key];\n }\n return kept;\n}\n\nconst sessionStorageOf = () => (globalThis as { sessionStorage?: DraftStorage }).sessionStorage;\n\nexport function sessionDraftStore(maxAge = WEEK, storageOf: () => DraftStorage | undefined = sessionStorageOf): DraftStore {\n const key = (id: string) => `formhaus:draft:${id}`;\n const attempt = <T>(action: (storage: DraftStorage) => T, fallback: T): T => {\n try {\n const storage = storageOf();\n return storage ? action(storage) : fallback;\n } catch {\n return fallback;\n }\n };\n return {\n load: (id, version) => attempt((storage) => {\n const draft = JSON.parse(storage.getItem(key(id)) ?? 'null') as { version?: number; savedAt: number; values: Record<string, unknown> } | null;\n return draft && draft.version === version && Date.now() - draft.savedAt < maxAge ? draft.values : null;\n }, null),\n save: (id, version, values) => attempt((storage) => storage.setItem(key(id), JSON.stringify({ version, savedAt: Date.now(), values })), undefined),\n clear: (id) => attempt((storage) => storage.removeItem(key(id)), undefined),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cloud/failures.ts","../src/cloud/error.ts","../src/cloud/envelope.ts","../src/cloud/uuid.ts","../src/cloud/client.ts","../src/cloud/draft.ts"],"names":["FORM_UPDATED_MESSAGE","ANSWER_AGAIN","SERVER","GENERIC","BROKEN","BY_CODE","CODE_BY_STATUS","failureFor","status","code","known","CloudError","errors","version","cause","failure","isRecord","value","LEGACY_CODES","networkError","readJson","response","error","toCloudError","body","VERSION_HEADERS","toVersion","headerVersion","name","text","parseSettings","redirect","parseForm","randomId","bytes","hex","byte","DEFAULT_API_BASE","CORE","endpoint","id","apiBase","LOAD_TIMEOUT","SUBMIT_TIMEOUT","send","url","timeout","init","signal","controller","abort","timer","fetchForm","options","after","query","fetchDefinition","createSubmitter","pending","values","skippedSteps","submission","SENSITIVE","WEEK","draftValues","definition","fields","step","kept","field","sessionStorageOf","sessionDraftStore","maxAge","storageOf","key","attempt","action","fallback","storage","draft"],"mappings":"AAOO,IAAMA,CAAAA,CAAuB,qEAAA,CACvBC,CAAAA,CAAe,sBAAA,CAEtBC,CAAAA,CAAuB,CAAE,OAAA,CAAS,kCAAA,CAAoC,MAAA,CAAQ,OAAQ,CAAA,CACtFC,CAAAA,CAAwB,CAAE,OAAA,CAAS,4BAAA,CAA8B,MAAA,CAAQ,OAAQ,CAAA,CACjFC,CAAAA,CAAuB,CAAE,OAAA,CAAS,iDAAkD,MAAA,CAAQ,QAAS,CAAA,CAErGC,CAAAA,CAAwC,CAC5C,OAAA,CAAS,CAAE,OAAA,CAAS,wEAAyE,MAAA,CAAQ,OAAQ,CAAA,CAC7G,OAAA,CAAS,CAAE,OAAA,CAAS,6CAAA,CAA+C,MAAA,CAAQ,OAAQ,CAAA,CACnF,OAAA,CAAS,CAAE,OAAA,CAAS,iCAAA,CAAmC,MAAA,CAAQ,IAAK,CAAA,CACpE,aAAc,CAAE,OAAA,CAAS,iDAAA,CAAmD,MAAA,CAAQ,OAAQ,CAAA,CAC5F,aAAA,CAAe,CAAE,QAAS,iDAAA,CAAmD,MAAA,CAAQ,IAAK,CAAA,CAC1F,SAAA,CAAW,CAAE,OAAA,CAAS,6BAAA,CAA+B,OAAQ,IAAK,CAAA,CAClE,MAAA,CAAQ,CAAE,OAAA,CAAS,sBAAA,CAAwB,MAAA,CAAQ,IAAK,CAAA,CACxD,OAAA,CAAS,CAAE,OAAA,CAAS,wBAAA,CAA0B,MAAA,CAAQ,IAAK,CAAA,CAC3D,eAAgB,CAAE,OAAA,CAAS,wDAAA,CAA0D,MAAA,CAAQ,IAAK,CAAA,CAClG,sBAAA,CAAwB,CAAE,QAAS,gDAAA,CAAkD,MAAA,CAAQ,OAAQ,CAAA,CACrG,YAAA,CAAc,CAAE,OAAA,CAAS,yCAAA,CAA2C,OAAQ,QAAS,CAAA,CACrF,eAAA,CAAiB,CAAE,OAAA,CAAS,+CAAA,CAAiD,MAAA,CAAQ,IAAK,EAC1F,cAAA,CAAgBD,CAAAA,CAChB,sBAAA,CAAwBA,CAAAA,CACxB,uBAAA,CAAyBA,CAAAA,CACzB,gBAAA,CAAkBF,CAAAA,CAClB,YAAaA,CAAAA,CACb,QAAA,CAAUA,CACZ,CAAA,CAEMI,CAAAA,CAAyC,CAC7C,CAAA,CAAG,SAAA,CACH,IAAK,gBAAA,CACL,GAAA,CAAK,eAAA,CACL,GAAA,CAAK,WAAA,CACL,GAAA,CAAK,QAAA,CACL,GAAA,CAAK,UACL,GAAA,CAAK,gBAAA,CACL,GAAA,CAAK,SAAA,CACL,GAAA,CAAK,iBAAA,CACL,GAAA,CAAK,cACP,EAEO,SAASC,CAAAA,CAAWC,CAAAA,CAAgBC,CAAAA,CAAO,EAAA,CAAkB,CAClE,IAAMC,EAAQL,CAAAA,CAAQI,CAAI,CAAA,EAAKJ,CAAAA,CAAQC,CAAAA,CAAeE,CAAM,CAAA,EAAK,EAAE,EACnE,OAAIE,CAAAA,GACGF,CAAAA,EAAU,GAAA,CAAMN,CAAAA,CAASC,CAAAA,CAClC,CClDO,IAAMQ,EAAN,cAAyB,KAAM,CAQpC,WAAA,CAAYH,CAAAA,CAAgBC,CAAAA,CAAcG,CAAAA,CAAiCC,CAAAA,CAAkBC,EAAiB,CAC5G,IAAMC,CAAAA,CAAUR,CAAAA,CAAWC,CAAAA,CAAQC,CAAI,CAAA,CACvC,KAAA,CAAMM,EAAQ,OAAO,CAAA,CACrB,IAAA,CAAK,IAAA,CAAO,YAAA,CACZ,IAAA,CAAK,MAAA,CAASP,CAAAA,CACd,KAAK,IAAA,CAAOC,CAAAA,CACZ,IAAA,CAAK,MAAA,CAASG,CAAAA,CACd,IAAA,CAAK,OAAA,CAAUC,CAAAA,CACf,KAAK,MAAA,CAASE,CAAAA,CAAQ,MAAA,CACtB,IAAA,CAAK,KAAA,CAAQD,EACf,CAEA,IAAI,SAAA,EAAqB,CACvB,OAAO,IAAA,CAAK,MAAA,GAAW,OACzB,CACF,EAEA,SAASE,CAAAA,CAASC,CAAAA,CAAkD,CAClE,OAAOA,CAAAA,GAAU,IAAA,EAAQ,OAAOA,CAAAA,EAAU,UAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAK,CAC5E,CAEA,IAAMC,CAAAA,CAAe,IAAI,GAAA,CAAI,CAC3B,CAAC,aAAA,CAAe,QAAQ,CAAA,CACxB,CAAC,gBAAA,CAAkB,WAAW,CAAA,CAC9B,CAAC,cAAA,CAAgB,SAAS,CAAA,CAC1B,CAAC,gBAAA,CAAkB,UAAU,CAC/B,CAAC,CAAA,CAEM,SAASC,CAAAA,CAAaL,CAAAA,CAAgBL,CAAAA,CAAO,SAAA,CAAuB,CACzE,OAAO,IAAIE,CAAAA,CAAW,CAAA,CAAGF,CAAAA,CAAM,MAAA,CAAW,MAAA,CAAWK,CAAK,CAC5D,CAEA,eAAsBM,CAAAA,CAASC,CAAAA,CAA2C,CACxE,GAAI,CACF,OAAO,MAAMA,CAAAA,CAAS,IAAA,EACxB,CAAA,MAASC,CAAAA,CAAO,CACd,MAAM,IAAIX,EAAWU,CAAAA,CAAS,MAAA,CAAQ,kBAAA,CAAoB,MAAA,CAAW,MAAA,CAAWC,CAAK,CACvF,CACF,CAEA,eAAsBC,CAAAA,CAAaF,CAAAA,CAA8C,CAC/E,IAAMG,CAAAA,CAAgB,MAAMH,CAAAA,CAAS,MAAK,CAAE,KAAA,CAAM,IAAM,IAAI,CAAA,CAC5D,GAAI,CAACL,CAAAA,CAASQ,CAAI,CAAA,CAAG,OAAO,IAAIb,CAAAA,CAAWU,CAAAA,CAAS,MAAA,CAAQ,SAAS,CAAA,CACrE,IAAMT,CAAAA,CAASI,CAAAA,CAASQ,CAAAA,CAAK,MAAM,CAAA,CAAIA,CAAAA,CAAK,MAAA,CAAmC,MAAA,CACzEX,EAAU,OAAOW,CAAAA,CAAK,OAAA,EAAY,QAAA,EAAY,MAAA,CAAO,SAAA,CAAUA,CAAAA,CAAK,OAAO,EAAIA,CAAAA,CAAK,OAAA,CAAU,MAAA,CAC9Ff,CAAAA,CAAO,OAAOe,CAAAA,CAAK,KAAA,EAAU,QAAA,CAAWN,CAAAA,CAAa,GAAA,CAAIM,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAQ,SAAA,CAC3F,OAAO,IAAIb,CAAAA,CAAWU,CAAAA,CAAS,MAAA,CAAQZ,CAAAA,CAAMG,CAAAA,CAAQC,CAAO,CAC9D,CCzCA,IAAMY,CAAAA,CAAkB,CAAC,uBAAA,CAAyB,kBAAkB,CAAA,CAEpE,SAAST,CAAAA,CAASC,EAAkD,CAClE,OAAOA,CAAAA,GAAU,IAAA,EAAQ,OAAOA,CAAAA,EAAU,QAAA,EAAY,CAAC,MAAM,OAAA,CAAQA,CAAK,CAC5E,CAEA,SAASS,CAAAA,CAAUT,CAAAA,CAAoC,CACrD,IAAMJ,CAAAA,CAAU,MAAA,CAAOI,CAAK,CAAA,CAC5B,OAAOA,CAAAA,GAAU,IAAA,EAAQA,CAAAA,GAAU,IAAM,MAAA,CAAO,SAAA,CAAUJ,CAAO,CAAA,EAAKA,CAAAA,CAAU,CAAA,CAAIA,CAAAA,CAAU,MAChG,CAEA,SAASc,CAAAA,CAAcN,CAAAA,CAA6C,CAClE,IAAA,IAAWO,CAAAA,IAAQH,CAAAA,CAAiB,CAClC,IAAMZ,CAAAA,CAAUa,CAAAA,CAAUL,CAAAA,CAAS,OAAA,EAAS,GAAA,CAAIO,CAAI,CAAC,EACrD,GAAIf,CAAAA,GAAY,MAAA,CAAW,OAAOA,CACpC,CAEF,CAEA,SAASgB,EAAKZ,CAAAA,CAAoC,CAChD,OAAO,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,EAAA,CAAKA,EAAQ,MAC7D,CAEO,SAASa,CAAAA,CAAcb,CAAAA,CAA+B,CAC3D,GAAI,CAACD,EAASC,CAAK,CAAA,CAAG,OAAO,EAAC,CAC9B,IAAMc,CAAAA,CAAWF,CAAAA,CAAKZ,EAAM,WAAW,CAAA,CACvC,OAAO,CACL,GAAIY,CAAAA,CAAKZ,CAAAA,CAAM,cAAc,GAAK,CAAE,cAAA,CAAgBY,CAAAA,CAAKZ,CAAAA,CAAM,cAAc,CAAE,CAAA,CAC/E,GAAIc,GAAY,eAAA,CAAgB,IAAA,CAAKA,CAAQ,CAAA,EAAK,CAAE,WAAA,CAAaA,CAAS,CAAA,CAC1E,GAAI,OAAOd,CAAAA,CAAM,YAAA,EAAiB,SAAA,EAAa,CAAE,YAAA,CAAcA,CAAAA,CAAM,YAAa,CACpF,CACF,CAEO,SAASe,CAAAA,CAAUR,CAAAA,CAAeH,CAAAA,CAAwC,CAC/E,GAAI,CAACL,CAAAA,CAASQ,CAAI,CAAA,CAAG,MAAM,IAAIb,CAAAA,CAAWU,CAAAA,CAAS,OAAQ,kBAAkB,CAAA,CAC7E,GAAI,EAAE,YAAA,GAAgBG,CAAAA,CAAAA,CAAO,OAAO,CAAE,WAAYA,CAAAA,CAAmC,OAAA,CAASG,CAAAA,CAAcN,CAAQ,CAAA,CAAG,QAAA,CAAU,EAAG,EACpI,GAAI,CAACL,CAAAA,CAASQ,CAAAA,CAAK,UAAU,CAAA,CAAG,MAAM,IAAIb,EAAWU,CAAAA,CAAS,MAAA,CAAQ,kBAAkB,CAAA,CACxF,OAAO,CACL,UAAA,CAAYG,CAAAA,CAAK,WACjB,OAAA,CAASE,CAAAA,CAAUF,CAAAA,CAAK,OAAO,CAAA,EAAKG,CAAAA,CAAcN,CAAQ,CAAA,CAC1D,QAAA,CAAUS,CAAAA,CAAcN,CAAAA,CAAK,QAAQ,CAAA,CACrC,GAAIK,CAAAA,CAAKL,CAAAA,CAAK,WAAW,CAAA,EAAK,CAAE,WAAA,CAAaK,CAAAA,CAAKL,CAAAA,CAAK,WAAW,CAAE,CACtE,CACF,CC3DO,SAASS,CAAAA,EAAmB,CACjC,GAAI,OAAO,MAAA,CAAO,UAAA,EAAe,WAAY,OAAO,MAAA,CAAO,UAAA,EAAW,CACtE,IAAMC,CAAAA,CAAQ,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CACvDA,CAAAA,CAAM,CAAC,CAAA,CAAKA,CAAAA,CAAM,CAAC,CAAA,CAAI,EAAA,CAAM,EAAA,CAC7BA,CAAAA,CAAM,CAAC,CAAA,CAAKA,CAAAA,CAAM,CAAC,EAAI,EAAA,CAAM,GAAA,CAC7B,IAAMC,CAAAA,CAAM,KAAA,CAAM,IAAA,CAAKD,CAAAA,CAAQE,CAAAA,EAASA,EAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CACnF,OAAO,CAAA,EAAGD,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,EAAIA,EAAI,KAAA,CAAM,EAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,KAAA,CAAM,EAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAC1G,CCFA,IAAME,CAAAA,CAAmB,0BAAA,CACnBC,CAAAA,CAAO,aAAA,CAYb,SAASC,CAAAA,CAAS,CAAE,EAAA,CAAAC,EAAI,OAAA,CAAAC,CAAAA,CAAUJ,CAAiB,CAAA,CAA+B,CAChF,OAAO,CAAA,EAAGI,CAAAA,CAAQ,QAAQ,MAAA,CAAQ,EAAE,CAAC,CAAA,GAAA,EAAM,kBAAA,CAAmBD,CAAE,CAAC,CAAA,CACnE,CAEA,IAAME,CAAAA,CAAe,IAAA,CACfC,CAAAA,CAAiB,GAAA,CAEvB,eAAeC,CAAAA,CAAKC,CAAAA,CAAaC,CAAAA,CAAiBC,CAAAA,CAAyB,EAAC,CAAGC,CAAAA,CAA8C,CAC3H,IAAMC,CAAAA,CAAa,IAAI,eAAA,CACjBC,CAAAA,CAAQ,IAAMD,CAAAA,CAAW,KAAA,EAAM,CAC/BE,CAAAA,CAAQ,UAAA,CAAWD,EAAOJ,CAAO,CAAA,CACnCE,CAAAA,EAAQ,OAAA,EAASE,CAAAA,EAAM,CAC3BF,CAAAA,EAAQ,gBAAA,CAAiB,QAASE,CAAK,CAAA,CACvC,GAAI,CACF,OAAO,MAAM,KAAA,CAAML,CAAAA,CAAK,CAAE,GAAGE,CAAAA,CAAM,MAAA,CAAQE,CAAAA,CAAW,MAAO,CAAC,CAChE,CAAA,MAAS3B,EAAO,CACd,MAAI0B,CAAAA,EAAQ,OAAA,CAAe1B,CAAAA,CACrBH,CAAAA,CAAaG,CAAAA,CAAO2B,CAAAA,CAAW,OAAO,OAAA,CAAU,SAAA,CAAY,SAAS,CAC7E,CAAA,OAAE,CACA,YAAA,CAAaE,CAAK,EAClBH,CAAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASE,CAAK,EAC5C,CACF,CAEA,eAAsBE,CAAAA,CAAUC,CAAAA,CAA6BL,CAAAA,CAAsBM,CAAAA,CAAwC,CACzH,IAAMC,CAAAA,CAAQD,CAAAA,GAAU,OAAYhB,CAAAA,CAAO,CAAA,EAAGA,CAAI,CAAA,GAAA,EAAMgB,CAAK,CAAA,CAAA,CACvDjC,CAAAA,CAAW,MAAMuB,EAAK,CAAA,EAAGL,CAAAA,CAASc,CAAO,CAAC,CAAA,MAAA,EAASE,CAAK,CAAA,CAAA,CAAIb,CAAAA,CAAc,EAAC,CAAGM,CAAM,CAAA,CAC1F,GAAI,CAAC3B,CAAAA,CAAS,EAAA,CAAI,MAAM,MAAME,CAAAA,CAAaF,CAAQ,CAAA,CACnD,OAAOW,CAAAA,CAAU,MAAMZ,CAAAA,CAASC,CAAQ,EAAGA,CAAQ,CACrD,CAEA,eAAsBmC,CAAAA,CAAgBH,CAAAA,CAA6BL,CAAAA,CAA+C,CAChH,QAAQ,MAAMI,CAAAA,CAAUC,CAAAA,CAASL,CAAM,CAAA,EAAG,UAC5C,CASO,SAASS,EAAgBJ,CAAAA,CAAgC,CAC9D,IAAIK,CAAAA,CAAgD,IAAA,CAEpD,OAAO,MAAOC,CAAAA,CAAiCC,CAAAA,CAAyB,EAAC,GAAgC,CACvG,IAAMpC,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAAE,GAAG6B,CAAAA,CAAQ,SAAA,IAAY,CAAG,MAAA,CAAAM,CAAAA,CAAQ,YAAA,CAAAC,CAAAA,CAAc,QAASP,CAAAA,CAAQ,OAAA,CAAS,MAAA,CAAQA,CAAAA,CAAQ,WAAA,CAAa,GAAIA,CAAAA,CAAQ,gBAAA,EAAoB,CAAE,YAAA,CAAcA,CAAAA,CAAQ,gBAAiB,CAAG,CAAC,CAAA,CAC9MK,CAAAA,EAAS,IAAA,GAASlC,IAAMkC,CAAAA,CAAU,CAAE,IAAA,CAAAlC,CAAAA,CAAM,GAAA,CAAKS,CAAAA,EAAW,CAAA,CAAA,CAC9D,IAAMZ,CAAAA,CAAW,MAAMuB,CAAAA,CAAK,CAAA,EAAGL,CAAAA,CAASc,CAAO,CAAC,CAAA,CAAA,EAAIf,CAAI,CAAA,CAAA,CAAIK,CAAAA,CAAgB,CAC1E,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,mBAAoB,iBAAA,CAAmBe,CAAAA,CAAQ,GAAI,CAAA,CAC9E,IAAA,CAAAlC,CACF,CAAC,CAAA,CACD,GAAI,CAACH,CAAAA,CAAS,EAAA,CAAI,MAAM,MAAME,CAAAA,CAAaF,CAAQ,EACnD,IAAMwC,CAAAA,CAAa,MAAMzC,CAAAA,CAASC,CAAQ,CAAA,CAC1C,OAAAqC,CAAAA,CAAU,KACHG,CACT,CACF,CC9DA,IAAMC,CAAAA,CAAY,IAAI,GAAA,CAAI,CAAC,WAAY,MAAM,CAAC,CAAA,CACxCC,CAAAA,CAAO,KAAA,CAAc,EAAA,CAAK,GAAA,CAEzB,SAASC,EAAYC,CAAAA,CAA4BN,CAAAA,CAA0D,CAChH,IAAMO,CAAAA,CAAS,CAAC,GAAID,CAAAA,CAAW,QAAU,EAAC,CAAI,GAAA,CAAIA,CAAAA,CAAW,KAAA,EAAS,EAAC,EAAG,OAAA,CAASE,GAASA,CAAAA,CAAK,MAAM,CAAC,CAAA,CAClGC,CAAAA,CAAgC,EAAC,CACvC,IAAA,IAAWC,KAASH,CAAAA,CACd,CAACJ,CAAAA,CAAU,GAAA,CAAIO,CAAAA,CAAM,IAAI,CAAA,EAAKV,CAAAA,CAAOU,CAAAA,CAAM,GAAG,CAAA,GAAM,MAAA,GAAWD,CAAAA,CAAKC,CAAAA,CAAM,GAAG,CAAA,CAAIV,EAAOU,CAAAA,CAAM,GAAG,CAAA,CAAA,CAEvG,OAAOD,CACT,CAEA,IAAME,CAAAA,CAAmB,IAAO,UAAA,CAAiD,cAAA,CAE1E,SAASC,CAAAA,CAAkBC,CAAAA,CAAST,CAAAA,CAAMU,CAAAA,CAA4CH,CAAAA,CAA8B,CACzH,IAAMI,CAAAA,CAAOlC,CAAAA,EAAe,CAAA,eAAA,EAAkBA,CAAE,CAAA,CAAA,CAC1CmC,CAAAA,CAAU,CAAIC,EAAsCC,CAAAA,GAAmB,CAC3E,GAAI,CACF,IAAMC,CAAAA,CAAUL,CAAAA,EAAU,CAC1B,OAAOK,CAAAA,CAAUF,CAAAA,CAAOE,CAAO,CAAA,CAAID,CACrC,CAAA,KAAQ,CACN,OAAOA,CACT,CACF,CAAA,CACA,OAAO,CACL,IAAA,CAAM,CAACrC,CAAAA,CAAI3B,CAAAA,GAAY8D,EAASG,CAAAA,EAAY,CAC1C,IAAMC,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAIlC,CAAE,CAAC,CAAA,EAAK,MAAM,CAAA,CAC3D,OAAOuC,CAAAA,EAASA,EAAM,OAAA,GAAYlE,CAAAA,EAAW,IAAA,CAAK,GAAA,EAAI,CAAIkE,CAAAA,CAAM,OAAA,CAAUP,CAAAA,CAASO,EAAM,MAAA,CAAS,IACpG,CAAA,CAAG,IAAI,CAAA,CACP,IAAA,CAAM,CAACvC,CAAAA,CAAI3B,EAAS8C,CAAAA,GAAWgB,CAAAA,CAASG,CAAAA,EAAYA,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAIlC,CAAE,CAAA,CAAG,KAAK,SAAA,CAAU,CAAE,OAAA,CAAA3B,CAAAA,CAAS,OAAA,CAAS,IAAA,CAAK,GAAA,EAAI,CAAG,OAAA8C,CAAO,CAAC,CAAC,CAAA,CAAG,MAAS,CAAA,CACjJ,KAAA,CAAQnB,CAAAA,EAAOmC,EAASG,CAAAA,EAAYA,CAAAA,CAAQ,UAAA,CAAWJ,CAAAA,CAAIlC,CAAE,CAAC,CAAA,CAAG,MAAS,CAC5E,CACF","file":"chunk-YTUVSJUF.js","sourcesContent":["export type CloudAction = 'retry' | 'reload' | null;\n\nexport interface CloudFailure {\n message: string;\n action: CloudAction;\n}\n\nexport const FORM_UPDATED_MESSAGE = 'This form was updated. Please review your answers and submit again.';\nexport const ANSWER_AGAIN = 'Please answer again.';\n\nconst SERVER: CloudFailure = { message: 'Something went wrong. Try again.', action: 'retry' };\nconst GENERIC: CloudFailure = { message: 'Could not send. Try again.', action: 'retry' };\nconst BROKEN: CloudFailure = { message: 'Could not send. Reload the page and try again.', action: 'reload' };\n\nconst BY_CODE: Record<string, CloudFailure> = {\n network: { message: 'Could not reach the form server. Check your connection and try again.', action: 'retry' },\n timeout: { message: 'The form server did not respond. Try again.', action: 'retry' },\n invalid: { message: 'Some answers were not accepted.', action: null },\n rate_limited: { message: 'Too many attempts. Wait a minute and try again.', action: 'retry' },\n limit_reached: { message: 'This form is not accepting responses right now.', action: null },\n not_found: { message: 'This form no longer exists.', action: null },\n paused: { message: 'This form is paused.', action: null },\n expired: { message: 'This form has expired.', action: null },\n body_too_large: { message: 'Your answers are too long. Shorten them and try again.', action: null },\n idempotency_key_reused: { message: 'Your answers changed while sending. Try again.', action: 'retry' },\n form_updated: { message: 'This form was updated. Reload the page.', action: 'reload' },\n client_outdated: { message: 'This form needs a newer version of this page.', action: null },\n malformed_body: BROKEN,\n unsupported_media_type: BROKEN,\n invalid_idempotency_key: BROKEN,\n invalid_response: SERVER,\n unavailable: SERVER,\n internal: SERVER,\n};\n\nconst CODE_BY_STATUS: Record<number, string> = {\n 0: 'network',\n 400: 'malformed_body',\n 402: 'limit_reached',\n 404: 'not_found',\n 409: 'paused',\n 410: 'expired',\n 413: 'body_too_large',\n 422: 'invalid',\n 426: 'client_outdated',\n 429: 'rate_limited',\n};\n\nexport function failureFor(status: number, code = ''): CloudFailure {\n const known = BY_CODE[code] ?? BY_CODE[CODE_BY_STATUS[status] ?? ''];\n if (known) return known;\n return status >= 500 ? SERVER : GENERIC;\n}\n","import { failureFor, type CloudAction } from './failures';\n\nexport class CloudError extends Error {\n readonly status: number;\n readonly code: string;\n readonly errors?: Record<string, string>;\n readonly version?: number;\n readonly action: CloudAction;\n readonly cause?: unknown;\n\n constructor(status: number, code: string, errors?: Record<string, string>, version?: number, cause?: unknown) {\n const failure = failureFor(status, code);\n super(failure.message);\n this.name = 'CloudError';\n this.status = status;\n this.code = code;\n this.errors = errors;\n this.version = version;\n this.action = failure.action;\n this.cause = cause;\n }\n\n get retryable(): boolean {\n return this.action === 'retry';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst LEGACY_CODES = new Map([\n ['Form paused', 'paused'],\n ['Form not found', 'not_found'],\n ['Form expired', 'expired'],\n ['internal error', 'internal'],\n]);\n\nexport function networkError(cause: unknown, code = 'network'): CloudError {\n return new CloudError(0, code, undefined, undefined, cause);\n}\n\nexport async function readJson(response: CloudResponse): Promise<unknown> {\n try {\n return await response.json();\n } catch (error) {\n throw new CloudError(response.status, 'invalid_response', undefined, undefined, error);\n }\n}\n\nexport async function toCloudError(response: CloudResponse): Promise<CloudError> {\n const body: unknown = await response.json().catch(() => null);\n if (!isRecord(body)) return new CloudError(response.status, 'unknown');\n const errors = isRecord(body.errors) ? body.errors as Record<string, string> : undefined;\n const version = typeof body.version === 'number' && Number.isInteger(body.version) ? body.version : undefined;\n const code = typeof body.error === 'string' ? LEGACY_CODES.get(body.error) ?? body.error : 'unknown';\n return new CloudError(response.status, code, errors, version);\n}\n","import type { FormDefinition } from '../types';\nimport { CloudError } from './error';\n\nexport interface CloudSettings {\n successMessage?: string;\n redirectUrl?: string;\n allowAnother?: boolean;\n}\n\nexport interface PublishedForm {\n definition: FormDefinition;\n version?: number;\n settings?: CloudSettings;\n renderToken?: string;\n}\n\nconst VERSION_HEADERS = ['Formhaus-Form-Version', 'Formhaus-Version'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction toVersion(value: unknown): number | undefined {\n const version = Number(value);\n return value !== null && value !== '' && Number.isInteger(version) && version > 0 ? version : undefined;\n}\n\nfunction headerVersion(response: CloudResponse): number | undefined {\n for (const name of VERSION_HEADERS) {\n const version = toVersion(response.headers?.get(name));\n if (version !== undefined) return version;\n }\n return undefined;\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport function parseSettings(value: unknown): CloudSettings {\n if (!isRecord(value)) return {};\n const redirect = text(value.redirectUrl);\n return {\n ...(text(value.successMessage) && { successMessage: text(value.successMessage) }),\n ...(redirect && /^https?:\\/\\//i.test(redirect) && { redirectUrl: redirect }),\n ...(typeof value.allowAnother === 'boolean' && { allowAnother: value.allowAnother }),\n };\n}\n\nexport function parseForm(body: unknown, response: CloudResponse): PublishedForm {\n if (!isRecord(body)) throw new CloudError(response.status, 'invalid_response');\n if (!('definition' in body)) return { definition: body as unknown as FormDefinition, version: headerVersion(response), settings: {} };\n if (!isRecord(body.definition)) throw new CloudError(response.status, 'invalid_response');\n return {\n definition: body.definition as unknown as FormDefinition,\n version: toVersion(body.version) ?? headerVersion(response),\n settings: parseSettings(body.settings),\n ...(text(body.renderToken) && { renderToken: text(body.renderToken) }),\n };\n}\n","export function randomId(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6] & 15) | 64;\n bytes[8] = (bytes[8] & 63) | 128;\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import type { FormDefinition } from '../types';\nimport { networkError, readJson, toCloudError } from './error';\nimport { parseForm, type PublishedForm } from './envelope';\nimport { randomId } from './uuid';\n\nconst DEFAULT_API_BASE = 'https://api.formhaus.dev';\nconst CORE = `core=${__FORMHAUS_CORE_VERSION__}`;\n\nexport interface CloudSubmission {\n id: string;\n values: Record<string, unknown>;\n}\n\nexport interface CloudClientOptions {\n id: string;\n apiBase?: string;\n}\n\nfunction endpoint({ id, apiBase = DEFAULT_API_BASE }: CloudClientOptions): string {\n return `${apiBase.replace(/\\/+$/, '')}/f/${encodeURIComponent(id)}`;\n}\n\nconst LOAD_TIMEOUT = 15_000;\nconst SUBMIT_TIMEOUT = 30_000;\n\nasync function send(url: string, timeout: number, init: CloudRequestInit = {}, signal?: AbortSignal): Promise<CloudResponse> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n const timer = setTimeout(abort, timeout);\n if (signal?.aborted) abort();\n signal?.addEventListener('abort', abort);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (error) {\n if (signal?.aborted) throw error;\n throw networkError(error, controller.signal.aborted ? 'timeout' : 'network');\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n }\n}\n\nexport async function fetchForm(options: CloudClientOptions, signal?: AbortSignal, after?: number): Promise<PublishedForm> {\n const query = after === undefined ? CORE : `${CORE}&v=${after}`;\n const response = await send(`${endpoint(options)}/form?${query}`, LOAD_TIMEOUT, {}, signal);\n if (!response.ok) throw await toCloudError(response);\n return parseForm(await readJson(response), response);\n}\n\nexport async function fetchDefinition(options: CloudClientOptions, signal?: AbortSignal): Promise<FormDefinition> {\n return (await fetchForm(options, signal)).definition;\n}\n\nexport interface CloudSubmitterOptions extends CloudClientOptions {\n version?: number;\n renderToken?: string;\n firstRenderToken?: string;\n extraBody?: () => Record<string, unknown>;\n}\n\nexport function createSubmitter(options: CloudSubmitterOptions) {\n let pending: { body: string; key: string } | null = null;\n\n return async (values: Record<string, unknown>, skippedSteps: string[] = []): Promise<CloudSubmission> => {\n const body = JSON.stringify({ ...options.extraBody?.(), values, skippedSteps, version: options.version, _fh_rt: options.renderToken, ...(options.firstRenderToken && { _fh_rt_first: options.firstRenderToken }) });\n if (pending?.body !== body) pending = { body, key: randomId() };\n const response = await send(`${endpoint(options)}?${CORE}`, SUBMIT_TIMEOUT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Idempotency-Key': pending.key },\n body,\n });\n if (!response.ok) throw await toCloudError(response);\n const submission = await readJson(response) as CloudSubmission;\n pending = null;\n return submission;\n };\n}\n","import type { FormDefinition } from '../types';\n\nexport interface DraftStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface DraftStore {\n load(id: string, version: number | undefined): Record<string, unknown> | null;\n save(id: string, version: number | undefined, values: Record<string, unknown>): void;\n clear(id: string): void;\n}\n\nconst SENSITIVE = new Set(['password', 'file']);\nconst WEEK = 7 * 24 * 60 * 60 * 1000;\n\nexport function draftValues(definition: FormDefinition, values: Record<string, unknown>): Record<string, unknown> {\n const fields = [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n const kept: Record<string, unknown> = {};\n for (const field of fields) {\n if (!SENSITIVE.has(field.type) && values[field.key] !== undefined) kept[field.key] = values[field.key];\n }\n return kept;\n}\n\nconst sessionStorageOf = () => (globalThis as { sessionStorage?: DraftStorage }).sessionStorage;\n\nexport function sessionDraftStore(maxAge = WEEK, storageOf: () => DraftStorage | undefined = sessionStorageOf): DraftStore {\n const key = (id: string) => `formhaus:draft:${id}`;\n const attempt = <T>(action: (storage: DraftStorage) => T, fallback: T): T => {\n try {\n const storage = storageOf();\n return storage ? action(storage) : fallback;\n } catch {\n return fallback;\n }\n };\n return {\n load: (id, version) => attempt((storage) => {\n const draft = JSON.parse(storage.getItem(key(id)) ?? 'null') as { version?: number; savedAt: number; values: Record<string, unknown> } | null;\n return draft && draft.version === version && Date.now() - draft.savedAt < maxAge ? draft.values : null;\n }, null),\n save: (id, version, values) => attempt((storage) => storage.setItem(key(id), JSON.stringify({ version, savedAt: Date.now(), values })), undefined),\n clear: (id) => attempt((storage) => storage.removeItem(key(id)), undefined),\n };\n}\n"]}
|
package/dist/cloud.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as CloudAction } from './controller-
|
|
2
|
-
export { a as CloudClientOptions, b as CloudNotice, c as CloudSettings, d as CloudSubmission, e as CloudSubmitterOptions, D as DraftStorage, f as DraftStore, P as PublishedForm, g as createSubmitter, h as fetchDefinition, i as fetchForm, s as sessionDraftStore } from './controller-
|
|
3
|
-
import './definition-
|
|
1
|
+
import { C as CloudAction } from './controller-Ds_kbXSU.js';
|
|
2
|
+
export { a as CloudClientOptions, b as CloudNotice, c as CloudSettings, d as CloudSubmission, e as CloudSubmitterOptions, D as DraftStorage, f as DraftStore, P as PublishedForm, g as createSubmitter, h as fetchDefinition, i as fetchForm, s as sessionDraftStore } from './controller-Ds_kbXSU.js';
|
|
3
|
+
import './definition-B4OIy_wH.js';
|
|
4
4
|
|
|
5
5
|
declare class CloudError extends Error {
|
|
6
6
|
readonly status: number;
|
package/dist/cloud.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{d as CloudError,i as createSubmitter,h as fetchDefinition,g as fetchForm,k as sessionDraftStore}from'./chunk-
|
|
1
|
+
export{d as CloudError,i as createSubmitter,h as fetchDefinition,g as fetchForm,k as sessionDraftStore}from'./chunk-YTUVSJUF.js';//# sourceMappingURL=cloud.js.map
|
|
2
2
|
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { M as MessageCatalog, m as MessageKey, F as FormField } from './definition-B4OIy_wH.js';
|
|
2
|
+
|
|
3
|
+
type DefinitionIssueCode = 'invalid-type' | 'missing-property' | 'fields-and-steps' | 'duplicate-step-id' | 'duplicate-key' | 'reserved-key' | 'route-target' | 'unknown-field' | 'forward-reference' | 'condition-operator-count' | 'unknown-operator' | 'condition-value-mismatch' | 'condition-cycle' | 'invalid-pattern' | 'invalid-range' | 'rule-not-applicable' | 'missing-options' | 'default-not-in-options' | 'unknown-field-type' | 'unknown-validator' | 'skip-unreachable' | 'route-fallthrough' | 'unsupported-format-version' | 'i18n-unbound-slot' | 'unknown-i18n-slot' | 'unknown-message-key' | 'unknown-label-key' | 'i18n-unsafe-identifier';
|
|
4
|
+
interface DefinitionIssue {
|
|
5
|
+
code: DefinitionIssueCode;
|
|
6
|
+
severity: 'error' | 'warning';
|
|
7
|
+
path: string;
|
|
8
|
+
message: string;
|
|
9
|
+
hint?: string;
|
|
10
|
+
}
|
|
11
|
+
declare class FormDefinitionError extends Error {
|
|
12
|
+
readonly issues: DefinitionIssue[];
|
|
13
|
+
constructor(issues: DefinitionIssue[]);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type MessageParams = Record<string, unknown>;
|
|
17
|
+
type MessageFn = (key: MessageKey, params: MessageParams, field: FormField) => string | undefined;
|
|
18
|
+
type MessageSource = MessageCatalog | MessageFn;
|
|
19
|
+
declare const DEFAULT_MESSAGES: Readonly<Record<MessageKey, string>>;
|
|
20
|
+
type ValidationRule = 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'matchField';
|
|
21
|
+
declare function getDefaultMessage(rule: ValidationRule | MessageKey, params?: Record<string, unknown>): string;
|
|
22
|
+
|
|
23
|
+
export { type DefinitionIssue as D, FormDefinitionError as F, type MessageSource as M, type ValidationRule as V, type DefinitionIssueCode as a, type MessageFn as b, type MessageParams as c, DEFAULT_MESSAGES as d, getDefaultMessage as g };
|
|
@@ -1,8 +1,43 @@
|
|
|
1
|
+
type MessageKey = 'required' | 'minLength' | 'maxLength' | 'minItems' | 'maxItems' | 'min' | 'max' | 'pattern' | 'matchField' | 'email' | 'number' | 'date' | 'datetime' | 'option' | 'options' | 'boolean' | 'string' | 'file' | 'value';
|
|
2
|
+
type LabelKey = 'continue' | 'back' | 'stepOf' | 'errorSummary';
|
|
3
|
+
type MessageCatalog = Partial<Record<MessageKey, string>>;
|
|
4
|
+
type LabelCatalog = Partial<Record<LabelKey, string>>;
|
|
5
|
+
interface FormI18n {
|
|
6
|
+
title?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
messages?: MessageCatalog;
|
|
9
|
+
labels?: LabelCatalog;
|
|
10
|
+
}
|
|
11
|
+
interface StepI18n {
|
|
12
|
+
title?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
}
|
|
15
|
+
interface FieldI18n {
|
|
16
|
+
label?: string;
|
|
17
|
+
placeholder?: string;
|
|
18
|
+
helperText?: string;
|
|
19
|
+
}
|
|
20
|
+
interface LabelI18n {
|
|
21
|
+
label?: string;
|
|
22
|
+
}
|
|
23
|
+
interface ValidationI18n {
|
|
24
|
+
required?: string;
|
|
25
|
+
minLength?: string;
|
|
26
|
+
maxLength?: string;
|
|
27
|
+
min?: string;
|
|
28
|
+
max?: string;
|
|
29
|
+
pattern?: string;
|
|
30
|
+
matchField?: string;
|
|
31
|
+
}
|
|
32
|
+
type LabelFn = (key: LabelKey, params: Record<string, unknown>) => string | undefined;
|
|
33
|
+
type LabelSource = LabelCatalog | LabelFn;
|
|
34
|
+
|
|
1
35
|
type DefaultFieldType = 'text' | 'email' | 'phone' | 'number' | 'password' | 'select' | 'autocomplete' | 'multiselect' | 'checkbox' | 'radio' | 'switch' | 'file' | 'date' | 'datetime' | 'textarea';
|
|
2
36
|
type FieldType = DefaultFieldType | (string & {});
|
|
3
37
|
interface FieldOption {
|
|
4
38
|
value: string;
|
|
5
39
|
label: string;
|
|
40
|
+
i18n?: LabelI18n;
|
|
6
41
|
}
|
|
7
42
|
interface FormField {
|
|
8
43
|
key: string;
|
|
@@ -23,6 +58,7 @@ interface FormField {
|
|
|
23
58
|
rows?: number;
|
|
24
59
|
mask?: string;
|
|
25
60
|
inputMode?: 'text' | 'numeric' | 'decimal' | 'tel' | 'email' | 'url' | 'search';
|
|
61
|
+
i18n?: FieldI18n;
|
|
26
62
|
}
|
|
27
63
|
interface ShowCondition {
|
|
28
64
|
field: string;
|
|
@@ -51,20 +87,26 @@ interface FieldValidation {
|
|
|
51
87
|
matchField?: string;
|
|
52
88
|
matchFieldMessage?: string;
|
|
53
89
|
validator?: string;
|
|
90
|
+
i18n?: ValidationI18n;
|
|
54
91
|
}
|
|
55
92
|
|
|
56
93
|
interface FormAction {
|
|
57
94
|
label: string;
|
|
58
95
|
variant?: 'primary' | 'secondary' | 'text';
|
|
59
96
|
disabled?: ShowCondition[];
|
|
97
|
+
i18n?: LabelI18n;
|
|
60
98
|
}
|
|
61
99
|
|
|
62
100
|
interface FormDefinition {
|
|
63
101
|
$schema?: string;
|
|
64
102
|
formatVersion?: string;
|
|
65
103
|
id: string;
|
|
104
|
+
lang?: string;
|
|
66
105
|
title: string;
|
|
67
106
|
description?: string;
|
|
107
|
+
messages?: MessageCatalog;
|
|
108
|
+
labels?: LabelCatalog;
|
|
109
|
+
i18n?: FormI18n;
|
|
68
110
|
submit: FormAction;
|
|
69
111
|
cancel?: FormAction;
|
|
70
112
|
fields?: FormField[];
|
|
@@ -86,6 +128,7 @@ interface FormStep {
|
|
|
86
128
|
next?: FormAction | false;
|
|
87
129
|
back?: FormAction | false;
|
|
88
130
|
skip?: FormAction;
|
|
131
|
+
i18n?: StepI18n;
|
|
89
132
|
}
|
|
90
133
|
|
|
91
|
-
export type { DefaultFieldType as D, FormField as F, ShowCondition as S, FormStep as a, FormAction as b,
|
|
134
|
+
export type { DefaultFieldType as D, FormField as F, LabelCatalog as L, MessageCatalog as M, ShowCondition as S, ValidationI18n as V, FormStep as a, FormAction as b, FieldI18n as c, FieldOption as d, FieldType as e, FieldValidation as f, FormDefinition as g, FormI18n as h, LabelFn as i, LabelI18n as j, LabelKey as k, LabelSource as l, MessageKey as m, StepI18n as n, StepRoute as o };
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { g as FormDefinition, l as LabelSource, k as LabelKey } from './definition-B4OIy_wH.js';
|
|
2
|
+
import { M as MessageSource, D as DefinitionIssue } from './default-messages-yS4QtrYi.js';
|
|
3
|
+
export { d as defaultMessages } from './default-messages-yS4QtrYi.js';
|
|
4
|
+
|
|
5
|
+
type Overlay = {
|
|
6
|
+
[key: string]: string | Overlay;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type TranslateFn = (key: string, params: Record<string, unknown>, defaultText: string) => string | undefined;
|
|
10
|
+
interface OverlaySource {
|
|
11
|
+
overlay: Overlay;
|
|
12
|
+
lang?: string;
|
|
13
|
+
}
|
|
14
|
+
interface TranslateSource {
|
|
15
|
+
translate: TranslateFn;
|
|
16
|
+
prefix?: string | false;
|
|
17
|
+
lang?: string;
|
|
18
|
+
}
|
|
19
|
+
type LocalizeSource = OverlaySource | TranslateSource;
|
|
20
|
+
interface Localized {
|
|
21
|
+
definition: FormDefinition;
|
|
22
|
+
messages: MessageSource;
|
|
23
|
+
labels: LabelSource;
|
|
24
|
+
}
|
|
25
|
+
declare function localize(input: FormDefinition, source: LocalizeSource): Localized;
|
|
26
|
+
|
|
27
|
+
interface TextSlot {
|
|
28
|
+
address: string;
|
|
29
|
+
key?: string;
|
|
30
|
+
text: string;
|
|
31
|
+
params: string[];
|
|
32
|
+
hash: string;
|
|
33
|
+
}
|
|
34
|
+
interface TextSlotOptions {
|
|
35
|
+
prefix?: string | false;
|
|
36
|
+
}
|
|
37
|
+
declare function textSlots(definition: FormDefinition, { prefix }?: TextSlotOptions): TextSlot[];
|
|
38
|
+
declare function translationTemplate(definition: FormDefinition): Overlay;
|
|
39
|
+
|
|
40
|
+
interface TranslationMeta {
|
|
41
|
+
prefix?: string | false;
|
|
42
|
+
slots?: Record<string, {
|
|
43
|
+
hash?: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
interface TranslationIssues {
|
|
47
|
+
missing: string[];
|
|
48
|
+
unknown: string[];
|
|
49
|
+
invalid: string[];
|
|
50
|
+
placeholderMismatch: string[];
|
|
51
|
+
unlabeled: string[];
|
|
52
|
+
stale?: string[];
|
|
53
|
+
}
|
|
54
|
+
declare function translationIssues(definition: FormDefinition, overlay: unknown, meta?: TranslationMeta): TranslationIssues;
|
|
55
|
+
|
|
56
|
+
declare function checkTranslations(definition: FormDefinition): DefinitionIssue[];
|
|
57
|
+
|
|
58
|
+
declare const DEFAULT_LABELS: Readonly<Record<LabelKey, string>>;
|
|
59
|
+
|
|
60
|
+
export { type LocalizeSource, type Localized, type Overlay, type OverlaySource, type TextSlot, type TextSlotOptions, type TranslateFn, type TranslateSource, type TranslationIssues, type TranslationMeta, checkTranslations, DEFAULT_LABELS as defaultLabels, localize, textSlots, translationIssues, translationTemplate };
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {g,k,e,a,b,d,c as c$1,f}from'./chunk-RN5GQHKN.js';import {a as a$1,b as b$1,c}from'./chunk-PZEBYRGE.js';export{c as defaultLabels}from'./chunk-PZEBYRGE.js';import {b as b$2,a as a$2,g as g$1,r}from'./chunk-35SAVPYL.js';export{a as defaultMessages}from'./chunk-35SAVPYL.js';function B({definition:e,entries:t}){let n=[],r=[],l=false,f$1=(o,a,u,p,d$1)=>{for(let F of Object.keys(o??{}))u.includes(F)||n.push(c$1(p,`${a}/${d(F)}`,`"${F}" is not ${d$1}`,u.length?f(u):"Remove it"));},i=(o,a,u,p)=>{o&&(p&&r.push([`${a}/${p}`,o[p]]),o.i18n&&(l=true,f$1(o.i18n,`${a}/i18n`,[...u],"unknown-i18n-slot","a translatable text here")));},c$2=Object.keys(a$2),s=Object.keys(c);f$1(e.messages,"/messages",c$2,"unknown-message-key","a message key"),f$1(e.labels,"/labels",s,"unknown-label-key","a label key"),f$1(e.i18n?.messages,"/i18n/messages",c$2,"unknown-message-key","a message key"),f$1(e.i18n?.labels,"/i18n/labels",s,"unknown-label-key","a label key"),i(e,"",[...a$1.form,"messages","labels"],"id"),i(e.submit,"/submit",a$1.action),i(e.cancel,"/cancel",a$1.action),(e.steps??[]).forEach((o,a)=>{i(o,`/steps/${a}`,a$1.step,"id");for(let u of ["next","back","skip"])i(o[u],`/steps/${a}/${u}`,a$1.action);});for(let{field:o,path:a}of t){i(o,a,a$1.field,"key"),o.options?.forEach((p,d)=>i(p,`${a}/options/${d}`,a$1.option,"value"));let u=o.validation;u&&i(u,`${a}/validation`,a$1.validation.filter(p=>b$1(u,p)));}if(l)for(let[o,a]of r)typeof a=="string"&&/[.:]/.test(a)&&n.push(c$1("i18n-unsafe-identifier",o,`${JSON.stringify(a)} contains "." or ":"`,'Use letters, digits, "-" or "_", because translation keys and TMS imports split on these characters'));return n}var y=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),G=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function x(e,t){let n=e;for(let r of t)n=y(n)&&G(n,r)?n[r]:void 0;return typeof n=="string"&&n.trim()?n:void 0}function P(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:true,writable:true,configurable:true});}function J(e,t,n){let r=e;for(let l of t.slice(0,-1))(!G(r,l)||!y(r[l]))&&P(r,l,{}),r=r[l];P(r,t[t.length-1],n);}function $(e,t=[]){return y(e)?Object.keys(e).flatMap(n=>$(e[n],[...t,n])):[{path:t,value:e}]}var N=e=>JSON.stringify(e),O=e=>[...new Set(e.match(/\{\w+\}/g)??[])].map(t=>t.slice(1,-1)).sort();function h(e){let t=[],n=(i,c,s,o,a)=>{c&&t.push({kind:i,node:c,path:s,address:o,field:a});},r=(i,c,s,o)=>{for(let a of o)n("action",i[a],`${c}/${a}`,[...s,a]);},l=(i,c,s)=>i.forEach((o,a)=>{let u=`${c}/fields/${a}`,p=[...s,"fields",o.key];n("field",o,u,p),o.options?.forEach((d,F)=>n("option",d,`${u}/options/${F}`,[...p,"options",d.value])),n("validation",o.validation,`${u}/validation`,[...p,"validation"],o);});n("form",e,"",[]),r(e,"",[],["submit","cancel"]);let f=e.steps??[];return f.forEach((i,c)=>{let s=`/steps/${c}`,o=["steps",i.id];n("step",i,s,o),r(i,s,o,["next","back","skip"]),l(i.fields,s,o);}),f.length||l(e.fields??[],"",[]),t}function W(e,t,n){return e==="option"?t:[...t,n]}var V={form:["title","description"],step:["title","description"],field:["label","placeholder","helperText"],option:["label"],action:["label"],validation:[]};function L(e,t,n,r=[]){return e===void 0?[]:y(e)?Object.entries(e).flatMap(([l,f])=>r.includes(l)?L(f,`${t}/${l}`,n):typeof f=="string"&&f.trim()?[]:[b("invalid-type",`${t}/${d(l)}`,"must be a non-empty string")]):[b("invalid-type",t,`must be an object of ${n}`)]}function Y(e){let t=e;return [...t.lang===void 0||typeof t.lang=="string"?[]:[b("invalid-type","/lang",'"lang" must be a string')],...L(t.messages,"/messages","message templates"),...L(t.labels,"/labels","label templates"),...h(e).flatMap(({kind:n,node:r,path:l})=>{let f=r.i18n,i=y(f)?V[n].filter(c=>f[c]!==void 0&&typeof r[c]!="string"):[];return [...L(f,`${l}/i18n`,"translation keys",n==="form"?["messages","labels"]:[]),...i.map(c=>b("i18n-unbound-slot",`${l}/i18n/${c}`,`"${c}" has a translation key but no source text`,`Add "${c}" as the fallback text`))]})]}function M(e){let t=Y(e);return t.length?t:B(g(e))}var q={minLength:"min",maxLength:"max",min:"min",max:"max"};function X(e,t){return e.type==="multiselect"&&t.endsWith("Length")?t.replace("Length","Items"):t}function Z(e){let t=new Set([...Object.keys(e.messages??{}),...Object.keys(e.i18n?.messages??{})]);for(let n of g$1(e)){let r$1=n.validation??{};for(let l of a$1.validation)b$1(r$1,l)&&r$1[l]!==""&&typeof r$1[l==="required"?l:`${l}Message`]!="string"&&t.add(X(n,l));for(let l of r(n))t.add(l);}return t}function ee(e,{kind:t,node:n,address:r,field:l}){let f=n.i18n??{};return a$1[t].flatMap(i=>{if(t!=="validation"){let p=n[i];return typeof p!="string"?[]:[{kind:"text",address:W(t,r,i),key:f[i],source:p,fallback:p,params:{},template:true,apply:d=>{n[i]=d;}}]}if(!b$1(n,i)||!l)return [];let c=i==="required"?i:`${i}Message`,s=typeof n[c]=="string"?n[c]:void 0,o=q[i]?{[q[i]]:n[i]}:{},a=X(l,i),u=s??b$2(e.messages?.[a]??a$2[a],o);return [{kind:"rule",address:[...r,i],key:f[i],source:s,fallback:u,params:o,template:s!==void 0||!!f[i],apply:p=>{n[c]=p;}}]})}function H(e,t,n){let r=t==="messages"?a$2:c,l=e.i18n?.[t]??{};return Object.keys(r).map(f=>{let i=e[t]?.[f]??r[f];return {kind:t==="messages"?"message":"label",address:[t,f],key:l[f],source:i,fallback:i,params:{},template:n.has(f),apply:c=>{(e[t]??(e[t]={}))[f]=c;}}})}function S(e){let t=!!e.steps?.length,n=new Set(t?["continue","back","stepOf","errorSummary"]:["errorSummary"]);return [...h(e).flatMap(r=>ee(e,r)),...H(e,"messages",Z(e)),...H(e,"labels",n)]}function A(e,t,n){if(t!==void 0)return t;if(e!==false)return (e?[e,...n]:n).join(".")}function te(e,t){for(let n of S(e)){let r=x(t,n.address);r!==void 0&&n.apply(n.kind==="rule"?b$2(r,n.params):r);}return {definition:e,messages:e.messages??{},labels:e.labels??{}}}function ne(e,{translate:t,prefix:n=e.id}){let r=(s,o,a,u)=>{let p=A(n,s,o),d;try{d=p===void 0?void 0:t(p,a,u);}catch{return}return typeof d=="string"&&d.trim()&&d!==p?b$2(d,a):void 0},l={messages:{...e.messages},labels:{...e.labels}},f=e.i18n??{};for(let s of S(e)){if(s.kind!=="text"&&s.kind!=="rule")continue;let o=r(s.key,s.address,s.params,s.fallback);o!==void 0&&(s.source!==void 0||o!==s.fallback)&&s.apply(o);}return {definition:e,messages:(s,o)=>r(f.messages?.[s],["messages",s],o,b$2(l.messages[s]??a$2[s],o)),labels:(s,o)=>r(f.labels?.[s],["labels",s],o,b$2(l.labels[s]??c[s],o))}}function se(e$1,t){let n=M(k(e$1)).filter(e);if(n.length)throw new a(n);let r=JSON.parse(JSON.stringify(e$1));return t.lang&&(r.lang=t.lang),"overlay"in t?te(r,t.overlay):ne(r,t)}function re(e,t){let n=2166136261;for(let r of `${e??""}\0${t}`)n=Math.imul(n^r.codePointAt(0),16777619)>>>0;return n.toString(16).padStart(8,"0")}var Q=e=>S(e).filter(t=>t.template);function j(e,t){let n=A(t,e.key,e.address),r=e.source??e.fallback,l=e.kind==="rule"?Object.keys(e.params):O(r);return {address:e.address.join("."),...n!==void 0&&{key:n},text:r,params:l,hash:re(n,r)}}function oe(e,{prefix:t=e.id}={}){return Q(e).map(n=>j(n,t))}function ie(e){let t={};for(let n of Q(e))J(t,n.address,n.source??n.fallback);return t}var D=e=>e.join(".");function ae(e,t){let n=O(t);return e.kind==="rule"?n.some(r=>!Object.prototype.hasOwnProperty.call(e.params,r)):n.join()!==O(e.source??e.fallback).join()}function le(e,t,n){let r=S(e),l=new Set(r.map(s=>N(s.address))),f=y(t)?$(t):[{path:[],value:null}],i=r.filter(s=>x(t,s.address)!==void 0),c={missing:r.filter(s=>s.template&&x(t,s.address)===void 0).map(s=>D(s.address)),unknown:f.filter(({path:s,value:o})=>typeof o=="string"&&!l.has(N(s))).map(({path:s})=>D(s)),invalid:f.filter(({value:s})=>typeof s!="string").map(({path:s})=>D(s)),placeholderMismatch:i.filter(s=>ae(s,x(t,s.address))).map(s=>D(s.address)),unlabeled:h(e).filter(({kind:s,node:o,address:a})=>s==="field"&&!(typeof o.label=="string"&&o.label.trim())&&x(t,[...a,"label"])===void 0).map(({address:s})=>D([...s,"label"]))};if(n?.slots){let s=n.slots,o=a=>Object.prototype.hasOwnProperty.call(s,a);c.stale=i.filter(a=>a.template).map(a=>j(a,n.prefix??e.id)).filter(({address:a,hash:u})=>o(a)&&s[a]?.hash!==void 0&&s[a].hash!==u).map(({address:a})=>a);}return c}export{M as checkTranslations,se as localize,oe as textSlots,le as translationIssues,ie as translationTemplate};//# sourceMappingURL=i18n.js.map
|
|
2
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/check-warnings.ts","../src/i18n/overlay.ts","../src/i18n/walk.ts","../src/i18n/check.ts","../src/i18n/slots.ts","../src/i18n/localize.ts","../src/i18n/template.ts","../src/i18n/issues.ts"],"names":["i18nWarnings","definition","entries","issues","ids","keyed","unknown","block","path","known","code","what","key","warning","pointer","oneOf","node","value","slots","id","messages","DEFAULT_MESSAGES","labels","DEFAULT_LABELS","SLOTS","step","index","name","field","option","rules","rule","hasRule","isEntry","own","lookup","overlay","define","target","assign","leaves","addressKey","placeholders","text","textNodes","list","add","kind","address","actions","owner","names","fields","items","at","position","steps","slotAddress","slot","TEXTS","strings","nested","item","error","translationErrors","root","unbound","checkTranslations","errors","createContext","BOUNDS","ruleKey","usedMessages","keys","getAllFields","typeMessageKeys","nodeSlots","source","literalName","literal","params","message","fallback","formatText","catalogSlots","used","defaults","definitionSlots","translationKey","prefix","explicit","fromOverlay","fromTranslate","translate","ask","localize","input","parseDefinition","isError","FormDefinitionError","textHash","hash","char","templateSlots","describeSlot","textSlots","translationTemplate","dotted","mismatch","translationIssues","meta","found","translated","result","baseline"],"mappings":"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","file":"i18n.js","sourcesContent":["import { DEFAULT_MESSAGES } from '../validation/default-messages';\nimport { DEFAULT_LABELS, hasRule, SLOTS } from './nodes';\nimport type { CheckContext } from '../definition-validation/context';\nimport type { DefinitionIssue, DefinitionIssueCode } from '../definition-validation/issues';\nimport { oneOf, pointer, warning } from '../definition-validation/issues';\n\ntype Node = Record<string, unknown> | undefined | false;\n\nexport function i18nWarnings({ definition, entries }: CheckContext): DefinitionIssue[] {\n const issues: DefinitionIssue[] = [];\n const ids: [string, unknown][] = [];\n let keyed = false;\n const unknown = (block: unknown, path: string, known: string[], code: DefinitionIssueCode, what: string) => {\n for (const key of Object.keys(block ?? {})) {\n if (!known.includes(key)) issues.push(warning(code, `${path}/${pointer(key)}`, `\"${key}\" is not ${what}`, known.length ? oneOf(known) : 'Remove it'));\n }\n };\n const node = (value: Node, path: string, slots: readonly string[], id?: string) => {\n if (!value) return;\n if (id) ids.push([`${path}/${id}`, value[id]]);\n if (!value.i18n) return;\n keyed = true;\n unknown(value.i18n, `${path}/i18n`, [...slots], 'unknown-i18n-slot', 'a translatable text here');\n };\n const messages = Object.keys(DEFAULT_MESSAGES);\n const labels = Object.keys(DEFAULT_LABELS);\n unknown(definition.messages, '/messages', messages, 'unknown-message-key', 'a message key');\n unknown(definition.labels, '/labels', labels, 'unknown-label-key', 'a label key');\n unknown(definition.i18n?.messages, '/i18n/messages', messages, 'unknown-message-key', 'a message key');\n unknown(definition.i18n?.labels, '/i18n/labels', labels, 'unknown-label-key', 'a label key');\n node(definition as unknown as Node, '', [...SLOTS.form, 'messages', 'labels'], 'id');\n node(definition.submit as unknown as Node, '/submit', SLOTS.action);\n node(definition.cancel as unknown as Node, '/cancel', SLOTS.action);\n (definition.steps ?? []).forEach((step, index) => {\n node(step as unknown as Node, `/steps/${index}`, SLOTS.step, 'id');\n for (const name of ['next', 'back', 'skip'] as const) node(step[name] as unknown as Node, `/steps/${index}/${name}`, SLOTS.action);\n });\n for (const { field, path } of entries) {\n node(field as unknown as Node, path, SLOTS.field, 'key');\n field.options?.forEach((option, index) => node(option as unknown as Node, `${path}/options/${index}`, SLOTS.option, 'value'));\n const rules = field.validation as Node;\n if (rules) node(rules, `${path}/validation`, SLOTS.validation.filter((rule) => hasRule(rules, rule)));\n }\n if (keyed) {\n for (const [path, id] of ids) {\n if (typeof id === 'string' && /[.:]/.test(id)) issues.push(warning('i18n-unsafe-identifier', path, `${JSON.stringify(id)} contains \".\" or \":\"`, 'Use letters, digits, \"-\" or \"_\", because translation keys and TMS imports split on these characters'));\n }\n }\n return issues;\n}\n","export type Overlay = { [key: string]: string | Overlay };\n\nexport const isEntry = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst own = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key);\n\nexport function lookup(overlay: unknown, path: string[]): string | undefined {\n let node = overlay;\n for (const key of path) node = isEntry(node) && own(node, key) ? node[key] : undefined;\n return typeof node === 'string' && node.trim() ? node : undefined;\n}\n\nfunction define(target: object, key: string, value: unknown): void {\n Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });\n}\n\nexport function assign(target: Overlay, path: string[], value: string): void {\n let node: Overlay = target;\n for (const key of path.slice(0, -1)) {\n if (!own(node, key) || !isEntry(node[key])) define(node, key, {});\n node = node[key] as Overlay;\n }\n define(node, path[path.length - 1], value);\n}\n\nexport function leaves(overlay: unknown, path: string[] = []): { path: string[]; value: unknown }[] {\n if (!isEntry(overlay)) return [{ path, value: overlay }];\n return Object.keys(overlay).flatMap((key) => leaves(overlay[key], [...path, key]));\n}\n\nexport const addressKey = (path: string[]) => JSON.stringify(path);\n\nexport const placeholders = (text: string) => [...new Set(text.match(/\\{\\w+\\}/g) ?? [])].map((name) => name.slice(1, -1)).sort();\n","import type { FormDefinition, FormField } from '../types';\nimport type { Entry, NodeKind } from './nodes';\n\nexport interface TextNode {\n kind: NodeKind;\n node: Entry;\n path: string;\n address: string[];\n field?: FormField;\n}\n\nexport function textNodes(definition: FormDefinition): TextNode[] {\n const list: TextNode[] = [];\n const add = (kind: NodeKind, node: unknown, path: string, address: string[], field?: FormField) => {\n if (node) list.push({ kind, node: node as Entry, path, address, field });\n };\n const actions = (owner: Entry, path: string, address: string[], names: string[]) => {\n for (const name of names) add('action', owner[name], `${path}/${name}`, [...address, name]);\n };\n const fields = (items: FormField[], path: string, address: string[]) => items.forEach((field, index) => {\n const at = `${path}/fields/${index}`;\n const key = [...address, 'fields', field.key];\n add('field', field, at, key);\n field.options?.forEach((option, position) => add('option', option, `${at}/options/${position}`, [...key, 'options', option.value]));\n add('validation', field.validation, `${at}/validation`, [...key, 'validation'], field);\n });\n add('form', definition, '', []);\n actions(definition as unknown as Entry, '', [], ['submit', 'cancel']);\n const steps = definition.steps ?? [];\n steps.forEach((step, index) => {\n const path = `/steps/${index}`;\n const address = ['steps', step.id];\n add('step', step, path, address);\n actions(step as unknown as Entry, path, address, ['next', 'back', 'skip']);\n fields(step.fields, path, address);\n });\n if (!steps.length) fields(definition.fields ?? [], '', []);\n return list;\n}\n\nexport function slotAddress(kind: NodeKind, address: string[], slot: string): string[] {\n return kind === 'option' ? address : [...address, slot];\n}\n","import { createContext } from '../definition-validation/context';\nimport { error, pointer, type DefinitionIssue } from '../definition-validation/issues';\nimport type { FormDefinition } from '../types';\nimport { i18nWarnings } from './check-warnings';\nimport { isEntry } from './overlay';\nimport { textNodes } from './walk';\n\nconst TEXTS = { form: ['title', 'description'], step: ['title', 'description'], field: ['label', 'placeholder', 'helperText'], option: ['label'], action: ['label'], validation: [] };\n\nfunction strings(value: unknown, path: string, what: string, nested: string[] = []): DefinitionIssue[] {\n if (value === undefined) return [];\n if (!isEntry(value)) return [error('invalid-type', path, `must be an object of ${what}`)];\n return Object.entries(value).flatMap(([key, item]) => (nested.includes(key)\n ? strings(item, `${path}/${key}`, what)\n : typeof item === 'string' && item.trim() ? [] : [error('invalid-type', `${path}/${pointer(key)}`, 'must be a non-empty string')]));\n}\n\nfunction translationErrors(definition: FormDefinition): DefinitionIssue[] {\n const root = definition as unknown as Record<string, unknown>;\n return [\n ...(root.lang === undefined || typeof root.lang === 'string' ? [] : [error('invalid-type', '/lang', '\"lang\" must be a string')]),\n ...strings(root.messages, '/messages', 'message templates'),\n ...strings(root.labels, '/labels', 'label templates'),\n ...textNodes(definition).flatMap(({ kind, node, path }) => {\n const block = node.i18n;\n const unbound = isEntry(block) ? TEXTS[kind].filter((slot) => block[slot] !== undefined && typeof node[slot] !== 'string') : [];\n return [\n ...strings(block, `${path}/i18n`, 'translation keys', kind === 'form' ? ['messages', 'labels'] : []),\n ...unbound.map((slot) => error('i18n-unbound-slot', `${path}/i18n/${slot}`, `\"${slot}\" has a translation key but no source text`, `Add \"${slot}\" as the fallback text`)),\n ];\n }),\n ];\n}\n\nexport function checkTranslations(definition: FormDefinition): DefinitionIssue[] {\n const errors = translationErrors(definition);\n return errors.length ? errors : i18nWarnings(createContext(definition));\n}\n","import { getAllFields } from '../engine/engine-utils';\nimport type { FormDefinition, FormField, LabelKey, MessageKey } from '../types';\nimport { DEFAULT_MESSAGES, formatText } from '../validation/default-messages';\nimport { typeMessageKeys } from '../validation/type-checks';\nimport { DEFAULT_LABELS, hasRule, SLOTS, type Entry } from './nodes';\nimport { slotAddress, textNodes, type TextNode } from './walk';\n\nexport type SlotKind = 'text' | 'rule' | 'message' | 'label';\n\nexport interface Slot {\n kind: SlotKind;\n address: string[];\n key?: string;\n source?: string;\n fallback: string;\n params: Record<string, unknown>;\n template: boolean;\n apply: (text: string) => void;\n}\n\nconst BOUNDS: Record<string, string> = { minLength: 'min', maxLength: 'max', min: 'min', max: 'max' };\n\nfunction ruleKey(field: FormField, rule: string): MessageKey {\n return (field.type === 'multiselect' && rule.endsWith('Length') ? rule.replace('Length', 'Items') : rule) as MessageKey;\n}\n\nfunction usedMessages(definition: FormDefinition): Set<string> {\n const keys = new Set([...Object.keys(definition.messages ?? {}), ...Object.keys(definition.i18n?.messages ?? {})]);\n for (const field of getAllFields(definition)) {\n const rules = (field.validation ?? {}) as Entry;\n for (const rule of SLOTS.validation) {\n if (hasRule(rules, rule) && rules[rule] !== '' && typeof rules[rule === 'required' ? rule : `${rule}Message`] !== 'string') keys.add(ruleKey(field, rule));\n }\n for (const key of typeMessageKeys(field)) keys.add(key);\n }\n return keys;\n}\n\nfunction nodeSlots(definition: FormDefinition, { kind, node, address, field }: TextNode): Slot[] {\n const keys = (node.i18n ?? {}) as Record<string, string>;\n return SLOTS[kind].flatMap((slot): Slot[] => {\n if (kind !== 'validation') {\n const source = node[slot];\n if (typeof source !== 'string') return [];\n return [{ kind: 'text', address: slotAddress(kind, address, slot), key: keys[slot], source, fallback: source, params: {}, template: true, apply: (text) => { node[slot] = text; } }];\n }\n if (!hasRule(node, slot) || !field) return [];\n const literalName = slot === 'required' ? slot : `${slot}Message`;\n const literal = typeof node[literalName] === 'string' ? node[literalName] as string : undefined;\n const params = BOUNDS[slot] ? { [BOUNDS[slot]]: node[slot] } : {};\n const message = ruleKey(field, slot);\n const fallback = literal ?? formatText(definition.messages?.[message] ?? DEFAULT_MESSAGES[message], params);\n return [{ kind: 'rule', address: [...address, slot], key: keys[slot], source: literal, fallback, params, template: literal !== undefined || !!keys[slot], apply: (text) => { node[literalName] = text; } }];\n });\n}\n\nfunction catalogSlots(definition: FormDefinition, name: 'messages' | 'labels', used: Set<string>): Slot[] {\n const defaults: Record<string, string> = name === 'messages' ? DEFAULT_MESSAGES : DEFAULT_LABELS;\n const keys = (definition.i18n?.[name] ?? {}) as Record<string, string>;\n return Object.keys(defaults).map((item) => {\n const source = (definition[name] as Record<string, string> | undefined)?.[item] ?? defaults[item];\n return {\n kind: name === 'messages' ? 'message' : 'label', address: [name, item], key: keys[item], source, fallback: source, params: {}, template: used.has(item),\n apply: (text: string) => { ((definition[name] ??= {}) as Record<string, string>)[item] = text; },\n };\n });\n}\n\nexport function definitionSlots(definition: FormDefinition): Slot[] {\n const steps = !!definition.steps?.length;\n const labels = new Set<LabelKey>(steps ? ['continue', 'back', 'stepOf', 'errorSummary'] : ['errorSummary']);\n return [\n ...textNodes(definition).flatMap((node) => nodeSlots(definition, node)),\n ...catalogSlots(definition, 'messages', usedMessages(definition)),\n ...catalogSlots(definition, 'labels', labels),\n ];\n}\n","import { parseDefinition } from '../definition-validation/check-definition';\nimport { FormDefinitionError, isError } from '../definition-validation/issues';\nimport { checkTranslations } from './check';\nimport type { FormDefinition, LabelFn, LabelSource } from '../types';\nimport { DEFAULT_MESSAGES, formatText, type MessageFn, type MessageSource } from '../validation/default-messages';\nimport { DEFAULT_LABELS } from './nodes';\nimport { lookup, type Overlay } from './overlay';\nimport { definitionSlots } from './slots';\n\nexport type TranslateFn = (key: string, params: Record<string, unknown>, defaultText: string) => string | undefined;\n\nexport interface OverlaySource {\n overlay: Overlay;\n lang?: string;\n}\n\nexport interface TranslateSource {\n translate: TranslateFn;\n prefix?: string | false;\n lang?: string;\n}\n\nexport type LocalizeSource = OverlaySource | TranslateSource;\n\nexport interface Localized {\n definition: FormDefinition;\n messages: MessageSource;\n labels: LabelSource;\n}\n\nexport function translationKey(prefix: string | false, explicit: string | undefined, address: string[]): string | undefined {\n if (explicit !== undefined) return explicit;\n if (prefix === false) return undefined;\n return (prefix ? [prefix, ...address] : address).join('.');\n}\n\nfunction fromOverlay(definition: FormDefinition, overlay: Overlay): Localized {\n for (const slot of definitionSlots(definition)) {\n const text = lookup(overlay, slot.address);\n if (text !== undefined) slot.apply(slot.kind === 'rule' ? formatText(text, slot.params) : text);\n }\n return { definition, messages: definition.messages ?? {}, labels: definition.labels ?? {} };\n}\n\nfunction fromTranslate(definition: FormDefinition, { translate, prefix = definition.id }: TranslateSource): Localized {\n const ask = (explicit: string | undefined, address: string[], params: Record<string, unknown>, fallback: string) => {\n const key = translationKey(prefix, explicit, address);\n let text: unknown;\n try {\n text = key === undefined ? undefined : translate(key, params, fallback);\n } catch {\n return undefined;\n }\n return typeof text === 'string' && text.trim() && text !== key ? formatText(text, params) : undefined;\n };\n const source = { messages: { ...definition.messages }, labels: { ...definition.labels } };\n const keys = definition.i18n ?? {};\n for (const slot of definitionSlots(definition)) {\n if (slot.kind !== 'text' && slot.kind !== 'rule') continue;\n const text = ask(slot.key, slot.address, slot.params, slot.fallback);\n if (text !== undefined && (slot.source !== undefined || text !== slot.fallback)) slot.apply(text);\n }\n const messages: MessageFn = (key, params) => (\n ask(keys.messages?.[key], ['messages', key], params, formatText(source.messages[key] ?? DEFAULT_MESSAGES[key], params))\n );\n const labels: LabelFn = (key, params) => (\n ask(keys.labels?.[key], ['labels', key], params, formatText(source.labels[key] ?? DEFAULT_LABELS[key], params))\n );\n return { definition, messages, labels };\n}\n\nexport function localize(input: FormDefinition, source: LocalizeSource): Localized {\n const errors = checkTranslations(parseDefinition(input)).filter(isError);\n if (errors.length) throw new FormDefinitionError(errors);\n const definition: FormDefinition = JSON.parse(JSON.stringify(input));\n if (source.lang) definition.lang = source.lang;\n return 'overlay' in source ? fromOverlay(definition, source.overlay) : fromTranslate(definition, source);\n}\n","import type { FormDefinition } from '../types';\nimport { translationKey } from './localize';\nimport { assign, placeholders, type Overlay } from './overlay';\nimport { definitionSlots, type Slot } from './slots';\n\nexport interface TextSlot {\n address: string;\n key?: string;\n text: string;\n params: string[];\n hash: string;\n}\n\nexport interface TextSlotOptions {\n prefix?: string | false;\n}\n\nexport function textHash(key: string | undefined, text: string): string {\n let hash = 0x811c9dc5;\n for (const char of `${key ?? ''}\\u0000${text}`) hash = Math.imul(hash ^ char.codePointAt(0)!, 0x01000193) >>> 0;\n return hash.toString(16).padStart(8, '0');\n}\n\nexport const templateSlots = (definition: FormDefinition): Slot[] => definitionSlots(definition).filter((slot) => slot.template);\n\nexport function describeSlot(slot: Slot, prefix: string | false): TextSlot {\n const key = translationKey(prefix, slot.key, slot.address);\n const text = slot.source ?? slot.fallback;\n const params = slot.kind === 'rule' ? Object.keys(slot.params) : placeholders(text);\n return { address: slot.address.join('.'), ...(key !== undefined && { key }), text, params, hash: textHash(key, text) };\n}\n\nexport function textSlots(definition: FormDefinition, { prefix = definition.id }: TextSlotOptions = {}): TextSlot[] {\n return templateSlots(definition).map((slot) => describeSlot(slot, prefix));\n}\n\nexport function translationTemplate(definition: FormDefinition): Overlay {\n const overlay: Overlay = {};\n for (const slot of templateSlots(definition)) assign(overlay, slot.address, slot.source ?? slot.fallback);\n return overlay;\n}\n","import type { FormDefinition } from '../types';\nimport { textNodes } from './walk';\nimport { addressKey, isEntry, leaves, lookup, placeholders } from './overlay';\nimport { definitionSlots, type Slot } from './slots';\nimport { describeSlot } from './template';\n\nexport interface TranslationMeta {\n prefix?: string | false;\n slots?: Record<string, { hash?: string }>;\n}\n\nexport interface TranslationIssues {\n missing: string[];\n unknown: string[];\n invalid: string[];\n placeholderMismatch: string[];\n unlabeled: string[];\n stale?: string[];\n}\n\nconst dotted = (path: string[]) => path.join('.');\n\nfunction mismatch(slot: Slot, text: string): boolean {\n const used = placeholders(text);\n if (slot.kind === 'rule') return used.some((name) => !Object.prototype.hasOwnProperty.call(slot.params, name));\n return used.join() !== placeholders(slot.source ?? slot.fallback).join();\n}\n\nexport function translationIssues(definition: FormDefinition, overlay: unknown, meta?: TranslationMeta): TranslationIssues {\n const slots = definitionSlots(definition);\n const known = new Set(slots.map((slot) => addressKey(slot.address)));\n const found = isEntry(overlay) ? leaves(overlay) : [{ path: [], value: null }];\n const translated = slots.filter((slot) => lookup(overlay, slot.address) !== undefined);\n const result: TranslationIssues = {\n missing: slots.filter((slot) => slot.template && lookup(overlay, slot.address) === undefined).map((slot) => dotted(slot.address)),\n unknown: found.filter(({ path, value }) => typeof value === 'string' && !known.has(addressKey(path))).map(({ path }) => dotted(path)),\n invalid: found.filter(({ value }) => typeof value !== 'string').map(({ path }) => dotted(path)),\n placeholderMismatch: translated.filter((slot) => mismatch(slot, lookup(overlay, slot.address)!)).map((slot) => dotted(slot.address)),\n unlabeled: textNodes(definition)\n .filter(({ kind, node, address }) => kind === 'field' && !(typeof node.label === 'string' && node.label.trim()) && lookup(overlay, [...address, 'label']) === undefined)\n .map(({ address }) => dotted([...address, 'label'])),\n };\n if (meta?.slots) {\n const baseline = meta.slots;\n const own = (address: string) => Object.prototype.hasOwnProperty.call(baseline, address);\n result.stale = translated.filter((slot) => slot.template).map((slot) => describeSlot(slot, meta.prefix ?? definition.id))\n .filter(({ address, hash }) => own(address) && baseline[address]?.hash !== undefined && baseline[address].hash !== hash)\n .map(({ address }) => address);\n }\n return result;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { F as FormField, a as FormStep, S as ShowCondition, b as FormAction } from './definition-
|
|
2
|
-
export { D as DefaultFieldType, c as
|
|
3
|
-
export { A as AfterStepChangeFn, B as BeforeStepChangeFn, a as BeforeSubmitFn, F as FormEngine, b as FormEngineOptions, S as StepChangeContext, c as StepValidateFn, d as SubmitFn, e as SubmitHandler, f as SubmitResult } from './runtime-
|
|
4
|
-
import {
|
|
5
|
-
export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError,
|
|
6
|
-
|
|
1
|
+
import { F as FormField, a as FormStep, S as ShowCondition, b as FormAction } from './definition-B4OIy_wH.js';
|
|
2
|
+
export { D as DefaultFieldType, c as FieldI18n, d as FieldOption, e as FieldType, f as FieldValidation, g as FormDefinition, h as FormI18n, L as LabelCatalog, i as LabelFn, j as LabelI18n, k as LabelKey, l as LabelSource, M as MessageCatalog, m as MessageKey, n as StepI18n, o as StepRoute, V as ValidationI18n } from './definition-B4OIy_wH.js';
|
|
3
|
+
export { A as AfterStepChangeFn, B as BeforeStepChangeFn, a as BeforeSubmitFn, F as FormEngine, b as FormEngineOptions, S as StepChangeContext, c as StepValidateFn, d as SubmitFn, e as SubmitHandler, f as SubmitResult } from './runtime-BN2PuKD7.js';
|
|
4
|
+
import { M as MessageSource } from './default-messages-yS4QtrYi.js';
|
|
5
|
+
export { D as DefinitionIssue, a as DefinitionIssueCode, F as FormDefinitionError, b as MessageFn, c as MessageParams, V as ValidationRule, g as getDefaultMessage } from './default-messages-yS4QtrYi.js';
|
|
6
|
+
import { V as ValidatorFn } from './validate-field-ND_UxoJU.js';
|
|
7
|
+
export { v as validateFieldValue } from './validate-field-ND_UxoJU.js';
|
|
8
|
+
export { C as CheckDefinitionOptions, c as checkDefinition, p as parseDefinition } from './check-definition-DuLExofm.js';
|
|
7
9
|
|
|
8
10
|
type FormAnalyticsEvent = {
|
|
9
11
|
type: 'step_viewed';
|
|
@@ -35,11 +37,8 @@ declare function validateDefinition(input: unknown): string[];
|
|
|
35
37
|
|
|
36
38
|
declare const FORMAT_VERSION = "1.0";
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
declare function
|
|
40
|
-
|
|
41
|
-
declare function validateStep(step: FormStep, values: Record<string, unknown>, validators?: Record<string, ValidatorFn>): Record<string, string>;
|
|
42
|
-
declare function validateFields(fields: FormField[], values: Record<string, unknown>, validators?: Record<string, ValidatorFn>): Record<string, string>;
|
|
40
|
+
declare function validateStep(step: FormStep, values: Record<string, unknown>, validators?: Record<string, ValidatorFn>, messages?: MessageSource): Record<string, string>;
|
|
41
|
+
declare function validateFields(fields: FormField[], values: Record<string, unknown>, validators?: Record<string, ValidatorFn>, messages?: MessageSource): Record<string, string>;
|
|
43
42
|
|
|
44
43
|
declare function evaluateCondition(condition: ShowCondition, values: Record<string, unknown>): boolean;
|
|
45
44
|
|
|
@@ -54,4 +53,4 @@ declare class FormLifecycleError extends Error {
|
|
|
54
53
|
constructor(phase: 'afterStepChange' | 'afterSubmit', cause: unknown);
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
export { FORMAT_VERSION, FormAction, type FormAnalyticsEvent, FormField, FormLifecycleError, FormStep,
|
|
56
|
+
export { FORMAT_VERSION, FormAction, type FormAnalyticsEvent, FormField, FormLifecycleError, FormStep, MessageSource, ShowCondition, ValidatorFn, evaluateCondition, isActionDisabled, isVisible, validateDefinition, validateFields, validateStep };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{
|
|
1
|
+
export{c as FormEngine,a as validateDefinition}from'./chunk-PBTYUSZR.js';export{a as FormLifecycleError,c as isActionDisabled,b as isVisible,d as validateFieldValue,f as validateFields,e as validateStep}from'./chunk-76YV4J3Q.js';export{h as FORMAT_VERSION,a as FormDefinitionError,j as checkDefinition,k as parseDefinition}from'./chunk-RN5GQHKN.js';export{l as evaluateCondition,e as getDefaultMessage}from'./chunk-35SAVPYL.js';//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/internal.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export { j as CloudCallbacks, k as CloudControllerOptions, l as CloudState, m as cloudStateFor, n as createCloudController, o as initialCloudState } from './controller-
|
|
2
|
-
import { F as FormEngine } from './runtime-
|
|
3
|
-
import './definition-
|
|
4
|
-
import './
|
|
1
|
+
export { j as CloudCallbacks, k as CloudControllerOptions, l as CloudState, m as cloudStateFor, n as createCloudController, o as initialCloudState } from './controller-Ds_kbXSU.js';
|
|
2
|
+
import { F as FormEngine } from './runtime-BN2PuKD7.js';
|
|
3
|
+
import { k as LabelKey, l as LabelSource } from './definition-B4OIy_wH.js';
|
|
4
|
+
import './default-messages-yS4QtrYi.js';
|
|
5
|
+
import './validate-field-ND_UxoJU.js';
|
|
5
6
|
|
|
6
7
|
interface Searchable {
|
|
7
8
|
querySelector(selector: string): unknown;
|
|
@@ -14,12 +15,29 @@ interface Focusable extends Searchable {
|
|
|
14
15
|
block?: 'center' | 'nearest';
|
|
15
16
|
}): void;
|
|
16
17
|
matches(selector: string): boolean;
|
|
18
|
+
closest?(selector: string): unknown;
|
|
19
|
+
}
|
|
20
|
+
interface FormRoot extends Focusable {
|
|
21
|
+
ownerDocument: {
|
|
22
|
+
activeElement: unknown;
|
|
23
|
+
body: unknown;
|
|
24
|
+
};
|
|
25
|
+
contains(node: never): boolean;
|
|
17
26
|
}
|
|
18
27
|
declare function focusProblem(root: Searchable | null, notice?: Focusable | null): void;
|
|
28
|
+
declare function canMoveFocus(form: FormRoot | null | undefined): boolean;
|
|
29
|
+
declare function restoreFocus(form: FormRoot | null | undefined, target: (Focusable & {
|
|
30
|
+
isConnected: boolean;
|
|
31
|
+
}) | null): void;
|
|
32
|
+
declare function focusField(form: FormRoot | null | undefined, formId: string, key: string | null): void;
|
|
33
|
+
|
|
34
|
+
declare function fieldDomId(formId: string | undefined, key: string): string;
|
|
19
35
|
|
|
20
36
|
declare function shouldApplyExternalErrors(engine: FormEngine, previous: Record<string, string> | undefined, next: Record<string, string>): boolean;
|
|
21
37
|
|
|
38
|
+
declare function labelFor(key: LabelKey, params: Record<string, unknown>, ...sources: (LabelSource | undefined)[]): string;
|
|
39
|
+
|
|
40
|
+
declare function conditionValues(engine: FormEngine): Record<string, unknown>;
|
|
22
41
|
declare function autoAdvance(engine: FormEngine): Promise<boolean>;
|
|
23
|
-
declare function fieldDomId(formId: string | undefined, key: string): string;
|
|
24
42
|
|
|
25
|
-
export { autoAdvance, fieldDomId, focusProblem, shouldApplyExternalErrors };
|
|
43
|
+
export { autoAdvance, canMoveFocus, conditionValues, fieldDomId, focusField, focusProblem, labelFor, restoreFocus, shouldApplyExternalErrors };
|