vobi_document 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -6
- package/dist/blocks.cjs +100 -0
- package/dist/blocks.cjs.map +1 -0
- package/dist/blocks.d.cts +201 -0
- package/dist/blocks.d.ts +201 -0
- package/dist/blocks.js +7 -0
- package/dist/blocks.js.map +1 -0
- package/dist/catalogContext-DenbX-OW.d.cts +15 -0
- package/dist/catalogContext-HGMU-w_4.d.ts +15 -0
- package/dist/chunk-2EBYURIX.js +90 -0
- package/dist/chunk-2EBYURIX.js.map +1 -0
- package/dist/chunk-6GRYRVU5.js +824 -0
- package/dist/chunk-6GRYRVU5.js.map +1 -0
- package/dist/chunk-ABIEQHS2.js +159 -0
- package/dist/chunk-ABIEQHS2.js.map +1 -0
- package/dist/chunk-AQ5FAAP6.cjs +168 -0
- package/dist/chunk-AQ5FAAP6.cjs.map +1 -0
- package/dist/chunk-ERKU5FDV.cjs +407 -0
- package/dist/chunk-ERKU5FDV.cjs.map +1 -0
- package/dist/chunk-FKX46GKE.cjs +36 -0
- package/dist/chunk-FKX46GKE.cjs.map +1 -0
- package/dist/chunk-HMTCQOEV.js +1319 -0
- package/dist/chunk-HMTCQOEV.js.map +1 -0
- package/dist/chunk-IRFFN74K.cjs +89 -0
- package/dist/chunk-IRFFN74K.cjs.map +1 -0
- package/dist/chunk-IUDN2CGP.js +863 -0
- package/dist/chunk-IUDN2CGP.js.map +1 -0
- package/dist/chunk-JEVWEGSE.js +95 -0
- package/dist/chunk-JEVWEGSE.js.map +1 -0
- package/dist/chunk-KCZKC3OG.js +61 -0
- package/dist/chunk-KCZKC3OG.js.map +1 -0
- package/dist/chunk-KUB3TYG2.cjs +102 -0
- package/dist/chunk-KUB3TYG2.cjs.map +1 -0
- package/dist/chunk-L5FXGEKX.cjs +114 -0
- package/dist/chunk-L5FXGEKX.cjs.map +1 -0
- package/dist/chunk-LNBAFOVK.cjs +14 -0
- package/dist/chunk-LNBAFOVK.cjs.map +1 -0
- package/dist/chunk-M2TPAU2F.js +79 -0
- package/dist/chunk-M2TPAU2F.js.map +1 -0
- package/dist/chunk-MHTTFNK2.cjs +890 -0
- package/dist/chunk-MHTTFNK2.cjs.map +1 -0
- package/dist/chunk-NDHTMYPA.cjs +844 -0
- package/dist/chunk-NDHTMYPA.cjs.map +1 -0
- package/dist/chunk-PLQNNXS2.js +382 -0
- package/dist/chunk-PLQNNXS2.js.map +1 -0
- package/dist/chunk-QYBWIJXZ.js +98 -0
- package/dist/chunk-QYBWIJXZ.js.map +1 -0
- package/dist/chunk-U56KVTK5.cjs +68 -0
- package/dist/chunk-U56KVTK5.cjs.map +1 -0
- package/dist/chunk-X2BLERM5.cjs +1346 -0
- package/dist/chunk-X2BLERM5.cjs.map +1 -0
- package/dist/chunk-ZOJBDFKU.js +12 -0
- package/dist/chunk-ZOJBDFKU.js.map +1 -0
- package/dist/chunk-ZXWOZZXO.cjs +94 -0
- package/dist/chunk-ZXWOZZXO.cjs.map +1 -0
- package/dist/editor.cjs +60 -0
- package/dist/editor.cjs.map +1 -0
- package/dist/editor.d.cts +190 -0
- package/dist/editor.d.ts +190 -0
- package/dist/editor.js +7 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.cjs +412 -3753
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +72 -7892
- package/dist/index.d.ts +72 -7892
- package/dist/index.js +22 -3662
- package/dist/index.js.map +1 -1
- package/dist/messages-Bi0JxNIH.d.cts +23 -0
- package/dist/messages-Bi0JxNIH.d.ts +23 -0
- package/dist/print.cjs +354 -0
- package/dist/print.cjs.map +1 -0
- package/dist/print.d.cts +43 -0
- package/dist/print.d.ts +43 -0
- package/dist/print.js +336 -0
- package/dist/print.js.map +1 -0
- package/dist/puck.cjs +8 -8
- package/dist/puck.cjs.map +1 -1
- package/dist/render.cjs +72 -0
- package/dist/render.cjs.map +1 -0
- package/dist/render.d.cts +93 -0
- package/dist/render.d.ts +93 -0
- package/dist/render.js +7 -0
- package/dist/render.js.map +1 -0
- package/dist/theme-BuEFpQeZ.d.cts +112 -0
- package/dist/theme-BuEFpQeZ.d.ts +112 -0
- package/dist/types-BgIugNWW.d.cts +25 -0
- package/dist/types-BgIugNWW.d.ts +25 -0
- package/dist/types-CvKSS1Sy.d.cts +38 -0
- package/dist/types-CvKSS1Sy.d.ts +38 -0
- package/dist/variables.cjs +95 -0
- package/dist/variables.cjs.map +1 -0
- package/dist/variables.d.cts +74 -0
- package/dist/variables.d.ts +74 -0
- package/dist/variables.js +6 -0
- package/dist/variables.js.map +1 -0
- package/package.json +39 -8
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { extractBindingKeys } from './chunk-M2TPAU2F.js';
|
|
2
|
+
|
|
3
|
+
// src/variables/format.ts
|
|
4
|
+
var brl = new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL" });
|
|
5
|
+
var decimal = new Intl.NumberFormat("pt-BR");
|
|
6
|
+
var date = new Intl.DateTimeFormat("pt-BR");
|
|
7
|
+
function toNumber(value) {
|
|
8
|
+
const n = typeof value === "string" ? Number(value) : value;
|
|
9
|
+
return typeof n === "number" && Number.isFinite(n) ? n : null;
|
|
10
|
+
}
|
|
11
|
+
var DATE_ONLY = /^(\d{4})-(\d{2})-(\d{2})(?:T00:00(?::00(?:\.000)?)?Z)?$/;
|
|
12
|
+
var DIGITS = /\D/g;
|
|
13
|
+
var CPF = /^(\d{3})(\d{3})(\d{3})(\d{2})$/;
|
|
14
|
+
var CNPJ = /^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
|
|
15
|
+
var PHONE = /^(?:55)?(\d{2})(\d{4,5})(\d{4})$/;
|
|
16
|
+
var ZIPCODE = /^(\d{5})(\d{3})$/;
|
|
17
|
+
function toDate(raw) {
|
|
18
|
+
if (raw instanceof Date) return raw;
|
|
19
|
+
const match = DATE_ONLY.exec(String(raw));
|
|
20
|
+
if (match) return new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]));
|
|
21
|
+
return new Date(raw);
|
|
22
|
+
}
|
|
23
|
+
function toDocument(raw) {
|
|
24
|
+
const digits = raw.replace(DIGITS, "");
|
|
25
|
+
const cpf = CPF.exec(digits);
|
|
26
|
+
if (cpf) return `${cpf[1]}.${cpf[2]}.${cpf[3]}-${cpf[4]}`;
|
|
27
|
+
const cnpj = CNPJ.exec(digits);
|
|
28
|
+
if (cnpj) return `${cnpj[1]}.${cnpj[2]}.${cnpj[3]}/${cnpj[4]}-${cnpj[5]}`;
|
|
29
|
+
return raw;
|
|
30
|
+
}
|
|
31
|
+
function toPhone(raw) {
|
|
32
|
+
const match = PHONE.exec(raw.replace(DIGITS, ""));
|
|
33
|
+
return match ? `(${match[1]}) ${match[2]}-${match[3]}` : raw;
|
|
34
|
+
}
|
|
35
|
+
function toZipcode(raw) {
|
|
36
|
+
const match = ZIPCODE.exec(raw.replace(DIGITS, ""));
|
|
37
|
+
return match ? `${match[1]}-${match[2]}` : raw;
|
|
38
|
+
}
|
|
39
|
+
function formatValue(type, raw) {
|
|
40
|
+
if (raw === null || raw === void 0) return "";
|
|
41
|
+
switch (type) {
|
|
42
|
+
case "currency": {
|
|
43
|
+
const n = toNumber(raw);
|
|
44
|
+
return n === null ? "" : brl.format(n);
|
|
45
|
+
}
|
|
46
|
+
case "number": {
|
|
47
|
+
const n = toNumber(raw);
|
|
48
|
+
return n === null ? "" : decimal.format(n);
|
|
49
|
+
}
|
|
50
|
+
case "date": {
|
|
51
|
+
const d = toDate(raw);
|
|
52
|
+
return Number.isNaN(d.getTime()) ? "" : date.format(d);
|
|
53
|
+
}
|
|
54
|
+
case "document":
|
|
55
|
+
return toDocument(String(raw));
|
|
56
|
+
case "phone":
|
|
57
|
+
return toPhone(String(raw));
|
|
58
|
+
case "zipcode":
|
|
59
|
+
return toZipcode(String(raw));
|
|
60
|
+
case "boolean":
|
|
61
|
+
return raw ? "Sim" : "N\xE3o";
|
|
62
|
+
case "string":
|
|
63
|
+
default:
|
|
64
|
+
return String(raw);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/variables/resolve.ts
|
|
69
|
+
function formatResolvedValues(defs, raw) {
|
|
70
|
+
const resolved = {};
|
|
71
|
+
defs.forEach((def) => {
|
|
72
|
+
const value = def.key in raw ? raw[def.key] : def.default;
|
|
73
|
+
if (value === void 0 || value === null) return;
|
|
74
|
+
const formatted = formatValue(def.type, value);
|
|
75
|
+
if (formatted !== "") resolved[def.key] = formatted;
|
|
76
|
+
});
|
|
77
|
+
return resolved;
|
|
78
|
+
}
|
|
79
|
+
async function resolveDocumentVariables(node, catalog, resolver, ctx) {
|
|
80
|
+
const keys = extractBindingKeys(node);
|
|
81
|
+
if (keys.length === 0) return {};
|
|
82
|
+
const raw = await resolver(keys, ctx);
|
|
83
|
+
const byKey = new Map(catalog.map((def) => [def.key, def]));
|
|
84
|
+
const defs = keys.map((key) => byKey.get(key) ?? { key, label: key, type: "string", model: "outros" });
|
|
85
|
+
return formatResolvedValues(defs, raw);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { formatResolvedValues, formatValue, resolveDocumentVariables };
|
|
89
|
+
//# sourceMappingURL=chunk-2EBYURIX.js.map
|
|
90
|
+
//# sourceMappingURL=chunk-2EBYURIX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/variables/format.ts","../src/variables/resolve.ts"],"names":[],"mappings":";;;AAEA,IAAM,GAAA,GAAM,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,CAAA;AACjF,IAAM,OAAA,GAAU,IAAI,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAC7C,IAAM,IAAA,GAAO,IAAI,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAE5C,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,MAAM,IAAI,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA,GAAK,KAAA;AACvD,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,QAAA,CAAS,CAAC,IAAI,CAAA,GAAI,IAAA;AAC3D;AAGA,IAAM,SAAA,GAAY,yDAAA;AAElB,IAAM,MAAA,GAAS,KAAA;AACf,IAAM,GAAA,GAAM,gCAAA;AACZ,IAAM,IAAA,GAAO,uCAAA;AACb,IAAM,KAAA,GAAQ,kCAAA;AACd,IAAM,OAAA,GAAU,kBAAA;AAGhB,SAAS,OAAO,GAAA,EAAoB;AAClC,EAAA,IAAI,GAAA,YAAe,MAAM,OAAO,GAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AACxC,EAAA,IAAI,OAAO,OAAO,IAAI,KAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACnF,EAAA,OAAO,IAAI,KAAK,GAAa,CAAA;AAC/B;AAIA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC3B,EAAA,IAAI,KAAK,OAAO,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAC,IAAI,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC7B,EAAA,IAAI,IAAA,SAAa,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,IAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AACvE,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AAChD,EAAA,OAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,GAAA;AAC3D;AAEA,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AAClD,EAAA,OAAO,KAAA,GAAQ,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,GAAA;AAC7C;AAGO,SAAS,WAAA,CAAY,MAAoB,GAAA,EAAsB;AACpE,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,EAAA;AAE9C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,MAAA,OAAO,CAAA,KAAM,IAAA,GAAO,EAAA,GAAK,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IACvC;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,MAAA,OAAO,CAAA,KAAM,IAAA,GAAO,EAAA,GAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,IAC3C;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,MAAA,OAAO,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAAA,IACvD;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,UAAA,CAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC/B,KAAK,OAAA;AACH,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC5B,KAAK,SAAA;AACH,MAAA,OAAO,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC9B,KAAK,SAAA;AACH,MAAA,OAAO,MAAM,KAAA,GAAQ,QAAA;AAAA,IACvB,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA;AAEvB;;;ACvEO,SAAS,oBAAA,CAAqB,MAAqB,GAAA,EAAiD;AACzG,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAA,CAAK,QAAQ,CAAA,GAAA,KAAO;AAClB,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,IAAO,GAAA,GAAM,IAAI,GAAA,CAAI,GAAG,IAAI,GAAA,CAAI,OAAA;AAClD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAC7C,IAAA,IAAI,SAAA,KAAc,EAAA,EAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,GAAI,SAAA;AAAA,EAC5C,CAAC,CAAA;AACD,EAAA,OAAO,QAAA;AACT;AAGA,eAAsB,wBAAA,CACpB,IAAA,EACA,OAAA,EACA,QAAA,EACA,GAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,GAAO,mBAAmB,IAAI,CAAA;AACpC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE/B,EAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,GAAA,CAAI,GAAA,EAAK,GAAG,CAAC,CAAC,CAAA;AACxD,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,KAAA,CAAM,IAAI,GAAG,CAAA,IAAK,EAAE,GAAA,EAAK,OAAO,GAAA,EAAK,IAAA,EAAM,QAAA,EAAmB,KAAA,EAAO,UAAU,CAAA;AAC5G,EAAA,OAAO,oBAAA,CAAqB,MAAM,GAAG,CAAA;AACvC","file":"chunk-2EBYURIX.js","sourcesContent":["import type { VariableType } from './types';\n\nconst brl = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' });\nconst decimal = new Intl.NumberFormat('pt-BR');\nconst date = new Intl.DateTimeFormat('pt-BR');\n\nfunction toNumber(value: unknown): number | null {\n const n = typeof value === 'string' ? Number(value) : (value as number);\n return typeof n === 'number' && Number.isFinite(n) ? n : null;\n}\n\n// `YYYY-MM-DD` e o timestamp de meia-noite UTC que o Sequelize serializa para colunas DATE.\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T00:00(?::00(?:\\.000)?)?Z)?$/;\n\nconst DIGITS = /\\D/g;\nconst CPF = /^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/;\nconst CNPJ = /^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/;\nconst PHONE = /^(?:55)?(\\d{2})(\\d{4,5})(\\d{4})$/;\nconst ZIPCODE = /^(\\d{5})(\\d{3})$/;\n\n// Só-data é parseada como data LOCAL — new Date(string) seria UTC e voltaria um dia (docs/variables.md).\nfunction toDate(raw: unknown): Date {\n if (raw instanceof Date) return raw;\n const match = DATE_ONLY.exec(String(raw));\n if (match) return new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]));\n return new Date(raw as string);\n}\n\n// Documento e telefone chegam crus do banco, com ou sem máscara. Sem match, devolve o\n// valor original — melhor exibir o cru do que esconder o dado.\nfunction toDocument(raw: string): string {\n const digits = raw.replace(DIGITS, '');\n const cpf = CPF.exec(digits);\n if (cpf) return `${cpf[1]}.${cpf[2]}.${cpf[3]}-${cpf[4]}`;\n const cnpj = CNPJ.exec(digits);\n if (cnpj) return `${cnpj[1]}.${cnpj[2]}.${cnpj[3]}/${cnpj[4]}-${cnpj[5]}`;\n return raw;\n}\n\n// DDI 55 é descartado na máscara: telefone gravado com e sem DDI aparece igual.\nfunction toPhone(raw: string): string {\n const match = PHONE.exec(raw.replace(DIGITS, ''));\n return match ? `(${match[1]}) ${match[2]}-${match[3]}` : raw;\n}\n\nfunction toZipcode(raw: string): string {\n const match = ZIPCODE.exec(raw.replace(DIGITS, ''));\n return match ? `${match[1]}-${match[2]}` : raw;\n}\n\n/** Format a raw resolved value by its catalog type, pt-BR. preview == PDF. */\nexport function formatValue(type: VariableType, raw: unknown): string {\n if (raw === null || raw === undefined) return '';\n\n switch (type) {\n case 'currency': {\n const n = toNumber(raw);\n return n === null ? '' : brl.format(n);\n }\n case 'number': {\n const n = toNumber(raw);\n return n === null ? '' : decimal.format(n);\n }\n case 'date': {\n const d = toDate(raw);\n return Number.isNaN(d.getTime()) ? '' : date.format(d);\n }\n case 'document':\n return toDocument(String(raw));\n case 'phone':\n return toPhone(String(raw));\n case 'zipcode':\n return toZipcode(String(raw));\n case 'boolean':\n return raw ? 'Sim' : 'Não';\n case 'string':\n default:\n return String(raw);\n }\n}\n","import { extractBindingKeys } from './bindings';\nimport { formatValue } from './format';\nimport type { ResolvedVariables, VariableContext, VariableDef, VariableResolver } from './types';\n\n/**\n * Formata valores crus por tipo do catálogo. Keys sem valor ficam FORA do mapa\n * (`undefined` = \"não resolvida\" — ver docs/variables.md).\n */\nexport function formatResolvedValues(defs: VariableDef[], raw: Record<string, unknown>): ResolvedVariables {\n const resolved: ResolvedVariables = {};\n defs.forEach(def => {\n const value = def.key in raw ? raw[def.key] : def.default;\n if (value === undefined || value === null) return;\n const formatted = formatValue(def.type, value);\n if (formatted !== '') resolved[def.key] = formatted;\n });\n return resolved;\n}\n\n/** Resolve os bindings de `node` em strings pt-BR formatadas (preview == PDF). */\nexport async function resolveDocumentVariables(\n node: unknown,\n catalog: VariableDef[],\n resolver: VariableResolver,\n ctx: VariableContext\n): Promise<ResolvedVariables> {\n const keys = extractBindingKeys(node);\n if (keys.length === 0) return {};\n\n const raw = await resolver(keys, ctx);\n const byKey = new Map(catalog.map(def => [def.key, def]));\n const defs = keys.map(key => byKey.get(key) ?? { key, label: key, type: 'string' as const, model: 'outros' });\n return formatResolvedValues(defs, raw);\n}\n"]}
|