Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion packages/dtslint/dt.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"extends": "./dtslint.json",
"rules": {
"no-declare-current-package": true,
"no-self-import": true,
"no-outside-dependencies": true,

Expand Down
42 changes: 42 additions & 0 deletions packages/dtslint/src/rules/no-declare-current-package.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { getCommonDirectoryName, createRule } from "../util";
import { ESLintUtils, AST_NODE_TYPES } from "@typescript-eslint/utils";
const rule = createRule({
name: "no-declare-current-package",
defaultOptions: [],
meta: {
type: "problem",
docs: {
description: "Don't use an ambient module declaration of the current package; use a normal module.",
recommended: "error",
},
messages: {
noDeclareCurrentPackage: `Instead of declaring a module with \`declare module "{{ text }}"\`, ` +
`write its contents in directly in {{ preferred }}.`,
},
schema: [],
},
create(context) {
if (!context.getFilename().endsWith(".d.ts")) {
return {}
}
const parserServices = ESLintUtils.getParserServices(context);
const packageName = getCommonDirectoryName(parserServices.program.getRootFileNames());
return {
// eslint-disable-next-line @typescript-eslint/naming-convention
TSModuleDeclaration(node) {
if (node.id.type === AST_NODE_TYPES.Literal
&& (node.id.value === packageName || node.id.value.startsWith(packageName + "/"))) {
const text = node.id.value;
const preferred = text === packageName ? '"index.d.ts"' : `"${text}.d.ts" or "${text}/index.d.ts`;
context.report({
messageId: "noDeclareCurrentPackage",
data: { text, preferred },
node,
});
}
},
};
},
});

export = rule;
43 changes: 0 additions & 43 deletions packages/dtslint/src/rules/noDeclareCurrentPackageRule.ts

This file was deleted.

59 changes: 59 additions & 0 deletions packages/dtslint/test/no-declare-current-package.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { ESLintUtils } from "@typescript-eslint/utils";

import * as noDeclareCurrentPackage from "../src/rules/no-declare-current-package";

const ruleTester = new ESLintUtils.RuleTester({
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: 2018,
tsconfigRootDir: __dirname,
project: "./tsconfig.no-declare-current-package.json",
}
});

ruleTester.run("no-declare-current-package", noDeclareCurrentPackage, {
invalid: [
{
filename: "index.d.ts",
code: `module "test" { }`,
errors: [
{
line: 1,
messageId: "noDeclareCurrentPackage",
},
],
},
],
valid: [
{
filename: "index.d.ts",
code: `module "foo" { }
module "foo/bar/baz" { }
`}
],
});
// needed because you can only test one non-file.ts file per tsconfig
// (and tsconfig is required for typed-based rules)
const ruleTester2 = new ESLintUtils.RuleTester({
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: 2018,
tsconfigRootDir: __dirname,
project: "./tsconfig.no-declare-current-package2.json",
}
});

ruleTester2.run("no-declare-current-package", noDeclareCurrentPackage, {
invalid: [{
filename: "deep/import.d.ts",
code: `module "test/deep/import" { }`,
errors: [
{
line: 1,
messageId: "noDeclareCurrentPackage",
},
],
},
],
valid: [],
});
4 changes: 3 additions & 1 deletion packages/dtslint/test/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@
"strict": true,
"target": "esnext"
},
"files": ["file.ts"]
"files": [
"file.ts"
]
}
11 changes: 11 additions & 0 deletions packages/dtslint/test/tsconfig.no-declare-current-package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"skipLibCheck": true,
"strict": true,
"target": "esnext"
},
"files": [
"index.d.ts",
"deep/import.d.ts"
]
}
11 changes: 11 additions & 0 deletions packages/dtslint/test/tsconfig.no-declare-current-package2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"skipLibCheck": true,
"strict": true,
"target": "esnext"
},
"files": [
"file.ts",
"deep/import.d.ts"
]
}
13 changes: 3 additions & 10 deletions packages/utils/src/collections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,26 +148,19 @@ export function isArray(value: any): value is readonly {}[] {
}

/**
* Maps an array. If the mapped value is an array, it is spread into the result.
* Maps an array. The mapped value is spread into the result.
*
* @param array The array to map.
* @param mapfn The callback used to map the result into one or more values.
*/
export function flatMap<T, U>(
array: readonly T[] | undefined,
mapfn: (x: T, i: number) => U | readonly U[] | undefined
mapfn: (x: T, i: number) => readonly U[]
): readonly U[] {
let result: U[] | undefined;
if (array) {
for (let i = 0; i < array.length; i++) {
const v = mapfn(array[i], i);
if (v) {
if (isArray(v)) {
result = addRange(result, v);
} else {
result = append(result, v);
}
}
result = addRange(result, mapfn(array[i], i));
}
}
return result || [];
Expand Down