Skip to content

Commit 5805947

Browse files
authored
build with esbuild; support Node 18+ (#963)
* build with esbuild * fix import attributes * semi-functional esbuild for mocha * process.env.npm_package_version * downgrade to Node16 * one more process.env.npm_package_version * getClientPath fixes * allow node 18+ * fix c8 * support observablehq.config.ts * glob + build.js * --sourcemap=linked * logLevel: info * logging * logging? * separate arguments? * log positionals? * log arguments * double quotes? * fix missing pathToFileURL * remove extra logging * prepublishOnly; shebang * format=esm; fix bin * Node 18+
1 parent f704c48 commit 5805947

33 files changed

+845
-915
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
node-version: ${{ matrix.version }}
2222
cache: yarn
2323
- run: yarn --frozen-lockfile
24-
- run: yarn c8 --check-coverage -x src/**/*.d.ts -x src/preview.ts -x src/observableApiConfig.ts -x src/client -x src/convert.ts --lines 80 --per-file yarn test:mocha
24+
- run: yarn test:coverage
2525
- run: yarn test:tsc
2626
- run: |
2727
echo ::add-matcher::.github/eslint.json

.gitignore

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
.env
2-
.DS_Store
31
**/.observablehq/cache/
4-
coverage/
5-
docs/themes.md
6-
docs/theme/*.md
7-
dist/
2+
.DS_Store
3+
.env
4+
/build.test/
5+
/build/
6+
/coverage/
7+
/dist/
8+
/docs/theme/*.md
9+
/docs/themes.md
10+
/test/output/**/*-changed.*
11+
/test/output/build/**/*-changed/
812
node_modules/
9-
test/output/**/*-changed.*
10-
test/output/build/**/*-changed/
1113
yarn-error.log

bin/observable-init.js

Lines changed: 0 additions & 15 deletions
This file was deleted.

build.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {parseArgs} from "node:util";
2+
import {build} from "esbuild";
3+
import {glob} from "glob";
4+
5+
const {values, positionals} = parseArgs({
6+
allowPositionals: true,
7+
options: {
8+
outdir: {type: "string", default: "build"},
9+
outbase: {type: "string"},
10+
ignore: {type: "string", multiple: true},
11+
sourcemap: {type: "boolean"}
12+
}
13+
});
14+
15+
await build({
16+
entryPoints: await glob(positionals, {ignore: values.ignore}),
17+
define: {"process.env.npm_package_version": `"${process.env.npm_package_version}"`},
18+
outdir: values.outdir,
19+
outbase: values.outbase,
20+
platform: "node",
21+
sourcemap: values.sourcemap ? "linked" : false,
22+
format: "esm",
23+
logLevel: "info"
24+
});

docs/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ These are just first steps. You can continue to develop projects after publishin
8484
Framework includes a helper script (`observable create`) for creating new projects. After a few quick prompts — where to create the project, your preferred package manager, *etc.* — it will stamp out a fresh project from a template.
8585

8686
<div class="tip">
87-
<p>Framework is a <a href="https://nodejs.org/">Node.js</a> application published to npm. You must have <a href="https://nodejs.org/en/download">Node.js 20.6 or later</a> installed before you can install Framework. Framework is a command-line interface (CLI) and runs in the terminal.</p>
87+
<p>Framework is a <a href="https://nodejs.org/">Node.js</a> application published to npm. You must have <a href="https://nodejs.org/en/download">Node.js 18 or later</a> installed before you can install Framework. Framework is a command-line interface (CLI) and runs in the terminal.</p>
8888
<p>If you run into difficulty following this tutorial, we’re happy to help! Please visit the <a href="https://talk.observablehq.com">Observable forum</a> or our <a href="https://github.com/observablehq/framework/discussions">GitHub discussions</a>.</p>
8989
</div>
9090

examples/api/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../.."
1010
},
1111
"engines": {
12-
"node": ">=20.6"
12+
"node": ">=18"
1313
}
1414
}

examples/chess/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../..",
@@ -12,6 +12,6 @@
1212
"jszip": "^3.10.1"
1313
},
1414
"engines": {
15-
"node": ">=20.6"
15+
"node": ">=18"
1616
}
1717
}

