Skip to content

Commit 8c3553f

Browse files
committed
Use same-origin resources
1 parent 0559a42 commit 8c3553f

File tree

6 files changed

+62
-20
lines changed

6 files changed

+62
-20
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

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.DS_Store
22
*.swp
33
*.swo
4+
!.gitkeep
45

56
# Generated via update-index script
67
public/blog/feed.xml
@@ -26,9 +27,12 @@ lib/
2627
.vercel
2728

2829
src/**/*.mjs
29-
scripts/**/*.mjs
30+
scripts/gendocs.mjs
31+
scripts/generate_*.mjs
3032

3133
# Generated via generate-llms script
3234
public/llms/manual/**/llm*.txt
3335
public/llms/react/**/llm*.txt
3436
pages/docs/**/**/llms.mdx
37+
38+
public/playground-bundles/

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ module LoadScript = {
3636

3737
module CdnMeta = {
3838
let getCompilerUrl = (version): string =>
39-
`https://cdn.rescript-lang.org/${Semver.toString(version)}/compiler.js`
39+
`/playground-bundles/${Semver.toString(version)}/compiler.js`
4040

4141
let getLibraryCmijUrl = (version, libraryName: string): string =>
42-
`https://cdn.rescript-lang.org/${Semver.toString(version)}/${libraryName}/cmij.js`
42+
`/playground-bundles/${Semver.toString(version)}/${libraryName}/cmij.js`
4343

4444
let getStdlibRuntimeUrl = (version, filename) =>
45-
`https://cdn.rescript-lang.org/${Semver.toString(version)}/compiler-builtins/stdlib/${filename}`
45+
`/playground-bundles/${Semver.toString(version)}/compiler-builtins/stdlib/${filename}`
4646
}
4747

4848
module FinalResult = {

0 commit comments

Comments
 (0)