@venizia/dev-configs 0.4.7 → 0.4.8-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/checks/catalog.js.map +1 -1
- package/dist/checks/module-cycles.js.map +1 -1
- package/dist/checks/purity/manifest.js.map +1 -1
- package/dist/checks/purity/probe.js.map +1 -1
- package/dist/checks/purity/run.js.map +1 -1
- package/dist/checks/split-report.js.map +1 -1
- package/dist/checks/test-controls.js.map +1 -1
- package/dist/checks/test-dead-code.js.map +1 -1
- package/dist/checks/test-mutate.js.map +1 -1
- package/dist/checks/test-weight.js.map +1 -1
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/codemod/async-style.d.ts +1 -1
- package/dist/cli/codemod/async-style.js +3 -3
- package/dist/cli/codemod/async-style.js.map +1 -1
- package/dist/cli/codemod/connector-imports.js.map +1 -1
- package/dist/cli/codemod/const-classes.js.map +1 -1
- package/dist/cli/codemod/drop-redundant-casts.js.map +1 -1
- package/dist/cli/codemod/files.js.map +1 -1
- package/dist/cli/codemod/index.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/index.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/logger-scope.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/mapping.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/rewriter.js.map +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lint.js.map +1 -1
- package/dist/linters/eslint.js +7 -5
- package/dist/linters/eslint.js.map +1 -1
- package/dist/linters/house/async-rules.d.ts +10 -0
- package/dist/linters/house/async-rules.js +29 -0
- package/dist/linters/house/async-rules.js.map +1 -0
- package/dist/linters/house/await-support.d.ts +2 -0
- package/dist/linters/house/await-support.js +15 -10
- package/dist/linters/house/await-support.js.map +1 -1
- package/dist/linters/house/common.d.ts +2 -0
- package/dist/linters/house/common.js +2 -0
- package/dist/linters/house/common.js.map +1 -1
- package/dist/linters/house/configs.d.ts +3 -29
- package/dist/linters/house/configs.js +24 -51
- package/dist/linters/house/configs.js.map +1 -1
- package/dist/linters/house/const-class-values.rule.js.map +1 -1
- package/dist/linters/house/effect-cleanup-consistency.rule.js +2 -1
- package/dist/linters/house/effect-cleanup-consistency.rule.js.map +1 -1
- package/dist/linters/house/hook-support.js.map +1 -1
- package/dist/linters/house/index.d.ts +2 -1
- package/dist/linters/house/index.js +4 -1
- package/dist/linters/house/index.js.map +1 -1
- package/dist/linters/house/max-params-own.rule.js.map +1 -1
- package/dist/linters/house/no-async-hook-callback.rule.js.map +1 -1
- package/dist/linters/house/no-await-promise-chain.rule.js +2 -3
- package/dist/linters/house/no-await-promise-chain.rule.js.map +1 -1
- package/dist/linters/house/no-leaked-render.rule.js.map +1 -1
- package/dist/linters/house/no-return-await.rule.js +2 -8
- package/dist/linters/house/no-return-await.rule.js.map +1 -1
- package/dist/linters/house/no-silent-catch.rule.js +1 -1
- package/dist/linters/house/no-silent-catch.rule.js.map +1 -1
- package/dist/linters/house/no-unbraced-case.rule.d.ts +15 -0
- package/dist/linters/house/no-unbraced-case.rule.js +45 -0
- package/dist/linters/house/no-unbraced-case.rule.js.map +1 -0
- package/dist/linters/house/plugin.js +2 -0
- package/dist/linters/house/plugin.js.map +1 -1
- package/dist/linters/house/promise-chain-support.js.map +1 -1
- package/dist/linters/ignore.js.map +1 -1
- package/dist/linters/index.d.ts +1 -0
- package/dist/linters/index.js +1 -0
- package/dist/linters/index.js.map +1 -1
- package/dist/linters/padding.d.ts +8 -0
- package/dist/linters/padding.js +25 -0
- package/dist/linters/padding.js.map +1 -0
- package/dist/linters/rules/eqeqeq.rule.js.map +1 -1
- package/dist/linters/rules/index.d.ts +2 -0
- package/dist/linters/rules/index.js +2 -0
- package/dist/linters/rules/index.js.map +1 -1
- package/dist/linters/rules/lines-between-class-members.rule.d.ts +14 -0
- package/dist/linters/rules/lines-between-class-members.rule.js +17 -0
- package/dist/linters/rules/lines-between-class-members.rule.js.map +1 -0
- package/dist/linters/rules/naming-convention.rule.js.map +1 -1
- package/dist/linters/rules/no-restricted-imports.rule.js.map +1 -1
- package/dist/linters/rules/no-restricted-properties.rule.js.map +1 -1
- package/dist/linters/rules/no-unused-vars.rule.js.map +1 -1
- package/dist/linters/rules/padding-line-between-statements.rule.d.ts +16 -0
- package/dist/linters/rules/padding-line-between-statements.rule.js +25 -0
- package/dist/linters/rules/padding-line-between-statements.rule.js.map +1 -0
- package/dist/linters/rules/prefer-nullish-coalescing.rule.js.map +1 -1
- package/dist/linters/rules/switch-case-braces.rule.js.map +1 -1
- package/dist/testing/repo-tmp.js.map +1 -1
- package/package.json +3 -5
- package/dist/checks/catalog.d.ts.map +0 -1
- package/dist/checks/index.d.ts.map +0 -1
- package/dist/checks/module-cycles.d.ts.map +0 -1
- package/dist/checks/purity/manifest.d.ts.map +0 -1
- package/dist/checks/purity/probe.d.ts.map +0 -1
- package/dist/checks/purity/run.d.ts.map +0 -1
- package/dist/checks/split-report.d.ts.map +0 -1
- package/dist/checks/test-controls.d.ts.map +0 -1
- package/dist/checks/test-dead-code.d.ts.map +0 -1
- package/dist/checks/test-mutate.d.ts.map +0 -1
- package/dist/checks/test-weight.d.ts.map +0 -1
- package/dist/cli/check.d.ts.map +0 -1
- package/dist/cli/clean.d.ts.map +0 -1
- package/dist/cli/codemod/async-style.d.ts.map +0 -1
- package/dist/cli/codemod/connector-imports.d.ts.map +0 -1
- package/dist/cli/codemod/const-classes.d.ts.map +0 -1
- package/dist/cli/codemod/drop-redundant-casts.d.ts.map +0 -1
- package/dist/cli/codemod/files.d.ts.map +0 -1
- package/dist/cli/codemod/index.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/index.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/logger-scope.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mapping.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/boot.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/connectors.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/core-server.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/core-worker.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/dev-configs.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/filter.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/helpers.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/index.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/inversion.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/kernel.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/rewriter.d.ts.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/lint.d.ts.map +0 -1
- package/dist/compilers/bun.d.ts.map +0 -1
- package/dist/compilers/index.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/linters/browser.d.ts.map +0 -1
- package/dist/linters/eslint.d.ts.map +0 -1
- package/dist/linters/house/await-support.d.ts.map +0 -1
- package/dist/linters/house/common.d.ts.map +0 -1
- package/dist/linters/house/configs.d.ts.map +0 -1
- package/dist/linters/house/const-class-values.rule.d.ts.map +0 -1
- package/dist/linters/house/effect-cleanup-consistency.rule.d.ts.map +0 -1
- package/dist/linters/house/hook-support.d.ts.map +0 -1
- package/dist/linters/house/index.d.ts.map +0 -1
- package/dist/linters/house/max-params-own.rule.d.ts.map +0 -1
- package/dist/linters/house/no-async-hook-callback.rule.d.ts.map +0 -1
- package/dist/linters/house/no-await-promise-chain.rule.d.ts.map +0 -1
- package/dist/linters/house/no-inline-await.rule.d.ts.map +0 -1
- package/dist/linters/house/no-leaked-render.rule.d.ts.map +0 -1
- package/dist/linters/house/no-new-error.rule.d.ts.map +0 -1
- package/dist/linters/house/no-return-await.rule.d.ts.map +0 -1
- package/dist/linters/house/no-silent-catch.rule.d.ts.map +0 -1
- package/dist/linters/house/plugin.d.ts.map +0 -1
- package/dist/linters/house/promise-chain-support.d.ts.map +0 -1
- package/dist/linters/ignore.d.ts.map +0 -1
- package/dist/linters/index.d.ts.map +0 -1
- package/dist/linters/jsx-files.d.ts.map +0 -1
- package/dist/linters/oxlint-presets.d.ts.map +0 -1
- package/dist/linters/oxlint.d.ts.map +0 -1
- package/dist/linters/react-eslint.d.ts.map +0 -1
- package/dist/linters/react-oxlint.d.ts.map +0 -1
- package/dist/linters/rules/common.d.ts.map +0 -1
- package/dist/linters/rules/eqeqeq.rule.d.ts.map +0 -1
- package/dist/linters/rules/index.d.ts.map +0 -1
- package/dist/linters/rules/naming-convention.rule.d.ts.map +0 -1
- package/dist/linters/rules/no-restricted-imports.rule.d.ts.map +0 -1
- package/dist/linters/rules/no-restricted-properties.rule.d.ts.map +0 -1
- package/dist/linters/rules/no-unused-vars.rule.d.ts.map +0 -1
- package/dist/linters/rules/prefer-nullish-coalescing.rule.d.ts.map +0 -1
- package/dist/linters/rules/switch-case-braces.rule.d.ts.map +0 -1
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/rejection.helper.d.ts.map +0 -1
- package/dist/testing/repo-tmp.d.ts.map +0 -1
- package/dist/testing/spawn.helper.d.ts.map +0 -1
- package/dist/testing/tmpdir-preload.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-silent-catch.rule.js","sourceRoot":"","sources":["../../../src/linters/house/no-silent-catch.rule.ts"],"names":[],"mappings":";;;AAEA,mDAA+C;AAC/C,qCAAyE;AACzE,mEAA8D;AAE9D,iGAAiG;AACjG,MAAM,eAAe,GAAG,CAAC,IAAkD,EAAW,EAAE,CACtF,IAAI,CAAC,UAAU;KACZ,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;KAChC,IAAI,CACH,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAChC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CACvD,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CACtC,CAAC;AAEN,kHAAkH;AAClH,MAAM,gBAAgB,GAAG,CAAC,IAA4B,EAAW,EAAE,CACjE,IAAI,CAAC,SAAS,KAAK,IAAI;IACvB,IAAI,CAAC,SAAS,KAAK,SAAS;IAC5B,gBAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,YAAY,CAAC;AAE7D;;;;;;;;;;;GAWG;AACH,MAAa,iBAAiB;aACZ,SAAI,GAAG,GAAG,+BAAsB,kBAAkB,CAAC;aAEnD,SAAI,GAAoB;QACtC,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE;gBACR,aAAa,EACX,+JAA+J;gBACjK,WAAW,EACT,4JAA4J;aAC/J;SACF;QACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;YAClB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;YAE/B,OAAO;gBACL,CAAC,qBAAY,CAAC,eAAe,CAAC,EAAE,CAAC,IAAe,EAAE,EAAE;oBAClD,IAAI,2CAAmB,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC;wBAC5D,OAAO;oBACT,CAAC;oBAED,MAAM,IAAI,GAAG,gBAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC3D,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACnE,MAAM,WAAW,GAAG,gBAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"no-silent-catch.rule.js","sourceRoot":"","sources":["../../../src/linters/house/no-silent-catch.rule.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Rule, SourceCode } from 'eslint';\nimport type { TRuleSeverity } from '../rules/common';\nimport { AwaitSupport } from './await-support';\nimport { AstNode, AstNodeTypes, HOUSE_PLUGIN_NAMESPACE } from './common';\nimport { PromiseChainSupport } from './promise-chain-support';\n\n/** Whether a parameter of `owner` (a function or a catch clause) is read or written anywhere. */\nconst isParameterUsed = (opts: { owner: Rule.Node; sourceCode: SourceCode }): boolean =>\n opts.sourceCode\n .getDeclaredVariables(opts.owner)\n .some(\n (variable) =>\n variable.defs.some((definition) =>\n ['Parameter', 'CatchClause'].includes(definition.type),\n ) && variable.references.length > 0,\n );\n\n/** A parameter that is not a plain name (`({ message }) =>`, `catch ({ message })`) reads the error by itself. */\nconst isPlainParameter = (opts: { parameter: unknown }): boolean =>\n opts.parameter === null ||\n opts.parameter === undefined ||\n AstNode.getType({ node: opts.parameter }) === 'Identifier';\n\n/**\n * `venizia/no-silent-catch`. A handled error leaves a trace (V-C-06). Reported: a `.catch(h)` (also `?.catch`,\n * `['catch']`) whose handler is an arrow or function expression that ignores its parameter and whose body is empty\n * or only gives back a constant (`() => null`, `() => undefined`, `() => ({})`, `() => []`, `() => {}`,\n * `function () {}`), and a `catch` block that is empty, holds only a comment, or only assigns or returns a constant\n * without reading the error. Handled, and not reported: anything that reads the error (logs, wraps or rethrows\n * it), makes any call (a log, a cleanup, a fallback), throws, or reads another variable.\n *\n * It is not ESLint's `no-empty`: `no-empty` reports an empty block only, lets a block that holds a comment pass,\n * and never sees `.catch(() => null)`. Both report `catch {}`, each with its own message. There is no fix: what to\n * log is a decision. A deliberate silent catch carries an `eslint-disable-next-line` with its reason.\n */\nexport class NoSilentCatchRule {\n static readonly NAME = `${HOUSE_PLUGIN_NAMESPACE}/no-silent-catch`;\n\n static readonly RULE: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n schema: [],\n messages: {\n silentHandler:\n 'This `.catch` handler swallows the error with no trace: log it, rethrow it or wrap it (V-C-06), or keep it with an `eslint-disable-next-line` and the reason.',\n silentBlock:\n 'This `catch` block swallows the error with no trace: log it, rethrow it or wrap it (V-C-06), or keep it with an `eslint-disable-next-line` and the reason.',\n },\n },\n create: (context) => {\n const { sourceCode } = context;\n\n return {\n [AstNodeTypes.CALL_EXPRESSION]: (node: Rule.Node) => {\n if (PromiseChainSupport.chainMethodOf({ node }) !== 'catch') {\n return;\n }\n\n const args = AstNode.readField({ node, key: 'arguments' });\n const handler: unknown = Array.isArray(args) ? args[0] : undefined;\n const handlerType = AstNode.getType({ node: handler });\n\n if (\n !AwaitSupport.isNode(handler) ||\n (handlerType !== 'ArrowFunctionExpression' && handlerType !== 'FunctionExpression')\n ) {\n return;\n }\n\n const params = AstNode.readField({ node: handler, key: 'params' });\n\n if (\n !Array.isArray(params) ||\n !params.every((parameter) => isPlainParameter({ parameter })) ||\n isParameterUsed({ owner: handler, sourceCode })\n ) {\n return;\n }\n\n const body = AstNode.readField({ node: handler, key: 'body' });\n const isSilent =\n AstNode.getType({ node: body }) === AstNodeTypes.BLOCK_STATEMENT\n ? PromiseChainSupport.isSilentBlock({\n statements: AstNode.readField({ node: body, key: 'body' }),\n })\n : PromiseChainSupport.isConstant({ node: body });\n\n if (isSilent) {\n context.report({ node: handler, messageId: 'silentHandler' });\n }\n },\n [AstNodeTypes.CATCH_CLAUSE]: (node: Rule.Node) => {\n if (\n !isPlainParameter({ parameter: AstNode.readField({ node, key: 'param' }) }) ||\n isParameterUsed({ owner: node, sourceCode })\n ) {\n return;\n }\n\n const body = AstNode.readField({ node, key: 'body' });\n\n if (\n PromiseChainSupport.isSilentBlock({\n statements: AstNode.readField({ node: body, key: 'body' }),\n })\n ) {\n context.report({ node, messageId: 'silentBlock' });\n }\n },\n };\n },\n };\n\n static build(opts: { severity?: TRuleSeverity } = {}): TRuleSeverity {\n return opts.severity ?? 'error';\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Linter, Rule } from 'eslint';
|
|
2
|
+
import type { TRuleSeverity } from '../rules/common';
|
|
3
|
+
/**
|
|
4
|
+
* `venizia/no-unbraced-case`: the statements of a `case` or `default` sit in one block, `case 'a': { ... }`.
|
|
5
|
+
* It is the ESLint twin of oxlint's `unicorn/switch-case-braces` (`SwitchCaseBracesRule`, mode `always`).
|
|
6
|
+
* Stacked labels with no statements stay as written. The fix wraps the statements in `{ }`.
|
|
7
|
+
*/
|
|
8
|
+
export declare class NoUnbracedCaseRule {
|
|
9
|
+
static readonly NAME = "venizia/no-unbraced-case";
|
|
10
|
+
static readonly RULE: Rule.RuleModule;
|
|
11
|
+
static build(opts?: {
|
|
12
|
+
severity?: TRuleSeverity;
|
|
13
|
+
}): Linter.RuleEntry;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=no-unbraced-case.rule.d.ts.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NoUnbracedCaseRule = void 0;
|
|
4
|
+
const common_1 = require("./common");
|
|
5
|
+
/**
|
|
6
|
+
* `venizia/no-unbraced-case`: the statements of a `case` or `default` sit in one block, `case 'a': { ... }`.
|
|
7
|
+
* It is the ESLint twin of oxlint's `unicorn/switch-case-braces` (`SwitchCaseBracesRule`, mode `always`).
|
|
8
|
+
* Stacked labels with no statements stay as written. The fix wraps the statements in `{ }`.
|
|
9
|
+
*/
|
|
10
|
+
class NoUnbracedCaseRule {
|
|
11
|
+
static { this.NAME = `${common_1.HOUSE_PLUGIN_NAMESPACE}/no-unbraced-case`; }
|
|
12
|
+
static { this.RULE = {
|
|
13
|
+
meta: {
|
|
14
|
+
type: 'suggestion',
|
|
15
|
+
fixable: 'code',
|
|
16
|
+
schema: [],
|
|
17
|
+
messages: { unbraced: 'Wrap the statements of this case in a block: `case x: { ... }`.' },
|
|
18
|
+
},
|
|
19
|
+
create: (context) => ({
|
|
20
|
+
[common_1.AstNodeTypes.SWITCH_CASE]: (node) => {
|
|
21
|
+
const statements = common_1.AstNode.readField({ node, key: 'consequent' });
|
|
22
|
+
if (!Array.isArray(statements) || statements.length === 0) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const [first] = statements;
|
|
26
|
+
const last = statements[statements.length - 1];
|
|
27
|
+
if (statements.length === 1 &&
|
|
28
|
+
common_1.AstNode.getType({ node: first }) === common_1.AstNodeTypes.BLOCK_STATEMENT) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
context.report({
|
|
32
|
+
node,
|
|
33
|
+
messageId: 'unbraced',
|
|
34
|
+
fix: (fixer) => [fixer.insertTextBefore(first, '{ '), fixer.insertTextAfter(last, ' }')],
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
}; }
|
|
39
|
+
static build(opts = {}) {
|
|
40
|
+
const { severity = 'error' } = opts;
|
|
41
|
+
return [severity];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.NoUnbracedCaseRule = NoUnbracedCaseRule;
|
|
45
|
+
//# sourceMappingURL=no-unbraced-case.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-unbraced-case.rule.js","sourceRoot":"","sources":["../../../src/linters/house/no-unbraced-case.rule.ts"],"names":[],"mappings":";;;AAEA,qCAAyE;AAEzE;;;;GAIG;AACH,MAAa,kBAAkB;aACb,SAAI,GAAG,GAAG,+BAAsB,mBAAmB,CAAC;aAEpD,SAAI,GAAoB;QACtC,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE,QAAQ,EAAE,iEAAiE,EAAE;SAC1F;QACD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpB,CAAC,qBAAY,CAAC,WAAW,CAAC,EAAE,CAAC,IAAe,EAAE,EAAE;gBAC9C,MAAM,UAAU,GAAY,gBAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;gBAE3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1D,OAAO;gBACT,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;gBAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAE/C,IACE,UAAU,CAAC,MAAM,KAAK,CAAC;oBACvB,gBAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,qBAAY,CAAC,eAAe,EACjE,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,UAAU;oBACrB,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBACzF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,OAAqC,EAAE;QAClD,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QAEpC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;;AAzCH,gDA0CC","sourcesContent":["import type { Linter, Rule } from 'eslint';\nimport type { TRuleSeverity } from '../rules/common';\nimport { AstNode, AstNodeTypes, HOUSE_PLUGIN_NAMESPACE } from './common';\n\n/**\n * `venizia/no-unbraced-case`: the statements of a `case` or `default` sit in one block, `case 'a': { ... }`.\n * It is the ESLint twin of oxlint's `unicorn/switch-case-braces` (`SwitchCaseBracesRule`, mode `always`).\n * Stacked labels with no statements stay as written. The fix wraps the statements in `{ }`.\n */\nexport class NoUnbracedCaseRule {\n static readonly NAME = `${HOUSE_PLUGIN_NAMESPACE}/no-unbraced-case`;\n\n static readonly RULE: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n fixable: 'code',\n schema: [],\n messages: { unbraced: 'Wrap the statements of this case in a block: `case x: { ... }`.' },\n },\n create: (context) => ({\n [AstNodeTypes.SWITCH_CASE]: (node: Rule.Node) => {\n const statements: unknown = AstNode.readField({ node, key: 'consequent' });\n\n if (!Array.isArray(statements) || statements.length === 0) {\n return;\n }\n\n const [first] = statements;\n const last = statements[statements.length - 1];\n\n if (\n statements.length === 1 &&\n AstNode.getType({ node: first }) === AstNodeTypes.BLOCK_STATEMENT\n ) {\n return;\n }\n\n context.report({\n node,\n messageId: 'unbraced',\n fix: (fixer) => [fixer.insertTextBefore(first, '{ '), fixer.insertTextAfter(last, ' }')],\n });\n },\n }),\n };\n\n static build(opts: { severity?: TRuleSeverity } = {}): Linter.RuleEntry {\n const { severity = 'error' } = opts;\n\n return [severity];\n }\n}\n"]}
|
|
@@ -12,6 +12,7 @@ const no_leaked_render_rule_1 = require("./no-leaked-render.rule");
|
|
|
12
12
|
const no_new_error_rule_1 = require("./no-new-error.rule");
|
|
13
13
|
const no_return_await_rule_1 = require("./no-return-await.rule");
|
|
14
14
|
const no_silent_catch_rule_1 = require("./no-silent-catch.rule");
|
|
15
|
+
const no_unbraced_case_rule_1 = require("./no-unbraced-case.rule");
|
|
15
16
|
/** The ESLint plugin that carries the house rules oxlint cannot express, registered as `venizia`. */
|
|
16
17
|
exports.houseEslintPlugin = {
|
|
17
18
|
meta: { name: `eslint-plugin-${common_1.HOUSE_PLUGIN_NAMESPACE}` },
|
|
@@ -26,6 +27,7 @@ exports.houseEslintPlugin = {
|
|
|
26
27
|
'no-new-error': no_new_error_rule_1.NoNewErrorRule.RULE,
|
|
27
28
|
'no-return-await': no_return_await_rule_1.NoReturnAwaitRule.RULE,
|
|
28
29
|
'no-silent-catch': no_silent_catch_rule_1.NoSilentCatchRule.RULE,
|
|
30
|
+
'no-unbraced-case': no_unbraced_case_rule_1.NoUnbracedCaseRule.RULE,
|
|
29
31
|
},
|
|
30
32
|
};
|
|
31
33
|
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/linters/house/plugin.ts"],"names":[],"mappings":";;;AACA,qCAAkD;AAClD,uEAAiE;AACjE,uFAAiF;AACjF,+DAAyD;AACzD,+EAAwE;AACxE,+EAAwE;AACxE,iEAA2D;AAC3D,mEAA6D;AAC7D,2DAAqD;AACrD,iEAA2D;AAC3D,iEAA2D;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/linters/house/plugin.ts"],"names":[],"mappings":";;;AACA,qCAAkD;AAClD,uEAAiE;AACjE,uFAAiF;AACjF,+DAAyD;AACzD,+EAAwE;AACxE,+EAAwE;AACxE,iEAA2D;AAC3D,mEAA6D;AAC7D,2DAAqD;AACrD,iEAA2D;AAC3D,iEAA2D;AAC3D,mEAA6D;AAE7D,qGAAqG;AACxF,QAAA,iBAAiB,GAAkB;IAC9C,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,+BAAsB,EAAE,EAAE;IACzD,KAAK,EAAE;QACL,oBAAoB,EAAE,8CAAoB,CAAC,IAAI;QAC/C,4BAA4B,EAAE,8DAA4B,CAAC,IAAI;QAC/D,gBAAgB,EAAE,sCAAgB,CAAC,IAAI;QACvC,wBAAwB,EAAE,qDAAuB,CAAC,IAAI;QACtD,wBAAwB,EAAE,qDAAuB,CAAC,IAAI;QACtD,iBAAiB,EAAE,wCAAiB,CAAC,IAAI;QACzC,kBAAkB,EAAE,0CAAkB,CAAC,IAAI;QAC3C,cAAc,EAAE,kCAAc,CAAC,IAAI;QACnC,iBAAiB,EAAE,wCAAiB,CAAC,IAAI;QACzC,iBAAiB,EAAE,wCAAiB,CAAC,IAAI;QACzC,kBAAkB,EAAE,0CAAkB,CAAC,IAAI;KAC5C;CACF,CAAC","sourcesContent":["import type { ESLint } from 'eslint';\nimport { HOUSE_PLUGIN_NAMESPACE } from './common';\nimport { ConstClassValuesRule } from './const-class-values.rule';\nimport { EffectCleanupConsistencyRule } from './effect-cleanup-consistency.rule';\nimport { MaxParamsOwnRule } from './max-params-own.rule';\nimport { NoAsyncHookCallbackRule } from './no-async-hook-callback.rule';\nimport { NoAwaitPromiseChainRule } from './no-await-promise-chain.rule';\nimport { NoInlineAwaitRule } from './no-inline-await.rule';\nimport { NoLeakedRenderRule } from './no-leaked-render.rule';\nimport { NoNewErrorRule } from './no-new-error.rule';\nimport { NoReturnAwaitRule } from './no-return-await.rule';\nimport { NoSilentCatchRule } from './no-silent-catch.rule';\nimport { NoUnbracedCaseRule } from './no-unbraced-case.rule';\n\n/** The ESLint plugin that carries the house rules oxlint cannot express, registered as `venizia`. */\nexport const houseEslintPlugin: ESLint.Plugin = {\n meta: { name: `eslint-plugin-${HOUSE_PLUGIN_NAMESPACE}` },\n rules: {\n 'const-class-values': ConstClassValuesRule.RULE,\n 'effect-cleanup-consistency': EffectCleanupConsistencyRule.RULE,\n 'max-params-own': MaxParamsOwnRule.RULE,\n 'no-async-hook-callback': NoAsyncHookCallbackRule.RULE,\n 'no-await-promise-chain': NoAwaitPromiseChainRule.RULE,\n 'no-inline-await': NoInlineAwaitRule.RULE,\n 'no-leaked-render': NoLeakedRenderRule.RULE,\n 'no-new-error': NoNewErrorRule.RULE,\n 'no-return-await': NoReturnAwaitRule.RULE,\n 'no-silent-catch': NoSilentCatchRule.RULE,\n 'no-unbraced-case': NoUnbracedCaseRule.RULE,\n },\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise-chain-support.js","sourceRoot":"","sources":["../../../src/linters/house/promise-chain-support.ts"],"names":[],"mappings":"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","sourcesContent":["import { AstNode } from './common';\n\nconst CHAIN_METHODS = new Set(['then', 'catch', 'finally']);\n/** Wrappers that leave the value of the expression they hold unchanged: `x!`, `x as T`, `x satisfies T`, `<T>x`, `a?.b`. */\nconst VALUE_WRAPPERS = new Set([\n 'TSAsExpression',\n 'TSSatisfiesExpression',\n 'TSNonNullExpression',\n 'TSTypeAssertion',\n 'ChainExpression',\n]);\nconst CONSTANT_UNARY_OPERATORS = new Set(['-', '+', '!', 'void']);\n\n/** The shared parts of the promise chain rules: what a chain call is, what a constant is, what a silent handler body is. */\nexport class PromiseChainSupport {\n /** `node` without the wrappers that do not change its value (`!`, `as`, `satisfies`, `<T>`, an optional chain). */\n static unwrap(opts: { node: unknown }): unknown {\n let current = opts.node;\n\n while (VALUE_WRAPPERS.has(AstNode.getType({ node: current }) ?? '')) {\n current = AstNode.readField({ node: current, key: 'expression' });\n }\n\n return current;\n }\n\n /** The name a member access reads: `a.name`, `a['name']`, ``a[`name`]``; `undefined` for a computed key. */\n static memberName(opts: { member: unknown }): string | undefined {\n const { member } = opts;\n const property = AstNode.readField({ node: member, key: 'property' });\n\n if (AstNode.readField({ node: member, key: 'computed' }) !== true) {\n const name = AstNode.readField({ node: property, key: 'name' });\n return typeof name === 'string' ? name : undefined;\n }\n\n if (AstNode.getType({ node: property }) === 'Literal') {\n const value = AstNode.readField({ node: property, key: 'value' });\n return typeof value === 'string' ? value : undefined;\n }\n\n const expressions = AstNode.readField({ node: property, key: 'expressions' });\n const quasis = AstNode.readField({ node: property, key: 'quasis' });\n if (\n AstNode.getType({ node: property }) === 'TemplateLiteral' &&\n Array.isArray(expressions) &&\n expressions.length === 0 &&\n Array.isArray(quasis)\n ) {\n const cooked = AstNode.readField({\n node: AstNode.readField({ node: quasis[0], key: 'value' }),\n key: 'cooked',\n });\n return typeof cooked === 'string' ? cooked : undefined;\n }\n\n return undefined;\n }\n\n /**\n * `then`, `catch` or `finally` when `node` (after `unwrap`) is a call of that method - `p.then(f)`, `p?.catch(f)`,\n * `p['finally'](f)` - and `undefined` for anything else. It reads the syntax only, so a thenable counts too.\n */\n static chainMethodOf(opts: { node: unknown }): string | undefined {\n const call = PromiseChainSupport.unwrap({ node: opts.node });\n if (AstNode.getType({ node: call }) !== 'CallExpression') {\n return undefined;\n }\n\n const callee = PromiseChainSupport.unwrap({\n node: AstNode.readField({ node: call, key: 'callee' }),\n });\n if (AstNode.getType({ node: callee }) !== 'MemberExpression') {\n return undefined;\n }\n\n const name = PromiseChainSupport.memberName({ member: callee });\n return name !== undefined && CHAIN_METHODS.has(name) ? name : undefined;\n }\n\n /**\n * Whether a chain call (`.then`, `.catch`, `.finally`) sits anywhere on the spine of `node`: the receivers and\n * callees a call chain is built from (`a.then(f).limit(1)` has one, `a.where(x).limit(1)` has none).\n */\n static hasChainOnSpine(opts: { node: unknown }): boolean {\n let current = PromiseChainSupport.unwrap({ node: opts.node });\n\n for (;;) {\n const type = AstNode.getType({ node: current });\n\n if (type === 'CallExpression') {\n if (PromiseChainSupport.chainMethodOf({ node: current }) !== undefined) {\n return true;\n }\n current = PromiseChainSupport.unwrap({\n node: AstNode.readField({ node: current, key: 'callee' }),\n });\n continue;\n }\n\n if (type === 'MemberExpression') {\n current = PromiseChainSupport.unwrap({\n node: AstNode.readField({ node: current, key: 'object' }),\n });\n continue;\n }\n\n return false;\n }\n }\n\n /**\n * A value that is the same every time and reads nothing: a literal, `undefined`, a template with no `${}`, `-1`,\n * `void 0`, and an array or object literal built only from those (`[]`, `{}`, `{ items: [] }`).\n */\n static isConstant(opts: { node: unknown }): boolean {\n const node = PromiseChainSupport.unwrapTypes({ node: opts.node });\n const type = AstNode.getType({ node }) ?? '';\n const constant = (child: unknown) => PromiseChainSupport.isConstant({ node: child });\n\n switch (type) {\n case 'Literal': {\n return true;\n }\n case 'Identifier': {\n return AstNode.readField({ node, key: 'name' }) === 'undefined';\n }\n case 'TemplateLiteral': {\n const expressions = AstNode.readField({ node, key: 'expressions' });\n return Array.isArray(expressions) && expressions.length === 0;\n }\n case 'UnaryExpression': {\n return (\n CONSTANT_UNARY_OPERATORS.has(String(AstNode.readField({ node, key: 'operator' }))) &&\n constant(AstNode.readField({ node, key: 'argument' }))\n );\n }\n case 'ArrayExpression': {\n const elements = AstNode.readField({ node, key: 'elements' });\n return (\n Array.isArray(elements) &&\n elements.every((element) => element === null || constant(element))\n );\n }\n case 'ObjectExpression': {\n const properties = AstNode.readField({ node, key: 'properties' });\n return (\n Array.isArray(properties) &&\n properties.every(\n (property) =>\n AstNode.getType({ node: property }) === 'Property' &&\n AstNode.readField({ node: property, key: 'computed' }) !== true &&\n AstNode.readField({ node: property, key: 'method' }) !== true &&\n AstNode.readField({ node: property, key: 'kind' }) === 'init' &&\n constant(AstNode.readField({ node: property, key: 'value' })),\n )\n );\n }\n default: {\n return false;\n }\n }\n }\n\n /**\n * Whether the statements of a handler or a `catch` block leave no trace of the error: none at all (a comment does\n * not count), or only `return;`, `return <constant>;` and `<name or member> = <constant>;`. Anything else - a\n * call, a `throw`, a read of a variable - is a decision someone made, and counts as handled.\n */\n static isSilentBlock(opts: { statements: unknown }): boolean {\n const { statements } = opts;\n\n return (\n Array.isArray(statements) &&\n statements.every((statement) => {\n const type = AstNode.getType({ node: statement });\n\n if (type === 'EmptyStatement') {\n return true;\n }\n\n if (type === 'ReturnStatement') {\n const argument = AstNode.readField({ node: statement, key: 'argument' });\n return argument === null || PromiseChainSupport.isConstant({ node: argument });\n }\n\n const expression = AstNode.readField({ node: statement, key: 'expression' });\n return (\n type === 'ExpressionStatement' &&\n AstNode.getType({ node: expression }) === 'AssignmentExpression' &&\n AstNode.readField({ node: expression, key: 'operator' }) === '=' &&\n PromiseChainSupport.isPlainTarget({\n node: AstNode.readField({ node: expression, key: 'left' }),\n }) &&\n PromiseChainSupport.isConstant({\n node: AstNode.readField({ node: expression, key: 'right' }),\n })\n );\n })\n );\n }\n\n /** `name`, `this.name`, `a.b.c`: an assignment target that reads no computed key and calls nothing. */\n static isPlainTarget(opts: { node: unknown }): boolean {\n const { node } = opts;\n const type = AstNode.getType({ node });\n\n if (type === 'Identifier' || type === 'ThisExpression') {\n return true;\n }\n\n return (\n type === 'MemberExpression' &&\n AstNode.readField({ node, key: 'computed' }) !== true &&\n PromiseChainSupport.isPlainTarget({ node: AstNode.readField({ node, key: 'object' }) })\n );\n }\n\n /** `node` without the type-only wrappers (`as`, `satisfies`, `!`, `<T>`), keeping an optional chain. */\n static unwrapTypes(opts: { node: unknown }): unknown {\n let current = opts.node;\n\n while (\n VALUE_WRAPPERS.has(AstNode.getType({ node: current }) ?? '') &&\n AstNode.getType({ node: current }) !== 'ChainExpression'\n ) {\n current = AstNode.readField({ node: current, key: 'expression' });\n }\n\n return current;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"promise-chain-support.js","sourceRoot":"","sources":["../../../src/linters/house/promise-chain-support.ts"],"names":[],"mappings":"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","sourcesContent":["import { AstNode } from './common';\n\nconst CHAIN_METHODS = new Set(['then', 'catch', 'finally']);\n/** Wrappers that leave the value of the expression they hold unchanged: `x!`, `x as T`, `x satisfies T`, `<T>x`, `a?.b`. */\nconst VALUE_WRAPPERS = new Set([\n 'TSAsExpression',\n 'TSSatisfiesExpression',\n 'TSNonNullExpression',\n 'TSTypeAssertion',\n 'ChainExpression',\n]);\nconst CONSTANT_UNARY_OPERATORS = new Set(['-', '+', '!', 'void']);\n\n/** The shared parts of the promise chain rules: what a chain call is, what a constant is, what a silent handler body is. */\nexport class PromiseChainSupport {\n /** `node` without the wrappers that do not change its value (`!`, `as`, `satisfies`, `<T>`, an optional chain). */\n static unwrap(opts: { node: unknown }): unknown {\n let current = opts.node;\n\n while (VALUE_WRAPPERS.has(AstNode.getType({ node: current }) ?? '')) {\n current = AstNode.readField({ node: current, key: 'expression' });\n }\n\n return current;\n }\n\n /** The name a member access reads: `a.name`, `a['name']`, ``a[`name`]``; `undefined` for a computed key. */\n static memberName(opts: { member: unknown }): string | undefined {\n const { member } = opts;\n const property = AstNode.readField({ node: member, key: 'property' });\n\n if (AstNode.readField({ node: member, key: 'computed' }) !== true) {\n const name = AstNode.readField({ node: property, key: 'name' });\n\n return typeof name === 'string' ? name : undefined;\n }\n\n if (AstNode.getType({ node: property }) === 'Literal') {\n const value = AstNode.readField({ node: property, key: 'value' });\n\n return typeof value === 'string' ? value : undefined;\n }\n\n const expressions = AstNode.readField({ node: property, key: 'expressions' });\n const quasis = AstNode.readField({ node: property, key: 'quasis' });\n\n if (\n AstNode.getType({ node: property }) === 'TemplateLiteral' &&\n Array.isArray(expressions) &&\n expressions.length === 0 &&\n Array.isArray(quasis)\n ) {\n const cooked = AstNode.readField({\n node: AstNode.readField({ node: quasis[0], key: 'value' }),\n key: 'cooked',\n });\n\n return typeof cooked === 'string' ? cooked : undefined;\n }\n\n return undefined;\n }\n\n /**\n * `then`, `catch` or `finally` when `node` (after `unwrap`) is a call of that method - `p.then(f)`, `p?.catch(f)`,\n * `p['finally'](f)` - and `undefined` for anything else. It reads the syntax only, so a thenable counts too.\n */\n static chainMethodOf(opts: { node: unknown }): string | undefined {\n const call = PromiseChainSupport.unwrap({ node: opts.node });\n\n if (AstNode.getType({ node: call }) !== 'CallExpression') {\n return undefined;\n }\n\n const callee = PromiseChainSupport.unwrap({\n node: AstNode.readField({ node: call, key: 'callee' }),\n });\n\n if (AstNode.getType({ node: callee }) !== 'MemberExpression') {\n return undefined;\n }\n\n const name = PromiseChainSupport.memberName({ member: callee });\n\n return name !== undefined && CHAIN_METHODS.has(name) ? name : undefined;\n }\n\n /**\n * Whether a chain call (`.then`, `.catch`, `.finally`) sits anywhere on the spine of `node`: the receivers and\n * callees a call chain is built from (`a.then(f).limit(1)` has one, `a.where(x).limit(1)` has none).\n */\n static hasChainOnSpine(opts: { node: unknown }): boolean {\n let current = PromiseChainSupport.unwrap({ node: opts.node });\n\n for (;;) {\n const type = AstNode.getType({ node: current });\n\n if (type === 'CallExpression') {\n if (PromiseChainSupport.chainMethodOf({ node: current }) !== undefined) {\n return true;\n }\n\n current = PromiseChainSupport.unwrap({\n node: AstNode.readField({ node: current, key: 'callee' }),\n });\n continue;\n }\n\n if (type === 'MemberExpression') {\n current = PromiseChainSupport.unwrap({\n node: AstNode.readField({ node: current, key: 'object' }),\n });\n continue;\n }\n\n return false;\n }\n }\n\n /**\n * A value that is the same every time and reads nothing: a literal, `undefined`, a template with no `${}`, `-1`,\n * `void 0`, and an array or object literal built only from those (`[]`, `{}`, `{ items: [] }`).\n */\n static isConstant(opts: { node: unknown }): boolean {\n const node = PromiseChainSupport.unwrapTypes({ node: opts.node });\n const type = AstNode.getType({ node }) ?? '';\n const constant = (child: unknown) => PromiseChainSupport.isConstant({ node: child });\n\n switch (type) {\n case 'Literal': {\n return true;\n }\n case 'Identifier': {\n return AstNode.readField({ node, key: 'name' }) === 'undefined';\n }\n case 'TemplateLiteral': {\n const expressions = AstNode.readField({ node, key: 'expressions' });\n\n return Array.isArray(expressions) && expressions.length === 0;\n }\n case 'UnaryExpression': {\n return (\n CONSTANT_UNARY_OPERATORS.has(String(AstNode.readField({ node, key: 'operator' }))) &&\n constant(AstNode.readField({ node, key: 'argument' }))\n );\n }\n case 'ArrayExpression': {\n const elements = AstNode.readField({ node, key: 'elements' });\n\n return (\n Array.isArray(elements) &&\n elements.every((element) => element === null || constant(element))\n );\n }\n case 'ObjectExpression': {\n const properties = AstNode.readField({ node, key: 'properties' });\n\n return (\n Array.isArray(properties) &&\n properties.every(\n (property) =>\n AstNode.getType({ node: property }) === 'Property' &&\n AstNode.readField({ node: property, key: 'computed' }) !== true &&\n AstNode.readField({ node: property, key: 'method' }) !== true &&\n AstNode.readField({ node: property, key: 'kind' }) === 'init' &&\n constant(AstNode.readField({ node: property, key: 'value' })),\n )\n );\n }\n default: {\n return false;\n }\n }\n }\n\n /**\n * Whether the statements of a handler or a `catch` block leave no trace of the error: none at all (a comment does\n * not count), or only `return;`, `return <constant>;` and `<name or member> = <constant>;`. Anything else - a\n * call, a `throw`, a read of a variable - is a decision someone made, and counts as handled.\n */\n static isSilentBlock(opts: { statements: unknown }): boolean {\n const { statements } = opts;\n\n return (\n Array.isArray(statements) &&\n statements.every((statement) => {\n const type = AstNode.getType({ node: statement });\n\n if (type === 'EmptyStatement') {\n return true;\n }\n\n if (type === 'ReturnStatement') {\n const argument = AstNode.readField({ node: statement, key: 'argument' });\n\n return argument === null || PromiseChainSupport.isConstant({ node: argument });\n }\n\n const expression = AstNode.readField({ node: statement, key: 'expression' });\n\n return (\n type === 'ExpressionStatement' &&\n AstNode.getType({ node: expression }) === 'AssignmentExpression' &&\n AstNode.readField({ node: expression, key: 'operator' }) === '=' &&\n PromiseChainSupport.isPlainTarget({\n node: AstNode.readField({ node: expression, key: 'left' }),\n }) &&\n PromiseChainSupport.isConstant({\n node: AstNode.readField({ node: expression, key: 'right' }),\n })\n );\n })\n );\n }\n\n /** `name`, `this.name`, `a.b.c`: an assignment target that reads no computed key and calls nothing. */\n static isPlainTarget(opts: { node: unknown }): boolean {\n const { node } = opts;\n const type = AstNode.getType({ node });\n\n if (type === 'Identifier' || type === 'ThisExpression') {\n return true;\n }\n\n return (\n type === 'MemberExpression' &&\n AstNode.readField({ node, key: 'computed' }) !== true &&\n PromiseChainSupport.isPlainTarget({ node: AstNode.readField({ node, key: 'object' }) })\n );\n }\n\n /** `node` without the type-only wrappers (`as`, `satisfies`, `!`, `<T>`), keeping an optional chain. */\n static unwrapTypes(opts: { node: unknown }): unknown {\n let current = opts.node;\n\n while (\n VALUE_WRAPPERS.has(AstNode.getType({ node: current }) ?? '') &&\n AstNode.getType({ node: current }) !== 'ChainExpression'\n ) {\n current = AstNode.readField({ node: current, key: 'expression' });\n }\n\n return current;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/linters/ignore.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;GAaG;AACH,MAAa,UAAU;IACrB,+GAA+G;IAC/G,MAAM,CAAC,MAAM,CAAC,IAAyB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/linters/ignore.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;GAaG;AACH,MAAa,UAAU;IACrB,+GAA+G;IAC/G,MAAM,CAAC,MAAM,CAAC,IAAyB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEnD,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAA4B;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAAkD;QAC9D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAElC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;YACpB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;SACrF,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,MAAM;YACT,SAAS,EAAE;gBACT,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC3B;oBACE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;oBAChE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;iBACnE;aACF;SACF,CAAC;IACJ,CAAC;CACF;AAnCD,gCAmCC","sourcesContent":["import type { Linter } from 'eslint';\nimport type { OxlintConfig } from 'oxlint';\n\n/**\n * Project paths a lint run skips: generated files, vendored code, bundles. The same list feeds both\n * tools, because each reads it differently.\n *\n * - oxlint: `ignorePatterns` resolve against the folder of the config file, so one in `.configs/` can\n * never name a project path. `LintIgnore.oxlint` turns every rule off for the paths instead.\n * - ESLint: `LintIgnore.eslint` is a flat-config `ignores` entry, relative to where eslint runs.\n *\n * ```ts\n * const LINT_IGNORE = ['src/components/shadcn/**', 'dev-dist/**'];\n * defineConfig(ReactOxlintConfigs.create({ ignore: LINT_IGNORE })); // oxlint.config.mts\n * export default [LintIgnore.eslint({ patterns: LINT_IGNORE }), ...reactHouseConfigs]; // eslint.config.mjs\n * ```\n */\nexport class LintIgnore {\n /** A project path such as `src/gen/**`, as an override glob: it is matched from anywhere under the project. */\n static toGlob(opts: { pattern: string }): string {\n const pattern = opts.pattern.replace(/^\\.?\\//, '');\n\n return pattern.startsWith('**/') ? pattern : `**/${pattern}`;\n }\n\n static eslint(opts: { patterns: string[] }): Linter.Config {\n return { ignores: opts.patterns };\n }\n\n static oxlint(opts: { config: OxlintConfig; patterns: string[] }): OxlintConfig {\n const { config, patterns } = opts;\n\n if (patterns.length === 0) {\n return config;\n }\n\n const rules = new Set([\n ...Object.keys(config.rules ?? {}),\n ...(config.overrides ?? []).flatMap((override) => Object.keys(override.rules ?? {})),\n ]);\n\n return {\n ...config,\n overrides: [\n ...(config.overrides ?? []),\n {\n files: patterns.map((pattern) => LintIgnore.toGlob({ pattern })),\n rules: Object.fromEntries([...rules].map((name) => [name, 'off'])),\n },\n ],\n };\n }\n}\n"]}
|
package/dist/linters/index.d.ts
CHANGED
package/dist/linters/index.js
CHANGED
|
@@ -17,5 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./eslint"), exports);
|
|
18
18
|
__exportStar(require("./house"), exports);
|
|
19
19
|
__exportStar(require("./oxlint-presets"), exports);
|
|
20
|
+
__exportStar(require("./padding"), exports);
|
|
20
21
|
__exportStar(require("./react-eslint"), exports);
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/linters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,mDAAiC;AACjC,iDAA+B","sourcesContent":["export * from './eslint';\nexport * from './house';\nexport * from './oxlint-presets';\nexport * from './react-eslint';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/linters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,mDAAiC;AACjC,4CAA0B;AAC1B,iDAA+B","sourcesContent":["export * from './eslint';\nexport * from './house';\nexport * from './oxlint-presets';\nexport * from './padding';\nexport * from './react-eslint';\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Linter } from 'eslint';
|
|
2
|
+
/**
|
|
3
|
+
* The blank-line padding rules: after imports, before a `return`, between class members, around block-like statements.
|
|
4
|
+
* ESLint-only: oxlint has none of the four rules.
|
|
5
|
+
* They need the TypeScript parser of `namingConventionConfigs` or `eslintConfigs`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const paddingConfigs: Linter.Config[];
|
|
8
|
+
//# sourceMappingURL=padding.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.paddingConfigs = void 0;
|
|
7
|
+
const eslint_plugin_1 = __importDefault(require("@stylistic/eslint-plugin"));
|
|
8
|
+
const rules_1 = require("./rules");
|
|
9
|
+
const SOURCE_FILES = ['**/*.{ts,tsx,mts,cts}'];
|
|
10
|
+
/**
|
|
11
|
+
* The blank-line padding rules: after imports, before a `return`, between class members, around block-like statements.
|
|
12
|
+
* ESLint-only: oxlint has none of the four rules.
|
|
13
|
+
* They need the TypeScript parser of `namingConventionConfigs` or `eslintConfigs`.
|
|
14
|
+
*/
|
|
15
|
+
exports.paddingConfigs = [
|
|
16
|
+
{
|
|
17
|
+
files: SOURCE_FILES,
|
|
18
|
+
plugins: { '@stylistic': eslint_plugin_1.default },
|
|
19
|
+
rules: {
|
|
20
|
+
[rules_1.PaddingLineBetweenStatementsRule.NAME]: rules_1.PaddingLineBetweenStatementsRule.build(),
|
|
21
|
+
[rules_1.LinesBetweenClassMembersRule.NAME]: rules_1.LinesBetweenClassMembersRule.build(),
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
//# sourceMappingURL=padding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"padding.js","sourceRoot":"","sources":["../../src/linters/padding.ts"],"names":[],"mappings":";;;;;;AAAA,6EAAiD;AAEjD,mCAAyF;AAEzF,MAAM,YAAY,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAE/C;;;;GAIG;AACU,QAAA,cAAc,GAAoB;IAC7C;QACE,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,EAAE,YAAY,EAAE,uBAAS,EAAE;QACpC,KAAK,EAAE;YACL,CAAC,wCAAgC,CAAC,IAAI,CAAC,EAAE,wCAAgC,CAAC,KAAK,EAAE;YACjF,CAAC,oCAA4B,CAAC,IAAI,CAAC,EAAE,oCAA4B,CAAC,KAAK,EAAE;SAC1E;KACF;CACF,CAAC","sourcesContent":["import stylistic from '@stylistic/eslint-plugin';\nimport type { Linter } from 'eslint';\nimport { LinesBetweenClassMembersRule, PaddingLineBetweenStatementsRule } from './rules';\n\nconst SOURCE_FILES = ['**/*.{ts,tsx,mts,cts}'];\n\n/**\n * The blank-line padding rules: after imports, before a `return`, between class members, around block-like statements.\n * ESLint-only: oxlint has none of the four rules.\n * They need the TypeScript parser of `namingConventionConfigs` or `eslintConfigs`.\n */\nexport const paddingConfigs: Linter.Config[] = [\n {\n files: SOURCE_FILES,\n plugins: { '@stylistic': stylistic },\n rules: {\n [PaddingLineBetweenStatementsRule.NAME]: PaddingLineBetweenStatementsRule.build(),\n [LinesBetweenClassMembersRule.NAME]: LinesBetweenClassMembersRule.build(),\n },\n },\n];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eqeqeq.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/eqeqeq.rule.ts"],"names":[],"mappings":";;;AAAA,qCAAoG;AAEpG,2EAA2E;AAC3E,MAAa,UAAU;aACL,SAAI,GAAG,QAAQ,CAAC;IAEhC,MAAM,CAAC,KAAK,CACV,OAAyD,EAAE;QAE3D,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,oBAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"eqeqeq.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/eqeqeq.rule.ts"],"names":[],"mappings":";;;AAAA,qCAAoG;AAEpG,2EAA2E;AAC3E,MAAa,UAAU;aACL,SAAI,GAAG,QAAQ,CAAC;IAEhC,MAAM,CAAC,KAAK,CACV,OAAyD,EAAE;QAE3D,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,oBAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;QAE9D,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;;AATH,gCAUC","sourcesContent":["import { EqeqeqModes, type TEqeqeqMode, type TOxlintRuleEntry, type TRuleSeverity } from './common';\n\n/** `eqeqeq`. `smart` still allows `== null` and comparing two literals. */\nexport class EqeqeqRule {\n static readonly NAME = 'eqeqeq';\n\n static build(\n opts: { severity?: TRuleSeverity; mode?: TEqeqeqMode } = {},\n ): TOxlintRuleEntry<'eqeqeq'> {\n const { severity = 'error', mode = EqeqeqModes.SMART } = opts;\n\n return [severity, mode];\n }\n}\n"]}
|
|
@@ -6,4 +6,6 @@ export * from './no-restricted-properties.rule';
|
|
|
6
6
|
export * from './no-unused-vars.rule';
|
|
7
7
|
export * from './prefer-nullish-coalescing.rule';
|
|
8
8
|
export * from './switch-case-braces.rule';
|
|
9
|
+
export * from './lines-between-class-members.rule';
|
|
10
|
+
export * from './padding-line-between-statements.rule';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -22,4 +22,6 @@ __exportStar(require("./no-restricted-properties.rule"), exports);
|
|
|
22
22
|
__exportStar(require("./no-unused-vars.rule"), exports);
|
|
23
23
|
__exportStar(require("./prefer-nullish-coalescing.rule"), exports);
|
|
24
24
|
__exportStar(require("./switch-case-braces.rule"), exports);
|
|
25
|
+
__exportStar(require("./lines-between-class-members.rule"), exports);
|
|
26
|
+
__exportStar(require("./padding-line-between-statements.rule"), exports);
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/linters/rules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,gDAA8B;AAC9B,2DAAyC;AACzC,+DAA6C;AAC7C,kEAAgD;AAChD,wDAAsC;AACtC,mEAAiD;AACjD,4DAA0C","sourcesContent":["export * from './common';\nexport * from './eqeqeq.rule';\nexport * from './naming-convention.rule';\nexport * from './no-restricted-imports.rule';\nexport * from './no-restricted-properties.rule';\nexport * from './no-unused-vars.rule';\nexport * from './prefer-nullish-coalescing.rule';\nexport * from './switch-case-braces.rule';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/linters/rules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,gDAA8B;AAC9B,2DAAyC;AACzC,+DAA6C;AAC7C,kEAAgD;AAChD,wDAAsC;AACtC,mEAAiD;AACjD,4DAA0C;AAC1C,qEAAmD;AACnD,yEAAuD","sourcesContent":["export * from './common';\nexport * from './eqeqeq.rule';\nexport * from './naming-convention.rule';\nexport * from './no-restricted-imports.rule';\nexport * from './no-restricted-properties.rule';\nexport * from './no-unused-vars.rule';\nexport * from './prefer-nullish-coalescing.rule';\nexport * from './switch-case-braces.rule';\nexport * from './lines-between-class-members.rule';\nexport * from './padding-line-between-statements.rule';\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Linter } from 'eslint';
|
|
2
|
+
import type { TRuleSeverity } from './common';
|
|
3
|
+
/**
|
|
4
|
+
* `@stylistic/lines-between-class-members`. A blank line between class members, except after a one-line member, so
|
|
5
|
+
* a run of one-line properties stays together. Overload signatures stay together too (the rule's default). oxlint
|
|
6
|
+
* has no port of it, so it runs in ESLint.
|
|
7
|
+
*/
|
|
8
|
+
export declare class LinesBetweenClassMembersRule {
|
|
9
|
+
static readonly NAME = "@stylistic/lines-between-class-members";
|
|
10
|
+
static build(opts?: {
|
|
11
|
+
severity?: TRuleSeverity;
|
|
12
|
+
}): Linter.RuleEntry;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=lines-between-class-members.rule.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LinesBetweenClassMembersRule = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `@stylistic/lines-between-class-members`. A blank line between class members, except after a one-line member, so
|
|
6
|
+
* a run of one-line properties stays together. Overload signatures stay together too (the rule's default). oxlint
|
|
7
|
+
* has no port of it, so it runs in ESLint.
|
|
8
|
+
*/
|
|
9
|
+
class LinesBetweenClassMembersRule {
|
|
10
|
+
static { this.NAME = '@stylistic/lines-between-class-members'; }
|
|
11
|
+
static build(opts = {}) {
|
|
12
|
+
const { severity = 'error' } = opts;
|
|
13
|
+
return [severity, 'always', { exceptAfterSingleLine: true }];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.LinesBetweenClassMembersRule = LinesBetweenClassMembersRule;
|
|
17
|
+
//# sourceMappingURL=lines-between-class-members.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines-between-class-members.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/lines-between-class-members.rule.ts"],"names":[],"mappings":";;;AAGA;;;;GAIG;AACH,MAAa,4BAA4B;aACvB,SAAI,GAAG,wCAAwC,CAAC;IAEhE,MAAM,CAAC,KAAK,CAAC,OAAqC,EAAE;QAClD,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QAEpC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;;AAPH,oEAQC","sourcesContent":["import type { Linter } from 'eslint';\nimport type { TRuleSeverity } from './common';\n\n/**\n * `@stylistic/lines-between-class-members`. A blank line between class members, except after a one-line member, so\n * a run of one-line properties stays together. Overload signatures stay together too (the rule's default). oxlint\n * has no port of it, so it runs in ESLint.\n */\nexport class LinesBetweenClassMembersRule {\n static readonly NAME = '@stylistic/lines-between-class-members';\n\n static build(opts: { severity?: TRuleSeverity } = {}): Linter.RuleEntry {\n const { severity = 'error' } = opts;\n\n return [severity, 'always', { exceptAfterSingleLine: true }];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming-convention.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/naming-convention.rule.ts"],"names":[],"mappings":";;;AAMA;;;GAGG;AACH,MAAa,oBAAoB;aACf,SAAI,GAAG,sCAAsC,CAAC;aAE9C,cAAS,GAA+B;QACtD,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;QAC9C,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE;QAC3E,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;QACrD,qGAAqG;QACrG;YACE,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YACrC,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACjD,iBAAiB,EAAE,OAAO;SAC3B;QACD,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;QAClE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE;QAC5E;YACE,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACjD,iBAAiB,EAAE,OAAO;SAC3B;QACD;YACE,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACjD,iBAAiB,EAAE,OAAO;SAC3B;QACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE;QACzE,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE;QACtF;YACE,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,CAAC,SAAS,CAAC;YACtB,MAAM,EAAE,CAAC,WAAW,CAAC;YACrB,iBAAiB,EAAE,OAAO;SAC3B;QACD;YACE,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,CAAC,WAAW,CAAC;YACxB,MAAM,EAAE,CAAC,WAAW,CAAC;YACrB,iBAAiB,EAAE,OAAO;SAC3B;QACD,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE;QAChD;YACE,QAAQ,EAAE;gBACR,uBAAuB;gBACvB,qBAAqB;gBACrB,cAAc;gBACd,YAAY;gBACZ,eAAe;gBACf,aAAa;gBACb,YAAY;aACb;YACD,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,gBAAgB,CAAC;SAC9B;QACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE;QAC3D,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;KACpD,CAAC;IAEF,+EAA+E;IAC/E,MAAM,CAAC,KAAK,CACV,OAAyE,EAAE;QAE3E,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,cAAc,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"naming-convention.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/naming-convention.rule.ts"],"names":[],"mappings":";;;AAMA;;;GAGG;AACH,MAAa,oBAAoB;aACf,SAAI,GAAG,sCAAsC,CAAC;aAE9C,cAAS,GAA+B;QACtD,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;QAC9C,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE;QAC3E,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;QACrD,qGAAqG;QACrG;YACE,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YACrC,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACjD,iBAAiB,EAAE,OAAO;SAC3B;QACD,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;QAClE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE;QAC5E;YACE,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACjD,iBAAiB,EAAE,OAAO;SAC3B;QACD;YACE,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACjD,iBAAiB,EAAE,OAAO;SAC3B;QACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE;QACzE,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE;QACtF;YACE,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,CAAC,SAAS,CAAC;YACtB,MAAM,EAAE,CAAC,WAAW,CAAC;YACrB,iBAAiB,EAAE,OAAO;SAC3B;QACD;YACE,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,CAAC,WAAW,CAAC;YACxB,MAAM,EAAE,CAAC,WAAW,CAAC;YACrB,iBAAiB,EAAE,OAAO;SAC3B;QACD,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE;QAChD;YACE,QAAQ,EAAE;gBACR,uBAAuB;gBACvB,qBAAqB;gBACrB,cAAc;gBACd,YAAY;gBACZ,eAAe;gBACf,aAAa;gBACb,YAAY;aACb;YACD,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,gBAAgB,CAAC;SAC9B;QACD,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE;QAC3D,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;KACpD,CAAC;IAEF,+EAA+E;IAC/E,MAAM,CAAC,KAAK,CACV,OAAyE,EAAE;QAE3E,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,cAAc,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAEzD,OAAO,CAAC,QAAQ,EAAE,GAAG,oBAAoB,CAAC,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC;IAC1E,CAAC;;AAjEH,oDAkEC","sourcesContent":["import type { Linter } from 'eslint';\nimport type { TRuleSeverity } from './common';\n\n/** One selector of `@typescript-eslint/naming-convention`, as its documentation types it. */\nexport type TNamingSelector = Record<string, unknown> & { selector: string | string[] };\n\n/**\n * `@typescript-eslint/naming-convention`, owned here. oxlint has no port of it, so it runs in ESLint.\n * The selectors are the LoopBack 4 set the base preset carried, kept one for one.\n */\nexport class NamingConventionRule {\n static readonly NAME = '@typescript-eslint/naming-convention';\n\n static readonly SELECTORS: readonly TNamingSelector[] = [\n { selector: 'default', format: ['camelCase'] },\n { selector: 'variable', format: ['camelCase', 'UPPER_CASE', 'PascalCase'] },\n { selector: 'variable', format: null, filter: '^_$' },\n // A `_name` variable names an omitted value (`{ page: _page, ...rest }`); its case is still checked.\n {\n selector: 'variable',\n filter: { regex: '^_.', match: true },\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n leadingUnderscore: 'allow',\n },\n { selector: 'function', format: ['PascalCase'], filter: 'Mixin$' },\n { selector: 'parameter', format: ['camelCase'], leadingUnderscore: 'allow' },\n {\n selector: 'enumMember',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n leadingUnderscore: 'allow',\n },\n {\n selector: 'property',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n leadingUnderscore: 'allow',\n },\n { selector: 'method', format: ['camelCase'], leadingUnderscore: 'allow' },\n { selector: 'memberLike', modifiers: ['static'], format: ['camelCase', 'UPPER_CASE'] },\n {\n selector: 'memberLike',\n modifiers: ['private'],\n format: ['camelCase'],\n leadingUnderscore: 'allow',\n },\n {\n selector: 'memberLike',\n modifiers: ['protected'],\n format: ['camelCase'],\n leadingUnderscore: 'allow',\n },\n { selector: 'typeLike', format: ['PascalCase'] },\n {\n selector: [\n 'objectLiteralProperty',\n 'objectLiteralMethod',\n 'typeProperty',\n 'typeMethod',\n 'classProperty',\n 'classMethod',\n 'enumMember',\n ],\n format: null,\n modifiers: ['requiresQuotes'],\n },\n { selector: 'import', format: ['camelCase', 'PascalCase'] },\n { selector: 'import', format: null, filter: '^_$' },\n ];\n\n /** `extraSelectors` go last, so they win over a base selector they overlap. */\n static build(\n opts: { severity?: TRuleSeverity; extraSelectors?: TNamingSelector[] } = {},\n ): Linter.RuleEntry {\n const { severity = 'error', extraSelectors = [] } = opts;\n\n return [severity, ...NamingConventionRule.SELECTORS, ...extraSelectors];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-restricted-imports.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/no-restricted-imports.rule.ts"],"names":[],"mappings":";;;AASA,iGAAiG;AACjG,MAAa,uBAAuB;aAClB,SAAI,GAAG,uBAAuB,CAAC;aAE/B,UAAK,GAAqC;QACxD;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EACL,iGAAiG;SACpG;KACF,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,OAA2E,EAAE;QAE7E,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"no-restricted-imports.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/no-restricted-imports.rule.ts"],"names":[],"mappings":";;;AASA,iGAAiG;AACjG,MAAa,uBAAuB;aAClB,SAAI,GAAG,uBAAuB,CAAC;aAE/B,UAAK,GAAqC;QACxD;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EACL,iGAAiG;SACpG;KACF,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,OAA2E,EAAE;QAE7E,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAErD,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,uBAAuB,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;;AAjBH,0DAkBC","sourcesContent":["import type { TOxlintRuleEntry, TRuleSeverity } from './common';\n\n/** One forbidden import path, with the message the author sees. */\nexport interface IRestrictedImportPath {\n name: string;\n message: string;\n importNames?: string[];\n}\n\n/** `no-restricted-imports`. The base forbids the whole of lodash, which defeats tree-shaking. */\nexport class NoRestrictedImportsRule {\n static readonly NAME = 'no-restricted-imports';\n\n static readonly PATHS: readonly IRestrictedImportPath[] = [\n {\n name: 'lodash',\n message:\n \"Please import 'fn' from 'lodash/fn' instead of * from lodash | Ex: import get from 'lodash/get'\",\n },\n ];\n\n static build(\n opts: { severity?: TRuleSeverity; extraPaths?: IRestrictedImportPath[] } = {},\n ): TOxlintRuleEntry<'no-restricted-imports'> {\n const { severity = 'error', extraPaths = [] } = opts;\n\n return [severity, { paths: [...NoRestrictedImportsRule.PATHS, ...extraPaths] }];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-restricted-properties.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/no-restricted-properties.rule.ts"],"names":[],"mappings":";;;AASA;;;;;GAKG;AACH,MAAa,0BAA0B;aACrB,SAAI,GAAG,0BAA0B,CAAC;aAElC,mBAAc,GAAmC;QAC/D;YACE,QAAQ,EAAE,YAAY;YACtB,OAAO,EACL,iLAAiL;SACpL;KACF,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,OAA8E,EAAE;QAEhF,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,eAAe,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"no-restricted-properties.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/no-restricted-properties.rule.ts"],"names":[],"mappings":";;;AASA;;;;;GAKG;AACH,MAAa,0BAA0B;aACrB,SAAI,GAAG,0BAA0B,CAAC;aAElC,mBAAc,GAAmC;QAC/D;YACE,QAAQ,EAAE,YAAY;YACtB,OAAO,EACL,iLAAiL;SACpL;KACF,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,OAA8E,EAAE;QAEhF,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,eAAe,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAE1D,OAAO,CAAC,QAAQ,EAAE,GAAG,0BAA0B,CAAC,cAAc,EAAE,GAAG,eAAe,CAAC,CAAC;IACtF,CAAC;;AAjBH,gEAkBC","sourcesContent":["import type { TOxlintRuleEntry, TRuleSeverity } from './common';\n\n/** One forbidden property access, with the message the author sees. */\nexport interface IRestrictedProperty {\n property: string;\n object?: string;\n message: string;\n}\n\n/**\n * `no-restricted-properties`. The default bans what exists only in a secure context (https,\n * localhost): on a plain-http LAN origin or in a WebView, `crypto.randomUUID` is `undefined` and the\n * first call throws. Catches the call, `globalThis.crypto.randomUUID`, the bracket form and\n * destructuring; leaves `getRandomValues` alone.\n */\nexport class NoRestrictedPropertiesRule {\n static readonly NAME = 'no-restricted-properties';\n\n static readonly SECURE_CONTEXT: readonly IRestrictedProperty[] = [\n {\n property: 'randomUUID',\n message:\n 'crypto.randomUUID exists only in a secure context (https, localhost) - on a plain-http origin it is undefined. Use UuidV4Generator.generate() from @venizia/ignis-helpers/uuid.',\n },\n ];\n\n static build(\n opts: { severity?: TRuleSeverity; extraProperties?: IRestrictedProperty[] } = {},\n ): TOxlintRuleEntry<'no-restricted-properties'> {\n const { severity = 'error', extraProperties = [] } = opts;\n\n return [severity, ...NoRestrictedPropertiesRule.SECURE_CONTEXT, ...extraProperties];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unused-vars.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/no-unused-vars.rule.ts"],"names":[],"mappings":";;;AAAA,qCAOkB;AAElB,+KAA+K;AAC/K,MAAa,gBAAgB;aACX,SAAI,GAAG,gBAAgB,CAAC;IAExC,MAAM,CAAC,KAAK,CACV,OAUI,EAAE;QAEN,MAAM,EACJ,QAAQ,GAAG,OAAO,EAClB,IAAI,GAAG,yBAAgB,CAAC,GAAG,EAC3B,IAAI,GAAG,wBAAe,CAAC,IAAI,EAC3B,kBAAkB,GAAG,KAAK,EAC1B,iBAAiB,GAAG,IAAI,EACxB,GAAG,QAAQ,EACZ,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"no-unused-vars.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/no-unused-vars.rule.ts"],"names":[],"mappings":";;;AAAA,qCAOkB;AAElB,+KAA+K;AAC/K,MAAa,gBAAgB;aACX,SAAI,GAAG,gBAAgB,CAAC;IAExC,MAAM,CAAC,KAAK,CACV,OAUI,EAAE;QAEN,MAAM,EACJ,QAAQ,GAAG,OAAO,EAClB,IAAI,GAAG,yBAAgB,CAAC,GAAG,EAC3B,IAAI,GAAG,wBAAe,CAAC,IAAI,EAC3B,kBAAkB,GAAG,KAAK,EAC1B,iBAAiB,GAAG,IAAI,EACxB,GAAG,QAAQ,EACZ,GAAG,IAAI,CAAC;QAET,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IACxF,CAAC;;AA1BH,4CA2BC","sourcesContent":["import {\n UnusedArgsModes,\n UnusedVarsScopes,\n type TOxlintRuleEntry,\n type TRuleSeverity,\n type TUnusedArgsMode,\n type TUnusedVarsScope,\n} from './common';\n\n/** `no-unused-vars`. Unused arguments pass by default: an override keeps its signature. A `_name` variable is an omitted value (`{ page: _page, ...rest }`) and passes too. */\nexport class NoUnusedVarsRule {\n static readonly NAME = 'no-unused-vars';\n\n static build(\n opts: {\n severity?: TRuleSeverity;\n vars?: TUnusedVarsScope;\n args?: TUnusedArgsMode;\n ignoreRestSiblings?: boolean;\n /** Names that may stay unused, e.g. `^_` - a placeholder a signature needs. */\n argsIgnorePattern?: string;\n varsIgnorePattern?: string;\n caughtErrorsIgnorePattern?: string;\n destructuredArrayIgnorePattern?: string;\n } = {},\n ): TOxlintRuleEntry<'no-unused-vars'> {\n const {\n severity = 'error',\n vars = UnusedVarsScopes.ALL,\n args = UnusedArgsModes.NONE,\n ignoreRestSiblings = false,\n varsIgnorePattern = '^_',\n ...patterns\n } = opts;\n\n return [severity, { vars, args, ignoreRestSiblings, varsIgnorePattern, ...patterns }];\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RuleOptions } from '@stylistic/eslint-plugin/rule-options';
|
|
2
|
+
import type { Linter } from 'eslint';
|
|
3
|
+
import type { TRuleSeverity } from './common';
|
|
4
|
+
/**
|
|
5
|
+
* `@stylistic/padding-line-between-statements`: blank lines after imports, before a `return` and around block-likes.
|
|
6
|
+
* oxlint has no port of it, so it runs in ESLint.
|
|
7
|
+
* Stacked `case` labels stay together, or `no-fallthrough` reads the empty one as a fall-through.
|
|
8
|
+
*/
|
|
9
|
+
export declare class PaddingLineBetweenStatementsRule {
|
|
10
|
+
static readonly NAME = "@stylistic/padding-line-between-statements";
|
|
11
|
+
static readonly PADDINGS: RuleOptions[typeof PaddingLineBetweenStatementsRule.NAME];
|
|
12
|
+
static build(opts?: {
|
|
13
|
+
severity?: TRuleSeverity;
|
|
14
|
+
}): Linter.RuleEntry;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=padding-line-between-statements.rule.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaddingLineBetweenStatementsRule = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `@stylistic/padding-line-between-statements`: blank lines after imports, before a `return` and around block-likes.
|
|
6
|
+
* oxlint has no port of it, so it runs in ESLint.
|
|
7
|
+
* Stacked `case` labels stay together, or `no-fallthrough` reads the empty one as a fall-through.
|
|
8
|
+
*/
|
|
9
|
+
class PaddingLineBetweenStatementsRule {
|
|
10
|
+
static { this.NAME = '@stylistic/padding-line-between-statements'; }
|
|
11
|
+
static { this.PADDINGS = [
|
|
12
|
+
{ blankLine: 'always', prev: 'import', next: '*' },
|
|
13
|
+
{ blankLine: 'any', prev: 'import', next: 'import' },
|
|
14
|
+
{ blankLine: 'always', prev: '*', next: 'return' },
|
|
15
|
+
{ blankLine: 'always', prev: 'block-like', next: '*' },
|
|
16
|
+
{ blankLine: 'always', prev: '*', next: 'block-like' },
|
|
17
|
+
{ blankLine: 'any', prev: ['case', 'default'], next: ['case', 'default'] },
|
|
18
|
+
]; }
|
|
19
|
+
static build(opts = {}) {
|
|
20
|
+
const { severity = 'error' } = opts;
|
|
21
|
+
return [severity, ...PaddingLineBetweenStatementsRule.PADDINGS];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.PaddingLineBetweenStatementsRule = PaddingLineBetweenStatementsRule;
|
|
25
|
+
//# sourceMappingURL=padding-line-between-statements.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"padding-line-between-statements.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/padding-line-between-statements.rule.ts"],"names":[],"mappings":";;;AAIA;;;;GAIG;AACH,MAAa,gCAAgC;aAC3B,SAAI,GAAG,4CAA4C,CAAC;aAEpD,aAAQ,GAA8D;QACpF,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;QAClD,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpD,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClD,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE;QACtD,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE;QACtD,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;KAC3E,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,OAAqC,EAAE;QAClD,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QAEpC,OAAO,CAAC,QAAQ,EAAE,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;;AAhBH,4EAiBC","sourcesContent":["import type { RuleOptions } from '@stylistic/eslint-plugin/rule-options';\nimport type { Linter } from 'eslint';\nimport type { TRuleSeverity } from './common';\n\n/**\n * `@stylistic/padding-line-between-statements`: blank lines after imports, before a `return` and around block-likes.\n * oxlint has no port of it, so it runs in ESLint.\n * Stacked `case` labels stay together, or `no-fallthrough` reads the empty one as a fall-through.\n */\nexport class PaddingLineBetweenStatementsRule {\n static readonly NAME = '@stylistic/padding-line-between-statements';\n\n static readonly PADDINGS: RuleOptions[typeof PaddingLineBetweenStatementsRule.NAME] = [\n { blankLine: 'always', prev: 'import', next: '*' },\n { blankLine: 'any', prev: 'import', next: 'import' },\n { blankLine: 'always', prev: '*', next: 'return' },\n { blankLine: 'always', prev: 'block-like', next: '*' },\n { blankLine: 'always', prev: '*', next: 'block-like' },\n { blankLine: 'any', prev: ['case', 'default'], next: ['case', 'default'] },\n ];\n\n static build(opts: { severity?: TRuleSeverity } = {}): Linter.RuleEntry {\n const { severity = 'error' } = opts;\n\n return [severity, ...PaddingLineBetweenStatementsRule.PADDINGS];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-nullish-coalescing.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/prefer-nullish-coalescing.rule.ts"],"names":[],"mappings":";;;AAEA,gGAAgG;AAChG,MAAa,2BAA2B;aACtB,SAAI,GAAG,sCAAsC,CAAC;IAE9D,MAAM,CAAC,KAAK,CACV,OAYI,EAAE;QAEN,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"prefer-nullish-coalescing.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/prefer-nullish-coalescing.rule.ts"],"names":[],"mappings":";;;AAEA,gGAAgG;AAChG,MAAa,2BAA2B;aACtB,SAAI,GAAG,sCAAsC,CAAC;IAE9D,MAAM,CAAC,KAAK,CACV,OAYI,EAAE;QAEN,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QAEhD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;;AArBH,kEAsBC","sourcesContent":["import type { TOxlintRuleEntry, TRuleSeverity } from './common';\n\n/** `typescript/prefer-nullish-coalescing`, type-aware. Options are oxlint's, passed through. */\nexport class PreferNullishCoalescingRule {\n static readonly NAME = 'typescript/prefer-nullish-coalescing';\n\n static build(\n opts: {\n severity?: TRuleSeverity;\n ignoreConditionalTests?: boolean;\n ignoreMixedLogicalExpressions?: boolean;\n ignoreTernaryTests?: boolean;\n /** Allow `||` / `||=` where the left side is this primitive, e.g. `{ string: true, number: true }`. */\n ignorePrimitives?: {\n bigint?: boolean;\n boolean?: boolean;\n number?: boolean;\n string?: boolean;\n };\n } = {},\n ): TOxlintRuleEntry<'typescript/prefer-nullish-coalescing'> {\n const { severity = 'error', ...options } = opts;\n\n return Object.keys(options).length === 0 ? severity : [severity, options];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch-case-braces.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/switch-case-braces.rule.ts"],"names":[],"mappings":";;;AAAA,qCAKkB;AAElB,mFAAmF;AACnF,MAAa,oBAAoB;aACf,SAAI,GAAG,4BAA4B,CAAC;IAEpD,MAAM,CAAC,KAAK,CACV,OAAmE,EAAE;QAErE,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,8BAAqB,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"switch-case-braces.rule.js","sourceRoot":"","sources":["../../../src/linters/rules/switch-case-braces.rule.ts"],"names":[],"mappings":";;;AAAA,qCAKkB;AAElB,mFAAmF;AACnF,MAAa,oBAAoB;aACf,SAAI,GAAG,4BAA4B,CAAC;IAEpD,MAAM,CAAC,KAAK,CACV,OAAmE,EAAE;QAErE,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,GAAG,8BAAqB,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;QAEzE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;;AATH,oDAUC","sourcesContent":["import {\n SwitchCaseBracesModes,\n type TOxlintRuleEntry,\n type TRuleSeverity,\n type TSwitchCaseBracesMode,\n} from './common';\n\n/** `unicorn/switch-case-braces`. `always` gives every case its own block scope. */\nexport class SwitchCaseBracesRule {\n static readonly NAME = 'unicorn/switch-case-braces';\n\n static build(\n opts: { severity?: TRuleSeverity; mode?: TSwitchCaseBracesMode } = {},\n ): TOxlintRuleEntry<'unicorn/switch-case-braces'> {\n const { severity = 'error', mode = SwitchCaseBracesModes.ALWAYS } = opts;\n\n return [severity, mode];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-tmp.js","sourceRoot":"","sources":["../../src/testing/repo-tmp.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACH,qCAAgD;AAChD,yCAAwD;AAExD,iFAAiF;AACpE,QAAA,kBAAkB,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAI3E,MAAa,OAAO;IAClB,+GAA+G;IAC/G,MAAM,CAAC,QAAQ,CAAC,OAA2B,EAAE;QAC3C,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QACvC,IAAI,OAAO,GAAG,IAAA,mBAAO,EAAC,KAAK,CAAC,CAAC;QAE7B,SAAS,CAAC;YACR,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-tmp.js","sourceRoot":"","sources":["../../src/testing/repo-tmp.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACH,qCAAgD;AAChD,yCAAwD;AAExD,iFAAiF;AACpE,QAAA,kBAAkB,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAI3E,MAAa,OAAO;IAClB,+GAA+G;IAC/G,MAAM,CAAC,QAAQ,CAAC,OAA2B,EAAE;QAC3C,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QACvC,IAAI,OAAO,GAAG,IAAA,mBAAO,EAAC,KAAK,CAAC,CAAC;QAE7B,SAAS,CAAC;YACR,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,CAAC;YAEhC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,OAAO,IAAA,mBAAO,EAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YAED,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,cAAc,CAAC,KAAa;QACzC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;YACjB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAEtD,IAAK,OAAyC,EAAE,GAAG,KAAK,SAAS,EAAE,CAAC;gBAClE,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YACxB,CAAC;YAED,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAI,MAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC3D,CAAC,CAAC,KAAK,CAAC,EAAE,GAAI,KAAgB,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,OAA0B,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,0BAAkB,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAEnC,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,eAAG,EAAE,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,eAAG,EAAE,CAAC,EAAE,CAAC;YACxF,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAA,mBAAS,EAAC,IAAA,gBAAI,EAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,OAAO,CAAC;QAC9C,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,cAAc,CAChC,GAAG,CAAC,KAA0B,CACA,CAAC;QACjC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,cAAc,CACpC,GAAG,CAAC,SAA8B,CACA,CAAC;QAErC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAlED,0BAkEC","sourcesContent":["/**\n * Where a test makes its temp folders: `.agents/local/tmp/tests` of the repository, never the system\n * temp. `make test` sets TMPDIR to a folder like it; this does the same for a run without make - a\n * bare `bun test` on one file - and is the one place that knows the path.\n *\n * The empty `.git` marker in it stops git and bun's ignore lookup from reading the enclosing\n * repository, so GIT_CEILING_DIRECTORIES is set to the same folder.\n */\nimport { existsSync, mkdirSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\n\n/** The folder under the repository root that holds a test run's temp folders. */\nexport const REPO_TMP_DIRECTORY = join('.agents', 'local', 'tmp', 'tests');\n\ntype TSpawn = (...args: unknown[]) => unknown;\n\nexport class RepoTmp {\n /** The nearest ancestor of `start` that holds a `.git` (folder or file); `start` itself when there is none. */\n static findRoot(opts: { start?: string } = {}): string {\n const { start = process.cwd() } = opts;\n let current = resolve(start);\n\n for (;;) {\n if (existsSync(join(current, '.git'))) {\n return current;\n }\n\n const parent = dirname(current);\n\n if (parent === current) {\n return resolve(start);\n }\n\n current = parent;\n }\n }\n\n /**\n * `Bun.spawn` and `Bun.spawnSync` hand a child the environment the process started with, not the one\n * it has now, so a TMPDIR set here would never reach it. Wrapped to default to the current one; an\n * `env` a caller passes wins. `spawn(cmd, options)` and `spawn({ cmd, ...options })` are both handled.\n */\n private static withCurrentEnv(spawn: TSpawn): TSpawn {\n return (...args) => {\n const [first, second] = args;\n const options = Array.isArray(first) ? second : first;\n\n if ((options as { env?: unknown } | undefined)?.env !== undefined) {\n return spawn(...args);\n }\n\n return Array.isArray(first)\n ? spawn(first, { ...(second as object), env: process.env })\n : spawn({ ...(first as object), env: process.env });\n };\n }\n\n /**\n * Points TMPDIR at the repository's test folder unless it is already inside it (make's value, or a\n * private folder a caller made there), and returns the folder now in force. Idempotent.\n */\n static apply(opts: { root?: string } = {}): string {\n const root = opts.root ?? RepoTmp.findRoot();\n const testTmp = join(root, REPO_TMP_DIRECTORY);\n const current = process.env.TMPDIR;\n\n if (current !== undefined && `${resolve(current)}${sep}`.startsWith(`${testTmp}${sep}`)) {\n return current;\n }\n\n mkdirSync(join(testTmp, '.git'), { recursive: true });\n process.env.TMPDIR = testTmp;\n process.env.GIT_CEILING_DIRECTORIES = testTmp;\n Bun.spawn = RepoTmp.withCurrentEnv(\n Bun.spawn as unknown as TSpawn,\n ) as unknown as typeof Bun.spawn;\n Bun.spawnSync = RepoTmp.withCurrentEnv(\n Bun.spawnSync as unknown as TSpawn,\n ) as unknown as typeof Bun.spawnSync;\n\n return testTmp;\n }\n}\n"]}
|