-
Notifications
You must be signed in to change notification settings - Fork 64
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add template utils #534
Add template utils #534
Changes from all commits
11b0294
6ab7619
a28d895
532146b
42459f3
2e25a61
f40131c
7611ea2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,6 @@ | ||
const fs = require('fs'); | ||
const { logger } = require('./logger'); | ||
|
||
// Matches the .html file extension, excluding module.html | ||
const TEMPLATE_EXTENSION_REGEX = new RegExp(/(?<!module)\.html$/); | ||
|
||
// Matches the comment brackets that wrap annotations | ||
const ANNOTATIONS_REGEX = /<!--([\s\S]*?)-->/; | ||
// Matches an annotation value, ending at space, newline, or end of string | ||
|
@@ -17,24 +15,18 @@ const ANNOTATION_KEYS = { | |
description: 'description', | ||
}; | ||
|
||
const getFileAnnotations = filePath => { | ||
try { | ||
const data = fs.readFileSync(filePath, 'utf8'); | ||
const match = data.match(ANNOTATIONS_REGEX); | ||
const annotation = match && match[1] ? match[1] : ''; | ||
return annotation; | ||
} catch (err) { | ||
logger.debug(err); | ||
return ''; | ||
} | ||
}; | ||
|
||
const getAnnotationValue = (annotations, key) => { | ||
const valueRegex = new RegExp(`${key}${ANNOTATION_VALUE_REGEX}`); | ||
const match = annotations.match(valueRegex); | ||
return match ? match[1].trim() : null; | ||
}; | ||
|
||
const buildAnnotationValueGetter = source => { | ||
const match = source.match(ANNOTATIONS_REGEX); | ||
const annotation = match && match[1] ? match[1] : ''; | ||
return annotationKey => getAnnotationValue(annotation, annotationKey); | ||
}; | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Works as expected here https://github.com/HubSpot/hubspot-cms-vscode/pull/117/files#diff-dfcd8afcb372a75a1eb1bdc0af57d36a5e0a727dbca99350779abb21333a298fR65 and also tested the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cool! This pattern looks cleaner 🙌 |
||
/* | ||
* Returns true if: | ||
* .html extension (ignoring module.html) | ||
|
@@ -44,6 +36,6 @@ const isCodedFile = filePath => TEMPLATE_EXTENSION_REGEX.test(filePath); | |
module.exports = { | ||
ANNOTATION_KEYS, | ||
getAnnotationValue, | ||
getFileAnnotations, | ||
buildAnnotationValueGetter, | ||
isCodedFile, | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,12 @@ | ||
const fs = require('fs'); | ||
const { | ||
ANNOTATION_KEYS, | ||
getAnnotationValue, | ||
getFileAnnotations, | ||
buildAnnotationValueGetter, | ||
isCodedFile, | ||
} = require('@hubspot/cli-lib/templates'); | ||
const BaseValidator = require('../BaseValidator'); | ||
const { VALIDATOR_KEYS } = require('../../constants'); | ||
const { logger } = require('@hubspot/cli-lib/logger'); | ||
|
||
const TEMPLATE_LIMIT = 50; | ||
const TEMPLATE_IGNORE_LIST = ['section']; | ||
|
@@ -100,29 +101,28 @@ class TemplateValidator extends BaseValidator { | |
|
||
files.forEach(file => { | ||
if (isCodedFile(file)) { | ||
const annotations = getFileAnnotations(file); | ||
let data; | ||
try { | ||
data = fs.readFileSync(file, 'utf8'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Moves the file reading step from cli-lib to cli which I don't think has any negative impact |
||
} catch (e) { | ||
logger.error(`Error reading file ${file}`); | ||
} | ||
const getAnnotationValue = buildAnnotationValueGetter(data); | ||
|
||
const isAvailableForNewContent = getAnnotationValue( | ||
annotations, | ||
ANNOTATION_KEYS.isAvailableForNewContent | ||
); | ||
|
||
if (isAvailableForNewContent !== 'false') { | ||
const templateType = getAnnotationValue( | ||
annotations, | ||
ANNOTATION_KEYS.templateType | ||
); | ||
const templateType = getAnnotationValue(ANNOTATION_KEYS.templateType); | ||
|
||
if (TEMPLATE_IGNORE_LIST.includes(templateType)) { | ||
return; | ||
} | ||
|
||
if (templateType) { | ||
const label = getAnnotationValue( | ||
annotations, | ||
ANNOTATION_KEYS.label | ||
); | ||
const label = getAnnotationValue(ANNOTATION_KEYS.label); | ||
const screenshotPath = getAnnotationValue( | ||
annotations, | ||
ANNOTATION_KEYS.screenshotPath | ||
); | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not necessarily a blocker, but it would be nice if this was something that the BE could return to us so that we could keep a single source of truth. I don't imagine that it will change frequently, but it'll be yet another area where we have to manually keep data in sync.