@formhaus/core 0.13.1 → 0.13.2

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.
@@ -0,0 +1,2 @@
1
+ var o={form:["title","description"],step:["title","description"],field:["label","placeholder","helperText"],option:["label"],action:["label"],validation:["required","minLength","maxLength","min","max","pattern","matchField"]};function r(n,t){let e=n[t];return t==="required"?!!e:e!==void 0&&e!==false&&e!==""}var i=Object.freeze({continue:"Continue",back:"Back",stepOf:"Step {current} of {total}",errorSummary:"Check these answers"});export{o as a,r as b,i as c};//# sourceMappingURL=chunk-4UCHIIVE.js.map
2
+ //# sourceMappingURL=chunk-4UCHIIVE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/nodes.ts"],"names":["SLOTS","hasRule","node","slot","value","DEFAULT_LABELS"],"mappings":"AAIO,IAAMA,CAAAA,CAA6C,CACxD,IAAA,CAAM,CAAC,QAAS,aAAa,CAAA,CAC7B,IAAA,CAAM,CAAC,QAAS,aAAa,CAAA,CAC7B,KAAA,CAAO,CAAC,QAAS,aAAA,CAAe,YAAY,CAAA,CAC5C,MAAA,CAAQ,CAAC,OAAO,CAAA,CAChB,MAAA,CAAQ,CAAC,OAAO,CAAA,CAChB,UAAA,CAAY,CAAC,WAAY,WAAA,CAAa,WAAA,CAAa,KAAA,CAAO,KAAA,CAAO,UAAW,YAAY,CAC1F,EAIO,SAASC,CAAAA,CAAQC,CAAAA,CAAaC,CAAAA,CAAuB,CAC1D,IAAMC,CAAAA,CAAQF,CAAAA,CAAKC,CAAI,CAAA,CACvB,OAAOA,CAAAA,GAAS,UAAA,CAAa,CAAC,CAACC,EAAQA,CAAAA,GAAU,MAAA,EAAaA,CAAAA,GAAU,KAAA,EAASA,IAAU,EAC7F,CAEO,IAAMC,CAAAA,CAAqD,OAAO,MAAA,CAAO,CAC9E,QAAA,CAAU,UAAA,CACV,KAAM,MAAA,CACN,MAAA,CAAQ,2BAAA,CACR,YAAA,CAAc,qBAChB,CAAC","file":"chunk-4UCHIIVE.js","sourcesContent":["import type { LabelKey } from '../types';\n\nexport type NodeKind = 'form' | 'step' | 'field' | 'option' | 'action' | 'validation';\n\nexport const SLOTS: Record<NodeKind, readonly string[]> = {\n form: ['title', 'description'],\n step: ['title', 'description'],\n field: ['label', 'placeholder', 'helperText'],\n option: ['label'],\n action: ['label'],\n validation: ['required', 'minLength', 'maxLength', 'min', 'max', 'pattern', 'matchField'],\n};\n\nexport type Entry = Record<string, unknown>;\n\nexport function hasRule(node: Entry, slot: string): boolean {\n const value = node[slot];\n return slot === 'required' ? !!value : value !== undefined && value !== false && value !== '';\n}\n\nexport const DEFAULT_LABELS: Readonly<Record<LabelKey, string>> = Object.freeze({\n continue: 'Continue',\n back: 'Back',\n stepOf: 'Step {current} of {total}',\n errorSummary: 'Check these answers',\n});\n"]}
@@ -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.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
+ 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.2";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-J5TQSLO3.js.map
3
+ //# sourceMappingURL=chunk-J5TQSLO3.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-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"]}
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-J5TQSLO3.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.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-YTUVSJUF.js';//# sourceMappingURL=cloud.js.map
1
+ export{d as CloudError,i as createSubmitter,h as fetchDefinition,g as fetchForm,k as sessionDraftStore}from'./chunk-J5TQSLO3.js';//# sourceMappingURL=cloud.js.map
2
2
  //# sourceMappingURL=cloud.js.map
package/dist/i18n.js CHANGED
@@ -1,2 +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
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-4UCHIIVE.js';export{c as defaultLabels}from'./chunk-4UCHIIVE.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)&&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
2
  //# sourceMappingURL=i18n.js.map
package/dist/i18n.js.map CHANGED
@@ -1 +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"]}
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) && 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"]}
@@ -1,6 +1,6 @@
1
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 { g as FormDefinition, k as LabelKey, l as LabelSource } from './definition-B4OIy_wH.js';
2
3
  import { F as FormEngine } from './runtime-BN2PuKD7.js';
3
- import { k as LabelKey, l as LabelSource } from './definition-B4OIy_wH.js';
4
4
  import './default-messages-yS4QtrYi.js';
5
5
  import './validate-field-ND_UxoJU.js';
6
6
 
@@ -29,9 +29,9 @@ declare function canMoveFocus(form: FormRoot | null | undefined): boolean;
29
29
  declare function restoreFocus(form: FormRoot | null | undefined, target: (Focusable & {
30
30
  isConnected: boolean;
31
31
  }) | null): void;
32
- declare function focusField(form: FormRoot | null | undefined, formId: string, key: string | null): void;
32
+ declare function focusField(form: FormRoot | null | undefined, formId: string, key: string | null, definition?: FormDefinition): void;
33
33
 
34
- declare function fieldDomId(formId: string | undefined, key: string): string;
34
+ declare function fieldDomId(formId: string | undefined, key: string, definition?: FormDefinition): string;
35
35
 
36
36
  declare function shouldApplyExternalErrors(engine: FormEngine, previous: Record<string, string> | undefined, next: Record<string, string>): boolean;
37
37
 
