forked from zicloud/bigscreen_admin
Initial commit
commit
de68911544
@ -0,0 +1,18 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# 空格替代Tab缩进在各种编辑工具下效果一致
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.{json,yml,yaml}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
insert_final_newline = false
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
### 使用版本(未按照模板填写直接删除)
|
||||||
|
|
||||||
|
- jdk版本(带上尾号): 例如 1.8.0_202
|
||||||
|
- 框架版本(项目启动时输出的版本号): 例如 4.4.0
|
||||||
|
- 其他依赖版本(你觉得有必要的):
|
||||||
|
|
||||||
|
### 问题前提
|
||||||
|
|
||||||
|
> 功能不好用 不会用 是否已经看过项目文档
|
||||||
|
> 项目运行报错 是否已经拿着报错信息去百度 常见报错百度百度足以
|
||||||
|
> 是否搜索过其他issue 一些已经解决的问题 会在issue内留下解决方法
|
||||||
|
> 无法线上解决或者与框架无关的问题的欢迎加VIP群跟作者一对一谈
|
||||||
|
|
||||||
|
### 异常模块
|
||||||
|
|
||||||
|
> 此报错都涉及到那些系统模块
|
||||||
|
|
||||||
|
例如 ziyun-system ziyun-auth 等等
|
||||||
|
|
||||||
|
### 问题描述
|
||||||
|
|
||||||
|
> 越详细越容易直击问题所在
|
||||||
|
|
||||||
|
已知: XXX功能不好用 或 XXX数据不正常 等等
|
||||||
|
|
||||||
|
### 希望结果
|
||||||
|
|
||||||
|
> 想知道你觉得怎么样是正常或者合理的
|
||||||
|
|
||||||
|
希望功能可以有XXX结果 或者 XXX现象
|
||||||
|
|
||||||
|
### 重现步骤
|
||||||
|
|
||||||
|
> 作者并不知道这个问题是如何出现的
|
||||||
|
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- 3
|
||||||
|
|
||||||
|
### 相关代码与报错信息(请勿发混乱格式)
|
||||||
|
|
||||||
|
> 代码可按照如下形式提供或者截图均可 越详细越好
|
||||||
|
> 大多数问题都是 代码编写错误问题 逻辑问题 或者用法错误等问题
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class XXX {
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: ZiYun-Vue-Plus 文档中心
|
||||||
|
url: https://plus-doc.dromara.org
|
||||||
|
about: 提供 ZiYun-Vue-Plus 搭建使用指南、平台基本开发使用方式、介绍、基础知识和常见问题解答
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
### 更改目的 解决了什么问题(请提交到dev分支)
|
||||||
|
|
||||||
|
|
||||||
|
### 改动逻辑 这么写的思路(让作者更好的理解你的意图)
|
||||||
|
|
||||||
|
|
||||||
|
### 测试 都做了哪些测试(未经过测试不采纳)
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
######################################################################
|
||||||
|
# Build Tools
|
||||||
|
|
||||||
|
.gradle
|
||||||
|
/build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# IDE
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### JRebel ###
|
||||||
|
rebel.xml
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
nbproject/private/
|
||||||
|
build/*
|
||||||
|
nbbuild/
|
||||||
|
nbdist/
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Others
|
||||||
|
*.log
|
||||||
|
*.xml.versionsBackup
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
!*/build/*.java
|
||||||
|
!*/build/*.html
|
||||||
|
!*/build/*.xml
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="ziyun-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
|
||||||
|
<deployment type="dockerfile">
|
||||||
|
<settings>
|
||||||
|
<option name="imageTag" value="ziyun/ziyun-monitor-admin:4.8.2" />
|
||||||
|
<option name="buildOnly" value="true" />
|
||||||
|
<option name="sourceFilePath" value="ziyun-extend/ziyun-monitor-admin/Dockerfile" />
|
||||||
|
</settings>
|
||||||
|
</deployment>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="ziyun-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
|
||||||
|
<deployment type="dockerfile">
|
||||||
|
<settings>
|
||||||
|
<option name="imageTag" value="ziyun/ziyun-server:4.8.2" />
|
||||||
|
<option name="buildOnly" value="true" />
|
||||||
|
<option name="sourceFilePath" value="ziyun-admin/Dockerfile" />
|
||||||
|
</settings>
|
||||||
|
</deployment>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="ziyun-xxl-job-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
|
||||||
|
<deployment type="dockerfile">
|
||||||
|
<settings>
|
||||||
|
<option name="imageTag" value="ziyun/ziyun-xxl-job-admin:4.8.2" />
|
||||||
|
<option name="buildOnly" value="true" />
|
||||||
|
<option name="sourceFilePath" value="ziyun-extend/ziyun-xxl-job-admin/Dockerfile" />
|
||||||
|
</settings>
|
||||||
|
</deployment>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019 ZiYun-Vue-Plus
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"name": "RuoYi-Vue-Plus-4.X",
|
||||||
|
"lockfileVersion": 2,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"node_modules/eventemitter3": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz",
|
||||||
|
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
|
||||||
|
},
|
||||||
|
"node_modules/fast-diff": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
|
||||||
|
},
|
||||||
|
"node_modules/lodash-es": {
|
||||||
|
"version": "4.17.21",
|
||||||
|
"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
|
||||||
|
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
|
||||||
|
},
|
||||||
|
"node_modules/lodash.clonedeep": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
||||||
|
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
|
||||||
|
},
|
||||||
|
"node_modules/lodash.isequal": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
|
||||||
|
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
|
||||||
|
},
|
||||||
|
"node_modules/parchment": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/parchment/-/parchment-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A=="
|
||||||
|
},
|
||||||
|
"node_modules/quill": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/quill/-/quill-2.0.3.tgz",
|
||||||
|
"integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==",
|
||||||
|
"dependencies": {
|
||||||
|
"eventemitter3": "^5.0.1",
|
||||||
|
"lodash-es": "^4.17.21",
|
||||||
|
"parchment": "^3.0.0",
|
||||||
|
"quill-delta": "^5.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"npm": ">=8.2.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/quill-delta": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-5.1.0.tgz",
|
||||||
|
"integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-diff": "^1.3.0",
|
||||||
|
"lodash.clonedeep": "^4.5.0",
|
||||||
|
"lodash.isequal": "^4.5.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Arnout Kazemier
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
# EventEmitter3
|
||||||
|
|
||||||
|
[](https://www.npmjs.com/package/eventemitter3)[](https://github.com/primus/eventemitter3/actions?query=workflow%3ACI+branch%3Amaster)[](https://coveralls.io/r/primus/eventemitter3?branch=master)
|
||||||
|
|
||||||
|
[](https://saucelabs.com/u/eventemitter3)
|
||||||
|
|
||||||
|
EventEmitter3 is a high performance EventEmitter. It has been micro-optimized
|
||||||
|
for various of code paths making this, one of, if not the fastest EventEmitter
|
||||||
|
available for Node.js and browsers. The module is API compatible with the
|
||||||
|
EventEmitter that ships by default with Node.js but there are some slight
|
||||||
|
differences:
|
||||||
|
|
||||||
|
- Domain support has been removed.
|
||||||
|
- We do not `throw` an error when you emit an `error` event and nobody is
|
||||||
|
listening.
|
||||||
|
- The `newListener` and `removeListener` events have been removed as they
|
||||||
|
are useful only in some uncommon use-cases.
|
||||||
|
- The `setMaxListeners`, `getMaxListeners`, `prependListener` and
|
||||||
|
`prependOnceListener` methods are not available.
|
||||||
|
- Support for custom context for events so there is no need to use `fn.bind`.
|
||||||
|
- The `removeListener` method removes all matching listeners, not only the
|
||||||
|
first.
|
||||||
|
|
||||||
|
It's a drop in replacement for existing EventEmitters, but just faster. Free
|
||||||
|
performance, who wouldn't want that? The EventEmitter is written in EcmaScript 3
|
||||||
|
so it will work in the oldest browsers and node versions that you need to
|
||||||
|
support.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm install --save eventemitter3
|
||||||
|
```
|
||||||
|
|
||||||
|
## CDN
|
||||||
|
|
||||||
|
Recommended CDN:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://unpkg.com/eventemitter3@latest/dist/eventemitter3.umd.min.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
After installation the only thing you need to do is require the module:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var EventEmitter = require('eventemitter3');
|
||||||
|
```
|
||||||
|
|
||||||
|
And you're ready to create your own EventEmitter instances. For the API
|
||||||
|
documentation, please follow the official Node.js documentation:
|
||||||
|
|
||||||
|
http://nodejs.org/api/events.html
|
||||||
|
|
||||||
|
### Contextual emits
|
||||||
|
|
||||||
|
We've upgraded the API of the `EventEmitter.on`, `EventEmitter.once` and
|
||||||
|
`EventEmitter.removeListener` to accept an extra argument which is the `context`
|
||||||
|
or `this` value that should be set for the emitted events. This means you no
|
||||||
|
longer have the overhead of an event that required `fn.bind` in order to get a
|
||||||
|
custom `this` value.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var EE = new EventEmitter()
|
||||||
|
, context = { foo: 'bar' };
|
||||||
|
|
||||||
|
function emitted() {
|
||||||
|
console.log(this === context); // true
|
||||||
|
}
|
||||||
|
|
||||||
|
EE.once('event-name', emitted, context);
|
||||||
|
EE.on('another-event', emitted, context);
|
||||||
|
EE.removeListener('another-event', emitted, context);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tests and benchmarks
|
||||||
|
|
||||||
|
This module is well tested. You can run:
|
||||||
|
|
||||||
|
- `npm test` to run the tests under Node.js.
|
||||||
|
- `npm run test-browser` to run the tests in real browsers via Sauce Labs.
|
||||||
|
|
||||||
|
We also have a set of benchmarks to compare EventEmitter3 with some available
|
||||||
|
alternatives. To run the benchmarks run `npm run benchmark`.
|
||||||
|
|
||||||
|
Tests and benchmarks are not included in the npm package. If you want to play
|
||||||
|
with them you have to clone the GitHub repository.
|
||||||
|
Note that you will have to run an additional `npm i` in the benchmarks folder
|
||||||
|
before `npm run benchmark`.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE)
|
||||||
@ -0,0 +1,347 @@
|
|||||||
|
var eventemitter3Exports = {};
|
||||||
|
var eventemitter3 = {
|
||||||
|
get exports(){ return eventemitter3Exports; },
|
||||||
|
set exports(v){ eventemitter3Exports = v; },
|
||||||
|
};
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
|
||||||
|
var has = Object.prototype.hasOwnProperty
|
||||||
|
, prefix = '~';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor to create a storage for our `EE` objects.
|
||||||
|
* An `Events` instance is a plain object whose properties are event names.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function Events() {}
|
||||||
|
|
||||||
|
//
|
||||||
|
// We try to not inherit from `Object.prototype`. In some engines creating an
|
||||||
|
// instance in this way is faster than calling `Object.create(null)` directly.
|
||||||
|
// If `Object.create(null)` is not supported we prefix the event names with a
|
||||||
|
// character to make sure that the built-in object properties are not
|
||||||
|
// overridden or used as an attack vector.
|
||||||
|
//
|
||||||
|
if (Object.create) {
|
||||||
|
Events.prototype = Object.create(null);
|
||||||
|
|
||||||
|
//
|
||||||
|
// This hack is needed because the `__proto__` property is still inherited in
|
||||||
|
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
|
||||||
|
//
|
||||||
|
if (!new Events().__proto__) prefix = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Representation of a single event listener.
|
||||||
|
*
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} context The context to invoke the listener with.
|
||||||
|
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
|
||||||
|
* @constructor
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function EE(fn, context, once) {
|
||||||
|
this.fn = fn;
|
||||||
|
this.context = context;
|
||||||
|
this.once = once || false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} context The context to invoke the listener with.
|
||||||
|
* @param {Boolean} once Specify if the listener is a one-time listener.
|
||||||
|
* @returns {EventEmitter}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addListener(emitter, event, fn, context, once) {
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new TypeError('The listener must be a function');
|
||||||
|
}
|
||||||
|
|
||||||
|
var listener = new EE(fn, context || emitter, once)
|
||||||
|
, evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
|
||||||
|
else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
|
||||||
|
else emitter._events[evt] = [emitter._events[evt], listener];
|
||||||
|
|
||||||
|
return emitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear event by name.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||||||
|
* @param {(String|Symbol)} evt The Event name.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function clearEvent(emitter, evt) {
|
||||||
|
if (--emitter._eventsCount === 0) emitter._events = new Events();
|
||||||
|
else delete emitter._events[evt];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal `EventEmitter` interface that is molded against the Node.js
|
||||||
|
* `EventEmitter` interface.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
function EventEmitter() {
|
||||||
|
this._events = new Events();
|
||||||
|
this._eventsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array listing the events for which the emitter has registered
|
||||||
|
* listeners.
|
||||||
|
*
|
||||||
|
* @returns {Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.eventNames = function eventNames() {
|
||||||
|
var names = []
|
||||||
|
, events
|
||||||
|
, name;
|
||||||
|
|
||||||
|
if (this._eventsCount === 0) return names;
|
||||||
|
|
||||||
|
for (name in (events = this._events)) {
|
||||||
|
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.getOwnPropertySymbols) {
|
||||||
|
return names.concat(Object.getOwnPropertySymbols(events));
|
||||||
|
}
|
||||||
|
|
||||||
|
return names;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the listeners registered for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Array} The registered listeners.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.listeners = function listeners(event) {
|
||||||
|
var evt = prefix ? prefix + event : event
|
||||||
|
, handlers = this._events[evt];
|
||||||
|
|
||||||
|
if (!handlers) return [];
|
||||||
|
if (handlers.fn) return [handlers.fn];
|
||||||
|
|
||||||
|
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
|
||||||
|
ee[i] = handlers[i].fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ee;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of listeners listening to a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Number} The number of listeners.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
||||||
|
var evt = prefix ? prefix + event : event
|
||||||
|
, listeners = this._events[evt];
|
||||||
|
|
||||||
|
if (!listeners) return 0;
|
||||||
|
if (listeners.fn) return 1;
|
||||||
|
return listeners.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls each of the listeners registered for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Boolean} `true` if the event had listeners, else `false`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
||||||
|
var evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!this._events[evt]) return false;
|
||||||
|
|
||||||
|
var listeners = this._events[evt]
|
||||||
|
, len = arguments.length
|
||||||
|
, args
|
||||||
|
, i;
|
||||||
|
|
||||||
|
if (listeners.fn) {
|
||||||
|
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 1: return listeners.fn.call(listeners.context), true;
|
||||||
|
case 2: return listeners.fn.call(listeners.context, a1), true;
|
||||||
|
case 3: return listeners.fn.call(listeners.context, a1, a2), true;
|
||||||
|
case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
||||||
|
case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
||||||
|
case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1, args = new Array(len -1); i < len; i++) {
|
||||||
|
args[i - 1] = arguments[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners.fn.apply(listeners.context, args);
|
||||||
|
} else {
|
||||||
|
var length = listeners.length
|
||||||
|
, j;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 1: listeners[i].fn.call(listeners[i].context); break;
|
||||||
|
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
|
||||||
|
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
|
||||||
|
case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
|
||||||
|
default:
|
||||||
|
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
|
||||||
|
args[j - 1] = arguments[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners[i].fn.apply(listeners[i].context, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} [context=this] The context to invoke the listener with.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.on = function on(event, fn, context) {
|
||||||
|
return addListener(this, event, fn, context, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a one-time listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} [context=this] The context to invoke the listener with.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.once = function once(event, fn, context) {
|
||||||
|
return addListener(this, event, fn, context, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the listeners of a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn Only remove the listeners that match this function.
|
||||||
|
* @param {*} context Only remove the listeners that have this context.
|
||||||
|
* @param {Boolean} once Only remove one-time listeners.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
||||||
|
var evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!this._events[evt]) return this;
|
||||||
|
if (!fn) {
|
||||||
|
clearEvent(this, evt);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
var listeners = this._events[evt];
|
||||||
|
|
||||||
|
if (listeners.fn) {
|
||||||
|
if (
|
||||||
|
listeners.fn === fn &&
|
||||||
|
(!once || listeners.once) &&
|
||||||
|
(!context || listeners.context === context)
|
||||||
|
) {
|
||||||
|
clearEvent(this, evt);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
||||||
|
if (
|
||||||
|
listeners[i].fn !== fn ||
|
||||||
|
(once && !listeners[i].once) ||
|
||||||
|
(context && listeners[i].context !== context)
|
||||||
|
) {
|
||||||
|
events.push(listeners[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reset the array, or remove it completely if we have no more listeners.
|
||||||
|
//
|
||||||
|
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
|
||||||
|
else clearEvent(this, evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all listeners, or those of the specified event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} [event] The event name.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
||||||
|
var evt;
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
evt = prefix ? prefix + event : event;
|
||||||
|
if (this._events[evt]) clearEvent(this, evt);
|
||||||
|
} else {
|
||||||
|
this._events = new Events();
|
||||||
|
this._eventsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alias methods names because people roll like that.
|
||||||
|
//
|
||||||
|
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
||||||
|
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the prefix.
|
||||||
|
//
|
||||||
|
EventEmitter.prefixed = prefix;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Allow `EventEmitter` to be imported as module namespace.
|
||||||
|
//
|
||||||
|
EventEmitter.EventEmitter = EventEmitter;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the module.
|
||||||
|
//
|
||||||
|
{
|
||||||
|
module.exports = EventEmitter;
|
||||||
|
}
|
||||||
|
} (eventemitter3));
|
||||||
|
|
||||||
|
var EventEmitter = eventemitter3Exports;
|
||||||
|
|
||||||
|
export { EventEmitter, EventEmitter as default };
|
||||||
@ -0,0 +1 @@
|
|||||||
|
var e={};!function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function s(e,t,r,s,i){if("function"!=typeof r)throw new TypeError("The listener must be a function");var c=new o(r,s||e,i),f=n?n+t:t;return e._events[f]?e._events[f].fn?e._events[f]=[e._events[f],c]:e._events[f].push(c):(e._events[f]=c,e._eventsCount++),e}function i(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function c(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),c.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},c.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,s=r.length,i=new Array(s);o<s;o++)i[o]=r[o].fn;return i},c.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},c.prototype.emit=function(e,t,r,o,s,i){var c=n?n+e:e;if(!this._events[c])return!1;var f,a,u=this._events[c],v=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),v){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,o),!0;case 5:return u.fn.call(u.context,t,r,o,s),!0;case 6:return u.fn.call(u.context,t,r,o,s,i),!0}for(a=1,f=new Array(v-1);a<v;a++)f[a-1]=arguments[a];u.fn.apply(u.context,f)}else{var l,p=u.length;for(a=0;a<p;a++)switch(u[a].once&&this.removeListener(e,u[a].fn,void 0,!0),v){case 1:u[a].fn.call(u[a].context);break;case 2:u[a].fn.call(u[a].context,t);break;case 3:u[a].fn.call(u[a].context,t,r);break;case 4:u[a].fn.call(u[a].context,t,r,o);break;default:if(!f)for(l=1,f=new Array(v-1);l<v;l++)f[l-1]=arguments[l];u[a].fn.apply(u[a].context,f)}}return!0},c.prototype.on=function(e,t,n){return s(this,e,t,n,!1)},c.prototype.once=function(e,t,n){return s(this,e,t,n,!0)},c.prototype.removeListener=function(e,t,r,o){var s=n?n+e:e;if(!this._events[s])return this;if(!t)return i(this,s),this;var c=this._events[s];if(c.fn)c.fn!==t||o&&!c.once||r&&c.context!==r||i(this,s);else{for(var f=0,a=[],u=c.length;f<u;f++)(c[f].fn!==t||o&&!c[f].once||r&&c[f].context!==r)&&a.push(c[f]);a.length?this._events[s]=1===a.length?a[0]:a:i(this,s)}return this},c.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&i(this,t)):(this._events=new r,this._eventsCount=0),this},c.prototype.off=c.prototype.removeListener,c.prototype.addListener=c.prototype.on,c.prefixed=n,c.EventEmitter=c,e.exports=c}({get exports(){return e},set exports(t){e=t}});var t=e;export{t as EventEmitter,t as default};//# sourceMappingURL=eventemitter3.esm.min.js.map
|
||||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,355 @@
|
|||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||||
|
typeof define === 'function' && define.amd ? define(factory) :
|
||||||
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventEmitter3 = factory());
|
||||||
|
})(this, (function () { 'use strict';
|
||||||
|
|
||||||
|
var eventemitter3Exports = {};
|
||||||
|
var eventemitter3$1 = {
|
||||||
|
get exports(){ return eventemitter3Exports; },
|
||||||
|
set exports(v){ eventemitter3Exports = v; },
|
||||||
|
};
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
|
||||||
|
var has = Object.prototype.hasOwnProperty
|
||||||
|
, prefix = '~';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor to create a storage for our `EE` objects.
|
||||||
|
* An `Events` instance is a plain object whose properties are event names.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function Events() {}
|
||||||
|
|
||||||
|
//
|
||||||
|
// We try to not inherit from `Object.prototype`. In some engines creating an
|
||||||
|
// instance in this way is faster than calling `Object.create(null)` directly.
|
||||||
|
// If `Object.create(null)` is not supported we prefix the event names with a
|
||||||
|
// character to make sure that the built-in object properties are not
|
||||||
|
// overridden or used as an attack vector.
|
||||||
|
//
|
||||||
|
if (Object.create) {
|
||||||
|
Events.prototype = Object.create(null);
|
||||||
|
|
||||||
|
//
|
||||||
|
// This hack is needed because the `__proto__` property is still inherited in
|
||||||
|
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
|
||||||
|
//
|
||||||
|
if (!new Events().__proto__) prefix = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Representation of a single event listener.
|
||||||
|
*
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} context The context to invoke the listener with.
|
||||||
|
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
|
||||||
|
* @constructor
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function EE(fn, context, once) {
|
||||||
|
this.fn = fn;
|
||||||
|
this.context = context;
|
||||||
|
this.once = once || false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} context The context to invoke the listener with.
|
||||||
|
* @param {Boolean} once Specify if the listener is a one-time listener.
|
||||||
|
* @returns {EventEmitter}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addListener(emitter, event, fn, context, once) {
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new TypeError('The listener must be a function');
|
||||||
|
}
|
||||||
|
|
||||||
|
var listener = new EE(fn, context || emitter, once)
|
||||||
|
, evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
|
||||||
|
else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
|
||||||
|
else emitter._events[evt] = [emitter._events[evt], listener];
|
||||||
|
|
||||||
|
return emitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear event by name.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||||||
|
* @param {(String|Symbol)} evt The Event name.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function clearEvent(emitter, evt) {
|
||||||
|
if (--emitter._eventsCount === 0) emitter._events = new Events();
|
||||||
|
else delete emitter._events[evt];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal `EventEmitter` interface that is molded against the Node.js
|
||||||
|
* `EventEmitter` interface.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
function EventEmitter() {
|
||||||
|
this._events = new Events();
|
||||||
|
this._eventsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array listing the events for which the emitter has registered
|
||||||
|
* listeners.
|
||||||
|
*
|
||||||
|
* @returns {Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.eventNames = function eventNames() {
|
||||||
|
var names = []
|
||||||
|
, events
|
||||||
|
, name;
|
||||||
|
|
||||||
|
if (this._eventsCount === 0) return names;
|
||||||
|
|
||||||
|
for (name in (events = this._events)) {
|
||||||
|
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.getOwnPropertySymbols) {
|
||||||
|
return names.concat(Object.getOwnPropertySymbols(events));
|
||||||
|
}
|
||||||
|
|
||||||
|
return names;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the listeners registered for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Array} The registered listeners.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.listeners = function listeners(event) {
|
||||||
|
var evt = prefix ? prefix + event : event
|
||||||
|
, handlers = this._events[evt];
|
||||||
|
|
||||||
|
if (!handlers) return [];
|
||||||
|
if (handlers.fn) return [handlers.fn];
|
||||||
|
|
||||||
|
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
|
||||||
|
ee[i] = handlers[i].fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ee;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of listeners listening to a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Number} The number of listeners.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
||||||
|
var evt = prefix ? prefix + event : event
|
||||||
|
, listeners = this._events[evt];
|
||||||
|
|
||||||
|
if (!listeners) return 0;
|
||||||
|
if (listeners.fn) return 1;
|
||||||
|
return listeners.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls each of the listeners registered for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Boolean} `true` if the event had listeners, else `false`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
||||||
|
var evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!this._events[evt]) return false;
|
||||||
|
|
||||||
|
var listeners = this._events[evt]
|
||||||
|
, len = arguments.length
|
||||||
|
, args
|
||||||
|
, i;
|
||||||
|
|
||||||
|
if (listeners.fn) {
|
||||||
|
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 1: return listeners.fn.call(listeners.context), true;
|
||||||
|
case 2: return listeners.fn.call(listeners.context, a1), true;
|
||||||
|
case 3: return listeners.fn.call(listeners.context, a1, a2), true;
|
||||||
|
case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
||||||
|
case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
||||||
|
case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1, args = new Array(len -1); i < len; i++) {
|
||||||
|
args[i - 1] = arguments[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners.fn.apply(listeners.context, args);
|
||||||
|
} else {
|
||||||
|
var length = listeners.length
|
||||||
|
, j;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 1: listeners[i].fn.call(listeners[i].context); break;
|
||||||
|
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
|
||||||
|
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
|
||||||
|
case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
|
||||||
|
default:
|
||||||
|
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
|
||||||
|
args[j - 1] = arguments[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners[i].fn.apply(listeners[i].context, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} [context=this] The context to invoke the listener with.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.on = function on(event, fn, context) {
|
||||||
|
return addListener(this, event, fn, context, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a one-time listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} [context=this] The context to invoke the listener with.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.once = function once(event, fn, context) {
|
||||||
|
return addListener(this, event, fn, context, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the listeners of a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn Only remove the listeners that match this function.
|
||||||
|
* @param {*} context Only remove the listeners that have this context.
|
||||||
|
* @param {Boolean} once Only remove one-time listeners.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
||||||
|
var evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!this._events[evt]) return this;
|
||||||
|
if (!fn) {
|
||||||
|
clearEvent(this, evt);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
var listeners = this._events[evt];
|
||||||
|
|
||||||
|
if (listeners.fn) {
|
||||||
|
if (
|
||||||
|
listeners.fn === fn &&
|
||||||
|
(!once || listeners.once) &&
|
||||||
|
(!context || listeners.context === context)
|
||||||
|
) {
|
||||||
|
clearEvent(this, evt);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
||||||
|
if (
|
||||||
|
listeners[i].fn !== fn ||
|
||||||
|
(once && !listeners[i].once) ||
|
||||||
|
(context && listeners[i].context !== context)
|
||||||
|
) {
|
||||||
|
events.push(listeners[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reset the array, or remove it completely if we have no more listeners.
|
||||||
|
//
|
||||||
|
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
|
||||||
|
else clearEvent(this, evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all listeners, or those of the specified event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} [event] The event name.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
||||||
|
var evt;
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
evt = prefix ? prefix + event : event;
|
||||||
|
if (this._events[evt]) clearEvent(this, evt);
|
||||||
|
} else {
|
||||||
|
this._events = new Events();
|
||||||
|
this._eventsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alias methods names because people roll like that.
|
||||||
|
//
|
||||||
|
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
||||||
|
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the prefix.
|
||||||
|
//
|
||||||
|
EventEmitter.prefixed = prefix;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Allow `EventEmitter` to be imported as module namespace.
|
||||||
|
//
|
||||||
|
EventEmitter.EventEmitter = EventEmitter;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the module.
|
||||||
|
//
|
||||||
|
{
|
||||||
|
module.exports = EventEmitter;
|
||||||
|
}
|
||||||
|
} (eventemitter3$1));
|
||||||
|
|
||||||
|
var eventemitter3 = eventemitter3Exports;
|
||||||
|
|
||||||
|
return eventemitter3;
|
||||||
|
|
||||||
|
}));
|
||||||
@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).EventEmitter3=t()}(this,(function(){"use strict";var e={};return function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function s(e,t,r,s,i){if("function"!=typeof r)throw new TypeError("The listener must be a function");var c=new o(r,s||e,i),f=n?n+t:t;return e._events[f]?e._events[f].fn?e._events[f]=[e._events[f],c]:e._events[f].push(c):(e._events[f]=c,e._eventsCount++),e}function i(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function c(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),c.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},c.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,s=r.length,i=new Array(s);o<s;o++)i[o]=r[o].fn;return i},c.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},c.prototype.emit=function(e,t,r,o,s,i){var c=n?n+e:e;if(!this._events[c])return!1;var f,u,a=this._events[c],l=arguments.length;if(a.fn){switch(a.once&&this.removeListener(e,a.fn,void 0,!0),l){case 1:return a.fn.call(a.context),!0;case 2:return a.fn.call(a.context,t),!0;case 3:return a.fn.call(a.context,t,r),!0;case 4:return a.fn.call(a.context,t,r,o),!0;case 5:return a.fn.call(a.context,t,r,o,s),!0;case 6:return a.fn.call(a.context,t,r,o,s,i),!0}for(u=1,f=new Array(l-1);u<l;u++)f[u-1]=arguments[u];a.fn.apply(a.context,f)}else{var p,v=a.length;for(u=0;u<v;u++)switch(a[u].once&&this.removeListener(e,a[u].fn,void 0,!0),l){case 1:a[u].fn.call(a[u].context);break;case 2:a[u].fn.call(a[u].context,t);break;case 3:a[u].fn.call(a[u].context,t,r);break;case 4:a[u].fn.call(a[u].context,t,r,o);break;default:if(!f)for(p=1,f=new Array(l-1);p<l;p++)f[p-1]=arguments[p];a[u].fn.apply(a[u].context,f)}}return!0},c.prototype.on=function(e,t,n){return s(this,e,t,n,!1)},c.prototype.once=function(e,t,n){return s(this,e,t,n,!0)},c.prototype.removeListener=function(e,t,r,o){var s=n?n+e:e;if(!this._events[s])return this;if(!t)return i(this,s),this;var c=this._events[s];if(c.fn)c.fn!==t||o&&!c.once||r&&c.context!==r||i(this,s);else{for(var f=0,u=[],a=c.length;f<a;f++)(c[f].fn!==t||o&&!c[f].once||r&&c[f].context!==r)&&u.push(c[f]);u.length?this._events[s]=1===u.length?u[0]:u:i(this,s)}return this},c.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&i(this,t)):(this._events=new r,this._eventsCount=0),this},c.prototype.off=c.prototype.removeListener,c.prototype.addListener=c.prototype.on,c.prefixed=n,c.EventEmitter=c,e.exports=c}({get exports(){return e},set exports(t){e=t}}),e}));//# sourceMappingURL=eventemitter3.umd.min.js.map
|
||||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,135 @@
|
|||||||
|
/**
|
||||||
|
* Minimal `EventEmitter` interface that is molded against the Node.js
|
||||||
|
* `EventEmitter` interface.
|
||||||
|
*/
|
||||||
|
declare class EventEmitter<
|
||||||
|
EventTypes extends EventEmitter.ValidEventTypes = string | symbol,
|
||||||
|
Context extends any = any
|
||||||
|
> {
|
||||||
|
static prefixed: string | boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array listing the events for which the emitter has registered
|
||||||
|
* listeners.
|
||||||
|
*/
|
||||||
|
eventNames(): Array<EventEmitter.EventNames<EventTypes>>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the listeners registered for a given event.
|
||||||
|
*/
|
||||||
|
listeners<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T
|
||||||
|
): Array<EventEmitter.EventListener<EventTypes, T>>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of listeners listening to a given event.
|
||||||
|
*/
|
||||||
|
listenerCount(event: EventEmitter.EventNames<EventTypes>): number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls each of the listeners registered for a given event.
|
||||||
|
*/
|
||||||
|
emit<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T,
|
||||||
|
...args: EventEmitter.EventArgs<EventTypes, T>
|
||||||
|
): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*/
|
||||||
|
on<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T,
|
||||||
|
fn: EventEmitter.EventListener<EventTypes, T>,
|
||||||
|
context?: Context
|
||||||
|
): this;
|
||||||
|
addListener<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T,
|
||||||
|
fn: EventEmitter.EventListener<EventTypes, T>,
|
||||||
|
context?: Context
|
||||||
|
): this;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a one-time listener for a given event.
|
||||||
|
*/
|
||||||
|
once<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T,
|
||||||
|
fn: EventEmitter.EventListener<EventTypes, T>,
|
||||||
|
context?: Context
|
||||||
|
): this;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the listeners of a given event.
|
||||||
|
*/
|
||||||
|
removeListener<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T,
|
||||||
|
fn?: EventEmitter.EventListener<EventTypes, T>,
|
||||||
|
context?: Context,
|
||||||
|
once?: boolean
|
||||||
|
): this;
|
||||||
|
off<T extends EventEmitter.EventNames<EventTypes>>(
|
||||||
|
event: T,
|
||||||
|
fn?: EventEmitter.EventListener<EventTypes, T>,
|
||||||
|
context?: Context,
|
||||||
|
once?: boolean
|
||||||
|
): this;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all listeners, or those of the specified event.
|
||||||
|
*/
|
||||||
|
removeAllListeners(event?: EventEmitter.EventNames<EventTypes>): this;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare namespace EventEmitter {
|
||||||
|
export interface ListenerFn<Args extends any[] = any[]> {
|
||||||
|
(...args: Args): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface EventEmitterStatic {
|
||||||
|
new <
|
||||||
|
EventTypes extends ValidEventTypes = string | symbol,
|
||||||
|
Context = any
|
||||||
|
>(): EventEmitter<EventTypes, Context>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* `object` should be in either of the following forms:
|
||||||
|
* ```
|
||||||
|
* interface EventTypes {
|
||||||
|
* 'event-with-parameters': any[]
|
||||||
|
* 'event-with-example-handler': (...args: any[]) => void
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
export type ValidEventTypes = string | symbol | object;
|
||||||
|
|
||||||
|
export type EventNames<T extends ValidEventTypes> = T extends string | symbol
|
||||||
|
? T
|
||||||
|
: keyof T;
|
||||||
|
|
||||||
|
export type ArgumentMap<T extends object> = {
|
||||||
|
[K in keyof T]: T[K] extends (...args: any[]) => void
|
||||||
|
? Parameters<T[K]>
|
||||||
|
: T[K] extends any[]
|
||||||
|
? T[K]
|
||||||
|
: any[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type EventListener<
|
||||||
|
T extends ValidEventTypes,
|
||||||
|
K extends EventNames<T>
|
||||||
|
> = T extends string | symbol
|
||||||
|
? (...args: any[]) => void
|
||||||
|
: (
|
||||||
|
...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
|
||||||
|
) => void;
|
||||||
|
|
||||||
|
export type EventArgs<
|
||||||
|
T extends ValidEventTypes,
|
||||||
|
K extends EventNames<T>
|
||||||
|
> = Parameters<EventListener<T, K>>;
|
||||||
|
|
||||||
|
export const EventEmitter: EventEmitterStatic;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { EventEmitter }
|
||||||
|
export default EventEmitter;
|
||||||
@ -0,0 +1,336 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var has = Object.prototype.hasOwnProperty
|
||||||
|
, prefix = '~';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor to create a storage for our `EE` objects.
|
||||||
|
* An `Events` instance is a plain object whose properties are event names.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function Events() {}
|
||||||
|
|
||||||
|
//
|
||||||
|
// We try to not inherit from `Object.prototype`. In some engines creating an
|
||||||
|
// instance in this way is faster than calling `Object.create(null)` directly.
|
||||||
|
// If `Object.create(null)` is not supported we prefix the event names with a
|
||||||
|
// character to make sure that the built-in object properties are not
|
||||||
|
// overridden or used as an attack vector.
|
||||||
|
//
|
||||||
|
if (Object.create) {
|
||||||
|
Events.prototype = Object.create(null);
|
||||||
|
|
||||||
|
//
|
||||||
|
// This hack is needed because the `__proto__` property is still inherited in
|
||||||
|
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
|
||||||
|
//
|
||||||
|
if (!new Events().__proto__) prefix = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Representation of a single event listener.
|
||||||
|
*
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} context The context to invoke the listener with.
|
||||||
|
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
|
||||||
|
* @constructor
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function EE(fn, context, once) {
|
||||||
|
this.fn = fn;
|
||||||
|
this.context = context;
|
||||||
|
this.once = once || false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} context The context to invoke the listener with.
|
||||||
|
* @param {Boolean} once Specify if the listener is a one-time listener.
|
||||||
|
* @returns {EventEmitter}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function addListener(emitter, event, fn, context, once) {
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new TypeError('The listener must be a function');
|
||||||
|
}
|
||||||
|
|
||||||
|
var listener = new EE(fn, context || emitter, once)
|
||||||
|
, evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
|
||||||
|
else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
|
||||||
|
else emitter._events[evt] = [emitter._events[evt], listener];
|
||||||
|
|
||||||
|
return emitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear event by name.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||||||
|
* @param {(String|Symbol)} evt The Event name.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function clearEvent(emitter, evt) {
|
||||||
|
if (--emitter._eventsCount === 0) emitter._events = new Events();
|
||||||
|
else delete emitter._events[evt];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal `EventEmitter` interface that is molded against the Node.js
|
||||||
|
* `EventEmitter` interface.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
function EventEmitter() {
|
||||||
|
this._events = new Events();
|
||||||
|
this._eventsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array listing the events for which the emitter has registered
|
||||||
|
* listeners.
|
||||||
|
*
|
||||||
|
* @returns {Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.eventNames = function eventNames() {
|
||||||
|
var names = []
|
||||||
|
, events
|
||||||
|
, name;
|
||||||
|
|
||||||
|
if (this._eventsCount === 0) return names;
|
||||||
|
|
||||||
|
for (name in (events = this._events)) {
|
||||||
|
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.getOwnPropertySymbols) {
|
||||||
|
return names.concat(Object.getOwnPropertySymbols(events));
|
||||||
|
}
|
||||||
|
|
||||||
|
return names;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the listeners registered for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Array} The registered listeners.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.listeners = function listeners(event) {
|
||||||
|
var evt = prefix ? prefix + event : event
|
||||||
|
, handlers = this._events[evt];
|
||||||
|
|
||||||
|
if (!handlers) return [];
|
||||||
|
if (handlers.fn) return [handlers.fn];
|
||||||
|
|
||||||
|
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
|
||||||
|
ee[i] = handlers[i].fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ee;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of listeners listening to a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Number} The number of listeners.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
||||||
|
var evt = prefix ? prefix + event : event
|
||||||
|
, listeners = this._events[evt];
|
||||||
|
|
||||||
|
if (!listeners) return 0;
|
||||||
|
if (listeners.fn) return 1;
|
||||||
|
return listeners.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls each of the listeners registered for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @returns {Boolean} `true` if the event had listeners, else `false`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
||||||
|
var evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!this._events[evt]) return false;
|
||||||
|
|
||||||
|
var listeners = this._events[evt]
|
||||||
|
, len = arguments.length
|
||||||
|
, args
|
||||||
|
, i;
|
||||||
|
|
||||||
|
if (listeners.fn) {
|
||||||
|
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 1: return listeners.fn.call(listeners.context), true;
|
||||||
|
case 2: return listeners.fn.call(listeners.context, a1), true;
|
||||||
|
case 3: return listeners.fn.call(listeners.context, a1, a2), true;
|
||||||
|
case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
||||||
|
case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
||||||
|
case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1, args = new Array(len -1); i < len; i++) {
|
||||||
|
args[i - 1] = arguments[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners.fn.apply(listeners.context, args);
|
||||||
|
} else {
|
||||||
|
var length = listeners.length
|
||||||
|
, j;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 1: listeners[i].fn.call(listeners[i].context); break;
|
||||||
|
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
|
||||||
|
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
|
||||||
|
case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
|
||||||
|
default:
|
||||||
|
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
|
||||||
|
args[j - 1] = arguments[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners[i].fn.apply(listeners[i].context, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} [context=this] The context to invoke the listener with.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.on = function on(event, fn, context) {
|
||||||
|
return addListener(this, event, fn, context, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a one-time listener for a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn The listener function.
|
||||||
|
* @param {*} [context=this] The context to invoke the listener with.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.once = function once(event, fn, context) {
|
||||||
|
return addListener(this, event, fn, context, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the listeners of a given event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} event The event name.
|
||||||
|
* @param {Function} fn Only remove the listeners that match this function.
|
||||||
|
* @param {*} context Only remove the listeners that have this context.
|
||||||
|
* @param {Boolean} once Only remove one-time listeners.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
||||||
|
var evt = prefix ? prefix + event : event;
|
||||||
|
|
||||||
|
if (!this._events[evt]) return this;
|
||||||
|
if (!fn) {
|
||||||
|
clearEvent(this, evt);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
var listeners = this._events[evt];
|
||||||
|
|
||||||
|
if (listeners.fn) {
|
||||||
|
if (
|
||||||
|
listeners.fn === fn &&
|
||||||
|
(!once || listeners.once) &&
|
||||||
|
(!context || listeners.context === context)
|
||||||
|
) {
|
||||||
|
clearEvent(this, evt);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
||||||
|
if (
|
||||||
|
listeners[i].fn !== fn ||
|
||||||
|
(once && !listeners[i].once) ||
|
||||||
|
(context && listeners[i].context !== context)
|
||||||
|
) {
|
||||||
|
events.push(listeners[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reset the array, or remove it completely if we have no more listeners.
|
||||||
|
//
|
||||||
|
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
|
||||||
|
else clearEvent(this, evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all listeners, or those of the specified event.
|
||||||
|
*
|
||||||
|
* @param {(String|Symbol)} [event] The event name.
|
||||||
|
* @returns {EventEmitter} `this`.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
||||||
|
var evt;
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
evt = prefix ? prefix + event : event;
|
||||||
|
if (this._events[evt]) clearEvent(this, evt);
|
||||||
|
} else {
|
||||||
|
this._events = new Events();
|
||||||
|
this._eventsCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Alias methods names because people roll like that.
|
||||||
|
//
|
||||||
|
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
||||||
|
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the prefix.
|
||||||
|
//
|
||||||
|
EventEmitter.prefixed = prefix;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Allow `EventEmitter` to be imported as module namespace.
|
||||||
|
//
|
||||||
|
EventEmitter.EventEmitter = EventEmitter;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the module.
|
||||||
|
//
|
||||||
|
if ('undefined' !== typeof module) {
|
||||||
|
module.exports = EventEmitter;
|
||||||
|
}
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
import EventEmitter from './index.js'
|
||||||
|
|
||||||
|
export { EventEmitter }
|
||||||
|
export default EventEmitter
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"name": "eventemitter3",
|
||||||
|
"version": "5.0.1",
|
||||||
|
"description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./index.d.ts",
|
||||||
|
"import": "./index.mjs",
|
||||||
|
"require": "./index.js"
|
||||||
|
},
|
||||||
|
"./package.json": "./package.json"
|
||||||
|
},
|
||||||
|
"main": "index.js",
|
||||||
|
"types": "index.d.ts",
|
||||||
|
"scripts": {
|
||||||
|
"rollup": "rimraf dist umd && rollup -c",
|
||||||
|
"benchmark": "find benchmarks/run -name '*.js' -exec benchmarks/start.sh {} \\;",
|
||||||
|
"test": "c8 --reporter=lcov --reporter=text mocha test/test.js",
|
||||||
|
"test-esm": "mocha test/test.mjs",
|
||||||
|
"prepublishOnly": "npm run rollup",
|
||||||
|
"test-browser": "node test/browser.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.js",
|
||||||
|
"index.mjs",
|
||||||
|
"index.d.ts",
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/primus/eventemitter3.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"EventEmitter",
|
||||||
|
"EventEmitter2",
|
||||||
|
"EventEmitter3",
|
||||||
|
"Events",
|
||||||
|
"addEventListener",
|
||||||
|
"addListener",
|
||||||
|
"emit",
|
||||||
|
"emits",
|
||||||
|
"emitter",
|
||||||
|
"event",
|
||||||
|
"once",
|
||||||
|
"pub/sub",
|
||||||
|
"publish",
|
||||||
|
"reactor",
|
||||||
|
"subscribe"
|
||||||
|
],
|
||||||
|
"author": "Arnout Kazemier",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/primus/eventemitter3/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@rollup/plugin-commonjs": "^24.0.0",
|
||||||
|
"@rollup/plugin-terser": "^0.4.0",
|
||||||
|
"assume": "^2.2.0",
|
||||||
|
"c8": "^7.3.1",
|
||||||
|
"mocha": "^10.0.0",
|
||||||
|
"pre-commit": "^1.2.0",
|
||||||
|
"rimraf": "^4.1.2",
|
||||||
|
"rollup": "^3.4.0",
|
||||||
|
"sauce-browsers": "^3.0.0",
|
||||||
|
"sauce-test": "^1.3.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright 2014-2023 Jason Chen
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
# Fast Diff 
|
||||||
|
|
||||||
|
This is a simplified import of the excellent [diff-match-patch](https://code.google.com/p/google-diff-match-patch/) library by [Neil Fraser](https://neil.fraser.name/) into the Node.js environment. The match and patch parts are removed, as well as all the extra diff options. What remains is incredibly fast diffing between two strings.
|
||||||
|
|
||||||
|
The diff function is an implementation of ["An O(ND) Difference Algorithm and its Variations" (Myers, 1986)](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.6927&rep=rep1&type=pdf) with the suggested divide and conquer strategy along with several [optimizations](http://neil.fraser.name/news/2007/10/09/) Neil added.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var diff = require('fast-diff');
|
||||||
|
|
||||||
|
var good = 'Good dog';
|
||||||
|
var bad = 'Bad dog';
|
||||||
|
|
||||||
|
var result = diff(good, bad);
|
||||||
|
// [[-1, "Goo"], [1, "Ba"], [0, "d dog"]]
|
||||||
|
|
||||||
|
// Respect suggested edit location (cursor position), added in v1.1
|
||||||
|
diff('aaa', 'aaaa', 1)
|
||||||
|
// [[0, "a"], [1, "a"], [0, "aa"]]
|
||||||
|
|
||||||
|
// For convenience
|
||||||
|
diff.INSERT === 1;
|
||||||
|
diff.EQUAL === 0;
|
||||||
|
diff.DELETE === -1;
|
||||||
|
```
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
declare function diff(
|
||||||
|
text1: string,
|
||||||
|
text2: string,
|
||||||
|
cursorPos?: number | diff.CursorInfo,
|
||||||
|
cleanup?: boolean
|
||||||
|
): diff.Diff[];
|
||||||
|
|
||||||
|
declare namespace diff {
|
||||||
|
type Diff = [-1 | 0 | 1, string];
|
||||||
|
|
||||||
|
const DELETE: -1;
|
||||||
|
const INSERT: 1;
|
||||||
|
const EQUAL: 0;
|
||||||
|
|
||||||
|
interface CursorInfo {
|
||||||
|
oldRange: { index: number; length: number };
|
||||||
|
newRange: { index: number; length: number };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export = diff;
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "fast-diff",
|
||||||
|
"version": "1.3.0",
|
||||||
|
"description": "Fast Javascript text diff",
|
||||||
|
"author": "Jason Chen <jhchen7@gmail.com>",
|
||||||
|
"main": "diff.js",
|
||||||
|
"types": "diff.d.ts",
|
||||||
|
"files": [
|
||||||
|
"diff.d.ts"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"lodash": "~4.17.21",
|
||||||
|
"nyc": "~15.1.0",
|
||||||
|
"seedrandom": "~3.0.5"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/jhchen/fast-diff"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/jhchen/fast-diff/issues"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "nyc node test.js"
|
||||||
|
},
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"keywords": [
|
||||||
|
"diff"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||||
|
|
||||||
|
Based on Underscore.js, copyright Jeremy Ashkenas,
|
||||||
|
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
|
||||||
|
|
||||||
|
This software consists of voluntary contributions made by many
|
||||||
|
individuals. For exact contribution history, see the revision history
|
||||||
|
available at https://github.com/lodash/lodash
|
||||||
|
|
||||||
|
The following license applies to all parts of this software except as
|
||||||
|
documented below:
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Copyright and related rights for sample code are waived via CC0. Sample
|
||||||
|
code is defined as all source code displayed within the prose of the
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
CC0: http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Files located in the node_modules and vendor directories are externally
|
||||||
|
maintained libraries used by this software which have their own
|
||||||
|
licenses; we recommend you read them, as their terms may differ from the
|
||||||
|
terms above.
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
# lodash-es v4.17.21
|
||||||
|
|
||||||
|
The [Lodash](https://lodash.com/) library exported as [ES](http://www.ecma-international.org/ecma-262/6.0/) modules.
|
||||||
|
|
||||||
|
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
|
||||||
|
```shell
|
||||||
|
$ lodash modularize exports=es -o ./
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [package source](https://github.com/lodash/lodash/tree/4.17.21-es) for more details.
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
import getNative from './_getNative.js';
|
||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var DataView = getNative(root, 'DataView');
|
||||||
|
|
||||||
|
export default DataView;
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
import hashClear from './_hashClear.js';
|
||||||
|
import hashDelete from './_hashDelete.js';
|
||||||
|
import hashGet from './_hashGet.js';
|
||||||
|
import hashHas from './_hashHas.js';
|
||||||
|
import hashSet from './_hashSet.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a hash object.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @constructor
|
||||||
|
* @param {Array} [entries] The key-value pairs to cache.
|
||||||
|
*/
|
||||||
|
function Hash(entries) {
|
||||||
|
var index = -1,
|
||||||
|
length = entries == null ? 0 : entries.length;
|
||||||
|
|
||||||
|
this.clear();
|
||||||
|
while (++index < length) {
|
||||||
|
var entry = entries[index];
|
||||||
|
this.set(entry[0], entry[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add methods to `Hash`.
|
||||||
|
Hash.prototype.clear = hashClear;
|
||||||
|
Hash.prototype['delete'] = hashDelete;
|
||||||
|
Hash.prototype.get = hashGet;
|
||||||
|
Hash.prototype.has = hashHas;
|
||||||
|
Hash.prototype.set = hashSet;
|
||||||
|
|
||||||
|
export default Hash;
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
import baseCreate from './_baseCreate.js';
|
||||||
|
import baseLodash from './_baseLodash.js';
|
||||||
|
|
||||||
|
/** Used as references for the maximum length and index of an array. */
|
||||||
|
var MAX_ARRAY_LENGTH = 4294967295;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @constructor
|
||||||
|
* @param {*} value The value to wrap.
|
||||||
|
*/
|
||||||
|
function LazyWrapper(value) {
|
||||||
|
this.__wrapped__ = value;
|
||||||
|
this.__actions__ = [];
|
||||||
|
this.__dir__ = 1;
|
||||||
|
this.__filtered__ = false;
|
||||||
|
this.__iteratees__ = [];
|
||||||
|
this.__takeCount__ = MAX_ARRAY_LENGTH;
|
||||||
|
this.__views__ = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure `LazyWrapper` is an instance of `baseLodash`.
|
||||||
|
LazyWrapper.prototype = baseCreate(baseLodash.prototype);
|
||||||
|
LazyWrapper.prototype.constructor = LazyWrapper;
|
||||||
|
|
||||||
|
export default LazyWrapper;
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
import listCacheClear from './_listCacheClear.js';
|
||||||
|
import listCacheDelete from './_listCacheDelete.js';
|
||||||
|
import listCacheGet from './_listCacheGet.js';
|
||||||
|
import listCacheHas from './_listCacheHas.js';
|
||||||
|
import listCacheSet from './_listCacheSet.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an list cache object.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @constructor
|
||||||
|
* @param {Array} [entries] The key-value pairs to cache.
|
||||||
|
*/
|
||||||
|
function ListCache(entries) {
|
||||||
|
var index = -1,
|
||||||
|
length = entries == null ? 0 : entries.length;
|
||||||
|
|
||||||
|
this.clear();
|
||||||
|
while (++index < length) {
|
||||||
|
var entry = entries[index];
|
||||||
|
this.set(entry[0], entry[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add methods to `ListCache`.
|
||||||
|
ListCache.prototype.clear = listCacheClear;
|
||||||
|
ListCache.prototype['delete'] = listCacheDelete;
|
||||||
|
ListCache.prototype.get = listCacheGet;
|
||||||
|
ListCache.prototype.has = listCacheHas;
|
||||||
|
ListCache.prototype.set = listCacheSet;
|
||||||
|
|
||||||
|
export default ListCache;
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
import baseCreate from './_baseCreate.js';
|
||||||
|
import baseLodash from './_baseLodash.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base constructor for creating `lodash` wrapper objects.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to wrap.
|
||||||
|
* @param {boolean} [chainAll] Enable explicit method chain sequences.
|
||||||
|
*/
|
||||||
|
function LodashWrapper(value, chainAll) {
|
||||||
|
this.__wrapped__ = value;
|
||||||
|
this.__actions__ = [];
|
||||||
|
this.__chain__ = !!chainAll;
|
||||||
|
this.__index__ = 0;
|
||||||
|
this.__values__ = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
LodashWrapper.prototype = baseCreate(baseLodash.prototype);
|
||||||
|
LodashWrapper.prototype.constructor = LodashWrapper;
|
||||||
|
|
||||||
|
export default LodashWrapper;
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
import getNative from './_getNative.js';
|
||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var Map = getNative(root, 'Map');
|
||||||
|
|
||||||
|
export default Map;
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
import mapCacheClear from './_mapCacheClear.js';
|
||||||
|
import mapCacheDelete from './_mapCacheDelete.js';
|
||||||
|
import mapCacheGet from './_mapCacheGet.js';
|
||||||
|
import mapCacheHas from './_mapCacheHas.js';
|
||||||
|
import mapCacheSet from './_mapCacheSet.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a map cache object to store key-value pairs.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @constructor
|
||||||
|
* @param {Array} [entries] The key-value pairs to cache.
|
||||||
|
*/
|
||||||
|
function MapCache(entries) {
|
||||||
|
var index = -1,
|
||||||
|
length = entries == null ? 0 : entries.length;
|
||||||
|
|
||||||
|
this.clear();
|
||||||
|
while (++index < length) {
|
||||||
|
var entry = entries[index];
|
||||||
|
this.set(entry[0], entry[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add methods to `MapCache`.
|
||||||
|
MapCache.prototype.clear = mapCacheClear;
|
||||||
|
MapCache.prototype['delete'] = mapCacheDelete;
|
||||||
|
MapCache.prototype.get = mapCacheGet;
|
||||||
|
MapCache.prototype.has = mapCacheHas;
|
||||||
|
MapCache.prototype.set = mapCacheSet;
|
||||||
|
|
||||||
|
export default MapCache;
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
import getNative from './_getNative.js';
|
||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var Promise = getNative(root, 'Promise');
|
||||||
|
|
||||||
|
export default Promise;
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
import getNative from './_getNative.js';
|
||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var Set = getNative(root, 'Set');
|
||||||
|
|
||||||
|
export default Set;
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
import MapCache from './_MapCache.js';
|
||||||
|
import setCacheAdd from './_setCacheAdd.js';
|
||||||
|
import setCacheHas from './_setCacheHas.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Creates an array cache object to store unique values.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @constructor
|
||||||
|
* @param {Array} [values] The values to cache.
|
||||||
|
*/
|
||||||
|
function SetCache(values) {
|
||||||
|
var index = -1,
|
||||||
|
length = values == null ? 0 : values.length;
|
||||||
|
|
||||||
|
this.__data__ = new MapCache;
|
||||||
|
while (++index < length) {
|
||||||
|
this.add(values[index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add methods to `SetCache`.
|
||||||
|
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
||||||
|
SetCache.prototype.has = setCacheHas;
|
||||||
|
|
||||||
|
export default SetCache;
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
import ListCache from './_ListCache.js';
|
||||||
|
import stackClear from './_stackClear.js';
|
||||||
|
import stackDelete from './_stackDelete.js';
|
||||||
|
import stackGet from './_stackGet.js';
|
||||||
|
import stackHas from './_stackHas.js';
|
||||||
|
import stackSet from './_stackSet.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a stack cache object to store key-value pairs.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @constructor
|
||||||
|
* @param {Array} [entries] The key-value pairs to cache.
|
||||||
|
*/
|
||||||
|
function Stack(entries) {
|
||||||
|
var data = this.__data__ = new ListCache(entries);
|
||||||
|
this.size = data.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add methods to `Stack`.
|
||||||
|
Stack.prototype.clear = stackClear;
|
||||||
|
Stack.prototype['delete'] = stackDelete;
|
||||||
|
Stack.prototype.get = stackGet;
|
||||||
|
Stack.prototype.has = stackHas;
|
||||||
|
Stack.prototype.set = stackSet;
|
||||||
|
|
||||||
|
export default Stack;
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var Symbol = root.Symbol;
|
||||||
|
|
||||||
|
export default Symbol;
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var Uint8Array = root.Uint8Array;
|
||||||
|
|
||||||
|
export default Uint8Array;
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
import getNative from './_getNative.js';
|
||||||
|
import root from './_root.js';
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var WeakMap = getNative(root, 'WeakMap');
|
||||||
|
|
||||||
|
export default WeakMap;
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Adds the key-value `pair` to `map`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} map The map to modify.
|
||||||
|
* @param {Array} pair The key-value pair to add.
|
||||||
|
* @returns {Object} Returns `map`.
|
||||||
|
*/
|
||||||
|
function addMapEntry(map, pair) {
|
||||||
|
// Don't return `map.set` because it's not chainable in IE 11.
|
||||||
|
map.set(pair[0], pair[1]);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default addMapEntry;
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Adds `value` to `set`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} set The set to modify.
|
||||||
|
* @param {*} value The value to add.
|
||||||
|
* @returns {Object} Returns `set`.
|
||||||
|
*/
|
||||||
|
function addSetEntry(set, value) {
|
||||||
|
// Don't return `set.add` because it's not chainable in IE 11.
|
||||||
|
set.add(value);
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default addSetEntry;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* A faster alternative to `Function#apply`, this function invokes `func`
|
||||||
|
* with the `this` binding of `thisArg` and the arguments of `args`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to invoke.
|
||||||
|
* @param {*} thisArg The `this` binding of `func`.
|
||||||
|
* @param {Array} args The arguments to invoke `func` with.
|
||||||
|
* @returns {*} Returns the result of `func`.
|
||||||
|
*/
|
||||||
|
function apply(func, thisArg, args) {
|
||||||
|
switch (args.length) {
|
||||||
|
case 0: return func.call(thisArg);
|
||||||
|
case 1: return func.call(thisArg, args[0]);
|
||||||
|
case 2: return func.call(thisArg, args[0], args[1]);
|
||||||
|
case 3: return func.call(thisArg, args[0], args[1], args[2]);
|
||||||
|
}
|
||||||
|
return func.apply(thisArg, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default apply;
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `baseAggregator` for arrays.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} setter The function to set `accumulator` values.
|
||||||
|
* @param {Function} iteratee The iteratee to transform keys.
|
||||||
|
* @param {Object} accumulator The initial aggregated object.
|
||||||
|
* @returns {Function} Returns `accumulator`.
|
||||||
|
*/
|
||||||
|
function arrayAggregator(array, setter, iteratee, accumulator) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
var value = array[index];
|
||||||
|
setter(accumulator, value, iteratee(value), array);
|
||||||
|
}
|
||||||
|
return accumulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayAggregator;
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.forEach` for arrays without support for
|
||||||
|
* iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Array} Returns `array`.
|
||||||
|
*/
|
||||||
|
function arrayEach(array, iteratee) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
if (iteratee(array[index], index, array) === false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayEach;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.forEachRight` for arrays without support for
|
||||||
|
* iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Array} Returns `array`.
|
||||||
|
*/
|
||||||
|
function arrayEachRight(array, iteratee) {
|
||||||
|
var length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
while (length--) {
|
||||||
|
if (iteratee(array[length], length, array) === false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayEachRight;
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.every` for arrays without support for
|
||||||
|
* iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||||||
|
* else `false`.
|
||||||
|
*/
|
||||||
|
function arrayEvery(array, predicate) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
if (!predicate(array[index], index, array)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayEvery;
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.filter` for arrays without support for
|
||||||
|
* iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @returns {Array} Returns the new filtered array.
|
||||||
|
*/
|
||||||
|
function arrayFilter(array, predicate) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length,
|
||||||
|
resIndex = 0,
|
||||||
|
result = [];
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
var value = array[index];
|
||||||
|
if (predicate(value, index, array)) {
|
||||||
|
result[resIndex++] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayFilter;
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
import baseIndexOf from './_baseIndexOf.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `_.includes` for arrays without support for
|
||||||
|
* specifying an index to search from.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to inspect.
|
||||||
|
* @param {*} target The value to search for.
|
||||||
|
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
||||||
|
*/
|
||||||
|
function arrayIncludes(array, value) {
|
||||||
|
var length = array == null ? 0 : array.length;
|
||||||
|
return !!length && baseIndexOf(array, value, 0) > -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayIncludes;
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* This function is like `arrayIncludes` except that it accepts a comparator.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to inspect.
|
||||||
|
* @param {*} target The value to search for.
|
||||||
|
* @param {Function} comparator The comparator invoked per element.
|
||||||
|
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
||||||
|
*/
|
||||||
|
function arrayIncludesWith(array, value, comparator) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
if (comparator(value, array[index])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayIncludesWith;
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
import baseTimes from './_baseTimes.js';
|
||||||
|
import isArguments from './isArguments.js';
|
||||||
|
import isArray from './isArray.js';
|
||||||
|
import isBuffer from './isBuffer.js';
|
||||||
|
import isIndex from './_isIndex.js';
|
||||||
|
import isTypedArray from './isTypedArray.js';
|
||||||
|
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var objectProto = Object.prototype;
|
||||||
|
|
||||||
|
/** Used to check objects for own properties. */
|
||||||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an array of the enumerable property names of the array-like `value`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to query.
|
||||||
|
* @param {boolean} inherited Specify returning inherited property names.
|
||||||
|
* @returns {Array} Returns the array of property names.
|
||||||
|
*/
|
||||||
|
function arrayLikeKeys(value, inherited) {
|
||||||
|
var isArr = isArray(value),
|
||||||
|
isArg = !isArr && isArguments(value),
|
||||||
|
isBuff = !isArr && !isArg && isBuffer(value),
|
||||||
|
isType = !isArr && !isArg && !isBuff && isTypedArray(value),
|
||||||
|
skipIndexes = isArr || isArg || isBuff || isType,
|
||||||
|
result = skipIndexes ? baseTimes(value.length, String) : [],
|
||||||
|
length = result.length;
|
||||||
|
|
||||||
|
for (var key in value) {
|
||||||
|
if ((inherited || hasOwnProperty.call(value, key)) &&
|
||||||
|
!(skipIndexes && (
|
||||||
|
// Safari 9 has enumerable `arguments.length` in strict mode.
|
||||||
|
key == 'length' ||
|
||||||
|
// Node.js 0.10 has enumerable non-index properties on buffers.
|
||||||
|
(isBuff && (key == 'offset' || key == 'parent')) ||
|
||||||
|
// PhantomJS 2 has enumerable non-index properties on typed arrays.
|
||||||
|
(isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
|
||||||
|
// Skip index properties.
|
||||||
|
isIndex(key, length)
|
||||||
|
))) {
|
||||||
|
result.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayLikeKeys;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.map` for arrays without support for iteratee
|
||||||
|
* shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Array} Returns the new mapped array.
|
||||||
|
*/
|
||||||
|
function arrayMap(array, iteratee) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length,
|
||||||
|
result = Array(length);
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
result[index] = iteratee(array[index], index, array);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayMap;
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* Appends the elements of `values` to `array`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to modify.
|
||||||
|
* @param {Array} values The values to append.
|
||||||
|
* @returns {Array} Returns `array`.
|
||||||
|
*/
|
||||||
|
function arrayPush(array, values) {
|
||||||
|
var index = -1,
|
||||||
|
length = values.length,
|
||||||
|
offset = array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
array[offset + index] = values[index];
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayPush;
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.reduce` for arrays without support for
|
||||||
|
* iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @param {*} [accumulator] The initial value.
|
||||||
|
* @param {boolean} [initAccum] Specify using the first element of `array` as
|
||||||
|
* the initial value.
|
||||||
|
* @returns {*} Returns the accumulated value.
|
||||||
|
*/
|
||||||
|
function arrayReduce(array, iteratee, accumulator, initAccum) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
if (initAccum && length) {
|
||||||
|
accumulator = array[++index];
|
||||||
|
}
|
||||||
|
while (++index < length) {
|
||||||
|
accumulator = iteratee(accumulator, array[index], index, array);
|
||||||
|
}
|
||||||
|
return accumulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayReduce;
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.reduceRight` for arrays without support for
|
||||||
|
* iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @param {*} [accumulator] The initial value.
|
||||||
|
* @param {boolean} [initAccum] Specify using the last element of `array` as
|
||||||
|
* the initial value.
|
||||||
|
* @returns {*} Returns the accumulated value.
|
||||||
|
*/
|
||||||
|
function arrayReduceRight(array, iteratee, accumulator, initAccum) {
|
||||||
|
var length = array == null ? 0 : array.length;
|
||||||
|
if (initAccum && length) {
|
||||||
|
accumulator = array[--length];
|
||||||
|
}
|
||||||
|
while (length--) {
|
||||||
|
accumulator = iteratee(accumulator, array[length], length, array);
|
||||||
|
}
|
||||||
|
return accumulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayReduceRight;
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
import baseRandom from './_baseRandom.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `_.sample` for arrays.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to sample.
|
||||||
|
* @returns {*} Returns the random element.
|
||||||
|
*/
|
||||||
|
function arraySample(array) {
|
||||||
|
var length = array.length;
|
||||||
|
return length ? array[baseRandom(0, length - 1)] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arraySample;
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
import baseClamp from './_baseClamp.js';
|
||||||
|
import copyArray from './_copyArray.js';
|
||||||
|
import shuffleSelf from './_shuffleSelf.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `_.sampleSize` for arrays.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to sample.
|
||||||
|
* @param {number} n The number of elements to sample.
|
||||||
|
* @returns {Array} Returns the random elements.
|
||||||
|
*/
|
||||||
|
function arraySampleSize(array, n) {
|
||||||
|
return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arraySampleSize;
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
import copyArray from './_copyArray.js';
|
||||||
|
import shuffleSelf from './_shuffleSelf.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `_.shuffle` for arrays.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to shuffle.
|
||||||
|
* @returns {Array} Returns the new shuffled array.
|
||||||
|
*/
|
||||||
|
function arrayShuffle(array) {
|
||||||
|
return shuffleSelf(copyArray(array));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arrayShuffle;
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* A specialized version of `_.some` for arrays without support for iteratee
|
||||||
|
* shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} [array] The array to iterate over.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||||||
|
* else `false`.
|
||||||
|
*/
|
||||||
|
function arraySome(array, predicate) {
|
||||||
|
var index = -1,
|
||||||
|
length = array == null ? 0 : array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
if (predicate(array[index], index, array)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default arraySome;
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
import baseProperty from './_baseProperty.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the size of an ASCII `string`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string inspect.
|
||||||
|
* @returns {number} Returns the string size.
|
||||||
|
*/
|
||||||
|
var asciiSize = baseProperty('length');
|
||||||
|
|
||||||
|
export default asciiSize;
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Converts an ASCII `string` to an array.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string to convert.
|
||||||
|
* @returns {Array} Returns the converted array.
|
||||||
|
*/
|
||||||
|
function asciiToArray(string) {
|
||||||
|
return string.split('');
|
||||||
|
}
|
||||||
|
|
||||||
|
export default asciiToArray;
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
/** Used to match words composed of alphanumeric characters. */
|
||||||
|
var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits an ASCII `string` into an array of its words.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} The string to inspect.
|
||||||
|
* @returns {Array} Returns the words of `string`.
|
||||||
|
*/
|
||||||
|
function asciiWords(string) {
|
||||||
|
return string.match(reAsciiWord) || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default asciiWords;
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
import baseAssignValue from './_baseAssignValue.js';
|
||||||
|
import eq from './eq.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is like `assignValue` except that it doesn't assign
|
||||||
|
* `undefined` values.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to modify.
|
||||||
|
* @param {string} key The key of the property to assign.
|
||||||
|
* @param {*} value The value to assign.
|
||||||
|
*/
|
||||||
|
function assignMergeValue(object, key, value) {
|
||||||
|
if ((value !== undefined && !eq(object[key], value)) ||
|
||||||
|
(value === undefined && !(key in object))) {
|
||||||
|
baseAssignValue(object, key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default assignMergeValue;
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
import baseAssignValue from './_baseAssignValue.js';
|
||||||
|
import eq from './eq.js';
|
||||||
|
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var objectProto = Object.prototype;
|
||||||
|
|
||||||
|
/** Used to check objects for own properties. */
|
||||||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assigns `value` to `key` of `object` if the existing value is not equivalent
|
||||||
|
* using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
||||||
|
* for equality comparisons.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to modify.
|
||||||
|
* @param {string} key The key of the property to assign.
|
||||||
|
* @param {*} value The value to assign.
|
||||||
|
*/
|
||||||
|
function assignValue(object, key, value) {
|
||||||
|
var objValue = object[key];
|
||||||
|
if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
|
||||||
|
(value === undefined && !(key in object))) {
|
||||||
|
baseAssignValue(object, key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default assignValue;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
import eq from './eq.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to inspect.
|
||||||
|
* @param {*} key The key to search for.
|
||||||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
||||||
|
*/
|
||||||
|
function assocIndexOf(array, key) {
|
||||||
|
var length = array.length;
|
||||||
|
while (length--) {
|
||||||
|
if (eq(array[length][0], key)) {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default assocIndexOf;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
import baseEach from './_baseEach.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aggregates elements of `collection` on `accumulator` with keys transformed
|
||||||
|
* by `iteratee` and values set by `setter`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array|Object} collection The collection to iterate over.
|
||||||
|
* @param {Function} setter The function to set `accumulator` values.
|
||||||
|
* @param {Function} iteratee The iteratee to transform keys.
|
||||||
|
* @param {Object} accumulator The initial aggregated object.
|
||||||
|
* @returns {Function} Returns `accumulator`.
|
||||||
|
*/
|
||||||
|
function baseAggregator(collection, setter, iteratee, accumulator) {
|
||||||
|
baseEach(collection, function(value, key, collection) {
|
||||||
|
setter(accumulator, value, iteratee(value), collection);
|
||||||
|
});
|
||||||
|
return accumulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseAggregator;
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
import copyObject from './_copyObject.js';
|
||||||
|
import keys from './keys.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.assign` without support for multiple sources
|
||||||
|
* or `customizer` functions.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The destination object.
|
||||||
|
* @param {Object} source The source object.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
*/
|
||||||
|
function baseAssign(object, source) {
|
||||||
|
return object && copyObject(source, keys(source), object);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseAssign;
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
import copyObject from './_copyObject.js';
|
||||||
|
import keysIn from './keysIn.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.assignIn` without support for multiple sources
|
||||||
|
* or `customizer` functions.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The destination object.
|
||||||
|
* @param {Object} source The source object.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
*/
|
||||||
|
function baseAssignIn(object, source) {
|
||||||
|
return object && copyObject(source, keysIn(source), object);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseAssignIn;
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
import defineProperty from './_defineProperty.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `assignValue` and `assignMergeValue` without
|
||||||
|
* value checks.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to modify.
|
||||||
|
* @param {string} key The key of the property to assign.
|
||||||
|
* @param {*} value The value to assign.
|
||||||
|
*/
|
||||||
|
function baseAssignValue(object, key, value) {
|
||||||
|
if (key == '__proto__' && defineProperty) {
|
||||||
|
defineProperty(object, key, {
|
||||||
|
'configurable': true,
|
||||||
|
'enumerable': true,
|
||||||
|
'value': value,
|
||||||
|
'writable': true
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
object[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseAssignValue;
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
import get from './get.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.at` without support for individual paths.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to iterate over.
|
||||||
|
* @param {string[]} paths The property paths to pick.
|
||||||
|
* @returns {Array} Returns the picked elements.
|
||||||
|
*/
|
||||||
|
function baseAt(object, paths) {
|
||||||
|
var index = -1,
|
||||||
|
length = paths.length,
|
||||||
|
result = Array(length),
|
||||||
|
skip = object == null;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
result[index] = skip ? undefined : get(object, paths[index]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseAt;
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* The base implementation of `_.clamp` which doesn't coerce arguments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {number} number The number to clamp.
|
||||||
|
* @param {number} [lower] The lower bound.
|
||||||
|
* @param {number} upper The upper bound.
|
||||||
|
* @returns {number} Returns the clamped number.
|
||||||
|
*/
|
||||||
|
function baseClamp(number, lower, upper) {
|
||||||
|
if (number === number) {
|
||||||
|
if (upper !== undefined) {
|
||||||
|
number = number <= upper ? number : upper;
|
||||||
|
}
|
||||||
|
if (lower !== undefined) {
|
||||||
|
number = number >= lower ? number : lower;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseClamp;
|
||||||
@ -0,0 +1,166 @@
|
|||||||
|
import Stack from './_Stack.js';
|
||||||
|
import arrayEach from './_arrayEach.js';
|
||||||
|
import assignValue from './_assignValue.js';
|
||||||
|
import baseAssign from './_baseAssign.js';
|
||||||
|
import baseAssignIn from './_baseAssignIn.js';
|
||||||
|
import cloneBuffer from './_cloneBuffer.js';
|
||||||
|
import copyArray from './_copyArray.js';
|
||||||
|
import copySymbols from './_copySymbols.js';
|
||||||
|
import copySymbolsIn from './_copySymbolsIn.js';
|
||||||
|
import getAllKeys from './_getAllKeys.js';
|
||||||
|
import getAllKeysIn from './_getAllKeysIn.js';
|
||||||
|
import getTag from './_getTag.js';
|
||||||
|
import initCloneArray from './_initCloneArray.js';
|
||||||
|
import initCloneByTag from './_initCloneByTag.js';
|
||||||
|
import initCloneObject from './_initCloneObject.js';
|
||||||
|
import isArray from './isArray.js';
|
||||||
|
import isBuffer from './isBuffer.js';
|
||||||
|
import isMap from './isMap.js';
|
||||||
|
import isObject from './isObject.js';
|
||||||
|
import isSet from './isSet.js';
|
||||||
|
import keys from './keys.js';
|
||||||
|
import keysIn from './keysIn.js';
|
||||||
|
|
||||||
|
/** Used to compose bitmasks for cloning. */
|
||||||
|
var CLONE_DEEP_FLAG = 1,
|
||||||
|
CLONE_FLAT_FLAG = 2,
|
||||||
|
CLONE_SYMBOLS_FLAG = 4;
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var argsTag = '[object Arguments]',
|
||||||
|
arrayTag = '[object Array]',
|
||||||
|
boolTag = '[object Boolean]',
|
||||||
|
dateTag = '[object Date]',
|
||||||
|
errorTag = '[object Error]',
|
||||||
|
funcTag = '[object Function]',
|
||||||
|
genTag = '[object GeneratorFunction]',
|
||||||
|
mapTag = '[object Map]',
|
||||||
|
numberTag = '[object Number]',
|
||||||
|
objectTag = '[object Object]',
|
||||||
|
regexpTag = '[object RegExp]',
|
||||||
|
setTag = '[object Set]',
|
||||||
|
stringTag = '[object String]',
|
||||||
|
symbolTag = '[object Symbol]',
|
||||||
|
weakMapTag = '[object WeakMap]';
|
||||||
|
|
||||||
|
var arrayBufferTag = '[object ArrayBuffer]',
|
||||||
|
dataViewTag = '[object DataView]',
|
||||||
|
float32Tag = '[object Float32Array]',
|
||||||
|
float64Tag = '[object Float64Array]',
|
||||||
|
int8Tag = '[object Int8Array]',
|
||||||
|
int16Tag = '[object Int16Array]',
|
||||||
|
int32Tag = '[object Int32Array]',
|
||||||
|
uint8Tag = '[object Uint8Array]',
|
||||||
|
uint8ClampedTag = '[object Uint8ClampedArray]',
|
||||||
|
uint16Tag = '[object Uint16Array]',
|
||||||
|
uint32Tag = '[object Uint32Array]';
|
||||||
|
|
||||||
|
/** Used to identify `toStringTag` values supported by `_.clone`. */
|
||||||
|
var cloneableTags = {};
|
||||||
|
cloneableTags[argsTag] = cloneableTags[arrayTag] =
|
||||||
|
cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
|
||||||
|
cloneableTags[boolTag] = cloneableTags[dateTag] =
|
||||||
|
cloneableTags[float32Tag] = cloneableTags[float64Tag] =
|
||||||
|
cloneableTags[int8Tag] = cloneableTags[int16Tag] =
|
||||||
|
cloneableTags[int32Tag] = cloneableTags[mapTag] =
|
||||||
|
cloneableTags[numberTag] = cloneableTags[objectTag] =
|
||||||
|
cloneableTags[regexpTag] = cloneableTags[setTag] =
|
||||||
|
cloneableTags[stringTag] = cloneableTags[symbolTag] =
|
||||||
|
cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
|
||||||
|
cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
|
||||||
|
cloneableTags[errorTag] = cloneableTags[funcTag] =
|
||||||
|
cloneableTags[weakMapTag] = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.clone` and `_.cloneDeep` which tracks
|
||||||
|
* traversed objects.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to clone.
|
||||||
|
* @param {boolean} bitmask The bitmask flags.
|
||||||
|
* 1 - Deep clone
|
||||||
|
* 2 - Flatten inherited properties
|
||||||
|
* 4 - Clone symbols
|
||||||
|
* @param {Function} [customizer] The function to customize cloning.
|
||||||
|
* @param {string} [key] The key of `value`.
|
||||||
|
* @param {Object} [object] The parent object of `value`.
|
||||||
|
* @param {Object} [stack] Tracks traversed objects and their clone counterparts.
|
||||||
|
* @returns {*} Returns the cloned value.
|
||||||
|
*/
|
||||||
|
function baseClone(value, bitmask, customizer, key, object, stack) {
|
||||||
|
var result,
|
||||||
|
isDeep = bitmask & CLONE_DEEP_FLAG,
|
||||||
|
isFlat = bitmask & CLONE_FLAT_FLAG,
|
||||||
|
isFull = bitmask & CLONE_SYMBOLS_FLAG;
|
||||||
|
|
||||||
|
if (customizer) {
|
||||||
|
result = object ? customizer(value, key, object, stack) : customizer(value);
|
||||||
|
}
|
||||||
|
if (result !== undefined) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (!isObject(value)) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
var isArr = isArray(value);
|
||||||
|
if (isArr) {
|
||||||
|
result = initCloneArray(value);
|
||||||
|
if (!isDeep) {
|
||||||
|
return copyArray(value, result);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var tag = getTag(value),
|
||||||
|
isFunc = tag == funcTag || tag == genTag;
|
||||||
|
|
||||||
|
if (isBuffer(value)) {
|
||||||
|
return cloneBuffer(value, isDeep);
|
||||||
|
}
|
||||||
|
if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
|
||||||
|
result = (isFlat || isFunc) ? {} : initCloneObject(value);
|
||||||
|
if (!isDeep) {
|
||||||
|
return isFlat
|
||||||
|
? copySymbolsIn(value, baseAssignIn(result, value))
|
||||||
|
: copySymbols(value, baseAssign(result, value));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!cloneableTags[tag]) {
|
||||||
|
return object ? value : {};
|
||||||
|
}
|
||||||
|
result = initCloneByTag(value, tag, isDeep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check for circular references and return its corresponding clone.
|
||||||
|
stack || (stack = new Stack);
|
||||||
|
var stacked = stack.get(value);
|
||||||
|
if (stacked) {
|
||||||
|
return stacked;
|
||||||
|
}
|
||||||
|
stack.set(value, result);
|
||||||
|
|
||||||
|
if (isSet(value)) {
|
||||||
|
value.forEach(function(subValue) {
|
||||||
|
result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
|
||||||
|
});
|
||||||
|
} else if (isMap(value)) {
|
||||||
|
value.forEach(function(subValue, key) {
|
||||||
|
result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var keysFunc = isFull
|
||||||
|
? (isFlat ? getAllKeysIn : getAllKeys)
|
||||||
|
: (isFlat ? keysIn : keys);
|
||||||
|
|
||||||
|
var props = isArr ? undefined : keysFunc(value);
|
||||||
|
arrayEach(props || value, function(subValue, key) {
|
||||||
|
if (props) {
|
||||||
|
key = subValue;
|
||||||
|
subValue = value[key];
|
||||||
|
}
|
||||||
|
// Recursively populate clone (susceptible to call stack limits).
|
||||||
|
assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseClone;
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
import baseConformsTo from './_baseConformsTo.js';
|
||||||
|
import keys from './keys.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.conforms` which doesn't clone `source`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} source The object of property predicates to conform to.
|
||||||
|
* @returns {Function} Returns the new spec function.
|
||||||
|
*/
|
||||||
|
function baseConforms(source) {
|
||||||
|
var props = keys(source);
|
||||||
|
return function(object) {
|
||||||
|
return baseConformsTo(object, source, props);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseConforms;
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* The base implementation of `_.conformsTo` which accepts `props` to check.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to inspect.
|
||||||
|
* @param {Object} source The object of property predicates to conform to.
|
||||||
|
* @returns {boolean} Returns `true` if `object` conforms, else `false`.
|
||||||
|
*/
|
||||||
|
function baseConformsTo(object, source, props) {
|
||||||
|
var length = props.length;
|
||||||
|
if (object == null) {
|
||||||
|
return !length;
|
||||||
|
}
|
||||||
|
object = Object(object);
|
||||||
|
while (length--) {
|
||||||
|
var key = props[length],
|
||||||
|
predicate = source[key],
|
||||||
|
value = object[key];
|
||||||
|
|
||||||
|
if ((value === undefined && !(key in object)) || !predicate(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseConformsTo;
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
import isObject from './isObject.js';
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var objectCreate = Object.create;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.create` without support for assigning
|
||||||
|
* properties to the created object.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} proto The object to inherit from.
|
||||||
|
* @returns {Object} Returns the new object.
|
||||||
|
*/
|
||||||
|
var baseCreate = (function() {
|
||||||
|
function object() {}
|
||||||
|
return function(proto) {
|
||||||
|
if (!isObject(proto)) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (objectCreate) {
|
||||||
|
return objectCreate(proto);
|
||||||
|
}
|
||||||
|
object.prototype = proto;
|
||||||
|
var result = new object;
|
||||||
|
object.prototype = undefined;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
export default baseCreate;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
/** Error message constants. */
|
||||||
|
var FUNC_ERROR_TEXT = 'Expected a function';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.delay` and `_.defer` which accepts `args`
|
||||||
|
* to provide to `func`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} func The function to delay.
|
||||||
|
* @param {number} wait The number of milliseconds to delay invocation.
|
||||||
|
* @param {Array} args The arguments to provide to `func`.
|
||||||
|
* @returns {number|Object} Returns the timer id or timeout object.
|
||||||
|
*/
|
||||||
|
function baseDelay(func, wait, args) {
|
||||||
|
if (typeof func != 'function') {
|
||||||
|
throw new TypeError(FUNC_ERROR_TEXT);
|
||||||
|
}
|
||||||
|
return setTimeout(function() { func.apply(undefined, args); }, wait);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseDelay;
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
import SetCache from './_SetCache.js';
|
||||||
|
import arrayIncludes from './_arrayIncludes.js';
|
||||||
|
import arrayIncludesWith from './_arrayIncludesWith.js';
|
||||||
|
import arrayMap from './_arrayMap.js';
|
||||||
|
import baseUnary from './_baseUnary.js';
|
||||||
|
import cacheHas from './_cacheHas.js';
|
||||||
|
|
||||||
|
/** Used as the size to enable large array optimizations. */
|
||||||
|
var LARGE_ARRAY_SIZE = 200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of methods like `_.difference` without support
|
||||||
|
* for excluding multiple arrays or iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to inspect.
|
||||||
|
* @param {Array} values The values to exclude.
|
||||||
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
||||||
|
* @param {Function} [comparator] The comparator invoked per element.
|
||||||
|
* @returns {Array} Returns the new array of filtered values.
|
||||||
|
*/
|
||||||
|
function baseDifference(array, values, iteratee, comparator) {
|
||||||
|
var index = -1,
|
||||||
|
includes = arrayIncludes,
|
||||||
|
isCommon = true,
|
||||||
|
length = array.length,
|
||||||
|
result = [],
|
||||||
|
valuesLength = values.length;
|
||||||
|
|
||||||
|
if (!length) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (iteratee) {
|
||||||
|
values = arrayMap(values, baseUnary(iteratee));
|
||||||
|
}
|
||||||
|
if (comparator) {
|
||||||
|
includes = arrayIncludesWith;
|
||||||
|
isCommon = false;
|
||||||
|
}
|
||||||
|
else if (values.length >= LARGE_ARRAY_SIZE) {
|
||||||
|
includes = cacheHas;
|
||||||
|
isCommon = false;
|
||||||
|
values = new SetCache(values);
|
||||||
|
}
|
||||||
|
outer:
|
||||||
|
while (++index < length) {
|
||||||
|
var value = array[index],
|
||||||
|
computed = iteratee == null ? value : iteratee(value);
|
||||||
|
|
||||||
|
value = (comparator || value !== 0) ? value : 0;
|
||||||
|
if (isCommon && computed === computed) {
|
||||||
|
var valuesIndex = valuesLength;
|
||||||
|
while (valuesIndex--) {
|
||||||
|
if (values[valuesIndex] === computed) {
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.push(value);
|
||||||
|
}
|
||||||
|
else if (!includes(values, computed, comparator)) {
|
||||||
|
result.push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseDifference;
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
import baseForOwn from './_baseForOwn.js';
|
||||||
|
import createBaseEach from './_createBaseEach.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.forEach` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array|Object} collection The collection to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Array|Object} Returns `collection`.
|
||||||
|
*/
|
||||||
|
var baseEach = createBaseEach(baseForOwn);
|
||||||
|
|
||||||
|
export default baseEach;
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
import baseForOwnRight from './_baseForOwnRight.js';
|
||||||
|
import createBaseEach from './_createBaseEach.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.forEachRight` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array|Object} collection The collection to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Array|Object} Returns `collection`.
|
||||||
|
*/
|
||||||
|
var baseEachRight = createBaseEach(baseForOwnRight, true);
|
||||||
|
|
||||||
|
export default baseEachRight;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
import baseEach from './_baseEach.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.every` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array|Object} collection The collection to iterate over.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||||||
|
* else `false`
|
||||||
|
*/
|
||||||
|
function baseEvery(collection, predicate) {
|
||||||
|
var result = true;
|
||||||
|
baseEach(collection, function(value, index, collection) {
|
||||||
|
result = !!predicate(value, index, collection);
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseEvery;
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
import isSymbol from './isSymbol.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of methods like `_.max` and `_.min` which accepts a
|
||||||
|
* `comparator` to determine the extremum value.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to iterate over.
|
||||||
|
* @param {Function} iteratee The iteratee invoked per iteration.
|
||||||
|
* @param {Function} comparator The comparator used to compare values.
|
||||||
|
* @returns {*} Returns the extremum value.
|
||||||
|
*/
|
||||||
|
function baseExtremum(array, iteratee, comparator) {
|
||||||
|
var index = -1,
|
||||||
|
length = array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
var value = array[index],
|
||||||
|
current = iteratee(value);
|
||||||
|
|
||||||
|
if (current != null && (computed === undefined
|
||||||
|
? (current === current && !isSymbol(current))
|
||||||
|
: comparator(current, computed)
|
||||||
|
)) {
|
||||||
|
var computed = current,
|
||||||
|
result = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseExtremum;
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
import toInteger from './toInteger.js';
|
||||||
|
import toLength from './toLength.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.fill` without an iteratee call guard.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to fill.
|
||||||
|
* @param {*} value The value to fill `array` with.
|
||||||
|
* @param {number} [start=0] The start position.
|
||||||
|
* @param {number} [end=array.length] The end position.
|
||||||
|
* @returns {Array} Returns `array`.
|
||||||
|
*/
|
||||||
|
function baseFill(array, value, start, end) {
|
||||||
|
var length = array.length;
|
||||||
|
|
||||||
|
start = toInteger(start);
|
||||||
|
if (start < 0) {
|
||||||
|
start = -start > length ? 0 : (length + start);
|
||||||
|
}
|
||||||
|
end = (end === undefined || end > length) ? length : toInteger(end);
|
||||||
|
if (end < 0) {
|
||||||
|
end += length;
|
||||||
|
}
|
||||||
|
end = start > end ? 0 : toLength(end);
|
||||||
|
while (start < end) {
|
||||||
|
array[start++] = value;
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseFill;
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
import baseEach from './_baseEach.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.filter` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array|Object} collection The collection to iterate over.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @returns {Array} Returns the new filtered array.
|
||||||
|
*/
|
||||||
|
function baseFilter(collection, predicate) {
|
||||||
|
var result = [];
|
||||||
|
baseEach(collection, function(value, index, collection) {
|
||||||
|
if (predicate(value, index, collection)) {
|
||||||
|
result.push(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseFilter;
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* The base implementation of `_.findIndex` and `_.findLastIndex` without
|
||||||
|
* support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to inspect.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @param {number} fromIndex The index to search from.
|
||||||
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||||||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
||||||
|
*/
|
||||||
|
function baseFindIndex(array, predicate, fromIndex, fromRight) {
|
||||||
|
var length = array.length,
|
||||||
|
index = fromIndex + (fromRight ? 1 : -1);
|
||||||
|
|
||||||
|
while ((fromRight ? index-- : ++index < length)) {
|
||||||
|
if (predicate(array[index], index, array)) {
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseFindIndex;
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* The base implementation of methods like `_.findKey` and `_.findLastKey`,
|
||||||
|
* without support for iteratee shorthands, which iterates over `collection`
|
||||||
|
* using `eachFunc`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array|Object} collection The collection to inspect.
|
||||||
|
* @param {Function} predicate The function invoked per iteration.
|
||||||
|
* @param {Function} eachFunc The function to iterate over `collection`.
|
||||||
|
* @returns {*} Returns the found element or its key, else `undefined`.
|
||||||
|
*/
|
||||||
|
function baseFindKey(collection, predicate, eachFunc) {
|
||||||
|
var result;
|
||||||
|
eachFunc(collection, function(value, key, collection) {
|
||||||
|
if (predicate(value, key, collection)) {
|
||||||
|
result = key;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseFindKey;
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
import arrayPush from './_arrayPush.js';
|
||||||
|
import isFlattenable from './_isFlattenable.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.flatten` with support for restricting flattening.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to flatten.
|
||||||
|
* @param {number} depth The maximum recursion depth.
|
||||||
|
* @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
|
||||||
|
* @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
|
||||||
|
* @param {Array} [result=[]] The initial result value.
|
||||||
|
* @returns {Array} Returns the new flattened array.
|
||||||
|
*/
|
||||||
|
function baseFlatten(array, depth, predicate, isStrict, result) {
|
||||||
|
var index = -1,
|
||||||
|
length = array.length;
|
||||||
|
|
||||||
|
predicate || (predicate = isFlattenable);
|
||||||
|
result || (result = []);
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
var value = array[index];
|
||||||
|
if (depth > 0 && predicate(value)) {
|
||||||
|
if (depth > 1) {
|
||||||
|
// Recursively flatten arrays (susceptible to call stack limits).
|
||||||
|
baseFlatten(value, depth - 1, predicate, isStrict, result);
|
||||||
|
} else {
|
||||||
|
arrayPush(result, value);
|
||||||
|
}
|
||||||
|
} else if (!isStrict) {
|
||||||
|
result[result.length] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseFlatten;
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
import createBaseFor from './_createBaseFor.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `baseForOwn` which iterates over `object`
|
||||||
|
* properties returned by `keysFunc` and invokes `iteratee` for each property.
|
||||||
|
* Iteratee functions may exit iteration early by explicitly returning `false`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @param {Function} keysFunc The function to get the keys of `object`.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
*/
|
||||||
|
var baseFor = createBaseFor();
|
||||||
|
|
||||||
|
export default baseFor;
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
import baseFor from './_baseFor.js';
|
||||||
|
import keys from './keys.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.forOwn` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
*/
|
||||||
|
function baseForOwn(object, iteratee) {
|
||||||
|
return object && baseFor(object, iteratee, keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseForOwn;
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
import baseForRight from './_baseForRight.js';
|
||||||
|
import keys from './keys.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.forOwnRight` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
*/
|
||||||
|
function baseForOwnRight(object, iteratee) {
|
||||||
|
return object && baseForRight(object, iteratee, keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseForOwnRight;
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
import createBaseFor from './_createBaseFor.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is like `baseFor` except that it iterates over properties
|
||||||
|
* in the opposite order.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to iterate over.
|
||||||
|
* @param {Function} iteratee The function invoked per iteration.
|
||||||
|
* @param {Function} keysFunc The function to get the keys of `object`.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
*/
|
||||||
|
var baseForRight = createBaseFor(true);
|
||||||
|
|
||||||
|
export default baseForRight;
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
import arrayFilter from './_arrayFilter.js';
|
||||||
|
import isFunction from './isFunction.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.functions` which creates an array of
|
||||||
|
* `object` function property names filtered from `props`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to inspect.
|
||||||
|
* @param {Array} props The property names to filter.
|
||||||
|
* @returns {Array} Returns the function names.
|
||||||
|
*/
|
||||||
|
function baseFunctions(object, props) {
|
||||||
|
return arrayFilter(props, function(key) {
|
||||||
|
return isFunction(object[key]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseFunctions;
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
import castPath from './_castPath.js';
|
||||||
|
import toKey from './_toKey.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.get` without support for default values.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to query.
|
||||||
|
* @param {Array|string} path The path of the property to get.
|
||||||
|
* @returns {*} Returns the resolved value.
|
||||||
|
*/
|
||||||
|
function baseGet(object, path) {
|
||||||
|
path = castPath(path, object);
|
||||||
|
|
||||||
|
var index = 0,
|
||||||
|
length = path.length;
|
||||||
|
|
||||||
|
while (object != null && index < length) {
|
||||||
|
object = object[toKey(path[index++])];
|
||||||
|
}
|
||||||
|
return (index && index == length) ? object : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseGet;
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
import arrayPush from './_arrayPush.js';
|
||||||
|
import isArray from './isArray.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
|
||||||
|
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
|
||||||
|
* symbols of `object`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to query.
|
||||||
|
* @param {Function} keysFunc The function to get the keys of `object`.
|
||||||
|
* @param {Function} symbolsFunc The function to get the symbols of `object`.
|
||||||
|
* @returns {Array} Returns the array of property names and symbols.
|
||||||
|
*/
|
||||||
|
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
|
||||||
|
var result = keysFunc(object);
|
||||||
|
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseGetAllKeys;
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
import Symbol from './_Symbol.js';
|
||||||
|
import getRawTag from './_getRawTag.js';
|
||||||
|
import objectToString from './_objectToString.js';
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var nullTag = '[object Null]',
|
||||||
|
undefinedTag = '[object Undefined]';
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `getTag` without fallbacks for buggy environments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to query.
|
||||||
|
* @returns {string} Returns the `toStringTag`.
|
||||||
|
*/
|
||||||
|
function baseGetTag(value) {
|
||||||
|
if (value == null) {
|
||||||
|
return value === undefined ? undefinedTag : nullTag;
|
||||||
|
}
|
||||||
|
return (symToStringTag && symToStringTag in Object(value))
|
||||||
|
? getRawTag(value)
|
||||||
|
: objectToString(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default baseGetTag;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue