@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.
@@ -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 { name: this.name, status: this.status, code: this.code, message: this.message, field: this.field };
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: e?.code ?? defaultCodeForStatus(res.status),
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
- if (isBrowser && !isTokenPublishable(config.token) && config.token.startsWith("sk_")) {
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
- headers.set("Authorization", `Bearer ${config.token}`);
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(config.token) ? void 0 : normalizeClientIp(clientIp);
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;