From e80ff4ff2383619b901b8cdb2ee96643f34b6528 Mon Sep 17 00:00:00 2001 From: meixg Date: Mon, 2 Aug 2021 18:59:42 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E4=BA=A7=E7=89=A9?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E5=88=B0=E6=AF=8F=E4=B8=AA=20case=20?= =?UTF-8?q?=E7=9A=84=20output=20=E7=9B=AE=E5=BD=95=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- bin/render-by-source.js | 9 +++++++- package-lock.json | 45 ++++++++++++++++++++++++------------- package.json | 2 ++ src/fixtures/case.ts | 50 ++++++++++++++++++++++++++++------------- test/e2e.spec.ts | 20 ++++++++++------- 6 files changed, 88 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index f9b07bc6..66bdf5f3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,8 @@ vendor/ /dist/ test/cases/*/ssr.js test/cases/*/ssr.php +test/cases/*/output/* .vscode /example bin/output.js -bin/component*.js \ No newline at end of file +bin/component*.js diff --git a/bin/render-by-source.js b/bin/render-by-source.js index 19f4a950..91c20f50 100755 --- a/bin/render-by-source.js +++ b/bin/render-by-source.js @@ -3,11 +3,18 @@ require('source-map-support/register') const { join } = require('path') const { getRenderArguments, ls } = require('../dist/fixtures/case') +const fs = require('fs') const caseName = process.argv[2] const caseItem = ls().find(item => item.caseName === caseName) const caseRoot = caseItem.caseRoot -const render = require(join(caseRoot, `${caseName}/ssr.js`)) + +const ssrSpecPath = join(caseRoot, `${caseName}/ssr-spec.js`) +if (fs.existsSync(ssrSpecPath)) { + require(ssrSpecPath) +} + +const render = require(join(caseRoot, `${caseName}/output/ssr.js`)) const html = render(...getRenderArguments(caseName, caseRoot)) process.stdout.write(html) diff --git a/package-lock.json b/package-lock.json index cdb5eea9..44265dc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2791,6 +2791,15 @@ "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", "dev": true }, + "@types/mkdirp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", + "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "14.0.27", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", @@ -9777,21 +9786,10 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "modify-values": { "version": "1.0.1", @@ -16187,6 +16185,23 @@ "dev": true, "requires": { "mkdirp": "^0.5.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "write-file-atomic": { diff --git a/package.json b/package.json index 774a0082..6490edbc 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@types/debug": "^4.1.5", "@types/jest": "^26.0.8", "@types/lodash": "^4.14.158", + "@types/mkdirp": "^1.0.2", "@types/yargs": "^15.0.5", "@typescript-eslint/eslint-plugin": "^3.7.1", "@typescript-eslint/parser": "^3.7.1", @@ -75,6 +76,7 @@ "etpl": "^3.2.0", "handlebars": "^4.7.6", "jest": "^27.0.6", + "mkdirp": "^1.0.4", "mustache": "^4.0.1", "san": "^3.10.0", "san-html-cases": "^3.10.20", diff --git a/src/fixtures/case.ts b/src/fixtures/case.ts index 7cbbbe0e..90b4eb6f 100644 --- a/src/fixtures/case.ts +++ b/src/fixtures/case.ts @@ -4,6 +4,7 @@ import { SanProject } from '../models/san-project' import ToJSCompiler from '../target-js' import debugFactory from 'debug' import { compileToRenderer } from '../index' +import mkdirp from 'mkdirp' const debug = debugFactory('case') export const caseRoots = [ @@ -40,33 +41,49 @@ export function readExpected (caseName: string, caseRoot: string) { return readFileSync(htmlPath, 'utf8') } -export function compileJS (caseName: string, caseRoot: string, compileToFunctionBodyCode: true): string -export function compileJS (caseName: string, caseRoot: string, compileToFunctionBodyCode: boolean) { +export function compileJS (caseName: string, caseRoot: string, compileToFunctionBodyCode: boolean = false) { debug('compile js', caseName) const caseDir = join(caseRoot, caseName) - const jsFile = join(caseDir, 'component.js') const ssrOnly = /-so/.test(caseName) - const targetCode = sanProject.compile( - jsFile, - ToJSCompiler, - { ssrOnly, bareFunctionBody: compileToFunctionBodyCode, importHelpers } - ) - const targetFile = join(caseRoot, caseName, 'ssr.js') - return compileToFunctionBodyCode ? targetCode : writeFileSync(targetFile, targetCode) + + if (compileToFunctionBodyCode) { + const jsFile = join(caseDir, 'component.js') + const targetCode = sanProject.compile( + jsFile, + ToJSCompiler, + { ssrOnly, bareFunctionBody: compileToFunctionBodyCode, importHelpers } + ) + return targetCode + } + + for (const file of readdirSync(caseDir).filter(file => file === 'component.js' || file.endsWith('.san.js'))) { + const jsFile = join(caseDir, file) + const targetCode = sanProject.compile( + jsFile, + ToJSCompiler, + { ssrOnly, bareFunctionBody: compileToFunctionBodyCode, importHelpers } + ) + mkdirp.sync(join(caseRoot, caseName, 'output')) + const targetFile = file === 'component.js' + ? join(caseRoot, caseName, 'output/ssr.js') + : join(caseRoot, caseName, 'output', file) + writeFileSync(targetFile, targetCode) + } } -export function compileComponent (caseName: string, caseRoot: string, compileToFunctionBodyCode: true): string -export function compileComponent (caseName: string, caseRoot: string, compileToFunctionBodyCode: boolean) { +export function compileComponent (caseName: string, caseRoot: string, compileToFunctionBodyCode: boolean = false) { debug('compile js', caseName) const caseDir = join(caseRoot, caseName) const jsFile = join(caseDir, 'component.js') const ssrOnly = /-so/.test(caseName) + const component = require(jsFile) const targetCode = sanProject.compile( - require(jsFile), + component, ToJSCompiler, { ssrOnly, bareFunctionBody: compileToFunctionBodyCode, importHelpers } ) - const targetFile = join(caseRoot, caseName, 'ssr.js') + mkdirp.sync(join(caseRoot, caseName, 'output')) + const targetFile = join(caseRoot, caseName, 'output/ssr.js') return compileToFunctionBodyCode ? targetCode : writeFileSync(targetFile, targetCode) } @@ -80,9 +97,10 @@ export function compileTS (caseName: string, caseRoot: string) { ToJSCompiler, { ssrOnly, importHelpers } ) + mkdirp.sync(join(caseRoot, caseName, 'output')) const targetFile = file === 'component.ts' - ? join(caseDir, 'ssr.js') - : join(caseDir, file.replace(/\.ts$/, '.js')) + ? join(caseDir, 'output', 'ssr.js') + : join(caseDir, 'output', file.replace(/\.ts$/, '.js')) writeFileSync(targetFile, targetCode) } } diff --git a/test/e2e.spec.ts b/test/e2e.spec.ts index 76bbaf43..34ccf1f7 100644 --- a/test/e2e.spec.ts +++ b/test/e2e.spec.ts @@ -1,6 +1,7 @@ import { ls, compileComponent, compileJS, jsExists, tsExists, compileTS, getRenderArguments, readExpected, renderOnthefly } from '../src/fixtures/case' import { join } from 'path' import { parseSanHTML } from '../src/index' +import { existsSync } from 'fs' for (const { caseName, caseRoot } of ls()) { const [expectedData, expectedHtml] = parseSanHTML(readExpected(caseName, caseRoot)) @@ -8,7 +9,7 @@ for (const { caseName, caseRoot } of ls()) { if (tsExists(caseName, caseRoot)) { it('render to source (TypeScript): ' + caseName, async function () { compileTS(caseName, caseRoot) - const render = require(join(caseRoot, caseName, 'ssr.js')) + const render = require(join(caseRoot, caseName, 'output', 'ssr.js')) const got = render(...getRenderArguments(caseName, caseRoot)) const [data, html] = parseSanHTML(got) @@ -19,11 +20,14 @@ for (const { caseName, caseRoot } of ls()) { if (jsExists(caseName, caseRoot)) { it('js to source: ' + caseName, async function () { - const code = compileJS(caseName, caseRoot, true) - // eslint-disable-next-line - const render = new Function('data', 'noDataOutput', 'require', code) + compileJS(caseName, caseRoot) + const render = require(join(caseRoot, caseName, 'output/ssr.js')) + const ssrSpecPath = join(caseRoot, `${caseName}/ssr-spec.js`) + if (existsSync(ssrSpecPath)) { + require(ssrSpecPath) + } // 测试在 strict mode,因此需要手动传入 require - const got = render(...getRenderArguments(caseName, caseRoot), require) + const got = render(...getRenderArguments(caseName, caseRoot)) const [data, html] = parseSanHTML(got) expect(data).toEqual(expectedData) @@ -31,11 +35,11 @@ for (const { caseName, caseRoot } of ls()) { }) it('component to source: ' + caseName, async function () { - const code = compileComponent(caseName, caseRoot, true) + compileComponent(caseName, caseRoot) // eslint-disable-next-line - const render = new Function('data', 'noDataOutput', 'require', code) + const render = require(join(caseRoot, caseName, 'output/ssr.js')) // 测试在 strict mode,因此需要手动传入 require - const got = render(...getRenderArguments(caseName, caseRoot), require) + const got = render(...getRenderArguments(caseName, caseRoot)) const [data, html] = parseSanHTML(got) expect(data).toEqual(expectedData)