Skip to content

Commit 1503368

Browse files
Update build.mjs
1 parent efabff5 commit 1503368

File tree

1 file changed

+88
-19
lines changed

1 file changed

+88
-19
lines changed

packages/tel-frontend-review/build.mjs

Lines changed: 88 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,64 @@
11
import { promises as fs } from "node:fs";
22
import { join, dirname, parse } from "node:path";
33
import { fileURLToPath } from "node:url";
4+
import nunjucks from "nunjucks";
45
import fse from "fs-extra";
56
import * as sass from "sass";
7+
import { execSync } from "node:child_process";
68

79
// Replace __dirname in ES modules
810
const __dirname = dirname(fileURLToPath(import.meta.url));
911

10-
const repoRoot = join(__dirname, "../../"); // back to repo root
12+
// Paths
13+
const repoRoot = join(__dirname, "../../"); // root of repo
1114
const reviewSrc = join(__dirname, "src");
1215
const reviewDist = join(__dirname, "dist");
16+
const nhsukDist = join(repoRoot, "node_modules/nhsuk-frontend/dist");
1317

14-
// TEL frontend package paths
18+
// TEL frontend package
1519
const telFrontendDir = join(repoRoot, "packages/tel-frontend");
1620
const telFrontendDist = join(telFrontendDir, "dist");
17-
const telFrontendSrcScss = join(telFrontendDir, "src/styles.scss");
1821

1922
// -------- Helpers --------
2023