examples/eia/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../..",
@@ -13,6 +13,6 @@
1313
"topojson-simplify": "^3.0.3"
1414
},
1515
"engines": {
16-
"node": ">=20.6"
16+
"node": ">=18"
1717
}
1818
}

examples/google-analytics/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@google-analytics/data": "^4.3.0",
1010
"@observablehq/framework": "link:../..",
1111
"dotenv": "^16.3.1"
1212
},
1313
"engines": {
14-
"node": ">=20.6"
14+
"node": ">=18"
1515
},
1616
"devDependencies": {
1717
"@types/node": "^20.10.6"

examples/hello-world/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../.."
1010
},
1111
"engines": {
12-
"node": ">=20.6"
12+
"node": ">=18"
1313
}
1414
}

examples/mortgage-rates/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../..",
1010
"d3-fetch": "^3.0.1",
1111
"d3-time-format": "^4.1.0"
1212
},
1313
"engines": {
14-
"node": ">=20.6"
14+
"node": ">=18"
1515
}
1616
}

examples/penguin-classification/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../.."
1010
},
1111
"engines": {
12-
"node": ">=20.6"
12+
"node": ">=18"
1313
}
1414
}

examples/plot/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"scripts": {
44
"dev": "observable preview",
55
"build": "rm -rf dist && observable build",
6-
"postinstall": "ln -sf ../../../../bin/observable-init.js node_modules/.bin/observable"
6+
"postinstall": "ln -sf ../../../../build/bin/observable.js node_modules/.bin/observable"
77
},
88
"dependencies": {
99
"@observablehq/framework": "link:../..",
@@ -13,7 +13,7 @@
1313
"dotenv": "^16.3.1"
1414
},
1515
"engines": {
16-
"node": ">=20.6"
16+
"node": ">=18"
1717
},
1818
"devDependencies": {
1919
"@types/node": "^20.10.6"

observablehq.config.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import {version} from "./package.json" assert {type: "json"};
2-
31
export default {
42
title: "Observable Framework",
53
pages: [
@@ -104,7 +102,7 @@ export default {
104102
<span class="hide-if-small">Observable</span> Framework
105103
</a>
106104
<span style="display: flex; align-items: baseline; gap: 0.5rem; font-size: 14px;">
107-
<a target="_blank" href="https://github.com/observablehq/framework/releases"><span>${version}</span></a>
105+
<a target="_blank" href="https://github.com/observablehq/framework/releases"><span>${process.env.npm_package_version}</span></a>
108106
<a target="_blank" href="https://github.com/observablehq/framework"><span>GitHub</span></a>
109107
</span>
110108
</div>

package.json

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,40 @@
1111
"url": "https://github.com/observablehq/framework.git"
1212
},
1313
"files": [
14-
"bin/**/*.js",
15-
"bin/**/*.ts",
16-
"src/**/*.js",
17-
"src/**/*.ts",
18-
"src/**/*.css",
14+
"build/**/*.js",
15+
"build/**/*.css",
1916
"templates"
2017
],
2118
"bin": {
22-
"observable": "bin/observable-init.js"
19+
"observable": "build/bin/observable.js"
2320
},
2421
"scripts": {
25-
"dev": "rimraf --glob docs/themes.md docs/theme/*.md && (tsx watch docs/theme/generate-themes.ts & tsx watch --no-warnings=ExperimentalWarning ./bin/observable.ts preview --no-open)",
26-
"build": "yarn rebuild-themes && rimraf dist && tsx --no-warnings=ExperimentalWarning ./bin/observable.ts build",
27-
"deploy": "yarn rebuild-themes && tsx --no-warnings=ExperimentalWarning ./bin/observable.ts deploy",
22+
"dev": "rimraf --glob docs/themes.md docs/theme/*.md && (tsx watch docs/theme/generate-themes.ts & tsx watch --no-warnings=ExperimentalWarning ./src/bin/observable.ts preview --no-open)",
23+
"build:mocha": "rimraf build.test && node build.js --sourcemap --outdir=build.test \"{src,test}/**/*.{ts,js,css}\" --ignore \"test/input/**\" --ignore \"test/output/**\" --ignore \"test/preview/dashboard/**\" --ignore \"**/*.d.ts\" && cp -r templates build.test",
24+
"build": "yarn rebuild-themes && rimraf dist && tsx --no-warnings=ExperimentalWarning ./src/bin/observable.ts build",
25+
"deploy": "yarn rebuild-themes && tsx --no-warnings=ExperimentalWarning ./src/bin/observable.ts deploy",
2826
"rebuild-themes": "rimraf --glob docs/themes.md docs/theme/*.md && tsx docs/theme/generate-themes.ts",
2927
"test": "concurrently npm:test:mocha npm:test:tsc npm:test:lint npm:test:prettier",
30-
"test:coverage": "c8 yarn test:mocha",
31-
"test:mocha": "rimraf --glob test/.observablehq/cache test/input/build/*/.observablehq/cache && cross-env OBSERVABLE_TELEMETRY_DISABLE=1 TZ=America/Los_Angeles tsx --no-warnings=ExperimentalWarning ./node_modules/mocha/bin/mocha.js -p 'test/**/*-test.*'",
32-
"test:mocha:serial": "rimraf --glob test/.observablehq/cache test/input/build/*/.observablehq/cache && cross-env OBSERVABLE_TELEMETRY_DISABLE=1 TZ=America/Los_Angeles tsx --no-warnings=ExperimentalWarning ./node_modules/mocha/bin/mocha.js 'test/**/*-test.*'",
28+
"test:coverage": "c8 --check-coverage --lines 80 --per-file yarn test:mocha",
29+
"test:mocha": "yarn build:mocha && rimraf --glob test/.observablehq/cache test/input/build/*/.observablehq/cache && cross-env OBSERVABLE_TELEMETRY_DISABLE=1 TZ=America/Los_Angeles mocha -p \"build.test/test/**/*-test.js\"",
30+
"test:mocha:serial": "yarn build:mocha && rimraf --glob test/.observablehq/cache test/input/build/*/.observablehq/cache && cross-env OBSERVABLE_TELEMETRY_DISABLE=1 TZ=America/Los_Angeles mocha \"build.test/test/**/*-test.js\"",
3331
"test:lint": "eslint src test --max-warnings=0",
3432
"test:prettier": "prettier --check src test",
3533
"test:tsc": "tsc --noEmit",
36-
"observable": "tsx --no-warnings=ExperimentalWarning ./bin/observable.ts"
34+
"observable": "tsx --no-warnings=ExperimentalWarning ./src/bin/observable.ts",
35+
"prepublishOnly": "rimraf build && node build.js --outdir=build --outbase=src \"src/**/*.{ts,js,css}\" --ignore \"**/*.d.ts\""
3736
},
3837
"c8": {
3938
"all": true,
4039
"include": [
41-
"src/**/*.js",
42-
"src/**/*.ts"
40+
"build.test/src/**/*.js"
41+
],
42+
"exclude": [
43+
"build.test/src/bin/",
44+
"build.test/src/client/",
45+
"build.test/src/convert.js",
46+
"build.test/src/observableApiConfig.js",
47+
"build.test/src/preview.js"
4348
],
4449
"reporter": [
4550
"text",
@@ -75,7 +80,7 @@
7580
"semver": "^7.5.4",
7681
"send": "^0.18.0",
7782
"tar-stream": "^3.1.6",
78-
"tsx": "~4.2.1",
83+
"tsx": "^4.7.1",
7984
"untildify": "^5.0.0",
8085
"wrap-ansi": "^9.0.0",
8186
"ws": "^8.14.2"
@@ -106,6 +111,7 @@
106111
"eslint-import-resolver-typescript": "^3.6.1",
107112
"eslint-plugin-import": "^2.29.0",
108113
"fast-deep-equal": "^3.1.3",
114+
"glob": "^10.3.10",
109115
"mocha": "^10.2.0",
110116
"prettier": "^3.0.3 <3.1",
111117
"rimraf": "^5.0.5",
@@ -114,6 +120,6 @@
114120
"undici": "^5.27.2"
115121
},
116122
"engines": {
117-
"node": ">=20.6"
123+
"node": ">=18"
118124
}
119125
}

0 commit comments

Comments
 (0)