Add initial work on frontend-core refactor
This commit is contained in:
parent
3bcad013c7
commit
0201841b90
|
@ -81,6 +81,3 @@ export { default as clickOutside } from "./Actions/click_outside"
|
||||||
|
|
||||||
// Stores
|
// Stores
|
||||||
export { notifications, createNotificationStore } from "./Stores/notifications"
|
export { notifications, createNotificationStore } from "./Stores/notifications"
|
||||||
|
|
||||||
// Utils
|
|
||||||
export * from "./utils/helpers"
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
export function uuid() {
|
|
||||||
// always want to make this start with a letter, as this makes it
|
|
||||||
// easier to use with template string bindings in the client
|
|
||||||
return "cxxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, c => {
|
|
||||||
const r = (Math.random() * 16) | 0,
|
|
||||||
v = c == "x" ? r : (r & 0x3) | 0x8
|
|
||||||
return v.toString(16)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,58 +1,3 @@
|
||||||
/**
|
|
||||||
* Operator options for lucene queries
|
|
||||||
*/
|
|
||||||
export const OperatorOptions = {
|
|
||||||
Equals: {
|
|
||||||
value: "equal",
|
|
||||||
label: "Equals",
|
|
||||||
},
|
|
||||||
NotEquals: {
|
|
||||||
value: "notEqual",
|
|
||||||
label: "Not equals",
|
|
||||||
},
|
|
||||||
Empty: {
|
|
||||||
value: "empty",
|
|
||||||
label: "Is empty",
|
|
||||||
},
|
|
||||||
NotEmpty: {
|
|
||||||
value: "notEmpty",
|
|
||||||
label: "Is not empty",
|
|
||||||
},
|
|
||||||
StartsWith: {
|
|
||||||
value: "string",
|
|
||||||
label: "Starts with",
|
|
||||||
},
|
|
||||||
Like: {
|
|
||||||
value: "fuzzy",
|
|
||||||
label: "Like",
|
|
||||||
},
|
|
||||||
MoreThan: {
|
|
||||||
value: "rangeLow",
|
|
||||||
label: "More than",
|
|
||||||
},
|
|
||||||
LessThan: {
|
|
||||||
value: "rangeHigh",
|
|
||||||
label: "Less than",
|
|
||||||
},
|
|
||||||
Contains: {
|
|
||||||
value: "equal",
|
|
||||||
label: "Contains",
|
|
||||||
},
|
|
||||||
NotContains: {
|
|
||||||
value: "notEqual",
|
|
||||||
label: "Does Not Contain",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export const NoEmptyFilterStrings = [
|
|
||||||
OperatorOptions.StartsWith.value,
|
|
||||||
OperatorOptions.Like.value,
|
|
||||||
OperatorOptions.Equals.value,
|
|
||||||
OperatorOptions.NotEquals.value,
|
|
||||||
OperatorOptions.Contains.value,
|
|
||||||
OperatorOptions.NotContains.value,
|
|
||||||
]
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the valid operator options for a certain data type
|
* Returns the valid operator options for a certain data type
|
||||||
* @param type the data type
|
* @param type the data type
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@budibase/bbui": "^1.0.27-alpha.19",
|
"@budibase/bbui": "^1.0.27-alpha.19",
|
||||||
|
"@budibase/frontend-core": "^1.0.27-alpha.19",
|
||||||
"@budibase/standard-components": "^0.9.139",
|
"@budibase/standard-components": "^0.9.139",
|
||||||
"@budibase/string-templates": "^1.0.27-alpha.19",
|
"@budibase/string-templates": "^1.0.27-alpha.19",
|
||||||
"regexparam": "^1.3.0",
|
"regexparam": "^1.3.0",
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
import { notificationStore } from "stores"
|
|
||||||
import { ApiVersion } from "constants"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* API cache for cached request responses.
|
|
||||||
*/
|
|
||||||
let cache = {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for API errors.
|
|
||||||
*/
|
|
||||||
const handleError = error => {
|
|
||||||
return { error }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs an API call to the server.
|
|
||||||
* App ID header is always correctly set.
|
|
||||||
*/
|
|
||||||
const makeApiCall = async ({ method, url, body, json = true }) => {
|
|
||||||
try {
|
|
||||||
const requestBody = json ? JSON.stringify(body) : body
|
|
||||||
const inBuilder = window["##BUDIBASE_IN_BUILDER##"]
|
|
||||||
const headers = {
|
|
||||||
Accept: "application/json",
|
|
||||||
"x-budibase-app-id": window["##BUDIBASE_APP_ID##"],
|
|
||||||
"x-budibase-api-version": ApiVersion,
|
|
||||||
...(json && { "Content-Type": "application/json" }),
|
|
||||||
...(!inBuilder && { "x-budibase-type": "client" }),
|
|
||||||
}
|
|
||||||
const response = await fetch(url, {
|
|
||||||
method,
|
|
||||||
headers,
|
|
||||||
body: requestBody,
|
|
||||||
credentials: "same-origin",
|
|
||||||
})
|
|
||||||
switch (response.status) {
|
|
||||||
case 200:
|
|
||||||
return response.json()
|
|
||||||
case 401:
|
|
||||||
notificationStore.actions.error("Invalid credentials")
|
|
||||||
return handleError(`Invalid credentials`)
|
|
||||||
case 404:
|
|
||||||
notificationStore.actions.warning("Not found")
|
|
||||||
return handleError(`${url}: Not Found`)
|
|
||||||
case 400:
|
|
||||||
return handleError(`${url}: Bad Request`)
|
|
||||||
case 403:
|
|
||||||
notificationStore.actions.error(
|
|
||||||
"Your session has expired, or you don't have permission to access that data"
|
|
||||||
)
|
|
||||||
return handleError(`${url}: Forbidden`)
|
|
||||||
default:
|
|
||||||
if (response.status >= 200 && response.status < 400) {
|
|
||||||
return response.json()
|
|
||||||
}
|
|
||||||
return handleError(`${url} - ${response.statusText}`)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
return handleError(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs an API call to the server and caches the response.
|
|
||||||
* Future invocation for this URL will return the cached result instead of
|
|
||||||
* hitting the server again.
|
|
||||||
*/
|
|
||||||
const makeCachedApiCall = async params => {
|
|
||||||
const identifier = params.url
|
|
||||||
if (!identifier) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
if (!cache[identifier]) {
|
|
||||||
cache[identifier] = makeApiCall(params)
|
|
||||||
cache[identifier] = await cache[identifier]
|
|
||||||
}
|
|
||||||
return await cache[identifier]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an API call function for a particular HTTP method.
|
|
||||||
*/
|
|
||||||
const requestApiCall = method => async params => {
|
|
||||||
const { url, cache = false } = params
|
|
||||||
const fixedUrl = `/${url}`.replace("//", "/")
|
|
||||||
const enrichedParams = { ...params, method, url: fixedUrl }
|
|
||||||
return await (cache ? makeCachedApiCall : makeApiCall)(enrichedParams)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
post: requestApiCall("POST"),
|
|
||||||
get: requestApiCall("GET"),
|
|
||||||
patch: requestApiCall("PATCH"),
|
|
||||||
del: requestApiCall("DELETE"),
|
|
||||||
error: handleError,
|
|
||||||
}
|
|
|
@ -2,8 +2,7 @@
|
||||||
import { getContext } from "svelte"
|
import { getContext } from "svelte"
|
||||||
import { ProgressCircle, Pagination } from "@budibase/bbui"
|
import { ProgressCircle, Pagination } from "@budibase/bbui"
|
||||||
import Placeholder from "./Placeholder.svelte"
|
import Placeholder from "./Placeholder.svelte"
|
||||||
import { fetchData } from "utils/fetch/fetchData.js"
|
import { fetchData, LuceneUtils } from "@budibase/frontend-core"
|
||||||
import { buildLuceneQuery } from "builder/src/helpers/lucene"
|
|
||||||
|
|
||||||
export let dataSource
|
export let dataSource
|
||||||
export let filter
|
export let filter
|
||||||
|
@ -18,7 +17,7 @@
|
||||||
// We need to manage our lucene query manually as we want to allow components
|
// We need to manage our lucene query manually as we want to allow components
|
||||||
// to extend it
|
// to extend it
|
||||||
let queryExtensions = {}
|
let queryExtensions = {}
|
||||||
$: defaultQuery = buildLuceneQuery(filter)
|
$: defaultQuery = LuceneUtils.buildLuceneQuery(filter)
|
||||||
$: query = extendQuery(defaultQuery, queryExtensions)
|
$: query = extendQuery(defaultQuery, queryExtensions)
|
||||||
|
|
||||||
// Keep our data fetch instance up to date
|
// Keep our data fetch instance up to date
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
import { getContext, onDestroy } from "svelte"
|
import { getContext, onDestroy } from "svelte"
|
||||||
import { ModalContent, Modal } from "@budibase/bbui"
|
import { ModalContent, Modal } from "@budibase/bbui"
|
||||||
import FilterModal from "./FilterModal.svelte"
|
import FilterModal from "./FilterModal.svelte"
|
||||||
import { buildLuceneQuery } from "builder/src/helpers/lucene"
|
import { LuceneUtils } from "@budibase/frontend-core"
|
||||||
import Button from "../Button.svelte"
|
import Button from "../Button.svelte"
|
||||||
|
|
||||||
export let dataProvider
|
export let dataProvider
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
// Add query extension to data provider
|
// Add query extension to data provider
|
||||||
$: {
|
$: {
|
||||||
if (filters?.length) {
|
if (filters?.length) {
|
||||||
const queryExtension = buildLuceneQuery(filters)
|
const queryExtension = LuceneUtils.buildLuceneQuery(filters)
|
||||||
addExtension?.($component.id, queryExtension)
|
addExtension?.($component.id, queryExtension)
|
||||||
} else {
|
} else {
|
||||||
removeExtension?.($component.id)
|
removeExtension?.($component.id)
|
||||||
|
|
|
@ -11,14 +11,12 @@
|
||||||
Select,
|
Select,
|
||||||
} from "@budibase/bbui"
|
} from "@budibase/bbui"
|
||||||
import { generate } from "shortid"
|
import { generate } from "shortid"
|
||||||
import {
|
import { LuceneUtils } from "@budibase/frontend-core"
|
||||||
getValidOperatorsForType,
|
|
||||||
OperatorOptions,
|
|
||||||
} from "builder/src/constants/lucene"
|
|
||||||
|
|
||||||
export let schemaFields
|
export let schemaFields
|
||||||
export let filters = []
|
export let filters = []
|
||||||
|
|
||||||
|
const operatorOptions = LuceneUtils.OperatorOptions
|
||||||
const BannedTypes = ["link", "attachment", "formula", "json"]
|
const BannedTypes = ["link", "attachment", "formula", "json"]
|
||||||
|
|
||||||
$: fieldOptions = (schemaFields ?? [])
|
$: fieldOptions = (schemaFields ?? [])
|
||||||
|
@ -31,7 +29,7 @@
|
||||||
{
|
{
|
||||||
id: generate(),
|
id: generate(),
|
||||||
field: null,
|
field: null,
|
||||||
operator: OperatorOptions.Equals.value,
|
operator: operatorOptions.Equals.value,
|
||||||
value: null,
|
value: null,
|
||||||
valueType: "Value",
|
valueType: "Value",
|
||||||
},
|
},
|
||||||
|
@ -53,11 +51,11 @@
|
||||||
expression.type = schemaFields.find(x => x.name === field)?.type
|
expression.type = schemaFields.find(x => x.name === field)?.type
|
||||||
|
|
||||||
// Ensure a valid operator is set
|
// Ensure a valid operator is set
|
||||||
const validOperators = getValidOperatorsForType(expression.type).map(
|
const validOperators = LuceneUtils.getValidOperatorsForType(
|
||||||
x => x.value
|
expression.type
|
||||||
)
|
).map(x => x.value)
|
||||||
if (!validOperators.includes(expression.operator)) {
|
if (!validOperators.includes(expression.operator)) {
|
||||||
expression.operator = validOperators[0] ?? OperatorOptions.Equals.value
|
expression.operator = validOperators[0] ?? operatorOptions.Equals.value
|
||||||
onOperatorChange(expression, expression.operator)
|
onOperatorChange(expression, expression.operator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,8 +70,8 @@
|
||||||
|
|
||||||
const onOperatorChange = (expression, operator) => {
|
const onOperatorChange = (expression, operator) => {
|
||||||
const noValueOptions = [
|
const noValueOptions = [
|
||||||
OperatorOptions.Empty.value,
|
operatorOptions.Empty.value,
|
||||||
OperatorOptions.NotEmpty.value,
|
operatorOptions.NotEmpty.value,
|
||||||
]
|
]
|
||||||
expression.noValue = noValueOptions.includes(operator)
|
expression.noValue = noValueOptions.includes(operator)
|
||||||
if (expression.noValue) {
|
if (expression.noValue) {
|
||||||
|
@ -109,7 +107,7 @@
|
||||||
/>
|
/>
|
||||||
<Select
|
<Select
|
||||||
disabled={!filter.field}
|
disabled={!filter.field}
|
||||||
options={getValidOperatorsForType(filter.type)}
|
options={LuceneUtils.getValidOperatorsForType(filter.type)}
|
||||||
bind:value={filter.operator}
|
bind:value={filter.operator}
|
||||||
on:change={e => onOperatorChange(filter, e.detail)}
|
on:change={e => onOperatorChange(filter, e.detail)}
|
||||||
placeholder={null}
|
placeholder={null}
|
||||||
|
|
|
@ -32,11 +32,3 @@ export const ActionTypes = {
|
||||||
ClearForm: "ClearForm",
|
ClearForm: "ClearForm",
|
||||||
ChangeFormStep: "ChangeFormStep",
|
ChangeFormStep: "ChangeFormStep",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ApiVersion = "1"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* API Version Changelog
|
|
||||||
* v1:
|
|
||||||
* - Coerce types for search endpoint
|
|
||||||
*/
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { writable, get, derived } from "svelte/store"
|
import { writable, get, derived } from "svelte/store"
|
||||||
import { localStorageStore } from "builder/src/builderStore/store/localStorage"
|
import { createLocalStorageStore } from "@budibase/frontend-core"
|
||||||
|
|
||||||
const createStateStore = () => {
|
const createStateStore = () => {
|
||||||
const appId = window["##BUDIBASE_APP_ID##"] || "app"
|
const appId = window["##BUDIBASE_APP_ID##"] || "app"
|
||||||
const localStorageKey = `${appId}.state`
|
const localStorageKey = `${appId}.state`
|
||||||
const persistentStore = localStorageStore(localStorageKey, {})
|
const persistentStore = createLocalStorageStore(localStorageKey, {})
|
||||||
|
|
||||||
// Initialise the temp store to mirror the persistent store
|
// Initialise the temp store to mirror the persistent store
|
||||||
const tempStore = writable(get(persistentStore))
|
const tempStore = writable(get(persistentStore))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { buildLuceneQuery, luceneQuery } from "builder/src/helpers/lucene"
|
import { LuceneUtils } from "@budibase/frontend-core"
|
||||||
|
|
||||||
export const getActiveConditions = conditions => {
|
export const getActiveConditions = conditions => {
|
||||||
if (!conditions?.length) {
|
if (!conditions?.length) {
|
||||||
|
@ -33,8 +33,8 @@ export const getActiveConditions = conditions => {
|
||||||
value: condition.referenceValue,
|
value: condition.referenceValue,
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = buildLuceneQuery([luceneCondition])
|
const query = LuceneUtils.buildLuceneQuery([luceneCondition])
|
||||||
const result = luceneQuery([luceneCondition], query)
|
const result = LuceneUtils.luceneQuery([luceneCondition], query)
|
||||||
return result.length > 0
|
return result.length > 0
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
/**
|
|
||||||
* Capitalises a string.
|
|
||||||
*
|
|
||||||
* @param string
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export const capitalise = string => {
|
|
||||||
return string.substring(0, 1).toUpperCase() + string.substring(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a short random ID.
|
|
||||||
* This is "nanoid" but rollup was derping attempting to bundle it, so the
|
|
||||||
* source has just been extracted manually since it's tiny.
|
|
||||||
*/
|
|
||||||
export const generateID = (size = 21) => {
|
|
||||||
let id = ""
|
|
||||||
let bytes = crypto.getRandomValues(new Uint8Array(size))
|
|
||||||
|
|
||||||
// A compact alternative for `for (var i = 0; i < step; i++)`.
|
|
||||||
while (size--) {
|
|
||||||
// It is incorrect to use bytes exceeding the alphabet size.
|
|
||||||
// The following mask reduces the random byte in the 0-255 value
|
|
||||||
// range to the 0-63 value range. Therefore, adding hacks, such
|
|
||||||
// as empty string fallback or magic numbers, is unnecessary because
|
|
||||||
// the bitmask trims bytes down to the alphabet size.
|
|
||||||
let byte = bytes[size] & 63
|
|
||||||
if (byte < 36) {
|
|
||||||
// `0-9a-z`
|
|
||||||
id += byte.toString(36)
|
|
||||||
} else if (byte < 62) {
|
|
||||||
// `A-Z`
|
|
||||||
id += (byte - 26).toString(36).toUpperCase()
|
|
||||||
} else if (byte < 63) {
|
|
||||||
id += "_"
|
|
||||||
} else {
|
|
||||||
id += "-"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return id
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Computes a short hash of a string
|
|
||||||
*/
|
|
||||||
export const hashString = str => {
|
|
||||||
if (!str) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
let hash = 0
|
|
||||||
for (let i = 0; i < str.length; i++) {
|
|
||||||
let char = str.charCodeAt(i)
|
|
||||||
hash = (hash << 5) - hash + char
|
|
||||||
hash = hash & hash // Convert to 32bit integer
|
|
||||||
}
|
|
||||||
return hash
|
|
||||||
}
|
|
|
@ -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,39 @@
|
||||||
|
# lodash v4.17.21
|
||||||
|
|
||||||
|
The [Lodash](https://lodash.com/) library exported as [Node.js](https://nodejs.org/) modules.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Using npm:
|
||||||
|
```shell
|
||||||
|
$ npm i -g npm
|
||||||
|
$ npm i --save lodash
|
||||||
|
```
|
||||||
|
|
||||||
|
In Node.js:
|
||||||
|
```js
|
||||||
|
// Load the full build.
|
||||||
|
var _ = require('lodash');
|
||||||
|
// Load the core build.
|
||||||
|
var _ = require('lodash/core');
|
||||||
|
// Load the FP build for immutable auto-curried iteratee-first data-last methods.
|
||||||
|
var fp = require('lodash/fp');
|
||||||
|
|
||||||
|
// Load method categories.
|
||||||
|
var array = require('lodash/array');
|
||||||
|
var object = require('lodash/fp/object');
|
||||||
|
|
||||||
|
// Cherry-pick methods for smaller browserify/rollup/webpack bundles.
|
||||||
|
var at = require('lodash/at');
|
||||||
|
var curryN = require('lodash/fp/curryN');
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [package source](https://github.com/lodash/lodash/tree/4.17.21-npm) for more details.
|
||||||
|
|
||||||
|
**Note:**<br>
|
||||||
|
Install [n_](https://www.npmjs.com/package/n_) for Lodash use in the Node.js < 6 REPL.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Tested in Chrome 74-75, Firefox 66-67, IE 11, Edge 18, Safari 11-12, & Node.js 8-12.<br>
|
||||||
|
Automated [browser](https://saucelabs.com/u/lodash) & [CI](https://travis-ci.org/lodash/lodash/) test runs are available.
|
|
@ -0,0 +1,7 @@
|
||||||
|
var getNative = require('./_getNative'),
|
||||||
|
root = require('./_root');
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var DataView = getNative(root, 'DataView');
|
||||||
|
|
||||||
|
module.exports = DataView;
|
|
@ -0,0 +1,32 @@
|
||||||
|
var hashClear = require('./_hashClear'),
|
||||||
|
hashDelete = require('./_hashDelete'),
|
||||||
|
hashGet = require('./_hashGet'),
|
||||||
|
hashHas = require('./_hashHas'),
|
||||||
|
hashSet = require('./_hashSet');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
module.exports = Hash;
|
|
@ -0,0 +1,28 @@
|
||||||
|
var baseCreate = require('./_baseCreate'),
|
||||||
|
baseLodash = require('./_baseLodash');
|
||||||
|
|
||||||
|
/** 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;
|
||||||
|
|
||||||
|
module.exports = LazyWrapper;
|
|
@ -0,0 +1,32 @@
|
||||||
|
var listCacheClear = require('./_listCacheClear'),
|
||||||
|
listCacheDelete = require('./_listCacheDelete'),
|
||||||
|
listCacheGet = require('./_listCacheGet'),
|
||||||
|
listCacheHas = require('./_listCacheHas'),
|
||||||
|
listCacheSet = require('./_listCacheSet');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
module.exports = ListCache;
|
|
@ -0,0 +1,22 @@
|
||||||
|
var baseCreate = require('./_baseCreate'),
|
||||||
|
baseLodash = require('./_baseLodash');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
module.exports = LodashWrapper;
|
|
@ -0,0 +1,7 @@
|
||||||
|
var getNative = require('./_getNative'),
|
||||||
|
root = require('./_root');
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var Map = getNative(root, 'Map');
|
||||||
|
|
||||||
|
module.exports = Map;
|
|
@ -0,0 +1,32 @@
|
||||||
|
var mapCacheClear = require('./_mapCacheClear'),
|
||||||
|
mapCacheDelete = require('./_mapCacheDelete'),
|
||||||
|
mapCacheGet = require('./_mapCacheGet'),
|
||||||
|
mapCacheHas = require('./_mapCacheHas'),
|
||||||
|
mapCacheSet = require('./_mapCacheSet');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
module.exports = MapCache;
|
|
@ -0,0 +1,7 @@
|
||||||
|
var getNative = require('./_getNative'),
|
||||||
|
root = require('./_root');
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var Promise = getNative(root, 'Promise');
|
||||||
|
|
||||||
|
module.exports = Promise;
|
|
@ -0,0 +1,7 @@
|
||||||
|
var getNative = require('./_getNative'),
|
||||||
|
root = require('./_root');
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var Set = getNative(root, 'Set');
|
||||||
|
|
||||||
|
module.exports = Set;
|
|
@ -0,0 +1,27 @@
|
||||||
|
var MapCache = require('./_MapCache'),
|
||||||
|
setCacheAdd = require('./_setCacheAdd'),
|
||||||
|
setCacheHas = require('./_setCacheHas');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
module.exports = SetCache;
|
|
@ -0,0 +1,27 @@
|
||||||
|
var ListCache = require('./_ListCache'),
|
||||||
|
stackClear = require('./_stackClear'),
|
||||||
|
stackDelete = require('./_stackDelete'),
|
||||||
|
stackGet = require('./_stackGet'),
|
||||||
|
stackHas = require('./_stackHas'),
|
||||||
|
stackSet = require('./_stackSet');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
module.exports = Stack;
|
|
@ -0,0 +1,6 @@
|
||||||
|
var root = require('./_root');
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var Symbol = root.Symbol;
|
||||||
|
|
||||||
|
module.exports = Symbol;
|
|
@ -0,0 +1,6 @@
|
||||||
|
var root = require('./_root');
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var Uint8Array = root.Uint8Array;
|
||||||
|
|
||||||
|
module.exports = Uint8Array;
|
|
@ -0,0 +1,7 @@
|
||||||
|
var getNative = require('./_getNative'),
|
||||||
|
root = require('./_root');
|
||||||
|
|
||||||
|
/* Built-in method references that are verified to be native. */
|
||||||
|
var WeakMap = getNative(root, 'WeakMap');
|
||||||
|
|
||||||
|
module.exports = WeakMap;
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = arrayFilter;
|
|
@ -0,0 +1,17 @@
|
||||||
|
var baseIndexOf = require('./_baseIndexOf');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = arrayIncludesWith;
|
|
@ -0,0 +1,49 @@
|
||||||
|
var baseTimes = require('./_baseTimes'),
|
||||||
|
isArguments = require('./isArguments'),
|
||||||
|
isArray = require('./isArray'),
|
||||||
|
isBuffer = require('./isBuffer'),
|
||||||
|
isIndex = require('./_isIndex'),
|
||||||
|
isTypedArray = require('./isTypedArray');
|
||||||
|
|
||||||
|
/** 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = arrayReduceRight;
|
|
@ -0,0 +1,15 @@
|
||||||
|
var baseRandom = require('./_baseRandom');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = arraySample;
|
|
@ -0,0 +1,17 @@
|
||||||
|
var baseClamp = require('./_baseClamp'),
|
||||||
|
copyArray = require('./_copyArray'),
|
||||||
|
shuffleSelf = require('./_shuffleSelf');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = arraySampleSize;
|
|
@ -0,0 +1,15 @@
|
||||||
|
var copyArray = require('./_copyArray'),
|
||||||
|
shuffleSelf = require('./_shuffleSelf');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = arraySome;
|
|
@ -0,0 +1,12 @@
|
||||||
|
var baseProperty = require('./_baseProperty');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the size of an ASCII `string`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string inspect.
|
||||||
|
* @returns {number} Returns the string size.
|
||||||
|
*/
|
||||||
|
var asciiSize = baseProperty('length');
|
||||||
|
|
||||||
|
module.exports = 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('');
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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) || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = asciiWords;
|
|
@ -0,0 +1,20 @@
|
||||||
|
var baseAssignValue = require('./_baseAssignValue'),
|
||||||
|
eq = require('./eq');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = assignMergeValue;
|
|
@ -0,0 +1,28 @@
|
||||||
|
var baseAssignValue = require('./_baseAssignValue'),
|
||||||
|
eq = require('./eq');
|
||||||
|
|
||||||
|
/** 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = assignValue;
|
|
@ -0,0 +1,21 @@
|
||||||
|
var eq = require('./eq');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = assocIndexOf;
|
|
@ -0,0 +1,21 @@
|
||||||
|
var baseEach = require('./_baseEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseAggregator;
|
|
@ -0,0 +1,17 @@
|
||||||
|
var copyObject = require('./_copyObject'),
|
||||||
|
keys = require('./keys');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseAssign;
|
|
@ -0,0 +1,17 @@
|
||||||
|
var copyObject = require('./_copyObject'),
|
||||||
|
keysIn = require('./keysIn');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseAssignIn;
|
|
@ -0,0 +1,25 @@
|
||||||
|
var defineProperty = require('./_defineProperty');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseAssignValue;
|
|
@ -0,0 +1,23 @@
|
||||||
|
var get = require('./get');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseClamp;
|
|
@ -0,0 +1,166 @@
|
||||||
|
var Stack = require('./_Stack'),
|
||||||
|
arrayEach = require('./_arrayEach'),
|
||||||
|
assignValue = require('./_assignValue'),
|
||||||
|
baseAssign = require('./_baseAssign'),
|
||||||
|
baseAssignIn = require('./_baseAssignIn'),
|
||||||
|
cloneBuffer = require('./_cloneBuffer'),
|
||||||
|
copyArray = require('./_copyArray'),
|
||||||
|
copySymbols = require('./_copySymbols'),
|
||||||
|
copySymbolsIn = require('./_copySymbolsIn'),
|
||||||
|
getAllKeys = require('./_getAllKeys'),
|
||||||
|
getAllKeysIn = require('./_getAllKeysIn'),
|
||||||
|
getTag = require('./_getTag'),
|
||||||
|
initCloneArray = require('./_initCloneArray'),
|
||||||
|
initCloneByTag = require('./_initCloneByTag'),
|
||||||
|
initCloneObject = require('./_initCloneObject'),
|
||||||
|
isArray = require('./isArray'),
|
||||||
|
isBuffer = require('./isBuffer'),
|
||||||
|
isMap = require('./isMap'),
|
||||||
|
isObject = require('./isObject'),
|
||||||
|
isSet = require('./isSet'),
|
||||||
|
keys = require('./keys'),
|
||||||
|
keysIn = require('./keysIn');
|
||||||
|
|
||||||
|
/** 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseClone;
|
|
@ -0,0 +1,18 @@
|
||||||
|
var baseConformsTo = require('./_baseConformsTo'),
|
||||||
|
keys = require('./keys');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseConformsTo;
|
|
@ -0,0 +1,30 @@
|
||||||
|
var isObject = require('./isObject');
|
||||||
|
|
||||||
|
/** 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;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
module.exports = 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseDelay;
|
|
@ -0,0 +1,67 @@
|
||||||
|
var SetCache = require('./_SetCache'),
|
||||||
|
arrayIncludes = require('./_arrayIncludes'),
|
||||||
|
arrayIncludesWith = require('./_arrayIncludesWith'),
|
||||||
|
arrayMap = require('./_arrayMap'),
|
||||||
|
baseUnary = require('./_baseUnary'),
|
||||||
|
cacheHas = require('./_cacheHas');
|
||||||
|
|
||||||
|
/** 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseDifference;
|
|
@ -0,0 +1,14 @@
|
||||||
|
var baseForOwn = require('./_baseForOwn'),
|
||||||
|
createBaseEach = require('./_createBaseEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
module.exports = baseEach;
|
|
@ -0,0 +1,14 @@
|
||||||
|
var baseForOwnRight = require('./_baseForOwnRight'),
|
||||||
|
createBaseEach = require('./_createBaseEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
module.exports = baseEachRight;
|
|
@ -0,0 +1,21 @@
|
||||||
|
var baseEach = require('./_baseEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseEvery;
|
|
@ -0,0 +1,32 @@
|
||||||
|
var isSymbol = require('./isSymbol');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseExtremum;
|
|
@ -0,0 +1,32 @@
|
||||||
|
var toInteger = require('./toInteger'),
|
||||||
|
toLength = require('./toLength');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseFill;
|
|
@ -0,0 +1,21 @@
|
||||||
|
var baseEach = require('./_baseEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseFindKey;
|
|
@ -0,0 +1,38 @@
|
||||||
|
var arrayPush = require('./_arrayPush'),
|
||||||
|
isFlattenable = require('./_isFlattenable');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseFlatten;
|
|
@ -0,0 +1,16 @@
|
||||||
|
var createBaseFor = require('./_createBaseFor');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
|
||||||
|
module.exports = baseFor;
|
|
@ -0,0 +1,16 @@
|
||||||
|
var baseFor = require('./_baseFor'),
|
||||||
|
keys = require('./keys');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseForOwn;
|
|
@ -0,0 +1,16 @@
|
||||||
|
var baseForRight = require('./_baseForRight'),
|
||||||
|
keys = require('./keys');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseForOwnRight;
|
|
@ -0,0 +1,15 @@
|
||||||
|
var createBaseFor = require('./_createBaseFor');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
module.exports = baseForRight;
|
|
@ -0,0 +1,19 @@
|
||||||
|
var arrayFilter = require('./_arrayFilter'),
|
||||||
|
isFunction = require('./isFunction');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseFunctions;
|
|
@ -0,0 +1,24 @@
|
||||||
|
var castPath = require('./_castPath'),
|
||||||
|
toKey = require('./_toKey');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseGet;
|
|
@ -0,0 +1,20 @@
|
||||||
|
var arrayPush = require('./_arrayPush'),
|
||||||
|
isArray = require('./isArray');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseGetAllKeys;
|
|
@ -0,0 +1,28 @@
|
||||||
|
var Symbol = require('./_Symbol'),
|
||||||
|
getRawTag = require('./_getRawTag'),
|
||||||
|
objectToString = require('./_objectToString');
|
||||||
|
|
||||||
|
/** `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);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseGetTag;
|
|
@ -0,0 +1,14 @@
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.gt` which doesn't coerce arguments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to compare.
|
||||||
|
* @param {*} other The other value to compare.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is greater than `other`,
|
||||||
|
* else `false`.
|
||||||
|
*/
|
||||||
|
function baseGt(value, other) {
|
||||||
|
return value > other;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseGt;
|
|
@ -0,0 +1,19 @@
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var objectProto = Object.prototype;
|
||||||
|
|
||||||
|
/** Used to check objects for own properties. */
|
||||||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.has` without support for deep paths.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [object] The object to query.
|
||||||
|
* @param {Array|string} key The key to check.
|
||||||
|
* @returns {boolean} Returns `true` if `key` exists, else `false`.
|
||||||
|
*/
|
||||||
|
function baseHas(object, key) {
|
||||||
|
return object != null && hasOwnProperty.call(object, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseHas;
|
|
@ -0,0 +1,13 @@
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.hasIn` without support for deep paths.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} [object] The object to query.
|
||||||
|
* @param {Array|string} key The key to check.
|
||||||
|
* @returns {boolean} Returns `true` if `key` exists, else `false`.
|
||||||
|
*/
|
||||||
|
function baseHasIn(object, key) {
|
||||||
|
return object != null && key in Object(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseHasIn;
|
|
@ -0,0 +1,18 @@
|
||||||
|
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||||
|
var nativeMax = Math.max,
|
||||||
|
nativeMin = Math.min;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.inRange` which doesn't coerce arguments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {number} number The number to check.
|
||||||
|
* @param {number} start The start of the range.
|
||||||
|
* @param {number} end The end of the range.
|
||||||
|
* @returns {boolean} Returns `true` if `number` is in the range, else `false`.
|
||||||
|
*/
|
||||||
|
function baseInRange(number, start, end) {
|
||||||
|
return number >= nativeMin(start, end) && number < nativeMax(start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseInRange;
|
|
@ -0,0 +1,20 @@
|
||||||
|
var baseFindIndex = require('./_baseFindIndex'),
|
||||||
|
baseIsNaN = require('./_baseIsNaN'),
|
||||||
|
strictIndexOf = require('./_strictIndexOf');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to inspect.
|
||||||
|
* @param {*} value The value to search for.
|
||||||
|
* @param {number} fromIndex The index to search from.
|
||||||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
||||||
|
*/
|
||||||
|
function baseIndexOf(array, value, fromIndex) {
|
||||||
|
return value === value
|
||||||
|
? strictIndexOf(array, value, fromIndex)
|
||||||
|
: baseFindIndex(array, baseIsNaN, fromIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIndexOf;
|
|
@ -0,0 +1,23 @@
|
||||||
|
/**
|
||||||
|
* This function is like `baseIndexOf` except that it accepts a comparator.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} array The array to inspect.
|
||||||
|
* @param {*} value The value to search for.
|
||||||
|
* @param {number} fromIndex The index to search from.
|
||||||
|
* @param {Function} comparator The comparator invoked per element.
|
||||||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
||||||
|
*/
|
||||||
|
function baseIndexOfWith(array, value, fromIndex, comparator) {
|
||||||
|
var index = fromIndex - 1,
|
||||||
|
length = array.length;
|
||||||
|
|
||||||
|
while (++index < length) {
|
||||||
|
if (comparator(array[index], value)) {
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIndexOfWith;
|
|
@ -0,0 +1,74 @@
|
||||||
|
var SetCache = require('./_SetCache'),
|
||||||
|
arrayIncludes = require('./_arrayIncludes'),
|
||||||
|
arrayIncludesWith = require('./_arrayIncludesWith'),
|
||||||
|
arrayMap = require('./_arrayMap'),
|
||||||
|
baseUnary = require('./_baseUnary'),
|
||||||
|
cacheHas = require('./_cacheHas');
|
||||||
|
|
||||||
|
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||||
|
var nativeMin = Math.min;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of methods like `_.intersection`, without support
|
||||||
|
* for iteratee shorthands, that accepts an array of arrays to inspect.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Array} arrays The arrays to inspect.
|
||||||
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
||||||
|
* @param {Function} [comparator] The comparator invoked per element.
|
||||||
|
* @returns {Array} Returns the new array of shared values.
|
||||||
|
*/
|
||||||
|
function baseIntersection(arrays, iteratee, comparator) {
|
||||||
|
var includes = comparator ? arrayIncludesWith : arrayIncludes,
|
||||||
|
length = arrays[0].length,
|
||||||
|
othLength = arrays.length,
|
||||||
|
othIndex = othLength,
|
||||||
|
caches = Array(othLength),
|
||||||
|
maxLength = Infinity,
|
||||||
|
result = [];
|
||||||
|
|
||||||
|
while (othIndex--) {
|
||||||
|
var array = arrays[othIndex];
|
||||||
|
if (othIndex && iteratee) {
|
||||||
|
array = arrayMap(array, baseUnary(iteratee));
|
||||||
|
}
|
||||||
|
maxLength = nativeMin(array.length, maxLength);
|
||||||
|
caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
|
||||||
|
? new SetCache(othIndex && array)
|
||||||
|
: undefined;
|
||||||
|
}
|
||||||
|
array = arrays[0];
|
||||||
|
|
||||||
|
var index = -1,
|
||||||
|
seen = caches[0];
|
||||||
|
|
||||||
|
outer:
|
||||||
|
while (++index < length && result.length < maxLength) {
|
||||||
|
var value = array[index],
|
||||||
|
computed = iteratee ? iteratee(value) : value;
|
||||||
|
|
||||||
|
value = (comparator || value !== 0) ? value : 0;
|
||||||
|
if (!(seen
|
||||||
|
? cacheHas(seen, computed)
|
||||||
|
: includes(result, computed, comparator)
|
||||||
|
)) {
|
||||||
|
othIndex = othLength;
|
||||||
|
while (--othIndex) {
|
||||||
|
var cache = caches[othIndex];
|
||||||
|
if (!(cache
|
||||||
|
? cacheHas(cache, computed)
|
||||||
|
: includes(arrays[othIndex], computed, comparator))
|
||||||
|
) {
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (seen) {
|
||||||
|
seen.push(computed);
|
||||||
|
}
|
||||||
|
result.push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIntersection;
|
|
@ -0,0 +1,21 @@
|
||||||
|
var baseForOwn = require('./_baseForOwn');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.invert` and `_.invertBy` which inverts
|
||||||
|
* `object` with values transformed by `iteratee` and set by `setter`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to iterate over.
|
||||||
|
* @param {Function} setter The function to set `accumulator` values.
|
||||||
|
* @param {Function} iteratee The iteratee to transform values.
|
||||||
|
* @param {Object} accumulator The initial inverted object.
|
||||||
|
* @returns {Function} Returns `accumulator`.
|
||||||
|
*/
|
||||||
|
function baseInverter(object, setter, iteratee, accumulator) {
|
||||||
|
baseForOwn(object, function(value, key, object) {
|
||||||
|
setter(accumulator, iteratee(value), key, object);
|
||||||
|
});
|
||||||
|
return accumulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseInverter;
|
|
@ -0,0 +1,24 @@
|
||||||
|
var apply = require('./_apply'),
|
||||||
|
castPath = require('./_castPath'),
|
||||||
|
last = require('./last'),
|
||||||
|
parent = require('./_parent'),
|
||||||
|
toKey = require('./_toKey');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.invoke` without support for individual
|
||||||
|
* method arguments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to query.
|
||||||
|
* @param {Array|string} path The path of the method to invoke.
|
||||||
|
* @param {Array} args The arguments to invoke the method with.
|
||||||
|
* @returns {*} Returns the result of the invoked method.
|
||||||
|
*/
|
||||||
|
function baseInvoke(object, path, args) {
|
||||||
|
path = castPath(path, object);
|
||||||
|
object = parent(object, path);
|
||||||
|
var func = object == null ? object : object[toKey(last(path))];
|
||||||
|
return func == null ? undefined : apply(func, object, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseInvoke;
|
|
@ -0,0 +1,18 @@
|
||||||
|
var baseGetTag = require('./_baseGetTag'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var argsTag = '[object Arguments]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isArguments`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
|
||||||
|
*/
|
||||||
|
function baseIsArguments(value) {
|
||||||
|
return isObjectLike(value) && baseGetTag(value) == argsTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsArguments;
|
|
@ -0,0 +1,17 @@
|
||||||
|
var baseGetTag = require('./_baseGetTag'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
var arrayBufferTag = '[object ArrayBuffer]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isArrayBuffer` without Node.js optimizations.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsArrayBuffer(value) {
|
||||||
|
return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsArrayBuffer;
|
|
@ -0,0 +1,18 @@
|
||||||
|
var baseGetTag = require('./_baseGetTag'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var dateTag = '[object Date]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isDate` without Node.js optimizations.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a date object, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsDate(value) {
|
||||||
|
return isObjectLike(value) && baseGetTag(value) == dateTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsDate;
|
|
@ -0,0 +1,28 @@
|
||||||
|
var baseIsEqualDeep = require('./_baseIsEqualDeep'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isEqual` which supports partial comparisons
|
||||||
|
* and tracks traversed objects.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to compare.
|
||||||
|
* @param {*} other The other value to compare.
|
||||||
|
* @param {boolean} bitmask The bitmask flags.
|
||||||
|
* 1 - Unordered comparison
|
||||||
|
* 2 - Partial comparison
|
||||||
|
* @param {Function} [customizer] The function to customize comparisons.
|
||||||
|
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
|
||||||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsEqual(value, other, bitmask, customizer, stack) {
|
||||||
|
if (value === other) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
|
||||||
|
return value !== value && other !== other;
|
||||||
|
}
|
||||||
|
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsEqual;
|
|
@ -0,0 +1,83 @@
|
||||||
|
var Stack = require('./_Stack'),
|
||||||
|
equalArrays = require('./_equalArrays'),
|
||||||
|
equalByTag = require('./_equalByTag'),
|
||||||
|
equalObjects = require('./_equalObjects'),
|
||||||
|
getTag = require('./_getTag'),
|
||||||
|
isArray = require('./isArray'),
|
||||||
|
isBuffer = require('./isBuffer'),
|
||||||
|
isTypedArray = require('./isTypedArray');
|
||||||
|
|
||||||
|
/** Used to compose bitmasks for value comparisons. */
|
||||||
|
var COMPARE_PARTIAL_FLAG = 1;
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var argsTag = '[object Arguments]',
|
||||||
|
arrayTag = '[object Array]',
|
||||||
|
objectTag = '[object Object]';
|
||||||
|
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var objectProto = Object.prototype;
|
||||||
|
|
||||||
|
/** Used to check objects for own properties. */
|
||||||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `baseIsEqual` for arrays and objects which performs
|
||||||
|
* deep comparisons and tracks traversed objects enabling objects with circular
|
||||||
|
* references to be compared.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to compare.
|
||||||
|
* @param {Object} other The other object to compare.
|
||||||
|
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
|
||||||
|
* @param {Function} customizer The function to customize comparisons.
|
||||||
|
* @param {Function} equalFunc The function to determine equivalents of values.
|
||||||
|
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
|
||||||
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
|
||||||
|
var objIsArr = isArray(object),
|
||||||
|
othIsArr = isArray(other),
|
||||||
|
objTag = objIsArr ? arrayTag : getTag(object),
|
||||||
|
othTag = othIsArr ? arrayTag : getTag(other);
|
||||||
|
|
||||||
|
objTag = objTag == argsTag ? objectTag : objTag;
|
||||||
|
othTag = othTag == argsTag ? objectTag : othTag;
|
||||||
|
|
||||||
|
var objIsObj = objTag == objectTag,
|
||||||
|
othIsObj = othTag == objectTag,
|
||||||
|
isSameTag = objTag == othTag;
|
||||||
|
|
||||||
|
if (isSameTag && isBuffer(object)) {
|
||||||
|
if (!isBuffer(other)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
objIsArr = true;
|
||||||
|
objIsObj = false;
|
||||||
|
}
|
||||||
|
if (isSameTag && !objIsObj) {
|
||||||
|
stack || (stack = new Stack);
|
||||||
|
return (objIsArr || isTypedArray(object))
|
||||||
|
? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
|
||||||
|
: equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
|
||||||
|
}
|
||||||
|
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
|
||||||
|
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
||||||
|
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
||||||
|
|
||||||
|
if (objIsWrapped || othIsWrapped) {
|
||||||
|
var objUnwrapped = objIsWrapped ? object.value() : object,
|
||||||
|
othUnwrapped = othIsWrapped ? other.value() : other;
|
||||||
|
|
||||||
|
stack || (stack = new Stack);
|
||||||
|
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isSameTag) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
stack || (stack = new Stack);
|
||||||
|
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsEqualDeep;
|
|
@ -0,0 +1,18 @@
|
||||||
|
var getTag = require('./_getTag'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var mapTag = '[object Map]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isMap` without Node.js optimizations.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a map, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsMap(value) {
|
||||||
|
return isObjectLike(value) && getTag(value) == mapTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsMap;
|
|
@ -0,0 +1,62 @@
|
||||||
|
var Stack = require('./_Stack'),
|
||||||
|
baseIsEqual = require('./_baseIsEqual');
|
||||||
|
|
||||||
|
/** Used to compose bitmasks for value comparisons. */
|
||||||
|
var COMPARE_PARTIAL_FLAG = 1,
|
||||||
|
COMPARE_UNORDERED_FLAG = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isMatch` without support for iteratee shorthands.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} object The object to inspect.
|
||||||
|
* @param {Object} source The object of property values to match.
|
||||||
|
* @param {Array} matchData The property names, values, and compare flags to match.
|
||||||
|
* @param {Function} [customizer] The function to customize comparisons.
|
||||||
|
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsMatch(object, source, matchData, customizer) {
|
||||||
|
var index = matchData.length,
|
||||||
|
length = index,
|
||||||
|
noCustomizer = !customizer;
|
||||||
|
|
||||||
|
if (object == null) {
|
||||||
|
return !length;
|
||||||
|
}
|
||||||
|
object = Object(object);
|
||||||
|
while (index--) {
|
||||||
|
var data = matchData[index];
|
||||||
|
if ((noCustomizer && data[2])
|
||||||
|
? data[1] !== object[data[0]]
|
||||||
|
: !(data[0] in object)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (++index < length) {
|
||||||
|
data = matchData[index];
|
||||||
|
var key = data[0],
|
||||||
|
objValue = object[key],
|
||||||
|
srcValue = data[1];
|
||||||
|
|
||||||
|
if (noCustomizer && data[2]) {
|
||||||
|
if (objValue === undefined && !(key in object)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var stack = new Stack;
|
||||||
|
if (customizer) {
|
||||||
|
var result = customizer(objValue, srcValue, key, object, source, stack);
|
||||||
|
}
|
||||||
|
if (!(result === undefined
|
||||||
|
? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
|
||||||
|
: result
|
||||||
|
)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsMatch;
|
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isNaN` without support for number objects.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsNaN(value) {
|
||||||
|
return value !== value;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsNaN;
|
|
@ -0,0 +1,47 @@
|
||||||
|
var isFunction = require('./isFunction'),
|
||||||
|
isMasked = require('./_isMasked'),
|
||||||
|
isObject = require('./isObject'),
|
||||||
|
toSource = require('./_toSource');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to match `RegExp`
|
||||||
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
||||||
|
*/
|
||||||
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
||||||
|
|
||||||
|
/** Used to detect host constructors (Safari). */
|
||||||
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
||||||
|
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var funcProto = Function.prototype,
|
||||||
|
objectProto = Object.prototype;
|
||||||
|
|
||||||
|
/** Used to resolve the decompiled source of functions. */
|
||||||
|
var funcToString = funcProto.toString;
|
||||||
|
|
||||||
|
/** Used to check objects for own properties. */
|
||||||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||||
|
|
||||||
|
/** Used to detect if a method is native. */
|
||||||
|
var reIsNative = RegExp('^' +
|
||||||
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
||||||
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isNative` without bad shim checks.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
||||||
|
* else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsNative(value) {
|
||||||
|
if (!isObject(value) || isMasked(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
|
||||||
|
return pattern.test(toSource(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsNative;
|
|
@ -0,0 +1,18 @@
|
||||||
|
var baseGetTag = require('./_baseGetTag'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var regexpTag = '[object RegExp]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isRegExp` without Node.js optimizations.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsRegExp(value) {
|
||||||
|
return isObjectLike(value) && baseGetTag(value) == regexpTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsRegExp;
|
|
@ -0,0 +1,18 @@
|
||||||
|
var getTag = require('./_getTag'),
|
||||||
|
isObjectLike = require('./isObjectLike');
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var setTag = '[object Set]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.isSet` without Node.js optimizations.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a set, else `false`.
|
||||||
|
*/
|
||||||
|
function baseIsSet(value) {
|
||||||
|
return isObjectLike(value) && getTag(value) == setTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = baseIsSet;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue