@putout/test 3.7.2 → 4.0.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 CHANGED
@@ -1,12 +1,9 @@
1
- # @putout/test [![NPM version][NPMIMGURL]][NPMURL] [![Dependency Status][DependencyStatusIMGURL]][DependencyStatusURL]
1
+ # @putout/test [![NPM version][NPMIMGURL]][NPMURL]
2
2
 
3
- [NPMIMGURL]: https://img.shields.io/npm/v/@putout/test.svg?style=flat&longCache=true
4
- [NPMURL]: https://npmjs.org/package/@putout/test"npm"
3
+ [NPMIMGURL]: https://img.shields.io/npm/v/@putout/test.svg?style=flat&longCache=true
4
+ [NPMURL]: https://npmjs.org/package/@putout/test "npm"
5
5
 
6
- [DependencyStatusURL]: https://david-dm.org/coderaiser/putout?path=packages/test-runner
7
- [DependencyStatusIMGURL]: https://david-dm.org/coderaiser/putout.svg?path=packages/test-runner
8
-
9
- Test runner for `putout plugins`. Basically it is [supercharged](https://github.com/coderaiser/supertape) `tape` with aditional asseritions:
6
+ Test runner for [🐊`Putout`](https://github.com/coderaiser/putout#plugins-api). Basically it is [supercharged `tape`](https://github.com/coderaiser/supertape) with aditional asseritions:
10
7
 
11
8
  ## Install
12
9
 
@@ -14,19 +11,40 @@ Test runner for `putout plugins`. Basically it is [supercharged](https://github.
14
11
  npm i @putout/test -D
15
12
  ```
16
13
 
14
+ ## Autofix
15
+
16
+ Set environment variable `UPDATE=1` to update `transform` and `format` fixtures.
17
+
18
+ ```sh
19
+ UPDATE=1 tape test/*.js
20
+ ```
21
+
17
22
  ## Plugins API
18
23
 
19
- ### Environment Variable
24
+ ### report(filename, message | []messages)
20
25
 
21
- Set environment variable `UPDATE=1` to update `transform` and `format` fixtures.
26
+ checks error message (or messages) of a plugin
22
27
 
23
- ### report(filename, message)
24
- checks error message of a plugin
28
+ ```js
29
+ test('remove usless variables: for-of', (t) => {
30
+ t.report('dot', 'Dot files should be added to .gitignore');
31
+ t.end();
32
+ });
33
+ ```
25
34
 
26
35
  ### reportCode(input, message)
36
+
27
37
  checks error message of a plugin from `input` code
28
38
 
39
+ ```js
40
+ test('remove debugger: report', (t) => {
41
+ t.reportCode('debugger', 'Unexpected "debugger" statement');
42
+ t.end();
43
+ });
44
+ ```
45
+
29
46
  ### transform(filename [, output, plugins])
47
+
30
48
  check transform of `filename.js` -> `filename-fix.js` in `test/fixtures` directory
31
49
 
32
50
  ```js
@@ -39,24 +57,97 @@ test('remove usless variables: for-of', (t) => {
39
57
  ```
40
58
 
41
59
  ### transformCode(input, output)
60
+
42
61
  check transform of `input` -> `output` code
43
62
 
63
+ ```js
64
+ test('remove-console: property identifier: code', (t) => {
65
+ t.transformCode('console.log()', '');
66
+ t.end();
67
+ });
68
+ ```
69
+
44
70
  ### reportWithOptions(filename, options)
71
+
45
72
  check report of `filename.js` with `options`
46
73
 
74
+ ```js
75
+ test('putout: test: reportWithOptions', (t) => {
76
+ const cache = new Map();
77
+ cache.set('x', 'y');
78
+
79
+ t.reportWithOptions('remove-import', 'avoid imports', {
80
+ cache,
81
+ });
82
+ t.end();
83
+ });
84
+ ```
85
+
47
86
  ### noReportWithOptions(filename, options)
87
+
48
88
  check no report of `filename.js` with `options`
49
89
 
90
+ ```js
91
+ test('putout: test: noReportWithOptions', (t) => {
92
+ const cache = new Map();
93
+
94
+ t.noReportWithOptions('remove-import', {
95
+ cache,
96
+ });
97
+ t.end();
98
+ });
99
+ ```
100
+
50
101
  ### transformWithOptions(filename, options)
102
+
51
103
  check transform of `filename.js` with `options`
52
104
 
105
+ ```js
106
+ test('putout: plugin: declare-undefined-variables: transform: parse', (t) => {
107
+ t.transformWithOptions('parse', {
108
+ dismiss: ['assign', 'stringify'],
109
+ });
110
+ t.end();
111
+ });
112
+ ```
113
+
53
114
  ### noTransformWithOptions(filename, options)
115
+
116
+ When file should not be transformed:
117
+
118
+ ```js
119
+ test('test: declared', (t) => {
120
+ t.noTransform('declared');
121
+ t.end();
122
+ });
123
+ ```
124
+
125
+ ### noTransformWithOptions(filename, options)
126
+
54
127
  check transform of `filename.js` with `options`
55
128
 
129
+ ```js
130
+ test('putout: plugin: declare-undefined-variables: transform: assign: dismiss', (t) => {
131
+ t.noTransformWithOptions('assign', {
132
+ dismiss: ['assign', 'stringify'],
133
+ });
134
+ t.end();
135
+ });
136
+ ```
137
+
56
138
  ### noReport(filename)
139
+
57
140
  checks error message of a plugin not produces
58
141
 
142
+ ```js
143
+ test('plugin-putout: check-replace-code: no report: typescript', (t) => {
144
+ t.noReport('typescript');
145
+ t.end();
146
+ });
147
+ ```
148
+
59
149
  ### noReportAfterTransform(filename)
150
+
60
151
  checks error message of a plugin not produces
61
152
 
62
153
  ```js
@@ -66,18 +157,47 @@ test('test: no report after transform', (t) => {
66
157
  });
67
158
  ```
68
159
 
69
- ### noReportCode(filename)
70
- checks error message of a plugin not produces with a `code`
71
-
72
160
  ### noTransform(filename)
73
- check transform of `filename.js` produce nothing
161
+
162
+ check transform of `filename.js` produce nothing new
163
+
164
+ ```js
165
+ test('plugin-apply-numeric-separators: no transform: hex', (t) => {
166
+ t.noTransform('hex');
167
+ t.end();
168
+ });
169
+ ```
74
170
 
75
171
  ### format(formatter, filename)
172
+
76
173
  check file name formatting (pass `process.env.UPDATE=1` to save fixture)
77
174
 
175
+ ```js
176
+ test('formatter: codeframe', async ({format}) => {
177
+ await format(codeframe);
178
+ });
179
+ ```
180
+
181
+ ### noFormat
182
+
183
+ check that there is no formatting for for such file
184
+
185
+ ```js
186
+ test('formatter: codeframe: no', async ({noFormat}) => {
187
+ await noFormat(codeframe, 'no');
188
+ });
189
+ ```
190
+
78
191
  ### formatMany(formatter, [filename1, filename2])
192
+
79
193
  check file name formatting (pass `process.env.UPDATE=1` to save fixture)
80
194
 
195
+ ```js
196
+ test('formatter: dump: many', async ({formatMany}) => {
197
+ await formatMany(dump, ['var', 'var']);
198
+ });
199
+ ```
200
+
81
201
  #### Usage Example
82
202
 
83
203
  Here is example of tests for [remove-console](https://github.com/coderaiser/putout/tree/master/packages/plugin-remove-console):
@@ -92,27 +212,11 @@ test('remove-console: report', (t) => {
92
212
  t.end();
93
213
  });
94
214
 
95
- test('remove-console: property identifier: code', (t) => {
96
- t.transformCode('console.log()', '');
97
- t.end();
98
- });
99
-
100
215
  test('remove-console: property identifier', (t) => {
101
216
  t.transform('property-identifier');
102
217
  t.end();
103
218
  });
104
219
 
105
- test('remove-console: property literal', (t) => {
106
- t.transform('property-literal', '\n\n');
107
- t.end();
108
- });
109
-
110
- // when file should not be transformed
111
- test('test: declared', (t) => {
112
- t.noTransform('declared');
113
- t.end();
114
- });
115
-
116
220
  // when code should not be transformed
117
221
  test('test: declared', (t) => {
118
222
  t.noTransformCode('alert()');
@@ -146,12 +250,12 @@ const test = createTest(__dirname, {
146
250
  Example:
147
251
 
148
252
  ```js
149
- test('putout: processor: json', async (t) => {
150
- await t.process('eslintrc');
253
+ test('putout: processor: json', async ({process}) => {
254
+ await process('eslintrc');
151
255
  });
152
256
 
153
- test('putout: processor: json', async (t) => {
154
- await t.process('package', ['package-json']);
257
+ test('putout: processor: json', async ({process}) => {
258
+ await process('package', ['package-json']);
155
259
  });
156
260
  ```
157
261
 
@@ -162,16 +266,16 @@ Check that filename would not be processed.
162
266
  Example:
163
267
 
164
268
  ```js
165
- test('putout: process: json: no process', async (t) => {
166
- await t.noProcess('eslintrc', [], ['json']);
269
+ test('putout: process: json: no process', async ({noProcess}) => {
270
+ await noProcess('eslintrc', [], ['json']);
167
271
  });
168
272
  ```
169
273
 
170
274
  ### comparePlaces(filename, places)
171
275
 
172
276
  ```js
173
- test('putout: processor: css: places', async (t) => {
174
- await t.comparePlaces('style', [{
277
+ test('putout: processor: css: places', async ({comparePlaces}) => {
278
+ await comparePlaces('style', [{
175
279
  message: 'Expected indentation of 4 spaces (indentation)',
176
280
  position: {
177
281
  column: 1,
@@ -185,4 +289,3 @@ test('putout: processor: css: places', async (t) => {
185
289
  ## License
186
290
 
187
291
  MIT
188
-
@@ -12,13 +12,11 @@ const processFile = require('putout/process-file');
12
12
  const {runProcessors} = require('@putout/engine-processor');
13
13
 
14
14
  const isStr = (a) => typeof a === 'string';
15
- const buildOptions = ({options, plugins, processors}) => {
16
- return {
17
- ...options,
18
- plugins: plugins || options.plugins,
19
- processors: processors || options.processors,
20
- };
21
- };
15
+ const buildOptions = ({options, plugins, processors}) => ({
16
+ ...options,
17
+ plugins: plugins || options.plugins,
18
+ processors: processors || options.processors,
19
+ });
22
20
 
23
21
  const addDot = (a) => a ? `.${a}` : '';
24
22
  module.exports._addDot = addDot;
package/lib/test.js CHANGED
@@ -66,7 +66,7 @@ module.exports = (dir, plugin, rules) => {
66
66
  });
67
67
  };
68
68
 
69
- const format = currify(({dir, plugins, rules}, t, formatter, name, formatterOptions = {}) => {
69
+ const format = currify(({dir, plugins, rules}, t) => async (formatter, name, formatterOptions = {}) => {
70
70
  const full = join(dir, name);
71
71
  const outputName = `${full}-format`;
72
72
  const [input, isTS] = readFixture(full);
@@ -75,7 +75,7 @@ const format = currify(({dir, plugins, rules}, t, formatter, name, formatterOpti
75
75
  const {places} = putout(input, {fixCount: 1, isTS, plugins, rules});
76
76
 
77
77
  const report = putout.initReport();
78
- const result = report(formatter, {
78
+ const result = await report(formatter, {
79
79
  formatterOptions,
80
80
  name,
81
81
  source: input,
@@ -87,14 +87,14 @@ const format = currify(({dir, plugins, rules}, t, formatter, name, formatterOpti
87
87
  return {is, output, result};
88
88
  });
89
89
 
90
- const noFormat = currify(({dir, plugins, rules}, t, formatter, name, formatterOptions = {}) => {
90
+ const noFormat = currify(({dir, plugins, rules}, t) => async (formatter, name, formatterOptions = {}) => {
91
91
  const full = join(dir, name);
92
92
  const [input] = readFixture(full);
93
93
 
94
94
  const {places} = putout(input, {plugins, rules});
95
95
 
96
96
  const report = putout.initReport();
97
- const result = report(formatter, {
97
+ const result = await report(formatter, {
98
98
  name,
99
99
  places,
100
100
  formatterOptions,
@@ -105,7 +105,7 @@ const noFormat = currify(({dir, plugins, rules}, t, formatter, name, formatterOp
105
105
  return {is, output, result};
106
106
  });
107
107
 
108
- const formatMany = currify(({dir, plugins, rules}, t, formatter, names, formatterOptions = {}) => {
108
+ const formatMany = currify(({dir, plugins, rules}, t) => async (formatter, names, formatterOptions = {}) => {
109
109
  const joinTwo = (a) => (b) => join(a, b);
110
110
  const fullNames = names.map(joinTwo(dir));
111
111
 
@@ -124,7 +124,7 @@ const formatMany = currify(({dir, plugins, rules}, t, formatter, names, formatte
124
124
  rules,
125
125
  });
126
126
 
127
- result += report(formatter, {
127
+ result += await report(formatter, {
128
128
  name,
129
129
  formatterOptions,
130
130
  source: input,
@@ -142,52 +142,44 @@ const formatMany = currify(({dir, plugins, rules}, t, formatter, names, formatte
142
142
  return {is, output, result};
143
143
  });
144
144
 
145
- const formatManySave = currify(({dir, plugins, rules}, t, formatter, names, options = {}) => {
145
+ const formatManySave = currify(({dir, plugins, rules}, t) => async (formatter, names, options = {}) => {
146
146
  const name = `${names.join('-')}-format.js`;
147
147
  const outputName = join(dir, name);
148
148
 
149
149
  if (!existsSync(outputName))
150
150
  writeFileSync(outputName, '');
151
151
 
152
+ const runFormat = await formatMany({dir, plugins, rules}, t);
153
+
152
154
  const {
153
155
  is,
154
156
  output,
155
157
  result,
156
- } = formatMany(
157
- {dir,
158
- plugins,
159
- rules},
160
- t,
161
- formatter,
162
- names,
163
- options,
164
- );
158
+ } = await runFormat(formatter, names, options);
165
159
 
166
160
  writeFileSync(outputName, result);
167
161
 
168
162
  return {is, output, result};
169
163
  });
170
164
 
171
- const formatSave = currify(({dir, plugins, rules}, t, formatter, name, options = {}) => {
165
+ const formatSave = currify(({dir, plugins, rules}, t) => async (formatter, name, options = {}) => {
172
166
  const full = join(dir, name);
173
167
  const outputName = `${full}-format.js`;
174
168
 
175
169
  if (!existsSync(outputName))
176
170
  writeFileSync(outputName, '');
177
171
 
172
+ const runFormat = format({
173
+ dir,
174
+ plugins,
175
+ rules,
176
+ }, t);
177
+
178
178
  const {
179
179
  is,
180
180
  output,
181
181
  result,
182
- } = format(
183
- {dir,
184
- plugins,
185
- rules},
186
- t,
187
- formatter,
188
- name,
189
- options,
190
- );
182
+ } = await runFormat(formatter, name, options);
191
183
 
192
184
  writeFileSync(outputName, result);
193
185
 
@@ -209,17 +201,19 @@ const transform = currify(({dir, plugins, rules}, t, name, transformed = null, a
209
201
 
210
202
  addons = addons || {};
211
203
 
212
- plugins[0] = {
213
- ...plugins[0],
214
- ...addons,
215
- };
216
-
217
- const {code} = putout(input, {isTS, plugins, rules});
204
+ const {code} = putout(input, {
205
+ isTS,
206
+ rules,
207
+ plugins: [{
208
+ ...plugins[0],
209
+ ...addons,
210
+ }],
211
+ });
218
212
 
219
213
  if (UPDATE)
220
214
  writeFileSync(`${full}-fix.js`, code);
221
215
 
222
- return t.equal(code, output, 'should equal');
216
+ return t.equal(code, output);
223
217
  });
224
218
 
225
219
  const transformWithOptions = currify(({dir, plugins}, t, name, options) => {
@@ -239,7 +233,7 @@ const transformWithOptions = currify(({dir, plugins}, t, name, options) => {
239
233
  if (UPDATE)
240
234
  writeFileSync(`${full}-fix.js`, code);
241
235
 
242
- return t.equal(code, output, 'should equal');
236
+ return t.equal(code, output);
243
237
  });
244
238
 
245
239
  const noTransformWithOptions = currify(({dir, plugins}, t, name, options) => {
@@ -255,7 +249,7 @@ const noTransformWithOptions = currify(({dir, plugins}, t, name, options) => {
255
249
 
256
250
  const {code} = putout(input, {isTS, plugins, rules});
257
251
 
258
- return t.equal(code, input, 'should equal');
252
+ return t.equal(code, input);
259
253
  });
260
254
 
261
255
  const noTransform = currify(({dir, plugins, rules}, t, name, addons = {}) => {
@@ -267,12 +261,12 @@ const noTransform = currify(({dir, plugins, rules}, t, name, addons = {}) => {
267
261
 
268
262
  const transformCode = currify(({plugins, rules}, t, input, output, isTS = false) => {
269
263
  const {code} = putout(input, {isTS, plugins, rules});
270
- return t.equal(code, output, 'should equal');
264
+ return t.equal(code, output);
271
265
  });
272
266
 
273
267
  const noTransformCode = currify(({plugins, rules}, t, input) => {
274
268
  const {code} = putout(input, {plugins, rules});
275
- return t.equal(code, input, 'should equal');
269
+ return t.equal(code, input);
276
270
  });
277
271
 
278
272
  const getMessage = ({message}) => message;
@@ -342,7 +336,7 @@ const reportCode = currify(({plugins, rules, isTS}, t, source, message) => {
342
336
  if (isArray(message))
343
337
  return t.deepEqual(resultMessages, message, 'should equal');
344
338
 
345
- return t.equal(resultMessages[0], message, 'should equal');
339
+ return t.equal(resultMessages[0], message);
346
340
  });
347
341
 
348
342
  const noReportCode = currify(({plugins, rules, isTS}, t, source) => {
@@ -393,7 +387,7 @@ function preTest(test, plugin) {
393
387
  test(`${name}: rules is an object`, (t) => {
394
388
  t.equal(typeof rules, 'object', 'should export "rules" object');
395
389
  t.end();
396
- });
390
+ }, {checkDuplicates: false});
397
391
 
398
392
  const entries = Object.entries(rules);
399
393
  for (const [entryName, plugin] of entries) {
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@putout/test",
3
- "version": "3.7.2",
3
+ "version": "4.0.0",
4
4
  "author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
5
5
  "description": "test runner for putout plugins ",
6
- "homepage": "http://github.com/coderaiser/putout",
6
+ "homepage": "https://github.com/coderaiser/putout/tree/master/packages/test#readme",
7
7
  "main": "lib/test.js",
8
8
  "bin": {
9
9
  "tape": "bin/test.mjs"
@@ -44,16 +44,17 @@
44
44
  "runner"
45
45
  ],
46
46
  "devDependencies": {
47
- "@cloudcmd/stub": "^3.0.0",
48
- "@putout/formatter-dump": "^2.0.1",
49
- "@putout/formatter-progress": "^2.0.0",
50
- "@putout/plugin-remove-console": "^3.1.0",
51
- "@putout/plugin-remove-empty": "^5.1.0",
47
+ "@putout/formatter-dump": "*",
48
+ "@putout/formatter-progress": "*",
49
+ "@putout/plugin-extract-object-properties": "*",
50
+ "@putout/plugin-putout": "*",
51
+ "@putout/plugin-remove-console": "*",
52
+ "@putout/plugin-remove-empty": "*",
52
53
  "@putout/plugin-remove-unused-variables": "*",
53
54
  "c8": "^7.5.0",
54
- "eslint": "^8.0.0-beta.0",
55
+ "eslint": "^8.0.1",
55
56
  "eslint-plugin-node": "^11.0.0",
56
- "eslint-plugin-putout": "^9.0.0",
57
+ "eslint-plugin-putout": "^12.0.0",
57
58
  "lerna": "^4.0.0",
58
59
  "madrun": "^8.0.1",
59
60
  "mock-require": "^3.0.3",