create-email-renderer 0.1.1 → 0.3.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 +106 -2
- package/SKILL.md +217 -0
- package/dist/build.d.ts +52 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +169 -0
- package/dist/build.js.map +1 -0
- package/dist/default-blocks.d.ts.map +1 -1
- package/dist/default-blocks.js +377 -5
- package/dist/default-blocks.js.map +1 -1
- package/dist/html-render.d.ts +4 -2
- package/dist/html-render.d.ts.map +1 -1
- package/dist/html-render.js +758 -57
- package/dist/html-render.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/normalize.d.ts +10 -2
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +166 -38
- package/dist/normalize.js.map +1 -1
- package/dist/records.d.ts +13 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +93 -0
- package/dist/records.js.map +1 -0
- package/dist/registry.d.ts +35 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +31 -0
- package/dist/registry.js.map +1 -0
- package/dist/richtext.d.ts +6 -0
- package/dist/richtext.d.ts.map +1 -1
- package/dist/richtext.js +13 -0
- package/dist/richtext.js.map +1 -1
- package/dist/server.d.ts +4 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/tracking.d.ts +12 -0
- package/dist/tracking.d.ts.map +1 -0
- package/dist/tracking.js +78 -0
- package/dist/tracking.js.map +1 -0
- package/dist/types.d.ts +407 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +159 -0
- package/dist/types.js.map +1 -1
- package/docs/BLOCKS.md +530 -0
- package/docs/MCP.md +189 -0
- package/llms.txt +17 -0
- package/package.json +17 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BlockDefinition, EmailBlockProps, EmailContext, EmailPalette, EmailSettings } from "./types.js";
|
|
2
|
+
export interface BlockRenderInput<P = EmailBlockProps> {
|
|
3
|
+
props: P;
|
|
4
|
+
context: EmailContext;
|
|
5
|
+
palette: EmailPalette;
|
|
6
|
+
/**
|
|
7
|
+
* Ajustes globales del correo (puede ser parcial). El bloque `downloads` lee
|
|
8
|
+
* de aquí la lista de archivos subidos en Ajustes (`settings.files`); el resto
|
|
9
|
+
* de bloques lo ignoran.
|
|
10
|
+
*/
|
|
11
|
+
settings?: Partial<EmailSettings>;
|
|
12
|
+
}
|
|
13
|
+
export type BlockRenderHtml<P = EmailBlockProps> = (input: BlockRenderInput<P>) => string;
|
|
14
|
+
export type BlockNormalizeProps = (rawProps: unknown, definition: BlockDefinition) => EmailBlockProps;
|
|
15
|
+
export interface BlockRegistration<P = EmailBlockProps> {
|
|
16
|
+
definition: BlockDefinition;
|
|
17
|
+
renderHtml?: BlockRenderHtml<P>;
|
|
18
|
+
/** Normalización profunda opcional (arrays de objetos, hijos, etc.). */
|
|
19
|
+
normalizeProps?: BlockNormalizeProps;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Registra (o fusiona) un bloque. Si el `type` ya existe, se sobrescriben
|
|
23
|
+
* las claves presentes y se conserva el resto — permite registrar la
|
|
24
|
+
* definition primero y el renderer después (orden de import de builtins).
|
|
25
|
+
*/
|
|
26
|
+
export declare const registerBlock: <P = EmailBlockProps>(registration: BlockRegistration<P>) => void;
|
|
27
|
+
export declare const unregisterBlock: (type: string) => void;
|
|
28
|
+
export declare const getBlockRegistration: (type: string) => BlockRegistration | undefined;
|
|
29
|
+
export declare const getBlockRenderHtml: (type: string) => BlockRenderHtml | undefined;
|
|
30
|
+
export declare const getBlockNormalizeProps: (type: string) => BlockNormalizeProps | undefined;
|
|
31
|
+
/** Definitions en orden de registro (la paleta consume esto). */
|
|
32
|
+
export declare const listBlockDefinitions: () => BlockDefinition[];
|
|
33
|
+
/** Solo para tests: limpia registros no-built-in… en realidad todo el mapa. */
|
|
34
|
+
export declare const clearBlockRegistry: () => void;
|
|
35
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,eAAe;IACnD,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,eAAe,IAAI,CACjD,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KACvB,MAAM,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,eAAe,KACxB,eAAe,CAAC;AAErB,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,eAAe;IACpD,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAChC,wEAAwE;IACxE,cAAc,CAAC,EAAE,mBAAmB,CAAC;CACtC;AAMD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,GAAG,eAAe,EAC/C,cAAc,iBAAiB,CAAC,CAAC,CAAC,KACjC,IAWF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,IAE9C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,MAAM,MAAM,KACX,iBAAiB,GAAG,SAC8B,CAAC;AAEtD,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,KACX,eAAe,GAAG,SAC0C,CAAC;AAEhE,eAAO,MAAM,sBAAsB,GACjC,MAAM,MAAM,KACX,mBAAmB,GAAG,SAC8C,CAAC;AAExE,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,QAAO,eAAe,EACK,CAAC;AAE7D,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,QAAO,IAErC,CAAC"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const registry = new Map();
|
|
2
|
+
/**
|
|
3
|
+
* Registra (o fusiona) un bloque. Si el `type` ya existe, se sobrescriben
|
|
4
|
+
* las claves presentes y se conserva el resto — permite registrar la
|
|
5
|
+
* definition primero y el renderer después (orden de import de builtins).
|
|
6
|
+
*/
|
|
7
|
+
export const registerBlock = (registration) => {
|
|
8
|
+
const { definition } = registration;
|
|
9
|
+
if (!definition || typeof definition.type !== "string" || !definition.type) {
|
|
10
|
+
throw new Error("registerBlock: definition.type is required");
|
|
11
|
+
}
|
|
12
|
+
const existing = registry.get(definition.type);
|
|
13
|
+
registry.set(definition.type, {
|
|
14
|
+
...existing,
|
|
15
|
+
...registration,
|
|
16
|
+
definition,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
export const unregisterBlock = (type) => {
|
|
20
|
+
registry.delete(type);
|
|
21
|
+
};
|
|
22
|
+
export const getBlockRegistration = (type) => registry.get(type);
|
|
23
|
+
export const getBlockRenderHtml = (type) => registry.get(type)?.renderHtml;
|
|
24
|
+
export const getBlockNormalizeProps = (type) => registry.get(type)?.normalizeProps;
|
|
25
|
+
/** Definitions en orden de registro (la paleta consume esto). */
|
|
26
|
+
export const listBlockDefinitions = () => Array.from(registry.values()).map((reg) => reg.definition);
|
|
27
|
+
/** Solo para tests: limpia registros no-built-in… en realidad todo el mapa. */
|
|
28
|
+
export const clearBlockRegistry = () => {
|
|
29
|
+
registry.clear();
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AA2CA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,YAAkC,EAC5B,EAAE;IACR,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;IACpC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;QAC5B,GAAI,QAAmB;QACvB,GAAI,YAAuB;QAC3B,UAAU;KACW,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAQ,EAAE;IACpD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAY,EACmB,EAAE,CACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAkC,CAAC;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAY,EACiB,EAAE,CAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAyC,CAAC;AAEhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAAY,EACqB,EAAE,CACnC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,cAAiD,CAAC;AAExE,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAsB,EAAE,CAC1D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAE7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAS,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC"}
|
package/dist/richtext.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export declare const sanitizeRichText: (html: string) => string;
|
|
2
2
|
export declare const escapeHtml: (text: string) => string;
|
|
3
3
|
export declare const isRichText: (content: string) => boolean;
|
|
4
|
+
/**
|
|
5
|
+
* URLs que aceptamos en un enlace de descarga: `http`, `https` y `data:`
|
|
6
|
+
* (archivos pequeños embebidos). Todo lo demás (`javascript:`, `blob:`,
|
|
7
|
+
* `file:`, `vbscript:`) se descarta en normalize y en render.
|
|
8
|
+
*/
|
|
9
|
+
export declare const isSafeFileUrl: (url: unknown) => boolean;
|
|
4
10
|
export declare const normalizeBlockHtml: (html: string) => string;
|
|
5
11
|
export declare const renderRichText: (content: string) => string;
|
|
6
12
|
//# sourceMappingURL=richtext.d.ts.map
|
package/dist/richtext.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"richtext.d.ts","sourceRoot":"","sources":["../src/richtext.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAe5C,CAAC;AAEL,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAKd,CAAC;AAE7B,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,KAAG,OACT,CAAC;AAErC,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAKC,CAAC;AAmBpD,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAMhD,CAAC"}
|
|
1
|
+
{"version":3,"file":"richtext.d.ts","sourceRoot":"","sources":["../src/richtext.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAe5C,CAAC;AAEL,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAKd,CAAC;AAE7B,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,KAAG,OACT,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,OAAO,KAAG,OAK5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAKC,CAAC;AAmBpD,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAMhD,CAAC"}
|
package/dist/richtext.js
CHANGED
|
@@ -39,6 +39,19 @@ export const escapeHtml = (text) => text
|
|
|
39
39
|
.replace(/>/g, ">")
|
|
40
40
|
.replace(/"/g, """);
|
|
41
41
|
export const isRichText = (content) => /<\/?[a-z][\s\S]*>/i.test(content);
|
|
42
|
+
/**
|
|
43
|
+
* URLs que aceptamos en un enlace de descarga: `http`, `https` y `data:`
|
|
44
|
+
* (archivos pequeños embebidos). Todo lo demás (`javascript:`, `blob:`,
|
|
45
|
+
* `file:`, `vbscript:`) se descarta en normalize y en render.
|
|
46
|
+
*/
|
|
47
|
+
export const isSafeFileUrl = (url) => {
|
|
48
|
+
if (typeof url !== "string")
|
|
49
|
+
return false;
|
|
50
|
+
const value = url.trim();
|
|
51
|
+
if (!value)
|
|
52
|
+
return false;
|
|
53
|
+
return /^(https?:|data:)/i.test(value);
|
|
54
|
+
};
|
|
42
55
|
export const normalizeBlockHtml = (html) => html
|
|
43
56
|
.replace(/<div([^>]*)>/gi, "<p$1>")
|
|
44
57
|
.replace(/<\/div>/gi, "</p>")
|
package/dist/richtext.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"richtext.js","sourceRoot":"","sources":["../src/richtext.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,MAAM,SAAS,GAAG;IAChB,GAAG;IACH,IAAI;IACJ,QAAQ;IACR,GAAG;IACH,IAAI;IACJ,GAAG;IACH,GAAG;IACH,GAAG;IACH,KAAK;IACL,QAAQ;IACR,MAAM;IACN,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,YAAY;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE,CACvD,YAAY,CAAC,IAAI,EAAE;IACjB,WAAW,EAAE,SAAS;IACtB,iBAAiB,EAAE;QACjB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,CAAC;KAChB;IACD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC3C,aAAa,EAAE;QACb,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,EAAE;YACnC,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,0CAA0C;SAClD,CAAC;KACH;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CACjD,IAAI;KACD,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;KACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAW,EAAE,CACrD,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE,CACzD,IAAI;KACD,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC;KAClC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;KAC5B,OAAO,CAAC,iCAAiC,EAAE,eAAe,CAAC;KAC3D,OAAO,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AAEpD,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAU,EAAE,CACrD,IAAI;KACD,OAAO,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC/D,OAAO,CACN,sBAAsB,EACtB,8CAA8C,CAC/C;KACA,OAAO,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;KAC7D,OAAO,CACN,wBAAwB,EACxB,oFAAoF,CACrF;KACA,OAAO,CACN,8BAA8B,EAC9B,oFAAoF,CACrF,CAAC;AAEN,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,SAAS,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/C,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"richtext.js","sourceRoot":"","sources":["../src/richtext.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,MAAM,SAAS,GAAG;IAChB,GAAG;IACH,IAAI;IACJ,QAAQ;IACR,GAAG;IACH,IAAI;IACJ,GAAG;IACH,GAAG;IACH,GAAG;IACH,KAAK;IACL,QAAQ;IACR,MAAM;IACN,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,YAAY;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE,CACvD,YAAY,CAAC,IAAI,EAAE;IACjB,WAAW,EAAE,SAAS;IACtB,iBAAiB,EAAE;QACjB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,CAAC;KAChB;IACD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC3C,aAAa,EAAE;QACb,CAAC,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,EAAE;YACnC,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,0CAA0C;SAClD,CAAC;KACH;CACF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CACjD,IAAI;KACD,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;KACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAW,EAAE,CACrD,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAY,EAAW,EAAE;IACrD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE,CACzD,IAAI;KACD,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC;KAClC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;KAC5B,OAAO,CAAC,iCAAiC,EAAE,eAAe,CAAC;KAC3D,OAAO,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AAEpD,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAU,EAAE,CACrD,IAAI;KACD,OAAO,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC/D,OAAO,CACN,sBAAsB,EACtB,8CAA8C,CAC/C;KACA,OAAO,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;KAC7D,OAAO,CACN,wBAAwB,EACxB,oFAAoF,CACrF;KACA,OAAO,CACN,8BAA8B,EAC9B,oFAAoF,CACrF,CAAC;AAEN,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,SAAS,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/C,CAAC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EmailBlock, EmailContext, EmailPalette, EmailSettings } from "./types.js";
|
|
1
|
+
import type { EmailBlock, EmailContext, EmailPalette, EmailSettings, EmailTracking } from "./types.js";
|
|
2
2
|
export interface TemplatePayload {
|
|
3
3
|
content: EmailBlock[];
|
|
4
4
|
settings: Partial<EmailSettings>;
|
|
@@ -10,6 +10,8 @@ export interface RenderTemplateEmailOptions {
|
|
|
10
10
|
context?: EmailContext;
|
|
11
11
|
settings?: Partial<EmailSettings>;
|
|
12
12
|
palette?: EmailPalette;
|
|
13
|
+
/** Pixel de apertura y tracking de clics (opcional, por envío). */
|
|
14
|
+
tracking?: EmailTracking;
|
|
13
15
|
}
|
|
14
16
|
export interface RenderedTemplateEmail {
|
|
15
17
|
html: string;
|
|
@@ -19,6 +21,6 @@ export interface RenderedTemplateEmail {
|
|
|
19
21
|
* Helper para renderizar una plantilla completa desde su payload JSON.
|
|
20
22
|
* Uso: `const {html, subject} = await renderTemplateEmail({subject, payload, context})`
|
|
21
23
|
*/
|
|
22
|
-
export declare const renderTemplateEmail: ({ subject, payload, context, settings: overrideSettings, palette, }: RenderTemplateEmailOptions) => Promise<RenderedTemplateEmail>;
|
|
24
|
+
export declare const renderTemplateEmail: ({ subject, payload, context, settings: overrideSettings, palette, tracking, }: RenderTemplateEmailOptions) => Promise<RenderedTemplateEmail>;
|
|
23
25
|
export declare const buildTemplateContext: (base: EmailContext, extra?: Record<string, string | undefined | null>) => EmailContext;
|
|
24
26
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAC1C,eAgBF,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAC1C,eAgBF,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAU,+EAOvC,0BAA0B,KAAG,OAAO,CAAC,qBAAqB,CA0B5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,MAAM,YAAY,EAClB,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,KAChD,YAQF,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -26,7 +26,7 @@ export const parseTemplatePayload = (payload) => {
|
|
|
26
26
|
* Helper para renderizar una plantilla completa desde su payload JSON.
|
|
27
27
|
* Uso: `const {html, subject} = await renderTemplateEmail({subject, payload, context})`
|
|
28
28
|
*/
|
|
29
|
-
export const renderTemplateEmail = async ({ subject, payload, context = SAMPLE_CONTEXT, settings: overrideSettings, palette = DEFAULT_PALETTE, }) => {
|
|
29
|
+
export const renderTemplateEmail = async ({ subject, payload, context = SAMPLE_CONTEXT, settings: overrideSettings, palette = DEFAULT_PALETTE, tracking, }) => {
|
|
30
30
|
const mergedContext = {
|
|
31
31
|
...SAMPLE_CONTEXT,
|
|
32
32
|
...(context || {}),
|
|
@@ -42,6 +42,7 @@ export const renderTemplateEmail = async ({ subject, payload, context = SAMPLE_C
|
|
|
42
42
|
context: mergedContext,
|
|
43
43
|
settings: finalSettings,
|
|
44
44
|
palette,
|
|
45
|
+
tracking,
|
|
45
46
|
});
|
|
46
47
|
const resolvedSubject = resolveVariables(subject, mergedContext);
|
|
47
48
|
return { html, subject: resolvedSubject };
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,4EAA4E;AAC5E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,4EAA4E;AAC5E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQpE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAA2C,EAC1B,EAAE;IACnB,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAe,CAAC;QACvE,OAAO;YACL,mEAAmE;YACnE,sDAAsD;YACtD,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;YACzC,QAAQ,EAAE,MAAM,EAAE,QAAQ;gBACxB,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACpC,CAAC,CAAC,EAAE;SACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;AACH,CAAC,CAAC;AAiBF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,EACxC,OAAO,EACP,OAAO,EACP,OAAO,GAAG,cAAc,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAG,eAAe,EACzB,QAAQ,GACmB,EAAkC,EAAE;IAC/D,MAAM,aAAa,GAAiB;QAClC,GAAG,cAAc;QACjB,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACnB,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAEpE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,aAAa,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;IAEnE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;QACjC,MAAM;QACN,OAAO;QACP,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,aAAa;QACvB,OAAO;QACP,QAAQ;KACT,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAEjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAkB,EAClB,KAAiD,EACnC,EAAE;IAChB,MAAM,OAAO,GAAiB,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;gBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EmailContext, EmailTracking } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Aplica el trackeo al HTML: pixel de apertura antes de `</body>` y
|
|
4
|
+
* reescritura de los `<a href>` (según `clickUrl` / `utm` / `transformLink`).
|
|
5
|
+
*/
|
|
6
|
+
export declare const applyTracking: (html: string, tracking: EmailTracking | undefined, context: EmailContext) => string;
|
|
7
|
+
/**
|
|
8
|
+
* Exclusiones por defecto del click tracking: la baja y los esquemas que no
|
|
9
|
+
* son enlaces web nunca deben pasar por el tracker.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_TRACKING_EXCLUDE: string[];
|
|
12
|
+
//# sourceMappingURL=tracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8B9D;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,UAAU,aAAa,GAAG,SAAS,EACnC,SAAS,YAAY,KACpB,MAoCF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,UASpC,CAAC"}
|
package/dist/tracking.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Trackeo de correo (aperturas y clics) aplicado como post-proceso sobre el
|
|
2
|
+
// HTML ya generado: no toca los renderers de bloque ni los defaults, así que
|
|
3
|
+
// sin `tracking` la salida es byte-idéntica. Puro y tolerante: nunca lanza.
|
|
4
|
+
import { escapeHtml } from "./richtext.js";
|
|
5
|
+
import { resolveVariables } from "./variables.js";
|
|
6
|
+
/** Pixel 1×1 de apertura. */
|
|
7
|
+
const openPixel = (url) => `<img src="${escapeHtml(url)}" width="1" height="1" alt="" style="display:none;border:0;outline:none;" />`;
|
|
8
|
+
/** Hrefs que nunca se reescriben (baja, anclas, esquemas sin http). */
|
|
9
|
+
const isExcluded = (href, exclude) => href === "" ||
|
|
10
|
+
href.startsWith("#") ||
|
|
11
|
+
href.startsWith("{") ||
|
|
12
|
+
exclude.some((needle) => needle !== "" && href.includes(needle));
|
|
13
|
+
/** Añade (o sobreescribe) los UTM del destino. Si no es una URL válida, no toca nada. */
|
|
14
|
+
const withUtm = (href, utm) => {
|
|
15
|
+
if (!utm)
|
|
16
|
+
return href;
|
|
17
|
+
try {
|
|
18
|
+
const url = new URL(href);
|
|
19
|
+
for (const [key, value] of Object.entries(utm)) {
|
|
20
|
+
if (value != null && value !== "")
|
|
21
|
+
url.searchParams.set(`utm_${key}`, value);
|
|
22
|
+
}
|
|
23
|
+
return url.toString();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return href;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Aplica el trackeo al HTML: pixel de apertura antes de `</body>` y
|
|
31
|
+
* reescritura de los `<a href>` (según `clickUrl` / `utm` / `transformLink`).
|
|
32
|
+
*/
|
|
33
|
+
export const applyTracking = (html, tracking, context) => {
|
|
34
|
+
if (!tracking)
|
|
35
|
+
return html;
|
|
36
|
+
let out = html;
|
|
37
|
+
if (tracking.clickUrl || tracking.utm || tracking.transformLink) {
|
|
38
|
+
const exclude = [
|
|
39
|
+
...DEFAULT_TRACKING_EXCLUDE,
|
|
40
|
+
...(tracking.exclude ?? []),
|
|
41
|
+
];
|
|
42
|
+
out = out.replace(/<a\b[^>]*>/g, (tag) => tag.replace(/href="([^"]*)"/, (match, raw) => {
|
|
43
|
+
// En el atributo los `&` van escapados (`&`): se compara decodificado.
|
|
44
|
+
const href = raw.replace(/&/g, "&");
|
|
45
|
+
if (isExcluded(href, exclude))
|
|
46
|
+
return match;
|
|
47
|
+
const destination = withUtm(href, tracking.utm);
|
|
48
|
+
const wrapped = tracking.transformLink
|
|
49
|
+
? tracking.transformLink(destination)
|
|
50
|
+
: tracking.clickUrl
|
|
51
|
+
? resolveVariables(tracking.clickUrl, context).replace(/\{url\}/g, encodeURIComponent(destination))
|
|
52
|
+
: destination;
|
|
53
|
+
return `href="${escapeHtml(wrapped)}"`;
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
if (tracking.pixelUrl) {
|
|
57
|
+
const pixel = openPixel(resolveVariables(tracking.pixelUrl, context));
|
|
58
|
+
out = out.includes("</body>")
|
|
59
|
+
? out.replace("</body>", `${pixel}\n </body>`)
|
|
60
|
+
: `${out}${pixel}`;
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Exclusiones por defecto del click tracking: la baja y los esquemas que no
|
|
66
|
+
* son enlaces web nunca deben pasar por el tracker.
|
|
67
|
+
*/
|
|
68
|
+
export const DEFAULT_TRACKING_EXCLUDE = [
|
|
69
|
+
"mailto:",
|
|
70
|
+
"tel:",
|
|
71
|
+
"sms:",
|
|
72
|
+
"unsubscribe",
|
|
73
|
+
"/baja",
|
|
74
|
+
"optout",
|
|
75
|
+
"opt-out",
|
|
76
|
+
"darse-de-baja",
|
|
77
|
+
];
|
|
78
|
+
//# sourceMappingURL=tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracking.js","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"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"}
|