diff --git a/build/create-testcases.js b/build/create-testcases.js index e060d67003..847002fbeb 100644 --- a/build/create-testcases.js +++ b/build/create-testcases.js @@ -1,31 +1,25 @@ +const { copy } = require('fs-extra') const globby = require('globby') -const makeDir = require('make-dir') const objectHash = require('object-hash') const codeBlocks = require('gfm-code-blocks') -const { - www: { url, baseDir }, -} = require('./../package.json') +const { www: { url } } = require('./../package.json') const getMarkdownData = require('./../utils/get-markdown-data') const createFile = require('../utils/create-file') const regexps = require('../utils/reg-exps') const getAllMatchesForRegex = require('../utils/get-all-matches-for-regex') -const copyTestcasesAssets = require('./testcases/copy-testcases-assets') const createTestcasesJson = require('./testcases/create-testcases-json') const createTestcasesOfRuleOfEmReportTool = require('./testcases/create-testcases-of-rule-of-em-report-tool') /** * Create test case files & other meta-data from test case in each rule. * - * -> create test cases files into `./public/testcases/` - * -> copy `./test-assets/*` into `./public` - * -> create `testcases.json` into `./public` + * -> create test cases files into `_data` directory + * -> copy test assets into `_data` directory + * -> create `testcases.json` + * + * These files will be copied into `public` directory during gatsby `preBootstrap` hook/ build */ const init = async () => { - /** - * Create `public` directory - */ - await makeDir(`public`) - /** * Get all rules `markdown` data */ @@ -40,13 +34,16 @@ const init = async () => { * -> get code snippets * -> and their relevant titles */ - rulesData.forEach(ruleData => { - const { frontmatter, body } = ruleData + for (const { frontmatter, body } of rulesData) { const { id: ruleId, name: ruleName, accessibility_requirements: ruleAccessibilityRequirements, } = frontmatter + + /** + * get all titles of test case examples (eg: #### Failed Example 1) + */ const codeTitles = getAllMatchesForRegex(regexps.testcaseTitle, body) /** @@ -65,33 +62,31 @@ const init = async () => { * -> create a testcase file * -> and add meta of testcase to `testcases.json` */ - const ruleTestcases = codeSnippets.reduce((out, codeBlock, index) => { + const ruleTestcases = [] + + for (const [index, codeSnippet] of codeSnippets.entries()) { const title = codeTitles[index] if (!title) { throw new Error('No title found for code snippet.') } - const { code, block } = codeBlock - let { type = 'html' } = codeBlock + const { code, block } = codeSnippet + let { type = 'html' } = codeSnippet if (regexps.testcaseCodeSnippetTypeIsSvg.test(block.substring(0, 15))) { type = 'svg' } - const codeId = objectHash({ - block, - type, - ruleId, - }) + const codeId = objectHash({ block, type, ruleId }) const titleCurated = title.value.split(' ').map(t => t.toLowerCase()) - const testcaseFileName = `${ruleId}/${codeId}.${type}` const testcasePath = `testcases/${testcaseFileName}` + /** * Create testcase file */ - createFile(`${baseDir}/${testcasePath}`, code) + await createFile(`_data/rules-testcases/${testcasePath}`, code) /** * Create meta data for testcase(s) @@ -106,10 +101,8 @@ const init = async () => { rulePage: `${url}/rules/${ruleId}`, ruleAccessibilityRequirements, } - - out.push(testcase) - return out - }, []) + ruleTestcases.push(testcase) + } // add rule testcases to all testcases allRulesTestcases = allRulesTestcases.concat(ruleTestcases) @@ -117,32 +110,30 @@ const init = async () => { /** * Create test cases of rule for use with `em report tool` */ - createTestcasesOfRuleOfEmReportTool({ + await createTestcasesOfRuleOfEmReportTool({ ruleId, ruleName, ruleTestcases, ruleAccessibilityRequirements, }) - }) + } /** * Copy `test-assets` that are used by `testcases` */ - await copyTestcasesAssets() + await copy('./test-assets', './_data/rules-testcases/test-assets') /** * Generate `testcases.json` */ await createTestcasesJson(allRulesTestcases) - - console.info(`\nGenerated Test Cases.\n`) } /** * Invoke */ init() - .then(() => console.log('Completed: task: create:testcases')) + .then(() => console.log('Completed task: createTestcases')) .catch(e => { console.error(e) process.write(1) diff --git a/build/implementations/get-testcases-grouped-by-rule.js b/build/implementations/get-testcases-grouped-by-rule.js index 2d7878be70..bfd7cc38b3 100644 --- a/build/implementations/get-testcases-grouped-by-rule.js +++ b/build/implementations/get-testcases-grouped-by-rule.js @@ -1,4 +1,4 @@ -const testcasesData = require('./../../public/testcases.json') +const testcasesData = require('./../../_data/rules-testcases/testcases.json') /** * Get testcases of rules diff --git a/build/testcases/copy-testcases-assets.js b/build/testcases/copy-testcases-assets.js deleted file mode 100644 index 874b9b3d4d..0000000000 --- a/build/testcases/copy-testcases-assets.js +++ /dev/null @@ -1,18 +0,0 @@ -const { ncp } = require('ncp') - -/** - * Copy test-assets directory - */ -const copyTestcasesAssets = () => { - return new Promise((resolve, reject) => { - ncp('./test-assets', './public/test-assets', err => { - console.info(`\nCopied Test Assets Directory.\n`) - if (err) { - reject(err) - } - resolve() - }) - }) -} - -module.exports = copyTestcasesAssets diff --git a/build/testcases/create-testcases-json.js b/build/testcases/create-testcases-json.js index 3cf1f35958..f1133bbeac 100644 --- a/build/testcases/create-testcases-json.js +++ b/build/testcases/create-testcases-json.js @@ -1,8 +1,4 @@ -const { - www: { url, baseDir }, - author, - description, -} = require('./../../package.json') +const { www: { url }, author, description } = require('./../../package.json') const createFile = require('../../utils/create-file') /** @@ -19,7 +15,7 @@ const createTestcasesJson = async testcases => { } await createFile( - `${baseDir}/testcases.json`, + `_data/rules-testcases/testcases.json`, JSON.stringify(AllTestcasesData, undefined, 2) ) } diff --git a/build/testcases/create-testcases-of-rule-of-em-report-tool.js b/build/testcases/create-testcases-of-rule-of-em-report-tool.js index dca5f213d7..af2a011a5e 100644 --- a/build/testcases/create-testcases-of-rule-of-em-report-tool.js +++ b/build/testcases/create-testcases-of-rule-of-em-report-tool.js @@ -1,6 +1,4 @@ -const { - www: { url, baseDir }, -} = require('./../../package.json') +const { www: { url } } = require('./../../package.json') const scUrlsMetaData = require('./../../_data/sc-urls.json') const scEmReportAuditResult = require('./../../_data/sc-em-report-audit-result.json') const graphContext = require('./wcag-em-report-tool-mappings/@graph-context.json') @@ -22,6 +20,7 @@ const createTestcasesOfRuleOfEmReportTool = async options => { const title = `Report for ACT-R Rule - ${ruleName}` const siteName = `ACT-R Rule - ${ruleName}` const siteScope = `${url}/testcases/${ruleId}/` + const webpages = ruleTestcases.map((testcase, index) => { const { url, testcaseId } = testcase return { @@ -88,7 +87,7 @@ const createTestcasesOfRuleOfEmReportTool = async options => { } await createFile( - `${baseDir}/testcases/${ruleId}/rule-${ruleId}-testcases-for-em-report-tool.json`, + `_data/rules-testcases/testcases/${ruleId}/rule-${ruleId}-testcases-for-em-report-tool.json`, JSON.stringify(json, undefined, 2) ) } diff --git a/gatsby-node.js b/gatsby-node.js index 4aee4f5af2..634c59efd2 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -1,5 +1,14 @@ +const { copy } = require('fs-extra') const onCreateNode = require('./gatsby/on-create-node') const createPages = require('./gatsby/create-pages') +exports.onPreBootstrap = async () => { + /** + * copy `testcases` and relevant `assets` to `public` directory (these are created via npm script `createTestcases`) + * Note: + * `gatsby build` cleans all `html` and `css` files within the destination directory, hence the need to copy these during `bootstrap` step + */ + await copy('./_data/rules-testcases', 'public') +} exports.onCreateNode = onCreateNode exports.createPages = createPages diff --git a/package-lock.json b/package-lock.json index 722a4f8147..2005c8b8f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6582,13 +6582,20 @@ "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=" }, "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + } } }, "fs-minipass": { @@ -7384,6 +7391,16 @@ "locate-path": "^3.0.0" } }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "gatsby-cli": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.6.5.tgz", @@ -7879,6 +7896,16 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", @@ -12649,11 +12676,6 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", diff --git a/package.json b/package.json index 2580547b89..7c94a2e567 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "commander": "^2.20.0", "fastmatter": "^2.1.1", "flat": "^4.1.0", + "fs-extra": "^8.1.0", "gatsby": "^2.8.6", "gatsby-image": "^2.1.2", "gatsby-plugin-manifest": "^2.1.1", @@ -111,7 +112,6 @@ "jsonld": "^1.6.2", "make-dir": "^2.1.0", "marked": "^0.6.2", - "ncp": "^2.0.0", "node-sass": "^4.12.0", "normalize.css": "^8.0.1", "object-hash": "^1.3.1", @@ -138,7 +138,7 @@ ], "license": "MIT", "scripts": { - "clean": "rm -rf .cache public", + "clean": "gatsby clean", "getImplementationAccessEngine": "node ./build/get-implementation --org 'Level Access' --tool 'Access Engine' --path './node_modules/act-rules-implementation-access-engine/report.json'", "getImplementationAlfa": "node ./build/get-implementation --org 'Siteimprove' --tool 'Alfa' --path './node_modules/act-rules-implementation-alfa/report.json'", "getImplementationAxeCore": "node ./build/get-implementation --org 'Deque Systems' --tool 'Axe-core' --path './node_modules/act-rules-implementation-axe-core/report.json'", @@ -153,7 +153,7 @@ "getData": "npm run getWcagData && npm run createTestcases && npm run createGlossary && npm run implementations", "predevelop": "npm run getData", "develop": "gatsby develop", - "prebuild": "npm run getData", + "prebuild": "npm run clean && npm run getData", "build": "gatsby build", "format": "prettier --write *.{json,md,js,jsx} './{_data,_rules,build,gatsby,pages,src,test-assets}/**/*.{json,md,js,jsx}'", "start": "npm run clean && npm run develop", @@ -173,8 +173,7 @@ "url": "https://github.com/act-rules/act-rules.github.io/pulls" }, "www": { - "url": "https://act-rules.github.io", - "baseDir": "./public" + "url": "https://act-rules.github.io" }, "config": { "references": {