Skip to content

Commit

Permalink
Build prototype kit config to ./package
Browse files Browse the repository at this point in the history
  • Loading branch information
colinrotherham committed Nov 3, 2022
1 parent 24c2c1b commit fd61c2f
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 7 deletions.
1 change: 1 addition & 0 deletions docs/contributing/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ npm scripts are defined in `package.json`. These trigger a number of Gulp tasks.
- clean the `./package` folder
- copy Sass files, applying Autoprefixer via PostCSS
- copy Nunjucks component template/macro files, including JSON configs
- copy GOV.UK Prototype Kit config files
- copy JavaScript ESM source files
- compile JavaScript ESM to CommonJS (`gulp js:compile`)
- runs `npm run test:build:package` (which will test the output is correct)
Expand Down
4 changes: 3 additions & 1 deletion gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ require('./tasks/gulp/watch.js')

// Node tasks
const { updateDistAssetsVersion } = require('./tasks/asset-version.js')
const { updatePrototypeKitConfig } = require('./tasks/prototype-kit-config.js')
const { clean } = require('./tasks/clean.js')
const { npmScriptTask } = require('./tasks/run.js')

Expand Down Expand Up @@ -73,7 +74,8 @@ gulp.task('dev', gulp.series(
gulp.task('build:package', gulp.series(
clean,
'copy:files',
'js:compile'
'js:compile',
updatePrototypeKitConfig
))

/**
Expand Down
19 changes: 13 additions & 6 deletions src/govuk-prototype-kit/govuk-prototype-kit.config.mjs
Original file line number Diff line number Diff line change
@@ -1,21 +1,28 @@
import { join, normalize, relative } from 'path'
import slash from 'slash'
import { getDirectories } from '../../lib/file-helper.js'

import { filterPath, getDirectories, getListing } from '../../lib/file-helper.js'
import { componentNameToMacroName } from '../../lib/helper-functions.js'
import configPaths from '../../config/paths.js'

/**
* GOV.UK Prototype Kit config builder
*/
export default async () => {
const componentsFiles = await getDirectories(configPaths.components)
const componentsFiles = await getListing(configPaths.components)
const componentNames = await getDirectories(configPaths.components)

// Build array of macros
const nunjucksMacros = [...componentsFiles]
.map(([componentName, { entries }]) => {
const importFrom = slash(entries.get('macro.njk').path)
const nunjucksMacros = componentNames
.map((componentName) => {
const [macroPath] = componentsFiles
.filter(filterPath([`${componentName}/macro.njk`]))

// Relative path to src without 'govuk'
const rootPath = join(configPaths.src, '../')

return {
importFrom: importFrom.replace(configPaths.src, 'govuk/'),
importFrom: relative(rootPath, join(configPaths.components, macroPath)),
macroName: componentNameToMacroName(componentName)
}
})
Expand Down
25 changes: 25 additions & 0 deletions tasks/gulp/__tests__/after-build-package.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ describe('package/', () => {

// Files already present in 'package'
.concat(...[
'govuk-prototype-kit/init.js',
'govuk-prototype-kit/init.scss',
'govuk-prototype-kit.config.json',
'package.json',
'README.md'
Expand All @@ -86,6 +88,29 @@ describe('package/', () => {
})
})

describe('GOV.UK Prototype Kit', () => {
let listingPackagePrototype

beforeAll(async () => {
listingPackagePrototype = await getListing(join(configPaths.package, 'govuk-prototype-kit'))
})

it('should have JSON config', () => {
expect(listingPackage)
.toEqual(expect.arrayContaining(['govuk-prototype-kit.config.json']))
})

it('should have init.js', () => {
expect(listingPackagePrototype)
.toEqual(expect.arrayContaining(['init.js']))
})

it('should have init.scss', () => {
expect(listingPackagePrototype)
.toEqual(expect.arrayContaining(['init.scss']))
})
})

describe('all.scss', () => {
it('should compile without throwing an exception', async () => {
const allScssFile = join(configPaths.package, 'govuk', 'all.scss')
Expand Down
49 changes: 49 additions & 0 deletions tasks/prototype-kit-config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const { copyFile, mkdir, writeFile } = require('fs/promises')
const { EOL } = require('os')
const { dirname, join } = require('path')
const { cwd } = require('process')

const { destination } = require('./task-arguments.js')

/**
* Write GOV.UK Prototype Kit config
*
* @returns {Promise<void>}
*/
async function updatePrototypeKitConfig () {
const { default: configFn } = await import('../src/govuk-prototype-kit/govuk-prototype-kit.config.mjs')

// Files to copy
const copyFiles = [
join('govuk-prototype-kit', 'init.js'),
join('govuk-prototype-kit', 'init.scss')
]

// Copy files to destination
const configTasks = copyFiles.map(async (file) => {
const fileSource = join(cwd(), 'src', file)
const fileTarget = join(cwd(), destination, file)

// Create destination directory
await mkdir(dirname(fileTarget), { recursive: true })

// Copy file to destination
return copyFile(fileSource, fileTarget)
})

// JSON config file path + contents
const configPath = join(destination, 'govuk-prototype-kit.config.json')
const configJSON = JSON.stringify(await configFn(), null, 2) + EOL

// Write JSON config file
configTasks.push(writeFile(configPath, configJSON))

// Resolve on completion
return Promise.all(configTasks)
}

updatePrototypeKitConfig.displayName = 'update-prototype-kit-config'

module.exports = {
updatePrototypeKitConfig
}

0 comments on commit fd61c2f

Please sign in to comment.