package/dist/internal.js CHANGED
@@ -1,2 +1,2 @@
1
- import {f,i,j as j$1,g,d,e,a,c as c$2,b as b$1}from'./chunk-YTUVSJUF.js';import {u}from'./chunk-76YV4J3Q.js';import {c as c$1}from'./chunk-PZEBYRGE.js';import {c}from'./chunk-35SAVPYL.js';var K={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file"};function b(e){return [...e.fields??[],...(e.steps??[]).flatMap(n=>n.fields)]}function C(e){return K[e.type]??"text"}function U(e,n){if(!Array.isArray(e.options))return true;let o=new Set(e.options.map(i=>String(i.value)));return (Array.isArray(n)?n:[n]).every(i=>o.has(String(i)))}function z(e,n,o){if(e&&C(e)!==C(n))return false;switch(C(n)){case "list":return Array.isArray(o);case "flag":return typeof o=="boolean";case "number":return typeof o=="number";case "text":return typeof o=="string";default:return e!==void 0}}function _(e,n,o){let i=new Map(o?b(o).map(t=>[t.key,t]):[]),l={};for(let t of b(n)){let s=e[t.key];s!=null&&z(i.get(t.key),t,s)&&U(t,s)&&(l[t.key]=s);}return l}function L(e,n){let o=new Set(b(e).map(t=>t.key)),i={},l=new Set;for(let[t,s]of Object.entries(n))o.has(t)?i[t]=s:l.add(s);return {fields:i,other:[...l]}}function I(e,n,o,i){let l={};for(let t of b(e)){let s=n[t.key]!==void 0&&n[t.key]!==null&&n[t.key]!=="";s&&!(t.key in o)?l[t.key]=b$1:i[t.key]&&(!s||t.key in o)&&(l[t.key]=i[t.key]);}return l}var y={definition:null,version:null,settings:{},loadError:null,errors:{},notice:null,initialValues:null,revision:0,attempt:0,done:false};function N(e){return e?{...y,definition:e.definition,version:e.version??null,settings:f(e.settings)}:y}function q(e,n=[]){return {tone:"error",message:e.message,action:e.action,details:n}}function H(e$1,n){let o=new AbortController,i$1,l=r=>{i$1??(i$1=r.renderToken);let c=i$1===r.renderToken?void 0:i$1;return i({...e$1,version:r.version,renderToken:r.renderToken,firstRenderToken:c})},t=i(e$1),s=e$1.initialForm,f$1=()=>!o.signal.aborted,u=y,m=r=>{u={...u,...r},n.onChange(u);},g$1=r=>m({...r,attempt:u.attempt+1});function E(r){t=l(r);let c=e$1.draftStore?.load(e$1.id,r.version)??null;m({...N(r),revision:u.revision,attempt:u.attempt,initialValues:c});}async function B(r,c){let a$1=u.definition;try{let d$1=await g(e$1,o.signal,r.version);if(!f$1())return;if(d$1.version===void 0||d$1.version<(r.version??0))throw new d(409,"form_updated");let p=a$1?_(c,d$1.definition,a$1):{};t=l(d$1),g$1({definition:d$1.definition,version:d$1.version,settings:f(d$1.settings),initialValues:p,revision:u.revision+1,errors:I(d$1.definition,c,p,r.errors??{}),notice:{tone:"info",message:a,action:null,details:[]}});}catch{f$1()&&g$1({notice:{tone:"error",...c$2(409,"form_updated"),details:[]}});}}async function G(r,c){let a=r instanceof d?r:e(r);if(a.code==="form_updated"&&a.version!==void 0)return B(a,c);if(a.status!==422)return g$1({notice:q(a)});let d$1=a.errors??{},p=u.definition?L(u.definition,d$1):{fields:d$1,other:[]};g$1({errors:p.fields,notice:p.other.length>0?q(a,p.other):null});}return {start(){if(u.loadError&&m({loadError:null}),s){E(s),s=void 0;return}g(e$1,o.signal).then(r=>{f$1()&&E(r);},r=>{f$1()&&(m({loadError:r}),n.onError?.(r));});},dispose(){o.abort();},saveDraft(r){u.definition&&!u.done&&e$1.draftStore?.save(e$1.id,u.version??void 0,j$1(u.definition,r));},again(){m({done:false,errors:{},notice:null,initialValues:null,revision:u.revision+1});},async submit(r,c){u.notice&&m({notice:null});try{let a=await t(r,c);if(!f$1())return;e$1.draftStore?.clear(e$1.id),m({done:!0}),n.onSuccess?.(a);}catch(a){throw f$1()&&(await G(a,r),n.onError?.(a)),a}}}}var M=e=>e.replace(/[^A-Za-z0-9_-]/g,"-");function h(e,n){return `${e?M(e):"fh"}-${M(n)}`}var $='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function w(e){return e?.matches($)?e:e?.querySelector($)}function j(e,n){n.scrollIntoView?.({block:"center"}),e.focus({preventScroll:true});}function W(e,n){if(n)return j(n,n);let o=e?.querySelector('[aria-invalid="true"]');o&&j(w(o)??o,o);}function Z(e){let n=e?.ownerDocument.activeElement;return !n||!e?.contains(n)?false:!n.isContentEditable&&!(n.matches("input, select, textarea")&&!["checkbox","radio"].includes(n.type))}function J(e,n){let o=e?.ownerDocument;o&&o.activeElement===o.body&&n?.isConnected&&n.focus();}function Q(e,n,o){let i=e?.querySelector(".fh-form__fields"),l=o&&h(n,o),t=l?i?.querySelector(`[id="${l}"], [id="${l}-error"]`):null;if(l&&!t)return;let s=t?.closest?.(".fh-field")??t??i?.querySelector('[aria-invalid="true"]');(s?.querySelector("input:checked:not(:disabled)")??w(s)??w(i)??e)?.focus();}function X(e,n){let o=Object.keys(n);return o.length===Object.keys(e).length&&o.every(i=>e[i]===n[i])}function Y(e,n){return Object.entries(n).every(([o,i])=>e.errors[o]===i||e.topLevelErrors.includes(i))}function ee(e,n,o){return !n||!X(n,o)||!Y(e,o)}function ne(e,n,...o){return c(c$1,e,n,o)}function ke(e){let n=e;return n.visibility.conditionValues(n.values)}function Se(e){return u(e,"next","autoAdvance")}export{Se as autoAdvance,Z as canMoveFocus,N as cloudStateFor,ke as conditionValues,H as createCloudController,h as fieldDomId,Q as focusField,W as focusProblem,y as initialCloudState,ne as labelFor,J as restoreFocus,ee as shouldApplyExternalErrors};//# sourceMappingURL=internal.js.map
1
+ import {f,i,j as j$1,g as g$1,d,e,a,c as c$2,b as b$1}from'./chunk-J5TQSLO3.js';import {u}from'./chunk-76YV4J3Q.js';import {c as c$1}from'./chunk-4UCHIIVE.js';import {c,g as g$2}from'./chunk-35SAVPYL.js';var W={multiselect:"list",checkbox:"flag",switch:"flag",number:"number",file:"file"};function b(e){return [...e.fields??[],...(e.steps??[]).flatMap(n=>n.fields)]}function w(e){return W[e.type]??"text"}function H(e,n){if(!Array.isArray(e.options))return true;let t=new Set(e.options.map(s=>String(s.value)));return (Array.isArray(n)?n:[n]).every(s=>t.has(String(s)))}function z(e,n,t){if(e&&w(e)!==w(n))return false;switch(w(n)){case "list":return Array.isArray(t);case "flag":return typeof t=="boolean";case "number":return typeof t=="number";case "text":return typeof t=="string";default:return e!==void 0}}function _(e,n,t){let s=new Map(t?b(t).map(o=>[o.key,o]):[]),i={};for(let o of b(n)){let l=e[o.key];l!=null&&z(s.get(o.key),o,l)&&H(o,l)&&(i[o.key]=l);}return i}function I(e,n){let t=new Set(b(e).map(o=>o.key)),s={},i=new Set;for(let[o,l]of Object.entries(n))t.has(o)?s[o]=l:i.add(l);return {fields:s,other:[...i]}}function q(e,n,t,s){let i={};for(let o of b(e)){let l=n[o.key]!==void 0&&n[o.key]!==null&&n[o.key]!=="";l&&!(o.key in t)?i[o.key]=b$1:s[o.key]&&(!l||o.key in t)&&(i[o.key]=s[o.key]);}return i}var F={definition:null,version:null,settings:{},loadError:null,errors:{},notice:null,initialValues:null,revision:0,attempt:0,done:false};function $(e){return e?{...F,definition:e.definition,version:e.version??null,settings:f(e.settings)}:F}function N(e,n=[]){return {tone:"error",message:e.message,action:e.action,details:n}}function J(e$1,n){let t=new AbortController,s,i$1=r=>{s??(s=r.renderToken);let c=s===r.renderToken?void 0:s;return i({...e$1,version:r.version,renderToken:r.renderToken,firstRenderToken:c})},o=i(e$1),l=e$1.initialForm,f$1=()=>!t.signal.aborted,u=F,m=r=>{u={...u,...r},n.onChange(u);},y=r=>m({...r,attempt:u.attempt+1});function x(r){o=i$1(r);let c=e$1.draftStore?.load(e$1.id,r.version)??null;m({...$(r),revision:u.revision,attempt:u.attempt,initialValues:c});}async function K(r,c){let a$1=u.definition;try{let d$1=await g$1(e$1,t.signal,r.version);if(!f$1())return;if(d$1.version===void 0||d$1.version<(r.version??0))throw new d(409,"form_updated");let p=a$1?_(c,d$1.definition,a$1):{};o=i$1(d$1),y({definition:d$1.definition,version:d$1.version,settings:f(d$1.settings),initialValues:p,revision:u.revision+1,errors:q(d$1.definition,c,p,r.errors??{}),notice:{tone:"info",message:a,action:null,details:[]}});}catch{f$1()&&y({notice:{tone:"error",...c$2(409,"form_updated"),details:[]}});}}async function U(r,c){let a=r instanceof d?r:e(r);if(a.code==="form_updated"&&a.version!==void 0)return K(a,c);if(a.status!==422)return y({notice:N(a)});let d$1=a.errors??{},p=u.definition?I(u.definition,d$1):{fields:d$1,other:[]};y({errors:p.fields,notice:p.other.length>0?N(a,p.other):null});}return {start(){if(u.loadError&&m({loadError:null}),l){x(l),l=void 0;return}g$1(e$1,t.signal).then(r=>{f$1()&&x(r);},r=>{f$1()&&(m({loadError:r}),n.onError?.(r));});},dispose(){t.abort();},saveDraft(r){u.definition&&!u.done&&e$1.draftStore?.save(e$1.id,u.version??void 0,j$1(u.definition,r));},again(){m({done:false,errors:{},notice:null,initialValues:null,revision:u.revision+1});},async submit(r,c){u.notice&&m({notice:null});try{let a=await o(r,c);if(!f$1())return;e$1.draftStore?.clear(e$1.id),m({done:!0}),n.onSuccess?.(a);}catch(a){throw f$1()&&(await U(a,r),n.onError?.(a)),a}}}}var g=e=>e.replace(/[^\w-]/g,"-"),j=new WeakMap;function Q(e){let n=2166136261;for(let t of e)n=Math.imul(n^t.codePointAt(0),16777619)>>>0;return n.toString(36)}function X(e){let n=j.get(e);if(n)return n;n=new Map;let t=new Set,s=[...new Set(g$2(e).map(i=>i.key))].sort((i,o)=>+(g(o)===o)-+(g(i)===i)||(i<o?-1:1));for(let i of s){let o=g(i);for(let l=i;t.has(o);l=o)o=`${g(i)}-${Q(l)}`;t.add(o),n.set(i,o);}return j.set(e,n),n}function C(e,n,t){return `${e?g(e):"fh"}-${(t&&X(t).get(n))??g(n)}`}var B='input:not([type="hidden"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';function E(e){return e?.matches(B)?e:e?.querySelector(B)}function G(e,n){n.scrollIntoView?.({block:"center"}),e.focus({preventScroll:true});}function Y(e,n){if(n)return G(n,n);let t=e?.querySelector('[aria-invalid="true"]');t&&G(E(t)??t,t);}function Z(e){let n=e?.ownerDocument.activeElement;return !n||!e?.contains(n)?false:!n.isContentEditable&&!(n.matches("input, select, textarea")&&!["checkbox","radio"].includes(n.type))}function ee(e,n){let t=e?.ownerDocument;t&&t.activeElement===t.body&&n?.isConnected&&n.focus();}function ne(e,n,t,s){let i=e?.querySelector(".fh-form__fields"),o=t&&C(n,t,s),l=o?i?.querySelector(`[id="${o}"], [id="${o}-error"]`):null;if(o&&!l)return;let f=l?.closest?.(".fh-field")??l??i?.querySelector('[aria-invalid="true"]');(f?.querySelector("input:checked:not(:disabled)")??E(f)??E(i)??e)?.focus();}function te(e,n){let t=Object.keys(n);return t.length===Object.keys(e).length&&t.every(s=>e[s]===n[s])}function oe(e,n){return Object.entries(n).every(([t,s])=>e.errors[t]===s||e.topLevelErrors.includes(s))}function re(e,n,t){return !n||!te(n,t)||!oe(e,t)}function ie(e,n,...t){return c(c$1,e,n,t)}function Ce(e){let n=e;return n.visibility.conditionValues(n.values)}function Ee(e){return u(e,"next","autoAdvance")}export{Ee as autoAdvance,Z as canMoveFocus,$ as cloudStateFor,Ce as conditionValues,J as createCloudController,C as fieldDomId,ne as focusField,Y as focusProblem,F as initialCloudState,ie as labelFor,ee as restoreFocus,re as shouldApplyExternalErrors};//# sourceMappingURL=internal.js.map
2
2
  //# sourceMappingURL=internal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cloud/carry.ts","../src/cloud/controller.ts","../src/internal/ids.ts","../src/internal/focus.ts","../src/engine/external-errors.ts","../src/i18n/labels.ts","../src/internal/index.ts"],"names":["SHAPES","fieldsOf","definition","step","shapeOf","field","allowed","value","options","option","item","fits","previous","next","carryValues","values","before","kept","splitErrors","errors","known","fields","other","key","message","updatedErrors","sent","rejected","answered","ANSWER_AGAIN","initialCloudState","cloudStateFor","form","parseSettings","errorNotice","error","details","createCloudController","callbacks","controller","firstRenderToken","submitterFor","first","createSubmitter","submitter","initial","alive","state","update","patch","report","show","draft","refresh","fetchForm","CloudError","FORM_UPDATED_MESSAGE","failureFor","fail","cloud","networkError","split","draftValues","skippedSteps","submission","clean","fieldDomId","formId","CONTROLS","firstControl","root","reveal","target","scrollTo","focusProblem","notice","invalid","canMoveFocus","active","restoreFocus","document","focusField","id","chosen","sameErrors","keys","holdsErrors","engine","shouldApplyExternalErrors","labelFor","params","sources","resolveText","DEFAULT_LABELS","conditionValues","internals","autoAdvance","changeStep"],"mappings":"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","file":"internal.js","sourcesContent":["import type { FormDefinition, FormField } from '../types';\nimport { ANSWER_AGAIN } from './failures';\n\nconst SHAPES: Record<string, string> = {\n multiselect: 'list',\n checkbox: 'flag',\n switch: 'flag',\n number: 'number',\n file: 'file',\n};\n\nfunction fieldsOf(definition: FormDefinition): FormField[] {\n return [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n}\n\nfunction shapeOf(field: FormField): string {\n return SHAPES[field.type] ?? 'text';\n}\n\nfunction allowed(field: FormField, value: unknown): boolean {\n if (!Array.isArray(field.options)) return true;\n const options = new Set(field.options.map((option) => String(option.value)));\n return (Array.isArray(value) ? value : [value]).every((item) => options.has(String(item)));\n}\n\nfunction fits(previous: FormField | undefined, next: FormField, value: unknown): boolean {\n if (previous && shapeOf(previous) !== shapeOf(next)) return false;\n switch (shapeOf(next)) {\n case 'list': return Array.isArray(value);\n case 'flag': return typeof value === 'boolean';\n case 'number': return typeof value === 'number';\n case 'text': return typeof value === 'string';\n default: return previous !== undefined;\n }\n}\n\nexport function carryValues(\n values: Record<string, unknown>,\n next: FormDefinition,\n previous?: FormDefinition,\n): Record<string, unknown> {\n const before = new Map(previous ? fieldsOf(previous).map((field) => [field.key, field]) : []);\n const kept: Record<string, unknown> = {};\n for (const field of fieldsOf(next)) {\n const value = values[field.key];\n if (value === undefined || value === null) continue;\n if (fits(before.get(field.key), field, value) && allowed(field, value)) kept[field.key] = value;\n }\n return kept;\n}\n\nexport function splitErrors(definition: FormDefinition, errors: Record<string, string>) {\n const known = new Set(fieldsOf(definition).map((field) => field.key));\n const fields: Record<string, string> = {};\n const other = new Set<string>();\n for (const [key, message] of Object.entries(errors)) {\n if (known.has(key)) fields[key] = message;\n else other.add(message);\n }\n return { fields, other: [...other] };\n}\n\nexport function updatedErrors(\n next: FormDefinition,\n sent: Record<string, unknown>,\n kept: Record<string, unknown>,\n rejected: Record<string, string>,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const field of fieldsOf(next)) {\n const answered = sent[field.key] !== undefined && sent[field.key] !== null && sent[field.key] !== '';\n if (answered && !(field.key in kept)) errors[field.key] = ANSWER_AGAIN;\n else if (rejected[field.key] && (!answered || field.key in kept)) errors[field.key] = rejected[field.key];\n }\n return errors;\n}\n","import type { FormDefinition } from '../types';\nimport { carryValues, splitErrors, updatedErrors } from './carry';\nimport { createSubmitter, fetchForm, type CloudClientOptions, type CloudSubmission } from './client';\nimport { draftValues, type DraftStore } from './draft';\nimport { parseSettings, type CloudSettings, type PublishedForm } from './envelope';\nimport { CloudError, networkError } from './error';\nimport { FORM_UPDATED_MESSAGE, failureFor, type CloudAction } from './failures';\n\nexport interface CloudNotice {\n tone: 'error' | 'info';\n message: string;\n action: CloudAction;\n details: string[];\n}\n\nexport interface CloudState {\n definition: FormDefinition | null;\n version: number | null;\n settings: CloudSettings;\n loadError: Error | null;\n errors: Record<string, string>;\n notice: CloudNotice | null;\n initialValues: Record<string, unknown> | null;\n revision: number;\n attempt: number;\n done: boolean;\n}\n\nexport interface CloudCallbacks {\n onChange(state: CloudState): void;\n onSuccess?(submission: CloudSubmission): void;\n onError?(error: unknown): void;\n}\n\nexport interface CloudControllerOptions extends CloudClientOptions {\n initialForm?: PublishedForm;\n extraBody?: () => Record<string, unknown>;\n draftStore?: DraftStore;\n}\n\nexport const initialCloudState: CloudState = {\n definition: null, version: null, settings: {}, loadError: null, errors: {}, notice: null,\n initialValues: null, revision: 0, attempt: 0, done: false,\n};\n\nexport function cloudStateFor(form?: PublishedForm): CloudState {\n if (!form) return initialCloudState;\n return { ...initialCloudState, definition: form.definition, version: form.version ?? null, settings: parseSettings(form.settings) };\n}\n\nfunction errorNotice(error: CloudError, details: string[] = []): CloudNotice {\n return { tone: 'error', message: error.message, action: error.action, details };\n}\n\nexport function createCloudController(options: CloudControllerOptions, callbacks: CloudCallbacks) {\n const controller = new AbortController();\n let firstRenderToken: string | undefined;\n const submitterFor = (form: PublishedForm) => {\n firstRenderToken ??= form.renderToken;\n const first = firstRenderToken === form.renderToken ? undefined : firstRenderToken;\n return createSubmitter({ ...options, version: form.version, renderToken: form.renderToken, firstRenderToken: first });\n };\n let submitter = createSubmitter(options);\n let initial = options.initialForm;\n const alive = () => !controller.signal.aborted;\n let state = initialCloudState;\n const update = (patch: Partial<CloudState>) => {\n state = { ...state, ...patch };\n callbacks.onChange(state);\n };\n const report = (patch: Partial<CloudState>) => update({ ...patch, attempt: state.attempt + 1 });\n\n function show(form: PublishedForm) {\n submitter = submitterFor(form);\n const draft = options.draftStore?.load(options.id, form.version) ?? null;\n update({ ...cloudStateFor(form), revision: state.revision, attempt: state.attempt, initialValues: draft });\n }\n\n async function refresh(error: CloudError, sent: Record<string, unknown>) {\n const before = state.definition;\n try {\n const next = await fetchForm(options, controller.signal, error.version);\n if (!alive()) return;\n if (next.version === undefined || next.version < (error.version ?? 0)) throw new CloudError(409, 'form_updated');\n const kept = before ? carryValues(sent, next.definition, before) : {};\n submitter = submitterFor(next);\n report({\n definition: next.definition,\n version: next.version,\n settings: parseSettings(next.settings),\n initialValues: kept,\n revision: state.revision + 1,\n errors: updatedErrors(next.definition, sent, kept, error.errors ?? {}),\n notice: { tone: 'info', message: FORM_UPDATED_MESSAGE, action: null, details: [] },\n });\n } catch {\n if (alive()) report({ notice: { tone: 'error', ...failureFor(409, 'form_updated'), details: [] } });\n }\n }\n\n async function fail(error: unknown, values: Record<string, unknown>) {\n const cloud = error instanceof CloudError ? error : networkError(error);\n if (cloud.code === 'form_updated' && cloud.version !== undefined) return refresh(cloud, values);\n if (cloud.status !== 422) return report({ notice: errorNotice(cloud) });\n const errors = cloud.errors ?? {};\n const split = state.definition ? splitErrors(state.definition, errors) : { fields: errors, other: [] };\n report({ errors: split.fields, notice: split.other.length > 0 ? errorNotice(cloud, split.other) : null });\n }\n\n return {\n start() {\n if (state.loadError) update({ loadError: null });\n if (initial) {\n show(initial);\n initial = undefined;\n return;\n }\n fetchForm(options, controller.signal).then(\n (form) => { if (alive()) show(form); },\n (error: Error) => {\n if (!alive()) return;\n update({ loadError: error });\n callbacks.onError?.(error);\n },\n );\n },\n dispose() {\n controller.abort();\n },\n saveDraft(values: Record<string, unknown>) {\n if (state.definition && !state.done) options.draftStore?.save(options.id, state.version ?? undefined, draftValues(state.definition, values));\n },\n again() {\n update({ done: false, errors: {}, notice: null, initialValues: null, revision: state.revision + 1 });\n },\n async submit(values: Record<string, unknown>, skippedSteps?: string[]) {\n if (state.notice) update({ notice: null });\n try {\n const submission = await submitter(values, skippedSteps);\n if (!alive()) return;\n options.draftStore?.clear(options.id);\n update({ done: true });\n callbacks.onSuccess?.(submission);\n } catch (error) {\n if (!alive()) throw error;\n await fail(error, values);\n callbacks.onError?.(error);\n throw error;\n }\n },\n };\n}\n","const clean = (value: string) => value.replace(/[^A-Za-z0-9_-]/g, '-');\n\nexport function fieldDomId(formId: string | undefined, key: string): string {\n return `${formId ? clean(formId) : 'fh'}-${clean(key)}`;\n}\n","import { fieldDomId } from './ids';\n\ninterface Searchable {\n querySelector(selector: string): unknown;\n}\n\ninterface Focusable extends Searchable {\n focus(options?: { preventScroll?: boolean }): void;\n scrollIntoView?(options?: { block?: 'center' | 'nearest' }): void;\n matches(selector: string): boolean;\n closest?(selector: string): unknown;\n}\n\ninterface Active {\n matches(selector: string): boolean;\n isContentEditable?: boolean;\n type?: string;\n}\n\ninterface FormRoot extends Focusable {\n ownerDocument: { activeElement: unknown; body: unknown };\n contains(node: never): boolean;\n}\n\ntype Found = Focusable | null | undefined;\n\nconst CONTROLS = 'input:not([type=\"hidden\"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';\n\nfunction firstControl(root: Found): Found {\n return root?.matches(CONTROLS) ? root : root?.querySelector(CONTROLS) as Found;\n}\n\nfunction reveal(target: Focusable, scrollTo: Focusable): void {\n scrollTo.scrollIntoView?.({ block: 'center' });\n target.focus({ preventScroll: true });\n}\n\nexport function focusProblem(root: Searchable | null, notice?: Focusable | null): void {\n if (notice) return reveal(notice, notice);\n const invalid = root?.querySelector('[aria-invalid=\"true\"]') as Found;\n if (invalid) reveal(firstControl(invalid) ?? invalid, invalid);\n}\n\nexport function canMoveFocus(form: FormRoot | null | undefined): boolean {\n const active = form?.ownerDocument.activeElement as Active | null | undefined;\n if (!active || !form?.contains(active as never)) return false;\n return !active.isContentEditable && !(active.matches('input, select, textarea') && !['checkbox', 'radio'].includes(active.type!));\n}\n\nexport function restoreFocus(form: FormRoot | null | undefined, target: (Focusable & { isConnected: boolean }) | null): void {\n const document = form?.ownerDocument;\n if (document && document.activeElement === document.body && target?.isConnected) target.focus();\n}\n\nexport function focusField(form: FormRoot | null | undefined, formId: string, key: string | null): void {\n const fields = form?.querySelector('.fh-form__fields') as Found;\n const id = key && fieldDomId(formId, key);\n const chosen = id ? fields?.querySelector(`[id=\"${id}\"], [id=\"${id}-error\"]`) as Found : null;\n if (id && !chosen) return;\n const field = (chosen?.closest?.('.fh-field') ?? chosen ?? fields?.querySelector('[aria-invalid=\"true\"]')) as Found;\n const target = (field?.querySelector('input:checked:not(:disabled)') as Found) ?? firstControl(field) ?? firstControl(fields);\n (target ?? form)?.focus();\n}\n","import type { FormEngine } from './runtime';\n\nfunction sameErrors(previous: Record<string, string>, next: Record<string, string>): boolean {\n const keys = Object.keys(next);\n return keys.length === Object.keys(previous).length && keys.every((key) => previous[key] === next[key]);\n}\n\nfunction holdsErrors(engine: FormEngine, errors: Record<string, string>): boolean {\n return Object.entries(errors).every(([key, message]) => (\n engine.errors[key] === message || engine.topLevelErrors.includes(message)\n ));\n}\n\nexport function shouldApplyExternalErrors(\n engine: FormEngine,\n previous: Record<string, string> | undefined,\n next: Record<string, string>,\n): boolean {\n return !previous || !sameErrors(previous, next) || !holdsErrors(engine, next);\n}\n","import type { LabelKey, LabelSource } from '../types';\nimport { resolveText } from '../validation/default-messages';\nimport { DEFAULT_LABELS } from './nodes';\n\nexport function labelFor(key: LabelKey, params: Record<string, unknown>, ...sources: (LabelSource | undefined)[]): string {\n return resolveText(DEFAULT_LABELS, key, params, sources);\n}\n","export { cloudStateFor, createCloudController, initialCloudState, type CloudCallbacks, type CloudControllerOptions, type CloudState } from '../cloud/controller';\nexport { canMoveFocus, focusField, focusProblem, restoreFocus } from './focus';\nexport { fieldDomId } from './ids';\nexport { shouldApplyExternalErrors } from '../engine/external-errors';\nexport { labelFor } from '../i18n/labels';\nimport type { FormEngine } from '../engine';\nimport { changeStep } from '../engine/navigation';\nimport type { EngineInternals } from '../engine/runtime-internals';\n\nexport function conditionValues(engine: FormEngine): Record<string, unknown> {\n const internals = engine as unknown as EngineInternals;\n return internals.visibility.conditionValues(internals.values);\n}\n\nexport function autoAdvance(engine: FormEngine): Promise<boolean> {\n return changeStep(engine as unknown as EngineInternals, 'next', 'autoAdvance');\n}\n"]}
1
+ {"version":3,"sources":["../src/cloud/carry.ts","../src/cloud/controller.ts","../src/internal/ids.ts","../src/internal/focus.ts","../src/engine/external-errors.ts","../src/i18n/labels.ts","../src/internal/index.ts"],"names":["SHAPES","fieldsOf","definition","step","shapeOf","field","allowed","value","options","option","item","fits","previous","next","carryValues","values","before","kept","splitErrors","errors","known","fields","other","key","message","updatedErrors","sent","rejected","answered","ANSWER_AGAIN","initialCloudState","cloudStateFor","form","parseSettings","errorNotice","error","details","createCloudController","callbacks","controller","firstRenderToken","submitterFor","first","createSubmitter","submitter","initial","alive","state","update","patch","report","show","draft","refresh","fetchForm","CloudError","FORM_UPDATED_MESSAGE","failureFor","fail","cloud","networkError","split","draftValues","skippedSteps","submission","clean","cache","hash","text","char","idsOf","ids","taken","keys","getAllFields","a","b","id","seed","fieldDomId","formId","CONTROLS","firstControl","root","reveal","target","scrollTo","focusProblem","notice","invalid","canMoveFocus","active","restoreFocus","document","focusField","chosen","sameErrors","holdsErrors","engine","shouldApplyExternalErrors","labelFor","params","sources","resolveText","DEFAULT_LABELS","conditionValues","internals","autoAdvance","changeStep"],"mappings":"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","file":"internal.js","sourcesContent":["import type { FormDefinition, FormField } from '../types';\nimport { ANSWER_AGAIN } from './failures';\n\nconst SHAPES: Record<string, string> = {\n multiselect: 'list',\n checkbox: 'flag',\n switch: 'flag',\n number: 'number',\n file: 'file',\n};\n\nfunction fieldsOf(definition: FormDefinition): FormField[] {\n return [...(definition.fields ?? []), ...(definition.steps ?? []).flatMap((step) => step.fields)];\n}\n\nfunction shapeOf(field: FormField): string {\n return SHAPES[field.type] ?? 'text';\n}\n\nfunction allowed(field: FormField, value: unknown): boolean {\n if (!Array.isArray(field.options)) return true;\n const options = new Set(field.options.map((option) => String(option.value)));\n return (Array.isArray(value) ? value : [value]).every((item) => options.has(String(item)));\n}\n\nfunction fits(previous: FormField | undefined, next: FormField, value: unknown): boolean {\n if (previous && shapeOf(previous) !== shapeOf(next)) return false;\n switch (shapeOf(next)) {\n case 'list': return Array.isArray(value);\n case 'flag': return typeof value === 'boolean';\n case 'number': return typeof value === 'number';\n case 'text': return typeof value === 'string';\n default: return previous !== undefined;\n }\n}\n\nexport function carryValues(\n values: Record<string, unknown>,\n next: FormDefinition,\n previous?: FormDefinition,\n): Record<string, unknown> {\n const before = new Map(previous ? fieldsOf(previous).map((field) => [field.key, field]) : []);\n const kept: Record<string, unknown> = {};\n for (const field of fieldsOf(next)) {\n const value = values[field.key];\n if (value === undefined || value === null) continue;\n if (fits(before.get(field.key), field, value) && allowed(field, value)) kept[field.key] = value;\n }\n return kept;\n}\n\nexport function splitErrors(definition: FormDefinition, errors: Record<string, string>) {\n const known = new Set(fieldsOf(definition).map((field) => field.key));\n const fields: Record<string, string> = {};\n const other = new Set<string>();\n for (const [key, message] of Object.entries(errors)) {\n if (known.has(key)) fields[key] = message;\n else other.add(message);\n }\n return { fields, other: [...other] };\n}\n\nexport function updatedErrors(\n next: FormDefinition,\n sent: Record<string, unknown>,\n kept: Record<string, unknown>,\n rejected: Record<string, string>,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const field of fieldsOf(next)) {\n const answered = sent[field.key] !== undefined && sent[field.key] !== null && sent[field.key] !== '';\n if (answered && !(field.key in kept)) errors[field.key] = ANSWER_AGAIN;\n else if (rejected[field.key] && (!answered || field.key in kept)) errors[field.key] = rejected[field.key];\n }\n return errors;\n}\n","import type { FormDefinition } from '../types';\nimport { carryValues, splitErrors, updatedErrors } from './carry';\nimport { createSubmitter, fetchForm, type CloudClientOptions, type CloudSubmission } from './client';\nimport { draftValues, type DraftStore } from './draft';\nimport { parseSettings, type CloudSettings, type PublishedForm } from './envelope';\nimport { CloudError, networkError } from './error';\nimport { FORM_UPDATED_MESSAGE, failureFor, type CloudAction } from './failures';\n\nexport interface CloudNotice {\n tone: 'error' | 'info';\n message: string;\n action: CloudAction;\n details: string[];\n}\n\nexport interface CloudState {\n definition: FormDefinition | null;\n version: number | null;\n settings: CloudSettings;\n loadError: Error | null;\n errors: Record<string, string>;\n notice: CloudNotice | null;\n initialValues: Record<string, unknown> | null;\n revision: number;\n attempt: number;\n done: boolean;\n}\n\nexport interface CloudCallbacks {\n onChange(state: CloudState): void;\n onSuccess?(submission: CloudSubmission): void;\n onError?(error: unknown): void;\n}\n\nexport interface CloudControllerOptions extends CloudClientOptions {\n initialForm?: PublishedForm;\n extraBody?: () => Record<string, unknown>;\n draftStore?: DraftStore;\n}\n\nexport const initialCloudState: CloudState = {\n definition: null, version: null, settings: {}, loadError: null, errors: {}, notice: null,\n initialValues: null, revision: 0, attempt: 0, done: false,\n};\n\nexport function cloudStateFor(form?: PublishedForm): CloudState {\n if (!form) return initialCloudState;\n return { ...initialCloudState, definition: form.definition, version: form.version ?? null, settings: parseSettings(form.settings) };\n}\n\nfunction errorNotice(error: CloudError, details: string[] = []): CloudNotice {\n return { tone: 'error', message: error.message, action: error.action, details };\n}\n\nexport function createCloudController(options: CloudControllerOptions, callbacks: CloudCallbacks) {\n const controller = new AbortController();\n let firstRenderToken: string | undefined;\n const submitterFor = (form: PublishedForm) => {\n firstRenderToken ??= form.renderToken;\n const first = firstRenderToken === form.renderToken ? undefined : firstRenderToken;\n return createSubmitter({ ...options, version: form.version, renderToken: form.renderToken, firstRenderToken: first });\n };\n let submitter = createSubmitter(options);\n let initial = options.initialForm;\n const alive = () => !controller.signal.aborted;\n let state = initialCloudState;\n const update = (patch: Partial<CloudState>) => {\n state = { ...state, ...patch };\n callbacks.onChange(state);\n };\n const report = (patch: Partial<CloudState>) => update({ ...patch, attempt: state.attempt + 1 });\n\n function show(form: PublishedForm) {\n submitter = submitterFor(form);\n const draft = options.draftStore?.load(options.id, form.version) ?? null;\n update({ ...cloudStateFor(form), revision: state.revision, attempt: state.attempt, initialValues: draft });\n }\n\n async function refresh(error: CloudError, sent: Record<string, unknown>) {\n const before = state.definition;\n try {\n const next = await fetchForm(options, controller.signal, error.version);\n if (!alive()) return;\n if (next.version === undefined || next.version < (error.version ?? 0)) throw new CloudError(409, 'form_updated');\n const kept = before ? carryValues(sent, next.definition, before) : {};\n submitter = submitterFor(next);\n report({\n definition: next.definition,\n version: next.version,\n settings: parseSettings(next.settings),\n initialValues: kept,\n revision: state.revision + 1,\n errors: updatedErrors(next.definition, sent, kept, error.errors ?? {}),\n notice: { tone: 'info', message: FORM_UPDATED_MESSAGE, action: null, details: [] },\n });\n } catch {\n if (alive()) report({ notice: { tone: 'error', ...failureFor(409, 'form_updated'), details: [] } });\n }\n }\n\n async function fail(error: unknown, values: Record<string, unknown>) {\n const cloud = error instanceof CloudError ? error : networkError(error);\n if (cloud.code === 'form_updated' && cloud.version !== undefined) return refresh(cloud, values);\n if (cloud.status !== 422) return report({ notice: errorNotice(cloud) });\n const errors = cloud.errors ?? {};\n const split = state.definition ? splitErrors(state.definition, errors) : { fields: errors, other: [] };\n report({ errors: split.fields, notice: split.other.length > 0 ? errorNotice(cloud, split.other) : null });\n }\n\n return {\n start() {\n if (state.loadError) update({ loadError: null });\n if (initial) {\n show(initial);\n initial = undefined;\n return;\n }\n fetchForm(options, controller.signal).then(\n (form) => { if (alive()) show(form); },\n (error: Error) => {\n if (!alive()) return;\n update({ loadError: error });\n callbacks.onError?.(error);\n },\n );\n },\n dispose() {\n controller.abort();\n },\n saveDraft(values: Record<string, unknown>) {\n if (state.definition && !state.done) options.draftStore?.save(options.id, state.version ?? undefined, draftValues(state.definition, values));\n },\n again() {\n update({ done: false, errors: {}, notice: null, initialValues: null, revision: state.revision + 1 });\n },\n async submit(values: Record<string, unknown>, skippedSteps?: string[]) {\n if (state.notice) update({ notice: null });\n try {\n const submission = await submitter(values, skippedSteps);\n if (!alive()) return;\n options.draftStore?.clear(options.id);\n update({ done: true });\n callbacks.onSuccess?.(submission);\n } catch (error) {\n if (!alive()) throw error;\n await fail(error, values);\n callbacks.onError?.(error);\n throw error;\n }\n },\n };\n}\n","import { getAllFields } from '../engine/engine-utils';\nimport type { FormDefinition } from '../types';\n\nconst clean = (value: string) => value.replace(/[^\\w-]/g, '-');\nconst cache = new WeakMap<FormDefinition, Map<string, string>>();\n\nfunction hash(text: string): string {\n let value = 0x811c9dc5;\n for (const char of text) value = Math.imul(value ^ char.codePointAt(0)!, 0x01000193) >>> 0;\n return value.toString(36);\n}\n\nfunction idsOf(definition: FormDefinition): Map<string, string> {\n let ids = cache.get(definition);\n if (ids) return ids;\n ids = new Map();\n const taken = new Set<string>();\n const keys = [...new Set(getAllFields(definition).map((field) => field.key))]\n .sort((a, b) => +(clean(b) === b) - +(clean(a) === a) || (a < b ? -1 : 1));\n for (const key of keys) {\n let id = clean(key);\n for (let seed = key; taken.has(id); seed = id) id = `${clean(key)}-${hash(seed)}`;\n taken.add(id);\n ids.set(key, id);\n }\n cache.set(definition, ids);\n return ids;\n}\n\nexport function fieldDomId(formId: string | undefined, key: string, definition?: FormDefinition): string {\n return `${formId ? clean(formId) : 'fh'}-${(definition && idsOf(definition).get(key)) ?? clean(key)}`;\n}\n","import type { FormDefinition } from '../types';\nimport { fieldDomId } from './ids';\n\ninterface Searchable {\n querySelector(selector: string): unknown;\n}\n\ninterface Focusable extends Searchable {\n focus(options?: { preventScroll?: boolean }): void;\n scrollIntoView?(options?: { block?: 'center' | 'nearest' }): void;\n matches(selector: string): boolean;\n closest?(selector: string): unknown;\n}\n\ninterface Active {\n matches(selector: string): boolean;\n isContentEditable?: boolean;\n type?: string;\n}\n\ninterface FormRoot extends Focusable {\n ownerDocument: { activeElement: unknown; body: unknown };\n contains(node: never): boolean;\n}\n\ntype Found = Focusable | null | undefined;\n\nconst CONTROLS = 'input:not([type=\"hidden\"]):not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)';\n\nfunction firstControl(root: Found): Found {\n return root?.matches(CONTROLS) ? root : root?.querySelector(CONTROLS) as Found;\n}\n\nfunction reveal(target: Focusable, scrollTo: Focusable): void {\n scrollTo.scrollIntoView?.({ block: 'center' });\n target.focus({ preventScroll: true });\n}\n\nexport function focusProblem(root: Searchable | null, notice?: Focusable | null): void {\n if (notice) return reveal(notice, notice);\n const invalid = root?.querySelector('[aria-invalid=\"true\"]') as Found;\n if (invalid) reveal(firstControl(invalid) ?? invalid, invalid);\n}\n\nexport function canMoveFocus(form: FormRoot | null | undefined): boolean {\n const active = form?.ownerDocument.activeElement as Active | null | undefined;\n if (!active || !form?.contains(active as never)) return false;\n return !active.isContentEditable && !(active.matches('input, select, textarea') && !['checkbox', 'radio'].includes(active.type!));\n}\n\nexport function restoreFocus(form: FormRoot | null | undefined, target: (Focusable & { isConnected: boolean }) | null): void {\n const document = form?.ownerDocument;\n if (document && document.activeElement === document.body && target?.isConnected) target.focus();\n}\n\nexport function focusField(form: FormRoot | null | undefined, formId: string, key: string | null, definition?: FormDefinition): void {\n const fields = form?.querySelector('.fh-form__fields') as Found;\n const id = key && fieldDomId(formId, key, definition);\n const chosen = id ? fields?.querySelector(`[id=\"${id}\"], [id=\"${id}-error\"]`) as Found : null;\n if (id && !chosen) return;\n const field = (chosen?.closest?.('.fh-field') ?? chosen ?? fields?.querySelector('[aria-invalid=\"true\"]')) as Found;\n const target = (field?.querySelector('input:checked:not(:disabled)') as Found) ?? firstControl(field) ?? firstControl(fields);\n (target ?? form)?.focus();\n}\n","import type { FormEngine } from './runtime';\n\nfunction sameErrors(previous: Record<string, string>, next: Record<string, string>): boolean {\n const keys = Object.keys(next);\n return keys.length === Object.keys(previous).length && keys.every((key) => previous[key] === next[key]);\n}\n\nfunction holdsErrors(engine: FormEngine, errors: Record<string, string>): boolean {\n return Object.entries(errors).every(([key, message]) => (\n engine.errors[key] === message || engine.topLevelErrors.includes(message)\n ));\n}\n\nexport function shouldApplyExternalErrors(\n engine: FormEngine,\n previous: Record<string, string> | undefined,\n next: Record<string, string>,\n): boolean {\n return !previous || !sameErrors(previous, next) || !holdsErrors(engine, next);\n}\n","import type { LabelKey, LabelSource } from '../types';\nimport { resolveText } from '../validation/default-messages';\nimport { DEFAULT_LABELS } from './nodes';\n\nexport function labelFor(key: LabelKey, params: Record<string, unknown>, ...sources: (LabelSource | undefined)[]): string {\n return resolveText(DEFAULT_LABELS, key, params, sources);\n}\n","export { cloudStateFor, createCloudController, initialCloudState, type CloudCallbacks, type CloudControllerOptions, type CloudState } from '../cloud/controller';\nexport { canMoveFocus, focusField, focusProblem, restoreFocus } from './focus';\nexport { fieldDomId } from './ids';\nexport { shouldApplyExternalErrors } from '../engine/external-errors';\nexport { labelFor } from '../i18n/labels';\nimport type { FormEngine } from '../engine';\nimport { changeStep } from '../engine/navigation';\nimport type { EngineInternals } from '../engine/runtime-internals';\n\nexport function conditionValues(engine: FormEngine): Record<string, unknown> {\n const internals = engine as unknown as EngineInternals;\n return internals.visibility.conditionValues(internals.values);\n}\n\nexport function autoAdvance(engine: FormEngine): Promise<boolean> {\n return changeStep(engine as unknown as EngineInternals, 'next', 'autoAdvance');\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formhaus/core",
3
- "version": "0.13.1",
3
+ "version": "0.13.2",
4
4
  "description": "JSON form definition engine: validation, conditional visibility, multi-step and branching routes. Zero dependencies, works in React, Vue, Svelte or vanilla.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -1,2 +0,0 @@
1
- var n={form:["title","description"],step:["title","description"],field:["label","placeholder","helperText"],option:["label"],action:["label"],validation:["required","minLength","maxLength","min","max","pattern","matchField"]};function o(e,t){return e[t]!==void 0&&e[t]!==false}var r=Object.freeze({continue:"Continue",back:"Back",stepOf:"Step {current} of {total}",errorSummary:"Check these answers"});export{n as a,o as b,r as c};//# sourceMappingURL=chunk-PZEBYRGE.js.map
2
- //# sourceMappingURL=chunk-PZEBYRGE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/i18n/nodes.ts"],"names":["SLOTS","hasRule","node","slot","DEFAULT_LABELS"],"mappings":"AAIO,IAAMA,CAAAA,CAA6C,CACxD,IAAA,CAAM,CAAC,OAAA,CAAS,aAAa,CAAA,CAC7B,IAAA,CAAM,CAAC,OAAA,CAAS,aAAa,CAAA,CAC7B,MAAO,CAAC,OAAA,CAAS,aAAA,CAAe,YAAY,CAAA,CAC5C,MAAA,CAAQ,CAAC,OAAO,CAAA,CAChB,MAAA,CAAQ,CAAC,OAAO,CAAA,CAChB,UAAA,CAAY,CAAC,UAAA,CAAY,YAAa,WAAA,CAAa,KAAA,CAAO,KAAA,CAAO,SAAA,CAAW,YAAY,CAC1F,EAIO,SAASC,CAAAA,CAAQC,CAAAA,CAAaC,CAAAA,CAAuB,CAC1D,OAAOD,CAAAA,CAAKC,CAAI,CAAA,GAAM,QAAaD,CAAAA,CAAKC,CAAI,CAAA,GAAM,KACpD,CAEO,IAAMC,CAAAA,CAAqD,MAAA,CAAO,OAAO,CAC9E,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,MAAA,CACN,MAAA,CAAQ,2BAAA,CACR,YAAA,CAAc,qBAChB,CAAC","file":"chunk-PZEBYRGE.js","sourcesContent":["import type { LabelKey } from '../types';\n\nexport type NodeKind = 'form' | 'step' | 'field' | 'option' | 'action' | 'validation';\n\nexport const SLOTS: Record<NodeKind, readonly string[]> = {\n form: ['title', 'description'],\n step: ['title', 'description'],\n field: ['label', 'placeholder', 'helperText'],\n option: ['label'],\n action: ['label'],\n validation: ['required', 'minLength', 'maxLength', 'min', 'max', 'pattern', 'matchField'],\n};\n\nexport type Entry = Record<string, unknown>;\n\nexport function hasRule(node: Entry, slot: string): boolean {\n return node[slot] !== undefined && node[slot] !== false;\n}\n\nexport const DEFAULT_LABELS: Readonly<Record<LabelKey, string>> = Object.freeze({\n continue: 'Continue',\n back: 'Back',\n stepOf: 'Step {current} of {total}',\n errorSummary: 'Check these answers',\n});\n"]}