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