flow-parser 0.321.0 → 0.322.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.
Files changed (35) hide show
  1. package/dist/FlowParser.js +3 -53
  2. package/dist/FlowParserDeserializer.js +3 -41
  3. package/dist/FlowParserNodeDeserializers.js +0 -7
  4. package/dist/FlowParserWASM.js +1 -1
  5. package/dist/HermesParserDecodeUTF8String.js +0 -9
  6. package/dist/ParserOptions.js +1 -2
  7. package/dist/babel/TransformESTreeToBabel.js +9 -157
  8. package/dist/estree/StripFlowTypes.js +0 -26
  9. package/dist/estree/StripFlowTypesForBabel.js +0 -24
  10. package/dist/estree/TransformComponentSyntax.js +0 -87
  11. package/dist/estree/TransformEnumSyntax.js +0 -12
  12. package/dist/estree/TransformMatchSyntax.js +3 -99
  13. package/dist/estree/TransformRecordSyntax.js +3 -31
  14. package/dist/getModuleDocblock.js +0 -21
  15. package/dist/index.js +25 -99
  16. package/dist/transform/SimpleTransform.js +0 -21
  17. package/dist/transform/astArrayMutationHelpers.js +0 -9
  18. package/dist/transform/astNodeMutationHelpers.js +4 -26
  19. package/dist/transform/print/comments/comments.js +2 -51
  20. package/dist/transform/print/comments/prettier/common/util.js +0 -49
  21. package/dist/transform/print/comments/prettier/language-js/comments.js +0 -111
  22. package/dist/transform/print/comments/prettier/language-js/loc.js +0 -6
  23. package/dist/transform/print/comments/prettier/language-js/printer-estree.js +0 -3
  24. package/dist/transform/print/comments/prettier/language-js/utils.js +0 -20
  25. package/dist/transform/print/comments/prettier/main/comments.js +2 -63
  26. package/dist/transform/print/comments/prettier/utils/get-last.js +0 -1
  27. package/dist/transform/print/print.js +6 -22
  28. package/dist/traverse/SimpleTraverser.js +2 -22
  29. package/dist/traverse/getVisitorKeys.js +3 -9
  30. package/dist/utils/Builders.js +1 -17
  31. package/dist/utils/GenID.js +0 -7
  32. package/dist/utils/createSyntaxError.js +0 -1
  33. package/dist/utils/isReservedWord.js +0 -2
  34. package/dist/utils/mutateESTreeASTForPrettier.js +6 -21
  35. package/package.json +2 -2
@@ -4,66 +4,50 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.transformProgram = transformProgram;
7
-
8
7
  var _flowEstree = require("flow-estree");
9
-
10
8
  var _SimpleTransform = require("../transform/SimpleTransform");
11
-
12
9
  var _astNodeMutationHelpers = require("../transform/astNodeMutationHelpers");
13
-
14
10
  var _Builders = require("../utils/Builders");
15
-
16
11
  var _isReservedWord = _interopRequireDefault(require("../utils/isReservedWord"));
17
-
18
12
  var _GenID = _interopRequireDefault(require("../utils/GenID"));
