@asteby/storefront 0.15.0 → 0.16.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/dist/cli.js +13 -1
- package/dist/fiscal-document.cjs +72 -8
- package/dist/fiscal-document.cjs.map +1 -1
- package/dist/fiscal-document.d.cts +34 -4
- package/dist/fiscal-document.d.ts +34 -4
- package/dist/fiscal-document.js +71 -9
- package/dist/fiscal-document.js.map +1 -1
- package/dist/index.cjs +12 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -3
- package/dist/index.d.ts +15 -3
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/mock.cjs +121 -1
- package/dist/mock.cjs.map +1 -1
- package/dist/mock.d.cts +3 -1
- package/dist/mock.d.ts +3 -1
- package/dist/mock.js +121 -1
- 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 +1 -1
- package/dist/node.js +1 -1
- package/dist/{types-cwXbVCwe.d.cts → types-C5nEQicj.d.cts} +52 -1
- package/dist/{types-CuamKhDe.d.ts → types-DSHzYSHU.d.ts} +52 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -492,6 +492,18 @@ function createStorefrontClient(config) {
|
|
|
492
492
|
}
|
|
493
493
|
return { filename: file.filename, content_type: file.content_type, content_base64: file.content_base64 };
|
|
494
494
|
},
|
|
495
|
+
/**
|
|
496
|
+
* Saved fiscal profiles of the buyer (contract 1.9, `capabilities().fiscal_profiles`). Personal data: private,
|
|
497
|
+
* never cached, never logged. `422` with `field: 'fiscal.<field>'` when the region rejects a value; `409` for a
|
|
498
|
+
* repeated tax id or past the limit; `404` for a profile that is not the buyer's.
|
|
499
|
+
*/
|
|
500
|
+
fiscalProfiles: {
|
|
501
|
+
list: async (options) => (await get("/storefront/customer/fiscal-profiles", void 0, { ...options, cache: "no-store" })).nodes,
|
|
502
|
+
create: (profile, options) => write("POST", "/storefront/customer/fiscal-profiles", profile, options),
|
|
503
|
+
update: (id, profile, options) => write("PATCH", `/storefront/customer/fiscal-profiles/${enc(id)}`, profile, options),
|
|
504
|
+
/** Physical delete (a profile leaves nothing behind). A saved default passes to another profile. */
|
|
505
|
+
delete: (id, options) => write("DELETE", `/storefront/customer/fiscal-profiles/${enc(id)}`, void 0, options)
|
|
506
|
+
},
|
|
495
507
|
addresses: {
|
|
496
508
|
list: (options) => get("/storefront/customer/addresses", void 0, options),
|
|
497
509
|
create: (address, options) => write("POST", "/storefront/customer/addresses", address, options),
|
|
@@ -532,7 +544,7 @@ function repairPath(connectionName) {
|
|
|
532
544
|
import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, statSync, unlinkSync, writeSync } from "fs";
|
|
533
545
|
import { dirname, join, resolve } from "path";
|
|
534
546
|
import { hostname } from "os";
|
|
535
|
-
var SDK_VERSION = true ? "0.
|
|
547
|
+
var SDK_VERSION = true ? "0.16.1" : "dev";
|
|
536
548
|
function writeFileAtomic(file, content, mode = 384) {
|
|
537
549
|
const dir = dirname(file);
|
|
538
550
|
mkdirSync(dir, { recursive: true });
|
package/dist/fiscal-document.cjs
CHANGED
|
@@ -589,16 +589,17 @@ function makeCanvas(width, height) {
|
|
|
589
589
|
}
|
|
590
590
|
return null;
|
|
591
591
|
}
|
|
592
|
-
async function
|
|
593
|
-
if (custom2) return await custom2(image) ?? null;
|
|
592
|
+
async function detectQrNative(source) {
|
|
594
593
|
const Detector = globalThis.BarcodeDetector;
|
|
595
|
-
if (Detector)
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
594
|
+
if (!Detector) return null;
|
|
595
|
+
try {
|
|
596
|
+
const found = await new Detector({ formats: ["qr_code"] }).detect(source);
|
|
597
|
+
return found[0]?.rawValue || null;
|
|
598
|
+
} catch {
|
|
599
|
+
return null;
|
|
601
600
|
}
|
|
601
|
+
}
|
|
602
|
+
async function decodeQrPixels(image) {
|
|
602
603
|
try {
|
|
603
604
|
const mod = await import('jsqr');
|
|
604
605
|
return mod.default(image.data, image.width, image.height)?.data ?? null;
|
|
@@ -606,6 +607,10 @@ async function decodeImage(image, canvas, custom2) {
|
|
|
606
607
|
return null;
|
|
607
608
|
}
|
|
608
609
|
}
|
|
610
|
+
async function decodeImage(image, canvas, custom2) {
|
|
611
|
+
if (custom2) return await custom2(image) ?? null;
|
|
612
|
+
return await detectQrNative(canvas) ?? await decodeQrPixels(image);
|
|
613
|
+
}
|
|
609
614
|
async function scan(page, scale, custom2) {
|
|
610
615
|
const viewport = page.getViewport({ scale });
|
|
611
616
|
const canvas = makeCanvas(Math.ceil(viewport.width), Math.ceil(viewport.height));
|
|
@@ -638,6 +643,64 @@ async function decodePdfQr(source, options = {}) {
|
|
|
638
643
|
}
|
|
639
644
|
}
|
|
640
645
|
|
|
646
|
+
// src/fiscal-document/image-qr.ts
|
|
647
|
+
var DEFAULT_IMAGE_MAX_SIDE = 1600;
|
|
648
|
+
var isBlob = (s) => typeof Blob !== "undefined" && s instanceof Blob;
|
|
649
|
+
var isPixels = (s) => typeof s === "object" && s !== null && "data" in s && "width" in s && "height" in s && !("getContext" in s) && !("videoWidth" in s);
|
|
650
|
+
function sizeOf2(source) {
|
|
651
|
+
const v = source;
|
|
652
|
+
if (typeof v.videoWidth === "number") return { width: v.videoWidth, height: v.videoHeight };
|
|
653
|
+
return { width: v.width, height: v.height };
|
|
654
|
+
}
|
|
655
|
+
async function decodeImageQr(source, options = {}) {
|
|
656
|
+
const { maxBytes = DEFAULT_MAX_BYTES, maxSide = DEFAULT_IMAGE_MAX_SIDE, decode, signal } = options;
|
|
657
|
+
if (isBlob(source)) {
|
|
658
|
+
if (source.size > maxBytes) throw new IdentityDocumentError("too_large", "The image is larger than allowed", { reason: "bytes" });
|
|
659
|
+
if (source.type && !source.type.startsWith("image/")) throw new IdentityDocumentError("not_image", "The file is not an image");
|
|
660
|
+
}
|
|
661
|
+
if (signal?.aborted) throw new IdentityDocumentError("unreadable", "Reading was cancelled", { reason: "aborted" });
|
|
662
|
+
let bitmap = null;
|
|
663
|
+
try {
|
|
664
|
+
let drawable = source;
|
|
665
|
+
if (isBlob(source)) {
|
|
666
|
+
const create = globalThis.createImageBitmap;
|
|
667
|
+
if (!create) throw new IdentityDocumentError("unreadable", "This browser cannot decode images", { reason: "unsupported" });
|
|
668
|
+
try {
|
|
669
|
+
bitmap = await create(source);
|
|
670
|
+
} catch (cause) {
|
|
671
|
+
throw new IdentityDocumentError("not_image", "The file could not be decoded as an image", { cause });
|
|
672
|
+
}
|
|
673
|
+
drawable = bitmap;
|
|
674
|
+
}
|
|
675
|
+
if (signal?.aborted) throw new IdentityDocumentError("unreadable", "Reading was cancelled", { reason: "aborted" });
|
|
676
|
+
if (!decode) {
|
|
677
|
+
const native = await detectQrNative(drawable);
|
|
678
|
+
if (native) return native;
|
|
679
|
+
}
|
|
680
|
+
let pixels = isPixels(drawable) ? drawable : null;
|
|
681
|
+
if (!pixels) {
|
|
682
|
+
const { width, height } = sizeOf2(drawable);
|
|
683
|
+
if (!width || !height) return null;
|
|
684
|
+
const k = Math.min(1, maxSide / Math.max(width, height));
|
|
685
|
+
const cw = Math.max(1, Math.round(width * k));
|
|
686
|
+
const ch = Math.max(1, Math.round(height * k));
|
|
687
|
+
const canvas = makeCanvas(cw, ch);
|
|
688
|
+
const ctx = canvas?.getContext("2d");
|
|
689
|
+
if (!canvas || !ctx) return null;
|
|
690
|
+
ctx.drawImage(drawable, 0, 0, cw, ch);
|
|
691
|
+
pixels = ctx.getImageData(0, 0, cw, ch);
|
|
692
|
+
}
|
|
693
|
+
if (decode) return await decode(pixels) ?? null;
|
|
694
|
+
return await decodeQrPixels(pixels);
|
|
695
|
+
} catch (err) {
|
|
696
|
+
if (err instanceof IdentityDocumentError) throw err;
|
|
697
|
+
return null;
|
|
698
|
+
} finally {
|
|
699
|
+
bitmap?.close?.();
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
exports.DEFAULT_IMAGE_MAX_SIDE = DEFAULT_IMAGE_MAX_SIDE;
|
|
641
704
|
exports.DEFAULT_MAX_BYTES = DEFAULT_MAX_BYTES;
|
|
642
705
|
exports.DEFAULT_MAX_PAGES = DEFAULT_MAX_PAGES;
|
|
643
706
|
exports.DEFAULT_TIMEOUT_MS = DEFAULT_TIMEOUT_MS;
|
|
@@ -646,6 +709,7 @@ exports.IdentityRulesError = IdentityRulesError;
|
|
|
646
709
|
exports.MAX_TEXT_LENGTH = MAX_TEXT_LENGTH;
|
|
647
710
|
exports.buildDocumentEvidence = buildDocumentEvidence;
|
|
648
711
|
exports.catalogsFromRegion = catalogsFromRegion;
|
|
712
|
+
exports.decodeImageQr = decodeImageQr;
|
|
649
713
|
exports.decodePdfQr = decodePdfQr;
|
|
650
714
|
exports.extractIdentityDocument = extractIdentityDocument;
|
|
651
715
|
exports.foldText = foldText;
|
|
@@ -1 +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.cjs","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"]}
|
|
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","../src/fiscal-document/image-qr.ts"],"names":["pages","custom","sizeOf"],"mappings":"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","file":"fiscal-document.cjs","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 /** `decodeImageQr`: the file is not an image (or a type the browser cannot decode). */\n | 'not_image'\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\nexport type CanvasLike = { width: number; height: number; getContext(kind: '2d'): unknown }\n\nexport function 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\ntype DetectorCtor = new (o: { formats: string[] }) => { detect(i: unknown): Promise<{ rawValue: string }[]> }\n\n/** The platform's QR detector on an image source (canvas, bitmap, video frame, `ImageData`). `null` when unavailable or nothing found. */\nexport async function detectQrNative(source: unknown): Promise<string | null> {\n const Detector = (globalThis as { BarcodeDetector?: DetectorCtor }).BarcodeDetector\n if (!Detector) return null\n try {\n const found = await new Detector({ formats: ['qr_code'] }).detect(source)\n return found[0]?.rawValue || null\n } catch {\n return null\n }\n}\n\n/** The optional `jsqr` package on raw pixels, loaded on demand. `null` when it is not installed or finds nothing. */\nexport async function decodeQrPixels(image: ImageData): Promise<string | null> {\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 decodeImage(image: ImageData, canvas: CanvasLike, custom?: DecodePdfQrOptions['decode']): Promise<string | null> {\n if (custom) return (await custom(image)) ?? null\n return (await detectQrNative(canvas)) ?? (await decodeQrPixels(image))\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","import { DEFAULT_MAX_BYTES } from './pdf.js'\nimport { IdentityDocumentError } from './errors.js'\nimport { decodeQrPixels, detectQrNative, makeCanvas, type CanvasLike } from './qr.js'\n\n/** Longest side, in pixels, the image is scaled DOWN to before reading it (never up). */\nexport const DEFAULT_IMAGE_MAX_SIDE = 1600\n\ntype Drawable = { width: number; height: number }\ntype VideoLike = { videoWidth: number; videoHeight: number; readyState?: number }\n\n/**\n * What `decodeImageQr` reads: a photo (`File`/`Blob`), a frame of the camera (`HTMLVideoElement`), a decoded\n * `ImageBitmap`, a canvas or raw pixels (`ImageData`).\n */\nexport type ImageQrSource = Blob | ImageData | ImageBitmap | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas\n\nexport type DecodeImageQrOptions = {\n /** Largest photo accepted, in bytes (the document spec's `max_bytes`). Default 5 MiB. */\n maxBytes?: number\n /** Longest side the image is scaled down to (default 1600). */\n maxSide?: number\n /** Your own decoder for the pixels (tests, or a server canvas). Returns the QR text or `null`. */\n decode?: (image: ImageData) => string | null | Promise<string | null>\n signal?: AbortSignal\n}\n\nconst isBlob = (s: unknown): s is Blob => typeof Blob !== 'undefined' && s instanceof Blob\nconst isPixels = (s: unknown): s is ImageData =>\n typeof s === 'object' && s !== null && 'data' in s && 'width' in s && 'height' in s && !('getContext' in s) && !('videoWidth' in s)\n\nfunction sizeOf(source: unknown): Drawable {\n const v = source as VideoLike & Drawable\n if (typeof v.videoWidth === 'number') return { width: v.videoWidth, height: v.videoHeight }\n return { width: v.width, height: v.height }\n}\n\n/**\n * Text of the QR code in a photo or camera frame (the document's validator URL), or `null` when there is none.\n * Pair it with `extractIdentityDocument('', spec, { qr })` to read what the QR carries (tax id and document id).\n *\n * Privacy: the image is read in memory and never leaves the device, is not stored and its metadata (EXIF, GPS) is\n * never read. A photo is scaled down to `maxSide` and decoded with the platform's `BarcodeDetector`, falling back to\n * the optional `jsqr` package (both loaded on demand, nothing in the main bundle). Anything that goes wrong while\n * decoding yields `null`; only an unusable file throws an `IdentityDocumentError` (`too_large`, `not_image`,\n * `unreadable`).\n */\nexport async function decodeImageQr(source: ImageQrSource, options: DecodeImageQrOptions = {}): Promise<string | null> {\n const { maxBytes = DEFAULT_MAX_BYTES, maxSide = DEFAULT_IMAGE_MAX_SIDE, decode, signal } = options\n if (isBlob(source)) {\n if (source.size > maxBytes) throw new IdentityDocumentError('too_large', 'The image is larger than allowed', { reason: 'bytes' })\n if (source.type && !source.type.startsWith('image/')) throw new IdentityDocumentError('not_image', 'The file is not an image')\n }\n if (signal?.aborted) throw new IdentityDocumentError('unreadable', 'Reading was cancelled', { reason: 'aborted' })\n\n let bitmap: ImageBitmap | null = null\n try {\n let drawable: unknown = source\n if (isBlob(source)) {\n const create = (globalThis as { createImageBitmap?: (b: Blob) => Promise<ImageBitmap> }).createImageBitmap\n if (!create) throw new IdentityDocumentError('unreadable', 'This browser cannot decode images', { reason: 'unsupported' })\n try {\n bitmap = await create(source)\n } catch (cause) {\n throw new IdentityDocumentError('not_image', 'The file could not be decoded as an image', { cause })\n }\n drawable = bitmap\n }\n if (signal?.aborted) throw new IdentityDocumentError('unreadable', 'Reading was cancelled', { reason: 'aborted' })\n\n // 1. The native detector reads the source as it is (camera frames: no copy, no canvas).\n if (!decode) {\n const native = await detectQrNative(drawable)\n if (native) return native\n }\n\n // 2. Pixels, scaled down to the limit.\n let pixels: ImageData | null = isPixels(drawable) ? drawable : null\n if (!pixels) {\n const { width, height } = sizeOf(drawable)\n if (!width || !height) return null\n const k = Math.min(1, maxSide / Math.max(width, height))\n const cw = Math.max(1, Math.round(width * k))\n const ch = Math.max(1, Math.round(height * k))\n const canvas: CanvasLike | null = makeCanvas(cw, ch)\n const ctx = canvas?.getContext('2d') as {\n drawImage(image: unknown, x: number, y: number, w: number, h: number): void\n getImageData(x: number, y: number, w: number, h: number): ImageData\n } | null\n if (!canvas || !ctx) return null\n ctx.drawImage(drawable, 0, 0, cw, ch)\n pixels = ctx.getImageData(0, 0, cw, ch)\n }\n if (decode) return ((await decode(pixels)) as string | null) ?? null\n return await decodeQrPixels(pixels)\n } catch (err) {\n if (err instanceof IdentityDocumentError) throw err\n return null\n } finally {\n bitmap?.close?.()\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { U as FiscalDocumentSource,
|
|
2
|
-
export {
|
|
1
|
+
import { U as FiscalDocumentSource, b9 as RegionFiscalEntry, a0 as IdentityDocumentSpec, T as FiscalDocumentEvidence, ba as RegionFiscalId, a2 as IdentityRulesV1 } from './types-C5nEQicj.cjs';
|
|
2
|
+
export { $ as IdentityCapture, a1 as IdentityFieldRule, a3 as IdentityStrategy } from './types-C5nEQicj.cjs';
|
|
3
3
|
import './geo.cjs';
|
|
4
4
|
|
|
5
5
|
/** A value read from a document: text, or the codes of a catalog (`multiple` fields). */
|
|
@@ -180,6 +180,34 @@ type DecodePdfQrOptions = ReadPdfOptions & {
|
|
|
180
180
|
*/
|
|
181
181
|
declare function decodePdfQr(source: PdfSource, options?: DecodePdfQrOptions): Promise<string | null>;
|
|
182
182
|
|
|
183
|
+
/** Longest side, in pixels, the image is scaled DOWN to before reading it (never up). */
|
|
184
|
+
declare const DEFAULT_IMAGE_MAX_SIDE = 1600;
|
|
185
|
+
/**
|
|
186
|
+
* What `decodeImageQr` reads: a photo (`File`/`Blob`), a frame of the camera (`HTMLVideoElement`), a decoded
|
|
187
|
+
* `ImageBitmap`, a canvas or raw pixels (`ImageData`).
|
|
188
|
+
*/
|
|
189
|
+
type ImageQrSource = Blob | ImageData | ImageBitmap | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;
|
|
190
|
+
type DecodeImageQrOptions = {
|
|
191
|
+
/** Largest photo accepted, in bytes (the document spec's `max_bytes`). Default 5 MiB. */
|
|
192
|
+
maxBytes?: number;
|
|
193
|
+
/** Longest side the image is scaled down to (default 1600). */
|
|
194
|
+
maxSide?: number;
|
|
195
|
+
/** Your own decoder for the pixels (tests, or a server canvas). Returns the QR text or `null`. */
|
|
196
|
+
decode?: (image: ImageData) => string | null | Promise<string | null>;
|
|
197
|
+
signal?: AbortSignal;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Text of the QR code in a photo or camera frame (the document's validator URL), or `null` when there is none.
|
|
201
|
+
* Pair it with `extractIdentityDocument('', spec, { qr })` to read what the QR carries (tax id and document id).
|
|
202
|
+
*
|
|
203
|
+
* Privacy: the image is read in memory and never leaves the device, is not stored and its metadata (EXIF, GPS) is
|
|
204
|
+
* never read. A photo is scaled down to `maxSide` and decoded with the platform's `BarcodeDetector`, falling back to
|
|
205
|
+
* the optional `jsqr` package (both loaded on demand, nothing in the main bundle). Anything that goes wrong while
|
|
206
|
+
* decoding yields `null`; only an unusable file throws an `IdentityDocumentError` (`too_large`, `not_image`,
|
|
207
|
+
* `unreadable`).
|
|
208
|
+
*/
|
|
209
|
+
declare function decodeImageQr(source: ImageQrSource, options?: DecodeImageQrOptions): Promise<string | null>;
|
|
210
|
+
|
|
183
211
|
type IdentityDocumentErrorCode =
|
|
184
212
|
/** Over `maxBytes`, or more than `maxPages` pages. */
|
|
185
213
|
'too_large'
|
|
@@ -190,7 +218,9 @@ type IdentityDocumentErrorCode =
|
|
|
190
218
|
/** A PDF without a text layer (a scan): ask for manual entry. */
|
|
191
219
|
| 'no_text'
|
|
192
220
|
/** Encrypted: it needs a password the buyer has not given. */
|
|
193
|
-
| 'password'
|
|
221
|
+
| 'password'
|
|
222
|
+
/** `decodeImageQr`: the file is not an image (or a type the browser cannot decode). */
|
|
223
|
+
| 'not_image';
|
|
194
224
|
/** Why a document could not be read. `code` is stable; `message` is for logs (English) and never holds document text. */
|
|
195
225
|
declare class IdentityDocumentError extends Error {
|
|
196
226
|
readonly name = "IdentityDocumentError";
|
|
@@ -212,4 +242,4 @@ declare function foldText(s: string): string;
|
|
|
212
242
|
/** Hex SHA-256 of the bytes (Web Crypto: browsers, Node 20+, edge runtimes). */
|
|
213
243
|
declare function sha256Hex(data: ArrayBuffer | Uint8Array): Promise<string>;
|
|
214
244
|
|
|
215
|
-
export { DEFAULT_MAX_BYTES, DEFAULT_MAX_PAGES, DEFAULT_TIMEOUT_MS, type DecodePdfQrOptions, type EvidenceInput, type ExtractOptions, type ExtractedValue, FiscalDocumentEvidence, type IdentityCatalogs, IdentityDocumentError, type IdentityDocumentErrorCode, IdentityDocumentSpec, type IdentityExtraction, type IdentityExtractorFn, IdentityRulesError, IdentityRulesV1, MAX_TEXT_LENGTH, type PdfSource, type PdfTextResult, type PdfjsLike, type ReadPdfOptions, buildDocumentEvidence, catalogsFromRegion, decodePdfQr, extractIdentityDocument, foldText, isIdentityDocumentError, readPdfText, registerIdentityExtractor, setPdfjsLoader, sha256Hex, validateRules };
|
|
245
|
+
export { DEFAULT_IMAGE_MAX_SIDE, DEFAULT_MAX_BYTES, DEFAULT_MAX_PAGES, DEFAULT_TIMEOUT_MS, type DecodeImageQrOptions, type DecodePdfQrOptions, type EvidenceInput, type ExtractOptions, type ExtractedValue, FiscalDocumentEvidence, type IdentityCatalogs, IdentityDocumentError, type IdentityDocumentErrorCode, IdentityDocumentSpec, type IdentityExtraction, type IdentityExtractorFn, IdentityRulesError, IdentityRulesV1, type ImageQrSource, MAX_TEXT_LENGTH, type PdfSource, type PdfTextResult, type PdfjsLike, type ReadPdfOptions, buildDocumentEvidence, catalogsFromRegion, decodeImageQr, decodePdfQr, extractIdentityDocument, foldText, isIdentityDocumentError, readPdfText, registerIdentityExtractor, setPdfjsLoader, sha256Hex, validateRules };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { U as FiscalDocumentSource,
|
|
2
|
-
export {
|
|
1
|
+
import { U as FiscalDocumentSource, b9 as RegionFiscalEntry, a0 as IdentityDocumentSpec, T as FiscalDocumentEvidence, ba as RegionFiscalId, a2 as IdentityRulesV1 } from './types-DSHzYSHU.js';
|
|
2
|
+
export { $ as IdentityCapture, a1 as IdentityFieldRule, a3 as IdentityStrategy } from './types-DSHzYSHU.js';
|
|
3
3
|
import './geo.js';
|
|
4
4
|
|
|
5
5
|
/** A value read from a document: text, or the codes of a catalog (`multiple` fields). */
|
|
@@ -180,6 +180,34 @@ type DecodePdfQrOptions = ReadPdfOptions & {
|
|
|
180
180
|
*/
|
|
181
181
|
declare function decodePdfQr(source: PdfSource, options?: DecodePdfQrOptions): Promise<string | null>;
|
|
182
182
|
|
|
183
|
+
/** Longest side, in pixels, the image is scaled DOWN to before reading it (never up). */
|
|
184
|
+
declare const DEFAULT_IMAGE_MAX_SIDE = 1600;
|
|
185
|
+
/**
|
|
186
|
+
* What `decodeImageQr` reads: a photo (`File`/`Blob`), a frame of the camera (`HTMLVideoElement`), a decoded
|
|
187
|
+
* `ImageBitmap`, a canvas or raw pixels (`ImageData`).
|
|
188
|
+
*/
|
|
189
|
+
type ImageQrSource = Blob | ImageData | ImageBitmap | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;
|
|
190
|
+
type DecodeImageQrOptions = {
|
|
191
|
+
/** Largest photo accepted, in bytes (the document spec's `max_bytes`). Default 5 MiB. */
|
|
192
|
+
maxBytes?: number;
|
|
193
|
+
/** Longest side the image is scaled down to (default 1600). */
|
|
194
|
+
maxSide?: number;
|
|
195
|
+
/** Your own decoder for the pixels (tests, or a server canvas). Returns the QR text or `null`. */
|
|
196
|
+
decode?: (image: ImageData) => string | null | Promise<string | null>;
|
|
197
|
+
signal?: AbortSignal;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Text of the QR code in a photo or camera frame (the document's validator URL), or `null` when there is none.
|
|
201
|
+
* Pair it with `extractIdentityDocument('', spec, { qr })` to read what the QR carries (tax id and document id).
|
|
202
|
+
*
|
|
203
|
+
* Privacy: the image is read in memory and never leaves the device, is not stored and its metadata (EXIF, GPS) is
|
|
204
|
+
* never read. A photo is scaled down to `maxSide` and decoded with the platform's `BarcodeDetector`, falling back to
|
|
205
|
+
* the optional `jsqr` package (both loaded on demand, nothing in the main bundle). Anything that goes wrong while
|
|
206
|
+
* decoding yields `null`; only an unusable file throws an `IdentityDocumentError` (`too_large`, `not_image`,
|
|
207
|
+
* `unreadable`).
|
|
208
|
+
*/
|
|
209
|
+
declare function decodeImageQr(source: ImageQrSource, options?: DecodeImageQrOptions): Promise<string | null>;
|
|
210
|
+
|
|
183
211
|
type IdentityDocumentErrorCode =
|
|
184
212
|
/** Over `maxBytes`, or more than `maxPages` pages. */
|
|
185
213
|
'too_large'
|
|
@@ -190,7 +218,9 @@ type IdentityDocumentErrorCode =
|
|
|
190
218
|
/** A PDF without a text layer (a scan): ask for manual entry. */
|
|
191
219
|
| 'no_text'
|
|
192
220
|
/** Encrypted: it needs a password the buyer has not given. */
|
|
193
|
-
| 'password'
|
|
221
|
+
| 'password'
|
|
222
|
+
/** `decodeImageQr`: the file is not an image (or a type the browser cannot decode). */
|
|
223
|
+
| 'not_image';
|
|
194
224
|
/** Why a document could not be read. `code` is stable; `message` is for logs (English) and never holds document text. */
|
|
195
225
|
declare class IdentityDocumentError extends Error {
|
|
196
226
|
readonly name = "IdentityDocumentError";
|
|
@@ -212,4 +242,4 @@ declare function foldText(s: string): string;
|
|
|
212
242
|
/** Hex SHA-256 of the bytes (Web Crypto: browsers, Node 20+, edge runtimes). */
|
|
213
243
|
declare function sha256Hex(data: ArrayBuffer | Uint8Array): Promise<string>;
|
|
214
244
|
|
|
215
|
-
export { DEFAULT_MAX_BYTES, DEFAULT_MAX_PAGES, DEFAULT_TIMEOUT_MS, type DecodePdfQrOptions, type EvidenceInput, type ExtractOptions, type ExtractedValue, FiscalDocumentEvidence, type IdentityCatalogs, IdentityDocumentError, type IdentityDocumentErrorCode, IdentityDocumentSpec, type IdentityExtraction, type IdentityExtractorFn, IdentityRulesError, IdentityRulesV1, MAX_TEXT_LENGTH, type PdfSource, type PdfTextResult, type PdfjsLike, type ReadPdfOptions, buildDocumentEvidence, catalogsFromRegion, decodePdfQr, extractIdentityDocument, foldText, isIdentityDocumentError, readPdfText, registerIdentityExtractor, setPdfjsLoader, sha256Hex, validateRules };
|
|
245
|
+
export { DEFAULT_IMAGE_MAX_SIDE, DEFAULT_MAX_BYTES, DEFAULT_MAX_PAGES, DEFAULT_TIMEOUT_MS, type DecodeImageQrOptions, type DecodePdfQrOptions, type EvidenceInput, type ExtractOptions, type ExtractedValue, FiscalDocumentEvidence, type IdentityCatalogs, IdentityDocumentError, type IdentityDocumentErrorCode, IdentityDocumentSpec, type IdentityExtraction, type IdentityExtractorFn, IdentityRulesError, IdentityRulesV1, type ImageQrSource, MAX_TEXT_LENGTH, type PdfSource, type PdfTextResult, type PdfjsLike, type ReadPdfOptions, buildDocumentEvidence, catalogsFromRegion, decodeImageQr, decodePdfQr, extractIdentityDocument, foldText, isIdentityDocumentError, readPdfText, registerIdentityExtractor, setPdfjsLoader, sha256Hex, validateRules };
|