eslint-plugin-miniprogram
Version:
eslint plugin for mini programs
159 lines • 6.63 kB
JavaScript
"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