@asteby/storefront 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -4
- package/dist/cli.js +700 -0
- package/dist/fiscal-document.cjs +659 -0
- package/dist/fiscal-document.cjs.map +1 -0
- package/dist/fiscal-document.d.cts +215 -0
- package/dist/fiscal-document.d.ts +215 -0
- package/dist/fiscal-document.js +641 -0
- package/dist/fiscal-document.js.map +1 -0
- package/dist/index.cjs +97 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +61 -5
- package/dist/index.d.ts +61 -5
- package/dist/index.js +95 -6
- package/dist/index.js.map +1 -1
- package/dist/mock.cjs +1072 -11
- package/dist/mock.cjs.map +1 -1
- package/dist/mock.d.cts +33 -2
- package/dist/mock.d.ts +33 -2
- package/dist/mock.js +1069 -12
- package/dist/mock.js.map +1 -1
- package/dist/mockup.d.cts +1 -1
- package/dist/mockup.d.ts +1 -1
- package/dist/node.cjs +297 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +134 -0
- package/dist/node.d.ts +134 -0
- package/dist/node.js +260 -0
- package/dist/node.js.map +1 -0
- package/dist/{types-COSwo4ND.d.ts → types-B1E3GySa.d.ts} +293 -3
- package/dist/{types-DdLzlxw4.d.cts → types-bsdlAumU.d.cts} +293 -3
- package/package.json +41 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/fiscal-document/registry.ts","../src/fiscal-document/text.ts","../src/fiscal-document/engine.ts","../src/fiscal-document/errors.ts","../src/fiscal-document/pdf.ts","../src/fiscal-document/qr.ts"],"names":["pages","custom"],"mappings":"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","file":"fiscal-document.js","sourcesContent":["import type { IdentityExtractorFn } from './types.js'\n\nconst extractors = new Map<string, IdentityExtractorFn>()\n\n/**\n * Registers the extractor of a document the `rules@1` engine cannot describe (a country whose document needs\n * code). `key` is the document `kind` (`XX:doc`) or the `<id>` of a spec with `engine: 'plugin:<id>'`; the id\n * wins. The server-side validator stays the region's: a plugin only reads text. Replaces a previous one.\n * Returns a function that unregisters it.\n */\nexport function registerIdentityExtractor(key: string, fn: IdentityExtractorFn): () => void {\n if (!key || typeof fn !== 'function') throw new TypeError('registerIdentityExtractor: key and fn are required')\n extractors.set(key, fn)\n return () => {\n if (extractors.get(key) === fn) extractors.delete(key)\n }\n}\n\nexport function getIdentityExtractor(key: string): IdentityExtractorFn | undefined {\n return extractors.get(key)\n}\n","/**\n * Text helpers of the rules engine. Pure; no DOM, no network.\n */\n\nconst FOLD: Record<string, string> = {}\nfor (const [from, to] of [\n ['áàâãä', 'a'], ['éèêë', 'e'], ['íìîï', 'i'], ['óòôõö', 'o'], ['úùûü', 'u'], ['ñ', 'n'], ['ç', 'c'],\n] as const) for (const ch of from) FOLD[ch] = to\n\n/** Lowercases, strips Latin accents and collapses whitespace; the base of every phrase comparison (punctuation is kept). */\nexport function foldText(s: string): string {\n let out = ''\n for (const ch of s.toLowerCase()) out += FOLD[ch] ?? ch\n return out.split(/\\s+/).filter(Boolean).join(' ')\n}\n\n/** Whole days from `iso` (`YYYY-MM-DD`) to `now`; `null` for an invalid date. Negative: in the future. */\nexport function ageInDays(isoDate: string, now: Date): number | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(isoDate)\n if (!m) return null\n const then = Date.UTC(+m[1]!, +m[2]! - 1, +m[3]!)\n const today = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())\n return Math.floor((today - then) / 86_400_000)\n}\n\n/** Hex SHA-256 of the bytes (Web Crypto: browsers, Node 20+, edge runtimes). */\nexport async function sha256Hex(data: ArrayBuffer | Uint8Array): Promise<string> {\n const subtle = (globalThis as { crypto?: { subtle?: SubtleCrypto } }).crypto?.subtle\n if (!subtle) throw new TypeError('sha256Hex: Web Crypto (crypto.subtle) is not available')\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data)\n const digest = await subtle.digest('SHA-256', bytes as unknown as BufferSource)\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('')\n}\n","import type { IdentityDocumentSpec, IdentityRulesV1, IdentityStrategy, RegionFiscalId } from '../types.js'\nimport { getIdentityExtractor } from './registry.js'\nimport { ageInDays, foldText } from './text.js'\nimport type { EvidenceInput, ExtractOptions, ExtractedValue, FiscalDocumentEvidence, IdentityCatalogs, IdentityExtraction } from './types.js'\n\n/** Longest text the engine reads (a one-page document is a few thousand characters). */\nexport const MAX_TEXT_LENGTH = 400_000\n\nconst MAX_FIELDS = 32\nconst MAX_STRATEGIES = 8\nconst MAX_PATTERN = 1024\nconst STRATEGIES = new Set(['regex', 'labeled_lines', 'concat_labeled', 'catalog_phrases', 'date', 'qr_param'])\nconst STRATEGY_KEYS = new Set([\n 'strategy', 'pattern', 'flags', 'group', 'label', 'labels', 'separator', 'catalog', 'start', 'end', 'order', 'months',\n 'param', 'split', 'parts', 'match', 'upper', 'capture', 'scan',\n])\nconst RULES_KEYS = new Set(['version', 'normalize', 'labels', 'qr_canonical', 'fields'])\nconst PLACEHOLDER = /\\{([a-z0-9_]+)\\}/g\n\n/** Thrown for a spec that cannot run (unknown engine, rules that do not validate, no extractor registered). */\nexport class IdentityRulesError extends Error {\n override readonly name = 'IdentityRulesError'\n}\n\n// ---- regular expressions ---------------------------------------------------\n\nconst cache = new Map<string, RegExp>()\n\nfunction checkPattern(what: string, p: string | undefined, flags = ''): void {\n if (!p) throw new IdentityRulesError(`rules: ${what}: empty pattern`)\n if (p.length > MAX_PATTERN) throw new IdentityRulesError(`rules: ${what}: pattern longer than ${MAX_PATTERN}`)\n for (const f of flags) if (f !== 'i' && f !== 's' && f !== 'm') throw new IdentityRulesError(`rules: ${what}: unknown flag \"${f}\"`)\n if (p.replaceAll('(?:', '').includes('(?')) throw new IdentityRulesError(`rules: ${what}: only (?: groups are portable`)\n for (const bad of ['[[:', '\\\\p', '\\\\P', '\\\\z', '\\\\A', '\\\\Q', '\\\\E', '\\\\C']) {\n if (p.includes(bad)) throw new IdentityRulesError(`rules: ${what}: ${bad} is not portable`)\n }\n try {\n compiled(p, flags)\n } catch (err) {\n throw err instanceof IdentityRulesError ? err : new IdentityRulesError(`rules: ${what}: invalid pattern`)\n }\n}\n\nfunction compiled(p: string, flags = '', global = false): RegExp {\n const k = `${global ? 'g' : ''}${flags}/${p}`\n let re = cache.get(k)\n if (!re) {\n re = new RegExp(p, flags + (global ? 'g' : ''))\n cache.set(k, re)\n }\n re.lastIndex = 0\n return re\n}\n\n// ---- validation (same checks as the reference interpreter) ------------------\n\nfunction validateStrategy(s: IdentityStrategy, haveLabels: boolean): void {\n for (const k of Object.keys(s)) if (!STRATEGY_KEYS.has(k)) throw new IdentityRulesError(`rules: unknown member \"${k}\"`)\n if (s.capture) {\n checkPattern('capture', s.capture.pattern, s.capture.flags)\n const groups = new RegExp(s.capture.pattern + '|').exec('')!.length - 1\n if ((s.capture.group ?? 0) < 0 || (s.capture.group ?? 0) > groups) throw new IdentityRulesError('rules: capture group does not exist')\n }\n switch (s.strategy) {\n case 'regex': {\n checkPattern('pattern', s.pattern, s.flags)\n const groups = new RegExp(s.pattern + '|').exec('')!.length - 1\n if ((s.group ?? 0) < 0 || (s.group ?? 0) > groups) throw new IdentityRulesError('rules: regex group does not exist')\n return\n }\n case 'labeled_lines':\n if (!haveLabels) throw new IdentityRulesError('rules: labeled_lines needs the top-level labels list')\n return checkPattern('label', s.label)\n case 'concat_labeled':\n if (!haveLabels || !s.labels?.length) throw new IdentityRulesError('rules: concat_labeled needs labels')\n return s.labels.forEach((l) => checkPattern('labels', l))\n case 'catalog_phrases':\n if (!s.catalog) throw new IdentityRulesError('rules: catalog_phrases needs a catalog')\n return [s.start, s.end].forEach((p) => p && checkPattern('section', p, 'i'))\n case 'date': {\n checkPattern('pattern', s.pattern, s.flags)\n const order = s.order ?? ''\n if (order.length !== 3 || ![...'dmy'].every((c) => order.split(c).length === 2)) throw new IdentityRulesError(`rules: date order \"${order}\" must be a permutation of d, m, y`)\n if (new RegExp(s.pattern + '|').exec('')!.length - 1 < 3) throw new IdentityRulesError('rules: date pattern needs three groups')\n if (s.months && s.months.length !== 0 && s.months.length !== 12) throw new IdentityRulesError('rules: date months wants 12 names')\n return\n }\n case 'qr_param': {\n if (!s.param && !s.scan) throw new IdentityRulesError('rules: qr_param needs a param or a scan')\n if ((s.parts ?? 0) < 0) throw new IdentityRulesError('rules: qr_param parts must not be negative')\n if (s.scan) {\n checkPattern('scan', s.scan, s.flags)\n const groups = new RegExp(s.scan + '|').exec('')!.length - 1\n if ((s.group ?? 0) < 1 || (s.group ?? 0) > groups) throw new IdentityRulesError('rules: scan group does not exist')\n }\n if (s.param) checkPattern('match', s.match)\n return\n }\n default:\n throw new IdentityRulesError(`rules: unknown strategy \"${String(s.strategy)}\"`)\n }\n}\n\n/** Checks rules are well formed and portable; no rule may produce a `discard` field. Throws `IdentityRulesError`. */\nexport function validateRules(rules: IdentityRulesV1, discard: string[] = []): void {\n for (const k of Object.keys(rules ?? {})) if (!RULES_KEYS.has(k)) throw new IdentityRulesError(`rules: unknown member \"${k}\"`)\n if (rules?.version !== 1) throw new IdentityRulesError(`rules: version ${String(rules?.version)} is not 1`)\n for (const n of rules.normalize ?? []) if (n !== 'nbsp' && n !== 'collapse_ws') throw new IdentityRulesError(`rules: unknown normalize step \"${String(n)}\"`)\n for (const l of rules.labels ?? []) checkPattern('labels', l)\n if (!Array.isArray(rules.fields) || rules.fields.length === 0 || rules.fields.length > MAX_FIELDS) throw new IdentityRulesError(`rules: want 1..${MAX_FIELDS} fields`)\n if (rules.qr_canonical) {\n const keys = new Set(rules.fields.map((f) => f.key))\n for (const m of rules.qr_canonical.matchAll(PLACEHOLDER)) if (!keys.has(m[1]!)) throw new IdentityRulesError(`rules: qr_canonical names unknown field \"${m[1]}\"`)\n }\n const drop = new Set(discard.map((d) => d.trim().toLowerCase()))\n const seen = new Set<string>()\n for (const f of rules.fields) {\n if (!f.key || seen.has(f.key)) throw new IdentityRulesError(`rules: field key \"${f.key}\" is empty or repeated`)\n seen.add(f.key)\n if (drop.has(f.key.toLowerCase())) throw new IdentityRulesError(`rules: field \"${f.key}\" is in discard_fields`)\n if (!Array.isArray(f.strategies) || f.strategies.length === 0 || f.strategies.length > MAX_STRATEGIES) throw new IdentityRulesError(`rules: field \"${f.key}\" wants 1..${MAX_STRATEGIES} strategies`)\n for (const s of f.strategies) {\n if (!STRATEGIES.has(s.strategy)) throw new IdentityRulesError(`rules: unknown strategy \"${String(s.strategy)}\"`)\n validateStrategy(s, (rules.labels?.length ?? 0) > 0)\n }\n }\n}\n\nfunction parseRules(spec: IdentityDocumentSpec): IdentityRulesV1 {\n let rules = spec.rules\n if (typeof rules === 'string') {\n try {\n rules = JSON.parse(rules) as IdentityRulesV1\n } catch {\n throw new IdentityRulesError(`${spec.kind}: rules is not valid JSON`)\n }\n }\n if (!rules || typeof rules !== 'object') throw new IdentityRulesError(`${spec.kind}: rules@1 needs rules`)\n // A rule that produces a discarded field is the publisher's error (`validateRules` flags it); reading still drops it.\n validateRules(rules)\n return rules\n}\n\n// ---- interpreter (mirrors the reference ExtractIdentity) --------------------\n\nfunction normalizeText(s: string, steps: string[] = []): string {\n let t = s.length > MAX_TEXT_LENGTH ? s.slice(0, MAX_TEXT_LENGTH) : s\n for (const st of steps) {\n if (st === 'nbsp') t = t.replaceAll(' ', ' ')\n else if (st === 'collapse_ws') t = t.split(/\\s+/).filter(Boolean).join(' ')\n }\n return t\n}\n\ntype LabelHit = { caption: string; start: number; from: number }\n\nclass LabelIndex {\n private readonly hits: LabelHit[] = []\n constructor(\n labels: string[],\n private readonly text: string,\n ) {\n if (labels.length === 0) return\n for (const m of text.matchAll(new RegExp(`(?:^|\\\\s)(${labels.join('|')})\\\\s*:`, 'gi'))) {\n this.hits.push({ caption: m[1] ?? '', start: m.index, from: m.index + m[0].length })\n }\n }\n\n value(label: string): string {\n const full = compiled(`^(?:${label})$`, 'i')\n for (let i = 0; i < this.hits.length; i++) {\n const h = this.hits[i]!\n if (!full.test(h.caption)) continue\n const end = i + 1 < this.hits.length ? this.hits[i + 1]!.start : this.text.length\n return this.text.slice(h.from, end).trim()\n }\n return ''\n }\n}\n\nfunction section(text: string, start?: string, end?: string): string {\n let from = 0\n if (start) {\n const m = compiled(start, 'is').exec(text)\n if (!m) return ''\n from = m.index + m[0].length\n }\n let to = text.length\n if (end) {\n const m = compiled(end, 'is').exec(text.slice(from))\n if (m) to = from + m.index\n }\n return text.slice(from, to)\n}\n\nfunction phrasesOf(e: { label: string; label_en?: string; match_phrases?: string[] }): string[] {\n const src = e.match_phrases?.length ? e.match_phrases : [e.label, e.label_en ?? '']\n return [...new Set(src.map(foldText).filter(Boolean))]\n}\n\nfunction catalogHits(sec: string, entries: IdentityCatalogs[string] = []): string[] {\n const hay = foldText(sec)\n const hits: { code: string; at: number }[] = []\n for (const e of entries) {\n let best = -1\n for (const p of phrasesOf(e)) {\n const at = hay.indexOf(p)\n if (at >= 0 && (best < 0 || at < best)) best = at\n }\n if (best >= 0) hits.push({ code: e.code, at: best })\n }\n return hits.sort((a, b) => a.at - b.at).map((h) => h.code)\n}\n\nfunction parseDate(text: string, s: IdentityStrategy): string {\n const m = compiled(s.pattern!, s.flags ?? '').exec(text)\n if (!m) return ''\n let d = 0\n let mo = 0\n let y = 0\n for (let i = 0; i < 3; i++) {\n const c = s.order![i]\n const g = (m[i + 1] ?? '').trim()\n let n = /^[+-]?\\d+$/.test(g) ? Number(g) : NaN\n if (Number.isNaN(n) && c === 'm' && s.months?.length === 12) {\n n = 0\n s.months.forEach((name, j) => {\n if (foldText(name) === foldText(g)) n = j + 1\n })\n }\n if (Number.isNaN(n) || n === 0) return ''\n if (c === 'd') d = n\n else if (c === 'm') mo = n\n else y = n\n }\n const t = new Date(Date.UTC(y, mo - 1, d))\n if (y < 1000 || t.getUTCFullYear() !== y || t.getUTCMonth() + 1 !== mo || t.getUTCDate() !== d) return ''\n return `${String(y).padStart(4, '0')}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}`\n}\n\nfunction qrScan(qr: string, s: IdentityStrategy): string {\n if (!s.scan) return ''\n const m = compiled(s.scan, s.flags ?? '').exec(qr)\n return m ? (m[s.group ?? 0] ?? '').trim().toUpperCase() : ''\n}\n\nfunction qrPart(qr: string, s: IdentityStrategy): string {\n const url = qr.trim()\n if (!url) return ''\n if (!s.param) return qrScan(url, s)\n const m = new RegExp(`[?&]${s.param.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}=([^&\\\\s#]+)`, 'i').exec(url)\n if (!m) return qrScan(url, s)\n let val: string\n try {\n val = decodeURIComponent(m[1]!.replaceAll('+', ' '))\n } catch {\n return ''\n }\n const parts = s.split ? val.split(s.split) : [val]\n if ((s.parts ?? 0) > 0 && parts.length !== s.parts) return qrScan(url, s)\n const re = compiled(s.match!)\n for (const raw of parts) {\n const p = raw.trim().toUpperCase()\n if (re.test(p)) return p\n }\n return qrScan(url, s)\n}\n\n/** Go's url.QueryEscape: space as +, everything but letters, digits and -_.~ percent-encoded. */\nfunction queryEscape(v: string): string {\n return encodeURIComponent(v)\n .replace(/[!'()*]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase())\n .replaceAll('%20', '+')\n}\n\nfunction post(s: IdentityStrategy, value: string): string {\n let v = value.trim()\n if (!v) return ''\n if (s.upper) v = v.toUpperCase()\n if (s.capture) {\n const m = compiled(s.capture.pattern, s.capture.flags ?? '').exec(v)\n if (!m) return ''\n v = (m[s.capture.group ?? 0] ?? '').trim()\n }\n return v\n}\n\nfunction run(s: IdentityStrategy, text: string, labels: LabelIndex, catalogs: IdentityCatalogs): string[] {\n switch (s.strategy) {\n case 'regex': {\n const m = compiled(s.pattern!, s.flags ?? '').exec(text)\n return m ? [m[s.group ?? 0] ?? ''] : []\n }\n case 'labeled_lines':\n return [labels.value(s.label!)]\n case 'concat_labeled': {\n const parts = (s.labels ?? []).map((l) => labels.value(l).trim()).filter(Boolean)\n return [parts.join(s.separator || ' ')]\n }\n case 'catalog_phrases':\n return catalogHits(section(text, s.start, s.end), catalogs[s.catalog!])\n case 'date':\n return [parseDate(text, s)]\n default:\n return []\n }\n}\n\nconst nonEmpty = (vals: string[]) => vals.map((v) => v.trim()).filter(Boolean)\n\n/**\n * Reads an identity document (the text of a PDF, `readPdfText`) with the rules of its spec: the TypeScript twin of\n * the reference interpreter of the region packs. Generic, the country is data. `discard_fields` never appear in\n * the output. Pure and synchronous; a text that does not match yields `missing`, never an exception; only a spec\n * that cannot run throws `IdentityRulesError`.\n */\nexport function extractIdentityDocument(text: string, spec: IdentityDocumentSpec, options: ExtractOptions = {}): IdentityExtraction {\n const discard = (spec.discard_fields ?? []).map((d) => d.trim().toLowerCase())\n const out: IdentityExtraction = {\n kind: spec.kind,\n extractor: spec.engine,\n fields: {},\n sources: {},\n missing: [],\n discarded: [...(spec.discard_fields ?? [])],\n qr: { match: null, canonical: '' },\n stale: null,\n age_days: null,\n }\n\n if (spec.engine === 'rules@1') {\n const rules = parseRules(spec)\n const body = normalizeText(text, rules.normalize)\n const labels = new LabelIndex(rules.labels ?? [], body)\n const catalogs = options.catalogs ?? {}\n let compared = 0\n let equal = 0\n const qrBest: Record<string, string> = {}\n for (const f of rules.fields) {\n let textVals: string[] = []\n const qrVals: string[] = []\n for (const s of f.strategies) {\n if (s.strategy === 'qr_param') {\n const v = post(s, qrPart(options.qr ?? '', s))\n if (v) qrVals.push(v)\n continue\n }\n if (textVals.length > 0) continue\n textVals = nonEmpty(run(s, body, labels, catalogs).map((v) => post(s, v)))\n }\n let got: string[] = []\n if (textVals.length > 0) {\n got = textVals\n out.sources[f.key] = 'text'\n } else if (qrVals.length > 0) {\n got = qrVals.slice(0, 1)\n out.sources[f.key] = 'qr'\n }\n if (qrVals.length > 0) qrBest[f.key] = qrVals[0]!\n if (textVals.length > 0 && qrVals.length > 0) {\n compared++\n if (textVals[0]!.toUpperCase() === qrVals[0]!.toUpperCase()) equal++\n }\n if (got.length === 0) {\n if (f.required) out.missing.push(f.key)\n } else out.fields[f.key] = f.multiple ? got : got[0]!\n }\n if (compared > 0) out.qr.match = compared === equal\n if (rules.qr_canonical && (options.qr ?? '').trim()) {\n let ok = true\n const canon = rules.qr_canonical.replace(PLACEHOLDER, (_p, key: string) => {\n const v = qrBest[key]\n if (!v) ok = false\n return queryEscape(v ?? '')\n })\n if (ok) out.qr.canonical = canon\n }\n } else {\n const id = spec.engine.startsWith('plugin:') ? spec.engine.slice('plugin:'.length) : spec.engine\n const fn = getIdentityExtractor(id) ?? getIdentityExtractor(spec.kind)\n if (!fn) throw new IdentityRulesError(`${spec.kind}: no extractor registered for engine \"${spec.engine}\"`)\n const res = fn(text, spec, options)\n out.fields = { ...res.fields }\n out.sources = { ...(res.sources ?? {}) }\n out.missing = [...(res.missing ?? [])]\n out.qr.match = res.qr_match ?? null\n }\n\n // The spec's discard list wins over any engine, plugins included.\n for (const k of Object.keys(out.fields)) {\n if (discard.includes(k.toLowerCase())) {\n delete out.fields[k]\n delete out.sources[k]\n }\n }\n\n const issued = out.fields.issued_on\n if (typeof issued === 'string') {\n out.age_days = ageInDays(issued, options.now ?? new Date())\n if (spec.freshness_days && out.age_days !== null) out.stale = out.age_days > spec.freshness_days\n }\n return out\n}\n\n/** The catalogs `catalog_phrases` rules name, from the region: `fiscal_regime` and `invoice_use`. */\nexport function catalogsFromRegion(fiscalId: Pick<RegionFiscalId, 'regimes' | 'invoice_uses'>): IdentityCatalogs {\n return { fiscal_regime: fiscalId.regimes, invoice_use: fiscalId.invoice_uses }\n}\n\n/**\n * The evidence to send with the fiscal data (`InvoiceRequest.document`): where it came from and nothing of the\n * document. `source` is `pdf_client` in the browser, `pdf_server` when a server read it, `manual` for typed data.\n */\nexport function buildDocumentEvidence(extraction: IdentityExtraction, input: EvidenceInput): FiscalDocumentEvidence {\n const id = extraction.fields.document_id\n const issued = extraction.fields.issued_on\n return {\n kind: extraction.kind,\n document_id: typeof id === 'string' ? id : null,\n issued_on: typeof issued === 'string' ? issued : null,\n sha256: input.sha256 ?? null,\n extractor: extraction.extractor,\n source: input.source,\n qr_match: extraction.qr.match,\n }\n}\n\nexport type { ExtractedValue }\n","export type IdentityDocumentErrorCode =\n /** Over `maxBytes`, or more than `maxPages` pages. */\n | 'too_large'\n /** Does not start with `%PDF-`. */\n | 'not_pdf'\n /** Corrupt, unsupported, or it took longer than `timeoutMs`. */\n | 'unreadable'\n /** A PDF without a text layer (a scan): ask for manual entry. */\n | 'no_text'\n /** Encrypted: it needs a password the buyer has not given. */\n | 'password'\n\n/** Why a document could not be read. `code` is stable; `message` is for logs (English) and never holds document text. */\nexport class IdentityDocumentError extends Error {\n override readonly name = 'IdentityDocumentError'\n readonly code: IdentityDocumentErrorCode\n /** Finer cause: `bytes`, `pages`, `timeout`, `aborted`... */\n readonly reason: string | undefined\n\n constructor(code: IdentityDocumentErrorCode, message: string, options?: { reason?: string; cause?: unknown }) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause })\n this.code = code\n this.reason = options?.reason\n }\n}\n\nexport function isIdentityDocumentError(err: unknown): err is IdentityDocumentError {\n return err instanceof IdentityDocumentError || (typeof err === 'object' && err !== null && (err as { name?: unknown }).name === 'IdentityDocumentError')\n}\n","import { IdentityDocumentError } from './errors.js'\nimport { sha256Hex } from './text.js'\n\n/** What `readPdfText` accepts: a browser `File`/`Blob`, or bytes (Node `Buffer` included). */\nexport type PdfSource = Blob | ArrayBuffer | ArrayBufferView\n\nexport type ReadPdfOptions = {\n /** Reject files larger than this (default 5 MiB). */\n maxBytes?: number\n /** Reject documents with more pages than this (default 6). */\n maxPages?: number\n /** Give up after this many ms (default 3000). */\n timeoutMs?: number\n /** Fewer non-space characters than this means \"no text layer\" (default 20). */\n minChars?: number\n /**\n * URL of the pdf.js worker (`pdf.worker.mjs` from `pdfjs-dist/legacy/build`) that YOUR site serves. Required in\n * browsers (there is deliberately no default and no CDN); ignored in Node, which needs no worker file.\n */\n workerSrc?: string\n /** Aborts the read. */\n signal?: AbortSignal\n}\n\nexport type PdfTextResult = {\n /** Text of all pages, one line per visual line, pages separated by a blank line. */\n text: string\n pages: number\n /** SHA-256 of the file as received, lowercase hex (evidence for `FiscalDocumentEvidence.sha256`). */\n sha256: string\n}\n\n/** The slice of pdf.js these helpers use. */\nexport type PdfjsLike = {\n getDocument(src: Record<string, unknown>): { promise: Promise<PdfDocumentLike>; destroy(): Promise<void> | void }\n GlobalWorkerOptions?: { workerSrc: string }\n}\nexport type PdfDocumentLike = {\n numPages: number\n getPage(n: number): Promise<PdfPageLike>\n destroy?(): Promise<void> | void\n}\nexport type PdfPageLike = {\n getTextContent(): Promise<{ items: Array<{ str?: string; transform?: number[]; hasEOL?: boolean }> }>\n getViewport(o: { scale: number }): { width: number; height: number }\n render(o: { canvasContext: unknown; viewport: unknown }): { promise: Promise<void> }\n cleanup?(): void\n}\n\nexport const DEFAULT_MAX_BYTES = 5 * 1024 * 1024\nexport const DEFAULT_MAX_PAGES = 6\nexport const DEFAULT_TIMEOUT_MS = 3000\n\nlet custom: (() => Promise<PdfjsLike>) | undefined\n\n/**\n * Replaces how pdf.js is loaded (tests, or a bundler that needs its own import). By default the legacy build of\n * `pdfjs-dist` is imported on first use, so it costs nothing until a document is read.\n */\nexport function setPdfjsLoader(loader: (() => Promise<PdfjsLike>) | undefined): void {\n custom = loader\n}\n\nexport async function loadPdfjs(workerSrc?: string): Promise<PdfjsLike> {\n const mod = custom ? await custom() : ((await import('pdfjs-dist/legacy/build/pdf.mjs')) as unknown as PdfjsLike)\n if (workerSrc && mod.GlobalWorkerOptions) mod.GlobalWorkerOptions.workerSrc = workerSrc\n const inBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'\n if (inBrowser && !mod.GlobalWorkerOptions?.workerSrc) {\n throw new TypeError('readPdfText: set `workerSrc` to a pdf.worker.mjs your site serves (there is no default and no CDN)')\n }\n return mod\n}\n\nasync function toBytes(source: PdfSource): Promise<Uint8Array> {\n if (typeof Blob !== 'undefined' && source instanceof Blob) return new Uint8Array(await source.arrayBuffer())\n if (source instanceof ArrayBuffer) return new Uint8Array(source)\n if (ArrayBuffer.isView(source)) return new Uint8Array(source.buffer, source.byteOffset, source.byteLength)\n throw new TypeError('readPdfText: expected a File, Blob, ArrayBuffer or Uint8Array')\n}\n\nfunction sizeOf(source: PdfSource): number {\n if (typeof Blob !== 'undefined' && source instanceof Blob) return source.size\n return (source as ArrayBuffer | ArrayBufferView).byteLength\n}\n\n/** `%PDF-` at the very start: a cheap check before any parsing. */\nexport function hasPdfSignature(bytes: Uint8Array): boolean {\n return bytes.length >= 5 && bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46 && bytes[4] === 0x2d\n}\n\nexport type OpenedPdf = { bytes: Uint8Array; sha256: string; pdfjs: PdfjsLike; doc: PdfDocumentLike; destroy(): Promise<void> }\n\nfunction mapPdfjsError(err: unknown): IdentityDocumentError {\n const name = (err as { name?: string } | null)?.name ?? ''\n if (name === 'PasswordException') return new IdentityDocumentError('password', 'The PDF is password protected', { cause: err })\n if (name === 'InvalidPDFException') return new IdentityDocumentError('unreadable', 'The PDF is corrupt or unsupported', { cause: err, reason: 'invalid' })\n return new IdentityDocumentError('unreadable', 'The PDF could not be read', { cause: err })\n}\n\n/** Validates the file, opens it with pdf.js and enforces the limits. The caller must `destroy()`. */\nexport async function openPdf(source: PdfSource, options: ReadPdfOptions = {}): Promise<OpenedPdf> {\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES\n const maxPages = options.maxPages ?? DEFAULT_MAX_PAGES\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (sizeOf(source) > maxBytes) throw new IdentityDocumentError('too_large', `The file is larger than ${maxBytes} bytes`, { reason: 'bytes' })\n const bytes = await toBytes(source)\n if (bytes.byteLength > maxBytes) throw new IdentityDocumentError('too_large', `The file is larger than ${maxBytes} bytes`, { reason: 'bytes' })\n if (!hasPdfSignature(bytes)) throw new IdentityDocumentError('not_pdf', 'The file is not a PDF')\n const sha256 = await sha256Hex(bytes)\n if (options.signal?.aborted) throw new IdentityDocumentError('unreadable', 'Aborted', { reason: 'aborted' })\n\n const pdfjs = await loadPdfjs(options.workerSrc)\n // pdf.js takes ownership of `data` (it transfers it to the worker): give it a copy.\n const task = pdfjs.getDocument({\n data: bytes.slice(),\n isEvalSupported: false,\n enableXfa: false,\n useSystemFonts: false,\n disableAutoFetch: true,\n disableStream: true,\n useWorkerFetch: false,\n verbosity: 0,\n })\n task.promise.catch(() => undefined)\n let doc: PdfDocumentLike | undefined\n const destroy = async () => {\n try {\n await (doc?.destroy ? doc.destroy() : task.destroy())\n } catch {\n /* already gone */\n }\n }\n let timer: ReturnType<typeof setTimeout> | undefined\n let onAbort: (() => void) | undefined\n const limit = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new IdentityDocumentError('unreadable', `Reading took longer than ${timeoutMs} ms`, { reason: 'timeout' })), timeoutMs)\n if (options.signal) {\n onAbort = () => reject(new IdentityDocumentError('unreadable', 'Aborted', { reason: 'aborted' }))\n options.signal.addEventListener('abort', onAbort, { once: true })\n }\n })\n const cleanup = () => {\n if (timer) clearTimeout(timer)\n if (onAbort) options.signal?.removeEventListener('abort', onAbort)\n }\n try {\n doc = await Promise.race([task.promise, limit])\n if (doc.numPages > maxPages) throw new IdentityDocumentError('too_large', `The PDF has more than ${maxPages} pages`, { reason: 'pages' })\n cleanup()\n // The deadline covers `readOpened` too: keep a fresh one there.\n return { bytes, sha256, pdfjs, doc, destroy }\n } catch (err) {\n cleanup()\n await destroy()\n throw err instanceof IdentityDocumentError ? err : mapPdfjsError(err)\n }\n}\n\ntype Item = { str?: string; transform?: number[]; hasEOL?: boolean }\n\n/** Joins the text items of a page into visual lines (top to bottom, left to right). */\nexport function itemsToLines(items: Item[]): string {\n const rows: { y: number; parts: { x: number; s: string }[] }[] = []\n for (const it of items) {\n const s = it.str\n if (!s || !s.trim()) continue\n const x = it.transform?.[4] ?? 0\n const y = it.transform?.[5] ?? 0\n const row = rows.find((r) => Math.abs(r.y - y) <= 2)\n if (row) row.parts.push({ x, s })\n else rows.push({ y, parts: [{ x, s }] })\n }\n rows.sort((a, b) => b.y - a.y)\n return rows.map((r) => r.parts.sort((a, b) => a.x - b.x).map((p) => p.s.trim()).join(' ')).join('\\n')\n}\n\n/**\n * Text of a PDF, in the browser or in Node, with pdf.js (legacy build, `isEvalSupported: false`) imported on\n * demand. The file is read in memory: nothing is uploaded, written or logged. Throws `IdentityDocumentError`\n * (`too_large`, `not_pdf`, `unreadable`, `no_text`, `password`). In browsers pass `workerSrc`.\n */\nexport async function readPdfText(source: PdfSource, options: ReadPdfOptions = {}): Promise<PdfTextResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const opened = await openPdf(source, options)\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n const read = (async () => {\n const pages: string[] = []\n for (let n = 1; n <= opened.doc.numPages; n++) {\n const page = await opened.doc.getPage(n)\n pages.push(itemsToLines((await page.getTextContent()).items))\n page.cleanup?.()\n }\n return pages\n })()\n const limit = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new IdentityDocumentError('unreadable', `Reading took longer than ${timeoutMs} ms`, { reason: 'timeout' })), timeoutMs)\n })\n const pages = await Promise.race([read, limit])\n const text = pages.join('\\n\\n')\n if (text.replace(/\\s+/g, '').length < (options.minChars ?? 20)) throw new IdentityDocumentError('no_text', 'The PDF has no text layer')\n return { text, pages: pages.length, sha256: opened.sha256 }\n } catch (err) {\n throw err instanceof IdentityDocumentError ? err : mapPdfjsError(err)\n } finally {\n if (timer) clearTimeout(timer)\n await opened.destroy()\n }\n}\n","import { IdentityDocumentError } from './errors.js'\nimport { openPdf, type PdfSource, type PdfPageLike, type ReadPdfOptions } from './pdf.js'\n\nexport type DecodePdfQrOptions = ReadPdfOptions & {\n /** Pages to scan, 1-based (default `[1]`, then the last page). */\n pages?: number[]\n /** Render scale (default 2: enough for a printed QR). */\n scale?: number\n /** Your own decoder for the rendered image (e.g. a server canvas in Node). Returns the QR text or `null`. */\n decode?: (image: ImageData) => string | null | Promise<string | null>\n}\n\ntype CanvasLike = { width: number; height: number; getContext(kind: '2d'): unknown }\n\nfunction makeCanvas(width: number, height: number): CanvasLike | null {\n const g = globalThis as { OffscreenCanvas?: new (w: number, h: number) => CanvasLike; document?: { createElement(tag: 'canvas'): CanvasLike } }\n if (g.OffscreenCanvas) return new g.OffscreenCanvas(width, height)\n if (g.document) {\n const c = g.document.createElement('canvas')\n c.width = width\n c.height = height\n return c\n }\n return null\n}\n\nasync function decodeImage(image: ImageData, canvas: CanvasLike, custom?: DecodePdfQrOptions['decode']): Promise<string | null> {\n if (custom) return (await custom(image)) ?? null\n const Detector = (globalThis as { BarcodeDetector?: new (o: { formats: string[] }) => { detect(i: unknown): Promise<{ rawValue: string }[]> } }).BarcodeDetector\n if (Detector) {\n try {\n const found = await new Detector({ formats: ['qr_code'] }).detect(canvas)\n if (found[0]?.rawValue) return found[0].rawValue\n } catch {\n /* fall through to jsQR */\n }\n }\n try {\n const mod = (await import('jsqr')) as unknown as { default: (d: Uint8ClampedArray, w: number, h: number) => { data: string } | null }\n return mod.default(image.data, image.width, image.height)?.data ?? null\n } catch {\n return null\n }\n}\n\nasync function scan(page: PdfPageLike, scale: number, custom?: DecodePdfQrOptions['decode']): Promise<string | null> {\n const viewport = page.getViewport({ scale })\n const canvas = makeCanvas(Math.ceil(viewport.width), Math.ceil(viewport.height))\n if (!canvas && !custom) return null\n const c = canvas ?? { width: Math.ceil(viewport.width), height: Math.ceil(viewport.height), getContext: () => null }\n const context = c.getContext('2d') as { getImageData(x: number, y: number, w: number, h: number): ImageData } | null\n if (!context) return null\n await page.render({ canvasContext: context, viewport }).promise\n return decodeImage(context.getImageData(0, 0, c.width, c.height), c, custom)\n}\n\n/**\n * Text of the first QR code found in a PDF (the document's validator URL), or `null`. Best effort: it needs a\n * canvas (browsers; Node has none unless you pass `decode` with your own), and `BarcodeDetector` or the\n * optional `jsqr` package, both loaded on demand. Anything that goes wrong yields `null`, except the\n * `IdentityDocumentError`s of opening the file (`too_large`, `not_pdf`, `password`, `unreadable`).\n */\nexport async function decodePdfQr(source: PdfSource, options: DecodePdfQrOptions = {}): Promise<string | null> {\n const opened = await openPdf(source, options)\n try {\n const last = opened.doc.numPages\n const wanted = options.pages ?? [1, last]\n const pages = [...new Set(wanted)].filter((n) => n >= 1 && n <= last)\n for (const n of pages) {\n try {\n const page = await opened.doc.getPage(n)\n const found = await scan(page, options.scale ?? 2, options.decode)\n page.cleanup?.()\n if (found) return found\n } catch (err) {\n if (err instanceof IdentityDocumentError) throw err\n }\n }\n return null\n } finally {\n await opened.destroy()\n }\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -8,6 +8,8 @@ var StorefrontError = class extends Error {
|
|
|
8
8
|
field;
|
|
9
9
|
details;
|
|
10
10
|
url;
|
|
11
|
+
/** Scopes a `403 insufficient_scope` says the route needs (empty for any other error). */
|
|
12
|
+
requiredScopes;
|
|
11
13
|
constructor(init) {
|
|
12
14
|
super(init.message, init.cause === void 0 ? void 0 : { cause: init.cause });
|
|
13
15
|
this.status = init.status;
|
|
@@ -15,6 +17,7 @@ var StorefrontError = class extends Error {
|
|
|
15
17
|
this.field = init.field;
|
|
16
18
|
this.details = init.details;
|
|
17
19
|
this.url = init.url;
|
|
20
|
+
this.requiredScopes = init.requiredScopes ?? [];
|
|
18
21
|
}
|
|
19
22
|
/**
|
|
20
23
|
* Affected lines of a `409 insufficient_stock` (empty for any other error or a
|
|
@@ -27,7 +30,14 @@ var StorefrontError = class extends Error {
|
|
|
27
30
|
return lines.filter((l) => typeof l === "object" && l !== null && typeof l.sku === "string");
|
|
28
31
|
}
|
|
29
32
|
toJSON() {
|
|
30
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
name: this.name,
|
|
35
|
+
status: this.status,
|
|
36
|
+
code: this.code,
|
|
37
|
+
message: this.message,
|
|
38
|
+
field: this.field,
|
|
39
|
+
...this.requiredScopes.length ? { requiredScopes: this.requiredScopes } : {}
|
|
40
|
+
};
|
|
31
41
|
}
|
|
32
42
|
};
|
|
33
43
|
function isStorefrontError(err) {
|
|
@@ -169,6 +179,9 @@ function linkSignals(signals) {
|
|
|
169
179
|
cleanup: () => listeners.forEach(([s, on]) => s.removeEventListener("abort", on))
|
|
170
180
|
};
|
|
171
181
|
}
|
|
182
|
+
function scopeList(raw) {
|
|
183
|
+
return Array.isArray(raw) ? raw.filter((s) => typeof s === "string" && s.length > 0) : [];
|
|
184
|
+
}
|
|
172
185
|
async function readError(res, url) {
|
|
173
186
|
let body;
|
|
174
187
|
try {
|
|
@@ -178,9 +191,13 @@ async function readError(res, url) {
|
|
|
178
191
|
body = void 0;
|
|
179
192
|
}
|
|
180
193
|
const e = body?.error;
|
|
194
|
+
const top = body;
|
|
195
|
+
const code = e?.code ?? (typeof top?.code === "string" ? top.code : void 0);
|
|
196
|
+
const requiredScopes = code === "insufficient_scope" ? scopeList(e?.required_scopes ?? top?.required_scopes ?? e?.details?.required_scopes) : [];
|
|
181
197
|
return new StorefrontError({
|
|
182
198
|
status: res.status,
|
|
183
|
-
code:
|
|
199
|
+
code: code ?? defaultCodeForStatus(res.status),
|
|
200
|
+
...requiredScopes.length ? { requiredScopes } : {},
|
|
184
201
|
message: e?.message ?? `Storefront API responded ${res.status}${res.statusText ? " " + res.statusText : ""}`,
|
|
185
202
|
...e?.field ? { field: e.field } : {},
|
|
186
203
|
...e?.details !== void 0 ? { details: e.details } : {},
|
|
@@ -190,8 +207,14 @@ async function readError(res, url) {
|
|
|
190
207
|
function createStorefrontClient(config) {
|
|
191
208
|
if (!config.baseUrl) throw new TypeError("createStorefrontClient: baseUrl is required");
|
|
192
209
|
if (!config.token) throw new TypeError("createStorefrontClient: token is required");
|
|
210
|
+
const currentToken = () => {
|
|
211
|
+
const t = typeof config.token === "function" ? config.token() : config.token;
|
|
212
|
+
if (!t) throw new StorefrontError({ status: 0, code: "unauthorized", message: "Storefront token is empty (token source returned nothing)" });
|
|
213
|
+
return t;
|
|
214
|
+
};
|
|
193
215
|
const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
194
|
-
|
|
216
|
+
const initialToken = typeof config.token === "string" ? config.token : "";
|
|
217
|
+
if (isBrowser && initialToken.startsWith("sk_")) {
|
|
195
218
|
console.warn("[@asteby/storefront] A private sk_ token is being used in a browser. Use a public pk_ token instead.");
|
|
196
219
|
}
|
|
197
220
|
async function request(spec) {
|
|
@@ -203,13 +226,14 @@ function createStorefrontClient(config) {
|
|
|
203
226
|
const url = joinUrl(config.baseUrl, spec.path) + (qs ? `?${qs}` : "");
|
|
204
227
|
const headers = new Headers(config.headers);
|
|
205
228
|
headers.set("Accept", "application/json");
|
|
206
|
-
|
|
229
|
+
const token = currentToken();
|
|
230
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
207
231
|
if (config.locale) headers.set("Accept-Language", config.locale);
|
|
208
232
|
if (config.domain) headers.set("X-Storefront-Domain", storefrontDomainHeader(config.domain, config.market));
|
|
209
233
|
const customerToken = options.customerToken !== void 0 ? options.customerToken : config.customerToken;
|
|
210
234
|
if (customerToken) headers.set("X-Customer-Token", customerToken);
|
|
211
235
|
const clientIp = options.clientIp !== void 0 ? options.clientIp : config.clientIp;
|
|
212
|
-
const ip = isTokenPublishable(
|
|
236
|
+
const ip = isTokenPublishable(token) ? void 0 : normalizeClientIp(clientIp);
|
|
213
237
|
if (ip) headers.set(CLIENT_IP_HEADER, ip);
|
|
214
238
|
if (options.idempotencyKey) headers.set("Idempotency-Key", options.idempotencyKey);
|
|
215
239
|
if (spec.body !== void 0) headers.set("Content-Type", "application/json");
|
|
@@ -274,6 +298,17 @@ function createStorefrontClient(config) {
|
|
|
274
298
|
config: Object.freeze({ ...config }),
|
|
275
299
|
/** Low-level escape hatch: any route under `baseUrl`. */
|
|
276
300
|
request,
|
|
301
|
+
token: {
|
|
302
|
+
/**
|
|
303
|
+
* What the token in use is and can do (`GET {baseUrl}/_token`, a gateway route, not a `/storefront` one).
|
|
304
|
+
* Needs no scope, so it answers even when the token is under-provisioned: `missing_scopes` says what to repair.
|
|
305
|
+
*/
|
|
306
|
+
introspect: async (options) => {
|
|
307
|
+
const body = await get("/_token", void 0, options);
|
|
308
|
+
const env = body;
|
|
309
|
+
return typeof env?.success === "boolean" && env.data ? env.data : body;
|
|
310
|
+
}
|
|
311
|
+
},
|
|
277
312
|
/** Returns a new client that sends the given buyer session token. */
|
|
278
313
|
withCustomerToken(customerToken) {
|
|
279
314
|
return createStorefrontClient({ ...config, customerToken });
|
|
@@ -285,6 +320,12 @@ function createStorefrontClient(config) {
|
|
|
285
320
|
shop: {
|
|
286
321
|
get: (options) => get("/storefront/shop", void 0, options)
|
|
287
322
|
},
|
|
323
|
+
/**
|
|
324
|
+
* How the market formats, taxes, addresses and invoices (`fiscal_id` carries the tax-id pattern, the regimes,
|
|
325
|
+
* the invoice uses and the identity documents the buyer can upload). Cacheable; `null` when the organization
|
|
326
|
+
* has no region configured.
|
|
327
|
+
*/
|
|
328
|
+
region: (options) => getOrNull("/storefront/region", void 0, options),
|
|
288
329
|
products: {
|
|
289
330
|
list: (params, options) => get("/storefront/products", productListQuery(params), options),
|
|
290
331
|
/** `null` when the product does not exist or is unpublished. */
|
|
@@ -340,6 +381,13 @@ function createStorefrontClient(config) {
|
|
|
340
381
|
setDelivery: (id, delivery, options) => write("PUT", cartPath(id, "/delivery"), delivery, options),
|
|
341
382
|
/** Order note (up to 1000 characters). `null` or empty clears it. */
|
|
342
383
|
setNote: (id, note, options) => write("PUT", cartPath(id, "/note"), { note }, options),
|
|
384
|
+
/**
|
|
385
|
+
* Asks for an invoice for this cart (`null` or `{ requested: false }` withdraws it). The server validates the
|
|
386
|
+
* data against the region BEFORE any charge: `422` with `field: 'invoice.<field>'` (e.g. `invoice.tax_regime`)
|
|
387
|
+
* names what to fix. `409 already_checked_out` when the cart is already an order. Checkout uses it when
|
|
388
|
+
* `CheckoutInput.invoice` is omitted.
|
|
389
|
+
*/
|
|
390
|
+
setInvoice: (id, invoice, options) => write("PUT", cartPath(id, "/invoice"), invoice ?? { requested: false }, options),
|
|
343
391
|
/**
|
|
344
392
|
* Cross-sell suggestions: only sellable variants, with `unlocks` when adding one reaches the next
|
|
345
393
|
* discount tier. `first` 1-8 (default 4). `private, no-store`; ask on demand, not on every render.
|
|
@@ -401,6 +449,8 @@ function createStorefrontClient(config) {
|
|
|
401
449
|
/** Resets a forgotten password with the code from `requestOtp({ email })`. */
|
|
402
450
|
resetPassword: (input, options) => write("POST", "/storefront/customer/password/reset", input, options),
|
|
403
451
|
get: (options) => get("/storefront/customer", void 0, options),
|
|
452
|
+
/** Updates the profile and the saved fiscal data; `fiscal: null` deletes the latter. `422` with `field: 'fiscal.<field>'`. */
|
|
453
|
+
update: (input, options) => write("PATCH", "/storefront/customer", input, options),
|
|
404
454
|
orders: (params, options) => get("/storefront/customer/orders", params, options),
|
|
405
455
|
/** `null` when the order does not exist or belongs to someone else. */
|
|
406
456
|
order: (id, options) => getOrNull(`/storefront/customer/orders/${enc(id)}`, void 0, options),
|
|
@@ -432,6 +482,45 @@ function storefrontDomainHeader(domain, market) {
|
|
|
432
482
|
return code && /^[a-z0-9_-]{1,32}$/.test(code) ? `${host}#${code}` : host;
|
|
433
483
|
}
|
|
434
484
|
|
|
485
|
+
// src/diagnose.ts
|
|
486
|
+
function maskToken(token) {
|
|
487
|
+
if (!token) return "(sin token)";
|
|
488
|
+
const prefix = /^[a-z]{2}_/.exec(token)?.[0] ?? "";
|
|
489
|
+
return token.length <= prefix.length + 8 ? `${prefix}\u2026` : `${prefix}\u2026${token.slice(-4)}`;
|
|
490
|
+
}
|
|
491
|
+
function repairPath(connectionName) {
|
|
492
|
+
return `OPS \u2192 Conexiones y API \u2192 ${connectionName ?? "<conexi\xF3n>"} \u2192 Reparar permisos`;
|
|
493
|
+
}
|
|
494
|
+
async function diagnose(client, options = {}) {
|
|
495
|
+
const log = options.log ?? ((m) => console.warn(m));
|
|
496
|
+
const timeoutMs = options.timeoutMs ?? 3e3;
|
|
497
|
+
const raw = client.config.token;
|
|
498
|
+
let mask;
|
|
499
|
+
try {
|
|
500
|
+
mask = maskToken(typeof raw === "function" ? raw() : raw);
|
|
501
|
+
} catch {
|
|
502
|
+
mask = maskToken(null);
|
|
503
|
+
}
|
|
504
|
+
try {
|
|
505
|
+
const info = await client.token.introspect({ signal: AbortSignal.timeout(timeoutMs) });
|
|
506
|
+
const missing = Array.isArray(info?.missing_scopes) ? info.missing_scopes : [];
|
|
507
|
+
if (missing.length > 0) {
|
|
508
|
+
log(
|
|
509
|
+
`[@asteby/storefront] La credencial ${mask} no tiene permisos que la tienda necesita: ${missing.join(", ")}. Rep\xE1ralo en ${repairPath(options.connectionName)} (no hace falta cambiar la clave ni reiniciar).`
|
|
510
|
+
);
|
|
511
|
+
}
|
|
512
|
+
return info ?? null;
|
|
513
|
+
} catch (err) {
|
|
514
|
+
if (isStorefrontError(err) && err.status === 401) {
|
|
515
|
+
try {
|
|
516
|
+
log(`[@asteby/storefront] OPS rechaz\xF3 la credencial ${mask} (401): est\xE1 revocada o vencida. Vuelve a conectar la tienda en OPS \u2192 Conexiones y API.`);
|
|
517
|
+
} catch {
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
435
524
|
// src/availability.ts
|
|
436
525
|
var ES = {
|
|
437
526
|
"status.in_stock": "Disponible",
|
|
@@ -1170,6 +1259,7 @@ exports.declineMessage = declineMessage;
|
|
|
1170
1259
|
exports.declineMessageKey = declineMessageKey;
|
|
1171
1260
|
exports.deliveryInput = deliveryInput;
|
|
1172
1261
|
exports.deliveryNotices = deliveryNotices;
|
|
1262
|
+
exports.diagnose = diagnose;
|
|
1173
1263
|
exports.formatAvailabilityMessage = formatAvailabilityMessage;
|
|
1174
1264
|
exports.formatMoney = formatMoney;
|
|
1175
1265
|
exports.formatVoucherExpiry = formatVoucherExpiry;
|
|
@@ -1177,6 +1267,7 @@ exports.generateIdempotencyKey = generateIdempotencyKey;
|
|
|
1177
1267
|
exports.hreflangLinks = hreflangLinks;
|
|
1178
1268
|
exports.isStorefrontError = isStorefrontError;
|
|
1179
1269
|
exports.isTokenPublishable = isTokenPublishable;
|
|
1270
|
+
exports.maskToken = maskToken;
|
|
1180
1271
|
exports.negotiateLocale = negotiateLocale;
|
|
1181
1272
|
exports.normalizeClientIp = normalizeClientIp;
|
|
1182
1273
|
exports.normalizeNote = normalizeNote;
|
|
@@ -1192,6 +1283,7 @@ exports.productAvailability = productAvailability;
|
|
|
1192
1283
|
exports.productListQuery = productListQuery;
|
|
1193
1284
|
exports.promoProgressView = promoProgressView;
|
|
1194
1285
|
exports.promotionMessages = promotionMessages;
|
|
1286
|
+
exports.repairPath = repairPath;
|
|
1195
1287
|
exports.resolveAvailability = resolveAvailability;
|
|
1196
1288
|
exports.rewardLabel = rewardLabel;
|
|
1197
1289
|
exports.safeHttpsUrl = safeHttpsUrl;
|