| #!/usr/bin/env node |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| |
| const nodeFS = require('fs'); |
| const assert = require('assert'); |
| const nodePath = require('path'); |
| const commander = require('commander'); |
| const chalk = require('chalk'); |
| |
| const testDir = nodePath.resolve(__dirname, '..'); |
| const testTplPath = nodePath.resolve(__dirname, 'mktest-tpl.html'); |
| const tplSegmentDelimiter = '<!-- TPL_SEGMENT_DELIMITER -->'; |
| const tagDomId = /{{TPL_DOM_ID}}/g; |
| const tagDomPlace = '<!-- TPL_DOM_PLACE -->'; |
| const tagJSPlace = '<!-- TPL_JS_PLACE -->'; |
| |
| const manualText = ` |
| ${chalk.cyan.dim('Usage:')} |
| |
| # Make a file named "bar-action.html" in directory "echarts/test" with 1 initial chart. |
| ${chalk.green('npm run mktest bar-action')} |
| # or |
| ${chalk.green('npm run mktest bar-action.html')} |
| # or |
| ${chalk.green('node ./test/build/mktest bar-action')} |
| |
| # Make a file named "bar-action.html" in directory "echarts/test" with 5 initial charts. |
| ${chalk.green('npm run mktest bar-action 5')} |
| # or |
| ${chalk.green('node ./test/build/mktest bar-action 5')} |
| `; |
| |
| function run() { |
| let opt = prepareOpt(); |
| |
| if (!opt) { |
| return; |
| } |
| |
| if (nodeFS.existsSync(opt.testFilePath)) { |
| printError(`The file ${opt.testFilePath} exists! Please chose another name.`); |
| printError('Please chose another name.'); |
| console.log(manualText); |
| return; |
| } |
| |
| const testTplContent = nodeFS.readFileSync(testTplPath, {encoding: 'utf8'}); |
| |
| const testFileContent = makeTestFileContent(opt, testTplContent); |
| |
| nodeFS.writeFileSync(opt.testFilePath, testFileContent, {encoding: 'utf8'}); |
| |
| console.log(`A test file has been added in: \n${chalk.green(opt.testFilePath)}`); |
| console.log(); |
| } |
| |
| function prepareOpt() { |
| commander |
| .usage('test-file-name [chart-number]') |
| .description(manualText) |
| .parse(process.argv); |
| |
| let args = commander.args || []; |
| |
| let testFileName = args[0]; |
| let testCaseNumber = args[1]; |
| if (isNaN(testCaseNumber)) { |
| testCaseNumber = 1; |
| } |
| |
| if (!testFileName) { |
| printError('Must input a file name!'); |
| console.log(manualText); |
| return; |
| } |
| |
| testFileName = normalizeInputExt(testFileName); |
| let testFilePath = nodePath.resolve(testDir, testFileName); |
| |
| return { |
| testFileName: testFileName, |
| testFilePath: testFilePath, |
| testCaseNumber: testCaseNumber |
| }; |
| } |
| |
| function makeTestFileContent(opt, testTplContent) { |
| const testTplSegments = testTplContent.split(tplSegmentDelimiter); |
| |
| const tplSegMain = testTplSegments[0]; |
| const tplSegDom = testTplSegments[1]; |
| const tplSegJS = testTplSegments[2]; |
| |
| assert(tplSegMain && tplSegDom && tplSegJS); |
| |
| let segDomList = []; |
| let segJSList = []; |
| |
| for (let i = 0; i < opt.testCaseNumber; i++) { |
| let domId = 'main' + i; |
| segDomList.push(tplSegDom.replace(tagDomId, domId)); |
| segJSList.push(tplSegJS.replace(tagDomId, domId)); |
| } |
| |
| let htmlContent = tplSegMain |
| .replace(tagDomPlace, segDomList.join('\n')) |
| .replace(tagJSPlace, segJSList.join('\n')); |
| |
| return htmlContent; |
| } |
| |
| function normalizeInputExt(testFileName) { |
| if (hasExt(testFileName, '.html')) { |
| return testFileName; |
| } |
| else if (hasExt(testFileName, '.htm')) { |
| return testFileName + 'l'; |
| } |
| else { |
| return testFileName + '.html'; |
| } |
| |
| function hasExt(fileName, ext) { |
| let idx = fileName.lastIndexOf(ext); |
| return idx >= 0 && idx === fileName.length - ext.length; |
| } |
| } |
| |
| function printError(msg) { |
| console.error(chalk.red('[ERROR]: ' + msg)); |
| } |
| |
| run(); |