You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.8 KiB
43 lines
1.8 KiB
'use strict'; |
|
|
|
var GetIntrinsic = require('get-intrinsic'); |
|
var $concat = GetIntrinsic('%Array.prototype.concat%'); |
|
|
|
var callBind = require('call-bind'); |
|
|
|
var callBound = require('call-bound'); |
|
var $slice = callBound('Array.prototype.slice'); |
|
|
|
var hasSymbols = require('has-symbols/shams')(); |
|
var isConcatSpreadable = hasSymbols && Symbol.isConcatSpreadable; |
|
|
|
/** @type {never[]} */ var empty = []; |
|
var $concatApply = isConcatSpreadable ? callBind.apply($concat, empty) : null; |
|
|
|
// eslint-disable-next-line no-extra-parens |
|
var isArray = isConcatSpreadable ? /** @type {(value: unknown) => value is unknown[]} */ (require('isarray')) : null; |
|
|
|
/** @type {import('.')} */ |
|
module.exports = isConcatSpreadable |
|
// eslint-disable-next-line no-unused-vars |
|
? function safeArrayConcat(item) { |
|
for (var i = 0; i < arguments.length; i += 1) { |
|
/** @type {typeof item} */ var arg = arguments[i]; |
|
// @ts-expect-error ts(2538) see https://github.com/microsoft/TypeScript/issues/9998#issuecomment-1890787975; works if `const` |
|
if (arg && typeof arg === 'object' && typeof arg[isConcatSpreadable] === 'boolean') { |
|
// @ts-expect-error ts(7015) TS doesn't yet support Symbol indexing |
|
if (!empty[isConcatSpreadable]) { |
|
// @ts-expect-error ts(7015) TS doesn't yet support Symbol indexing |
|
empty[isConcatSpreadable] = true; |
|
} |
|
// @ts-expect-error ts(2721) ts(18047) not sure why TS can't figure out this can't be null |
|
var arr = isArray(arg) ? $slice(arg) : [arg]; |
|
// @ts-expect-error ts(7015) TS can't handle expandos on an array |
|
arr[isConcatSpreadable] = true; // shadow the property. TODO: use [[Define]] |
|
arguments[i] = arr; |
|
} |
|
} |
|
// @ts-expect-error ts(2345) https://github.com/microsoft/TypeScript/issues/57164 TS doesn't understand that apply can take an arguments object |
|
return $concatApply(arguments); |
|
} |
|
: callBind($concat, empty);
|
|
|