UNPKG

website-auditfy

Version:

> Tool for validate your project on SEO, HTML, CSS, JS, TS, Performance, Security and A11Y

290 lines 12.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsAuditModule = void 0; const message_model_1 = require("../../models/message.model"); const audit_model_1 = require("../../models/audit.model"); const eslint_1 = require("eslint"); const message_enum_1 = require("../../enum/message.enum"); const glob_1 = require("glob"); const url_utils_1 = require("../../utils/url.utils"); const node_path_1 = __importDefault(require("node:path")); const eslintRules = { "no-var": "warn", "object-shorthand": ["warn", "properties"], "accessor-pairs": ["error", { "setWithoutGet": true, "enforceForClassMembers": true }], "array-bracket-spacing": ["error", "never"], "array-callback-return": ["error", { "allowImplicit": false, "checkForEach": false }], "arrow-spacing": ["error", { "before": true, "after": true }], "block-spacing": ["error", "always"], "brace-style": ["error", "1tbs", { "allowSingleLine": true }], "camelcase": ["error", { "allow": ["^UNSAFE_"], "properties": "never", "ignoreGlobals": true }], "comma-dangle": ["error", { "arrays": "never", "objects": "never", "imports": "never", "exports": "never", "functions": "never" }], "comma-spacing": ["error", { "before": false, "after": true }], "comma-style": ["error", "last"], "computed-property-spacing": ["error", "never", { "enforceForClassMembers": true }], "constructor-super": "error", "curly": ["error", "multi-line"], "default-case-last": "error", "dot-location": ["error", "property"], "dot-notation": ["error", { "allowKeywords": true }], "eol-last": "error", "eqeqeq": ["error", "always", { "null": "ignore" }], "func-call-spacing": ["error", "never"], "generator-star-spacing": ["error", { "before": true, "after": true }], "indent": ["error", 2, { "SwitchCase": 1, "VariableDeclarator": 1, "outerIIFEBody": 1, "MemberExpression": 1, "FunctionDeclaration": { "parameters": 1, "body": 1 }, "FunctionExpression": { "parameters": 1, "body": 1 }, "CallExpression": { "arguments": 1 }, "ArrayExpression": 1, "ObjectExpression": 1, "ImportDeclaration": 1, "flatTernaryExpressions": false, "ignoreComments": false, "ignoredNodes": ["TemplateLiteral *", "JSXElement", "JSXElement > *", "JSXAttribute", "JSXIdentifier", "JSXNamespacedName", "JSXMemberExpression", "JSXSpreadAttribute", "JSXExpressionContainer", "JSXOpeningElement", "JSXClosingElement", "JSXFragment", "JSXOpeningFragment", "JSXClosingFragment", "JSXText", "JSXEmptyExpression", "JSXSpreadChild"], "offsetTernaryExpressions": true }], "key-spacing": ["error", { "beforeColon": false, "afterColon": true }], "keyword-spacing": ["error", { "before": true, "after": true }], "lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }], "multiline-ternary": ["error", "always-multiline"], "new-cap": ["error", { "newIsCap": true, "capIsNew": false, "properties": true }], "new-parens": "error", "no-array-constructor": "error", "no-async-promise-executor": "error", "no-caller": "error", "no-case-declarations": "error", "no-class-assign": "error", "no-compare-neg-zero": "error", "no-cond-assign": "error", "no-const-assign": "error", "no-constant-condition": ["error", { "checkLoops": false }], "no-control-regex": "error", "no-debugger": "error", "no-delete-var": "error", "no-dupe-args": "error", "no-dupe-class-members": "error", "no-dupe-keys": "error", "no-duplicate-case": "error", "no-useless-backreference": "error", "no-empty": ["error", { "allowEmptyCatch": true }], "no-empty-character-class": "error", "no-empty-pattern": "error", "no-eval": "error", "no-ex-assign": "error", "no-extend-native": "error", "no-extra-bind": "error", "no-extra-boolean-cast": "error", "no-extra-parens": ["error", "functions"], "no-fallthrough": "error", "no-floating-decimal": "error", "no-func-assign": "error", "no-global-assign": "error", "no-implied-eval": "error", "no-import-assign": "error", "no-invalid-regexp": "error", "no-irregular-whitespace": "error", "no-iterator": "error", "no-labels": ["error", { "allowLoop": false, "allowSwitch": false }], "no-lone-blocks": "error", "no-loss-of-precision": "error", "no-misleading-character-class": "error", "no-prototype-builtins": "error", "no-useless-catch": "error", "no-mixed-operators": ["error", { "groups": [ ["==", "!=", "===", "!==", ">", ">=", "<", "<="], ["&&", "||"], ["in", "instanceof"] ], "allowSamePrecedence": true }], "no-mixed-spaces-and-tabs": "error", "no-multi-spaces": "error", "no-multi-str": "error", "no-multiple-empty-lines": ["error", { "max": 1, "maxBOF": 0, "maxEOF": 0 }], "no-new": "error", "no-new-func": "error", "no-new-object": "error", "no-new-symbol": "error", "no-new-wrappers": "error", "no-obj-calls": "error", "no-octal": "error", "no-octal-escape": "error", "no-proto": "error", "no-redeclare": ["error", { "builtinGlobals": false }], "no-regex-spaces": "error", "no-return-assign": ["error", "except-parens"], "no-self-assign": ["error", { "props": true }], "no-self-compare": "error", "no-sequences": "error", "no-shadow-restricted-names": "error", "no-sparse-arrays": "error", "no-tabs": "error", "no-template-curly-in-string": "error", "no-this-before-super": "error", "no-throw-literal": "error", "no-trailing-spaces": "error", "no-undef": "error", "no-undef-init": "error", "no-unexpected-multiline": "error", "no-unmodified-loop-condition": "error", "no-unneeded-ternary": ["error", { "defaultAssignment": false }], "no-unreachable": "error", "no-unreachable-loop": "error", "no-unsafe-finally": "error", "no-unsafe-negation": "error", "no-unused-expressions": ["error", { "allowShortCircuit": true, "allowTernary": true, "allowTaggedTemplates": true }], "no-unused-vars": ["error", { "args": "none", "caughtErrors": "none", "ignoreRestSiblings": true, "vars": "all" }], "no-use-before-define": ["error", { "functions": false, "classes": false, "variables": false }], "no-useless-call": "error", "no-useless-computed-key": "error", "no-useless-constructor": "error", "no-useless-escape": "error", "no-useless-rename": "error", "no-useless-return": "error", "no-void": "error", "no-whitespace-before-property": "error", "no-with": "error", "object-curly-newline": ["error", { "multiline": true, "consistent": true }], "object-curly-spacing": ["error", "always"], "object-property-newline": ["error", { "allowMultiplePropertiesPerLine": true }], "one-var": ["error", { "initialized": "never" }], "operator-linebreak": ["error", "after", { "overrides": { "?": "before", ":": "before", "|>": "before" } }], "padded-blocks": ["error", { "blocks": "never", "switches": "never", "classes": "never" }], "prefer-const": ["error", { "destructuring": "all" }], "prefer-promise-reject-errors": "error", "prefer-regex-literals": ["error", { "disallowRedundantWrapping": true }], "quote-props": ["error", "as-needed"], "quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": false }], "rest-spread-spacing": ["error", "never"], "semi": ["error", "never"], "semi-spacing": ["error", { "before": false, "after": true }], "space-before-blocks": ["error", "always"], "space-before-function-paren": ["error", "always"], "space-in-parens": ["error", "never"], "space-infix-ops": "error", "space-unary-ops": ["error", { "words": true, "nonwords": false }], "spaced-comment": ["error", "always", { "line": { "markers": ["*package", "!", "/", ",", "="] }, "block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] } }], "symbol-description": "error", "template-curly-spacing": ["error", "never"], "template-tag-spacing": ["error", "never"], "unicode-bom": ["error", "never"], "use-isnan": ["error", { "enforceForSwitchCase": true, "enforceForIndexOf": true }], "valid-typeof": ["error", { "requireStringLiterals": true }], "wrap-iife": ["error", "any", { "functionPrototypeMethods": true }], "yield-star-spacing": ["error", "both"], "yoda": ["error", "never"], }; class JsAuditModule extends audit_model_1.Audit { constructor(source, dom, lightHouse, htmlValidator) { super(); this.dom = dom; this.source = source; this.lighthouse = lightHouse; this.htmlValidator = htmlValidator; this.name = "JavaScript"; } check() { return __awaiter(this, void 0, void 0, function* () { const eslintResult = yield this.getEsLintResults(); return eslintResult.reduce((messages, lintResult) => { messages.push(...lintResult.messages.map((error) => message_model_1.Message.create(`${error.message}. Rule: ${error.ruleId}. Line ${error.line}. File ${lintResult.filePath}`, message_enum_1.MessageType.warning))); return messages; }, []); }); } getEsLintResults() { return __awaiter(this, void 0, void 0, function* () { const eslint = new eslint_1.ESLint({ overrideConfigFile: true, // @ts-ignore baseConfig: { rules: Object.assign({}, eslintRules) }, }); const jsFiles = this.getJavaScriptFiles(); if (jsFiles.length === 0) { return []; } const eslintResult = []; const urlFileList = jsFiles.filter(x => (x.includes('http') || x.includes('https'))); const staticFileList = jsFiles.filter(x => !(x.includes('http') && x.includes('https'))); const urlFilesContent = urlFileList.map((x) => __awaiter(this, void 0, void 0, function* () { return yield url_utils_1.URLUtils.download(x); })); for (const urlFile of urlFilesContent) { const index = urlFilesContent.indexOf(urlFile); const lintFileResult = yield eslint.lintText(yield urlFile, { filePath: node_path_1.default.basename(urlFileList[index]) }); eslintResult.push(...lintFileResult); } eslintResult.push(...yield eslint.lintFiles(staticFileList)); return eslintResult; }); } getJavaScriptFiles() { const jsFiles = []; debugger; if (!this.source.isURL) { jsFiles.push(...(0, glob_1.globSync)(`${this.source.file.dir}/**/*.js`)); } this.dom('script').each((i, elem) => { const src = this.dom(elem).attr('src'); if (src) { if ((src === null || src === void 0 ? void 0 : src.startsWith("http")) || (src === null || src === void 0 ? void 0 : src.startsWith("https"))) { jsFiles.push(src); } else { const prefixPath = this.source.isURL ? this.source.url : this.source.file.dir; jsFiles.push(`${prefixPath}/${src}`); } } }); return [...new Set(jsFiles)]; } } exports.JsAuditModule = JsAuditModule; //# sourceMappingURL=javascript.module.js.map