21-
// Copy built TEL frontend files + NHS frontend assets + review-specific assets
24+
// Build TEL Frontend (CSS + JS) via Gulp
25+
async function buildTelFrontend() {
26+
console.log("Building TEL Frontend CSS + JS via Gulp...");
27+
28+
await fse.emptyDir(telFrontendDist);
29+
await fse.ensureDir(telFrontendDist);
30+
31+
try {
32+
execSync("npx gulp build", {
33+
cwd: telFrontendDir,
34+
stdio: "inherit",
35+
});
36+
} catch (err) {
37+
console.error("Gulp build failed:", err);
38+
process.exit(1);
39+
}
40+
41+
console.log("TEL Frontend CSS/JS built successfully");
42+
}
43+
44+
// Copy assets: TEL + NHS + review site
2245
async function buildReviewAssets() {
2346
console.log("Copying review site assets...");
2447

2548
await fse.ensureDir(join(reviewDist, "stylesheets"));
2649
await fse.ensureDir(join(reviewDist, "javascripts"));
2750

28-
// Copy precompiled NHS.UK frontend CSS + JS
51+
// Copy NHS.UK frontend v10 precompiled CSS/JS
2952
await fse.copy(
30-
join(repoRoot, "node_modules/nhsuk-frontend/dist/nhsuk.min.css"),
53+
join(nhsukDist, "nhsuk/nhsuk-frontend.min.css"),
3154
join(reviewDist, "stylesheets/nhsuk.min.css")
3255
);
3356
await fse.copy(
34-
join(repoRoot, "node_modules/nhsuk-frontend/dist/nhsuk.min.js"),
57+
join(nhsukDist, "nhsuk/nhsuk-frontend.min.js"),
3558
join(reviewDist, "javascripts/nhsuk.min.js")
3659
);
3760

38-
// Copy TEL frontend built CSS + JS
61+
// Copy TEL frontend built files
3962
await fse.copy(
4063
join(telFrontendDist, "tel-frontend.css"),
4164
join(reviewDist, "stylesheets/tel-frontend.css")
@@ -45,7 +68,7 @@ async function buildReviewAssets() {
4568
join(reviewDist, "javascripts/tel-frontend.min.js")
4669
);
4770

48-
// Copy static assets for review site (images, etc.)
71+
// Copy review site static assets
4972
const reviewAssetsSrc = join(reviewSrc, "assets");
5073
if (await fse.pathExists(reviewAssetsSrc)) {
5174
await fse.copy(reviewAssetsSrc, join(reviewDist, "assets"));
@@ -54,13 +77,13 @@ async function buildReviewAssets() {
5477
console.log("Review site assets copied");
5578
}
5679

57-
// Compile review site SCSS (only your custom styles)
80+
// Build review site CSS (optional additional styles)
5881
async function buildReviewCSS() {
5982
console.log("Building review site CSS...");
6083

6184
const css = sass.compile(join(reviewSrc, "scss/main.scss"), {
6285
style: "expanded",
63-
loadPaths: ["node_modules"], // allows @use of TEL frontend SCSS
86+
loadPaths: ["node_modules"], // needed for nhsuk-frontend
6487
});
6588

6689
const outDir = join(reviewDist, "stylesheets");
@@ -70,26 +93,72 @@ async function buildReviewCSS() {
7093
console.log("Review site CSS built at:", join(outDir, "review.css"));
7194
}
7295

96+
// Render review site Nunjucks HTML
97+
async function buildReviewHtml() {
98+
console.log("Rendering review site HTML...");
99+
100+
const telComponents = join(repoRoot, "packages/tel-frontend/src/tel/components");
101+
102+
const env = nunjucks.configure(
103+
[
104+
reviewSrc, // review site source
105+
join(repoRoot, "node_modules/nhsuk-frontend"), // NHS macros
106+
telComponents // TEL frontend macros
107+
],
108+
{ autoescape: true }
109+
);
110+
111+
// Render root-level .njk files
112+
const files = await fse.readdir(reviewSrc);
113+
for (const file of files) {
114+
if (file.endsWith(".njk")) {
115+
const name = parse(file).name;
116+
const html = env.render(file, { title: "TEL Frontend Review" });
117+
118+
const outDir = join(reviewDist, name === "index" ? "" : name);
119+
await fse.ensureDir(outDir);
120+
await fs.writeFile(join(outDir, "index.html"), html);
121+
console.log(`Rendered ${file} -> ${outDir}/index.html`);
122+
}
123+
}
124+
125+
// Render example pages
126+
const examplesSrc = join(reviewSrc, "examples");
127+
const examplesDist = join(reviewDist, "examples");
128+
await fse.ensureDir(examplesDist);
129+
130+
if (await fse.pathExists(examplesSrc)) {
131+
const exampleFiles = await fse.readdir(examplesSrc);
132+
for (const file of exampleFiles) {
133+
if (file.endsWith(".njk")) {
134+
const name = file.replace(/\.njk$/, ".html");
135+
const rendered = env.render(join("examples", file));
136+
await fs.writeFile(join(examplesDist, name), rendered, "utf8");
137+
console.log(`Rendered ${file} -> ${join(examplesDist, name)}`);
138+
}
139+
}
140+
}
141+
142+
console.log("Review HTML rendered");
143+
}
144+
73145
// -------- Main build --------
74146
async function build() {
75147
try {
76148
await fse.emptyDir(reviewDist);
77149

78-
// Step 1: Build TEL frontend (CSS + JS) via Gulp
79-
console.log("Building TEL Frontend CSS + JS via Gulp...");
80-
const { execSync } = await import("node:child_process");
81-
execSync("npx gulp build", {
82-
cwd: telFrontendDir,
83-
stdio: "inherit",
84-
});
85-
console.log("TEL Frontend CSS/JS built successfully");
150+
// Step 1: Build TEL frontend
151+
await buildTelFrontend();
86152

87153
// Step 2: Copy assets (TEL + NHS + review site)
88154
await buildReviewAssets();
89155

90156
// Step 3: Compile review site SCSS
91157
await buildReviewCSS();
92158

159+
// Step 4: Render HTML pages
160+
await buildReviewHtml();
161+
93162
console.log("Review site build finished successfully");
94163
} catch (err) {
95164
console.error("Build failed:", err);

0 commit comments

Comments
 (0)