| #!/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(); |