@react-email/render 0.0.7 → 0.0.9-canary.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.
@@ -0,0 +1,12 @@
1
+ interface Options {
2
+ pretty?: boolean;
3
+ plainText?: boolean;
4
+ }
5
+ declare const render: (component: React.ReactElement, options?: Options) => Promise<string>;
6
+
7
+ declare const renderAsync: (component: React.ReactElement, options?: {
8
+ pretty?: boolean;
9
+ plainText?: boolean;
10
+ }) => Promise<string>;
11
+
12
+ export { Options, render, renderAsync };
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ interface Options {
2
2
  pretty?: boolean;
3
3
  plainText?: boolean;
4
4
  }
5
- declare const render: (component: React.ReactElement, options?: Options) => string;
5
+ declare const render: (component: React.ReactElement, options?: Options) => Promise<string>;
6
6
 
7
7
  declare const renderAsync: (component: React.ReactElement, options?: {
8
8
  pretty?: boolean;
package/dist/index.js CHANGED
@@ -5,6 +5,11 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __knownSymbol = (name, symbol) => {
9
+ if (symbol = Symbol[name])
10
+ return symbol;
11
+ throw Error("Symbol." + name + " is not defined");
12
+ };
8
13
  var __export = (target, all) => {
9
14
  for (var name in all)
10
15
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -18,10 +23,35 @@ var __copyProps = (to, from, except, desc) => {
18
23
  return to;
19
24
  };
20
25
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
+ // If the importer is in node compatibility mode or this is not an ESM
27
+ // file that has been converted to a CommonJS file using a Babel-
28
+ // compatible transform (i.e. "__esModule" has not been set), then set
29
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
30
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
31
  mod
23
32
  ));
24
33
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
+ var __async = (__this, __arguments, generator) => {
35
+ return new Promise((resolve, reject) => {
36
+ var fulfilled = (value) => {
37
+ try {
38
+ step(generator.next(value));
39
+ } catch (e) {
40
+ reject(e);
41
+ }
42
+ };
43
+ var rejected = (value) => {
44
+ try {
45
+ step(generator.throw(value));
46
+ } catch (e) {
47
+ reject(e);
48
+ }
49
+ };
50
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
51
+ step((generator = generator.apply(__this, __arguments)).next());
52
+ });
53
+ };
54
+ var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
25
55
 
26
56
  // src/index.ts
27
57
  var src_exports = {};
@@ -35,18 +65,65 @@ module.exports = __toCommonJS(src_exports);
35
65
  var ReactDomServer = __toESM(require("react-dom/server"));
36
66
  var import_html_to_text = require("html-to-text");
37
67
  var import_pretty = __toESM(require("pretty"));
38
- var render = (component, options) => {
68
+ var readPipeableStream = (readableStream) => __async(void 0, null, function* () {
69
+ let buffer = "";
70
+ try {
71
+ for (var iter = __forAwait(readableStream), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
72
+ const chunk = temp.value;
73
+ const chunkText = new TextDecoder("utf-8").decode(chunk);
74
+ buffer += chunkText;
75
+ }
76
+ } catch (temp) {
77
+ error = [temp];
78
+ } finally {
79
+ try {
80
+ more && (temp = iter.return) && (yield temp.call(iter));
81
+ } finally {
82
+ if (error)
83
+ throw error[0];
84
+ }
85
+ }
86
+ return buffer;
87
+ });
88
+ var readReactDOMServerReadableStream = (readableStream) => __async(void 0, null, function* () {
89
+ const reader = readableStream.getReader();
90
+ const chunks = [];
91
+ while (true) {
92
+ const { value, done } = yield reader.read();
93
+ if (done) {
94
+ break;
95
+ }
96
+ chunks.push(value);
97
+ }
98
+ return chunks.map((chunk) => new TextDecoder("utf-8").decode(chunk)).join("");
99
+ });
100
+ var isPipeableStream = (stream) => "pipeTo" in stream;
101
+ var readStream = (readableStream) => __async(void 0, null, function* () {
102
+ if (isPipeableStream(readableStream)) {
103
+ return readPipeableStream(readableStream);
104
+ } else if (typeof readableStream === "string") {
105
+ return readableStream;
106
+ }
107
+ return readReactDOMServerReadableStream(readableStream);
108
+ });
109
+ var render = (component, options) => __async(void 0, null, function* () {
110
+ const reactDOMServer = (yield import("react-dom/server")).default;
111
+ const renderToStream2 = (
112
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
113
+ reactDOMServer.renderToReadableStream || reactDOMServer.renderToPipeableStream
114
+ );
39
115
  if (options == null ? void 0 : options.plainText) {
40
116
  return renderAsPlainText(component, options);
41
117
  }
42
118
  const doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
43
- const markup = ReactDomServer.renderToStaticMarkup(component);
44
- const document = `${doctype}${markup}`;
119
+ const readableStream = yield renderToStream2(component);
120
+ const html = yield readStream(readableStream);
121
+ const document = `${doctype}${html}`;
45
122
  if (options && options.pretty) {
46
123
  return (0, import_pretty.default)(document);
47
124
  }
48
125
  return document;
49
- };
126
+ });
50
127
  var renderAsPlainText = (component, _options) => {
51
128
  return (0, import_html_to_text.convert)(ReactDomServer.renderToStaticMarkup(component), {
52
129
  selectors: [
@@ -56,27 +133,50 @@ var renderAsPlainText = (component, _options) => {
56
133
  });
57
134
  };
58
135
 
59
- // src/renderAsync.ts
136
+ // src/render-async.ts
60
137
  var import_html_to_text2 = require("html-to-text");
61
138
  var import_pretty2 = __toESM(require("pretty"));
62
- var import_server = require("react-dom/server");
63
- async function renderToString(children) {
64
- const stream = await (0, import_server.renderToReadableStream)(children);
65
- const html = await readableStreamToString(
66
- stream
67
- );
68
- return html.replace(/^<!DOCTYPE html>/, "").replace(/<!-- -->/g, "");
139
+ var import_server = __toESM(require("react-dom/server"));
140
+ var { renderToStaticMarkup: renderToStaticMarkup2 } = import_server.default;
141
+ var renderToStream = (
142
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
143
+ import_server.default.renderToReadableStream || import_server.default.renderToPipeableStream
144
+ );
145
+ function renderToString(children) {
146
+ return __async(this, null, function* () {
147
+ const stream = yield renderToStream(children);
148
+ const html = yield readableStreamToString(
149
+ // ReactDOMServerReadableStream behaves like ReadableStream
150
+ // in modern edge runtimes but the types are not compatible
151
+ stream
152
+ );
153
+ return html.replace(/^<!DOCTYPE html>/, "").replace(/<!-- -->/g, "");
154
+ });
69
155
  }
70
- async function readableStreamToString(readableStream) {
71
- let result = "";
72
- const decoder = new TextDecoder();
73
- for await (const chunk of readableStream) {
74
- result += decoder.decode(chunk);
75
- }
76
- return result;
156
+ function readableStreamToString(readableStream) {
157
+ return __async(this, null, function* () {
158
+ let result = "";
159
+ const decoder = new TextDecoder();
160
+ try {
161
+ for (var iter = __forAwait(readableStream), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
162
+ const chunk = temp.value;
163
+ result += decoder.decode(chunk);
164
+ }
165
+ } catch (temp) {
166
+ error = [temp];
167
+ } finally {
168
+ try {
169
+ more && (temp = iter.return) && (yield temp.call(iter));
170
+ } finally {
171
+ if (error)
172
+ throw error[0];
173
+ }
174
+ }
175
+ return result;
176
+ });
77
177
  }
78
- var renderAsync = async (component, options) => {
79
- const markup = typeof import_server.renderToStaticMarkup === "undefined" ? await renderToString(component) : (0, import_server.renderToStaticMarkup)(component);
178
+ var renderAsync = (component, options) => __async(void 0, null, function* () {
179
+ const markup = typeof renderToStaticMarkup2 === "undefined" ? yield renderToString(component) : renderToStaticMarkup2(component);
80
180
  if (options == null ? void 0 : options.plainText) {
81
181
  return (0, import_html_to_text2.convert)(markup, {
82
182
  selectors: [
@@ -91,7 +191,7 @@ var renderAsync = async (component, options) => {
91
191
  return (0, import_pretty2.default)(document);
92
192
  }
93
193
  return document;
94
- };
194
+ });
95
195
  // Annotate the CommonJS export names for ESM import in node:
96
196
  0 && (module.exports = {
97
197
  render,
package/dist/index.mjs CHANGED
@@ -1,19 +1,93 @@
1
+ var __knownSymbol = (name, symbol) => {
2
+ if (symbol = Symbol[name])
3
+ return symbol;
4
+ throw Error("Symbol." + name + " is not defined");
5
+ };
6
+ var __async = (__this, __arguments, generator) => {
7
+ return new Promise((resolve, reject) => {
8
+ var fulfilled = (value) => {
9
+ try {
10
+ step(generator.next(value));
11
+ } catch (e) {
12
+ reject(e);
13
+ }
14
+ };
15
+ var rejected = (value) => {
16
+ try {
17
+ step(generator.throw(value));
18
+ } catch (e) {
19
+ reject(e);
20
+ }
21
+ };
22
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
23
+ step((generator = generator.apply(__this, __arguments)).next());
24
+ });
25
+ };
26
+ var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
27
+
1
28
  // src/render.ts
2
29
  import * as ReactDomServer from "react-dom/server";
3
30
  import { convert } from "html-to-text";
4
31
  import pretty from "pretty";
5
- var render = (component, options) => {
32
+ var readPipeableStream = (readableStream) => __async(void 0, null, function* () {
33
+ let buffer = "";
34
+ try {
35
+ for (var iter = __forAwait(readableStream), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
36
+ const chunk = temp.value;
37
+ const chunkText = new TextDecoder("utf-8").decode(chunk);
38
+ buffer += chunkText;
39
+ }
40
+ } catch (temp) {
41
+ error = [temp];
42
+ } finally {
43
+ try {
44
+ more && (temp = iter.return) && (yield temp.call(iter));
45
+ } finally {
46
+ if (error)
47
+ throw error[0];
48
+ }
49
+ }
50
+ return buffer;
51
+ });
52
+ var readReactDOMServerReadableStream = (readableStream) => __async(void 0, null, function* () {
53
+ const reader = readableStream.getReader();
54
+ const chunks = [];
55
+ while (true) {
56
+ const { value, done } = yield reader.read();
57
+ if (done) {
58
+ break;
59
+ }
60
+ chunks.push(value);
61
+ }
62
+ return chunks.map((chunk) => new TextDecoder("utf-8").decode(chunk)).join("");
63
+ });
64
+ var isPipeableStream = (stream) => "pipeTo" in stream;
65
+ var readStream = (readableStream) => __async(void 0, null, function* () {
66
+ if (isPipeableStream(readableStream)) {
67
+ return readPipeableStream(readableStream);
68
+ } else if (typeof readableStream === "string") {
69
+ return readableStream;
70
+ }
71
+ return readReactDOMServerReadableStream(readableStream);
72
+ });
73
+ var render = (component, options) => __async(void 0, null, function* () {
74
+ const reactDOMServer = (yield import("react-dom/server")).default;
75
+ const renderToStream2 = (
76
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
77
+ reactDOMServer.renderToReadableStream || reactDOMServer.renderToPipeableStream
78
+ );
6
79
  if (options == null ? void 0 : options.plainText) {
7
80
  return renderAsPlainText(component, options);
8
81
  }
9
82
  const doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
10
- const markup = ReactDomServer.renderToStaticMarkup(component);
11
- const document = `${doctype}${markup}`;
83
+ const readableStream = yield renderToStream2(component);
84
+ const html = yield readStream(readableStream);
85
+ const document = `${doctype}${html}`;
12
86
  if (options && options.pretty) {
13
87
  return pretty(document);
14
88
  }
15
89
  return document;
16
- };
90
+ });
17
91
  var renderAsPlainText = (component, _options) => {
18
92
  return convert(ReactDomServer.renderToStaticMarkup(component), {
19
93
  selectors: [
@@ -23,27 +97,50 @@ var renderAsPlainText = (component, _options) => {
23
97
  });
24
98
  };
25
99
 
26
- // src/renderAsync.ts
100
+ // src/render-async.ts
27
101
  import { convert as convert2 } from "html-to-text";
28
102
  import pretty2 from "pretty";
29
- import { renderToReadableStream, renderToStaticMarkup as renderToStaticMarkup2 } from "react-dom/server";
30
- async function renderToString(children) {
31
- const stream = await renderToReadableStream(children);
32
- const html = await readableStreamToString(
33
- stream
34
- );
35
- return html.replace(/^<!DOCTYPE html>/, "").replace(/<!-- -->/g, "");
103
+ import react from "react-dom/server";
104
+ var { renderToStaticMarkup: renderToStaticMarkup2 } = react;
105
+ var renderToStream = (
106
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
107
+ react.renderToReadableStream || react.renderToPipeableStream
108
+ );
109
+ function renderToString(children) {
110
+ return __async(this, null, function* () {
111
+ const stream = yield renderToStream(children);
112
+ const html = yield readableStreamToString(
113
+ // ReactDOMServerReadableStream behaves like ReadableStream
114
+ // in modern edge runtimes but the types are not compatible
115
+ stream
116
+ );
117
+ return html.replace(/^<!DOCTYPE html>/, "").replace(/<!-- -->/g, "");
118
+ });
36
119
  }
37
- async function readableStreamToString(readableStream) {
38
- let result = "";
39
- const decoder = new TextDecoder();
40
- for await (const chunk of readableStream) {
41
- result += decoder.decode(chunk);
42
- }
43
- return result;
120
+ function readableStreamToString(readableStream) {
121
+ return __async(this, null, function* () {
122
+ let result = "";
123
+ const decoder = new TextDecoder();
124
+ try {
125
+ for (var iter = __forAwait(readableStream), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
126
+ const chunk = temp.value;
127
+ result += decoder.decode(chunk);
128
+ }
129
+ } catch (temp) {
130
+ error = [temp];
131
+ } finally {
132
+ try {
133
+ more && (temp = iter.return) && (yield temp.call(iter));
134
+ } finally {
135
+ if (error)
136
+ throw error[0];
137
+ }
138
+ }
139
+ return result;
140
+ });
44
141
  }
45
- var renderAsync = async (component, options) => {
46
- const markup = typeof renderToStaticMarkup2 === "undefined" ? await renderToString(component) : renderToStaticMarkup2(component);
142
+ var renderAsync = (component, options) => __async(void 0, null, function* () {
143
+ const markup = typeof renderToStaticMarkup2 === "undefined" ? yield renderToString(component) : renderToStaticMarkup2(component);
47
144
  if (options == null ? void 0 : options.plainText) {
48
145
  return convert2(markup, {
49
146
  selectors: [
@@ -58,7 +155,7 @@ var renderAsync = async (component, options) => {
58
155
  return pretty2(document);
59
156
  }
60
157
  return document;
61
- };
158
+ });
62
159
  export {
63
160
  render,
64
161
  renderAsync
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-email/render",
3
- "version": "0.0.7",
3
+ "version": "0.0.9-canary.0",
4
4
  "description": "Transform React components into HTML email templates",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -9,16 +9,26 @@
9
9
  "files": [
10
10
  "dist/**"
11
11
  ],
12
+ "exports": {
13
+ ".": {
14
+ "import": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.mjs"
17
+ },
18
+ "require": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ }
22
+ }
23
+ },
12
24
  "license": "MIT",
13
25
  "scripts": {
14
26
  "build": "tsup src/index.ts --format esm,cjs --dts --external react",
15
- "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
16
- "lint": "eslint",
17
27
  "clean": "rm -rf dist",
18
- "test": "jest",
19
- "test:watch": "jest --watch",
20
- "format:check": "prettier --check \"**/*.{ts,tsx,md}\"",
21
- "format": "prettier --write \"**/*.{ts,tsx,md}\""
28
+ "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch",
29
+ "lint": "eslint .",
30
+ "test:watch": "vitest",
31
+ "test": "vitest run"
22
32
  },
23
33
  "repository": {
24
34
  "type": "git",
@@ -30,28 +40,21 @@
30
40
  "email"
31
41
  ],
32
42
  "engines": {
33
- "node": ">=16.0.0"
43
+ "node": ">=18.0.0"
34
44
  },
35
45
  "dependencies": {
36
- "html-to-text": "9.0.3",
46
+ "html-to-text": "9.0.5",
37
47
  "pretty": "2.0.0",
38
48
  "react": "18.2.0",
39
49
  "react-dom": "18.2.0"
40
50
  },
41
51
  "devDependencies": {
42
- "@babel/preset-react": "7.18.6",
43
- "@types/html-to-text": "9.0.0",
44
- "@types/jest": "29.5.0",
52
+ "@babel/preset-react": "7.22.5",
53
+ "@types/html-to-text": "9.0.1",
45
54
  "@types/pretty": "2.0.1",
46
- "@types/react": "18.0.20",
47
- "@types/react-dom": "18.0.6",
48
- "babel-jest": "28.1.3",
49
- "eslint": "8.23.1",
50
- "jest": "28.1.3",
51
- "prettier": "2.8.4",
52
- "ts-jest": "28.0.8",
53
- "tsup": "6.2.3",
54
- "typescript": "4.8.3"
55
+ "eslint-config-custom": "workspace:*",
56
+ "tsconfig": "workspace:*",
57
+ "typescript": "5.1.6"
55
58
  },
56
59
  "publishConfig": {
57
60
  "access": "public"