eslint-plugin-sql
Version:
SQL linting rules for ESLint.
96 lines (95 loc) • 4.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rule = void 0;
const createRule_1 = require("../factories/createRule");
const isSqlQuery_1 = require("../utilities/isSqlQuery");
const debug_1 = __importDefault(require("debug"));
const debug = (0, debug_1.default)('eslint-plugin-sql:rule:no-unsafe-query');
const defaultOptions = {
allowLiteral: false,
sqlTag: 'sql',
};
exports.rule = (0, createRule_1.createRule)({
create: (context) => {
var _a, _b, _c, _d, _e;
// @ts-expect-error I am ont clear how to type this
const placeholderRule = (_b = (_a = context.settings) === null || _a === void 0 ? void 0 : _a.sql) === null || _b === void 0 ? void 0 : _b.placeholderRule;
const pluginOptions = ((_c = context.options) === null || _c === void 0 ? void 0 : _c[0]) || {};
const sqlTag = (_d = pluginOptions.sqlTag) !== null && _d !== void 0 ? _d : defaultOptions.sqlTag;
const allowLiteral = (_e = pluginOptions.allowLiteral) !== null && _e !== void 0 ? _e : defaultOptions.allowLiteral;
return {
TemplateLiteral(node) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
if (allowLiteral && node.quasis.length === 1) {
return;
}
const literal = node.quasis
.map((quasi) => {
return quasi.value.raw;
})
.join('foo');
debug('input', literal);
const recognizedAsQuery = (0, isSqlQuery_1.isSqlQuery)(literal, placeholderRule);
debug('recognized as a query', recognizedAsQuery);
if (!recognizedAsQuery) {
return;
}
const tagName =
// @ts-expect-error TODO
(_e = (_b = (_a = node.parent.tag) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b :
// @ts-expect-error TODO
(_d = (_c = node.parent.tag) === null || _c === void 0 ? void 0 : _c.object) === null || _d === void 0 ? void 0 : _d.name) !== null && _e !== void 0 ? _e :
// @ts-expect-error TODO
(_h = (_g = (_f = node.parent.tag) === null || _f === void 0 ? void 0 : _f.callee) === null || _g === void 0 ? void 0 : _g.object) === null || _h === void 0 ? void 0 : _h.name;
// @ts-expect-error TODO
const legacyTagName = (_k = (_j = node.parent) === null || _j === void 0 ? void 0 : _j.name) === null || _k === void 0 ? void 0 : _k.toLowerCase();
if (legacyTagName !== sqlTag && tagName !== sqlTag) {
context.report({
data: {
sqlTag,
},
messageId: 'noUnsafeQuery',
node,
});
}
},
};
},
defaultOptions: [
{
allowLiteral: false,
sqlTag: 'sql',
},
],
meta: {
docs: {
description: 'Disallows use of SQL inside of template literals without the `sql` tag.',
url: 'https://github.com/gajus/eslint-plugin-sql#no-unsafe-query',
},
fixable: 'code',
messages: {
noUnsafeQuery: 'Use "{{sqlTag}}" tag',
},
schema: [
{
additionalProperties: false,
properties: {
allowLiteral: {
default: false,
type: 'boolean',
},
sqlTag: {
default: 'sql',
type: 'string',
},
},
type: 'object',
},
],
type: 'problem',
},
name: 'no-unsafe-query',
});