@checkdigit/eslint-plugin 4.1.0-PR.32-b8ce → 4.1.1

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.
@@ -1,134 +0,0 @@
1
- "use strict";
2
- // no-card-numbers.spec.ts
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- /*
8
- * Copyright (c) 2021-2022 Check Digit, LLC
9
- *
10
- * This code is licensed under the MIT license (see LICENSE.txt for details).
11
- */
12
- const eslint_1 = require("eslint");
13
- const no_card_numbers_1 = __importDefault(require("./no-card-numbers"));
14
- const CARD_NUMBER_FOUND = 'CARD_NUMBER_FOUND';
15
- const CARD_NUMBERS_FOUND = 'CARD_NUMBERS_FOUND';
16
- const CARD_NUMBER_FOUND_MSG = {
17
- messageId: CARD_NUMBER_FOUND,
18
- };
19
- const CARD_NUMBERS_FOUND_MSG = {
20
- messageId: CARD_NUMBERS_FOUND,
21
- };
22
- const STRING_TEST = `
23
- const NOT_A_SECRET = "I'm not a secret, I think";
24
- `;
25
- // eslint-disable-next-line no-template-curly-in-string
26
- const TEMPLATE_TEST = "const NOT_A_SECRET = `A template that isn't a secret. ${1+1} = 2`";
27
- const CONTAINS_CARD_NUMBER_IN_NUMBER = `
28
- const foo = 4507894813950280;
29
- `;
30
- const CONTAINS_A_PASSING_CARD_NUMBER = `
31
- const foo = 4111111111111111;
32
- const fuz = 123111111111111111567;
33
- const bar = 111111111111111;
34
- const baz = 000000000000000;
35
- const far = 0000000000000000;
36
- const faz = 00000000000000000;
37
- const doo = 000000000000000000;
38
- const dar = 0000000000000000000;
39
- `;
40
- const CONTAINS_A_PASSING_CARD_NUMBER_IN_COMMENT = `
41
- // 4111111111111111;
42
- // 123111111111111111567;
43
- // 111111111111111;
44
- // 000000000000000;
45
- // 0000000000000000;
46
- // 00000000000000000;
47
- // 000000000000000000;
48
- // 0000000000000000000;
49
- `;
50
- const CONTAINS_SEVERAL_CARD_NUMBERS_IN_STRING = `
51
- const foo = '4507894813950280 aa 4939816588221579';
52
- `;
53
- const CONTAINS_CARD_NUMBER_IN_COMMENT = `
54
- // this test will be using this valid card number -> 4507894813950280
55
- const foo = 'nothing wrong here';
56
- `;
57
- const CONTAINS_SEVERAL_CARD_NUMBERS_IN_COMMENT = `
58
- // this test will be using these valid card numbers -> 4507894813950280 and 4732643354095204
59
- const foo = 'nothing wrong here';
60
- `;
61
- const STRING_WITH_CARD_NUMBER_THAT_DOESNT_PASS_LUHN_CHECK = `
62
- const foo = 4507894813950285;
63
- `;
64
- const CONTAINS_PASSING_BUT_INVALID_0_PREFIX_CARD_NUMBER_IN_STRING = `
65
- const foo = '0027576507977237';
66
- `;
67
- const CONTAINS_PASSING_BUT_INVALID_1_PREFIX_CARD_NUMBER_IN_STRING = `
68
- const foo = '1237027241007794';
69
- `;
70
- const CONTAINS_PASSING_BUT_INVALID_7_PREFIX_CARD_NUMBER_IN_STRING = `
71
- const foo = '7603721237334401';
72
- `;
73
- const CONTAINS_PASSING_BUT_INVALID_8_PREFIX_CARD_NUMBER_IN_STRING = `
74
- const foo = '8119915764450821';
75
- `;
76
- const CONTAINS_PASSING_BUT_INVALID_9_PREFIX_CARD_NUMBER_IN_STRING = `
77
- const foo = '9118724531442999';
78
- `;
79
- describe('no-card-numbers', () => {
80
- const ruleTester = new eslint_1.RuleTester({ parserOptions: { ecmaVersion: 2020 } });
81
- ruleTester.run('no-card-numbers', no_card_numbers_1.default, {
82
- valid: [
83
- {
84
- code: STRING_TEST,
85
- },
86
- {
87
- code: TEMPLATE_TEST,
88
- },
89
- {
90
- code: STRING_WITH_CARD_NUMBER_THAT_DOESNT_PASS_LUHN_CHECK,
91
- },
92
- {
93
- code: CONTAINS_A_PASSING_CARD_NUMBER,
94
- },
95
- {
96
- code: CONTAINS_A_PASSING_CARD_NUMBER_IN_COMMENT,
97
- },
98
- {
99
- code: CONTAINS_PASSING_BUT_INVALID_0_PREFIX_CARD_NUMBER_IN_STRING,
100
- },
101
- {
102
- code: CONTAINS_PASSING_BUT_INVALID_1_PREFIX_CARD_NUMBER_IN_STRING,
103
- },
104
- {
105
- code: CONTAINS_PASSING_BUT_INVALID_7_PREFIX_CARD_NUMBER_IN_STRING,
106
- },
107
- {
108
- code: CONTAINS_PASSING_BUT_INVALID_8_PREFIX_CARD_NUMBER_IN_STRING,
109
- },
110
- {
111
- code: CONTAINS_PASSING_BUT_INVALID_9_PREFIX_CARD_NUMBER_IN_STRING,
112
- },
113
- ],
114
- invalid: [
115
- {
116
- code: CONTAINS_CARD_NUMBER_IN_NUMBER,
117
- errors: [CARD_NUMBER_FOUND_MSG],
118
- },
119
- {
120
- code: CONTAINS_SEVERAL_CARD_NUMBERS_IN_STRING,
121
- errors: [CARD_NUMBERS_FOUND_MSG],
122
- },
123
- {
124
- code: CONTAINS_CARD_NUMBER_IN_COMMENT,
125
- errors: [CARD_NUMBER_FOUND_MSG],
126
- },
127
- {
128
- code: CONTAINS_SEVERAL_CARD_NUMBERS_IN_COMMENT,
129
- errors: [CARD_NUMBERS_FOUND_MSG],
130
- },
131
- ],
132
- });
133
- });
134
- //# sourceMappingURL=no-card-numbers.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-card-numbers.spec.js","sourceRoot":"","sources":["../src/no-card-numbers.spec.ts"],"names":[],"mappings":";AAAA,0BAA0B;;;;;AAE1B;;;;GAIG;AAEH,mCAAoC;AAEpC,wEAAqC;AAErC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAC9C,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEhD,MAAM,qBAAqB,GAAG;IAC5B,SAAS,EAAE,iBAAiB;CAC7B,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC7B,SAAS,EAAE,kBAAkB;CAC9B,CAAC;AAEF,MAAM,WAAW,GAAG;;CAEnB,CAAC;AAEF,uDAAuD;AACvD,MAAM,aAAa,GAAG,mEAAmE,CAAC;AAE1F,MAAM,8BAA8B,GAAG;;CAEtC,CAAC;AAEF,MAAM,8BAA8B,GAAG;;;;;;;;;CAStC,CAAC;AAEF,MAAM,yCAAyC,GAAG;;;;;;;;;CASjD,CAAC;AAEF,MAAM,uCAAuC,GAAG;;CAE/C,CAAC;AAEF,MAAM,+BAA+B,GAAG;;;CAGvC,CAAC;AAEF,MAAM,wCAAwC,GAAG;;;CAGhD,CAAC;AAEF,MAAM,mDAAmD,GAAG;;CAE3D,CAAC;AAEF,MAAM,2DAA2D,GAAG;;CAEnE,CAAC;AAEF,MAAM,2DAA2D,GAAG;;CAEnE,CAAC;AAEF,MAAM,2DAA2D,GAAG;;CAEnE,CAAC;AAEF,MAAM,2DAA2D,GAAG;;CAEnE,CAAC;AAEF,MAAM,2DAA2D,GAAG;;CAEnE,CAAC;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5E,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,yBAAI,EAAE;QACtC,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,WAAW;aAClB;YACD;gBACE,IAAI,EAAE,aAAa;aACpB;YACD;gBACE,IAAI,EAAE,mDAAmD;aAC1D;YACD;gBACE,IAAI,EAAE,8BAA8B;aACrC;YACD;gBACE,IAAI,EAAE,yCAAyC;aAChD;YACD;gBACE,IAAI,EAAE,2DAA2D;aAClE;YACD;gBACE,IAAI,EAAE,2DAA2D;aAClE;YACD;gBACE,IAAI,EAAE,2DAA2D;aAClE;YACD;gBACE,IAAI,EAAE,2DAA2D;aAClE;YACD;gBACE,IAAI,EAAE,2DAA2D;aAClE;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,8BAA8B;gBACpC,MAAM,EAAE,CAAC,qBAAqB,CAAC;aAChC;YACD;gBACE,IAAI,EAAE,uCAAuC;gBAC7C,MAAM,EAAE,CAAC,sBAAsB,CAAC;aACjC;YACD;gBACE,IAAI,EAAE,+BAA+B;gBACrC,MAAM,EAAE,CAAC,qBAAqB,CAAC;aAChC;YACD;gBACE,IAAI,EAAE,wCAAwC;gBAC9C,MAAM,EAAE,CAAC,sBAAsB,CAAC;aACjC;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// no-card-numbers.spec.ts\n\n/*\n * Copyright (c) 2021-2022 Check Digit, LLC\n *\n * This code is licensed under the MIT license (see LICENSE.txt for details).\n */\n\nimport { RuleTester } from 'eslint';\n\nimport rule from './no-card-numbers';\n\nconst CARD_NUMBER_FOUND = 'CARD_NUMBER_FOUND';\nconst CARD_NUMBERS_FOUND = 'CARD_NUMBERS_FOUND';\n\nconst CARD_NUMBER_FOUND_MSG = {\n messageId: CARD_NUMBER_FOUND,\n};\n\nconst CARD_NUMBERS_FOUND_MSG = {\n messageId: CARD_NUMBERS_FOUND,\n};\n\nconst STRING_TEST = `\nconst NOT_A_SECRET = \"I'm not a secret, I think\";\n`;\n\n// eslint-disable-next-line no-template-curly-in-string\nconst TEMPLATE_TEST = \"const NOT_A_SECRET = `A template that isn't a secret. ${1+1} = 2`\";\n\nconst CONTAINS_CARD_NUMBER_IN_NUMBER = `\nconst foo = 4507894813950280;\n`;\n\nconst CONTAINS_A_PASSING_CARD_NUMBER = `\nconst foo = 4111111111111111;\nconst fuz = 123111111111111111567;\nconst bar = 111111111111111;\nconst baz = 000000000000000;\nconst far = 0000000000000000;\nconst faz = 00000000000000000;\nconst doo = 000000000000000000;\nconst dar = 0000000000000000000;\n`;\n\nconst CONTAINS_A_PASSING_CARD_NUMBER_IN_COMMENT = `\n// 4111111111111111;\n// 123111111111111111567;\n// 111111111111111;\n// 000000000000000;\n// 0000000000000000;\n// 00000000000000000;\n// 000000000000000000;\n// 0000000000000000000;\n`;\n\nconst CONTAINS_SEVERAL_CARD_NUMBERS_IN_STRING = `\nconst foo = '4507894813950280 aa 4939816588221579';\n`;\n\nconst CONTAINS_CARD_NUMBER_IN_COMMENT = `\n// this test will be using this valid card number -> 4507894813950280\nconst foo = 'nothing wrong here';\n`;\n\nconst CONTAINS_SEVERAL_CARD_NUMBERS_IN_COMMENT = `\n// this test will be using these valid card numbers -> 4507894813950280 and 4732643354095204\nconst foo = 'nothing wrong here';\n`;\n\nconst STRING_WITH_CARD_NUMBER_THAT_DOESNT_PASS_LUHN_CHECK = `\n const foo = 4507894813950285;\n`;\n\nconst CONTAINS_PASSING_BUT_INVALID_0_PREFIX_CARD_NUMBER_IN_STRING = `\nconst foo = '0027576507977237';\n`;\n\nconst CONTAINS_PASSING_BUT_INVALID_1_PREFIX_CARD_NUMBER_IN_STRING = `\nconst foo = '1237027241007794';\n`;\n\nconst CONTAINS_PASSING_BUT_INVALID_7_PREFIX_CARD_NUMBER_IN_STRING = `\nconst foo = '7603721237334401';\n`;\n\nconst CONTAINS_PASSING_BUT_INVALID_8_PREFIX_CARD_NUMBER_IN_STRING = `\nconst foo = '8119915764450821';\n`;\n\nconst CONTAINS_PASSING_BUT_INVALID_9_PREFIX_CARD_NUMBER_IN_STRING = `\nconst foo = '9118724531442999';\n`;\n\ndescribe('no-card-numbers', () => {\n const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2020 } });\n ruleTester.run('no-card-numbers', rule, {\n valid: [\n {\n code: STRING_TEST,\n },\n {\n code: TEMPLATE_TEST,\n },\n {\n code: STRING_WITH_CARD_NUMBER_THAT_DOESNT_PASS_LUHN_CHECK,\n },\n {\n code: CONTAINS_A_PASSING_CARD_NUMBER,\n },\n {\n code: CONTAINS_A_PASSING_CARD_NUMBER_IN_COMMENT,\n },\n {\n code: CONTAINS_PASSING_BUT_INVALID_0_PREFIX_CARD_NUMBER_IN_STRING,\n },\n {\n code: CONTAINS_PASSING_BUT_INVALID_1_PREFIX_CARD_NUMBER_IN_STRING,\n },\n {\n code: CONTAINS_PASSING_BUT_INVALID_7_PREFIX_CARD_NUMBER_IN_STRING,\n },\n {\n code: CONTAINS_PASSING_BUT_INVALID_8_PREFIX_CARD_NUMBER_IN_STRING,\n },\n {\n code: CONTAINS_PASSING_BUT_INVALID_9_PREFIX_CARD_NUMBER_IN_STRING,\n },\n ],\n invalid: [\n {\n code: CONTAINS_CARD_NUMBER_IN_NUMBER,\n errors: [CARD_NUMBER_FOUND_MSG],\n },\n {\n code: CONTAINS_SEVERAL_CARD_NUMBERS_IN_STRING,\n errors: [CARD_NUMBERS_FOUND_MSG],\n },\n {\n code: CONTAINS_CARD_NUMBER_IN_COMMENT,\n errors: [CARD_NUMBER_FOUND_MSG],\n },\n {\n code: CONTAINS_SEVERAL_CARD_NUMBERS_IN_COMMENT,\n errors: [CARD_NUMBERS_FOUND_MSG],\n },\n ],\n });\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-uuid.d.ts","sourceRoot":"","sources":["../src/no-uuid.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;;AAwDnC,wBA2CqB"}
package/dist/no-uuid.js DELETED
@@ -1,102 +0,0 @@
1
- "use strict";
2
- // no-uuid.ts
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const UUID_FOUND = 'UUID_FOUND';
5
- const UUIDS_FOUND = 'UUIDS_FOUND';
6
- const uuidRegex = /[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/gmu;
7
- function checkForUuid(value, context, node, loc) {
8
- const matches = value.match(uuidRegex);
9
- if (matches === null) {
10
- return;
11
- }
12
- if (matches.length === 1) {
13
- if (node !== undefined) {
14
- context.report({
15
- messageId: UUID_FOUND,
16
- data: {
17
- uuid: matches[0] ?? '',
18
- },
19
- node,
20
- });
21
- }
22
- else if (loc !== undefined) {
23
- context.report({
24
- messageId: UUID_FOUND,
25
- data: {
26
- uuid: matches[0] ?? '',
27
- },
28
- loc: {
29
- start: loc.start,
30
- end: loc.end,
31
- },
32
- });
33
- }
34
- }
35
- else if (matches.length > 1) {
36
- if (node !== undefined) {
37
- context.report({
38
- messageId: UUIDS_FOUND,
39
- data: {
40
- uuids: matches.join(', '),
41
- },
42
- node,
43
- });
44
- }
45
- else if (loc !== undefined) {
46
- context.report({
47
- messageId: UUIDS_FOUND,
48
- data: {
49
- uuids: matches.join(', '),
50
- },
51
- loc: {
52
- start: loc.start,
53
- end: loc.end,
54
- },
55
- });
56
- }
57
- }
58
- }
59
- exports.default = {
60
- meta: {
61
- type: 'problem',
62
- docs: {
63
- description: 'Detects if a string literal contains a UUID',
64
- url: 'https://github.com/checkdigit/eslint-plugin',
65
- },
66
- messages: {
67
- [UUID_FOUND]: `UUID found: "{{ uuid }}"`,
68
- [UUIDS_FOUND]: `Multiple UUIDs found: "{{ uuids }}"`,
69
- },
70
- },
71
- create(context) {
72
- const sourceCode = context.getSourceCode();
73
- const comments = sourceCode.getAllComments();
74
- comments.forEach((comment) => {
75
- if (comment.loc !== undefined && comment.loc !== null) {
76
- checkForUuid(comment.value, context, undefined, comment.loc);
77
- }
78
- });
79
- return {
80
- Literal(node) {
81
- if (node.value === undefined) {
82
- return;
83
- }
84
- if (typeof node.value !== 'string') {
85
- return;
86
- }
87
- const value = `${node.value}`;
88
- checkForUuid(value, context, node);
89
- },
90
- TemplateElement(node) {
91
- if (!node.value) {
92
- return;
93
- }
94
- if (typeof node.value.cooked !== 'string') {
95
- return;
96
- }
97
- checkForUuid(node.value.cooked, context, node);
98
- },
99
- };
100
- },
101
- };
102
- //# sourceMappingURL=no-uuid.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-uuid.js","sourceRoot":"","sources":["../src/no-uuid.ts"],"names":[],"mappings":";AAAA,aAAa;;AAWb,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,SAAS,GAAG,wFAAwF,CAAC;AAE3G,SAAS,YAAY,CAAC,KAAa,EAAE,OAAyB,EAAE,IAAW,EAAE,GAAoB;IAC/F,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,IAAI,EAAE;QACpB,OAAO;KACR;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,OAAO,CAAC,MAAM,CAAC;gBACb,SAAS,EAAE,UAAU;gBACrB,IAAI,EAAE;oBACJ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;iBACvB;gBACD,IAAI;aACL,CAAC,CAAC;SACJ;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC;gBACb,SAAS,EAAE,UAAU;gBACrB,IAAI,EAAE;oBACJ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;iBACvB;gBACD,GAAG,EAAE;oBACH,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;iBACb;aACF,CAAC,CAAC;SACJ;KACF;SAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7B,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,OAAO,CAAC,MAAM,CAAC;gBACb,SAAS,EAAE,WAAW;gBACtB,IAAI,EAAE;oBACJ,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC1B;gBACD,IAAI;aACL,CAAC,CAAC;SACJ;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC;gBACb,SAAS,EAAE,WAAW;gBACtB,IAAI,EAAE;oBACJ,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC1B;gBACD,GAAG,EAAE;oBACH,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;iBACb;aACF,CAAC,CAAC;SACJ;KACF;AACH,CAAC;AAED,kBAAe;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,6CAA6C;YAC1D,GAAG,EAAE,6CAA6C;SACnD;QACD,QAAQ,EAAE;YACR,CAAC,UAAU,CAAC,EAAE,0BAA0B;YACxC,CAAC,WAAW,CAAC,EAAE,qCAAqC;SACrD;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;QAE7C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE;gBACrD,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;aAC9D;QACH,CAAC,CAAC,CAAC;QACH,OAAO;YACL,OAAO,CAAC,IAAI;gBACV,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;oBAC5B,OAAO;iBACR;gBACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;oBAClC,OAAO;iBACR;gBACD,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,eAAe,CAAC,IAAI;gBAClB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;oBACf,OAAO;iBACR;gBACD,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE;oBACzC,OAAO;iBACR;gBACD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;SACF,CAAC;IACJ,CAAC;CACiB,CAAC","sourcesContent":["// no-uuid.ts\n\n/*\n * Copyright (c) 2022 Check Digit, LLC\n *\n * This code is licensed under the MIT license (see LICENSE.txt for details).\n */\n\nimport type { Node, SourceLocation } from 'estree';\nimport type { Rule } from 'eslint';\n\nconst UUID_FOUND = 'UUID_FOUND';\nconst UUIDS_FOUND = 'UUIDS_FOUND';\nconst uuidRegex = /[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}/gmu;\n\nfunction checkForUuid(value: string, context: Rule.RuleContext, node?: Node, loc?: SourceLocation) {\n const matches = value.match(uuidRegex);\n if (matches === null) {\n return;\n }\n if (matches.length === 1) {\n if (node !== undefined) {\n context.report({\n messageId: UUID_FOUND,\n data: {\n uuid: matches[0] ?? '',\n },\n node,\n });\n } else if (loc !== undefined) {\n context.report({\n messageId: UUID_FOUND,\n data: {\n uuid: matches[0] ?? '',\n },\n loc: {\n start: loc.start,\n end: loc.end,\n },\n });\n }\n } else if (matches.length > 1) {\n if (node !== undefined) {\n context.report({\n messageId: UUIDS_FOUND,\n data: {\n uuids: matches.join(', '),\n },\n node,\n });\n } else if (loc !== undefined) {\n context.report({\n messageId: UUIDS_FOUND,\n data: {\n uuids: matches.join(', '),\n },\n loc: {\n start: loc.start,\n end: loc.end,\n },\n });\n }\n }\n}\n\nexport default {\n meta: {\n type: 'problem',\n docs: {\n description: 'Detects if a string literal contains a UUID',\n url: 'https://github.com/checkdigit/eslint-plugin',\n },\n messages: {\n [UUID_FOUND]: `UUID found: \"{{ uuid }}\"`,\n [UUIDS_FOUND]: `Multiple UUIDs found: \"{{ uuids }}\"`,\n },\n },\n create(context) {\n const sourceCode = context.getSourceCode();\n const comments = sourceCode.getAllComments();\n\n comments.forEach((comment) => {\n if (comment.loc !== undefined && comment.loc !== null) {\n checkForUuid(comment.value, context, undefined, comment.loc);\n }\n });\n return {\n Literal(node) {\n if (node.value === undefined) {\n return;\n }\n if (typeof node.value !== 'string') {\n return;\n }\n const value = `${node.value}`;\n checkForUuid(value, context, node);\n },\n TemplateElement(node) {\n if (!node.value) {\n return;\n }\n if (typeof node.value.cooked !== 'string') {\n return;\n }\n checkForUuid(node.value.cooked, context, node);\n },\n };\n },\n} as Rule.RuleModule;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-uuid.spec.d.ts","sourceRoot":"","sources":["../src/no-uuid.spec.ts"],"names":[],"mappings":""}
@@ -1,78 +0,0 @@
1
- "use strict";
2
- // no-uuid.spec.ts
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- /*
8
- * Copyright (c) 2022 Check Digit, LLC
9
- *
10
- * This code is licensed under the MIT license (see LICENSE.txt for details).
11
- */
12
- const eslint_1 = require("eslint");
13
- const no_uuid_1 = __importDefault(require("./no-uuid"));
14
- const UUID_FOUND = 'UUID_FOUND';
15
- const UUIDS_FOUND = 'UUIDS_FOUND';
16
- const UUID_FOUND_MSG = {
17
- messageId: UUID_FOUND,
18
- };
19
- const UUIDS_FOUND_MSG = {
20
- messageId: UUIDS_FOUND,
21
- };
22
- const STRING_TEST = `
23
- const NOT_A_UUID = "I'm not a uuid, I think";
24
- `;
25
- // eslint-disable-next-line no-template-curly-in-string
26
- const TEMPLATE_TEST = "const NOT_A_UUID = `A template that isn't a uuid. ${1+1} = 2`";
27
- const STRING_WITH_NON_UUID = `
28
- const foo = 'C73BCDCC-2669-4Bf6-XXX-81d3-E4AE73FB11FD';
29
- `;
30
- const CONTAINS_UUID_IN_STRING = `
31
- const foo = 'c73bcdcc-2669-4bf6-81d3-e4ae73fb11fd';
32
- `;
33
- const CONTAINS_MULTIPLE_UUIDS_IN_STRING = `
34
- const foo = 'c73bcdcc-2669-4bf6-81d3-e4ae73fb11fd aa 123e4567-e89b-12d3-a456-426655440000';
35
- `;
36
- const CONTAINS_UUID_IN_COMMENT = `
37
- // this test will be using this uuid -> C73BCDCC-2669-4Bf6-81d3-E4AE73FB11FD
38
- const foo = 'nothing wrong here';
39
- `;
40
- const CONTAINS_MULTIPLE_UUIDS_IN_COMMENT = `
41
- // this test will be using these uuids -> c73bcdcc-2669-4bf6-81d3-e4ae73fb11fd and 123e4567-e89b-12d3-a456-426655440000
42
- const foo = 'nothing wrong here';
43
- `;
44
- describe('no-uuid', () => {
45
- const ruleTester = new eslint_1.RuleTester({ parserOptions: { ecmaVersion: 2020 } });
46
- ruleTester.run('no-uuid', no_uuid_1.default, {
47
- valid: [
48
- {
49
- code: STRING_TEST,
50
- },
51
- {
52
- code: TEMPLATE_TEST,
53
- },
54
- {
55
- code: STRING_WITH_NON_UUID,
56
- },
57
- ],
58
- invalid: [
59
- {
60
- code: CONTAINS_UUID_IN_STRING,
61
- errors: [UUID_FOUND_MSG],
62
- },
63
- {
64
- code: CONTAINS_MULTIPLE_UUIDS_IN_STRING,
65
- errors: [UUIDS_FOUND_MSG],
66
- },
67
- {
68
- code: CONTAINS_UUID_IN_COMMENT,
69
- errors: [UUID_FOUND_MSG],
70
- },
71
- {
72
- code: CONTAINS_MULTIPLE_UUIDS_IN_COMMENT,
73
- errors: [UUIDS_FOUND_MSG],
74
- },
75
- ],
76
- });
77
- });
78
- //# sourceMappingURL=no-uuid.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-uuid.spec.js","sourceRoot":"","sources":["../src/no-uuid.spec.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;;;AAElB;;;;GAIG;AAEH,mCAAoC;AAEpC,wDAA6B;AAE7B,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,cAAc,GAAG;IACrB,SAAS,EAAE,UAAU;CACtB,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,MAAM,WAAW,GAAG;;CAEnB,CAAC;AAEF,uDAAuD;AACvD,MAAM,aAAa,GAAG,+DAA+D,CAAC;AAEtF,MAAM,oBAAoB,GAAG;;CAE5B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;CAE/B,CAAC;AAEF,MAAM,iCAAiC,GAAG;;CAEzC,CAAC;AAEF,MAAM,wBAAwB,GAAG;;;CAGhC,CAAC;AAEF,MAAM,kCAAkC,GAAG;;;CAG1C,CAAC;AAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5E,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,iBAAI,EAAE;QAC9B,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,WAAW;aAClB;YACD;gBACE,IAAI,EAAE,aAAa;aACpB;YACD;gBACE,IAAI,EAAE,oBAAoB;aAC3B;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,CAAC,cAAc,CAAC;aACzB;YACD;gBACE,IAAI,EAAE,iCAAiC;gBACvC,MAAM,EAAE,CAAC,eAAe,CAAC;aAC1B;YACD;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,MAAM,EAAE,CAAC,cAAc,CAAC;aACzB;YACD;gBACE,IAAI,EAAE,kCAAkC;gBACxC,MAAM,EAAE,CAAC,eAAe,CAAC;aAC1B;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// no-uuid.spec.ts\n\n/*\n * Copyright (c) 2022 Check Digit, LLC\n *\n * This code is licensed under the MIT license (see LICENSE.txt for details).\n */\n\nimport { RuleTester } from 'eslint';\n\nimport rule from './no-uuid';\n\nconst UUID_FOUND = 'UUID_FOUND';\nconst UUIDS_FOUND = 'UUIDS_FOUND';\n\nconst UUID_FOUND_MSG = {\n messageId: UUID_FOUND,\n};\n\nconst UUIDS_FOUND_MSG = {\n messageId: UUIDS_FOUND,\n};\n\nconst STRING_TEST = `\nconst NOT_A_UUID = \"I'm not a uuid, I think\";\n`;\n\n// eslint-disable-next-line no-template-curly-in-string\nconst TEMPLATE_TEST = \"const NOT_A_UUID = `A template that isn't a uuid. ${1+1} = 2`\";\n\nconst STRING_WITH_NON_UUID = `\n const foo = 'C73BCDCC-2669-4Bf6-XXX-81d3-E4AE73FB11FD';\n`;\n\nconst CONTAINS_UUID_IN_STRING = `\nconst foo = 'c73bcdcc-2669-4bf6-81d3-e4ae73fb11fd';\n`;\n\nconst CONTAINS_MULTIPLE_UUIDS_IN_STRING = `\nconst foo = 'c73bcdcc-2669-4bf6-81d3-e4ae73fb11fd aa 123e4567-e89b-12d3-a456-426655440000';\n`;\n\nconst CONTAINS_UUID_IN_COMMENT = `\n// this test will be using this uuid -> C73BCDCC-2669-4Bf6-81d3-E4AE73FB11FD\nconst foo = 'nothing wrong here';\n`;\n\nconst CONTAINS_MULTIPLE_UUIDS_IN_COMMENT = `\n// this test will be using these uuids -> c73bcdcc-2669-4bf6-81d3-e4ae73fb11fd and 123e4567-e89b-12d3-a456-426655440000\nconst foo = 'nothing wrong here';\n`;\n\ndescribe('no-uuid', () => {\n const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2020 } });\n ruleTester.run('no-uuid', rule, {\n valid: [\n {\n code: STRING_TEST,\n },\n {\n code: TEMPLATE_TEST,\n },\n {\n code: STRING_WITH_NON_UUID,\n },\n ],\n invalid: [\n {\n code: CONTAINS_UUID_IN_STRING,\n errors: [UUID_FOUND_MSG],\n },\n {\n code: CONTAINS_MULTIPLE_UUIDS_IN_STRING,\n errors: [UUIDS_FOUND_MSG],\n },\n {\n code: CONTAINS_UUID_IN_COMMENT,\n errors: [UUID_FOUND_MSG],\n },\n {\n code: CONTAINS_MULTIPLE_UUIDS_IN_COMMENT,\n errors: [UUIDS_FOUND_MSG],\n },\n ],\n });\n});\n"]}
@@ -1,88 +0,0 @@
1
- // file-path-comment.ts
2
-
3
- import type { Rule } from 'eslint';
4
-
5
- /*
6
- * Copyright (c) 2021-2022 Check Digit, LLC
7
- *
8
- * This code is licensed under the MIT license (see LICENSE.txt for details).
9
- */
10
-
11
- export default {
12
- meta: {
13
- type: 'suggestion',
14
- docs: {
15
- description: 'Validate that first line of file is a path to the file',
16
- url: 'https://github.com/checkdigit/eslint-plugin',
17
- },
18
- fixable: 'code',
19
- },
20
- create(context) {
21
- const firstLine = context.getSourceCode().getLines()[0] as string;
22
- const expectedPath = context.getFilename().split('src/')[1];
23
-
24
- if (expectedPath === undefined) {
25
- return {};
26
- }
27
-
28
- if (!firstLine.startsWith('//')) {
29
- if (firstLine.startsWith('/*')) {
30
- context.report({
31
- loc: {
32
- start: {
33
- line: 0,
34
- column: 0,
35
- },
36
- end: {
37
- line: 0,
38
- column: 1,
39
- },
40
- },
41
- message: 'first line cannot be a block comment',
42
- fix(fixer: Rule.RuleFixer) {
43
- return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}\n\n`);
44
- },
45
- });
46
- } else {
47
- context.report({
48
- loc: {
49
- start: {
50
- line: 0,
51
- column: 0,
52
- },
53
- end: {
54
- line: 0,
55
- column: 1,
56
- },
57
- },
58
- message: 'first line is not a comment with the file path',
59
- fix(fixer: Rule.RuleFixer) {
60
- return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}\n\n`);
61
- },
62
- });
63
- }
64
- } else {
65
- const actualComment = firstLine.split('// ')[1];
66
- if (expectedPath !== actualComment) {
67
- context.report({
68
- loc: {
69
- start: {
70
- line: 0,
71
- column: 0,
72
- },
73
- end: {
74
- line: 0,
75
- column: 1,
76
- },
77
- },
78
- message: 'first line is a comment but is not a path to the file',
79
- fix(fixer: Rule.RuleFixer) {
80
- return fixer.replaceTextRange([0, firstLine.length], `// ${expectedPath}`);
81
- },
82
- });
83
- }
84
- }
85
-
86
- return {};
87
- },
88
- } as Rule.RuleModule;
package/src/index.ts DELETED
@@ -1,35 +0,0 @@
1
- // index.ts
2
-
3
- /*
4
- * Copyright (c) 2021-2022 Check Digit, LLC
5
- *
6
- * This code is licensed under the MIT license (see LICENSE.txt for details).
7
- */
8
-
9
- import filePathComment from './file-path-comment';
10
- import noCardNumbers from './no-card-numbers';
11
- import noUuid from './no-uuid';
12
-
13
- export default {
14
- rules: {
15
- 'file-path-comment': filePathComment,
16
- 'no-card-numbers': noCardNumbers,
17
- 'no-uuid': noUuid,
18
- },
19
- configs: {
20
- all: {
21
- rules: {
22
- '@checkdigit/no-card-numbers': 'error',
23
- '@checkdigit/file-path-comment': 'error',
24
- '@checkdigit/no-uuid': 'error',
25
- },
26
- },
27
- recommended: {
28
- rules: {
29
- '@checkdigit/no-card-numbers': 'error',
30
- '@checkdigit/file-path-comment': 'off',
31
- '@checkdigit/no-uuid': 'error',
32
- },
33
- },
34
- },
35
- };
@@ -1,151 +0,0 @@
1
- // no-card-numbers.ts
2
-
3
- /*
4
- * Copyright (c) 2021-2022 Check Digit, LLC
5
- *
6
- * This code is licensed under the MIT license (see LICENSE.txt for details).
7
- */
8
-
9
- import type { Node, SourceLocation } from 'estree';
10
- import type { Rule } from 'eslint';
11
-
12
- const CARD_NUMBER_FOUND = 'CARD_NUMBER_FOUND';
13
- const CARD_NUMBERS_FOUND = 'CARD_NUMBERS_FOUND';
14
- const cardNumberRegex = /\d{15,19}/gmu;
15
- const allowCardNumbers = [
16
- '4111111111111111',
17
- '111111111111111',
18
- '000000000000000',
19
- '0000000000000000',
20
- '00000000000000000',
21
- '000000000000000000',
22
- '0000000000000000000',
23
- ];
24
-
25
- function luhnCheck(cardNumber: string) {
26
- return (
27
- cardNumber
28
- .split('')
29
- .reverse()
30
- .map((digit) => parseInt(digit, 10))
31
- .reduce((previousValue, currentValue, index) => {
32
- let value = currentValue;
33
- if (index % 2 === 1) {
34
- value *= 2;
35
- // eslint-disable-next-line no-magic-numbers
36
- if (value > 9) {
37
- value = (value % 10) + 1;
38
- }
39
- }
40
- return previousValue + value;
41
- }, 0) %
42
- 10 ===
43
- 0
44
- );
45
- }
46
-
47
- function checkForCardNumbers(value: string, context: Rule.RuleContext, node?: Node, loc?: SourceLocation) {
48
- const matches = value.match(cardNumberRegex);
49
- if (matches === null) {
50
- return;
51
- }
52
- const cardNumbers = matches.filter(
53
- (match) =>
54
- luhnCheck(match) &&
55
- allowCardNumbers.indexOf(match) === -1 &&
56
- // any 16-digit number that begins with 0-1 or 7-9 is not a valid card number
57
- match[0] !== '0' &&
58
- match[0] !== '1' &&
59
- match[0] !== '7' &&
60
- match[0] !== '8' &&
61
- match[0] !== '9'
62
- );
63
- if (cardNumbers.length === 1) {
64
- if (node !== undefined) {
65
- context.report({
66
- messageId: CARD_NUMBER_FOUND,
67
- data: {
68
- number: cardNumbers[0] as string,
69
- },
70
- node,
71
- });
72
- } else if (loc !== undefined) {
73
- context.report({
74
- messageId: CARD_NUMBER_FOUND,
75
- data: {
76
- number: cardNumbers[0] as string,
77
- },
78
- loc: {
79
- start: loc.start,
80
- end: loc.end,
81
- },
82
- });
83
- }
84
- } else if (cardNumbers.length > 1) {
85
- if (node !== undefined) {
86
- context.report({
87
- messageId: CARD_NUMBERS_FOUND,
88
- data: {
89
- numbers: matches.join(', '),
90
- },
91
- node,
92
- });
93
- } else if (loc !== undefined) {
94
- context.report({
95
- messageId: CARD_NUMBERS_FOUND,
96
- data: {
97
- numbers: matches.join(', '),
98
- },
99
- loc: {
100
- start: loc.start,
101
- end: loc.end,
102
- },
103
- });
104
- }
105
- }
106
- }
107
-
108
- export default {
109
- meta: {
110
- type: 'problem',
111
- docs: {
112
- description: 'Detects if a luhn passing card number',
113
- url: 'https://github.com/checkdigit/eslint-plugin',
114
- },
115
- messages: {
116
- [CARD_NUMBER_FOUND]: `Valid card number: "{{ number }}"`,
117
- [CARD_NUMBERS_FOUND]: `Multiple valid card numbers found: "{{ numbers }}"`,
118
- },
119
- },
120
- create(context) {
121
- const sourceCode = context.getSourceCode();
122
- const comments = sourceCode.getAllComments();
123
-
124
- comments.forEach((comment) => {
125
- if (comment.loc !== undefined && comment.loc !== null) {
126
- checkForCardNumbers(comment.value, context, undefined, comment.loc);
127
- }
128
- });
129
- return {
130
- Literal(node) {
131
- if (node.value === undefined) {
132
- return;
133
- }
134
- if (typeof node.value !== 'string' && typeof node.value !== 'number') {
135
- return;
136
- }
137
- const value = `${node.value}`;
138
- checkForCardNumbers(value, context, node);
139
- },
140
- TemplateElement(node) {
141
- if (!node.value) {
142
- return;
143
- }
144
- if (typeof node.value.cooked !== 'string') {
145
- return;
146
- }
147
- checkForCardNumbers(node.value.cooked, context, node);
148
- },
149
- };
150
- },
151
- } as Rule.RuleModule;