UNPKG

5.32 kBSource Map (JSON)View Raw
1{"version":3,"sources":["extract.js"],"names":["extract","transform","filename","code","readFileSync","encoding","ast","sourceFilename","results","done","enter","path","node","leadingComments","filter","isJSDocComment","forEach","comment","result","parse","value","unwrap","sloppy","recoverable","lineNumbers","tags","tag","title","push","description","name","getNodeName","loc","type","Program","exit","pushContainer","id","key","Error","asterisks","match","startsWith","endsWith","length"],"mappings":";;;;;kBAyBwBA,O;;AArBxB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;AAUA;;;;;;AAMe,SAASA,OAAT,CAAiBC,SAAjB,EAA4BC,QAA5B,EAAsC;AACnD;AACA,MAAMC,OAAO,aAAGC,YAAH,CAAgBF,QAAhB,EAA0B,EAACG,UAAU,MAAX,EAA1B,CAAb;;AAEA,MAAMC,MAAM,qBAAMH,IAAN,EAAY,EAACI,gBAAgBL,QAAjB,EAAZ,CAAZ;;AAEA,MAAMM,UAAU,EAAhB;;AAEA,MAAIC,OAAO,KAAX;AACA,+BAASH,GAAT,EAAc;AACZI,SADY,iBACNC,IADM,EACA;AACV,UAAIA,KAAKC,IAAL,CAAUC,eAAd,EAA+B;AAC7BF,aAAKC,IAAL,CAAUC,eAAV,CACGC,MADH,CACUC,cADV,EAEGC,OAFH,CAEW,UAACC,OAAD,EAAa;AACpB,cAAMC,SAAS,mBAASC,KAAT,CAAeF,QAAQG,KAAvB,EAA8B;AAC3CC,oBAAQ,IADmC;AAE3CC,oBAAQ,IAFmC;AAG3CC,yBAAa,IAH8B;AAI3CC,yBAAa;AAJ8B,WAA9B,CAAf;;AAOA,cAAIN,OAAOO,IAAX,EAAiB;AACfP,mBAAOO,IAAP,CAAYT,OAAZ,CAAoB,UAACU,GAAD,EAAS;AAC3B,kBAAIA,IAAIC,KAAJ,KAAc,SAAlB,EAA6B;AAC3BnB,wBAAQoB,IAAR,CAAa3B,UAAU;AACrBgB,2BAASS,IAAIG,WADQ;AAErBC,wBAAMC,YAAYpB,KAAKC,IAAjB,CAFe;AAGrBV,4BAAUS,KAAKC,IAAL,CAAUoB,GAAV,CAAc9B,QAHH;AAIrB+B,wBAAMtB,KAAKC,IAAL,CAAUqB;AAJK,iBAAV,CAAb;AAMD;AACF,aATD;AAUD;AACF,SAtBH;AAuBD;AACF,KA3BW;;AA4BZC,aAAS;AACPC,UADO,gBACFxB,IADE,EACI;AACT,YAAI,2BAAUA,IAAV,CAAJ,EAAqB;AACnB,cAAIF,IAAJ,EAAU;AACR;AACD;AACDE,eAAKyB,aAAL,CAAmB,MAAnB,EAA2B5B,OAA3B;AACAC,iBAAO,IAAP;AACD;AACF;AATM;AA5BG,GAAd;;AAyCA,SAAOH,GAAP;AACD;;AAED;;;;;AA9EA;;;;AAmFA,SAASyB,WAAT,CAAqBnB,IAArB,EAA2B;AACzB,MAAIA,KAAKyB,EAAT,EAAa;AACX,WAAOzB,KAAKyB,EAAL,CAAQP,IAAf;AACD;;AAED,MAAIlB,KAAK0B,GAAT,EAAc;AACZ,WAAO1B,KAAK0B,GAAL,CAASR,IAAhB;AACD;;AAED,QAAM,IAAIS,KAAJ,CAAU,8BAAV,CAAN;AACD;AACD;;;;;AAKA,SAASxB,cAAT,CAAwBE,OAAxB,EAAiC;AAC/B,MAAMuB,YAAYvB,QAAQG,KAAR,CAAcqB,KAAd,CAAoB,QAApB,CAAlB;AACA,MAAIxB,QAAQG,KAAR,CAAcsB,UAAd,CAAyB,IAAzB,KAAkCzB,QAAQG,KAAR,CAAcuB,QAAd,CAAuB,IAAvB,CAAtC,EAAoE;AAClE,WAAO,KAAP;AACD;;AAED;AACA,SAAO,CAAC1B,QAAQgB,IAAR,uBAAmC;AACzC;AACAhB,UAAQgB,IAAR,YAFK,KAEqB;AAC1B;AACGO,WAJE,IAIWA,UAAW,CAAX,EAAeI,MAAf,KAA0B,CAJ5C;AAKD","file":"extract.js","sourcesContent":["/*!\n * Copyright (c) 2015-2017 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport parse from './parse';\nimport fs from 'fs';\nimport traverse from 'babel-traverse';\nimport doctrine from 'doctrine';\nimport {isProgram} from 'babel-types';\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 traverse(ast, {\n enter(path) {\n if (path.node.leadingComments) {\n path.node.leadingComments\n .filter(isJSDocComment)\n .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(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 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 if (comment.value.startsWith('/*') && comment.value.endsWith('*/')) {\n return false;\n }\n\n // eslint-disable-next-line\n return (comment.type === `CommentBlock` || // estree\n // eslint-disable-next-line\n comment.type === `Block`) // get-comments / traditional\n // eslint-disable-next-line\n && asterisks && asterisks[ 1 ].length === 1;\n}\n"]}
\No newline at end of file