Skip to content

Commit ce8d141

Browse files
author
Rebecca Stevens
authored
Merge pull request #30 from jonaskello/readonlyset-readonlymap
ReadonlySet and ReadonlyMap
2 parents c4c79d1 + 558cc63 commit ce8d141

File tree

2 files changed

+80
-34
lines changed

2 files changed

+80
-34
lines changed

src/rules/prefer-readonly-types.ts

+29-17
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ const defaultOptions: Options = {
7171
// The possible error messages.
7272
const errorMessages = {
7373
array: "Only readonly arrays allowed.",
74-
tuple: "Only readonly tuples allowed.",
7574
implicit: "Implicitly a mutable array. Only readonly arrays allowed.",
76-
property: "A readonly modifier is required."
75+
property: "A readonly modifier is required.",
76+
tuple: "Only readonly tuples allowed.",
77+
type: "Only readonly types allowed."
7778
} as const;
7879

7980
// The meta data for this rule.
@@ -89,6 +90,11 @@ const meta: RuleMetaData<keyof typeof errorMessages> = {
8990
schema
9091
};
9192

93+
const mutableToImmutableTypes: ReadonlyMap<string, string> = new Map<
94+
string,
95+
string
96+
>([["Array", "ReadonlyArray"], ["Map", "ReadonlyMap"], ["Set", "ReadonlySet"]]);
97+
9298
/**
9399
* Check if the given ArrayType or TupleType violates this rule.
94100
*/
@@ -129,21 +135,27 @@ function checkTypeReference(
129135
context: RuleContext<keyof typeof errorMessages, Options>,
130136
options: Options
131137
): RuleResult<keyof typeof errorMessages, Options> {
132-
return {
133-
context,
134-
descriptors:
135-
isIdentifier(node.typeName) &&
136-
node.typeName.name === "Array" &&
137-
(!options.ignoreReturnType || !isInReturnType(node))
138-
? [
139-
{
140-
node,
141-
messageId: "array",
142-
fix: fixer => fixer.insertTextBefore(node, "Readonly")
143-
}
144-
]
145-
: []
146-
};
138+
if (isIdentifier(node.typeName)) {
139+
const immutableType = mutableToImmutableTypes.get(node.typeName.name);
140+
return {
141+
context,
142+
descriptors:
143+
immutableType && (!options.ignoreReturnType || !isInReturnType(node))
144+
? [
145+
{
146+
node,
147+
messageId: "type",
148+
fix: fixer => fixer.replaceText(node.typeName, immutableType)
149+
}
150+
]
151+
: []
152+
};
153+
} else {
154+
return {
155+
context,
156+
descriptors: []
157+
};
158+
}
147159
}
148160

149161
/**

tests/rules/prefer-readonly-types.test.ts

+51-17
Original file line numberDiff line numberDiff line change
@@ -343,13 +343,47 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
343343
}`,
344344
errors: [
345345
{
346-
messageId: "array",
346+
messageId: "type",
347347
type: "TSTypeReference",
348348
line: 1,
349349
column: 26
350350
}
351351
]
352352
},
353+
{
354+
code: dedent`
355+
function foo(numbers: Set<number>) {
356+
}`,
357+
optionsSet: [[]],
358+
output: dedent`
359+
function foo(numbers: ReadonlySet<number>) {
360+
}`,
361+
errors: [
362+
{
363+
messageId: "type",
364+
type: "TSTypeReference",
365+
line: 1,
366+
column: 23
367+
}
368+
]
369+
},
370+
{
371+
code: dedent`
372+
function foo(numbers: Map<number, string>) {
373+
}`,
374+
optionsSet: [[]],
375+
output: dedent`
376+
function foo(numbers: ReadonlyMap<number, string>) {
377+
}`,
378+
errors: [
379+
{
380+
messageId: "type",
381+
type: "TSTypeReference",
382+
line: 1,
383+
column: 23
384+
}
385+
]
386+
},
353387
// Should fail on Array type in interface.
354388
{
355389
code: dedent`
@@ -363,7 +397,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
363397
}`,
364398
errors: [
365399
{
366-
messageId: "array",
400+
messageId: "type",
367401
type: "TSTypeReference",
368402
line: 2,
369403
column: 17
@@ -387,7 +421,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
387421
}`,
388422
errors: [
389423
{
390-
messageId: "array",
424+
messageId: "type",
391425
type: "TSTypeReference",
392426
line: 3,
393427
column: 22
@@ -411,13 +445,13 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
411445
}`,
412446
errors: [
413447
{
414-
messageId: "array",
448+
messageId: "type",
415449
type: "TSTypeReference",
416450
line: 1,
417451
column: 17
418452
},
419453
{
420-
messageId: "array",
454+
messageId: "type",
421455
type: "TSTypeReference",
422456
line: 3,
423457
column: 19
@@ -441,13 +475,13 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
441475
}`,
442476
errors: [
443477
{
444-
messageId: "array",
478+
messageId: "type",
445479
type: "TSTypeReference",
446480
line: 1,
447481
column: 17
448482
},
449483
{
450-
messageId: "array",
484+
messageId: "type",
451485
type: "TSTypeReference",
452486
line: 3,
453487
column: 19
@@ -499,7 +533,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
499533
};`,
500534
errors: [
501535
{
502-
messageId: "array",
536+
messageId: "type",
503537
type: "TSTypeReference",
504538
line: 2,
505539
column: 12
@@ -624,19 +658,19 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
624658
}`,
625659
errors: [
626660
{
627-
messageId: "array",
661+
messageId: "type",
628662
type: "TSTypeReference",
629663
line: 3,
630664
column: 19
631665
},
632666
{
633-
messageId: "array",
667+
messageId: "type",
634668
type: "TSTypeReference",
635669
line: 7,
636670
column: 17
637671
},
638672
{
639-
messageId: "array",
673+
messageId: "type",
640674
type: "TSTypeReference",
641675
line: 11,
642676
column: 19
@@ -650,7 +684,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
650684
output: `type Foo = ReadonlyArray<string>;`,
651685
errors: [
652686
{
653-
messageId: "array",
687+
messageId: "type",
654688
type: "TSTypeReference",
655689
line: 1,
656690
column: 12
@@ -674,7 +708,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
674708
}`,
675709
errors: [
676710
{
677-
messageId: "array",
711+
messageId: "type",
678712
type: "TSTypeReference",
679713
line: 3,
680714
column: 19
@@ -694,7 +728,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
694728
}`,
695729
errors: [
696730
{
697-
messageId: "array",
731+
messageId: "type",
698732
type: "TSTypeReference",
699733
line: 2,
700734
column: 14
@@ -718,7 +752,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
718752
}`,
719753
errors: [
720754
{
721-
messageId: "array",
755+
messageId: "type",
722756
type: "TSTypeReference",
723757
line: 3,
724758
column: 19
@@ -732,7 +766,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
732766
output: `const foo: ReadonlyArray<string> = [];`,
733767
errors: [
734768
{
735-
messageId: "array",
769+
messageId: "type",
736770
type: "TSTypeReference",
737771
line: 1,
738772
column: 12
@@ -760,7 +794,7 @@ const invalid: ReadonlyArray<InvalidTestCase> = [
760794
output: `let x: Foo<ReadonlyArray<string>>;`,
761795
errors: [
762796
{
763-
messageId: "array",
797+
messageId: "type",
764798
type: "TSTypeReference",
765799
line: 1,
766800
column: 12

0 commit comments

Comments
 (0)