@dbx-tools/email 0.6.46 → 0.6.49

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.
@@ -21,7 +21,7 @@ export const MAX_ATTACHMENT_BYTES = 10_485_760;
21
21
  export const MAX_ATTACHMENTS_TOTAL_BYTES = 20_971_520;
22
22
  /** Largest number of attachments accepted on one message. */
23
23
  export const MAX_ATTACHMENT_COUNT = 20;
24
- /** Largest markdown body accepted, in characters. */
24
+ /** Largest email body accepted, in characters. */
25
25
  export const MAX_BODY_CHARS = 200_000;
26
26
  /** Execution settings for a send (SMTP dispatch or an outbox write). */
27
27
  export const EMAIL_SEND_SETTINGS = {
@@ -61,4 +61,4 @@ export const EMAIL_SENDERS_SETTINGS = {
61
61
  retry: { enabled: false },
62
62
  },
63
63
  };
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQXdCSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUV0QywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBRXhDLCtFQUErRTtBQUMvRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUM7QUFFL0MsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFVBQVUsQ0FBQztBQUV0RCw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRXZDLHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBRXRDLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBMkI7SUFDekQsT0FBTyxFQUFFO1FBQ1Asb0VBQW9FO1FBQ3BFLHlFQUF5RTtRQUN6RSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3pCLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsbUNBQW1DO1FBQ25DLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDekIsT0FBTyxFQUFFLGVBQWU7S0FDekI7Q0FDRixDQUFDO0FBRUYscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUEyQjtJQUMzRCxPQUFPLEVBQUU7UUFDUCx5RUFBeUU7UUFDekUsNkRBQTZEO1FBQzdELEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDekIseUVBQXlFO1FBQ3pFLHFFQUFxRTtRQUNyRSxnQ0FBZ0M7UUFDaEMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO1FBQ25ELE9BQU8sRUFBRSxpQkFBaUI7S0FDM0I7Q0FDRixDQUFDO0FBRUYsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUEyQjtJQUM1RCxPQUFPLEVBQUU7UUFDUCx3RUFBd0U7UUFDeEUsc0VBQXNFO1FBQ3RFLHNDQUFzQztRQUN0QyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3pCLDhEQUE4RDtRQUM5RCw2REFBNkQ7UUFDN0QsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtLQUMxQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyY2VwdG9yIGRlZmF1bHRzIGFuZCBoYXJkIHBheWxvYWQgY2FwcyBmb3IgdGhlIGVtYWlsIHBsdWdpbi5cbiAqXG4gKiBUaGUgZXhlY3V0aW9uIHNldHRpbmdzIGFyZSB3aGF0IHRoZSBydW50aW1lJ3MgZXhlY3V0b3IgaGFuZHNcbiAqIGBQbHVnaW4uZXhlY3V0ZSgpYCwga2VwdCBoZXJlIHJhdGhlciB0aGFuIGF0IHRoZSBjYWxsIHNpdGVzIHNvIHRoZVxuICogY2FjaGluZyAvIHJldHJ5IC8gdGltZW91dCBwb3N0dXJlIG9mIGV2ZXJ5IG91dGJvdW5kIG9wZXJhdGlvbiBpc1xuICogcmV2aWV3YWJsZSBpbiBvbmUgcGxhY2UuIFRoZSBjYXBzIGJvdW5kIHRoZSBvbmUgdW5ib3VuZGVkIGlucHV0IHRoZVxuICogcGx1Z2luIGFjY2VwdHM6IGEgbW9kZWwtZHJhZnRlZCBtZXNzYWdlIHdpdGggYXR0YWNobWVudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKlxuICogVGhlIGBQbHVnaW5FeGVjdXRlQ29uZmlnYCBzbGljZSB0aGlzIHBhY2thZ2Ugc2V0cy4gTWlycm9yZWQgc3RydWN0dXJhbGx5XG4gKiBiZWNhdXNlIEFwcEtpdCdzIGBQbHVnaW5FeGVjdXRlQ29uZmlnYCBsaXZlcyBiZWhpbmQgYSBzdWJwYXRoIGl0cyBgZXhwb3J0c2BcbiAqIG1hcCBkb2VzIG5vdCBwdWJsaXNoLCBzbyB0aGUgbm9taW5hbCB0eXBlIGNhbm5vdCBiZSBpbXBvcnRlZC4gV3JpdHRlbiBhcyBhXG4gKiB0eXBlIGFsaWFzIHJhdGhlciB0aGFuIGFuIGludGVyZmFjZSBzbyBpdCBzdGF5cyBhc3NpZ25hYmxlIHRvIHRoZSBub21pbmFsXG4gKiB0eXBlJ3MgaW5kZXggc2lnbmF0dXJlLlxuICovXG5leHBvcnQgdHlwZSBFbWFpbEV4ZWN1dGVDb25maWcgPSB7XG4gIGNhY2hlPzogeyBlbmFibGVkPzogYm9vbGVhbjsgdHRsPzogbnVtYmVyOyBjYWNoZUtleT86IChzdHJpbmcgfCBudW1iZXIgfCBvYmplY3QpW10gfTtcbiAgcmV0cnk/OiB7IGVuYWJsZWQ/OiBib29sZWFuOyBhdHRlbXB0cz86IG51bWJlcjsgaW5pdGlhbERlbGF5PzogbnVtYmVyOyBtYXhEZWxheT86IG51bWJlciB9O1xuICB0aW1lb3V0PzogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBUaGUgYFBsdWdpbkV4ZWN1dGlvblNldHRpbmdzYCBzaGFwZSBhY2NlcHRlZCBieSBBcHBLaXQncyBgUGx1Z2luLmV4ZWN1dGUoKWAuXG4gKiBNaXJyb3JlZCBzdHJ1Y3R1cmFsbHkgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB7QGxpbmsgRW1haWxFeGVjdXRlQ29uZmlnfS5cbiAqL1xuZXhwb3J0IHR5cGUgRW1haWxFeGVjdXRpb25TZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDogRW1haWxFeGVjdXRlQ29uZmlnO1xuICB1c2VyPzogRW1haWxFeGVjdXRlQ29uZmlnO1xufTtcblxuLyoqIENlaWxpbmcgb24gaG93IGxvbmcgYSBzaW5nbGUgU01UUCBjb252ZXJzYXRpb24gbWF5IHRha2UuICovXG5leHBvcnQgY29uc3QgU0VORF9USU1FT1VUX01TID0gMzBfMDAwO1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgU01UUCBoYW5kc2hha2UgcGVyZm9ybWVkIGF0IHBsdWdpbiBzZXR1cC4gKi9cbmV4cG9ydCBjb25zdCBWRVJJRllfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuLyoqIEF0dGVtcHRzIGFsbG93ZWQgZm9yIHRoZSBzZXR1cC10aW1lIFNNVFAgaGFuZHNoYWtlLCBpbmNsdWRpbmcgdGhlIGZpcnN0LiAqL1xuZXhwb3J0IGNvbnN0IFZFUklGWV9BVFRFTVBUUyA9IDM7XG5cbi8qKiBMYXJnZXN0IHNpbmdsZSBhdHRhY2htZW50IGFjY2VwdGVkLCBpbiBkZWNvZGVkIGJ5dGVzICgxMCBNaUIpLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9BVFRBQ0hNRU5UX0JZVEVTID0gMTBfNDg1Xzc2MDtcblxuLyoqIExhcmdlc3QgY29tYmluZWQgYXR0YWNobWVudCBwYXlsb2FkIGFjY2VwdGVkLCBpbiBkZWNvZGVkIGJ5dGVzICgyMCBNaUIpLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9BVFRBQ0hNRU5UU19UT1RBTF9CWVRFUyA9IDIwXzk3MV81MjA7XG5cbi8qKiBMYXJnZXN0IG51bWJlciBvZiBhdHRhY2htZW50cyBhY2NlcHRlZCBvbiBvbmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQVRUQUNITUVOVF9DT1VOVCA9IDIwO1xuXG4vKiogTGFyZ2VzdCBtYXJrZG93biBib2R5IGFjY2VwdGVkLCBpbiBjaGFyYWN0ZXJzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CT0RZX0NIQVJTID0gMjAwXzAwMDtcblxuLyoqIEV4ZWN1dGlvbiBzZXR0aW5ncyBmb3IgYSBzZW5kIChTTVRQIGRpc3BhdGNoIG9yIGFuIG91dGJveCB3cml0ZSkuICovXG5leHBvcnQgY29uc3QgRU1BSUxfU0VORF9TRVRUSU5HUzogRW1haWxFeGVjdXRpb25TZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDoge1xuICAgIC8vIENhY2hlIGRpc2FibGVkOiBhIHNlbmQgaXMgYSBzaWRlIGVmZmVjdCwgbm90IGEgdmFsdWUuIFJlcGxheWluZyBhXG4gICAgLy8gY2FjaGVkIHJlc3VsdCB3b3VsZCByZXBvcnQgc3VjY2VzcyBmb3IgYSBtZXNzYWdlIG5ldmVyIGhhbmRlZCB0byBTTVRQLlxuICAgIGNhY2hlOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgLy8gUmV0cnkgZGlzYWJsZWQ6IFNNVFAgZGVsaXZlcnkgaXMgbm90IGlkZW1wb3RlbnQuIEEgYHNlbmRNYWlsYCB0aGF0XG4gICAgLy8gdGltZXMgb3V0IG1heSBhbHJlYWR5IGhhdmUgcXVldWVkIHRoZSBtZXNzYWdlLCBzbyBhIHNlY29uZCBhdHRlbXB0XG4gICAgLy8gcmlza3MgZGVsaXZlcmluZyB0aGUgbWFpbCB0d2ljZS5cbiAgICByZXRyeTogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgIHRpbWVvdXQ6IFNFTkRfVElNRU9VVF9NUyxcbiAgfSxcbn07XG5cbi8qKiBFeGVjdXRpb24gc2V0dGluZ3MgZm9yIHRoZSBzZXR1cC10aW1lIFNNVFAgY29ubmVjdGl2aXR5IGNoZWNrLiAqL1xuZXhwb3J0IGNvbnN0IEVNQUlMX1ZFUklGWV9TRVRUSU5HUzogRW1haWxFeGVjdXRpb25TZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDoge1xuICAgIC8vIENhY2hlIGRpc2FibGVkOiBjb25uZWN0aXZpdHkgaXMgYSBwb2ludC1pbi10aW1lIGZhY3QgYWJvdXQgdGhlIHNlcnZlcixcbiAgICAvLyBhbmQgdGhpcyBydW5zIG9uY2UgcGVyIGJvb3QsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV1c2UuXG4gICAgY2FjaGU6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAvLyBSZXRyeSBlbmFibGVkOiB0aGUgaGFuZHNoYWtlIGhhcyBubyBzaWRlIGVmZmVjdCwgYW5kIGEgY29sZCBTTVRQIHJlbGF5XG4gICAgLy8gb3IgYSBzbG93IEROUyBhbnN3ZXIgYXQgYm9vdCBpcyBleGFjdGx5IHRoZSB0cmFuc2llbnQgZmFpbHVyZSB0aGF0XG4gICAgLy8gc2hvdWxkIG5vdCB0YWtlIHRoZSBhcHAgZG93bi5cbiAgICByZXRyeTogeyBlbmFibGVkOiB0cnVlLCBhdHRlbXB0czogVkVSSUZZX0FUVEVNUFRTIH0sXG4gICAgdGltZW91dDogVkVSSUZZX1RJTUVPVVRfTVMsXG4gIH0sXG59O1xuXG4vKiogRXhlY3V0aW9uIHNldHRpbmdzIGZvciB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwLiAqL1xuZXhwb3J0IGNvbnN0IEVNQUlMX1NFTkRFUlNfU0VUVElOR1M6IEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MgPSB7XG4gIGRlZmF1bHQ6IHtcbiAgICAvLyBDYWNoZSBkaXNhYmxlZDogdGhlIG9wdGlvbnMgYXJlIGNvbXB1dGVkIGZyb20gYWxyZWFkeS1yZXNvbHZlZCBjb25maWdcbiAgICAvLyBhbmQgdGhlIGNhbGxlcidzIG93biBhZGRyZXNzLCBzbyBhIGNhY2hlIHdvdWxkIGFkZCBhIGNyb3NzLWlkZW50aXR5XG4gICAgLy8gbGVhayByaXNrIGZvciBubyBtZWFzdXJhYmxlIHNhdmluZy5cbiAgICBjYWNoZTogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgIC8vIFJldHJ5IGRpc2FibGVkOiB0aGUgbG9va3VwIHBlcmZvcm1zIG5vIEkvTywgc28gYSBmYWlsdXJlIGlzXG4gICAgLy8gZGV0ZXJtaW5pc3RpYyBhbmQgYSBzZWNvbmQgYXR0ZW1wdCB3b3VsZCBmYWlsIGlkZW50aWNhbGx5LlxuICAgIHJldHJ5OiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gIH0sXG59O1xuIl19
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQXdCSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUV0QywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBRXhDLCtFQUErRTtBQUMvRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUM7QUFFL0MsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFVBQVUsQ0FBQztBQUV0RCw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRXZDLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBRXRDLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBMkI7SUFDekQsT0FBTyxFQUFFO1FBQ1Asb0VBQW9FO1FBQ3BFLHlFQUF5RTtRQUN6RSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3pCLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsbUNBQW1DO1FBQ25DLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDekIsT0FBTyxFQUFFLGVBQWU7S0FDekI7Q0FDRixDQUFDO0FBRUYscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUEyQjtJQUMzRCxPQUFPLEVBQUU7UUFDUCx5RUFBeUU7UUFDekUsNkRBQTZEO1FBQzdELEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDekIseUVBQXlFO1FBQ3pFLHFFQUFxRTtRQUNyRSxnQ0FBZ0M7UUFDaEMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO1FBQ25ELE9BQU8sRUFBRSxpQkFBaUI7S0FDM0I7Q0FDRixDQUFDO0FBRUYsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUEyQjtJQUM1RCxPQUFPLEVBQUU7UUFDUCx3RUFBd0U7UUFDeEUsc0VBQXNFO1FBQ3RFLHNDQUFzQztRQUN0QyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3pCLDhEQUE4RDtRQUM5RCw2REFBNkQ7UUFDN0QsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtLQUMxQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyY2VwdG9yIGRlZmF1bHRzIGFuZCBoYXJkIHBheWxvYWQgY2FwcyBmb3IgdGhlIGVtYWlsIHBsdWdpbi5cbiAqXG4gKiBUaGUgZXhlY3V0aW9uIHNldHRpbmdzIGFyZSB3aGF0IHRoZSBydW50aW1lJ3MgZXhlY3V0b3IgaGFuZHNcbiAqIGBQbHVnaW4uZXhlY3V0ZSgpYCwga2VwdCBoZXJlIHJhdGhlciB0aGFuIGF0IHRoZSBjYWxsIHNpdGVzIHNvIHRoZVxuICogY2FjaGluZyAvIHJldHJ5IC8gdGltZW91dCBwb3N0dXJlIG9mIGV2ZXJ5IG91dGJvdW5kIG9wZXJhdGlvbiBpc1xuICogcmV2aWV3YWJsZSBpbiBvbmUgcGxhY2UuIFRoZSBjYXBzIGJvdW5kIHRoZSBvbmUgdW5ib3VuZGVkIGlucHV0IHRoZVxuICogcGx1Z2luIGFjY2VwdHM6IGEgbW9kZWwtZHJhZnRlZCBtZXNzYWdlIHdpdGggYXR0YWNobWVudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKlxuICogVGhlIGBQbHVnaW5FeGVjdXRlQ29uZmlnYCBzbGljZSB0aGlzIHBhY2thZ2Ugc2V0cy4gTWlycm9yZWQgc3RydWN0dXJhbGx5XG4gKiBiZWNhdXNlIEFwcEtpdCdzIGBQbHVnaW5FeGVjdXRlQ29uZmlnYCBsaXZlcyBiZWhpbmQgYSBzdWJwYXRoIGl0cyBgZXhwb3J0c2BcbiAqIG1hcCBkb2VzIG5vdCBwdWJsaXNoLCBzbyB0aGUgbm9taW5hbCB0eXBlIGNhbm5vdCBiZSBpbXBvcnRlZC4gV3JpdHRlbiBhcyBhXG4gKiB0eXBlIGFsaWFzIHJhdGhlciB0aGFuIGFuIGludGVyZmFjZSBzbyBpdCBzdGF5cyBhc3NpZ25hYmxlIHRvIHRoZSBub21pbmFsXG4gKiB0eXBlJ3MgaW5kZXggc2lnbmF0dXJlLlxuICovXG5leHBvcnQgdHlwZSBFbWFpbEV4ZWN1dGVDb25maWcgPSB7XG4gIGNhY2hlPzogeyBlbmFibGVkPzogYm9vbGVhbjsgdHRsPzogbnVtYmVyOyBjYWNoZUtleT86IChzdHJpbmcgfCBudW1iZXIgfCBvYmplY3QpW10gfTtcbiAgcmV0cnk/OiB7IGVuYWJsZWQ/OiBib29sZWFuOyBhdHRlbXB0cz86IG51bWJlcjsgaW5pdGlhbERlbGF5PzogbnVtYmVyOyBtYXhEZWxheT86IG51bWJlciB9O1xuICB0aW1lb3V0PzogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBUaGUgYFBsdWdpbkV4ZWN1dGlvblNldHRpbmdzYCBzaGFwZSBhY2NlcHRlZCBieSBBcHBLaXQncyBgUGx1Z2luLmV4ZWN1dGUoKWAuXG4gKiBNaXJyb3JlZCBzdHJ1Y3R1cmFsbHkgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB7QGxpbmsgRW1haWxFeGVjdXRlQ29uZmlnfS5cbiAqL1xuZXhwb3J0IHR5cGUgRW1haWxFeGVjdXRpb25TZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDogRW1haWxFeGVjdXRlQ29uZmlnO1xuICB1c2VyPzogRW1haWxFeGVjdXRlQ29uZmlnO1xufTtcblxuLyoqIENlaWxpbmcgb24gaG93IGxvbmcgYSBzaW5nbGUgU01UUCBjb252ZXJzYXRpb24gbWF5IHRha2UuICovXG5leHBvcnQgY29uc3QgU0VORF9USU1FT1VUX01TID0gMzBfMDAwO1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgU01UUCBoYW5kc2hha2UgcGVyZm9ybWVkIGF0IHBsdWdpbiBzZXR1cC4gKi9cbmV4cG9ydCBjb25zdCBWRVJJRllfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuLyoqIEF0dGVtcHRzIGFsbG93ZWQgZm9yIHRoZSBzZXR1cC10aW1lIFNNVFAgaGFuZHNoYWtlLCBpbmNsdWRpbmcgdGhlIGZpcnN0LiAqL1xuZXhwb3J0IGNvbnN0IFZFUklGWV9BVFRFTVBUUyA9IDM7XG5cbi8qKiBMYXJnZXN0IHNpbmdsZSBhdHRhY2htZW50IGFjY2VwdGVkLCBpbiBkZWNvZGVkIGJ5dGVzICgxMCBNaUIpLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9BVFRBQ0hNRU5UX0JZVEVTID0gMTBfNDg1Xzc2MDtcblxuLyoqIExhcmdlc3QgY29tYmluZWQgYXR0YWNobWVudCBwYXlsb2FkIGFjY2VwdGVkLCBpbiBkZWNvZGVkIGJ5dGVzICgyMCBNaUIpLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9BVFRBQ0hNRU5UU19UT1RBTF9CWVRFUyA9IDIwXzk3MV81MjA7XG5cbi8qKiBMYXJnZXN0IG51bWJlciBvZiBhdHRhY2htZW50cyBhY2NlcHRlZCBvbiBvbmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQVRUQUNITUVOVF9DT1VOVCA9IDIwO1xuXG4vKiogTGFyZ2VzdCBlbWFpbCBib2R5IGFjY2VwdGVkLCBpbiBjaGFyYWN0ZXJzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CT0RZX0NIQVJTID0gMjAwXzAwMDtcblxuLyoqIEV4ZWN1dGlvbiBzZXR0aW5ncyBmb3IgYSBzZW5kIChTTVRQIGRpc3BhdGNoIG9yIGFuIG91dGJveCB3cml0ZSkuICovXG5leHBvcnQgY29uc3QgRU1BSUxfU0VORF9TRVRUSU5HUzogRW1haWxFeGVjdXRpb25TZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDoge1xuICAgIC8vIENhY2hlIGRpc2FibGVkOiBhIHNlbmQgaXMgYSBzaWRlIGVmZmVjdCwgbm90IGEgdmFsdWUuIFJlcGxheWluZyBhXG4gICAgLy8gY2FjaGVkIHJlc3VsdCB3b3VsZCByZXBvcnQgc3VjY2VzcyBmb3IgYSBtZXNzYWdlIG5ldmVyIGhhbmRlZCB0byBTTVRQLlxuICAgIGNhY2hlOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgLy8gUmV0cnkgZGlzYWJsZWQ6IFNNVFAgZGVsaXZlcnkgaXMgbm90IGlkZW1wb3RlbnQuIEEgYHNlbmRNYWlsYCB0aGF0XG4gICAgLy8gdGltZXMgb3V0IG1heSBhbHJlYWR5IGhhdmUgcXVldWVkIHRoZSBtZXNzYWdlLCBzbyBhIHNlY29uZCBhdHRlbXB0XG4gICAgLy8gcmlza3MgZGVsaXZlcmluZyB0aGUgbWFpbCB0d2ljZS5cbiAgICByZXRyeTogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgIHRpbWVvdXQ6IFNFTkRfVElNRU9VVF9NUyxcbiAgfSxcbn07XG5cbi8qKiBFeGVjdXRpb24gc2V0dGluZ3MgZm9yIHRoZSBzZXR1cC10aW1lIFNNVFAgY29ubmVjdGl2aXR5IGNoZWNrLiAqL1xuZXhwb3J0IGNvbnN0IEVNQUlMX1ZFUklGWV9TRVRUSU5HUzogRW1haWxFeGVjdXRpb25TZXR0aW5ncyA9IHtcbiAgZGVmYXVsdDoge1xuICAgIC8vIENhY2hlIGRpc2FibGVkOiBjb25uZWN0aXZpdHkgaXMgYSBwb2ludC1pbi10aW1lIGZhY3QgYWJvdXQgdGhlIHNlcnZlcixcbiAgICAvLyBhbmQgdGhpcyBydW5zIG9uY2UgcGVyIGJvb3QsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV1c2UuXG4gICAgY2FjaGU6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAvLyBSZXRyeSBlbmFibGVkOiB0aGUgaGFuZHNoYWtlIGhhcyBubyBzaWRlIGVmZmVjdCwgYW5kIGEgY29sZCBTTVRQIHJlbGF5XG4gICAgLy8gb3IgYSBzbG93IEROUyBhbnN3ZXIgYXQgYm9vdCBpcyBleGFjdGx5IHRoZSB0cmFuc2llbnQgZmFpbHVyZSB0aGF0XG4gICAgLy8gc2hvdWxkIG5vdCB0YWtlIHRoZSBhcHAgZG93bi5cbiAgICByZXRyeTogeyBlbmFibGVkOiB0cnVlLCBhdHRlbXB0czogVkVSSUZZX0FUVEVNUFRTIH0sXG4gICAgdGltZW91dDogVkVSSUZZX1RJTUVPVVRfTVMsXG4gIH0sXG59O1xuXG4vKiogRXhlY3V0aW9uIHNldHRpbmdzIGZvciB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwLiAqL1xuZXhwb3J0IGNvbnN0IEVNQUlMX1NFTkRFUlNfU0VUVElOR1M6IEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MgPSB7XG4gIGRlZmF1bHQ6IHtcbiAgICAvLyBDYWNoZSBkaXNhYmxlZDogdGhlIG9wdGlvbnMgYXJlIGNvbXB1dGVkIGZyb20gYWxyZWFkeS1yZXNvbHZlZCBjb25maWdcbiAgICAvLyBhbmQgdGhlIGNhbGxlcidzIG93biBhZGRyZXNzLCBzbyBhIGNhY2hlIHdvdWxkIGFkZCBhIGNyb3NzLWlkZW50aXR5XG4gICAgLy8gbGVhayByaXNrIGZvciBubyBtZWFzdXJhYmxlIHNhdmluZy5cbiAgICBjYWNoZTogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgIC8vIFJldHJ5IGRpc2FibGVkOiB0aGUgbG9va3VwIHBlcmZvcm1zIG5vIEkvTywgc28gYSBmYWlsdXJlIGlzXG4gICAgLy8gZGV0ZXJtaW5pc3RpYyBhbmQgYSBzZWNvbmQgYXR0ZW1wdCB3b3VsZCBmYWlsIGlkZW50aWNhbGx5LlxuICAgIHJldHJ5OiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gIH0sXG59O1xuIl19
@@ -1,51 +1,16 @@
1
- /**
2
- * Email HTML assembly: render a markdown body into a branded, responsive
3
- * email layout and inline the stylesheet with `juice`.
4
- *
5
- * The layout is the classic email-safe pattern (a centered 600px
6
- * table-based container with a header band, content card, and optional
7
- * footer) - the same shape MJML emits, hand-built here because MJML's
8
- * toolchain pulls fast-moving browser-data deps (caniuse-lite,
9
- * baseline-browser-mapping) that are awkward to install behind a
10
- * locked-down registry. Inlining matters because real clients (Gmail,
11
- * Outlook) strip `<style>` blocks and ignore class selectors; the same
12
- * renderer feeds both the local outbox preview and the SMTP HTML part,
13
- * so a browser and an inbox show the same thing.
14
- *
15
- * Brand styling (accent color, font, header logo) is optional: pass an
16
- * {@link EmailBrand} to color the layout, or omit it for the neutral
17
- * default. Branding is inlined here because the browser UI's `[data-brand]`
18
- * CSS bridge can't reach an inbox (see `./brand`).
19
- *
20
- * @module
21
- */
1
+ /** Node rendering adapters for the shared React Email document. @module */
22
2
  import { string } from "@dbx-tools/shared-core";
