11import { promises as fs } from "node:fs" ;
22import { join , dirname , parse } from "node:path" ;
33import { fileURLToPath } from "node:url" ;
4+ import nunjucks from "nunjucks" ;
45import fse from "fs-extra" ;
56import * as sass from "sass" ;
7+ import { execSync } from "node:child_process" ;
68
79// Replace __dirname in ES modules
810const __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
1114const reviewSrc = join ( __dirname , "src" ) ;
1215const reviewDist = join ( __dirname , "dist" ) ;
16+ const nhsukDist = join ( repoRoot , "node_modules/nhsuk-frontend/dist" ) ;
1317
14- // TEL frontend package paths
18+ // TEL frontend package
1519const telFrontendDir = join ( repoRoot , "packages/tel-frontend" ) ;
1620const 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
2245async 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)
5881async 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 ( / \. n j k $ / , ".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 --------
74146async 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