19
-
20
- function _interopRequireDefault(obj) {
21
- return obj && obj.__esModule ? obj : {
22
- default: obj
13
+ function _interopRequireDefault(e) {
14
+ return e && e.__esModule ? e : {
15
+ default: e
23
16
  };
24
17
  }
25
-
26
18
  function nameOfKey(key) {
27
19
  switch (key.type) {
28
20
  case 'Identifier':
29
21
  return key.name;
30
-
31
22
  case 'Literal':
32
23
  if ((0, _flowEstree.isBigIntLiteral)(key)) {
33
24
  return key.bigint;
34
25
  }
35
-
36
26
  return String(key.value);
37
27
  }
38
28
  }
39
-
40
29
  function mapRecordDeclaration(genID, node) {
41
30
  const ownProperties = [];
42
31
  const staticProperties = [];
43
32
  const methods = [];
44
33
  const staticMethods = [];
45
-
46
34
  for (const element of node.body.elements) {
47
35
  switch (element.type) {
48
36
  case 'RecordDeclarationProperty':
49
37
  ownProperties.push(element);
50
38
  break;
51
-
52
39
  case 'RecordDeclarationStaticProperty':
53
40
  staticProperties.push(element);
54
41
  break;
55
-
56
42
  case 'MethodDefinition':
57
43
  if (element.static) {
58
44
  staticMethods.push(element);
59
45
  } else {
60
46
  methods.push(element);
61
47
  }
62
-
63
48
  break;
64
49
  }
65
50
  }
66
-
67
51
  const reservedPropNames = new Map();
68
52
  const constructorParam = {
69
53
  type: 'ObjectPattern',
@@ -73,25 +57,21 @@ function mapRecordDeclaration(genID, node) {
73
57
  defaultValue
74
58
  } = prop;
75
59
  const keyName = nameOfKey(key);
76
-
77
60
  const getValue = bindingIdent => defaultValue != null ? {
78
61
  type: 'AssignmentPattern',
79
62
  left: bindingIdent,
80
63
  right: (0, _astNodeMutationHelpers.deepCloneNode)(defaultValue),
81
64
  ...(0, _Builders.etc)()
82
65
  } : bindingIdent;
83
-
84
66
  switch (key.type) {
85
67
  case 'Identifier':
86
68
  {
87
69
  const needsNewBinding = (0, _isReservedWord.default)(keyName);
88
70
  const bindingName = needsNewBinding ? genID.id() : keyName;
89
71
  const bindingIdent = (0, _Builders.ident)(bindingName);
90
-
91
72
  if (needsNewBinding) {
92
73
  reservedPropNames.set(keyName, bindingName);
93
74
  }
94
-
95
75
  if (needsNewBinding) {
96
76
  return {
97
77
  type: 'Property',
@@ -118,7 +98,6 @@ function mapRecordDeclaration(genID, node) {
118
98
  };
119
99
  }
120
100
  }
121
-
122
101
  case 'Literal':
123
102
  {
124
103
  const bindingName = genID.id();
@@ -158,7 +137,6 @@ function mapRecordDeclaration(genID, node) {
158
137
  key
159
138
  }) => {
160
139
  var _reservedPropNames$ge;
161
-
162
140
  const keyName = nameOfKey(key);
163
141
  const bindingIdent = (0, _Builders.ident)((_reservedPropNames$ge = reservedPropNames.get(keyName)) != null ? _reservedPropNames$ge : keyName);
164
142
  const object = {
@@ -237,7 +215,6 @@ function mapRecordDeclaration(genID, node) {
237
215
  ...(0, _Builders.etc)()
238
216
  };
239
217
  }
240
-
241
218
  function mapRecordExpression(node) {
242
219
  const obj = {
243
220
  type: 'ObjectExpression',
@@ -252,7 +229,6 @@ function mapRecordExpression(node) {
252
229
  ...(0, _Builders.etc)()
253
230
  };
254
231
  }
255
-
256
232
  function transformProgram(program, _options) {
257
233
  const genID = new _GenID.default('r');
258
234
  return _SimpleTransform.SimpleTransform.transformProgram(program, {
@@ -262,22 +238,18 @@ function transformProgram(program, _options) {
262
238
  {
263
239
  return mapRecordDeclaration(genID, node);
264
240
  }
265
-
266
241
  case 'RecordExpression':
267
242
  {
268
243
  return mapRecordExpression(node);
269
244
  }
270
-
271
245
  case 'Identifier':
272
246
  {
273
247
  genID.addUsage(node.name);
274
248
  return node;
275
249
  }
276
-
277
250
  default:
278
251
  return node;
279
252
  }
280
253
  }
281
-
282
254
  });
283
255
  }
@@ -6,80 +6,59 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getModuleDocblock = getModuleDocblock;
7
7
  exports.parseDocblockString = parseDocblockString;
8
8
  const DIRECTIVE_REGEX = /^\s*@([a-zA-Z0-9_-]+)( +.+)?$/;
9
-
10
9
  function parseDocblockString(docblock) {
11
10
  const directiveLines = docblock.split('\n').map(line => line.trimStart().replace(/^\* ?/, '').trim()).filter(line => line.startsWith('@'));
12
11
  const directives = Object.create(null);
13
-
14
12
  for (const line of directiveLines) {
15
13
  var _match$;
16
-
17
14
  const match = DIRECTIVE_REGEX.exec(line);
18
-
19
15
  if (match == null) {
20
16
  continue;
21
17
  }
22
-
23
18
  const name = match[1];
24
19
  const value = ((_match$ = match[2]) != null ? _match$ : '').trim();
25
-
26
20
  if (directives[name]) {
27
21
  directives[name].push(value);
28
22
  } else {
29
23
  directives[name] = [value];
30
24
  }
31
25
  }
32
-
33
26
  return directives;
34
27
  }
35
-
36
28
  function getModuleDocblock(hermesProgram) {
37
29
  const docblockNode = (() => {
38
30
  if (hermesProgram.type !== 'Program') {
39
31
  return null;
40
32
  }
41
-
42
33
  const program = hermesProgram;
43
-
44
34
  if (program.comments.length === 0) {
45
35
  return null;
46
36
  }
47
-
48
37
  const firstComment = (() => {
49
38
  const first = program.comments[0];
50
-
51
39
  if (first.type === 'Block') {
52
40
  return first;
53
41
  }
54
-
55
42
  if (program.comments.length === 1) {
56
43
  return null;
57
44
  }
58
-
59
45
  const second = program.comments[1];
60
-
61
46
  if (first.type === 'Line' && first.range[0] === 0 && second.type === 'Block') {
62
47
  return second;
63
48
  }
64
-
65
49
  return null;
66
50
  })();
67
-
68
51
  if (firstComment == null) {
69
52
  return null;
70
53
  }
71
-
72
54
  if (program.body.length > 0 && program.body[0].range[0] < firstComment.range[0]) {
73
55
  return null;
74
56
  }
75
-
76
57
  return firstComment;
77
58
  })();
78
-
79
59
  if (docblockNode == null) {
80
60
  return null;
81
61
  }
82
-
83
62
  return {
84
63
  directives: parseDocblockString(docblockNode.value),
85
64
  comment: docblockNode
package/dist/index.js CHANGED
@@ -13,208 +13,134 @@ var _exportNames = {
13
13
  };
14
14
  exports.mutateESTreeASTForPrettier = exports.astNodeMutationHelpers = exports.astArrayMutationHelpers = exports.Transforms = void 0;
15
15
  exports.parse = parse;
16
-
17
16
  var FlowParser = _interopRequireWildcard(require("./FlowParser"));
18
-
19
17
  var _ESTreeVisitorKeys = _interopRequireDefault(require("./generated/ESTreeVisitorKeys"));
20
-
21
18
  exports.FlowVisitorKeys = _ESTreeVisitorKeys.default;
22
-
23
19
  var TransformComponentSyntax = _interopRequireWildcard(require("./estree/TransformComponentSyntax"));
24
-
25
20
  var TransformEnumSyntax = _interopRequireWildcard(require("./estree/TransformEnumSyntax"));
26
-
27
21
  var TransformMatchSyntax = _interopRequireWildcard(require("./estree/TransformMatchSyntax"));
28
-
29
22
  var TransformRecordSyntax = _interopRequireWildcard(require("./estree/TransformRecordSyntax"));
30
-
31
23
  var StripFlowTypesForBabel = _interopRequireWildcard(require("./estree/StripFlowTypesForBabel"));
32
-
33
24
  var TransformESTreeToBabel = _interopRequireWildcard(require("./babel/TransformESTreeToBabel"));
34
-
35
25
  var StripFlowTypes = _interopRequireWildcard(require("./estree/StripFlowTypes"));
36
-
37
26
  var _ParserOptions = require("./ParserOptions");
38
-
39
27
  Object.keys(_ParserOptions).forEach(function (key) {
40
28
  if (key === "default" || key === "__esModule") return;
41
29
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
42
30
  if (key in exports && exports[key] === _ParserOptions[key]) return;
43
31
  exports[key] = _ParserOptions[key];
44
32
  });
45
-
46
33
  var _SimpleTraverser = require("./traverse/SimpleTraverser");
47
-
48
34
  Object.keys(_SimpleTraverser).forEach(function (key) {
49
35
  if (key === "default" || key === "__esModule") return;
50
36
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
51
37
  if (key in exports && exports[key] === _SimpleTraverser[key]) return;
52
38
  exports[key] = _SimpleTraverser[key];
53
39
  });
54
-
55
40
  var _SimpleTransform = require("./transform/SimpleTransform");
56
-
57
41
  Object.keys(_SimpleTransform).forEach(function (key) {
58
42
  if (key === "default" || key === "__esModule") return;
59
43
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
60
44
  if (key in exports && exports[key] === _SimpleTransform[key]) return;
61
45
  exports[key] = _SimpleTransform[key];
62
46
  });
63
-
64
47
  var _getVisitorKeys = require("./traverse/getVisitorKeys");
65
-
66
48
  Object.keys(_getVisitorKeys).forEach(function (key) {
67
49
  if (key === "default" || key === "__esModule") return;
68
50
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
69
51
  if (key in exports && exports[key] === _getVisitorKeys[key]) return;
70
52
  exports[key] = _getVisitorKeys[key];
71
53
  });
72
-
73
54
  var _astArrayMutationHelpers = _interopRequireWildcard(require("./transform/astArrayMutationHelpers"));
74
-
75
55
  exports.astArrayMutationHelpers = _astArrayMutationHelpers;
76
-
77
56
  var _astNodeMutationHelpers = _interopRequireWildcard(require("./transform/astNodeMutationHelpers"));
78
-
79
57
  exports.astNodeMutationHelpers = _astNodeMutationHelpers;
80
-
81
58
  var _mutateESTreeASTForPrettier = _interopRequireDefault(require("./utils/mutateESTreeASTForPrettier"));
82
-
83
59
  exports.mutateESTreeASTForPrettier = _mutateESTreeASTForPrettier.default;
84
-
85
- function _interopRequireDefault(obj) {
86
- return obj && obj.__esModule ? obj : {
87
- default: obj
60
+ function _interopRequireDefault(e) {
61
+ return e && e.__esModule ? e : {
62
+ default: e
88
63
  };
89
64
  }
90
-
91
- function _getRequireWildcardCache(nodeInterop) {
92
- if (typeof WeakMap !== "function") return null;
93
- var cacheBabelInterop = new WeakMap();
94
- var cacheNodeInterop = new WeakMap();
95
- return (_getRequireWildcardCache = function (nodeInterop) {
96
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
97
- })(nodeInterop);
98
- }
99
-
100
- function _interopRequireWildcard(obj, nodeInterop) {
101
- if (!nodeInterop && obj && obj.__esModule) {
102
- return obj;
103
- }
104
-
105
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
106
- return {
107
- default: obj
108
- };
109
- }
110
-
111
- var cache = _getRequireWildcardCache(nodeInterop);
112
-
113
- if (cache && cache.has(obj)) {
114
- return cache.get(obj);
115
- }
116
-
117
- var newObj = {};
118
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
119
-
120
- for (var key in obj) {
121
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
122
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
123
-
124
- if (desc && (desc.get || desc.set)) {
125
- Object.defineProperty(newObj, key, desc);
126
- } else {
127
- newObj[key] = obj[key];
128
- }
65
+ function _interopRequireWildcard(e, t) {
66
+ if ("function" == typeof WeakMap) var r = new WeakMap(),
67
+ n = new WeakMap();
68
+ return (_interopRequireWildcard = function (e, t) {
69
+ if (!t && e && e.__esModule) return e;
70
+ var o,
71
+ i,
72
+ f = {
73
+ __proto__: null,
74
+ default: e
75
+ };
76
+ if (null === e || "object" != typeof e && "function" != typeof e) return f;
77
+ if (o = t ? n : r) {
78
+ if (o.has(e)) return o.get(e);
79
+ o.set(e, f);
129
80
  }
130
- }
131
-
132
- newObj.default = obj;
133
-
134
- if (cache) {
135
- cache.set(obj, newObj);
136
- }
137
-
138
- return newObj;
81
+ for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]);
82
+ return f;
83
+ })(e, t);
139
84
  }
140
-
141
85
  const DEFAULTS = {
142
86
  flow: 'detect'
143
87
  };
144
-
145
88
  function getOptions(opts) {
146
- const options = { ...DEFAULTS,
89
+ const options = {
90
+ ...DEFAULTS,
147
91
  ...(opts != null ? opts : {})
148
92
  };
149
-
150
93
  if (options.flow !== 'all' && options.flow !== 'detect') {
151
94
  throw new Error('flow option must be "all" or "detect"');
152
95
  }
153
-
154
96
  if (options.sourceType === 'unambiguous') {
155
97
  delete options.sourceType;
156
98
  } else if (options.sourceType != null && options.sourceType !== 'script' && options.sourceType !== 'module') {
157
99
  throw new Error('sourceType option must be "script", "module", or "unambiguous" if set');
158
100
  }
159
-
160
101
  if (options.enableExperimentalComponentSyntax == null) {
161
102
  options.enableExperimentalComponentSyntax = true;
162
103
  }
163
-
164
104
  if (options.enableExperimentalFlowMatchSyntax == null) {
165
105
  options.enableExperimentalFlowMatchSyntax = true;
166
106
  }
167
-
168
107
  if (options.enableExperimentalFlowRecordSyntax == null) {
169
108
  options.enableExperimentalFlowRecordSyntax = true;
170
109
  }
171
-
172
110
  options.enableRecords = options.enableExperimentalFlowRecordSyntax;
173
-
174
111
  if (options.enableEnums == null) {
175
112
  options.enableEnums = true;
176
113
  }
177
-
178
114
  if (options.enableExperimentalDecorators == null) {
179
115
  options.enableExperimentalDecorators = true;
180
116
  }
181
-
182
117
  options.tokens = options.tokens === true;
183
118
  options.allowReturnOutsideFunction = options.allowReturnOutsideFunction === true;
184
119
  return options;
185
120
  }
186
-
187
121
  function parse(code, opts) {
188
122
  var _options$transformOpt, _options$transformOpt2;
189
-
190
123
  const options = getOptions(opts);
191
-
192
124
  if (options.flow === 'all') {
193
125
  options.enableTypes = true;
194
126
  } else {
195
127
  options.enableTypesPragmaDetection = true;
196
128
  }
197
-
198
129
  const estreeAST = FlowParser.parse(code, options);
199
-
200
130
  if (options.babel !== true) {
201
131
  return estreeAST;
202
132
  }
203
-
204
133
  const loweredESTreeAST = [(_options$transformOpt = options.transformOptions) != null && (_options$transformOpt2 = _options$transformOpt.TransformEnumSyntax) != null && _options$transformOpt2.enable ? TransformEnumSyntax.transformProgram : null, TransformMatchSyntax.transformProgram, TransformComponentSyntax.transformProgram, TransformRecordSyntax.transformProgram, StripFlowTypesForBabel.transformProgram].reduce((ast, transform) => {
205
134
  var _transform;
206
-
207
135
  return (_transform = transform == null ? void 0 : transform(ast, options)) != null ? _transform : ast;
208
136
  }, estreeAST);
209
137
  return TransformESTreeToBabel.transformProgram(loweredESTreeAST, options);
210
138
  }
211
-
212
- const Transforms = {
139
+ const Transforms = exports.Transforms = {
213
140
  transformEnumSyntax: TransformEnumSyntax.transformProgram,
214
141
  transformMatchSyntax: TransformMatchSyntax.transformProgram,
215
142
  transformComponentSyntax: TransformComponentSyntax.transformProgram,
216
143
  transformRecordSyntax: TransformRecordSyntax.transformProgram,
217
144
  stripFlowTypesForBabel: StripFlowTypesForBabel.transformProgram,
218
145
  stripFlowTypes: StripFlowTypes.transformProgram
219
- };
220
- exports.Transforms = Transforms;
146
+ };
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.SimpleTransform = void 0;
7
-
8
7
  var _SimpleTraverser = require("../traverse/SimpleTraverser");
9
-
10
8
  var _astNodeMutationHelpers = require("./astNodeMutationHelpers");
11
-
12
9
  function setParentPointer(node, parent) {
13
10
  if (parent != null) {
14
11
  if (Array.isArray(node)) {
@@ -20,34 +17,27 @@ function setParentPointer(node, parent) {
20
17
  }
21
18
  }
22
19
  }
23
-
24
20
  class SimpleTransform {
25
21
  transform(rootNode, options) {
26
22
  let resultRootNode = rootNode;
27
-
28
23
  _SimpleTraverser.SimpleTraverser.traverse(rootNode, {
29
24
  enter: (node, parent) => {
30
25
  setParentPointer(node, parent);
31
26
  const resultNode = options.transform(node);
32
-
33
27
  if (resultNode !== node) {
34
28
  let traversedResultNode = null;
35
-
36
29
  if (resultNode != null) {
37
30
  setParentPointer(resultNode, parent);
38
-
39
31
  if (Array.isArray(resultNode)) {
40
32
  traversedResultNode = resultNode.map(item => this.transform(item, options)).filter(item => item != null);
41
33
  } else {
42
34
  traversedResultNode = this.transform(resultNode, options);
43
35
  }
44
36
  }
45
-
46
37
  if (parent == null) {
47
38
  if (node !== rootNode) {
48
39
  throw new Error('SimpleTransform infra error: Parent not set on non root node, this should not be possible');
49
40
  }
50
-
51
41
  if (Array.isArray(traversedResultNode)) {
52
42
  throw new Error('SimpleTransform: invalid array result for root node');
53
43
  } else {
@@ -59,37 +49,26 @@ class SimpleTransform {
59
49
  (0, _astNodeMutationHelpers.replaceNodeOnParent)(node, parent, traversedResultNode, options.visitorKeys);
60
50
  setParentPointer(traversedResultNode, parent);
61
51
  }
62
-
63
52
  throw _SimpleTraverser.SimpleTraverser.Skip;
64
53
  }
65
54
  },
66
-
67
55
  leave(_node) {},
68
-
69
56
  visitorKeys: options.visitorKeys
70
57
  });
71
-
72
58
  return resultRootNode;
73
59
  }
74
-
75
60
  static transform(node, options) {
76
61
  return new SimpleTransform().transform(node, options);
77
62
  }
78
-
79
63
  static transformProgram(program, options) {
80
64
  const result = SimpleTransform.transform(program, options);
81
-
82
65
  if ((result == null ? void 0 : result.type) === 'Program') {
83
66
  return result;
84
67
  }
85
-
86
68
  throw new Error('SimpleTransform.transformProgram: Expected program node.');
87
69
  }
88
-
89
70
  static nodeWith(node, overrideProps, visitorKeys) {
90
71
  return (0, _astNodeMutationHelpers.nodeWith)(node, overrideProps, visitorKeys);
91
72
  }
92
-
93
73
  }
94
-
95
74
  exports.SimpleTransform = SimpleTransform;
@@ -7,45 +7,36 @@ exports.arrayIsEqual = arrayIsEqual;
7
7
  exports.insertInArray = insertInArray;
8
8
  exports.removeFromArray = removeFromArray;
9
9
  exports.replaceInArray = replaceInArray;
10
-
11
10
  function assertArrayBounds(array, index) {
12
11
  if (index < 0 || index >= array.length) {
13
12
  throw new Error(`Invalid Mutation: Tried to mutate an elements array with an out of bounds index. Index: ${index}, Array Size: ${array.length}`);
14
13
  }
15
14
  }
16
-
17
15
  function arrayIsEqual(a1, a2) {
18
16
  if (a1 === a2) {
19
17
  return true;
20
18
  }
21
-
22
19
  if (a1.length !== a2.length) {
23
20
  return false;
24
21
  }
25
-
26
22
  for (let i = 0; i < a1.length; i++) {
27
23
  if (a1[i] !== a2[i]) {
28
24
  return false;
29
25
  }
30
26
  }
31
-
32
27
  return true;
33
28
  }
34
-
35
29
  function insertInArray(array, index, elements) {
36
30
  if (index === array.length) {
37
31
  return array.concat(elements);
38
32
  }
39
-
40
33
  assertArrayBounds(array, index);
41
34
  return array.slice(0, index).concat(elements).concat(array.slice(index));
42
35
  }
43
-
44
36
  function removeFromArray(array, index) {
45
37
  assertArrayBounds(array, index);
46
38
  return [...array.slice(0, index), ...array.slice(index + 1)];
47
39
  }
48
-
49
40
  function replaceInArray(array, index, elements) {
50
41
  assertArrayBounds(array, index);
51
42
  return array.slice(0, index).concat(elements).concat(array.slice(index + 1));