23
- import type { EmailBrand } from "./brand.ts";
24
- /** Escape HTML-significant characters (re-exported from `@dbx-tools/shared-core`). */
3
+ import { type EmailDocumentProps } from "@dbx-tools/shared-email-template";
4
+ /** Escape HTML-significant characters (re-exported from shared-core). */
25
5
  export declare const escapeHtml: typeof string.escapeHtml;
26
- /** Options for {@link renderEmailHtml}. */
27
- export interface EmailHtmlOptions {
28
- /** Markdown body. Rendered to HTML, then wrapped in the layout. */
29
- body: string;
30
- /** Header-band title and document `<title>`. Defaults to "Message". */
31
- subject?: string;
32
- /**
33
- * Optional `[label, value]` envelope rows shown above the body (used
34
- * by the outbox preview; omitted for SMTP sends, where the mail client
35
- * shows the envelope itself).
36
- */
37
- headers?: ReadonlyArray<readonly [string, string]>;
38
- /** Optional small-print footer line. Omitted when unset. */
39
- footer?: string;
40
- /**
41
- * Optional brand styling for the layout (accent, font, header logo).
42
- * Omit for the neutral default palette.
43
- */
44
- brand?: EmailBrand;
45
- }
46
- /**
47
- * Render `body` (markdown) into a complete, style-inlined email document
48
- * using the responsive layout. When `opts.brand` is set its accent, font,
49
- * and logo style the layout; otherwise a neutral default palette is used.
50
- */
51
- export declare function renderEmailHtml(opts: EmailHtmlOptions): string;
6
+ /** Options accepted by the shared React Email document. */
7
+ export type EmailHtmlOptions = EmailDocumentProps;
8
+ /** Render a complete responsive React Email document. */
9
+ export declare function renderEmailHtml(options: EmailHtmlOptions): Promise<string>;
10
+ /** Render the same React Email document as its plain-text alternative. */
11
+ export declare function renderEmailText(options: EmailHtmlOptions): Promise<string>;
12
+ /** Render both MIME alternatives from one shared React Email component tree. */
13
+ export declare function renderEmail(options: EmailHtmlOptions): Promise<{
14
+ html: string;
15
+ text: string;
16
+ }>;
@@ -1,146 +1,25 @@
1
- /**
2
- * Email HTML assembly: render a markdown body into a branded, responsive
3
- * email layout and inline the stylesheet with `juice`.
4
- *
5
- * The layout is the classic email-safe pattern (a centered 600px
6
- * table-based container with a header band, content card, and optional
7
- * footer) - the same shape MJML emits, hand-built here because MJML's
8
- * toolchain pulls fast-moving browser-data deps (caniuse-lite,
9
- * baseline-browser-mapping) that are awkward to install behind a
10
- * locked-down registry. Inlining matters because real clients (Gmail,
11
- * Outlook) strip `<style>` blocks and ignore class selectors; the same
12
- * renderer feeds both the local outbox preview and the SMTP HTML part,
13
- * so a browser and an inbox show the same thing.
14
- *
15
- * Brand styling (accent color, font, header logo) is optional: pass an
16
- * {@link EmailBrand} to color the layout, or omit it for the neutral
17
- * default. Branding is inlined here because the browser UI's `[data-brand]`
18
- * CSS bridge can't reach an inbox (see `./brand`).
19
- *
20
- * @module
21
- */
1
+ /** Node rendering adapters for the shared React Email document. @module */
22
2
  import { string } from "@dbx-tools/shared-core";
