Skip to content

Commit 66047b2

Browse files
authored
Use same-origin resources for compiler bundles. (#1038)
* Use same-origin resources * Keep CDN URL for Vercel build
1 parent 91f0676 commit 66047b2

File tree

7 files changed

+67
-21
lines changed

7 files changed

+67
-21
lines changed

.gitattributes

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
*.res linguist-language=ReScript
22
*.resi linguist-language=ReScript
3+
4+
/public/playground-bundles/** binary linguist-vendored

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ lib/
2626
.vercel
2727

2828
src/**/*.mjs
29-
scripts/**/*.mjs
29+
scripts/gendocs.mjs
30+
scripts/generate_*.mjs
3031

3132
# Generated via generate-llms script
3233
public/llms/manual/**/llm*.txt
3334
public/llms/react/**/llm*.txt
3435
pages/docs/**/**/llms.mdx
36+
37+
public/playground-bundles/

next.config.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const config = {
2121
ENV: process.env.NODE_ENV,
2222
VERSION_LATEST: process.env.VERSION_LATEST,
2323
VERSION_NEXT: process.env.VERSION_NEXT,
24+
VERCEL: process.env.VERCEL,
2425
},
2526
swcMinify: false,
2627
webpack: (config, options) => {

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"test": "node scripts/test-examples.mjs && node scripts/test-hrefs.mjs",
6363
"reanalyze": "reanalyze -all-cmt .",
6464
"update-index": "npm run generate-llms && node scripts/extract-indices.mjs && node scripts/extract-tocs.mjs && node scripts/extract-syntax.mjs && node scripts/generate_feed.mjs > public/blog/feed.xml",
65+
"sync-bundles": "node scripts/sync-playground-bundles.mjs",
6566
"generate-llms": "node scripts/generate_llms.mjs",
6667
"generate-resources": "node scripts/generate_resources.mjs"
6768
},

scripts/sync-playground-bundles.mjs

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import * as path from "node:path";
2+
import * as fs from "node:fs";
3+
import * as childProcess from "node:child_process";
4+
import { Readable } from "node:stream";
5+
import * as stream from "node:stream/promises";
6+
7+
const bucketUrl = new URL("https://cdn.rescript-lang.org");
8+
9+
const bundlesDir = path.join(import.meta.dirname, "../public/playground-bundles");
10+
const versions = await fetch(new URL("/playground-bundles/versions.json", bucketUrl))
11+
.then(res => res.json());
12+
13+
for (const version of versions) {
14+
const versionDir = path.join(bundlesDir, version);
15+
const compilerFile = path.join(versionDir, "compiler.js");
16+
if (fs.existsSync(compilerFile)) {
17+
console.log(`%s has already been synced.`, version);
18+
continue;
19+
}
20+
21+
console.group(`Syncing %s...`, version);
22+
{
23+
console.log(`Downloading archive file...`);
24+
const res = await fetch(new URL(`/playground-bundles/${version}.tar.zst`, bucketUrl));
25+
if (!res.ok) {
26+
console.error(await res.text());
27+
continue;
28+
}
29+
30+
const archiveFile = path.join(bundlesDir, `${version}.tar.zst`);
31+
const fileStream = fs.createWriteStream(archiveFile);
32+
await stream.finished(Readable.fromWeb(res.body).pipe(fileStream));
33+
34+
console.log("Extracting archive...");
35+
fs.mkdirSync(versionDir, { recursive: true });
36+
childProcess.execSync(`tar --zstd -xf "${archiveFile}" -C "${versionDir}"`);
37+
38+
console.log("Cleaning up...");
39+
fs.unlinkSync(archiveFile);
40+
41+
console.groupEnd();
42+
}
43+
}

src/Try.res

+8-16
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,14 @@ let default = props => {
3333

3434
let getStaticProps: Next.GetStaticProps.t<props, _> = async _ => {
3535
let versions = {
36-
let response = await Webapi.Fetch.fetch("https://cdn.rescript-lang.org/")
37-
let text = await Webapi.Fetch.Response.text(response)
38-
text
39-
->String.split("\n")
40-
->Array.filterMap(line => {
41-
switch line->String.startsWith("<a href") {
42-
| true =>
43-
// Adapted from https://semver.org/
44-
let semverRe = /v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?/
45-
switch RegExp.exec(semverRe, line) {
46-
| Some(result) => RegExp.Result.fullMatch(result)->Some
47-
| None => None
48-
}
49-
| false => None
50-
}
51-
})
36+
let response = await Webapi.Fetch.fetch(
37+
"https://cdn.rescript-lang.org/playground-bundles/versions.json",
38+
)
39+
let json = await Webapi.Fetch.Response.json(response)
40+
json
41+
->JSON.Decode.array
42+
->Option.getExn
43+
->Array.map(json => json->JSON.Decode.string->Option.getExn)
5244
}
5345

5446
{"props": {versions: versions}}

src/common/CompilerManagerHook.res

+8-4
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,18 @@ module LoadScript = {
3535
}
3636

3737
module CdnMeta = {
38-
let getCompilerUrl = (version): string =>
39-
`https://cdn.rescript-lang.org/${Semver.toString(version)}/compiler.js`
38+
let baseUrl = switch Node.Process.env->Dict.get("VERCEL") {
39+
| Some(_) => "https://cdn.rescript-lang.org"
40+
| None => "/playground-bundles"
41+
}
42+
43+
let getCompilerUrl = (version): string => `${baseUrl}/${Semver.toString(version)}/compiler.js`
4044

4145
let getLibraryCmijUrl = (version, libraryName: string): string =>
42-
`https://cdn.rescript-lang.org/${Semver.toString(version)}/${libraryName}/cmij.js`
46+
`${baseUrl}/${Semver.toString(version)}/${libraryName}/cmij.js`
4347

4448
let getStdlibRuntimeUrl = (version, filename) =>
45-
`https://cdn.rescript-lang.org/${Semver.toString(version)}/compiler-builtins/stdlib/${filename}`
49+
`${baseUrl}/${Semver.toString(version)}/compiler-builtins/stdlib/${filename}`
4650
}
4751

4852
module FinalResult = {

0 commit comments

Comments
 (0)