From fd5dc5656383708820278a50379163b46f7c1f5d Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Wed, 24 Jul 2019 14:42:58 +0200 Subject: [PATCH 1/8] feat: support for multiline comment for languages that use default regex --- package.json | 1 + src/server/code-parse/index.js | 5 ++- .../code-parse/language/default/codecrumbs.js | 40 ++++++++----------- 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 467224b4..5b11c6b9 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "file-saver": "^2.0.0", "http-server": "^0.11.1", "js2flowchart": "^1.1.7", + "line-number": "^0.1.0", "lodash": "^4.17.10", "lodash.debounce": "^4.0.8", "madge": "^3.3.0", diff --git a/src/server/code-parse/index.js b/src/server/code-parse/index.js index b8e673ab..ae4c1e21 100644 --- a/src/server/code-parse/index.js +++ b/src/server/code-parse/index.js @@ -7,7 +7,7 @@ const parseFile = ( { parseCodeCrumbs, parseImports, parseDependencies, attachCode, language, webpackConfigPath, tsConfigPath } = {} ) => { const { codecrumbsParser, dependenciesParser } = getLanguageParsers(language); - + return Promise.all([ parseDependencies && dependenciesParser.getDependencies(itemPath, projectDir, {webpackConfigPath, tsConfigPath}), file.read(itemPath, 'utf8') @@ -20,6 +20,7 @@ const parseFile = ( if (parseCodeCrumbs) { const codecrumbsList = codecrumbsParser.getCrumbs(code, itemPath); + // console.log(codecrumbsList) if (codecrumbsList.length) { item.fileCode = code; item.children = codecrumbsList; @@ -37,7 +38,7 @@ const parseFile = ( item.flows = undefined; } } - + if (parseImports) { const importedDependencies = dependenciesParser.getImports(code, itemPath); if (importedDependencies.length) { diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index 59da7cc0..896098ed 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -1,7 +1,9 @@ +const lineNumber = require('line-number'); +const isUndefined = require('lodash/isUndefined'); const { CC_NODE_TYPE, NO_TRAIL_FLOW } = require('../../../shared-constants'); -const CRUMB = 'codecrumb', - CRUMB_SHORT_HANDLER = 'cc'; +const CRUMB_REGEX = /cc|codecrumb/; +const DEFAULT_COMMENT_REGEX = /(\/\*[\s\S]*?(.*)\*\/)|(\/\/.*)/gm; const getCommentNodeValue = node => (node.value || '').trim(); @@ -38,12 +40,7 @@ const parseCodecrumbComment = (node = {}) => { return cc; }; -const isCodecrumb = node => { - if (!node) return false; - - const comment = getCommentNodeValue(node); - return comment.startsWith(CRUMB) || comment.startsWith(CRUMB_SHORT_HANDLER); -}; +const isCodecrumb = node => CRUMB_REGEX.test(getCommentNodeValue(node)); const buildCrumb = (params, crumbNodeLines, path) => ({ type: CC_NODE_TYPE, @@ -57,22 +54,20 @@ const buildCrumb = (params, crumbNodeLines, path) => ({ }); const setupGetCommentsFromCode = regex => fileCode => { - if (!fileCode) return []; - - return fileCode.split('\n').reduce((comments, item, i) => { - const codeLine = item.trim(); - if (!codeLine) return comments; - - const matches = regex.exec(codeLine); - if (matches) { - const lineNumber = i + 1; - return [ - ...comments, - { value: matches[matches.length - 1], nodeLines: [lineNumber, lineNumber] } - ]; + if (!fileCode) { + return []; + } + + const result = DEFAULT_COMMENT_REGEX.exec(fileCode) || []; + + return result.reduce((comments, item, i) => { + if (isUndefined(item)) { + return comments; } - return comments; + const matchLineNumber = lineNumber(fileCode, DEFAULT_COMMENT_REGEX); + + return [...comments, { value: item, nodeLines: [matchLineNumber, matchLineNumber] }]; }, []); }; @@ -99,7 +94,6 @@ const setupGetCrumbs = getCommentsFromCode => (fileCode, path) => { } }; -const DEFAULT_COMMENT_REGEX = /^([^\/\/]*)\/\/(.*)$/; const getCrumbs = setupGetCrumbs(setupGetCommentsFromCode(DEFAULT_COMMENT_REGEX)); module.exports = { From 653b156e20f93f7e54be6581ae44a1413905db1c Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Wed, 24 Jul 2019 14:57:47 +0200 Subject: [PATCH 2/8] feat: support for multiline comment for languages that use default regex --- .../code-parse/language/default/codecrumbs.js | 14 ++++++++------ .../code-parse/language/javascript/codecrumbs.js | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index 896098ed..80829cd5 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -3,7 +3,7 @@ const isUndefined = require('lodash/isUndefined'); const { CC_NODE_TYPE, NO_TRAIL_FLOW } = require('../../../shared-constants'); const CRUMB_REGEX = /cc|codecrumb/; -const DEFAULT_COMMENT_REGEX = /(\/\*[\s\S]*?(.*)\*\/)|(\/\/.*)/gm; +const DEFAULT_COMMENT_REGEX = /^([^\/\/]*)\/\/(.*)$/; const getCommentNodeValue = node => (node.value || '').trim(); @@ -58,16 +58,18 @@ const setupGetCommentsFromCode = regex => fileCode => { return []; } - const result = DEFAULT_COMMENT_REGEX.exec(fileCode) || []; + const result = regex.exec(fileCode) || []; - return result.reduce((comments, item, i) => { - if (isUndefined(item)) { + return result.reduce((comments, value) => { + if (isUndefined(value)) { return comments; } - const matchLineNumber = lineNumber(fileCode, DEFAULT_COMMENT_REGEX); + const matchLineNumber = lineNumber(fileCode, regex); + const nodeLines = [matchLineNumber, matchLineNumber]; + + return [...comments, { value, nodeLines }]; - return [...comments, { value: item, nodeLines: [matchLineNumber, matchLineNumber] }]; }, []); }; diff --git a/src/server/code-parse/language/javascript/codecrumbs.js b/src/server/code-parse/language/javascript/codecrumbs.js index 72dd6a8f..09da19cb 100644 --- a/src/server/code-parse/language/javascript/codecrumbs.js +++ b/src/server/code-parse/language/javascript/codecrumbs.js @@ -25,7 +25,7 @@ const getCrumbs = (fileCode, path) => { const { setupGetCrumbs, setupGetCommentsFromCode } = require('../default/codecrumbs'); -const JAVA_SCRIPT_COMMENT_REGEX = /^([^\/\/]*)\/\/(.*)$/; +const JAVA_SCRIPT_COMMENT_REGEX = /(\/\*[\s\S]*?(.*)\*\/)|(\/\/.*)/gm; const getCrumbs = setupGetCrumbs(setupGetCommentsFromCode(JAVA_SCRIPT_COMMENT_REGEX)); module.exports = { From 3c013bbed91bb64a6583ca015d04320af0dc3618 Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Tue, 30 Jul 2019 15:10:59 +0200 Subject: [PATCH 3/8] feat: support for multiline comment for languages that use default regex --- src/server/code-parse/index.js | 1 - .../code-parse/language/default/codecrumbs.js | 21 ++++++++++++------- .../language/javascript/codecrumbs.js | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/server/code-parse/index.js b/src/server/code-parse/index.js index 0d7db52f..a73963a2 100644 --- a/src/server/code-parse/index.js +++ b/src/server/code-parse/index.js @@ -29,7 +29,6 @@ const parseFile = ( if (parseCodeCrumbs) { const codecrumbsList = codecrumbsParser.getCrumbs(code, itemPath); - // console.log(codecrumbsList) if (codecrumbsList.length) { item.fileCode = code; item.children = codecrumbsList; diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index 80829cd5..35c6c3bb 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -1,5 +1,5 @@ const lineNumber = require('line-number'); -const isUndefined = require('lodash/isUndefined'); +const compact = require('lodash/compact'); const { CC_NODE_TYPE, NO_TRAIL_FLOW } = require('../../../shared-constants'); const CRUMB_REGEX = /cc|codecrumb/; @@ -58,17 +58,22 @@ const setupGetCommentsFromCode = regex => fileCode => { return []; } - const result = regex.exec(fileCode) || []; + const result = compact(regex.exec(fileCode)) || []; return result.reduce((comments, value) => { - if (isUndefined(value)) { - return comments; - } - const matchLineNumber = lineNumber(fileCode, regex); - const nodeLines = [matchLineNumber, matchLineNumber]; - return [...comments, { value, nodeLines }]; + const parseRes = matchLineNumber.filter((val) => val.match == value)[0] + + if(parseRes) { + const number = parseRes["number"] + + const nodeLines = [1, 1]; + + return [...comments, { value, nodeLines }]; + } else { + return comments; + } }, []); }; diff --git a/src/server/code-parse/language/javascript/codecrumbs.js b/src/server/code-parse/language/javascript/codecrumbs.js index 46b2123e..2dabc7a8 100644 --- a/src/server/code-parse/language/javascript/codecrumbs.js +++ b/src/server/code-parse/language/javascript/codecrumbs.js @@ -25,7 +25,7 @@ const getCrumbs = (fileCode, path) => { const { setupGetCrumbs, setupGetCommentsFromCode } = require('../default/codecrumbs'); -const JAVA_SCRIPT_COMMENT_REGEX = /(\/\*[\s\S]*?(.*)\*\/)|(\/\/.*)/gm; +const JAVA_SCRIPT_COMMENT_REGEX = /(?:(?:^|\s)\/\/(.+?)$)|(?:\/\*(.*?)\*\/)/gms; const getCrumbs = setupGetCrumbs(setupGetCommentsFromCode(JAVA_SCRIPT_COMMENT_REGEX)); // replace with own implementation if needed From de76cf31ee28e3e3508d37512fbb6dc0525ebd5f Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Tue, 30 Jul 2019 15:22:40 +0200 Subject: [PATCH 4/8] feat: support for multiline comment for languages that use default regex --- src/server/code-parse/language/default/codecrumbs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index 35c6c3bb..732d51de 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -68,7 +68,7 @@ const setupGetCommentsFromCode = regex => fileCode => { if(parseRes) { const number = parseRes["number"] - const nodeLines = [1, 1]; + const nodeLines = [number, number]; return [...comments, { value, nodeLines }]; } else { From 9d7cda90851d5e824e92fe5f5f289e1fbccbb396 Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Wed, 31 Jul 2019 13:22:25 +0200 Subject: [PATCH 5/8] feat: support for multiline comment for languages that use default regex --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 52fef538..83c397d4 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "directory-tree": "^2.1.0", "file-saver": "^2.0.0", "http-server": "0.9.0", - "js2flowchart": "^1.1.7", "line-number": "^0.1.0", "js2flowchart": "1.3.2", "lodash": "^4.17.10", From 98ee1df4a19fea21325c4136b43230331da589b2 Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Wed, 31 Jul 2019 16:01:41 +0200 Subject: [PATCH 6/8] feat: support for multiline comment for languages that use default regex --- example-project/src-client/auth/actions.js | 4 +++- package.json | 1 - .../code-parse/language/default/codecrumbs.js | 20 ++++++------------- .../language/javascript/codecrumbs.js | 2 +- src/server/utils/logger.js | 7 ++++++- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/example-project/src-client/auth/actions.js b/example-project/src-client/auth/actions.js index 0bfee82e..97658b99 100644 --- a/example-project/src-client/auth/actions.js +++ b/example-project/src-client/auth/actions.js @@ -10,7 +10,9 @@ import { function authenticate(provider) { return dispatch => { - //cc:signin#1;firebase sign in;+1;call to firebase with auth provider, proceed if success response + /* + * cc:signin#1;firebase sign in;+1;call to firebase with auth provider, proceed if success response + */ firebaseAuth.signInWithPopup(provider) .then(result => dispatch(signInSuccess(result))) .catch(error => dispatch(signInError(error))); diff --git a/package.json b/package.json index 83c397d4..c13649b2 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "directory-tree": "^2.1.0", "file-saver": "^2.0.0", "http-server": "0.9.0", - "line-number": "^0.1.0", "js2flowchart": "1.3.2", "lodash": "^4.17.10", "lodash.debounce": "^4.0.8", diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index 732d51de..f85f1235 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -1,4 +1,3 @@ -const lineNumber = require('line-number'); const compact = require('lodash/compact'); const { CC_NODE_TYPE, NO_TRAIL_FLOW } = require('../../../shared-constants'); @@ -61,20 +60,13 @@ const setupGetCommentsFromCode = regex => fileCode => { const result = compact(regex.exec(fileCode)) || []; return result.reduce((comments, value) => { - const matchLineNumber = lineNumber(fileCode, regex); - - const parseRes = matchLineNumber.filter((val) => val.match == value)[0] - - if(parseRes) { - const number = parseRes["number"] - - const nodeLines = [number, number]; - - return [...comments, { value, nodeLines }]; - } else { - return comments; - } + const index = fileCode.indexOf(value); + const tempString = fileCode.substring(0, index); + const matchLineNumber = tempString.split('\n').length; + const commentStringCount = value.split('\n').length + const nodeLines = [matchLineNumber, matchLineNumber + commentStringCount - 1]; + return [...comments, { value, nodeLines }] }, []); }; diff --git a/src/server/code-parse/language/javascript/codecrumbs.js b/src/server/code-parse/language/javascript/codecrumbs.js index 2dabc7a8..813e7e82 100644 --- a/src/server/code-parse/language/javascript/codecrumbs.js +++ b/src/server/code-parse/language/javascript/codecrumbs.js @@ -25,7 +25,7 @@ const getCrumbs = (fileCode, path) => { const { setupGetCrumbs, setupGetCommentsFromCode } = require('../default/codecrumbs'); -const JAVA_SCRIPT_COMMENT_REGEX = /(?:(?:^|\s)\/\/(.+?)$)|(?:\/\*(.*?)\*\/)/gms; +const JAVA_SCRIPT_COMMENT_REGEX = /\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm; const getCrumbs = setupGetCrumbs(setupGetCommentsFromCode(JAVA_SCRIPT_COMMENT_REGEX)); // replace with own implementation if needed diff --git a/src/server/utils/logger.js b/src/server/utils/logger.js index f851da1b..d269ee55 100644 --- a/src/server/utils/logger.js +++ b/src/server/utils/logger.js @@ -5,7 +5,12 @@ const logAdapter = msg => console.log(msg); module.exports = { getText: e => { try { - return typeof e === 'object' ? JSON.stringify(e) : e; + if (typeof e === 'object') { + const stringifiedError = JSON.stringify(e); + return stringifiedError === '{}' ? e : stringifiedError; + } else { + return e; + } } catch (e) { return `COULD NOT PARSE ERROR ${e}`; } From d6044b0025ef54c2531e426a3c3e244a7f71235f Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Thu, 1 Aug 2019 11:43:51 +0200 Subject: [PATCH 7/8] feat: support for multiline comment for languages that use default regex --- src/server/code-parse/language/default/codecrumbs.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index f85f1235..0f053eaf 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -60,6 +60,7 @@ const setupGetCommentsFromCode = regex => fileCode => { const result = compact(regex.exec(fileCode)) || []; return result.reduce((comments, value) => { + value = value.trim() const index = fileCode.indexOf(value); const tempString = fileCode.substring(0, index); const matchLineNumber = tempString.split('\n').length; From a9ae413c994c67e7f264d0d88f2f642088ffab2e Mon Sep 17 00:00:00 2001 From: Ivan Verevkin Date: Thu, 1 Aug 2019 14:10:23 +0200 Subject: [PATCH 8/8] chore: switched JS to use default regex --- src/server/code-parse/language/default/codecrumbs.js | 2 +- src/server/code-parse/language/javascript/codecrumbs.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/server/code-parse/language/default/codecrumbs.js b/src/server/code-parse/language/default/codecrumbs.js index 0f053eaf..9a2cc2e6 100644 --- a/src/server/code-parse/language/default/codecrumbs.js +++ b/src/server/code-parse/language/default/codecrumbs.js @@ -2,7 +2,7 @@ const compact = require('lodash/compact'); const { CC_NODE_TYPE, NO_TRAIL_FLOW } = require('../../../shared-constants'); const CRUMB_REGEX = /cc|codecrumb/; -const DEFAULT_COMMENT_REGEX = /^([^\/\/]*)\/\/(.*)$/; +const DEFAULT_COMMENT_REGEX = /\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm; const getCommentNodeValue = node => (node.value || '').trim(); diff --git a/src/server/code-parse/language/javascript/codecrumbs.js b/src/server/code-parse/language/javascript/codecrumbs.js index 813e7e82..8878b948 100644 --- a/src/server/code-parse/language/javascript/codecrumbs.js +++ b/src/server/code-parse/language/javascript/codecrumbs.js @@ -23,10 +23,7 @@ const getCrumbs = (fileCode, path) => { } };*/ -const { setupGetCrumbs, setupGetCommentsFromCode } = require('../default/codecrumbs'); - -const JAVA_SCRIPT_COMMENT_REGEX = /\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm; -const getCrumbs = setupGetCrumbs(setupGetCommentsFromCode(JAVA_SCRIPT_COMMENT_REGEX)); +const { getCrumbs } = require('../default/codecrumbs'); // replace with own implementation if needed module.exports = {