Skip to content

Commit a0c2272

Browse files
committed
Add Babel 8 preset smoke
1 parent dc1f658 commit a0c2272

2 files changed

Lines changed: 193 additions & 3 deletions

File tree

.github/workflows/node.yml

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ jobs:
8282
git fetch origin ${{ github.event.pull_request.base.sha }}
8383
if git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -q '^.github/workflows'; then
8484
echo "changed=true" >> "$GITHUB_OUTPUT"
85-
response=$(curl -sf https://api.github.com/repos/rhysd/actionlint/releases/latest)
86-
if [ $? -eq 0 ]; then
85+
if response=$(curl -sf https://api.github.com/repos/rhysd/actionlint/releases/latest); then
8786
actionlint_version=$(echo "$response" | jq -r .tag_name)
8887
if [ -z "$actionlint_version" ]; then
8988
echo "Failed to parse Actionlint version"
@@ -141,7 +140,7 @@ jobs:
141140
--skipLibCheck \
142141
--moduleResolution bundler \
143142
--types node \
144-
*.d.ts
143+
./*.d.ts
145144
test:
146145
name: Testing
147146
strategy:
@@ -169,3 +168,28 @@ jobs:
169168

170169
- name: Jest Specs
171170
run: yarn test
171+
172+
babel8-smoke:
173+
name: Babel 8 smoke
174+
runs-on: ubuntu-latest
175+
176+
steps:
177+
- uses: actions/checkout@v4
178+
with:
179+
persist-credentials: false
180+
- name: Use Node.js 24
181+
uses: actions/setup-node@v4
182+
with:
183+
node-version: "24.x"
184+
cache: yarn
185+
186+
- name: Install dependencies
187+
run: yarn --frozen-lockfile --non-interactive --prefer-offline
188+
189+
- name: Build TypeScript
190+
run: yarn build
191+
192+
- name: Babel 8 smoke
193+
run: yarn jest test/package/babel8-smoke.test.js --runInBand
194+
env:
195+
RUN_BABEL8_SMOKE: "1"

test/package/babel8-smoke.test.js

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// Opt-in Babel 8 compatibility smoke.
2+
//
3+
// The normal test suite intentionally keeps repository development pins on
4+
// Babel 7. Enable this smoke with RUN_BABEL8_SMOKE=1 after `yarn build`; it
5+
// installs Babel 8 packages into a temp app and runs Webpack through
6+
// babel-loader 10 with Shakapacker's built Babel preset.
7+
8+
const { spawnSync } = require("child_process")
9+
const fs = require("fs")
10+
const { createRequire } = require("module")
11+
const os = require("os")
12+
const path = require("path")
13+
const webpack = require("webpack")
14+
15+
const repoRoot = path.resolve(__dirname, "../..")
16+
const presetPath = path.join(repoRoot, "package/babel/preset.js")
17+
const optedIn = process.env.RUN_BABEL8_SMOKE === "1"
18+
const coreIsBuilt = fs.existsSync(presetPath)
19+
20+
const toolVersion = (cmd) => {
21+
const r = spawnSync(cmd, ["--version"], {
22+
encoding: "utf8",
23+
cwd: os.tmpdir()
24+
})
25+
return r.status === 0 ? r.stdout.trim() : null
26+
}
27+
28+
const npmVersion = toolVersion("npm")
29+
const hasNpm = npmVersion !== null
30+
const shouldRun = optedIn && coreIsBuilt && hasNpm
31+
32+
const run = (cmd, args, options) => {
33+
const r = spawnSync(cmd, args, { encoding: "utf8", ...options })
34+
if (r.status !== 0) {
35+
throw new Error(
36+
`${cmd} ${args.join(" ")} failed in ${options.cwd}\nstdout:\n${r.stdout}\nstderr:\n${r.stderr}`
37+
)
38+
}
39+
return r
40+
}
41+
42+
const packageVersion = (appRequire, packageName) => {
43+
const packageJsonPath = appRequire.resolve(`${packageName}/package.json`)
44+
return appRequire(packageJsonPath).version
45+
}
46+
47+
const runWebpack = (config) =>
48+
new Promise((resolve, reject) => {
49+
const compiler = webpack(config)
50+
compiler.run((error, stats) => {
51+
let resultError = error
52+
53+
if (!resultError && stats.hasErrors()) {
54+
resultError = new Error(stats.toString({ all: false, errors: true }))
55+
}
56+
57+
compiler.close((closeError) => {
58+
if (closeError) {
59+
reject(closeError)
60+
return
61+
}
62+
63+
if (resultError) {
64+
reject(resultError)
65+
return
66+
}
67+
68+
resolve(stats)
69+
})
70+
})
71+
})
72+
73+
const computeSkipReason = () => {
74+
if (!optedIn) return "RUN_BABEL8_SMOKE=1 not set"
75+
if (!coreIsBuilt) return "shakapacker not built (run `yarn build`)"
76+
if (!hasNpm) return "npm unavailable on PATH"
77+
return "unknown skip reason"
78+
}
79+
80+
describe("Babel 8 preset smoke (issue #1191)", () => {
81+
let workRoot
82+
83+
beforeAll(() => {
84+
if (!shouldRun) return
85+
86+
workRoot = fs.mkdtempSync(path.join(os.tmpdir(), "shaka-babel8-smoke-"))
87+
fs.writeFileSync(
88+
path.join(workRoot, "package.json"),
89+
JSON.stringify({ name: "shaka-babel8-smoke", private: true }, null, 2)
90+
)
91+
run(
92+
"npm",
93+
[
94+
"install",
95+
"--no-audit",
96+
"--no-fund",
97+
"--save-dev",
98+
"@babel/core@^8",
99+
"@babel/plugin-transform-runtime@^8",
100+
"@babel/preset-env@^8",
101+
"@babel/runtime@^8",
102+
"babel-loader@^10"
103+
],
104+
{ cwd: workRoot }
105+
)
106+
}, 180000)
107+
108+
afterAll(() => {
109+
if (!workRoot) return
110+
fs.rmSync(workRoot, { recursive: true, force: true })
111+
})
112+
113+
if (!shouldRun) {
114+
test.todo(`Babel 8 smoke skipped (${computeSkipReason()})`)
115+
return
116+
}
117+
118+
test("compiles through babel-loader 10 with the Shakapacker Babel preset and Babel 8", async () => {
119+
const srcDir = path.join(workRoot, "src")
120+
const distDir = path.join(workRoot, "dist")
121+
fs.mkdirSync(srcDir)
122+
fs.writeFileSync(
123+
path.join(srcDir, "index.js"),
124+
"const answer = () => ({ value: 42 });\nconsole.log(answer()?.value);\n"
125+
)
126+
127+
const appRequire = createRequire(path.join(workRoot, "package.json"))
128+
expect(packageVersion(appRequire, "@babel/core")).toMatch(/^8\./)
129+
expect(packageVersion(appRequire, "babel-loader")).toMatch(/^10\./)
130+
131+
await runWebpack({
132+
mode: "development",
133+
context: workRoot,
134+
entry: path.join(srcDir, "index.js"),
135+
output: {
136+
path: distDir,
137+
filename: "bundle.js"
138+
},
139+
module: {
140+
rules: [
141+
{
142+
test: /\.js$/,
143+
include: srcDir,
144+
use: [
145+
{
146+
loader: appRequire.resolve("babel-loader"),
147+
options: {
148+
cacheDirectory: false,
149+
cwd: workRoot,
150+
presets: [presetPath]
151+
}
152+
}
153+
]
154+
}
155+
]
156+
},
157+
optimization: {
158+
minimize: false
159+
}
160+
})
161+
162+
expect(fs.readFileSync(path.join(distDir, "bundle.js"), "utf8")).toContain(
163+
"42"
164+
)
165+
}, 180000)
166+
})

0 commit comments

Comments
 (0)