Skip to content

Commit ea8f561

Browse files
gabrielmfernbukinoshita
authored andcommitted
feat(create-email): Use latest from specified tag for react-email and @react-email/components (#2085)
1 parent 754b0fe commit ea8f561

File tree

7 files changed

+52
-402
lines changed

7 files changed

+52
-402
lines changed

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
"version": "0.0.0",
44
"private": true,
55
"scripts": {
6-
"build": "turbo run build --filter=!react-email-starter",
7-
"dev": "turbo run dev --filter=!react-email-starter --parallel --concurrency 25",
8-
"release": "turbo run build --filter=./packages/* --filter=!react-email-starter && pnpm changeset publish",
6+
"build": "turbo run build",
7+
"dev": "turbo run dev --parallel --concurrency 25",
8+
"release": "turbo run build --filter=./packages/* && pnpm changeset publish",
99
"canary:enter": "changeset pre enter canary",
1010
"canary:exit": "changeset pre exit",
1111
"version": "changeset version && pnpm install --no-frozen-lockfile && pnpm lint:fix",

packages/create-email/package.json

-2
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
"create-email": "src/index.js"
2828
},
2929
"devDependencies": {
30-
"@react-email/components": "0.0.37-canary.0",
3130
"react": "19.0.0",
32-
"react-email": "4.1.0-canary.0",
3331
"tsconfig": "workspace:*",
3432
"typescript": "5.8.2"
3533
}

packages/create-email/src/index.js

+33-19
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,27 @@ import logSymbols from 'log-symbols';
88
import ora from 'ora';
99
import { tree } from './tree.js';
1010

11-
const init = async (name) => {
11+
const getLatestVersionOfTag = async (packageName, tag) => {
12+
const response = await fetch(
13+
`https://registry.npmjs.org/${packageName}/${tag}`,
14+
);
15+
const data = await response.json();
16+
17+
if (typeof data === 'string' && data.startsWith('version not found')) {
18+
console.error(`Tag ${tag} does not exist for ${packageName}.`);
19+
process.exit(1);
20+
}
21+
22+
const { version } = data;
23+
24+
if (!/^\d+\.\d+\.\d+.*$/.test(version)) {
25+
console.error('Invalid version received, something has gone very wrong.');
26+
}
27+
28+
return version;
29+
};
30+
31+
const init = async (name, { tag }) => {
1232
let projectPath = name;
1333

1434
if (!projectPath) {
@@ -39,25 +59,18 @@ const init = async (name) => {
3959
resolvedProjectPath,
4060
'./package.json',
4161
);
42-
const templatePackageJson = JSON.parse(
43-
fse.readFileSync(templatePackageJsonPath, 'utf8'),
44-
);
45-
for (const key in templatePackageJson.dependencies) {
46-
// We remove any workspace prefix that might have been added for the purposes
47-
// of being used locally
48-
templatePackageJson.dependencies[key] = templatePackageJson.dependencies[
49-
key
50-
].replace('workspace:', '');
51-
}
52-
for (const key in templatePackageJson.devDependencies) {
53-
// We remove any workspace prefix that might have been added for the purposes
54-
// of being used locally
55-
templatePackageJson.devDependencies[key] =
56-
templatePackageJson.devDependencies[key].replace('workspace:', '');
57-
}
62+
const templatePackageJson = fse.readFileSync(templatePackageJsonPath, 'utf8');
5863
fse.writeFileSync(
5964
templatePackageJsonPath,
60-
JSON.stringify(templatePackageJson, null, 2),
65+
templatePackageJson
66+
.replace(
67+
'INSERT_COMPONENTS_VERSION',
68+
await getLatestVersionOfTag('@react-email/components', tag),
69+
)
70+
.replace(
71+
'INSERT_REACT_EMAIL_VERSION',
72+
await getLatestVersionOfTag('react-email', tag),
73+
),
6174
'utf8',
6275
);
6376

@@ -80,6 +93,7 @@ new Command()
8093
.name('create-email')
8194
.version('0.0.30-canary.0')
8295
.description('The easiest way to get started with React Email')
83-
.arguments('[dir]', 'path to initialize the project')
96+
.arguments('[dir]', 'Path to initialize the project')
97+
.option('-t, --tag <tag>', 'Tag of React Email versions to use', 'latest')
8498
.action(init)
8599
.parse(process.argv);

packages/create-email/src/index.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@ describe('automatic setup', () => {
2626
);
2727
});
2828

29+
test.sequential('install', { timeout: 40_000 }, () => {
30+
const installProcess = spawnSync('npm', ['install'], {
31+
shell: true,
32+
cwd: path.resolve(starterPath),
33+
stdio: 'pipe',
34+
});
35+
if (installProcess.stderr) {
36+
console.log(installProcess.stderr.toString());
37+
}
38+
expect(installProcess.status, 'starter npm install should return 0').toBe(
39+
0,
40+
);
41+
});
42+
2943
test.sequential('export', () => {
3044
const exportProcess = spawnSync('npm', ['run export'], {
3145
shell: true,

packages/create-email/template/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
"export": "email export"
99
},
1010
"dependencies": {
11-
"@react-email/components": "^0.0.36",
11+
"@react-email/components": "INSERT_COMPONENTS_VERSION",
1212
"react-dom": "19.0.0",
1313
"react": "19.0.0"
1414
},
1515
"devDependencies": {
1616
"@types/react": "19.0.1",
1717
"@types/react-dom": "19.0.1",
18-
"react-email": "^4.0.7"
18+
"react-email": "INSERT_REACT_EMAIL_VERSION"
1919
}
2020
}

0 commit comments

Comments
 (0)