@platformos/pos-cli
Version:
Manage your platformOS application
93 lines (82 loc) • 3.03 kB
JavaScript
const fs = require('fs');
const glob = require('fast-glob');
/*
glob [string - glob]
Try to be as specific as possible to make it fast.
Omit `app` and `modules` in your definition
test [string - regexp]
What test will look for in the file contents. Make sure you escape as this is JS string (ie. doube backslash \)
message [string]
Message to be displayed if offence is found
*/
const detailed = [
{
name: 'profiler',
glob: 'views/pages/**/*.liquid',
test: '^enable_profiler: true$',
message: `[PERFORMANCE] Please remove "enable_profiler: true" setting for performance reasons.
\nRead more at: https://documentation.platformos.com/release-notes/15-NOVEMBER-2018#liquid-profiler`
},
{
name: 'unnecessary_brackets',
glob: '*.liquid',
test: '\\.name\\s*-?}}\\[\\]',
message: `[DEPRECATED] Please remove hardcoded array indicators ([]) from your input names.
\nExample: <input name="{{ fields.company.name }}[]"> becomes <input name="{{ fields.company.name }}">`
},
{
name: 'resource_id',
glob: 'views/**/*.liquid',
test: '{%-?\\s*include_form.*resource_id:',
message: '[DEPRECATED ARGUMENT] "resource_id" of include_form tag, please replace with "id"'
},
{
name: 'configuration',
glob: '{form_configurations,forms}/**/*.liquid',
test: '^configuration:',
message: '[DEPRECATED KEY] "configuration", please replace with "fields"'
},
{
name: 'attribute_type',
glob: '{transactable_types,instance_profile_types,user_profile_types,custom_model_types,model_schemas}/**/*.yml',
test: '\\s*attribute_type:',
message: '[DEPRECATED KEY] "attribute_type", please replace with "type"'
},
{
name: 'custom_attributes',
glob: '{transactable_types,instance_profile_types,user_profile_types,custom_model_types,model_schemas}/**/*.yml',
test: '^custom_attributes:',
message: '[DEPRECATED KEY] "custom_attributes", please replace with "properties"'
},
{
name: 'camel_case',
glob: '{transactable_types,instance_profile_types,user_profile_types,custom_model_types,model_schemas}/**/*.yml',
test: '^name:\\s+([a-z\\_]*( |[A-Z]|-)[a-z\\_]*)+',
message: '[CONVENTION] Please use snake_case naming convention in model names'
}
];
module.exports = {
audit: async () => {
let results = {};
for (let rule of detailed) {
const files = await glob(`{app,modules,marketplace_builder}/**/${rule.glob}`);
for (let file of files) {
const fileContents = fs.readFileSync(file, { encoding: 'utf8' });
const match = RegExp(rule.test, 'm').test(fileContents);
if (!match) {
continue;
}
const currentFiles = results[rule.name] && results[rule.name].files;
const updatedFiles = (currentFiles || []).concat(file);
results = {
...results,
[]: {
files: updatedFiles,
message: rule.message
}
};
}
}
return results;
}
};