23
- import juice from "juice";
24
- import { markdownToHtml } from "./markdown.js";
25
- /**
26
- * Rendered height of the header logo. Fixed rather than intrinsic because
27
- * mail clients ignore CSS sizing on an image without an `height` attribute.
28
- */
29
- const LOGO_HEIGHT_PX = 28;
30
- /** Neutral fallback styling when no brand is supplied. */
31
- const DEFAULT_BRAND = {
32
- accent: "#0b6bcb",
33
- onAccent: "#ffffff",
34
- fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif",
35
- };
36
- /** Escape HTML-significant characters (re-exported from `@dbx-tools/shared-core`). */
3
+ import { EmailDocument } from "@dbx-tools/shared-email-template";
4
+ import { render } from "@react-email/render";
5
+ import { createElement } from "react";
6
+ /** Escape HTML-significant characters (re-exported from shared-core). */
37
7
  export const escapeHtml = string.escapeHtml;
38
- /**
39
- * Content stylesheet inlined onto the markdown body (juice maps these
40
- * onto elements). Outer layout styling is written inline directly so it
41
- * survives even if inlining is skipped; the `@media` rule is preserved
42
- * by juice for clients that honor it. Parameterized by the resolved accent
43
- * so body links match the brand.
44
- */
45
- function contentCss(accent) {
46
- return `
47
- .email-body { font-size: 15px; line-height: 1.55; color: #1a1a1a; }
48
- .email-body p { margin: 0 0 1rem; }
49
- .email-body a { color: ${accent}; }
50
- .email-body h1, .email-body h2, .email-body h3 { margin: 1.4rem 0 0.6rem; line-height: 1.25; }
51
- .email-body ul, .email-body ol { margin: 0 0 1rem; padding-left: 1.4rem; }
52
- .email-body table { border-collapse: collapse; margin: 1rem 0; width: 100%; font-size: 14px; }
53
- .email-body th, .email-body td { border: 1px solid #d0d7de; padding: 6px 10px; text-align: left; }
54
- .email-body th { background: #f6f8fa; font-weight: 600; }
55
- .email-body code { background: #f1f3f5; padding: 2px 5px; border-radius: 4px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9em; }
56
- .email-body pre { background: #f1f3f5; padding: 12px; border-radius: 6px; overflow-x: auto; }
57
- .email-body pre code { background: none; padding: 0; }
58
- .email-body blockquote { margin: 1rem 0; padding: 0 1rem; color: #57606a; border-left: 3px solid #d0d7de; }
59
- .email-body img { max-width: 100%; height: auto; }
60
- .meta { border-collapse: collapse; font-size: 13px; margin-bottom: 4px; }
61
- .meta th { text-align: left; padding: 2px 12px 2px 0; vertical-align: top; color: #6b7280; font-weight: 600; white-space: nowrap; }
62
- .meta td { padding: 2px 0; color: #374151; }
63
- @media only screen and (max-width: 620px) {
64
- .container { width: 100% !important; }
65
- .gutter { padding-left: 20px !important; padding-right: 20px !important; }
66
- }`;
8
+ /** Render a complete responsive React Email document. */
9
+ export async function renderEmailHtml(options) {
10
+ return render(createElement(EmailDocument, options), { pretty: true });
67
11
  }
68
- /** Render the optional envelope-header table block. */
69
- function metaBlock(headers) {
70
- if (!headers || headers.length === 0)
71
- return "";
72
- const rows = headers
73
- .map(([label, value]) => `<tr><th>${escapeHtml(label)}</th><td>${escapeHtml(value)}</td></tr>`)
74
- .join("");
75
- return `<table role="presentation" class="meta"><tbody>${rows}</tbody></table>`;
12
+ /** Render the same React Email document as its plain-text alternative. */
13
+ export async function renderEmailText(options) {
14
+ return render(createElement(EmailDocument, options), { plainText: true });
76
15
  }
77
- /** Render the optional footer row. */
78
- function footerRow(footer) {
79
- if (!footer)
80
- return "";
81
- return `
82
- <tr>
83
- <td class="gutter" style="padding: 16px 32px; border-top: 1px solid #eaecef; color: #9aa0a6; font-size: 12px; line-height: 1.5;">
84
- ${escapeHtml(footer)}
85
- </td>
86
- </tr>`;
16
+ /** Render both MIME alternatives from one shared React Email component tree. */
17
+ export async function renderEmail(options) {
18
+ const element = createElement(EmailDocument, options);
19
+ const [html, text] = await Promise.all([
20
+ render(element, { pretty: true }),
21
+ render(element, { plainText: true }),
22
+ ]);
23
+ return { html, text };
87
24
  }
88
- /**
89
- * Render the header-band content: the brand logo (when the brand supplies a
90
- * renderable image) above the title, or just the title. The logo is capped
91
- * at {@link LOGO_HEIGHT_PX} and tinted implicitly by its own artwork; the
92
- * title always shows so the band is never empty.
93
- */
94
- function headerBand(title, brand, onAccent) {
95
- const logo = brand.logoUrl
96
- ? `<img src="${escapeHtml(brand.logoUrl)}" alt="${escapeHtml(brand.name ?? title)}" height="${LOGO_HEIGHT_PX}" style="height: ${LOGO_HEIGHT_PX}px; width: auto; display: block; margin-bottom: 8px;" />`
97
- : "";
98
- return `${logo}<span style="color: ${onAccent}; font-size: 18px; font-weight: 700; line-height: 1.3;">${escapeHtml(title)}</span>`;
99
- }
100
- /**
101
- * Render `body` (markdown) into a complete, style-inlined email document
102
- * using the responsive layout. When `opts.brand` is set its accent, font,
103
- * and logo style the layout; otherwise a neutral default palette is used.
104
- */
105
- export function renderEmailHtml(opts) {
106
- const title = opts.subject?.trim() || "Message";
107
- const accent = opts.brand?.accent ?? DEFAULT_BRAND.accent;
108
- const onAccent = opts.brand?.onAccent ?? DEFAULT_BRAND.onAccent;
109
- const fontFamily = opts.brand?.fontFamily ?? DEFAULT_BRAND.fontFamily;
110
- const brand = opts.brand ?? { accent, onAccent, fontFamily };
111
- const doc = `<!doctype html>
112
- <html lang="en">
113
- <head>
114
- <meta charset="utf-8" />
115
- <meta name="viewport" content="width=device-width, initial-scale=1" />
116
- <meta name="color-scheme" content="light only" />
117
- <title>${escapeHtml(title)}</title>
118
- <style>${contentCss(accent)}
119
- </style>
120
- </head>
121
- <body style="margin: 0; padding: 0; background-color: #f4f5f7; -webkit-text-size-adjust: 100%;">
122
- <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background-color: #f4f5f7;">
123
- <tr>
124
- <td align="center" style="padding: 24px 12px;">
125
- <table role="presentation" class="container" width="600" cellpadding="0" cellspacing="0" style="width: 600px; max-width: 100%; background-color: #ffffff; border-radius: 10px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.08); font-family: ${fontFamily};">
126
- <tr>
127
- <td class="gutter" style="padding: 20px 32px; background-color: ${accent};">
128
- ${headerBand(title, brand, onAccent)}
129
- </td>
130
- </tr>
131
- <tr>
132
- <td class="gutter" style="padding: 24px 32px 8px;">
133
- ${metaBlock(opts.headers)}
134
- <div class="email-body">${markdownToHtml(opts.body)}</div>
135
- </td>
136
- </tr>${footerRow(opts.footer)}
137
- </table>
138
- </td>
139
- </tr>
140
- </table>
141
- </body>
142
- </html>
143
- `;
144
- return juice(doc);
145
- }
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbWFpbC1odG1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFFMUIsMERBQTBEO0FBQzFELE1BQU0sYUFBYSxHQUFxRTtJQUN0RixNQUFNLEVBQUUsU0FBUztJQUNqQixRQUFRLEVBQUUsU0FBUztJQUNuQixVQUFVLEVBQUUsNkVBQTZFO0NBQzFGLENBQUM7QUFFRixzRkFBc0Y7QUFDdEYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFFNUM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVLENBQUMsTUFBYztJQUNoQyxPQUFPOzs7NkJBR29CLE1BQU07Ozs7Ozs7Ozs7Ozs7Ozs7O01BaUI3QixDQUFDO0FBQ1AsQ0FBQztBQXVCRCx1REFBdUQ7QUFDdkQsU0FBUyxTQUFTLENBQUMsT0FBb0M7SUFDckQsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNoRCxNQUFNLElBQUksR0FBRyxPQUFPO1NBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztTQUM5RixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDWixPQUFPLGtEQUFrRCxJQUFJLGtCQUFrQixDQUFDO0FBQ2xGLENBQUM7QUFFRCxzQ0FBc0M7QUFDdEMsU0FBUyxTQUFTLENBQUMsTUFBMEI7SUFDM0MsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QixPQUFPOzs7Z0JBR08sVUFBVSxDQUFDLE1BQU0sQ0FBQzs7Z0JBRWxCLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYSxFQUFFLEtBQWlCLEVBQUUsUUFBZ0I7SUFDcEUsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU87UUFDeEIsQ0FBQyxDQUFDLGFBQWEsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsYUFBYSxjQUFjLG9CQUFvQixjQUFjLDBEQUEwRDtRQUN4TSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsT0FBTyxHQUFHLElBQUksdUJBQXVCLFFBQVEsMkRBQTJELFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0FBQ3JJLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFzQjtJQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQztJQUN0RSxNQUFNLEtBQUssR0FBZSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUN6RSxNQUFNLEdBQUcsR0FBRzs7Ozs7O2FBTUQsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUNqQixVQUFVLENBQUMsTUFBTSxDQUFDOzs7Ozs7O2tRQU9tTyxVQUFVOztnRkFFNUwsTUFBTTtrQkFDcEUsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDOzs7OztrQkFLbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7MENBQ0MsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O21CQUVoRCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7OztDQU94QyxDQUFDO0lBQ0EsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1haWwgSFRNTCBhc3NlbWJseTogcmVuZGVyIGEgbWFya2Rvd24gYm9keSBpbnRvIGEgYnJhbmRlZCwgcmVzcG9uc2l2ZVxuICogZW1haWwgbGF5b3V0IGFuZCBpbmxpbmUgdGhlIHN0eWxlc2hlZXQgd2l0aCBganVpY2VgLlxuICpcbiAqIFRoZSBsYXlvdXQgaXMgdGhlIGNsYXNzaWMgZW1haWwtc2FmZSBwYXR0ZXJuIChhIGNlbnRlcmVkIDYwMHB4XG4gKiB0YWJsZS1iYXNlZCBjb250YWluZXIgd2l0aCBhIGhlYWRlciBiYW5kLCBjb250ZW50IGNhcmQsIGFuZCBvcHRpb25hbFxuICogZm9vdGVyKSAtIHRoZSBzYW1lIHNoYXBlIE1KTUwgZW1pdHMsIGhhbmQtYnVpbHQgaGVyZSBiZWNhdXNlIE1KTUwnc1xuICogdG9vbGNoYWluIHB1bGxzIGZhc3QtbW92aW5nIGJyb3dzZXItZGF0YSBkZXBzIChjYW5pdXNlLWxpdGUsXG4gKiBiYXNlbGluZS1icm93c2VyLW1hcHBpbmcpIHRoYXQgYXJlIGF3a3dhcmQgdG8gaW5zdGFsbCBiZWhpbmQgYVxuICogbG9ja2VkLWRvd24gcmVnaXN0cnkuIElubGluaW5nIG1hdHRlcnMgYmVjYXVzZSByZWFsIGNsaWVudHMgKEdtYWlsLFxuICogT3V0bG9vaykgc3RyaXAgYDxzdHlsZT5gIGJsb2NrcyBhbmQgaWdub3JlIGNsYXNzIHNlbGVjdG9yczsgdGhlIHNhbWVcbiAqIHJlbmRlcmVyIGZlZWRzIGJvdGggdGhlIGxvY2FsIG91dGJveCBwcmV2aWV3IGFuZCB0aGUgU01UUCBIVE1MIHBhcnQsXG4gKiBzbyBhIGJyb3dzZXIgYW5kIGFuIGluYm94IHNob3cgdGhlIHNhbWUgdGhpbmcuXG4gKlxuICogQnJhbmQgc3R5bGluZyAoYWNjZW50IGNvbG9yLCBmb250LCBoZWFkZXIgbG9nbykgaXMgb3B0aW9uYWw6IHBhc3MgYW5cbiAqIHtAbGluayBFbWFpbEJyYW5kfSB0byBjb2xvciB0aGUgbGF5b3V0LCBvciBvbWl0IGl0IGZvciB0aGUgbmV1dHJhbFxuICogZGVmYXVsdC4gQnJhbmRpbmcgaXMgaW5saW5lZCBoZXJlIGJlY2F1c2UgdGhlIGJyb3dzZXIgVUkncyBgW2RhdGEtYnJhbmRdYFxuICogQ1NTIGJyaWRnZSBjYW4ndCByZWFjaCBhbiBpbmJveCAoc2VlIGAuL2JyYW5kYCkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQganVpY2UgZnJvbSBcImp1aWNlXCI7XG5pbXBvcnQgdHlwZSB7IEVtYWlsQnJhbmQgfSBmcm9tIFwiLi9icmFuZC50c1wiO1xuaW1wb3J0IHsgbWFya2Rvd25Ub0h0bWwgfSBmcm9tIFwiLi9tYXJrZG93bi50c1wiO1xuXG4vKipcbiAqIFJlbmRlcmVkIGhlaWdodCBvZiB0aGUgaGVhZGVyIGxvZ28uIEZpeGVkIHJhdGhlciB0aGFuIGludHJpbnNpYyBiZWNhdXNlXG4gKiBtYWlsIGNsaWVudHMgaWdub3JlIENTUyBzaXppbmcgb24gYW4gaW1hZ2Ugd2l0aG91dCBhbiBgaGVpZ2h0YCBhdHRyaWJ1dGUuXG4gKi9cbmNvbnN0IExPR09fSEVJR0hUX1BYID0gMjg7XG5cbi8qKiBOZXV0cmFsIGZhbGxiYWNrIHN0eWxpbmcgd2hlbiBubyBicmFuZCBpcyBzdXBwbGllZC4gKi9cbmNvbnN0IERFRkFVTFRfQlJBTkQ6IFJlcXVpcmVkPFBpY2s8RW1haWxCcmFuZCwgXCJhY2NlbnRcIiB8IFwib25BY2NlbnRcIiB8IFwiZm9udEZhbWlseVwiPj4gPSB7XG4gIGFjY2VudDogXCIjMGI2YmNiXCIsXG4gIG9uQWNjZW50OiBcIiNmZmZmZmZcIixcbiAgZm9udEZhbWlseTogXCItYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWZcIixcbn07XG5cbi8qKiBFc2NhcGUgSFRNTC1zaWduaWZpY2FudCBjaGFyYWN0ZXJzIChyZS1leHBvcnRlZCBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCkuICovXG5leHBvcnQgY29uc3QgZXNjYXBlSHRtbCA9IHN0cmluZy5lc2NhcGVIdG1sO1xuXG4vKipcbiAqIENvbnRlbnQgc3R5bGVzaGVldCBpbmxpbmVkIG9udG8gdGhlIG1hcmtkb3duIGJvZHkgKGp1aWNlIG1hcHMgdGhlc2VcbiAqIG9udG8gZWxlbWVudHMpLiBPdXRlciBsYXlvdXQgc3R5bGluZyBpcyB3cml0dGVuIGlubGluZSBkaXJlY3RseSBzbyBpdFxuICogc3Vydml2ZXMgZXZlbiBpZiBpbmxpbmluZyBpcyBza2lwcGVkOyB0aGUgYEBtZWRpYWAgcnVsZSBpcyBwcmVzZXJ2ZWRcbiAqIGJ5IGp1aWNlIGZvciBjbGllbnRzIHRoYXQgaG9ub3IgaXQuIFBhcmFtZXRlcml6ZWQgYnkgdGhlIHJlc29sdmVkIGFjY2VudFxuICogc28gYm9keSBsaW5rcyBtYXRjaCB0aGUgYnJhbmQuXG4gKi9cbmZ1bmN0aW9uIGNvbnRlbnRDc3MoYWNjZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFxuICAgIC5lbWFpbC1ib2R5IHsgZm9udC1zaXplOiAxNXB4OyBsaW5lLWhlaWdodDogMS41NTsgY29sb3I6ICMxYTFhMWE7IH1cbiAgICAuZW1haWwtYm9keSBwIHsgbWFyZ2luOiAwIDAgMXJlbTsgfVxuICAgIC5lbWFpbC1ib2R5IGEgeyBjb2xvcjogJHthY2NlbnR9OyB9XG4gICAgLmVtYWlsLWJvZHkgaDEsIC5lbWFpbC1ib2R5IGgyLCAuZW1haWwtYm9keSBoMyB7IG1hcmdpbjogMS40cmVtIDAgMC42cmVtOyBsaW5lLWhlaWdodDogMS4yNTsgfVxuICAgIC5lbWFpbC1ib2R5IHVsLCAuZW1haWwtYm9keSBvbCB7IG1hcmdpbjogMCAwIDFyZW07IHBhZGRpbmctbGVmdDogMS40cmVtOyB9XG4gICAgLmVtYWlsLWJvZHkgdGFibGUgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46IDFyZW0gMDsgd2lkdGg6IDEwMCU7IGZvbnQtc2l6ZTogMTRweDsgfVxuICAgIC5lbWFpbC1ib2R5IHRoLCAuZW1haWwtYm9keSB0ZCB7IGJvcmRlcjogMXB4IHNvbGlkICNkMGQ3ZGU7IHBhZGRpbmc6IDZweCAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB9XG4gICAgLmVtYWlsLWJvZHkgdGggeyBiYWNrZ3JvdW5kOiAjZjZmOGZhOyBmb250LXdlaWdodDogNjAwOyB9XG4gICAgLmVtYWlsLWJvZHkgY29kZSB7IGJhY2tncm91bmQ6ICNmMWYzZjU7IHBhZGRpbmc6IDJweCA1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC45ZW07IH1cbiAgICAuZW1haWwtYm9keSBwcmUgeyBiYWNrZ3JvdW5kOiAjZjFmM2Y1OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IG92ZXJmbG93LXg6IGF1dG87IH1cbiAgICAuZW1haWwtYm9keSBwcmUgY29kZSB7IGJhY2tncm91bmQ6IG5vbmU7IHBhZGRpbmc6IDA7IH1cbiAgICAuZW1haWwtYm9keSBibG9ja3F1b3RlIHsgbWFyZ2luOiAxcmVtIDA7IHBhZGRpbmc6IDAgMXJlbTsgY29sb3I6ICM1NzYwNmE7IGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2QwZDdkZTsgfVxuICAgIC5lbWFpbC1ib2R5IGltZyB7IG1heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvOyB9XG4gICAgLm1ldGEgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbi1ib3R0b206IDRweDsgfVxuICAgIC5tZXRhIHRoIHsgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMnB4IDEycHggMnB4IDA7IHZlcnRpY2FsLWFsaWduOiB0b3A7IGNvbG9yOiAjNmI3MjgwOyBmb250LXdlaWdodDogNjAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XG4gICAgLm1ldGEgdGQgeyBwYWRkaW5nOiAycHggMDsgY29sb3I6ICMzNzQxNTE7IH1cbiAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDYyMHB4KSB7XG4gICAgICAuY29udGFpbmVyIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfVxuICAgICAgLmd1dHRlciB7IHBhZGRpbmctbGVmdDogMjBweCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAyMHB4ICFpbXBvcnRhbnQ7IH1cbiAgICB9YDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayByZW5kZXJFbWFpbEh0bWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbEh0bWxPcHRpb25zIHtcbiAgLyoqIE1hcmtkb3duIGJvZHkuIFJlbmRlcmVkIHRvIEhUTUwsIHRoZW4gd3JhcHBlZCBpbiB0aGUgbGF5b3V0LiAqL1xuICBib2R5OiBzdHJpbmc7XG4gIC8qKiBIZWFkZXItYmFuZCB0aXRsZSBhbmQgZG9jdW1lbnQgYDx0aXRsZT5gLiBEZWZhdWx0cyB0byBcIk1lc3NhZ2VcIi4gKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGBbbGFiZWwsIHZhbHVlXWAgZW52ZWxvcGUgcm93cyBzaG93biBhYm92ZSB0aGUgYm9keSAodXNlZFxuICAgKiBieSB0aGUgb3V0Ym94IHByZXZpZXc7IG9taXR0ZWQgZm9yIFNNVFAgc2VuZHMsIHdoZXJlIHRoZSBtYWlsIGNsaWVudFxuICAgKiBzaG93cyB0aGUgZW52ZWxvcGUgaXRzZWxmKS5cbiAgICovXG4gIGhlYWRlcnM/OiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+O1xuICAvKiogT3B0aW9uYWwgc21hbGwtcHJpbnQgZm9vdGVyIGxpbmUuIE9taXR0ZWQgd2hlbiB1bnNldC4gKi9cbiAgZm9vdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnJhbmQgc3R5bGluZyBmb3IgdGhlIGxheW91dCAoYWNjZW50LCBmb250LCBoZWFkZXIgbG9nbykuXG4gICAqIE9taXQgZm9yIHRoZSBuZXV0cmFsIGRlZmF1bHQgcGFsZXR0ZS5cbiAgICovXG4gIGJyYW5kPzogRW1haWxCcmFuZDtcbn1cblxuLyoqIFJlbmRlciB0aGUgb3B0aW9uYWwgZW52ZWxvcGUtaGVhZGVyIHRhYmxlIGJsb2NrLiAqL1xuZnVuY3Rpb24gbWV0YUJsb2NrKGhlYWRlcnM6IEVtYWlsSHRtbE9wdGlvbnNbXCJoZWFkZXJzXCJdKTogc3RyaW5nIHtcbiAgaWYgKCFoZWFkZXJzIHx8IGhlYWRlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgY29uc3Qgcm93cyA9IGhlYWRlcnNcbiAgICAubWFwKChbbGFiZWwsIHZhbHVlXSkgPT4gYDx0cj48dGg+JHtlc2NhcGVIdG1sKGxhYmVsKX08L3RoPjx0ZD4ke2VzY2FwZUh0bWwodmFsdWUpfTwvdGQ+PC90cj5gKVxuICAgIC5qb2luKFwiXCIpO1xuICByZXR1cm4gYDx0YWJsZSByb2xlPVwicHJlc2VudGF0aW9uXCIgY2xhc3M9XCJtZXRhXCI+PHRib2R5PiR7cm93c308L3Rib2R5PjwvdGFibGU+YDtcbn1cblxuLyoqIFJlbmRlciB0aGUgb3B0aW9uYWwgZm9vdGVyIHJvdy4gKi9cbmZ1bmN0aW9uIGZvb3RlclJvdyhmb290ZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghZm9vdGVyKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGBcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJndXR0ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDE2cHggMzJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlYWVjZWY7IGNvbG9yOiAjOWFhMGE2OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxLjU7XCI+XG4gICAgICAgICAgICAgICR7ZXNjYXBlSHRtbChmb290ZXIpfVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPmA7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBoZWFkZXItYmFuZCBjb250ZW50OiB0aGUgYnJhbmQgbG9nbyAod2hlbiB0aGUgYnJhbmQgc3VwcGxpZXMgYVxuICogcmVuZGVyYWJsZSBpbWFnZSkgYWJvdmUgdGhlIHRpdGxlLCBvciBqdXN0IHRoZSB0aXRsZS4gVGhlIGxvZ28gaXMgY2FwcGVkXG4gKiBhdCB7QGxpbmsgTE9HT19IRUlHSFRfUFh9IGFuZCB0aW50ZWQgaW1wbGljaXRseSBieSBpdHMgb3duIGFydHdvcms7IHRoZVxuICogdGl0bGUgYWx3YXlzIHNob3dzIHNvIHRoZSBiYW5kIGlzIG5ldmVyIGVtcHR5LlxuICovXG5mdW5jdGlvbiBoZWFkZXJCYW5kKHRpdGxlOiBzdHJpbmcsIGJyYW5kOiBFbWFpbEJyYW5kLCBvbkFjY2VudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbG9nbyA9IGJyYW5kLmxvZ29VcmxcbiAgICA/IGA8aW1nIHNyYz1cIiR7ZXNjYXBlSHRtbChicmFuZC5sb2dvVXJsKX1cIiBhbHQ9XCIke2VzY2FwZUh0bWwoYnJhbmQubmFtZSA/PyB0aXRsZSl9XCIgaGVpZ2h0PVwiJHtMT0dPX0hFSUdIVF9QWH1cIiBzdHlsZT1cImhlaWdodDogJHtMT0dPX0hFSUdIVF9QWH1weDsgd2lkdGg6IGF1dG87IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA4cHg7XCIgLz5gXG4gICAgOiBcIlwiO1xuICByZXR1cm4gYCR7bG9nb308c3BhbiBzdHlsZT1cImNvbG9yOiAke29uQWNjZW50fTsgZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNzAwOyBsaW5lLWhlaWdodDogMS4zO1wiPiR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9zcGFuPmA7XG59XG5cbi8qKlxuICogUmVuZGVyIGBib2R5YCAobWFya2Rvd24pIGludG8gYSBjb21wbGV0ZSwgc3R5bGUtaW5saW5lZCBlbWFpbCBkb2N1bWVudFxuICogdXNpbmcgdGhlIHJlc3BvbnNpdmUgbGF5b3V0LiBXaGVuIGBvcHRzLmJyYW5kYCBpcyBzZXQgaXRzIGFjY2VudCwgZm9udCxcbiAqIGFuZCBsb2dvIHN0eWxlIHRoZSBsYXlvdXQ7IG90aGVyd2lzZSBhIG5ldXRyYWwgZGVmYXVsdCBwYWxldHRlIGlzIHVzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbWFpbEh0bWwob3B0czogRW1haWxIdG1sT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpdGxlID0gb3B0cy5zdWJqZWN0Py50cmltKCkgfHwgXCJNZXNzYWdlXCI7XG4gIGNvbnN0IGFjY2VudCA9IG9wdHMuYnJhbmQ/LmFjY2VudCA/PyBERUZBVUxUX0JSQU5ELmFjY2VudDtcbiAgY29uc3Qgb25BY2NlbnQgPSBvcHRzLmJyYW5kPy5vbkFjY2VudCA/PyBERUZBVUxUX0JSQU5ELm9uQWNjZW50O1xuICBjb25zdCBmb250RmFtaWx5ID0gb3B0cy5icmFuZD8uZm9udEZhbWlseSA/PyBERUZBVUxUX0JSQU5ELmZvbnRGYW1pbHk7XG4gIGNvbnN0IGJyYW5kOiBFbWFpbEJyYW5kID0gb3B0cy5icmFuZCA/PyB7IGFjY2VudCwgb25BY2NlbnQsIGZvbnRGYW1pbHkgfTtcbiAgY29uc3QgZG9jID0gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIgLz5cbiAgICA8bWV0YSBuYW1lPVwiY29sb3Itc2NoZW1lXCIgY29udGVudD1cImxpZ2h0IG9ubHlcIiAvPlxuICAgIDx0aXRsZT4ke2VzY2FwZUh0bWwodGl0bGUpfTwvdGl0bGU+XG4gICAgPHN0eWxlPiR7Y29udGVudENzcyhhY2NlbnQpfVxuICAgIDwvc3R5bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHkgc3R5bGU9XCJtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJhY2tncm91bmQtY29sb3I6ICNmNGY1Zjc7IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcIj5cbiAgICA8dGFibGUgcm9sZT1cInByZXNlbnRhdGlvblwiIHdpZHRoPVwiMTAwJVwiIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjVmNztcIj5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRkIGFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJwYWRkaW5nOiAyNHB4IDEycHg7XCI+XG4gICAgICAgICAgPHRhYmxlIHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cImNvbnRhaW5lclwiIHdpZHRoPVwiNjAwXCIgY2VsbHBhZGRpbmc9XCIwXCIgY2VsbHNwYWNpbmc9XCIwXCIgc3R5bGU9XCJ3aWR0aDogNjAwcHg7IG1heC13aWR0aDogMTAwJTsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgYm9yZGVyLXJhZGl1czogMTBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwwLDAsMC4wOCk7IGZvbnQtZmFtaWx5OiAke2ZvbnRGYW1pbHl9O1wiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJndXR0ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDIwcHggMzJweDsgYmFja2dyb3VuZC1jb2xvcjogJHthY2NlbnR9O1wiPlxuICAgICAgICAgICAgICAgICR7aGVhZGVyQmFuZCh0aXRsZSwgYnJhbmQsIG9uQWNjZW50KX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImd1dHRlclwiIHN0eWxlPVwicGFkZGluZzogMjRweCAzMnB4IDhweDtcIj5cbiAgICAgICAgICAgICAgICAke21ldGFCbG9jayhvcHRzLmhlYWRlcnMpfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbWFpbC1ib2R5XCI+JHttYXJrZG93blRvSHRtbChvcHRzLmJvZHkpfTwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj4ke2Zvb3RlclJvdyhvcHRzLmZvb3Rlcil9XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgPC90YWJsZT5cbiAgPC9ib2R5PlxuPC9odG1sPlxuYDtcbiAgcmV0dXJuIGp1aWNlKGRvYyk7XG59XG4iXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbWFpbC1odG1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJFQUEyRTtBQUMzRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV0Qyx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFLNUMseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQXlCO0lBQzdELE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQXlCO0lBQzdELE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixPQUF5QjtJQUV6QixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztLQUNyQyxDQUFDLENBQUM7SUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogTm9kZSByZW5kZXJpbmcgYWRhcHRlcnMgZm9yIHRoZSBzaGFyZWQgUmVhY3QgRW1haWwgZG9jdW1lbnQuIEBtb2R1bGUgKi9cbmltcG9ydCB7IHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBFbWFpbERvY3VtZW50LCB0eXBlIEVtYWlsRG9jdW1lbnRQcm9wcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbC10ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIkByZWFjdC1lbWFpbC9yZW5kZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqIEVzY2FwZSBIVE1MLXNpZ25pZmljYW50IGNoYXJhY3RlcnMgKHJlLWV4cG9ydGVkIGZyb20gc2hhcmVkLWNvcmUpLiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZUh0bWwgPSBzdHJpbmcuZXNjYXBlSHRtbDtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgdGhlIHNoYXJlZCBSZWFjdCBFbWFpbCBkb2N1bWVudC4gKi9cbmV4cG9ydCB0eXBlIEVtYWlsSHRtbE9wdGlvbnMgPSBFbWFpbERvY3VtZW50UHJvcHM7XG5cbi8qKiBSZW5kZXIgYSBjb21wbGV0ZSByZXNwb25zaXZlIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlckVtYWlsSHRtbChvcHRpb25zOiBFbWFpbEh0bWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIHJlbmRlcihjcmVhdGVFbGVtZW50KEVtYWlsRG9jdW1lbnQsIG9wdGlvbnMpLCB7IHByZXR0eTogdHJ1ZSB9KTtcbn1cblxuLyoqIFJlbmRlciB0aGUgc2FtZSBSZWFjdCBFbWFpbCBkb2N1bWVudCBhcyBpdHMgcGxhaW4tdGV4dCBhbHRlcm5hdGl2ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJFbWFpbFRleHQob3B0aW9uczogRW1haWxIdG1sT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiByZW5kZXIoY3JlYXRlRWxlbWVudChFbWFpbERvY3VtZW50LCBvcHRpb25zKSwgeyBwbGFpblRleHQ6IHRydWUgfSk7XG59XG5cbi8qKiBSZW5kZXIgYm90aCBNSU1FIGFsdGVybmF0aXZlcyBmcm9tIG9uZSBzaGFyZWQgUmVhY3QgRW1haWwgY29tcG9uZW50IHRyZWUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRW1haWwoXG4gIG9wdGlvbnM6IEVtYWlsSHRtbE9wdGlvbnMsXG4pOiBQcm9taXNlPHsgaHRtbDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfT4ge1xuICBjb25zdCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChFbWFpbERvY3VtZW50LCBvcHRpb25zKTtcbiAgY29uc3QgW2h0bWwsIHRleHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlbmRlcihlbGVtZW50LCB7IHByZXR0eTogdHJ1ZSB9KSxcbiAgICByZW5kZXIoZWxlbWVudCwgeyBwbGFpblRleHQ6IHRydWUgfSksXG4gIF0pO1xuICByZXR1cm4geyBodG1sLCB0ZXh0IH07XG59XG4iXX0=
@@ -1,22 +1,4 @@
1
- /**
2
- * Server-side markdown -> HTML rendering for email bodies. The model
3
- * drafts bodies in markdown; this turns them into real HTML (GFM tables,
4
- * lists, code, links). {@link normalizeMarkdown} first repairs the two
5
- * structures LLMs most often emit as plain text instead of markdown -
6
- * `=====` divider rules and pipe tables missing their `| --- |`
7
- * separator row - so they render as a `<hr>` / `<table>` rather than
8
- * literal text. The prompt steers the model away from ASCII art; this is
9
- * the belt-and-suspenders fallback.
10
- *
11
- * @module
12
- */
13
- /**
14
- * Repair common LLM "looks-like-markdown-but-isn't" output: convert
15
- * standalone `=====` / `_____` rules to a `---` thematic break (leaving
16
- * genuine setext-heading underlines intact), and insert a `| --- |`
17
- * separator after the first row of a pipe block that lacks one so GFM
18
- * renders it as a table.
19
- */
20
- export declare function normalizeMarkdown(src: string): string;
21
- /** Render a markdown body to an HTML fragment (GFM tables enabled). */
22
- export declare function markdownToHtml(body: string): string;
1
+ /** Normalize indentation in authored content. */
2
+ export declare const normalizeMarkdown: (value: string) => string;
3
+ /** Render a standalone message body through React Email. */
4
+ export declare function markdownToHtml(body: string): Promise<string>;
@@ -1,81 +1,13 @@
1
- /**
2
- * Server-side markdown -> HTML rendering for email bodies. The model
3
- * drafts bodies in markdown; this turns them into real HTML (GFM tables,
4
- * lists, code, links). {@link normalizeMarkdown} first repairs the two
5
- * structures LLMs most often emit as plain text instead of markdown -
6
- * `=====` divider rules and pipe tables missing their `| --- |`
7
- * separator row - so they render as a `<hr>` / `<table>` rather than
8
- * literal text. The prompt steers the model away from ASCII art; this is
9
- * the belt-and-suspenders fallback.
10
- *
11
- * @module
12
- */
13
- import { marked } from "marked";
14
- /** A line of only `=` or `_` (length >= 3): an ASCII divider rule. */
15
- function isAsciiRule(line) {
16
- return /^[ \t]*[=_]{3,}[ \t]*$/.test(line);
17
- }
18
- /** A line that participates in a markdown pipe table (has a `|`). */
19
- function isPipeRow(line) {
20
- return line.includes("|") && line.trim().length > 0;
21
- }
22
- /** A markdown table separator row, e.g. `| --- | :--: |`. */
23
- function isSeparatorRow(line) {
24
- return /^[ \t]*\|?[ \t]*:?-{2,}:?[ \t]*(\|[ \t]*:?-{2,}:?[ \t]*)+\|?[ \t]*$/.test(line);
25
- }
26
- /** Column count of a pipe row (outer pipes optional). */
27
- function pipeColumns(line) {
28
- return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").length;
29
- }
30
- /** A GFM separator row with `columns` cells. */
31
- function separatorRow(columns) {
32
- return `| ${Array.from({ length: columns }, () => "---").join(" | ")} |`;
33
- }
34
- /**
35
- * Repair common LLM "looks-like-markdown-but-isn't" output: convert
36
- * standalone `=====` / `_____` rules to a `---` thematic break (leaving
37
- * genuine setext-heading underlines intact), and insert a `| --- |`
38
- * separator after the first row of a pipe block that lacks one so GFM
39
- * renders it as a table.
40
- */
41
- export function normalizeMarkdown(src) {
42
- const lines = src.split("\n");
43
- const out = [];
44
- for (let i = 0; i < lines.length; i++) {
45
- const line = lines[i];
46
- const prev = i > 0 ? lines[i - 1] : "";
47
- const next = i + 1 < lines.length ? lines[i + 1] : "";
48
- if (isAsciiRule(line)) {
49
- // A run of `=` directly under a non-blank text line is a setext H1
50
- // underline - keep it. Anything else is a decorative divider.
51
- const isSetextUnderline = /^[ \t]*={3,}[ \t]*$/.test(line) && prev.trim() !== "" && !isPipeRow(prev);
52
- out.push(isSetextUnderline ? line : "---");
53
- continue;
54
- }
55
- // First row of a pipe block (prev is not itself a pipe row) followed
56
- // by another aligned pipe row, with no separator and no `###` bar-
57
- // chart fill: treat as a table header and inject the separator.
58
- const startsPipeBlock = isPipeRow(line) && !isPipeRow(prev);
59
- if (startsPipeBlock &&
60
- isPipeRow(next) &&
61
- !isSeparatorRow(next) &&
62
- !/#{3,}/.test(line) &&
63
- pipeColumns(line) >= 2 &&
64
- pipeColumns(line) === pipeColumns(next)) {
65
- out.push(line);
66
- out.push(separatorRow(pipeColumns(line)));
67
- continue;
68
- }
69
- out.push(line);
70
- }
71
- return out.join("\n");
72
- }
73
- /** Render a markdown body to an HTML fragment (GFM tables enabled). */
74
- export function markdownToHtml(body) {
75
- return marked.parse(normalizeMarkdown(body), {
76
- async: false,
77
- gfm: true,
78
- breaks: true,
1
+ /** Compatibility helpers backed by the shared React Email body. @module */
2
+ import { EmailBody, normalizeEmailMarkdown } from "@dbx-tools/shared-email-template";
3
+ import { render } from "@react-email/render";
4
+ import { createElement } from "react";
5
+ /** Normalize indentation in authored content. */
6
+ export const normalizeMarkdown = normalizeEmailMarkdown;
7
+ /** Render a standalone message body through React Email. */
8
+ export async function markdownToHtml(body) {
9
+ return render(createElement(EmailBody, { body: normalizeEmailMarkdown(body) }), {
10
+ pretty: true,
79
11
  });
80
12
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLHNFQUFzRTtBQUN0RSxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE9BQU8sd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsU0FBUyxTQUFTLENBQUMsSUFBWTtJQUM3QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE9BQU8scUVBQXFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsU0FBUyxXQUFXLENBQUMsSUFBWTtJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUM3RSxDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELFNBQVMsWUFBWSxDQUFDLE9BQWU7SUFDbkMsT0FBTyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDM0UsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFXO0lBQzNDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV2RCxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLG1FQUFtRTtZQUNuRSw4REFBOEQ7WUFDOUQsTUFBTSxpQkFBaUIsR0FDckIscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0UsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxTQUFTO1FBQ1gsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsZ0VBQWdFO1FBQ2hFLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxJQUNFLGVBQWU7WUFDZixTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2YsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3JCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEIsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDdkMsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLFNBQVM7UUFDWCxDQUFDO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFZO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMzQyxLQUFLLEVBQUUsS0FBSztRQUNaLEdBQUcsRUFBRSxJQUFJO1FBQ1QsTUFBTSxFQUFFLElBQUk7S0FDYixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXJ2ZXItc2lkZSBtYXJrZG93biAtPiBIVE1MIHJlbmRlcmluZyBmb3IgZW1haWwgYm9kaWVzLiBUaGUgbW9kZWxcbiAqIGRyYWZ0cyBib2RpZXMgaW4gbWFya2Rvd247IHRoaXMgdHVybnMgdGhlbSBpbnRvIHJlYWwgSFRNTCAoR0ZNIHRhYmxlcyxcbiAqIGxpc3RzLCBjb2RlLCBsaW5rcykuIHtAbGluayBub3JtYWxpemVNYXJrZG93bn0gZmlyc3QgcmVwYWlycyB0aGUgdHdvXG4gKiBzdHJ1Y3R1cmVzIExMTXMgbW9zdCBvZnRlbiBlbWl0IGFzIHBsYWluIHRleHQgaW5zdGVhZCBvZiBtYXJrZG93biAtXG4gKiBgPT09PT1gIGRpdmlkZXIgcnVsZXMgYW5kIHBpcGUgdGFibGVzIG1pc3NpbmcgdGhlaXIgYHwgLS0tIHxgXG4gKiBzZXBhcmF0b3Igcm93IC0gc28gdGhleSByZW5kZXIgYXMgYSBgPGhyPmAgLyBgPHRhYmxlPmAgcmF0aGVyIHRoYW5cbiAqIGxpdGVyYWwgdGV4dC4gVGhlIHByb21wdCBzdGVlcnMgdGhlIG1vZGVsIGF3YXkgZnJvbSBBU0NJSSBhcnQ7IHRoaXMgaXNcbiAqIHRoZSBiZWx0LWFuZC1zdXNwZW5kZXJzIGZhbGxiYWNrLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBtYXJrZWQgfSBmcm9tIFwibWFya2VkXCI7XG5cbi8qKiBBIGxpbmUgb2Ygb25seSBgPWAgb3IgYF9gIChsZW5ndGggPj0gMyk6IGFuIEFTQ0lJIGRpdmlkZXIgcnVsZS4gKi9cbmZ1bmN0aW9uIGlzQXNjaWlSdWxlKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bIFxcdF0qWz1fXXszLH1bIFxcdF0qJC8udGVzdChsaW5lKTtcbn1cblxuLyoqIEEgbGluZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIG1hcmtkb3duIHBpcGUgdGFibGUgKGhhcyBhIGB8YCkuICovXG5mdW5jdGlvbiBpc1BpcGVSb3cobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5lLmluY2x1ZGVzKFwifFwiKSAmJiBsaW5lLnRyaW0oKS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBtYXJrZG93biB0YWJsZSBzZXBhcmF0b3Igcm93LCBlLmcuIGB8IC0tLSB8IDotLTogfGAuICovXG5mdW5jdGlvbiBpc1NlcGFyYXRvclJvdyhsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eWyBcXHRdKlxcfD9bIFxcdF0qOj8tezIsfTo/WyBcXHRdKihcXHxbIFxcdF0qOj8tezIsfTo/WyBcXHRdKikrXFx8P1sgXFx0XSokLy50ZXN0KGxpbmUpO1xufVxuXG4vKiogQ29sdW1uIGNvdW50IG9mIGEgcGlwZSByb3cgKG91dGVyIHBpcGVzIG9wdGlvbmFsKS4gKi9cbmZ1bmN0aW9uIHBpcGVDb2x1bW5zKGxpbmU6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsaW5lLnRyaW0oKS5yZXBsYWNlKC9eXFx8LywgXCJcIikucmVwbGFjZSgvXFx8JC8sIFwiXCIpLnNwbGl0KFwifFwiKS5sZW5ndGg7XG59XG5cbi8qKiBBIEdGTSBzZXBhcmF0b3Igcm93IHdpdGggYGNvbHVtbnNgIGNlbGxzLiAqL1xuZnVuY3Rpb24gc2VwYXJhdG9yUm93KGNvbHVtbnM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgfCAke0FycmF5LmZyb20oeyBsZW5ndGg6IGNvbHVtbnMgfSwgKCkgPT4gXCItLS1cIikuam9pbihcIiB8IFwiKX0gfGA7XG59XG5cbi8qKlxuICogUmVwYWlyIGNvbW1vbiBMTE0gXCJsb29rcy1saWtlLW1hcmtkb3duLWJ1dC1pc24ndFwiIG91dHB1dDogY29udmVydFxuICogc3RhbmRhbG9uZSBgPT09PT1gIC8gYF9fX19fYCBydWxlcyB0byBhIGAtLS1gIHRoZW1hdGljIGJyZWFrIChsZWF2aW5nXG4gKiBnZW51aW5lIHNldGV4dC1oZWFkaW5nIHVuZGVybGluZXMgaW50YWN0KSwgYW5kIGluc2VydCBhIGB8IC0tLSB8YFxuICogc2VwYXJhdG9yIGFmdGVyIHRoZSBmaXJzdCByb3cgb2YgYSBwaXBlIGJsb2NrIHRoYXQgbGFja3Mgb25lIHNvIEdGTVxuICogcmVuZGVycyBpdCBhcyBhIHRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTWFya2Rvd24oc3JjOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IHNyYy5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldITtcbiAgICBjb25zdCBwcmV2ID0gaSA+IDAgPyBsaW5lc1tpIC0gMV0hIDogXCJcIjtcbiAgICBjb25zdCBuZXh0ID0gaSArIDEgPCBsaW5lcy5sZW5ndGggPyBsaW5lc1tpICsgMV0hIDogXCJcIjtcblxuICAgIGlmIChpc0FzY2lpUnVsZShsaW5lKSkge1xuICAgICAgLy8gQSBydW4gb2YgYD1gIGRpcmVjdGx5IHVuZGVyIGEgbm9uLWJsYW5rIHRleHQgbGluZSBpcyBhIHNldGV4dCBIMVxuICAgICAgLy8gdW5kZXJsaW5lIC0ga2VlcCBpdC4gQW55dGhpbmcgZWxzZSBpcyBhIGRlY29yYXRpdmUgZGl2aWRlci5cbiAgICAgIGNvbnN0IGlzU2V0ZXh0VW5kZXJsaW5lID1cbiAgICAgICAgL15bIFxcdF0qPXszLH1bIFxcdF0qJC8udGVzdChsaW5lKSAmJiBwcmV2LnRyaW0oKSAhPT0gXCJcIiAmJiAhaXNQaXBlUm93KHByZXYpO1xuICAgICAgb3V0LnB1c2goaXNTZXRleHRVbmRlcmxpbmUgPyBsaW5lIDogXCItLS1cIik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCByb3cgb2YgYSBwaXBlIGJsb2NrIChwcmV2IGlzIG5vdCBpdHNlbGYgYSBwaXBlIHJvdykgZm9sbG93ZWRcbiAgICAvLyBieSBhbm90aGVyIGFsaWduZWQgcGlwZSByb3csIHdpdGggbm8gc2VwYXJhdG9yIGFuZCBubyBgIyMjYCBiYXItXG4gICAgLy8gY2hhcnQgZmlsbDogdHJlYXQgYXMgYSB0YWJsZSBoZWFkZXIgYW5kIGluamVjdCB0aGUgc2VwYXJhdG9yLlxuICAgIGNvbnN0IHN0YXJ0c1BpcGVCbG9jayA9IGlzUGlwZVJvdyhsaW5lKSAmJiAhaXNQaXBlUm93KHByZXYpO1xuICAgIGlmIChcbiAgICAgIHN0YXJ0c1BpcGVCbG9jayAmJlxuICAgICAgaXNQaXBlUm93KG5leHQpICYmXG4gICAgICAhaXNTZXBhcmF0b3JSb3cobmV4dCkgJiZcbiAgICAgICEvI3szLH0vLnRlc3QobGluZSkgJiZcbiAgICAgIHBpcGVDb2x1bW5zKGxpbmUpID49IDIgJiZcbiAgICAgIHBpcGVDb2x1bW5zKGxpbmUpID09PSBwaXBlQ29sdW1ucyhuZXh0KVxuICAgICkge1xuICAgICAgb3V0LnB1c2gobGluZSk7XG4gICAgICBvdXQucHVzaChzZXBhcmF0b3JSb3cocGlwZUNvbHVtbnMobGluZSkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG91dC5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBvdXQuam9pbihcIlxcblwiKTtcbn1cblxuLyoqIFJlbmRlciBhIG1hcmtkb3duIGJvZHkgdG8gYW4gSFRNTCBmcmFnbWVudCAoR0ZNIHRhYmxlcyBlbmFibGVkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93blRvSHRtbChib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbWFya2VkLnBhcnNlKG5vcm1hbGl6ZU1hcmtkb3duKGJvZHkpLCB7XG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGdmbTogdHJ1ZSxcbiAgICBicmVha3M6IHRydWUsXG4gIH0pO1xufVxuIl19
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV0QyxpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsc0JBQXNCLENBQUM7QUFFeEQsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQVk7SUFDL0MsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDOUUsTUFBTSxFQUFFLElBQUk7S0FDYixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIENvbXBhdGliaWxpdHkgaGVscGVycyBiYWNrZWQgYnkgdGhlIHNoYXJlZCBSZWFjdCBFbWFpbCBib2R5LiBAbW9kdWxlICovXG5pbXBvcnQgeyBFbWFpbEJvZHksIG5vcm1hbGl6ZUVtYWlsTWFya2Rvd24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWwtdGVtcGxhdGVcIjtcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gXCJAcmVhY3QtZW1haWwvcmVuZGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKiBOb3JtYWxpemUgaW5kZW50YXRpb24gaW4gYXV0aG9yZWQgY29udGVudC4gKi9cbmV4cG9ydCBjb25zdCBub3JtYWxpemVNYXJrZG93biA9IG5vcm1hbGl6ZUVtYWlsTWFya2Rvd247XG5cbi8qKiBSZW5kZXIgYSBzdGFuZGFsb25lIG1lc3NhZ2UgYm9keSB0aHJvdWdoIFJlYWN0IEVtYWlsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hcmtkb3duVG9IdG1sKGJvZHk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiByZW5kZXIoY3JlYXRlRWxlbWVudChFbWFpbEJvZHksIHsgYm9keTogbm9ybWFsaXplRW1haWxNYXJrZG93bihib2R5KSB9KSwge1xuICAgIHByZXR0eTogdHJ1ZSxcbiAgfSk7XG59XG4iXX0=
package/lib/src/outbox.js CHANGED
@@ -47,7 +47,7 @@ export async function writeOutboxEmail(message, from, dir, brand) {
47
47
  const folder = resolve(dir, from);
48
48
  await mkdir(folder, { recursive: true });
49
49
  const path = join(folder, `${Date.now()}-${subjectSlug(message.subject)}.html`);
50
- const html = renderEmailHtml({
50
+ const html = await renderEmailHtml({
51
51
  subject: message.subject,
52
52
  headers: headerRows(message, from),
53
53
  body: message.body,
@@ -57,4 +57,4 @@ export async function writeOutboxEmail(message, from, dir, brand) {
57
57
  await writeFile(path, html, "utf8");
58
58
  return path;
59
59
  }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL291dGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxEOzs7R0FHRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLDZEQUE2RDtBQUM3RCxTQUFTLFdBQVcsQ0FBQyxPQUFlO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDO0FBQzlGLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsU0FBUyxVQUFVLENBQUMsT0FBcUIsRUFBRSxJQUFZO0lBQ3JELE1BQU0sSUFBSSxHQUFpRDtRQUN6RCxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDZCxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzVCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDbkMsQ0FBQztJQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBMkIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsT0FBcUIsRUFDckIsSUFBWSxFQUNaLEdBQVcsRUFDWCxLQUFrQjtJQUVsQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEYsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7UUFDbEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLE1BQU0sRUFBRSxvRkFBb0Y7UUFDNUYsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVCLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaWxlc3lzdGVtIG91dGJveCBmb3IgdGhlIG5vLVNNVFAgZmFsbGJhY2s6IHtAbGluayB3cml0ZU91dGJveEVtYWlsfVxuICogcGVyc2lzdHMgb25lIGRyYWZ0ZWQgbWVzc2FnZSBhcyBhIHN0YW5kYWxvbmUgSFRNTCBmaWxlIHVuZGVyXG4gKiBgPGRpcj4vPGZyb20+Lzx0aW1lc3RhbXA+LTxzdWJqZWN0LXNsdWc+Lmh0bWxgIGluc3RlYWQgb2Ygc2VuZGluZyBpdC5cbiAqIFRoaXMgbGV0cyB0aGUgYXBwcm92YWwgZmxvdyBhbmQgYWdlbnRzIGJlIGV4ZXJjaXNlZCBlbmQtdG8tZW5kIHdpdGhcbiAqIHplcm8gZW1haWwgY29uZmlndXJhdGlvbiAtIG9wZW4gdGhlIGZpbGUgaW4gYSBicm93c2VyIHRvIHNlZSBleGFjdGx5XG4gKiB3aGF0IHdvdWxkIGhhdmUgZ29uZSBvdXQgKHRoZSBIVE1MIG1hdGNoZXMgdGhlIFNNVFAgc2VuZCwgaGVhZGVyc1xuICogdGFibGUgYXNpZGUpLiBUaGUgYm9keSBpcyByZW5kZXJlZCArIHN0eWxlLWlubGluZWQgYnlcbiAqIHtAbGluayByZW5kZXJFbWFpbEh0bWx9LiBBdHRhY2htZW50cyBhcmUgbGlzdGVkIGJ5IGZpbGVuYW1lIGluIHRoZVxuICogaGVhZGVyIHRhYmxlIGJ1dCBub3Qgd3JpdHRlbiB0byBkaXNrIC0gdGhlIG91dGJveCBwcmV2aWV3cyB0aGVcbiAqIGVudmVsb3BlLCBpdCBkb2Vzbid0IHJlcHJvZHVjZSB0aGUgd2lyZSBwYXlsb2FkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBFbWFpbE1lc3NhZ2UgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWxcIjtcbmltcG9ydCB0eXBlIHsgRW1haWxCcmFuZCB9IGZyb20gXCIuL2JyYW5kLnRzXCI7XG5pbXBvcnQgeyByZW5kZXJFbWFpbEh0bWwgfSBmcm9tIFwiLi9lbWFpbC1odG1sLnRzXCI7XG5cbi8qKlxuICogTG9uZ2VzdCBzdWJqZWN0IHNsdWcga2VwdCBpbiBhbiBvdXRib3ggZmlsZSBuYW1lLCBsZWF2aW5nIHJvb20gZm9yIHRoZVxuICogdGltZXN0YW1wIHByZWZpeCBhbmQgZXh0ZW5zaW9uIGluc2lkZSBjb21tb24gZmlsZXN5c3RlbSBuYW1lIGxpbWl0cy5cbiAqL1xuY29uc3QgU1VCSkVDVF9TTFVHX01BWF9MRU5HVEggPSA0ODtcblxuLyoqIEZpbGVzeXN0ZW0tc2FmZSBzbHVnIG9mIHRoZSBzdWJqZWN0IGZvciB0aGUgZmlsZSBuYW1lLiAqL1xuZnVuY3Rpb24gc3ViamVjdFNsdWcoc3ViamVjdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZy50b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogU1VCSkVDVF9TTFVHX01BWF9MRU5HVEggfSwgc3ViamVjdCkgfHwgXCJlbWFpbFwiO1xufVxuXG4vKiogVGhlIGVudmVsb3BlIHJvd3Mgc2hvd24gYWJvdmUgdGhlIGJvZHkgaW4gdGhlIHByZXZpZXcgZmlsZS4gKi9cbmZ1bmN0aW9uIGhlYWRlclJvd3MobWVzc2FnZTogRW1haWxNZXNzYWdlLCBmcm9tOiBzdHJpbmcpOiBBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IHJvd3M6IEFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0+ID0gW1xuICAgIFtcIkZyb21cIiwgZnJvbV0sXG4gICAgW1wiVG9cIiwgbWVzc2FnZS50by5qb2luKFwiLCBcIildLFxuICAgIFtcIkNjXCIsIG1lc3NhZ2UuY2M/LmpvaW4oXCIsIFwiKV0sXG4gICAgW1wiQmNjXCIsIG1lc3NhZ2UuYmNjPy5qb2luKFwiLCBcIildLFxuICAgIFtcIlN1YmplY3RcIiwgbWVzc2FnZS5zdWJqZWN0XSxcbiAgICBbXCJBdHRhY2htZW50c1wiLCBtZXNzYWdlLmF0dGFjaG1lbnRzPy5tYXAoKGF0dCkgPT4gYXR0LmZpbGVuYW1lKS5qb2luKFwiLCBcIildLFxuICAgIFtcIkRhdGVcIiwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXSxcbiAgXTtcbiAgcmV0dXJuIHJvd3MuZmlsdGVyKChyb3cpOiByb3cgaXMgW3N0cmluZywgc3RyaW5nXSA9PiBCb29sZWFuKHJvd1sxXSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIG9uZSBtZXNzYWdlIGFzIEhUTUwgdW5kZXIgYDxkaXI+Lzxmcm9tPi9gIGFuZCByZXR1cm4gdGhlXG4gKiBhYnNvbHV0ZSBwYXRoLiBUaGUgcGVyLXNlbmRlciBmb2xkZXIgbWlycm9ycyB0aGUgU01UUCBgRnJvbWAsIHNvIHRlc3RcbiAqIG91dHB1dCBncm91cHMgYnkgd2hvIHRoZSBtZXNzYWdlIHdvdWxkIGhhdmUgYmVlbiBzZW50IGFzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVPdXRib3hFbWFpbChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIGRpcjogc3RyaW5nLFxuICBicmFuZD86IEVtYWlsQnJhbmQsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmb2xkZXIgPSByZXNvbHZlKGRpciwgZnJvbSk7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHBhdGggPSBqb2luKGZvbGRlciwgYCR7RGF0ZS5ub3coKX0tJHtzdWJqZWN0U2x1ZyhtZXNzYWdlLnN1YmplY3QpfS5odG1sYCk7XG4gIGNvbnN0IGh0bWwgPSByZW5kZXJFbWFpbEh0bWwoe1xuICAgIHN1YmplY3Q6IG1lc3NhZ2Uuc3ViamVjdCxcbiAgICBoZWFkZXJzOiBoZWFkZXJSb3dzKG1lc3NhZ2UsIGZyb20pLFxuICAgIGJvZHk6IG1lc3NhZ2UuYm9keSxcbiAgICBmb290ZXI6IFwiTG9jYWwgb3V0Ym94IHByZXZpZXcgLSB3cml0dGVuIHRvIGRpc2ssIG5vdCBzZW50IChubyBTTVRQIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQpLlwiLFxuICAgIC4uLihicmFuZCA/IHsgYnJhbmQgfSA6IHt9KSxcbiAgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShwYXRoLCBodG1sLCBcInV0ZjhcIik7XG4gIHJldHVybiBwYXRoO1xufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL291dGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxEOzs7R0FHRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLDZEQUE2RDtBQUM3RCxTQUFTLFdBQVcsQ0FBQyxPQUFlO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDO0FBQzlGLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsU0FBUyxVQUFVLENBQUMsT0FBcUIsRUFBRSxJQUFZO0lBQ3JELE1BQU0sSUFBSSxHQUFpRDtRQUN6RCxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDZCxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzVCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDbkMsQ0FBQztJQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBMkIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsT0FBcUIsRUFDckIsSUFBWSxFQUNaLEdBQVcsRUFDWCxLQUFrQjtJQUVsQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEYsTUFBTSxJQUFJLEdBQUcsTUFBTSxlQUFlLENBQUM7UUFDakMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztRQUNsQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsTUFBTSxFQUFFLG9GQUFvRjtRQUM1RixHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDNUIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGVzeXN0ZW0gb3V0Ym94IGZvciB0aGUgbm8tU01UUCBmYWxsYmFjazoge0BsaW5rIHdyaXRlT3V0Ym94RW1haWx9XG4gKiBwZXJzaXN0cyBvbmUgZHJhZnRlZCBtZXNzYWdlIGFzIGEgc3RhbmRhbG9uZSBIVE1MIGZpbGUgdW5kZXJcbiAqIGA8ZGlyPi88ZnJvbT4vPHRpbWVzdGFtcD4tPHN1YmplY3Qtc2x1Zz4uaHRtbGAgaW5zdGVhZCBvZiBzZW5kaW5nIGl0LlxuICogVGhpcyBsZXRzIHRoZSBhcHByb3ZhbCBmbG93IGFuZCBhZ2VudHMgYmUgZXhlcmNpc2VkIGVuZC10by1lbmQgd2l0aFxuICogemVybyBlbWFpbCBjb25maWd1cmF0aW9uIC0gb3BlbiB0aGUgZmlsZSBpbiBhIGJyb3dzZXIgdG8gc2VlIGV4YWN0bHlcbiAqIHdoYXQgd291bGQgaGF2ZSBnb25lIG91dCAodGhlIEhUTUwgbWF0Y2hlcyB0aGUgU01UUCBzZW5kLCBoZWFkZXJzXG4gKiB0YWJsZSBhc2lkZSkuIFRoZSBib2R5IGlzIHJlbmRlcmVkICsgc3R5bGUtaW5saW5lZCBieVxuICoge0BsaW5rIHJlbmRlckVtYWlsSHRtbH0uIEF0dGFjaG1lbnRzIGFyZSBsaXN0ZWQgYnkgZmlsZW5hbWUgaW4gdGhlXG4gKiBoZWFkZXIgdGFibGUgYnV0IG5vdCB3cml0dGVuIHRvIGRpc2sgLSB0aGUgb3V0Ym94IHByZXZpZXdzIHRoZVxuICogZW52ZWxvcGUsIGl0IGRvZXNuJ3QgcmVwcm9kdWNlIHRoZSB3aXJlIHBheWxvYWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEVtYWlsTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHR5cGUgeyBFbWFpbEJyYW5kIH0gZnJvbSBcIi4vYnJhbmQudHNcIjtcbmltcG9ydCB7IHJlbmRlckVtYWlsSHRtbCB9IGZyb20gXCIuL2VtYWlsLWh0bWwudHNcIjtcblxuLyoqXG4gKiBMb25nZXN0IHN1YmplY3Qgc2x1ZyBrZXB0IGluIGFuIG91dGJveCBmaWxlIG5hbWUsIGxlYXZpbmcgcm9vbSBmb3IgdGhlXG4gKiB0aW1lc3RhbXAgcHJlZml4IGFuZCBleHRlbnNpb24gaW5zaWRlIGNvbW1vbiBmaWxlc3lzdGVtIG5hbWUgbGltaXRzLlxuICovXG5jb25zdCBTVUJKRUNUX1NMVUdfTUFYX0xFTkdUSCA9IDQ4O1xuXG4vKiogRmlsZXN5c3RlbS1zYWZlIHNsdWcgb2YgdGhlIHN1YmplY3QgZm9yIHRoZSBmaWxlIG5hbWUuICovXG5mdW5jdGlvbiBzdWJqZWN0U2x1ZyhzdWJqZWN0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5nLnRvU2x1Z1dpdGhPcHRpb25zKHsgbWF4TGVuZ3RoOiBTVUJKRUNUX1NMVUdfTUFYX0xFTkdUSCB9LCBzdWJqZWN0KSB8fCBcImVtYWlsXCI7XG59XG5cbi8qKiBUaGUgZW52ZWxvcGUgcm93cyBzaG93biBhYm92ZSB0aGUgYm9keSBpbiB0aGUgcHJldmlldyBmaWxlLiAqL1xuZnVuY3Rpb24gaGVhZGVyUm93cyhtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsIGZyb206IHN0cmluZyk6IEFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3Qgcm93czogQXJyYXk8cmVhZG9ubHkgW3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgW1wiRnJvbVwiLCBmcm9tXSxcbiAgICBbXCJUb1wiLCBtZXNzYWdlLnRvLmpvaW4oXCIsIFwiKV0sXG4gICAgW1wiQ2NcIiwgbWVzc2FnZS5jYz8uam9pbihcIiwgXCIpXSxcbiAgICBbXCJCY2NcIiwgbWVzc2FnZS5iY2M/LmpvaW4oXCIsIFwiKV0sXG4gICAgW1wiU3ViamVjdFwiLCBtZXNzYWdlLnN1YmplY3RdLFxuICAgIFtcIkF0dGFjaG1lbnRzXCIsIG1lc3NhZ2UuYXR0YWNobWVudHM/Lm1hcCgoYXR0KSA9PiBhdHQuZmlsZW5hbWUpLmpvaW4oXCIsIFwiKV0sXG4gICAgW1wiRGF0ZVwiLCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCldLFxuICBdO1xuICByZXR1cm4gcm93cy5maWx0ZXIoKHJvdyk6IHJvdyBpcyBbc3RyaW5nLCBzdHJpbmddID0+IEJvb2xlYW4ocm93WzFdKSk7XG59XG5cbi8qKlxuICogV3JpdGUgb25lIG1lc3NhZ2UgYXMgSFRNTCB1bmRlciBgPGRpcj4vPGZyb20+L2AgYW5kIHJldHVybiB0aGVcbiAqIGFic29sdXRlIHBhdGguIFRoZSBwZXItc2VuZGVyIGZvbGRlciBtaXJyb3JzIHRoZSBTTVRQIGBGcm9tYCwgc28gdGVzdFxuICogb3V0cHV0IGdyb3VwcyBieSB3aG8gdGhlIG1lc3NhZ2Ugd291bGQgaGF2ZSBiZWVuIHNlbnQgYXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZU91dGJveEVtYWlsKFxuICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gIGZyb206IHN0cmluZyxcbiAgZGlyOiBzdHJpbmcsXG4gIGJyYW5kPzogRW1haWxCcmFuZCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZvbGRlciA9IHJlc29sdmUoZGlyLCBmcm9tKTtcbiAgYXdhaXQgbWtkaXIoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgcGF0aCA9IGpvaW4oZm9sZGVyLCBgJHtEYXRlLm5vdygpfS0ke3N1YmplY3RTbHVnKG1lc3NhZ2Uuc3ViamVjdCl9Lmh0bWxgKTtcbiAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlckVtYWlsSHRtbCh7XG4gICAgc3ViamVjdDogbWVzc2FnZS5zdWJqZWN0LFxuICAgIGhlYWRlcnM6IGhlYWRlclJvd3MobWVzc2FnZSwgZnJvbSksXG4gICAgYm9keTogbWVzc2FnZS5ib2R5LFxuICAgIGZvb3RlcjogXCJMb2NhbCBvdXRib3ggcHJldmlldyAtIHdyaXR0ZW4gdG8gZGlzaywgbm90IHNlbnQgKG5vIFNNVFAgY3JlZGVudGlhbHMgY29uZmlndXJlZCkuXCIsXG4gICAgLi4uKGJyYW5kID8geyBicmFuZCB9IDoge30pLFxuICB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGh0bWwsIFwidXRmOFwiKTtcbiAgcmV0dXJuIHBhdGg7XG59XG4iXX0=
@@ -99,6 +99,20 @@ export declare class EmailPlugin extends Plugin<EmailPluginConfig> implements To
99
99
  * plugin base path, i.e. `GET /api/email/senders`. Runs in the OBO
100
100
  * user scope so domain wildcards resolve against the caller's own
101
101
  * local part.
102
+ *
103
+ * OBO is used only WHEN the request can support it. `asUser(req)` throws
104
+ * `AuthenticationError` outside `NODE_ENV=development` if the request carries
105
+ * no forwarded OBO token, and AppKit does not catch a rejection raised inside
106
+ * a handler - so unconditionally wrapping this route takes the process down
107
+ * for a caller that authenticated some other way (a `@dbx-tools/cli-tunnel`
108
+ * OTP session, a health probe, a local `curl`). The user context is only ever
109
+ * an ENRICHMENT here: without it, wildcard senders simply expand against no
110
+ * local part. Degrading to the service context therefore answers correctly
111
+ * instead of failing, and a front-door request is unchanged.
112
+ *
113
+ * This is the same rule `@dbx-tools/appkit`'s `identity` module applies in
114
+ * `"auto"` mode; the header check is inlined rather than taking a dependency
115
+ * on that package for one predicate.
102
116
  */
103
117
  injectRoutes(router: IAppRouter): void;
104
118
  exports(): {