@webex/jsdoctrinetest 3.0.0-beta.13 → 3.0.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/assertions/literal.js +2 -1
- package/dist/assertions/literal.js.map +1 -1
- package/dist/extract.js +3 -3
- package/dist/extract.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mocha-template.js.map +1 -1
- package/dist/parse.js.map +1 -1
- package/dist/transform.js.map +1 -1
- package/package.json +2 -2
- package/src/assertions/literal.js +4 -7
- package/src/extract.js +28 -26
- package/src/index.js +1 -1
- package/src/mocha-template.js +2 -2
- package/src/parse.js +23 -20
- package/src/transform.js +10 -14
package/README.md
CHANGED
|
@@ -28,8 +28,8 @@ Assuming your source code is in `./src` and you've got code like
|
|
|
28
28
|
* @returns {boolean}
|
|
29
29
|
*/
|
|
30
30
|
exports.fn = function fn() {
|
|
31
|
-
return true
|
|
32
|
-
}
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
The following command will create a run a mocha spec asserting the result of `fn()` is `true`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["pattern","tpl","template","test","value","build","ASSERTION","literal","replace","l","f","i","booleanLiteral","numericLiteral","stringLiteral","Error"],"sources":["literal.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport template from '@babel/template';\nimport {
|
|
1
|
+
{"version":3,"names":["pattern","tpl","template","test","value","build","ASSERTION","literal","replace","l","f","i","booleanLiteral","numericLiteral","stringLiteral","Error"],"sources":["literal.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport template from '@babel/template';\nimport {booleanLiteral, numericLiteral, stringLiteral} from '@babel/types';\n\nconst pattern = /^\\s*?=>( async)?\\s*/;\n\nconst tpl = template(`\n (function() {\n var assert = require('assert');\n assert.equal(result, ASSERTION);\n })();\n`);\n\n/**\n * Indicates whether the specified value defines a literal assertion\n * @param {string} value\n * @returns {Boolean}\n */\nexport function test(value) {\n return pattern.test(value);\n}\n\n/**\n * Builds a literal assertion\n * @param {string} value\n * @returns {ast}\n */\nexport function build(value) {\n return tpl({\n ASSERTION: literal(value.replace(pattern, '')),\n });\n}\n\n/**\n * Coerces a string into a type\n * @param {string} l\n * @returns {Literal}\n */\nfunction literal(l) {\n /* eslint complexity: [0] */\n // eslint-disable-next-line prefer-const\n let f;\n let i;\n\n switch (typeof l) {\n case 'boolean':\n return booleanLiteral(l);\n case 'number':\n return numericLiteral(l);\n case 'string':\n if (l === 'true') {\n return booleanLiteral(true);\n }\n if (l === 'false') {\n return booleanLiteral(false);\n }\n i = parseInt(l, 10);\n if (!Number.isNaN(i)) {\n return numericLiteral(i);\n }\n f = parseFloat(l);\n if (!Number.isNaN(f)) {\n return numericLiteral(f);\n }\n\n return stringLiteral(l);\n default:\n throw new Error('Unsupported literal type');\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AALA;AACA;AACA;AAKA,IAAMA,OAAO,GAAG,qBAAhB;AAEA,IAAMC,GAAG,GAAG,IAAAC,iBAAA,4GAAZ;AAOA;AACA;AACA;AACA;AACA;;AACO,SAASC,IAAT,CAAcC,KAAd,EAAqB;EAC1B,OAAOJ,OAAO,CAACG,IAAR,CAAaC,KAAb,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;;;AACO,SAASC,KAAT,CAAeD,KAAf,EAAsB;EAC3B,OAAOH,GAAG,CAAC;IACTK,SAAS,EAAEC,OAAO,CAACH,KAAK,CAACI,OAAN,CAAcR,OAAd,EAAuB,EAAvB,CAAD;EADT,CAAD,CAAV;AAGD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASO,OAAT,CAAiBE,CAAjB,EAAoB;EAClB;EACA;EACA,IAAIC,CAAJ;EACA,IAAIC,CAAJ;;EAEA,8BAAeF,CAAf;IACE,KAAK,SAAL;MACE,OAAO,IAAAG,qBAAA,EAAeH,CAAf,CAAP;;IACF,KAAK,QAAL;MACE,OAAO,IAAAI,qBAAA,EAAeJ,CAAf,CAAP;;IACF,KAAK,QAAL;MACE,IAAIA,CAAC,KAAK,MAAV,EAAkB;QAChB,OAAO,IAAAG,qBAAA,EAAe,IAAf,CAAP;MACD;;MACD,IAAIH,CAAC,KAAK,OAAV,EAAmB;QACjB,OAAO,IAAAG,qBAAA,EAAe,KAAf,CAAP;MACD;;MACDD,CAAC,GAAG,wBAASF,CAAT,EAAY,EAAZ,CAAJ;;MACA,IAAI,CAAC,oBAAaE,CAAb,CAAL,EAAsB;QACpB,OAAO,IAAAE,qBAAA,EAAeF,CAAf,CAAP;MACD;;MACDD,CAAC,GAAG,0BAAWD,CAAX,CAAJ;;MACA,IAAI,CAAC,oBAAaC,CAAb,CAAL,EAAsB;QACpB,OAAO,IAAAG,qBAAA,EAAeH,CAAf,CAAP;MACD;;MAED,OAAO,IAAAI,oBAAA,EAAcL,CAAd,CAAP;;IACF;MACE,MAAM,IAAIM,KAAJ,CAAU,0BAAV,CAAN;EAvBJ;AAyBD"}
|
package/dist/extract.js
CHANGED
|
@@ -125,10 +125,10 @@ function isJSDocComment(comment) {
|
|
|
125
125
|
} // eslint-disable-next-line
|
|
126
126
|
|
|
127
127
|
|
|
128
|
-
return (comment.type ===
|
|
128
|
+
return (comment.type === 'CommentBlock' || // estree
|
|
129
129
|
// eslint-disable-next-line
|
|
130
|
-
comment.type === "Block" // get-comments / traditional
|
|
130
|
+
comment.type === "Block") && // get-comments / traditional
|
|
131
131
|
// eslint-disable-next-line
|
|
132
|
-
|
|
132
|
+
asterisks && asterisks[1].length === 1;
|
|
133
133
|
}
|
|
134
134
|
//# sourceMappingURL=extract.js.map
|
package/dist/extract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["extract","transform","filename","code","fs","readFileSync","encoding","ast","parse","sourceFilename","results","done","traverse","enter","path","node","leadingComments","filter","isJSDocComment","forEach","comment","result","doctrine","value","unwrap","sloppy","recoverable","lineNumbers","tags","tag","title","push","description","name","getNodeName","loc","type","Program","exit","isProgram","pushContainer","id","key","Error","asterisks","match","startsWith","endsWith","length"],"sources":["extract.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\
|
|
1
|
+
{"version":3,"names":["extract","transform","filename","code","fs","readFileSync","encoding","ast","parse","sourceFilename","results","done","traverse","enter","path","node","leadingComments","filter","isJSDocComment","forEach","comment","result","doctrine","value","unwrap","sloppy","recoverable","lineNumbers","tags","tag","title","push","description","name","getNodeName","loc","type","Program","exit","isProgram","pushContainer","id","key","Error","asterisks","match","startsWith","endsWith","length"],"sources":["extract.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport fs from 'fs';\n\nimport traverse from '@babel/traverse';\nimport doctrine from 'doctrine';\nimport {isProgram} from '@babel/types';\n\nimport parse from './parse';\n/**\n * transform function which operates on each discovered example block\n * @callback transformCallback\n * @param {Object} options\n * @param {ast} options.comment\n * @param {string} options.name\n * @param {string} options.filename\n * @param {string} options.type\n */\n\n/**\n * Extracts comment blocks from the source code in the specified file\n * @param {transformCallback} transform\n * @param {string} filename\n * @returns {Array<ast>}\n */\nexport default function extract(transform, filename) {\n // eslint-disable-next-line no-sync\n const code = fs.readFileSync(filename, {encoding: 'utf8'});\n\n const ast = parse(code, {sourceFilename: filename});\n\n const results = [];\n\n let done = false;\n\n traverse(ast, {\n enter(path) {\n if (path.node.leadingComments) {\n path.node.leadingComments.filter(isJSDocComment).forEach((comment) => {\n const result = doctrine.parse(comment.value, {\n unwrap: true,\n sloppy: true,\n recoverable: true,\n lineNumbers: true,\n });\n\n if (result.tags) {\n result.tags.forEach((tag) => {\n if (tag.title === 'example') {\n results.push(\n transform({\n comment: tag.description,\n name: getNodeName(path.node),\n filename: path.node.loc.filename,\n type: path.node.type,\n })\n );\n }\n });\n }\n });\n }\n },\n Program: {\n exit(path) {\n if (isProgram(path)) {\n if (done) {\n return;\n }\n path.pushContainer('body', results);\n done = true;\n }\n },\n },\n });\n\n return ast;\n}\n\n/**\n * Extracts the name from the specified node\n * @param {Node} node\n * @returns {string}\n */\nfunction getNodeName(node) {\n if (node.id) {\n return node.id.name;\n }\n\n if (node.key) {\n return node.key.name;\n }\n\n throw new Error('Could not find name for node');\n}\n/**\n * Indicates if the specified comment block is a doc block\n * @param {CommentBlock} comment\n * @returns {Boolean}\n */\nfunction isJSDocComment(comment) {\n const asterisks = comment.value.match(/^(\\*+)/);\n\n if (comment.value.startsWith('/*') && comment.value.endsWith('*/')) {\n return false;\n }\n\n // eslint-disable-next-line\n return (\n (comment.type === 'CommentBlock' || // estree\n // eslint-disable-next-line\n comment.type === `Block`) && // get-comments / traditional\n // eslint-disable-next-line\n asterisks &&\n asterisks[1].length === 1\n );\n}\n"],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isNodeModule","filename","includes","inject","module","generate","extract","transform","compact","quotes","code","process","env","JSDOCTRINETEST_VERBOSE","console","log","_compile","enableSpecInjection","dir","load","require","extensions","loadWithSpecs","m","path","dirname"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint require-jsdoc: [0] */\n/* eslint no-console: [0] */\n\nimport path from 'path';\n\nimport generate from '@babel/generator';\n\nimport extract from './extract';\nimport transform from './transform';\n\nfunction isNodeModule(filename) {\n return filename.includes('node_modules') && !filename.includes('packages/node_modules');\n}\n\nfunction inject(module, filename) {\n const {code} = generate(extract(transform, filename), {\n compact: false,\n quotes: 'single'
|
|
1
|
+
{"version":3,"names":["isNodeModule","filename","includes","inject","module","generate","extract","transform","compact","quotes","code","process","env","JSDOCTRINETEST_VERBOSE","console","log","_compile","enableSpecInjection","dir","load","require","extensions","loadWithSpecs","m","path","dirname"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint require-jsdoc: [0] */\n/* eslint no-console: [0] */\n\nimport path from 'path';\n\nimport generate from '@babel/generator';\n\nimport extract from './extract';\nimport transform from './transform';\n\nfunction isNodeModule(filename) {\n return filename.includes('node_modules') && !filename.includes('packages/node_modules');\n}\n\nfunction inject(module, filename) {\n const {code} = generate(extract(transform, filename), {\n compact: false,\n quotes: 'single',\n });\n\n if (process.env.JSDOCTRINETEST_VERBOSE) {\n console.log(filename);\n console.log(code);\n console.log();\n }\n module._compile(code, filename);\n}\n\nfunction enableSpecInjection() {\n let dir;\n const load = require.extensions['.js'];\n\n require.extensions['.js'] = function loadWithSpecs(m, filename) {\n if (isNodeModule(filename)) {\n return load(m, filename);\n }\n // this is really janky, but so far seems to properly ensure we only load\n // files in the directories specified to mocha\n if (!dir) {\n dir = path.dirname(filename);\n }\n\n if (!filename.includes(dir)) {\n return load(m, filename);\n }\n\n return inject(m, filename);\n };\n}\n\nenableSpecInjection();\n"],"mappings":";;;;AAOA;;AAEA;;AAEA;;AACA;;AAZA;AACA;AACA;;AAEA;;AACA;AASA,SAASA,YAAT,CAAsBC,QAAtB,EAAgC;EAC9B,OAAOA,QAAQ,CAACC,QAAT,CAAkB,cAAlB,KAAqC,CAACD,QAAQ,CAACC,QAAT,CAAkB,uBAAlB,CAA7C;AACD;;AAED,SAASC,MAAT,CAAgBC,MAAhB,EAAwBH,QAAxB,EAAkC;EAChC,gBAAe,IAAAI,kBAAA,EAAS,IAAAC,gBAAA,EAAQC,kBAAR,EAAmBN,QAAnB,CAAT,EAAuC;IACpDO,OAAO,EAAE,KAD2C;IAEpDC,MAAM,EAAE;EAF4C,CAAvC,CAAf;EAAA,IAAOC,IAAP,aAAOA,IAAP;;EAKA,IAAIC,OAAO,CAACC,GAAR,CAAYC,sBAAhB,EAAwC;IACtCC,OAAO,CAACC,GAAR,CAAYd,QAAZ;IACAa,OAAO,CAACC,GAAR,CAAYL,IAAZ;IACAI,OAAO,CAACC,GAAR;EACD;;EACDX,MAAM,CAACY,QAAP,CAAgBN,IAAhB,EAAsBT,QAAtB;AACD;;AAED,SAASgB,mBAAT,GAA+B;EAC7B,IAAIC,GAAJ;EACA,IAAMC,IAAI,GAAGC,OAAO,CAACC,UAAR,CAAmB,KAAnB,CAAb;;EAEAD,OAAO,CAACC,UAAR,CAAmB,KAAnB,IAA4B,SAASC,aAAT,CAAuBC,CAAvB,EAA0BtB,QAA1B,EAAoC;IAC9D,IAAID,YAAY,CAACC,QAAD,CAAhB,EAA4B;MAC1B,OAAOkB,IAAI,CAACI,CAAD,EAAItB,QAAJ,CAAX;IACD,CAH6D,CAI9D;IACA;;;IACA,IAAI,CAACiB,GAAL,EAAU;MACRA,GAAG,GAAGM,aAAA,CAAKC,OAAL,CAAaxB,QAAb,CAAN;IACD;;IAED,IAAI,CAACA,QAAQ,CAACC,QAAT,CAAkBgB,GAAlB,CAAL,EAA6B;MAC3B,OAAOC,IAAI,CAACI,CAAD,EAAItB,QAAJ,CAAX;IACD;;IAED,OAAOE,MAAM,CAACoB,CAAD,EAAItB,QAAJ,CAAb;EACD,CAfD;AAgBD;;AAEDgB,mBAAmB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["makeDescribeBlock","template","makeItBlock","generateSpec","a","itLine","name","type","toLowerCase","includes","d","DESCRIBED_THING","stringLiteral","filename","IT_BLOCK","DOES_A_THING","STATEMENTS","testCase"],"sources":["mocha-template.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {stringLiteral} from '@babel/types';\nimport template from '@babel/template';\n\nconst makeDescribeBlock = template(`\n describe(DESCRIBED_THING, function() {\n IT_BLOCK\n });\n`);\n\nconst makeItBlock = template(`\n it(DOES_A_THING, function() {\n STATEMENTS\n });\n`);\n\n/**\n * Wraps a test case in a Mocha it-block\n * @param {Object} a\n * @param {string} a.name\n * @param {Object} a.testCase\n * @returns {[type]}\n */\nexport default function generateSpec(a) {\n let itLine = a.name;\n\n if (a.type.toLowerCase().includes('function')) {\n itLine += '()';\n }\n\n const d = makeDescribeBlock({\n DESCRIBED_THING: stringLiteral(a.filename),\n IT_BLOCK: makeItBlock({\n DOES_A_THING: stringLiteral(itLine),\n STATEMENTS: a.testCase
|
|
1
|
+
{"version":3,"names":["makeDescribeBlock","template","makeItBlock","generateSpec","a","itLine","name","type","toLowerCase","includes","d","DESCRIBED_THING","stringLiteral","filename","IT_BLOCK","DOES_A_THING","STATEMENTS","testCase"],"sources":["mocha-template.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {stringLiteral} from '@babel/types';\nimport template from '@babel/template';\n\nconst makeDescribeBlock = template(`\n describe(DESCRIBED_THING, function() {\n IT_BLOCK\n });\n`);\n\nconst makeItBlock = template(`\n it(DOES_A_THING, function() {\n STATEMENTS\n });\n`);\n\n/**\n * Wraps a test case in a Mocha it-block\n * @param {Object} a\n * @param {string} a.name\n * @param {Object} a.testCase\n * @returns {[type]}\n */\nexport default function generateSpec(a) {\n let itLine = a.name;\n\n if (a.type.toLowerCase().includes('function')) {\n itLine += '()';\n }\n\n const d = makeDescribeBlock({\n DESCRIBED_THING: stringLiteral(a.filename),\n IT_BLOCK: makeItBlock({\n DOES_A_THING: stringLiteral(itLine),\n STATEMENTS: a.testCase,\n }),\n });\n\n return d;\n}\n"],"mappings":";;;;;;;;;;;;AAIA;;AACA;;AALA;AACA;AACA;AAKA,IAAMA,iBAAiB,GAAG,IAAAC,iBAAA,sEAA1B;AAMA,IAAMC,WAAW,GAAG,IAAAD,iBAAA,+DAApB;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;;AACe,SAASE,YAAT,CAAsBC,CAAtB,EAAyB;EACtC,IAAIC,MAAM,GAAGD,CAAC,CAACE,IAAf;;EAEA,IAAIF,CAAC,CAACG,IAAF,CAAOC,WAAP,GAAqBC,QAArB,CAA8B,UAA9B,CAAJ,EAA+C;IAC7CJ,MAAM,IAAI,IAAV;EACD;;EAED,IAAMK,CAAC,GAAGV,iBAAiB,CAAC;IAC1BW,eAAe,EAAE,IAAAC,oBAAA,EAAcR,CAAC,CAACS,QAAhB,CADS;IAE1BC,QAAQ,EAAEZ,WAAW,CAAC;MACpBa,YAAY,EAAE,IAAAH,oBAAA,EAAcP,MAAd,CADM;MAEpBW,UAAU,EAAEZ,CAAC,CAACa;IAFM,CAAD;EAFK,CAAD,CAA3B;EAQA,OAAOP,CAAP;AACD"}
|
package/dist/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["parse","code","options","babelParse","allowImportExportEverywhere","sourceType","plugins"],"sources":["parse.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {parse as babelParse} from 'babylon';\nimport {defaults} from 'lodash';\n\n/**\n * Wrapper around babylon's parse with defaults set\n * @param {string} code\n * @param {object} options\n * @returns {ast}\n */\nexport default function parse(code, options) {\n return babelParse(code
|
|
1
|
+
{"version":3,"names":["parse","code","options","babelParse","allowImportExportEverywhere","sourceType","plugins"],"sources":["parse.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {parse as babelParse} from 'babylon';\nimport {defaults} from 'lodash';\n\n/**\n * Wrapper around babylon's parse with defaults set\n * @param {string} code\n * @param {object} options\n * @returns {ast}\n */\nexport default function parse(code, options) {\n return babelParse(\n code,\n defaults(options, {\n allowImportExportEverywhere: true,\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'flow',\n 'asyncFunctions',\n 'classConstructorCall',\n 'doExpressions',\n 'trailingFunctionCommas',\n 'objectRestSpread',\n 'decorators',\n 'classProperties',\n 'exportExtensions',\n 'exponentiationOperator',\n 'asyncGenerators',\n 'functionBind',\n 'functionSent',\n ],\n })\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAIA;;AAJA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,KAAT,CAAeC,IAAf,EAAqBC,OAArB,EAA8B;EAC3C,OAAO,IAAAC,cAAA,EACLF,IADK,EAEL,wBAASC,OAAT,EAAkB;IAChBE,2BAA2B,EAAE,IADb;IAEhBC,UAAU,EAAE,QAFI;IAGhBC,OAAO,EAAE,CACP,KADO,EAEP,MAFO,EAGP,gBAHO,EAIP,sBAJO,EAKP,eALO,EAMP,wBANO,EAOP,kBAPO,EAQP,YARO,EASP,iBATO,EAUP,kBAVO,EAWP,wBAXO,EAYP,iBAZO,EAaP,cAbO,EAcP,cAdO;EAHO,CAAlB,CAFK,CAAP;AAuBD"}
|
package/dist/transform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["assertionStatementTemplate","template","transform","comment","name","filename","type","ast","parse","traverse","enter","path","node","trailingComments","assertions","map","makeAsserter","length","replaceWith","ORIGINAL","ASSERTIONS","generateSpec","testCase","literalAssertionTest","value","buildLiteralAssertion"],"sources":["transform.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\
|
|
1
|
+
{"version":3,"names":["assertionStatementTemplate","template","transform","comment","name","filename","type","ast","parse","traverse","enter","path","node","trailingComments","assertions","map","makeAsserter","length","replaceWith","ORIGINAL","ASSERTIONS","generateSpec","testCase","literalAssertionTest","value","buildLiteralAssertion"],"sources":["transform.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport template from '@babel/template';\nimport traverse from '@babel/traverse';\n\nimport parse from './parse';\nimport generateSpec from './mocha-template';\nimport {build as buildLiteralAssertion, test as literalAssertionTest} from './assertions/literal';\n\nconst assertionStatementTemplate = template(`\n return Promise.resolve(ORIGINAL)\n .then(function(result) {\n ASSERTIONS\n })\n`);\n\n/**\n * @param {Object} options\n * @param {ast} options.comment\n * @param {string} options.name\n * @param {string} options.filename\n * @param {string} options.type\n * @returns {ast}\n */\nexport default function transform({comment, name, filename, type}) {\n const ast = parse(comment);\n\n traverse(ast, {\n enter(path) {\n if (path.node.trailingComments) {\n const assertions = path.node.trailingComments.map(makeAsserter);\n\n if (assertions.length) {\n Reflect.deleteProperty(path.node, 'trailingComments');\n\n path.replaceWith(\n assertionStatementTemplate({\n ORIGINAL: path.node,\n ASSERTIONS: assertions,\n })\n );\n }\n }\n },\n });\n\n return generateSpec({\n testCase: ast,\n name,\n filename,\n type,\n });\n}\n\n/**\n * Takes a trailing comment from an example block and changes it to an assertion\n * @param {CommentBlock} comment\n * @returns {ast}\n */\nfunction makeAsserter(comment) {\n if (literalAssertionTest(comment.value)) {\n return buildLiteralAssertion(comment.value);\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AACA;;AACA;;AATA;AACA;AACA;AASA,IAAMA,0BAA0B,GAAG,IAAAC,iBAAA,mGAAnC;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACe,SAASC,SAAT,OAAoD;EAAA,IAAhCC,OAAgC,QAAhCA,OAAgC;EAAA,IAAvBC,IAAuB,QAAvBA,IAAuB;EAAA,IAAjBC,QAAiB,QAAjBA,QAAiB;EAAA,IAAPC,IAAO,QAAPA,IAAO;EACjE,IAAMC,GAAG,GAAG,IAAAC,cAAA,EAAML,OAAN,CAAZ;EAEA,IAAAM,iBAAA,EAASF,GAAT,EAAc;IACZG,KADY,iBACNC,IADM,EACA;MACV,IAAIA,IAAI,CAACC,IAAL,CAAUC,gBAAd,EAAgC;QAC9B,IAAMC,UAAU,GAAGH,IAAI,CAACC,IAAL,CAAUC,gBAAV,CAA2BE,GAA3B,CAA+BC,YAA/B,CAAnB;;QAEA,IAAIF,UAAU,CAACG,MAAf,EAAuB;UACrB,6BAAuBN,IAAI,CAACC,IAA5B,EAAkC,kBAAlC;UAEAD,IAAI,CAACO,WAAL,CACElB,0BAA0B,CAAC;YACzBmB,QAAQ,EAAER,IAAI,CAACC,IADU;YAEzBQ,UAAU,EAAEN;UAFa,CAAD,CAD5B;QAMD;MACF;IACF;EAhBW,CAAd;EAmBA,OAAO,IAAAO,sBAAA,EAAa;IAClBC,QAAQ,EAAEf,GADQ;IAElBH,IAAI,EAAJA,IAFkB;IAGlBC,QAAQ,EAARA,QAHkB;IAIlBC,IAAI,EAAJA;EAJkB,CAAb,CAAP;AAMD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASU,YAAT,CAAsBb,OAAtB,EAA+B;EAC7B,IAAI,IAAAoB,aAAA,EAAqBpB,OAAO,CAACqB,KAA7B,CAAJ,EAAyC;IACvC,OAAO,IAAAC,cAAA,EAAsBtB,OAAO,CAACqB,KAA9B,CAAP;EACD;;EAED,OAAO,IAAP;AACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/jsdoctrinetest",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.15",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@babel/types": "^7.14.9"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
44
|
+
"@webex/test-helper-chai": "3.0.0-beta.15",
|
|
45
45
|
"babylon": "^6.18.0",
|
|
46
46
|
"doctrine": "^2.1.0",
|
|
47
47
|
"lodash": "^4.17.21"
|
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import template from '@babel/template';
|
|
6
|
-
import {
|
|
7
|
-
booleanLiteral,
|
|
8
|
-
numericLiteral,
|
|
9
|
-
stringLiteral
|
|
10
|
-
} from '@babel/types';
|
|
6
|
+
import {booleanLiteral, numericLiteral, stringLiteral} from '@babel/types';
|
|
11
7
|
|
|
12
8
|
const pattern = /^\s*?=>( async)?\s*/;
|
|
13
9
|
|
|
@@ -34,7 +30,7 @@ export function test(value) {
|
|
|
34
30
|
*/
|
|
35
31
|
export function build(value) {
|
|
36
32
|
return tpl({
|
|
37
|
-
ASSERTION: literal(value.replace(pattern, ''))
|
|
33
|
+
ASSERTION: literal(value.replace(pattern, '')),
|
|
38
34
|
});
|
|
39
35
|
}
|
|
40
36
|
|
|
@@ -46,7 +42,8 @@ export function build(value) {
|
|
|
46
42
|
function literal(l) {
|
|
47
43
|
/* eslint complexity: [0] */
|
|
48
44
|
// eslint-disable-next-line prefer-const
|
|
49
|
-
let f
|
|
45
|
+
let f;
|
|
46
|
+
let i;
|
|
50
47
|
|
|
51
48
|
switch (typeof l) {
|
|
52
49
|
case 'boolean':
|
package/src/extract.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
import fs from 'fs';
|
|
7
6
|
|
|
8
7
|
import traverse from '@babel/traverse';
|
|
@@ -39,29 +38,29 @@ export default function extract(transform, filename) {
|
|
|
39
38
|
traverse(ast, {
|
|
40
39
|
enter(path) {
|
|
41
40
|
if (path.node.leadingComments) {
|
|
42
|
-
path.node.leadingComments
|
|
43
|
-
.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
lineNumbers: true
|
|
50
|
-
});
|
|
41
|
+
path.node.leadingComments.filter(isJSDocComment).forEach((comment) => {
|
|
42
|
+
const result = doctrine.parse(comment.value, {
|
|
43
|
+
unwrap: true,
|
|
44
|
+
sloppy: true,
|
|
45
|
+
recoverable: true,
|
|
46
|
+
lineNumbers: true,
|
|
47
|
+
});
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
if (result.tags) {
|
|
50
|
+
result.tags.forEach((tag) => {
|
|
51
|
+
if (tag.title === 'example') {
|
|
52
|
+
results.push(
|
|
53
|
+
transform({
|
|
56
54
|
comment: tag.description,
|
|
57
55
|
name: getNodeName(path.node),
|
|
58
56
|
filename: path.node.loc.filename,
|
|
59
|
-
type: path.node.type
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
57
|
+
type: path.node.type,
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
});
|
|
65
64
|
}
|
|
66
65
|
},
|
|
67
66
|
Program: {
|
|
@@ -73,8 +72,8 @@ export default function extract(transform, filename) {
|
|
|
73
72
|
path.pushContainer('body', results);
|
|
74
73
|
done = true;
|
|
75
74
|
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
75
|
+
},
|
|
76
|
+
},
|
|
78
77
|
});
|
|
79
78
|
|
|
80
79
|
return ast;
|
|
@@ -109,9 +108,12 @@ function isJSDocComment(comment) {
|
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
// eslint-disable-next-line
|
|
112
|
-
return (
|
|
113
|
-
//
|
|
114
|
-
|
|
111
|
+
return (
|
|
112
|
+
(comment.type === 'CommentBlock' || // estree
|
|
113
|
+
// eslint-disable-next-line
|
|
114
|
+
comment.type === `Block`) && // get-comments / traditional
|
|
115
115
|
// eslint-disable-next-line
|
|
116
|
-
|
|
116
|
+
asterisks &&
|
|
117
|
+
asterisks[1].length === 1
|
|
118
|
+
);
|
|
117
119
|
}
|
package/src/index.js
CHANGED
package/src/mocha-template.js
CHANGED
package/src/parse.js
CHANGED
|
@@ -12,24 +12,27 @@ import {defaults} from 'lodash';
|
|
|
12
12
|
* @returns {ast}
|
|
13
13
|
*/
|
|
14
14
|
export default function parse(code, options) {
|
|
15
|
-
return babelParse(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
'
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
15
|
+
return babelParse(
|
|
16
|
+
code,
|
|
17
|
+
defaults(options, {
|
|
18
|
+
allowImportExportEverywhere: true,
|
|
19
|
+
sourceType: 'module',
|
|
20
|
+
plugins: [
|
|
21
|
+
'jsx',
|
|
22
|
+
'flow',
|
|
23
|
+
'asyncFunctions',
|
|
24
|
+
'classConstructorCall',
|
|
25
|
+
'doExpressions',
|
|
26
|
+
'trailingFunctionCommas',
|
|
27
|
+
'objectRestSpread',
|
|
28
|
+
'decorators',
|
|
29
|
+
'classProperties',
|
|
30
|
+
'exportExtensions',
|
|
31
|
+
'exponentiationOperator',
|
|
32
|
+
'asyncGenerators',
|
|
33
|
+
'functionBind',
|
|
34
|
+
'functionSent',
|
|
35
|
+
],
|
|
36
|
+
})
|
|
37
|
+
);
|
|
35
38
|
}
|
package/src/transform.js
CHANGED
|
@@ -2,16 +2,12 @@
|
|
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
import template from '@babel/template';
|
|
7
6
|
import traverse from '@babel/traverse';
|
|
8
7
|
|
|
9
8
|
import parse from './parse';
|
|
10
9
|
import generateSpec from './mocha-template';
|
|
11
|
-
import {
|
|
12
|
-
build as buildLiteralAssertion,
|
|
13
|
-
test as literalAssertionTest
|
|
14
|
-
} from './assertions/literal';
|
|
10
|
+
import {build as buildLiteralAssertion, test as literalAssertionTest} from './assertions/literal';
|
|
15
11
|
|
|
16
12
|
const assertionStatementTemplate = template(`
|
|
17
13
|
return Promise.resolve(ORIGINAL)
|
|
@@ -28,9 +24,7 @@ const assertionStatementTemplate = template(`
|
|
|
28
24
|
* @param {string} options.type
|
|
29
25
|
* @returns {ast}
|
|
30
26
|
*/
|
|
31
|
-
export default function transform({
|
|
32
|
-
comment, name, filename, type
|
|
33
|
-
}) {
|
|
27
|
+
export default function transform({comment, name, filename, type}) {
|
|
34
28
|
const ast = parse(comment);
|
|
35
29
|
|
|
36
30
|
traverse(ast, {
|
|
@@ -41,20 +35,22 @@ export default function transform({
|
|
|
41
35
|
if (assertions.length) {
|
|
42
36
|
Reflect.deleteProperty(path.node, 'trailingComments');
|
|
43
37
|
|
|
44
|
-
path.replaceWith(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
path.replaceWith(
|
|
39
|
+
assertionStatementTemplate({
|
|
40
|
+
ORIGINAL: path.node,
|
|
41
|
+
ASSERTIONS: assertions,
|
|
42
|
+
})
|
|
43
|
+
);
|
|
48
44
|
}
|
|
49
45
|
}
|
|
50
|
-
}
|
|
46
|
+
},
|
|
51
47
|
});
|
|
52
48
|
|
|
53
49
|
return generateSpec({
|
|
54
50
|
testCase: ast,
|
|
55
51
|
name,
|
|
56
52
|
filename,
|
|
57
|
-
type
|
|
53
|
+
type,
|
|
58
54
|
});
|
|
59
55
|
}
|
|
60
56
|
|