From d8e2161f15db9b9f523cda3e1b36bc7f7e84ca0e Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 6 Nov 2022 13:37:07 +0000 Subject: [PATCH] Move website source/build logic to projects/web Mostly useful as it moves some of our build logic out of the main project, as that's already pretty noisy! --- .github/workflows/make-doc.sh | 2 +- .gitignore | 3 - CONTRIBUTING.md | 2 +- build.gradle.kts | 73 --------------- illuaminate.sexp | 11 ++- projects/web/build.gradle.kts | 91 +++++++++++++++++++ .../web/rollup.config.js | 6 +- .../web/src}/components/Recipe.tsx | 0 .../web/src}/components/WithExport.tsx | 0 .../web/src}/components/support.tsx | 0 {src/web => projects/web/src}/index.tsx | 0 {src/web => projects/web/src}/mount/.settings | 0 .../web/src}/mount/example.dfpwm | 0 .../web/src}/mount/example.dfpwm.LICENSE | 0 .../web/src}/mount/example.nfp | 0 .../web/src}/mount/example.nft | 0 .../web/src}/mount/expr_template.lua | 0 .../web/src}/mount/startup.lua | 0 {src/web => projects/web/src}/styles.css | 0 {src/web => projects/web/src}/transform.tsx | 2 +- {src/web => projects/web/src}/typings.ts | 0 tsconfig.json => projects/web/tsconfig.json | 2 +- settings.gradle.kts | 1 + 23 files changed, 106 insertions(+), 87 deletions(-) create mode 100644 projects/web/build.gradle.kts rename rollup.config.js => projects/web/rollup.config.js (91%) rename {src/web => projects/web/src}/components/Recipe.tsx (100%) rename {src/web => projects/web/src}/components/WithExport.tsx (100%) rename {src/web => projects/web/src}/components/support.tsx (100%) rename {src/web => projects/web/src}/index.tsx (100%) rename {src/web => projects/web/src}/mount/.settings (100%) rename {src/web => projects/web/src}/mount/example.dfpwm (100%) rename {src/web => projects/web/src}/mount/example.dfpwm.LICENSE (100%) rename {src/web => projects/web/src}/mount/example.nfp (100%) rename {src/web => projects/web/src}/mount/example.nft (100%) rename {src/web => projects/web/src}/mount/expr_template.lua (100%) rename {src/web => projects/web/src}/mount/startup.lua (100%) rename {src/web => projects/web/src}/styles.css (100%) rename {src/web => projects/web/src}/transform.tsx (93%) rename {src/web => projects/web/src}/typings.ts (100%) rename tsconfig.json => projects/web/tsconfig.json (97%) diff --git a/.github/workflows/make-doc.sh b/.github/workflows/make-doc.sh index e7aca0e61..e3e8a99fe 100755 --- a/.github/workflows/make-doc.sh +++ b/.github/workflows/make-doc.sh @@ -12,7 +12,7 @@ chmod 600 "$HOME/.ssh/key" # And upload rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \ - "$GITHUB_WORKSPACE/build/docs/site/" \ + "$GITHUB_WORKSPACE/projects/web/build/site/" \ "$SSH_USER@$SSH_HOST:/$DEST" rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \ "$GITHUB_WORKSPACE/build/docs/javadoc/" \ diff --git a/.gitignore b/.gitignore index 55e79e03e..dfcf71d52 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ # Runtime directories /run -/run-* *.ipr *.iws @@ -24,8 +23,6 @@ /.project /.settings /.vscode -bin/ *.launch /src/generated/resources/.cache -/src/web/mount/*.d.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 31c750ae3..99184e730 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,7 +52,7 @@ ### Documentation - Run `npm ci` to install our Node dependencies. You can now run `./gradlew docWebsite`. This generates documentation from our Lua and Java code, writing the resulting -HTML into `./build/docs/site`. +HTML into `./projects/web/build/site`. #### Writing documentation illuaminate's documentation system is not currently documented (somewhat ironic), but is _largely_ the same as diff --git a/build.gradle.kts b/build.gradle.kts index f59e729f6..2a7fdcfa1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,7 +19,6 @@ plugins { alias(libs.plugins.ideaExt) id("cc-tweaked.illuaminate") - id("cc-tweaked.node") id("cc-tweaked.gametest") id("cc-tweaked.publishing") id("cc-tweaked") @@ -247,78 +246,6 @@ tasks.shadowJar { tasks.assemble { dependsOn("shadowJar") } -// Web tasks - -val rollup by tasks.registering(NpxExecToDir::class) { - group = LifecycleBasePlugin.BUILD_GROUP - description = "Bundles JS into rollup" - - // Sources - inputs.files(fileTree("src/web")).withPropertyName("sources") - // Config files - inputs.file("tsconfig.json").withPropertyName("Typescript config") - inputs.file("rollup.config.js").withPropertyName("Rollup config") - - // Output directory. Also defined in illuaminate.sexp and rollup.config.js - output.set(buildDir.resolve("rollup")) - - args = listOf("rollup", "--config", "rollup.config.js") -} - -val illuaminateDocs by tasks.registering(IlluaminateExecToDir::class) { - group = JavaBasePlugin.DOCUMENTATION_GROUP - description = "Generates docs using Illuaminate" - - // Config files - inputs.file("illuaminate.sexp").withPropertyName("illuaminate.sexp") - // Sources - inputs.files(fileTree("doc")).withPropertyName("docs") - inputs.files(fileTree("src/main/resources/data/computercraft/lua")).withPropertyName("lua rom") - inputs.files(luaJavadoc) - // Additional assets - inputs.files(rollup) - inputs.file("src/web/styles.css").withPropertyName("styles") - - // Output directory. Also defined in illuaminate.sexp and transform.tsx - output.set(buildDir.resolve("illuaminate")) - - args = listOf("doc-gen") -} - -val jsxDocs by tasks.registering(NpxExecToDir::class) { - group = JavaBasePlugin.DOCUMENTATION_GROUP - description = "Post-processes documentation to statically render some dynamic content." - - // Config files - inputs.file("tsconfig.json").withPropertyName("Typescript config") - // Sources - inputs.files(fileTree("src/web")).withPropertyName("sources") - inputs.file("src/generated/export/index.json").withPropertyName("export") - inputs.files(illuaminateDocs) - - // Output directory. Also defined in src/web/transform.tsx - output.set(buildDir.resolve("jsxDocs")) - - args = listOf("ts-node", "-T", "--esm", "src/web/transform.tsx") -} - -val docWebsite by tasks.registering(Copy::class) { - group = JavaBasePlugin.DOCUMENTATION_GROUP - description = "Assemble docs and assets together into the documentation website." - - from(jsxDocs) - - from("doc") { - include("logo.png") - include("images/**") - } - from(rollup) { exclude("index.js") } - from(illuaminateDocs) { exclude("**/*.html") } - from("src/generated/export/items") { into("images/items") } - - into(buildDir.resolve("docs/site")) -} - // Check tasks tasks.test { diff --git a/illuaminate.sexp b/illuaminate.sexp index cfd1527fe..081151132 100644 --- a/illuaminate.sexp +++ b/illuaminate.sexp @@ -6,11 +6,12 @@ /projects/core/src/main/resources/data/computercraft/lua/bios.lua /projects/core/src/main/resources/data/computercraft/lua/rom/ /projects/core/src/test/resources/test-rom - /src/web/mount) + /projects/web/src/mount) (doc - (destination build/illuaminate) + ; Also defined in projects/web/build.gradle.kts + (destination /projects/web/build/illuaminate) (index doc/index.md) (site @@ -19,8 +20,8 @@ (url https://tweaked.cc/) (source-link https://github.com/cc-tweaked/CC-Tweaked/blob/${commit}/${path}#L${line}) - (styles src/web/styles.css) - (scripts build/rollup/index.js) + (styles /projects/web/src/styles.css) + (scripts /projects/web/build/rollup/index.js) (head doc/head.html)) (module-kinds @@ -113,4 +114,4 @@ :max sleep write cct_test describe expect howlci fail it pending stub))) -(at /src/web/mount/expr_template.lua (lint (globals :max __expr__))) +(at /projects/web/src/mount/expr_template.lua (lint (globals :max __expr__))) diff --git a/projects/web/build.gradle.kts b/projects/web/build.gradle.kts new file mode 100644 index 000000000..25a05f80b --- /dev/null +++ b/projects/web/build.gradle.kts @@ -0,0 +1,91 @@ +plugins { + `lifecycle-base` + id("cc-tweaked.node") + id("cc-tweaked.illuaminate") +} + +node { + projectRoot.set(rootProject.projectDir) +} + +illuaminate { + version.set(libs.versions.illuaminate) +} + +val rollup by tasks.registering(cc.tweaked.gradle.NpxExecToDir::class) { + group = LifecycleBasePlugin.BUILD_GROUP + description = "Bundles JS into rollup" + + // Sources + inputs.files(fileTree("src")).withPropertyName("sources") + // Config files + inputs.file("tsconfig.json").withPropertyName("Typescript config") + inputs.file("rollup.config.js").withPropertyName("Rollup config") + + // Output directory. Also defined in illuaminate.sexp and rollup.config.js + output.set(buildDir.resolve("rollup")) + + args = listOf("rollup", "--config", "rollup.config.js") +} + +val illuaminateDocs by tasks.registering(cc.tweaked.gradle.IlluaminateExecToDir::class) { + group = JavaBasePlugin.DOCUMENTATION_GROUP + description = "Generates docs using Illuaminate" + + // Config files + inputs.file(rootProject.file("illuaminate.sexp")).withPropertyName("illuaminate config") + // Sources + inputs.files(fileTree("doc")).withPropertyName("docs") + inputs.files(fileTree("src/main/resources/data/computercraft/lua")).withPropertyName("lua rom") + inputs.files(rootProject.tasks.named("luaJavadoc")) + // Additional assets + inputs.files(rollup) + inputs.file("src/styles.css").withPropertyName("styles") + + // Output directory. Also defined in illuaminate.sexp and transform.tsx + output.set(buildDir.resolve("illuaminate")) + + args = listOf("doc-gen") + workingDir = rootProject.projectDir +} + +val jsxDocs by tasks.registering(cc.tweaked.gradle.NpxExecToDir::class) { + group = JavaBasePlugin.DOCUMENTATION_GROUP + description = "Post-processes documentation to statically render some dynamic content." + + // Config files + inputs.file("tsconfig.json").withPropertyName("Typescript config") + // Sources + inputs.files(fileTree("src")).withPropertyName("sources") + inputs.file(rootProject.file("src/generated/export/index.json")).withPropertyName("export") + inputs.files(illuaminateDocs) + + // Output directory. Also defined in src/transform.tsx + output.set(buildDir.resolve("jsxDocs")) + + args = listOf("ts-node", "-T", "--esm", "src/transform.tsx") +} + +val docWebsite by tasks.registering(Copy::class) { + group = JavaBasePlugin.DOCUMENTATION_GROUP + description = "Assemble docs and assets together into the documentation website." + duplicatesStrategy = DuplicatesStrategy.FAIL + + from(jsxDocs) + + // Pick up assets from the /docs folder + from(rootProject.file("doc")) { + include("logo.png") + include("images/**") + } + // index.js is provided by illuaminate, but rollup outputs some other chunks + from(rollup) { exclude("index.js") } + // Grab illuaminate's assets. HTML files are provided by jsxDocs + from(illuaminateDocs) { exclude("**/*.html") } + // And item/block images from the data export + from(rootProject.file("src/generated/export/items")) { into("images/items") } + + into(buildDir.resolve("site")) +} + +tasks.assemble { dependsOn(docWebsite) } diff --git a/rollup.config.js b/projects/web/rollup.config.js similarity index 91% rename from rollup.config.js rename to projects/web/rollup.config.js index f70fc4875..27feab961 100644 --- a/rollup.config.js +++ b/projects/web/rollup.config.js @@ -5,13 +5,15 @@ import typescript from "@rollup/plugin-typescript"; import url from '@rollup/plugin-url'; import { terser } from "rollup-plugin-terser"; -const input = "src/web"; -const requirejs = readFileSync("node_modules/requirejs/require.js"); +const input = "src"; +const requirejs = readFileSync("../../node_modules/requirejs/require.js"); export default { input: [`${input}/index.tsx`], output: { + // Also defined in build.gradle.kts dir: "build/rollup/", + // We bundle requirejs (and config) into the header. It's rather gross // but also works reasonably well. // Also suffix a ?v=${date} onto the end in the event we need to require a specific copy-cat version. diff --git a/src/web/components/Recipe.tsx b/projects/web/src/components/Recipe.tsx similarity index 100% rename from src/web/components/Recipe.tsx rename to projects/web/src/components/Recipe.tsx diff --git a/src/web/components/WithExport.tsx b/projects/web/src/components/WithExport.tsx similarity index 100% rename from src/web/components/WithExport.tsx rename to projects/web/src/components/WithExport.tsx diff --git a/src/web/components/support.tsx b/projects/web/src/components/support.tsx similarity index 100% rename from src/web/components/support.tsx rename to projects/web/src/components/support.tsx diff --git a/src/web/index.tsx b/projects/web/src/index.tsx similarity index 100% rename from src/web/index.tsx rename to projects/web/src/index.tsx diff --git a/src/web/mount/.settings b/projects/web/src/mount/.settings similarity index 100% rename from src/web/mount/.settings rename to projects/web/src/mount/.settings diff --git a/src/web/mount/example.dfpwm b/projects/web/src/mount/example.dfpwm similarity index 100% rename from src/web/mount/example.dfpwm rename to projects/web/src/mount/example.dfpwm diff --git a/src/web/mount/example.dfpwm.LICENSE b/projects/web/src/mount/example.dfpwm.LICENSE similarity index 100% rename from src/web/mount/example.dfpwm.LICENSE rename to projects/web/src/mount/example.dfpwm.LICENSE diff --git a/src/web/mount/example.nfp b/projects/web/src/mount/example.nfp similarity index 100% rename from src/web/mount/example.nfp rename to projects/web/src/mount/example.nfp diff --git a/src/web/mount/example.nft b/projects/web/src/mount/example.nft similarity index 100% rename from src/web/mount/example.nft rename to projects/web/src/mount/example.nft diff --git a/src/web/mount/expr_template.lua b/projects/web/src/mount/expr_template.lua similarity index 100% rename from src/web/mount/expr_template.lua rename to projects/web/src/mount/expr_template.lua diff --git a/src/web/mount/startup.lua b/projects/web/src/mount/startup.lua similarity index 100% rename from src/web/mount/startup.lua rename to projects/web/src/mount/startup.lua diff --git a/src/web/styles.css b/projects/web/src/styles.css similarity index 100% rename from src/web/styles.css rename to projects/web/src/styles.css diff --git a/src/web/transform.tsx b/projects/web/src/transform.tsx similarity index 93% rename from src/web/transform.tsx rename to projects/web/src/transform.tsx index 1cc3131c4..5128e5822 100644 --- a/src/web/transform.tsx +++ b/projects/web/src/transform.tsx @@ -39,7 +39,7 @@ const glob = promisify(globModule); } as any }); - const dataExport = JSON.parse(await fs.readFile("src/generated/export/index.json", "utf-8")) as DataExport; + const dataExport = JSON.parse(await fs.readFile("../../src/generated/export/index.json", "utf-8")) as DataExport; for (const file of await glob(base + "/**/*.html")) { const contents = await fs.readFile(file, "utf-8"); diff --git a/src/web/typings.ts b/projects/web/src/typings.ts similarity index 100% rename from src/web/typings.ts rename to projects/web/src/typings.ts diff --git a/tsconfig.json b/projects/web/tsconfig.json similarity index 97% rename from tsconfig.json rename to projects/web/tsconfig.json index 2e161c2c3..79d31a6bf 100644 --- a/tsconfig.json +++ b/projects/web/tsconfig.json @@ -27,6 +27,6 @@ "allowSyntheticDefaultImports": true, }, "include": [ - "src/web", + "src", ] } diff --git a/settings.gradle.kts b/settings.gradle.kts index a8747d0cf..316a457e4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,6 +19,7 @@ rootProject.name = "cc-tweaked-$mcVersion" include(":mc-stubs") include(":core-api") include(":core") +include(":web") for (project in rootProject.children) { project.projectDir = file("projects/${project.name}")