prettier 0.20.1 → 0.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -1
- data/CONTRIBUTING.md +5 -3
- data/README.md +51 -48
- data/node_modules/prettier/bin-prettier.js +181 -148
- data/node_modules/prettier/index.js +10335 -7465
- data/node_modules/prettier/third-party.js +33 -140
- data/package.json +1 -1
- data/src/nodes.js +1 -0
- data/src/nodes/alias.js +67 -24
- data/src/nodes/aref.js +55 -0
- data/src/nodes/arrays.js +6 -38
- data/src/nodes/calls.js +4 -19
- data/src/nodes/conditionals.js +12 -24
- data/src/nodes/flow.js +36 -18
- data/src/nodes/hashes.js +45 -45
- data/src/nodes/hooks.js +36 -6
- data/src/nodes/lambdas.js +75 -45
- data/src/nodes/loops.js +9 -24
- data/src/nodes/strings.js +0 -6
- data/src/parse.js +1 -1
- data/src/{ripper.rb → parser.rb} +27 -50
- data/src/ruby.js +1 -1
- data/src/utils.js +21 -19
- data/src/utils/inlineEnsureParens.js +42 -0
- data/src/utils/isEmptyStmts.js +7 -0
- metadata +6 -3
@@ -2,36 +2,28 @@
|
|
2
2
|
|
3
3
|
var os = require('os');
|
4
4
|
var path = require('path');
|
5
|
-
var
|
5
|
+
var Module = require('module');
|
6
6
|
var fs = require('fs');
|
7
7
|
var util = require('util');
|
8
|
-
var buffer$1 = require('buffer');
|
9
|
-
var stream = require('stream');
|
10
8
|
|
11
9
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
12
10
|
|
13
11
|
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
|
14
12
|
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
15
|
-
var
|
13
|
+
var Module__default = /*#__PURE__*/_interopDefaultLegacy(Module);
|
16
14
|
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
17
15
|
var util__default = /*#__PURE__*/_interopDefaultLegacy(util);
|
18
|
-
var buffer__default = /*#__PURE__*/_interopDefaultLegacy(buffer$1);
|
19
|
-
var stream__default = /*#__PURE__*/_interopDefaultLegacy(stream);
|
20
16
|
|
21
17
|
function createCommonjsModule(fn, basedir, module) {
|
22
18
|
return module = {
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
path: basedir,
|
20
|
+
exports: {},
|
21
|
+
require: function (path, base) {
|
22
|
+
return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
|
23
|
+
}
|
28
24
|
}, fn(module, module.exports), module.exports;
|
29
25
|
}
|
30
26
|
|
31
|
-
function getCjsExportFromNamespace (n) {
|
32
|
-
return n && n['default'] || n;
|
33
|
-
}
|
34
|
-
|
35
27
|
function commonjsRequire () {
|
36
28
|
throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
|
37
29
|
}
|
@@ -59,10 +51,10 @@ const resolveFrom = (fromDir, moduleId, silent) => {
|
|
59
51
|
|
60
52
|
const fromFile = path__default['default'].join(fromDir, 'noop.js');
|
61
53
|
|
62
|
-
const resolveFileName = () =>
|
54
|
+
const resolveFileName = () => Module__default['default']._resolveFilename(moduleId, {
|
63
55
|
id: fromFile,
|
64
56
|
filename: fromFile,
|
65
|
-
paths:
|
57
|
+
paths: Module__default['default']._nodeModulePaths(fromDir)
|
66
58
|
});
|
67
59
|
|
68
60
|
if (silent) {
|
@@ -10164,133 +10156,41 @@ var findParentDir = createCommonjsModule(function (module, exports) {
|
|
10164
10156
|
});
|
10165
10157
|
|
10166
10158
|
const {
|
10167
|
-
|
10168
|
-
} =
|
10159
|
+
stdin
|
10160
|
+
} = process;
|
10169
10161
|
|
10170
|
-
var
|
10171
|
-
|
10172
|
-
const {
|
10173
|
-
array
|
10174
|
-
} = options;
|
10175
|
-
let {
|
10176
|
-
encoding
|
10177
|
-
} = options;
|
10178
|
-
const isBuffer = encoding === 'buffer';
|
10179
|
-
let objectMode = false;
|
10162
|
+
var getStdin = async () => {
|
10163
|
+
let result = '';
|
10180
10164
|
|
10181
|
-
if (
|
10182
|
-
|
10183
|
-
} else {
|
10184
|
-
encoding = encoding || 'utf8';
|
10185
|
-
}
|
10186
|
-
|
10187
|
-
if (isBuffer) {
|
10188
|
-
encoding = null;
|
10165
|
+
if (stdin.isTTY) {
|
10166
|
+
return result;
|
10189
10167
|
}
|
10190
10168
|
|
10191
|
-
|
10192
|
-
objectMode
|
10193
|
-
});
|
10169
|
+
stdin.setEncoding('utf8');
|
10194
10170
|
|
10195
|
-
|
10196
|
-
|
10171
|
+
for await (const chunk of stdin) {
|
10172
|
+
result += chunk;
|
10197
10173
|
}
|
10198
10174
|
|
10199
|
-
|
10200
|
-
const chunks = [];
|
10201
|
-
stream.on('data', chunk => {
|
10202
|
-
chunks.push(chunk);
|
10203
|
-
|
10204
|
-
if (objectMode) {
|
10205
|
-
length = chunks.length;
|
10206
|
-
} else {
|
10207
|
-
length += chunk.length;
|
10208
|
-
}
|
10209
|
-
});
|
10210
|
-
|
10211
|
-
stream.getBufferedValue = () => {
|
10212
|
-
if (array) {
|
10213
|
-
return chunks;
|
10214
|
-
}
|
10215
|
-
|
10216
|
-
return isBuffer ? Buffer.concat(chunks, length) : chunks.join('');
|
10217
|
-
};
|
10218
|
-
|
10219
|
-
stream.getBufferedLength = () => length;
|
10220
|
-
|
10221
|
-
return stream;
|
10175
|
+
return result;
|
10222
10176
|
};
|
10223
10177
|
|
10224
|
-
|
10225
|
-
|
10226
|
-
|
10227
|
-
const {
|
10228
|
-
promisify: promisify$1
|
10229
|
-
} = util__default['default'];
|
10230
|
-
const streamPipelinePromisified = promisify$1(stream__default['default'].pipeline);
|
10178
|
+
var buffer = async () => {
|
10179
|
+
const result = [];
|
10180
|
+
let length = 0;
|
10231
10181
|
|
10232
|
-
|
10233
|
-
|
10234
|
-
super('maxBuffer exceeded');
|
10235
|
-
this.name = 'MaxBufferError';
|
10182
|
+
if (stdin.isTTY) {
|
10183
|
+
return Buffer.concat([]);
|
10236
10184
|
}
|
10237
10185
|
|
10238
|
-
|
10239
|
-
|
10240
|
-
|
10241
|
-
if (!inputStream) {
|
10242
|
-
throw new Error('Expected a stream');
|
10186
|
+
for await (const chunk of stdin) {
|
10187
|
+
result.push(chunk);
|
10188
|
+
length += chunk.length;
|
10243
10189
|
}
|
10244
10190
|
|
10245
|
-
|
10246
|
-
|
10247
|
-
|
10248
|
-
const {
|
10249
|
-
maxBuffer
|
10250
|
-
} = options;
|
10251
|
-
const stream = bufferStream(options);
|
10252
|
-
await new Promise((resolve, reject) => {
|
10253
|
-
const rejectPromise = error => {
|
10254
|
-
// Don't retrieve an oversized buffer.
|
10255
|
-
if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {
|
10256
|
-
error.bufferedData = stream.getBufferedValue();
|
10257
|
-
}
|
10258
|
-
|
10259
|
-
reject(error);
|
10260
|
-
};
|
10261
|
-
|
10262
|
-
(async () => {
|
10263
|
-
try {
|
10264
|
-
await streamPipelinePromisified(inputStream, stream);
|
10265
|
-
resolve();
|
10266
|
-
} catch (error) {
|
10267
|
-
rejectPromise(error);
|
10268
|
-
}
|
10269
|
-
})();
|
10270
|
-
|
10271
|
-
stream.on('data', () => {
|
10272
|
-
if (stream.getBufferedLength() > maxBuffer) {
|
10273
|
-
rejectPromise(new MaxBufferError());
|
10274
|
-
}
|
10275
|
-
});
|
10276
|
-
});
|
10277
|
-
return stream.getBufferedValue();
|
10278
|
-
}
|
10279
|
-
|
10280
|
-
var getStream_1 = getStream;
|
10281
|
-
|
10282
|
-
var buffer = (stream, options) => getStream(stream, Object.assign({}, options, {
|
10283
|
-
encoding: 'buffer'
|
10284
|
-
}));
|
10285
|
-
|
10286
|
-
var array = (stream, options) => getStream(stream, Object.assign({}, options, {
|
10287
|
-
array: true
|
10288
|
-
}));
|
10289
|
-
|
10290
|
-
var MaxBufferError_1 = MaxBufferError;
|
10291
|
-
getStream_1.buffer = buffer;
|
10292
|
-
getStream_1.array = array;
|
10293
|
-
getStream_1.MaxBufferError = MaxBufferError_1;
|
10191
|
+
return Buffer.concat(result, length);
|
10192
|
+
};
|
10193
|
+
getStdin.buffer = buffer;
|
10294
10194
|
|
10295
10195
|
var vendors = [
|
10296
10196
|
{
|
@@ -10502,25 +10402,18 @@ var vendors = [
|
|
10502
10402
|
}
|
10503
10403
|
];
|
10504
10404
|
|
10505
|
-
var vendors$1 = /*#__PURE__*/Object.freeze({
|
10506
|
-
__proto__: null,
|
10507
|
-
'default': vendors
|
10508
|
-
});
|
10509
|
-
|
10510
|
-
var vendors$2 = getCjsExportFromNamespace(vendors$1);
|
10511
|
-
|
10512
10405
|
var ciInfo = createCommonjsModule(function (module, exports) {
|
10513
10406
|
|
10514
10407
|
var env = process.env; // Used for testing only
|
10515
10408
|
|
10516
10409
|
Object.defineProperty(exports, '_vendors', {
|
10517
|
-
value: vendors
|
10410
|
+
value: vendors.map(function (v) {
|
10518
10411
|
return v.constant;
|
10519
10412
|
})
|
10520
10413
|
});
|
10521
10414
|
exports.name = null;
|
10522
10415
|
exports.isPR = null;
|
10523
|
-
vendors
|
10416
|
+
vendors.forEach(function (vendor) {
|
10524
10417
|
var envs = Array.isArray(vendor.env) ? vendor.env : [vendor.env];
|
10525
10418
|
var isCI = envs.every(function (obj) {
|
10526
10419
|
return checkEnv(obj);
|
@@ -10576,7 +10469,7 @@ var thirdParty = {
|
|
10576
10469
|
cosmiconfig: dist$2.cosmiconfig,
|
10577
10470
|
cosmiconfigSync: dist$2.cosmiconfigSync,
|
10578
10471
|
findParentDir: findParentDir.sync,
|
10579
|
-
|
10472
|
+
getStdin: getStdin,
|
10580
10473
|
isCI: () => ciInfo.isCI
|
10581
10474
|
};
|
10582
10475
|
|
data/package.json
CHANGED
data/src/nodes.js
CHANGED
data/src/nodes/alias.js
CHANGED
@@ -1,32 +1,75 @@
|
|
1
|
-
const {
|
1
|
+
const {
|
2
|
+
addTrailingComment,
|
3
|
+
align,
|
4
|
+
concat,
|
5
|
+
group,
|
6
|
+
hardline,
|
7
|
+
line
|
8
|
+
} = require("../prettier");
|
2
9
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
const
|
9
|
-
path.call(print, "body", index, "body", 0, "body", 0);
|
10
|
+
/* In general, return the printed doc of the argument at the provided index.
|
11
|
+
* Special handling is given for symbol literals that are not bare words, as we
|
12
|
+
* convert those into bare words by just pulling out the ident node.
|
13
|
+
*/
|
14
|
+
function printAliasArgument(path, _opts, print, argIndex) {
|
15
|
+
const node = path.getValue().body[argIndex];
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
if (node.type === "symbol_literal" && node.body[0].type === "symbol") {
|
18
|
+
// If we're going to descend into the symbol literal to grab out the ident
|
19
|
+
// node, then we need to make sure we copy over any comments as well,
|
20
|
+
// otherwise we could accidentally skip printing them.
|
21
|
+
if (node.comments) {
|
22
|
+
node.comments.forEach((comment) => {
|
23
|
+
addTrailingComment(node.body[0].body[0], comment);
|
24
|
+
});
|
25
|
+
}
|
14
26
|
|
15
|
-
|
16
|
-
if (usingSymbols(path)) {
|
17
|
-
return join(" ", [
|
18
|
-
identFromSymbol(path, print, 0),
|
19
|
-
identFromSymbol(path, print, 1)
|
20
|
-
]);
|
27
|
+
return path.call(print, "body", argIndex, "body", 0, "body", 0);
|
21
28
|
}
|
22
|
-
return join(" ", path.map(print, "body"));
|
23
|
-
};
|
24
29
|
|
25
|
-
|
26
|
-
|
30
|
+
return path.call(print, "body", argIndex);
|
31
|
+
}
|
32
|
+
|
33
|
+
/* The `alias` keyword is used to make a method respond to another name as well
|
34
|
+
* as the current one. For example, to get the method `foo` to also respond to
|
35
|
+
* `bar`, you would:
|
36
|
+
*
|
37
|
+
* alias bar foo
|
38
|
+
*
|
39
|
+
* Now, in the current context you can call `bar` and it will execute the `foo`
|
40
|
+
* method.
|
41
|
+
*
|
42
|
+
* When you're aliasing two methods, you can either provide bare words (like the
|
43
|
+
* example above) or you can provide symbols (note that this includes dynamic
|
44
|
+
* symbols like :"foo-#{bar}-baz"). In general, to be consistent with the ruby
|
45
|
+
* style guide, we prefer bare words:
|
46
|
+
*
|
47
|
+
* https://github.com/rubocop-hq/ruby-style-guide#alias-method-lexically
|
48
|
+
*
|
49
|
+
* The `alias` node contains two children. The left and right align with the
|
50
|
+
* arguments passed to the keyword. So, for the above example the left would be
|
51
|
+
* the symbol literal `bar` and the right could be the symbol literal `foo`.
|
52
|
+
*/
|
53
|
+
function printAlias(path, opts, print) {
|
54
|
+
const keyword = "alias ";
|
55
|
+
|
56
|
+
const rightSide = concat([
|
57
|
+
// If the left child has any comments, then we need to explicitly break this
|
58
|
+
// into two lines
|
59
|
+
path.getValue().body[0].comments ? hardline : line,
|
60
|
+
printAliasArgument(path, opts, print, 1)
|
61
|
+
]);
|
62
|
+
|
63
|
+
return group(
|
64
|
+
concat([
|
65
|
+
keyword,
|
66
|
+
printAliasArgument(path, opts, print, 0),
|
67
|
+
group(align(keyword, rightSide))
|
68
|
+
])
|
69
|
+
);
|
70
|
+
}
|
27
71
|
|
28
72
|
module.exports = {
|
29
|
-
alias,
|
30
|
-
|
31
|
-
var_alias: alias
|
73
|
+
alias: printAlias,
|
74
|
+
var_alias: printAlias
|
32
75
|
};
|
data/src/nodes/aref.js
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
const { concat, group, indent, join, line, softline } = require("../prettier");
|
2
|
+
|
3
|
+
/* `aref` nodes are when you're pulling a value out of a collection at a
|
4
|
+
* specific index. Put another way, it's any time you're calling the method
|
5
|
+
* `#[]`.
|
6
|
+
*
|
7
|
+
* The nodes usually contains two children, details below in the
|
8
|
+
* `printArefField` function. In some cases, you don't necessarily have the
|
9
|
+
* second child node, because you can call procs with a pretty esoteric syntax.
|
10
|
+
* In the following example, you wouldn't have a second child, and `"foo"` would
|
11
|
+
* be the first child.
|
12
|
+
*
|
13
|
+
* foo[]
|
14
|
+
*/
|
15
|
+
function printAref(path, opts, print) {
|
16
|
+
const indexNode = path.getValue().body[1];
|
17
|
+
|
18
|
+
if (!indexNode) {
|
19
|
+
return concat([path.call(print, "body", 0), "[]"]);
|
20
|
+
}
|
21
|
+
|
22
|
+
return printArefField(path, opts, print);
|
23
|
+
}
|
24
|
+
|
25
|
+
/* `aref_field` nodes are for assigning values into collections at specific
|
26
|
+
* indices. Put another way, it's any time you're calling the method `#[]=`.
|
27
|
+
* The `aref_field` node itself is just the left side of the assignment, and
|
28
|
+
* they're always wrapped in `assign` nodes.
|
29
|
+
*
|
30
|
+
* The nodes always contain two children, the name of the array (usually a
|
31
|
+
* `vcall` node and the index (usually an `args_add_block` node). The
|
32
|
+
* `args_add_block` is one of a couple nodes that has special handling where its
|
33
|
+
* printed form is actually an array to make joining easier.
|
34
|
+
*
|
35
|
+
* So in the following example, `"foo"` is the array and `["bar"]` is the index.
|
36
|
+
*
|
37
|
+
* foo[bar] = baz
|
38
|
+
*/
|
39
|
+
function printArefField(path, opts, print) {
|
40
|
+
const [printedArray, printedIndex] = path.map(print, "body");
|
41
|
+
|
42
|
+
return group(
|
43
|
+
concat([
|
44
|
+
printedArray,
|
45
|
+
"[",
|
46
|
+
indent(concat([softline, join(concat([",", line]), printedIndex)])),
|
47
|
+
concat([softline, "]"])
|
48
|
+
])
|
49
|
+
);
|
50
|
+
}
|
51
|
+
|
52
|
+
module.exports = {
|
53
|
+
aref: printAref,
|
54
|
+
aref_field: printArefField
|
55
|
+
};
|
data/src/nodes/arrays.js
CHANGED
@@ -33,21 +33,6 @@ const getSpecialArrayParts = (path, print, args) =>
|
|
33
33
|
path.call(print, "body", 0, "body", index, "body", 0, "body", 0)
|
34
34
|
);
|
35
35
|
|
36
|
-
const printAref = (path, opts, print) =>
|
37
|
-
group(
|
38
|
-
concat([
|
39
|
-
path.call(print, "body", 0),
|
40
|
-
"[",
|
41
|
-
indent(
|
42
|
-
concat([
|
43
|
-
softline,
|
44
|
-
join(concat([",", line]), path.call(print, "body", 1))
|
45
|
-
])
|
46
|
-
),
|
47
|
-
concat([softline, "]"])
|
48
|
-
])
|
49
|
-
);
|
50
|
-
|
51
36
|
const printSpecialArray = (parts) =>
|
52
37
|
group(
|
53
38
|
concat([
|
@@ -78,14 +63,6 @@ const getElements = (node, elementPath) => {
|
|
78
63
|
};
|
79
64
|
|
80
65
|
module.exports = {
|
81
|
-
aref: (path, opts, print) => {
|
82
|
-
if (!path.getValue().body[1]) {
|
83
|
-
return concat([path.call(print, "body", 0), "[]"]);
|
84
|
-
}
|
85
|
-
|
86
|
-
return printAref(path, opts, print);
|
87
|
-
},
|
88
|
-
aref_field: printAref,
|
89
66
|
array: (path, { addTrailingCommas }, print) => {
|
90
67
|
const args = path.getValue().body[0];
|
91
68
|
|
@@ -120,24 +97,15 @@ module.exports = {
|
|
120
97
|
elements.forEach(({ element, elementPath }, index) => {
|
121
98
|
const isInner = index !== elements.length - 1;
|
122
99
|
|
123
|
-
|
124
|
-
const isSquigglyHeredoc =
|
125
|
-
element.type === "string_literal" && element.body[0].type === "heredoc";
|
126
|
-
|
127
|
-
if (isStraightHeredoc || isSquigglyHeredoc) {
|
128
|
-
const heredocNode = isStraightHeredoc ? element : element.body[0];
|
129
|
-
const heredocPath = [print].concat(elementPath);
|
130
|
-
|
131
|
-
if (isSquigglyHeredoc) {
|
132
|
-
heredocPath.push("body", 0);
|
133
|
-
}
|
134
|
-
|
100
|
+
if (element.type === "heredoc") {
|
135
101
|
normalDocs.push(
|
136
|
-
|
102
|
+
element.beging,
|
137
103
|
isInner || addTrailingCommas ? "," : "",
|
138
104
|
literalline,
|
139
|
-
concat(
|
140
|
-
|
105
|
+
concat(
|
106
|
+
path.map.apply(path, [print].concat(elementPath).concat("body"))
|
107
|
+
),
|
108
|
+
element.ending,
|
141
109
|
isInner ? line : ""
|
142
110
|
);
|
143
111
|
} else {
|