UNPKG

eslint-plugin-miniprogram

Version:
159 lines 6.63 kB
"use strict"; /** * @fileoverview parsing and linting required and valid JSON config fields. */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ var path_1 = __importDefault(require("path")); var fs_1 = __importDefault(require("fs")); var json5_1 = __importDefault(require("json5")); var constants_1 = require("../constants"); var replaceExt = function (file, newExt) { var _a = path_1.default.parse(file), dir = _a.dir, name = _a.name; return path_1.default.format({ dir: dir, base: "" + name + newExt }); }; var readFileSafe = function (file) { try { var context = fs_1.default.readFileSync(file); if (!context) { return null; } return context.toString(); } catch (error) { return null; } }; function extractConfigFromFile(file) { // find config file var minaFile = replaceExt(file, ".mina"); var minaContent = readFileSafe(minaFile); var jsonFile = replaceExt(file, ".json"); var jsonContent = readFileSafe(jsonFile); if (minaContent) { // support .mina file var configMatched = minaContent.match(/<config>(.*)<\/config>/s); if (!configMatched) { return { errMsg: "file content mismatch" }; } var configText = configMatched[1]; var configFile = minaFile; return { configText: configText, configFile: configFile }; } if (jsonContent) { // support .json file var configText = jsonContent; var configFile = jsonFile; return { configText: configText, configFile: configFile }; } // not a Mini Program component / page return { errMsg: "invalid config" }; } exports.configJsonValidateFields = { meta: { type: "suggestion", docs: { description: "Validate fields in component / page config file", category: "WeChat Mini Program Best Practices", recommended: false, url: "https://github.com/airbnb/eslint-plugin-miniprogram" }, schema: [] }, create: function (context) { return { CallExpression: function (node) { if (node.callee.type === "Identifier") { var name = node.callee.name; if (name !== "Component" && name !== "Page") { return; } var file = context.getFilename(); var result = extractConfigFromFile(file); if (result.errMsg === "file content mismatch") { context.report({ node: node, message: "Missing <config> tag in " + file }); return; } var _a = result, configFile = _a.configFile, configText = _a.configText; var configData = void 0; // read config try { configData = json5_1.default.parse(configText); } catch (error) { context.report({ node: node, message: "Parse config failed in " + configFile + " " + error.message }); return; } var invalidKeys = Object.keys(configData).filter(function (key) { return !constants_1.ValidKeys.has(key); }); if (Array.isArray(invalidKeys) && invalidKeys.length > 0) { context.report({ node: node, message: "Invalid keys " + invalidKeys.join(", ") + " in " + configFile }); return; } // should add `"conponent": true` if using `Component` function. if (name === "Component" && !configData.component) { context.report({ node: node, message: "Missing required field `\"component\": true` in " + configFile }); return; } // should not use `"conponent": true` if using `Page` function. if (name === "Page" && configData.component) { context.report({ node: node, message: "Disallowed field `\"component\": true` in " + configFile }); return; } if (configData.navigationBarTextStyle && ["black", "white"].indexOf(configData.navigationBarTextStyle) < 0) { context.report({ node: node, message: "Invalid value for field \"navigationBarTextStyle\" in " + configFile + ", can only be " + [ "black", "white" ].join(" / ") }); return; } if (configData.backgroundTextStyle && ["dark", "light"].indexOf(configData.backgroundTextStyle) < 0) { context.report({ node: node, message: "Invalid value for field \"backgroundTextStyle\" in " + configFile + ", can only be " + [ "dark", "light" ].join(" / ") }); return; } // should always add `"usingComponents": {}`. if (!configData.usingComponents) { context.report({ node: node, message: "Missing required field `\"usingComponents\": {}` in " + configFile }); } } } }; } }; //# sourceMappingURL=config-json-validate-fields.js.map