49502 lines
1.7 MiB
49502 lines
1.7 MiB
/******/ (() => { // webpackBootstrap
|
|
/******/ var __webpack_modules__ = ({
|
|
|
|
/***/ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js":
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js ***!
|
|
\***************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "generateCodeFrame": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame),
|
|
/* harmony export */ "BASE_TRANSITION": () => (/* binding */ BASE_TRANSITION),
|
|
/* harmony export */ "CAMELIZE": () => (/* binding */ CAMELIZE),
|
|
/* harmony export */ "CAPITALIZE": () => (/* binding */ CAPITALIZE),
|
|
/* harmony export */ "CREATE_BLOCK": () => (/* binding */ CREATE_BLOCK),
|
|
/* harmony export */ "CREATE_COMMENT": () => (/* binding */ CREATE_COMMENT),
|
|
/* harmony export */ "CREATE_SLOTS": () => (/* binding */ CREATE_SLOTS),
|
|
/* harmony export */ "CREATE_STATIC": () => (/* binding */ CREATE_STATIC),
|
|
/* harmony export */ "CREATE_TEXT": () => (/* binding */ CREATE_TEXT),
|
|
/* harmony export */ "CREATE_VNODE": () => (/* binding */ CREATE_VNODE),
|
|
/* harmony export */ "FRAGMENT": () => (/* binding */ FRAGMENT),
|
|
/* harmony export */ "IS_REF": () => (/* binding */ IS_REF),
|
|
/* harmony export */ "KEEP_ALIVE": () => (/* binding */ KEEP_ALIVE),
|
|
/* harmony export */ "MERGE_PROPS": () => (/* binding */ MERGE_PROPS),
|
|
/* harmony export */ "OPEN_BLOCK": () => (/* binding */ OPEN_BLOCK),
|
|
/* harmony export */ "POP_SCOPE_ID": () => (/* binding */ POP_SCOPE_ID),
|
|
/* harmony export */ "PUSH_SCOPE_ID": () => (/* binding */ PUSH_SCOPE_ID),
|
|
/* harmony export */ "RENDER_LIST": () => (/* binding */ RENDER_LIST),
|
|
/* harmony export */ "RENDER_SLOT": () => (/* binding */ RENDER_SLOT),
|
|
/* harmony export */ "RESOLVE_COMPONENT": () => (/* binding */ RESOLVE_COMPONENT),
|
|
/* harmony export */ "RESOLVE_DIRECTIVE": () => (/* binding */ RESOLVE_DIRECTIVE),
|
|
/* harmony export */ "RESOLVE_DYNAMIC_COMPONENT": () => (/* binding */ RESOLVE_DYNAMIC_COMPONENT),
|
|
/* harmony export */ "SET_BLOCK_TRACKING": () => (/* binding */ SET_BLOCK_TRACKING),
|
|
/* harmony export */ "SUSPENSE": () => (/* binding */ SUSPENSE),
|
|
/* harmony export */ "TELEPORT": () => (/* binding */ TELEPORT),
|
|
/* harmony export */ "TO_DISPLAY_STRING": () => (/* binding */ TO_DISPLAY_STRING),
|
|
/* harmony export */ "TO_HANDLERS": () => (/* binding */ TO_HANDLERS),
|
|
/* harmony export */ "TO_HANDLER_KEY": () => (/* binding */ TO_HANDLER_KEY),
|
|
/* harmony export */ "UNREF": () => (/* binding */ UNREF),
|
|
/* harmony export */ "WITH_CTX": () => (/* binding */ WITH_CTX),
|
|
/* harmony export */ "WITH_DIRECTIVES": () => (/* binding */ WITH_DIRECTIVES),
|
|
/* harmony export */ "WITH_SCOPE_ID": () => (/* binding */ WITH_SCOPE_ID),
|
|
/* harmony export */ "advancePositionWithClone": () => (/* binding */ advancePositionWithClone),
|
|
/* harmony export */ "advancePositionWithMutation": () => (/* binding */ advancePositionWithMutation),
|
|
/* harmony export */ "assert": () => (/* binding */ assert),
|
|
/* harmony export */ "baseCompile": () => (/* binding */ baseCompile),
|
|
/* harmony export */ "baseParse": () => (/* binding */ baseParse),
|
|
/* harmony export */ "buildProps": () => (/* binding */ buildProps),
|
|
/* harmony export */ "buildSlots": () => (/* binding */ buildSlots),
|
|
/* harmony export */ "createArrayExpression": () => (/* binding */ createArrayExpression),
|
|
/* harmony export */ "createAssignmentExpression": () => (/* binding */ createAssignmentExpression),
|
|
/* harmony export */ "createBlockStatement": () => (/* binding */ createBlockStatement),
|
|
/* harmony export */ "createCacheExpression": () => (/* binding */ createCacheExpression),
|
|
/* harmony export */ "createCallExpression": () => (/* binding */ createCallExpression),
|
|
/* harmony export */ "createCompilerError": () => (/* binding */ createCompilerError),
|
|
/* harmony export */ "createCompoundExpression": () => (/* binding */ createCompoundExpression),
|
|
/* harmony export */ "createConditionalExpression": () => (/* binding */ createConditionalExpression),
|
|
/* harmony export */ "createForLoopParams": () => (/* binding */ createForLoopParams),
|
|
/* harmony export */ "createFunctionExpression": () => (/* binding */ createFunctionExpression),
|
|
/* harmony export */ "createIfStatement": () => (/* binding */ createIfStatement),
|
|
/* harmony export */ "createInterpolation": () => (/* binding */ createInterpolation),
|
|
/* harmony export */ "createObjectExpression": () => (/* binding */ createObjectExpression),
|
|
/* harmony export */ "createObjectProperty": () => (/* binding */ createObjectProperty),
|
|
/* harmony export */ "createReturnStatement": () => (/* binding */ createReturnStatement),
|
|
/* harmony export */ "createRoot": () => (/* binding */ createRoot),
|
|
/* harmony export */ "createSequenceExpression": () => (/* binding */ createSequenceExpression),
|
|
/* harmony export */ "createSimpleExpression": () => (/* binding */ createSimpleExpression),
|
|
/* harmony export */ "createStructuralDirectiveTransform": () => (/* binding */ createStructuralDirectiveTransform),
|
|
/* harmony export */ "createTemplateLiteral": () => (/* binding */ createTemplateLiteral),
|
|
/* harmony export */ "createTransformContext": () => (/* binding */ createTransformContext),
|
|
/* harmony export */ "createVNodeCall": () => (/* binding */ createVNodeCall),
|
|
/* harmony export */ "findDir": () => (/* binding */ findDir),
|
|
/* harmony export */ "findProp": () => (/* binding */ findProp),
|
|
/* harmony export */ "generate": () => (/* binding */ generate),
|
|
/* harmony export */ "getBaseTransformPreset": () => (/* binding */ getBaseTransformPreset),
|
|
/* harmony export */ "getInnerRange": () => (/* binding */ getInnerRange),
|
|
/* harmony export */ "hasDynamicKeyVBind": () => (/* binding */ hasDynamicKeyVBind),
|
|
/* harmony export */ "hasScopeRef": () => (/* binding */ hasScopeRef),
|
|
/* harmony export */ "helperNameMap": () => (/* binding */ helperNameMap),
|
|
/* harmony export */ "injectProp": () => (/* binding */ injectProp),
|
|
/* harmony export */ "isBindKey": () => (/* binding */ isBindKey),
|
|
/* harmony export */ "isBuiltInType": () => (/* binding */ isBuiltInType),
|
|
/* harmony export */ "isCoreComponent": () => (/* binding */ isCoreComponent),
|
|
/* harmony export */ "isMemberExpression": () => (/* binding */ isMemberExpression),
|
|
/* harmony export */ "isSimpleIdentifier": () => (/* binding */ isSimpleIdentifier),
|
|
/* harmony export */ "isSlotOutlet": () => (/* binding */ isSlotOutlet),
|
|
/* harmony export */ "isStaticExp": () => (/* binding */ isStaticExp),
|
|
/* harmony export */ "isTemplateNode": () => (/* binding */ isTemplateNode),
|
|
/* harmony export */ "isText": () => (/* binding */ isText),
|
|
/* harmony export */ "isVSlot": () => (/* binding */ isVSlot),
|
|
/* harmony export */ "locStub": () => (/* binding */ locStub),
|
|
/* harmony export */ "noopDirectiveTransform": () => (/* binding */ noopDirectiveTransform),
|
|
/* harmony export */ "processExpression": () => (/* binding */ processExpression),
|
|
/* harmony export */ "processFor": () => (/* binding */ processFor),
|
|
/* harmony export */ "processIf": () => (/* binding */ processIf),
|
|
/* harmony export */ "processSlotOutlet": () => (/* binding */ processSlotOutlet),
|
|
/* harmony export */ "registerRuntimeHelpers": () => (/* binding */ registerRuntimeHelpers),
|
|
/* harmony export */ "resolveComponentType": () => (/* binding */ resolveComponentType),
|
|
/* harmony export */ "toValidAssetId": () => (/* binding */ toValidAssetId),
|
|
/* harmony export */ "trackSlotScopes": () => (/* binding */ trackSlotScopes),
|
|
/* harmony export */ "trackVForSlotScopes": () => (/* binding */ trackVForSlotScopes),
|
|
/* harmony export */ "transform": () => (/* binding */ transform),
|
|
/* harmony export */ "transformBind": () => (/* binding */ transformBind),
|
|
/* harmony export */ "transformElement": () => (/* binding */ transformElement),
|
|
/* harmony export */ "transformExpression": () => (/* binding */ transformExpression),
|
|
/* harmony export */ "transformModel": () => (/* binding */ transformModel),
|
|
/* harmony export */ "transformOn": () => (/* binding */ transformOn),
|
|
/* harmony export */ "traverseNode": () => (/* binding */ traverseNode)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
|
|
|
|
|
|
|
|
function defaultOnError(error) {
|
|
throw error;
|
|
}
|
|
function createCompilerError(code, loc, messages, additionalMessage) {
|
|
const msg = true
|
|
? (messages || errorMessages)[code] + (additionalMessage || ``)
|
|
: 0;
|
|
const error = new SyntaxError(String(msg));
|
|
error.code = code;
|
|
error.loc = loc;
|
|
return error;
|
|
}
|
|
const errorMessages = {
|
|
// parse errors
|
|
[0 /* ABRUPT_CLOSING_OF_EMPTY_COMMENT */]: 'Illegal comment.',
|
|
[1 /* CDATA_IN_HTML_CONTENT */]: 'CDATA section is allowed only in XML context.',
|
|
[2 /* DUPLICATE_ATTRIBUTE */]: 'Duplicate attribute.',
|
|
[3 /* END_TAG_WITH_ATTRIBUTES */]: 'End tag cannot have attributes.',
|
|
[4 /* END_TAG_WITH_TRAILING_SOLIDUS */]: "Illegal '/' in tags.",
|
|
[5 /* EOF_BEFORE_TAG_NAME */]: 'Unexpected EOF in tag.',
|
|
[6 /* EOF_IN_CDATA */]: 'Unexpected EOF in CDATA section.',
|
|
[7 /* EOF_IN_COMMENT */]: 'Unexpected EOF in comment.',
|
|
[8 /* EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT */]: 'Unexpected EOF in script.',
|
|
[9 /* EOF_IN_TAG */]: 'Unexpected EOF in tag.',
|
|
[10 /* INCORRECTLY_CLOSED_COMMENT */]: 'Incorrectly closed comment.',
|
|
[11 /* INCORRECTLY_OPENED_COMMENT */]: 'Incorrectly opened comment.',
|
|
[12 /* INVALID_FIRST_CHARACTER_OF_TAG_NAME */]: "Illegal tag name. Use '<' to print '<'.",
|
|
[13 /* MISSING_ATTRIBUTE_VALUE */]: 'Attribute value was expected.',
|
|
[14 /* MISSING_END_TAG_NAME */]: 'End tag name was expected.',
|
|
[15 /* MISSING_WHITESPACE_BETWEEN_ATTRIBUTES */]: 'Whitespace was expected.',
|
|
[16 /* NESTED_COMMENT */]: "Unexpected '<!--' in comment.",
|
|
[17 /* UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME */]: 'Attribute name cannot contain U+0022 ("), U+0027 (\'), and U+003C (<).',
|
|
[18 /* UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE */]: 'Unquoted attribute value cannot contain U+0022 ("), U+0027 (\'), U+003C (<), U+003D (=), and U+0060 (`).',
|
|
[19 /* UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME */]: "Attribute name cannot start with '='.",
|
|
[21 /* UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME */]: "'<?' is allowed only in XML context.",
|
|
[22 /* UNEXPECTED_SOLIDUS_IN_TAG */]: "Illegal '/' in tags.",
|
|
// Vue-specific parse errors
|
|
[23 /* X_INVALID_END_TAG */]: 'Invalid end tag.',
|
|
[24 /* X_MISSING_END_TAG */]: 'Element is missing end tag.',
|
|
[25 /* X_MISSING_INTERPOLATION_END */]: 'Interpolation end sign was not found.',
|
|
[26 /* X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END */]: 'End bracket for dynamic directive argument was not found. ' +
|
|
'Note that dynamic directive argument cannot contain spaces.',
|
|
// transform errors
|
|
[27 /* X_V_IF_NO_EXPRESSION */]: `v-if/v-else-if is missing expression.`,
|
|
[28 /* X_V_IF_SAME_KEY */]: `v-if/else branches must use unique keys.`,
|
|
[29 /* X_V_ELSE_NO_ADJACENT_IF */]: `v-else/v-else-if has no adjacent v-if.`,
|
|
[30 /* X_V_FOR_NO_EXPRESSION */]: `v-for is missing expression.`,
|
|
[31 /* X_V_FOR_MALFORMED_EXPRESSION */]: `v-for has invalid expression.`,
|
|
[32 /* X_V_FOR_TEMPLATE_KEY_PLACEMENT */]: `<template v-for> key should be placed on the <template> tag.`,
|
|
[33 /* X_V_BIND_NO_EXPRESSION */]: `v-bind is missing expression.`,
|
|
[34 /* X_V_ON_NO_EXPRESSION */]: `v-on is missing expression.`,
|
|
[35 /* X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET */]: `Unexpected custom directive on <slot> outlet.`,
|
|
[36 /* X_V_SLOT_MIXED_SLOT_USAGE */]: `Mixed v-slot usage on both the component and nested <template>.` +
|
|
`When there are multiple named slots, all slots should use <template> ` +
|
|
`syntax to avoid scope ambiguity.`,
|
|
[37 /* X_V_SLOT_DUPLICATE_SLOT_NAMES */]: `Duplicate slot names found. `,
|
|
[38 /* X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN */]: `Extraneous children found when component already has explicitly named ` +
|
|
`default slot. These children will be ignored.`,
|
|
[39 /* X_V_SLOT_MISPLACED */]: `v-slot can only be used on components or <template> tags.`,
|
|
[40 /* X_V_MODEL_NO_EXPRESSION */]: `v-model is missing expression.`,
|
|
[41 /* X_V_MODEL_MALFORMED_EXPRESSION */]: `v-model value must be a valid JavaScript member expression.`,
|
|
[42 /* X_V_MODEL_ON_SCOPE_VARIABLE */]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`,
|
|
[43 /* X_INVALID_EXPRESSION */]: `Error parsing JavaScript expression: `,
|
|
[44 /* X_KEEP_ALIVE_INVALID_CHILDREN */]: `<KeepAlive> expects exactly one child component.`,
|
|
// generic errors
|
|
[45 /* X_PREFIX_ID_NOT_SUPPORTED */]: `"prefixIdentifiers" option is not supported in this build of compiler.`,
|
|
[46 /* X_MODULE_MODE_NOT_SUPPORTED */]: `ES module mode is not supported in this build of compiler.`,
|
|
[47 /* X_CACHE_HANDLER_NOT_SUPPORTED */]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`,
|
|
[48 /* X_SCOPE_ID_NOT_SUPPORTED */]: `"scopeId" option is only supported in module mode.`
|
|
};
|
|
|
|
const FRAGMENT = Symbol(( true) ? `Fragment` : 0);
|
|
const TELEPORT = Symbol(( true) ? `Teleport` : 0);
|
|
const SUSPENSE = Symbol(( true) ? `Suspense` : 0);
|
|
const KEEP_ALIVE = Symbol(( true) ? `KeepAlive` : 0);
|
|
const BASE_TRANSITION = Symbol(( true) ? `BaseTransition` : 0);
|
|
const OPEN_BLOCK = Symbol(( true) ? `openBlock` : 0);
|
|
const CREATE_BLOCK = Symbol(( true) ? `createBlock` : 0);
|
|
const CREATE_VNODE = Symbol(( true) ? `createVNode` : 0);
|
|
const CREATE_COMMENT = Symbol(( true) ? `createCommentVNode` : 0);
|
|
const CREATE_TEXT = Symbol(( true) ? `createTextVNode` : 0);
|
|
const CREATE_STATIC = Symbol(( true) ? `createStaticVNode` : 0);
|
|
const RESOLVE_COMPONENT = Symbol(( true) ? `resolveComponent` : 0);
|
|
const RESOLVE_DYNAMIC_COMPONENT = Symbol(( true) ? `resolveDynamicComponent` : 0);
|
|
const RESOLVE_DIRECTIVE = Symbol(( true) ? `resolveDirective` : 0);
|
|
const WITH_DIRECTIVES = Symbol(( true) ? `withDirectives` : 0);
|
|
const RENDER_LIST = Symbol(( true) ? `renderList` : 0);
|
|
const RENDER_SLOT = Symbol(( true) ? `renderSlot` : 0);
|
|
const CREATE_SLOTS = Symbol(( true) ? `createSlots` : 0);
|
|
const TO_DISPLAY_STRING = Symbol(( true) ? `toDisplayString` : 0);
|
|
const MERGE_PROPS = Symbol(( true) ? `mergeProps` : 0);
|
|
const TO_HANDLERS = Symbol(( true) ? `toHandlers` : 0);
|
|
const CAMELIZE = Symbol(( true) ? `camelize` : 0);
|
|
const CAPITALIZE = Symbol(( true) ? `capitalize` : 0);
|
|
const TO_HANDLER_KEY = Symbol(( true) ? `toHandlerKey` : 0);
|
|
const SET_BLOCK_TRACKING = Symbol(( true) ? `setBlockTracking` : 0);
|
|
const PUSH_SCOPE_ID = Symbol(( true) ? `pushScopeId` : 0);
|
|
const POP_SCOPE_ID = Symbol(( true) ? `popScopeId` : 0);
|
|
const WITH_SCOPE_ID = Symbol(( true) ? `withScopeId` : 0);
|
|
const WITH_CTX = Symbol(( true) ? `withCtx` : 0);
|
|
const UNREF = Symbol(( true) ? `unref` : 0);
|
|
const IS_REF = Symbol(( true) ? `isRef` : 0);
|
|
// Name mapping for runtime helpers that need to be imported from 'vue' in
|
|
// generated code. Make sure these are correctly exported in the runtime!
|
|
// Using `any` here because TS doesn't allow symbols as index type.
|
|
const helperNameMap = {
|
|
[FRAGMENT]: `Fragment`,
|
|
[TELEPORT]: `Teleport`,
|
|
[SUSPENSE]: `Suspense`,
|
|
[KEEP_ALIVE]: `KeepAlive`,
|
|
[BASE_TRANSITION]: `BaseTransition`,
|
|
[OPEN_BLOCK]: `openBlock`,
|
|
[CREATE_BLOCK]: `createBlock`,
|
|
[CREATE_VNODE]: `createVNode`,
|
|
[CREATE_COMMENT]: `createCommentVNode`,
|
|
[CREATE_TEXT]: `createTextVNode`,
|
|
[CREATE_STATIC]: `createStaticVNode`,
|
|
[RESOLVE_COMPONENT]: `resolveComponent`,
|
|
[RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,
|
|
[RESOLVE_DIRECTIVE]: `resolveDirective`,
|
|
[WITH_DIRECTIVES]: `withDirectives`,
|
|
[RENDER_LIST]: `renderList`,
|
|
[RENDER_SLOT]: `renderSlot`,
|
|
[CREATE_SLOTS]: `createSlots`,
|
|
[TO_DISPLAY_STRING]: `toDisplayString`,
|
|
[MERGE_PROPS]: `mergeProps`,
|
|
[TO_HANDLERS]: `toHandlers`,
|
|
[CAMELIZE]: `camelize`,
|
|
[CAPITALIZE]: `capitalize`,
|
|
[TO_HANDLER_KEY]: `toHandlerKey`,
|
|
[SET_BLOCK_TRACKING]: `setBlockTracking`,
|
|
[PUSH_SCOPE_ID]: `pushScopeId`,
|
|
[POP_SCOPE_ID]: `popScopeId`,
|
|
[WITH_SCOPE_ID]: `withScopeId`,
|
|
[WITH_CTX]: `withCtx`,
|
|
[UNREF]: `unref`,
|
|
[IS_REF]: `isRef`
|
|
};
|
|
function registerRuntimeHelpers(helpers) {
|
|
Object.getOwnPropertySymbols(helpers).forEach(s => {
|
|
helperNameMap[s] = helpers[s];
|
|
});
|
|
}
|
|
|
|
// AST Utilities ---------------------------------------------------------------
|
|
// Some expressions, e.g. sequence and conditional expressions, are never
|
|
// associated with template nodes, so their source locations are just a stub.
|
|
// Container types like CompoundExpression also don't need a real location.
|
|
const locStub = {
|
|
source: '',
|
|
start: { line: 1, column: 1, offset: 0 },
|
|
end: { line: 1, column: 1, offset: 0 }
|
|
};
|
|
function createRoot(children, loc = locStub) {
|
|
return {
|
|
type: 0 /* ROOT */,
|
|
children,
|
|
helpers: [],
|
|
components: [],
|
|
directives: [],
|
|
hoists: [],
|
|
imports: [],
|
|
cached: 0,
|
|
temps: 0,
|
|
codegenNode: undefined,
|
|
loc
|
|
};
|
|
}
|
|
function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, loc = locStub) {
|
|
if (context) {
|
|
if (isBlock) {
|
|
context.helper(OPEN_BLOCK);
|
|
context.helper(CREATE_BLOCK);
|
|
}
|
|
else {
|
|
context.helper(CREATE_VNODE);
|
|
}
|
|
if (directives) {
|
|
context.helper(WITH_DIRECTIVES);
|
|
}
|
|
}
|
|
return {
|
|
type: 13 /* VNODE_CALL */,
|
|
tag,
|
|
props,
|
|
children,
|
|
patchFlag,
|
|
dynamicProps,
|
|
directives,
|
|
isBlock,
|
|
disableTracking,
|
|
loc
|
|
};
|
|
}
|
|
function createArrayExpression(elements, loc = locStub) {
|
|
return {
|
|
type: 17 /* JS_ARRAY_EXPRESSION */,
|
|
loc,
|
|
elements
|
|
};
|
|
}
|
|
function createObjectExpression(properties, loc = locStub) {
|
|
return {
|
|
type: 15 /* JS_OBJECT_EXPRESSION */,
|
|
loc,
|
|
properties
|
|
};
|
|
}
|
|
function createObjectProperty(key, value) {
|
|
return {
|
|
type: 16 /* JS_PROPERTY */,
|
|
loc: locStub,
|
|
key: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(key) ? createSimpleExpression(key, true) : key,
|
|
value
|
|
};
|
|
}
|
|
function createSimpleExpression(content, isStatic, loc = locStub, constType = 0 /* NOT_CONSTANT */) {
|
|
return {
|
|
type: 4 /* SIMPLE_EXPRESSION */,
|
|
loc,
|
|
content,
|
|
isStatic,
|
|
constType: isStatic ? 3 /* CAN_STRINGIFY */ : constType
|
|
};
|
|
}
|
|
function createInterpolation(content, loc) {
|
|
return {
|
|
type: 5 /* INTERPOLATION */,
|
|
loc,
|
|
content: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(content)
|
|
? createSimpleExpression(content, false, loc)
|
|
: content
|
|
};
|
|
}
|
|
function createCompoundExpression(children, loc = locStub) {
|
|
return {
|
|
type: 8 /* COMPOUND_EXPRESSION */,
|
|
loc,
|
|
children
|
|
};
|
|
}
|
|
function createCallExpression(callee, args = [], loc = locStub) {
|
|
return {
|
|
type: 14 /* JS_CALL_EXPRESSION */,
|
|
loc,
|
|
callee,
|
|
arguments: args
|
|
};
|
|
}
|
|
function createFunctionExpression(params, returns = undefined, newline = false, isSlot = false, loc = locStub) {
|
|
return {
|
|
type: 18 /* JS_FUNCTION_EXPRESSION */,
|
|
params,
|
|
returns,
|
|
newline,
|
|
isSlot,
|
|
loc
|
|
};
|
|
}
|
|
function createConditionalExpression(test, consequent, alternate, newline = true) {
|
|
return {
|
|
type: 19 /* JS_CONDITIONAL_EXPRESSION */,
|
|
test,
|
|
consequent,
|
|
alternate,
|
|
newline,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createCacheExpression(index, value, isVNode = false) {
|
|
return {
|
|
type: 20 /* JS_CACHE_EXPRESSION */,
|
|
index,
|
|
value,
|
|
isVNode,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createBlockStatement(body) {
|
|
return {
|
|
type: 21 /* JS_BLOCK_STATEMENT */,
|
|
body,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createTemplateLiteral(elements) {
|
|
return {
|
|
type: 22 /* JS_TEMPLATE_LITERAL */,
|
|
elements,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createIfStatement(test, consequent, alternate) {
|
|
return {
|
|
type: 23 /* JS_IF_STATEMENT */,
|
|
test,
|
|
consequent,
|
|
alternate,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createAssignmentExpression(left, right) {
|
|
return {
|
|
type: 24 /* JS_ASSIGNMENT_EXPRESSION */,
|
|
left,
|
|
right,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createSequenceExpression(expressions) {
|
|
return {
|
|
type: 25 /* JS_SEQUENCE_EXPRESSION */,
|
|
expressions,
|
|
loc: locStub
|
|
};
|
|
}
|
|
function createReturnStatement(returns) {
|
|
return {
|
|
type: 26 /* JS_RETURN_STATEMENT */,
|
|
returns,
|
|
loc: locStub
|
|
};
|
|
}
|
|
|
|
const isStaticExp = (p) => p.type === 4 /* SIMPLE_EXPRESSION */ && p.isStatic;
|
|
const isBuiltInType = (tag, expected) => tag === expected || tag === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hyphenate)(expected);
|
|
function isCoreComponent(tag) {
|
|
if (isBuiltInType(tag, 'Teleport')) {
|
|
return TELEPORT;
|
|
}
|
|
else if (isBuiltInType(tag, 'Suspense')) {
|
|
return SUSPENSE;
|
|
}
|
|
else if (isBuiltInType(tag, 'KeepAlive')) {
|
|
return KEEP_ALIVE;
|
|
}
|
|
else if (isBuiltInType(tag, 'BaseTransition')) {
|
|
return BASE_TRANSITION;
|
|
}
|
|
}
|
|
const nonIdentifierRE = /^\d|[^\$\w]/;
|
|
const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
|
|
const memberExpRE = /^[A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*|\[[^\]]+\])*$/;
|
|
const isMemberExpression = (path) => {
|
|
if (!path)
|
|
return false;
|
|
return memberExpRE.test(path.trim());
|
|
};
|
|
function getInnerRange(loc, offset, length) {
|
|
const source = loc.source.substr(offset, length);
|
|
const newLoc = {
|
|
source,
|
|
start: advancePositionWithClone(loc.start, loc.source, offset),
|
|
end: loc.end
|
|
};
|
|
if (length != null) {
|
|
newLoc.end = advancePositionWithClone(loc.start, loc.source, offset + length);
|
|
}
|
|
return newLoc;
|
|
}
|
|
function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
|
|
return advancePositionWithMutation((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, pos), source, numberOfCharacters);
|
|
}
|
|
// advance by mutation without cloning (for performance reasons), since this
|
|
// gets called a lot in the parser
|
|
function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
|
|
let linesCount = 0;
|
|
let lastNewLinePos = -1;
|
|
for (let i = 0; i < numberOfCharacters; i++) {
|
|
if (source.charCodeAt(i) === 10 /* newline char code */) {
|
|
linesCount++;
|
|
lastNewLinePos = i;
|
|
}
|
|
}
|
|
pos.offset += numberOfCharacters;
|
|
pos.line += linesCount;
|
|
pos.column =
|
|
lastNewLinePos === -1
|
|
? pos.column + numberOfCharacters
|
|
: numberOfCharacters - lastNewLinePos;
|
|
return pos;
|
|
}
|
|
function assert(condition, msg) {
|
|
/* istanbul ignore if */
|
|
if (!condition) {
|
|
throw new Error(msg || `unexpected compiler condition`);
|
|
}
|
|
}
|
|
function findDir(node, name, allowEmpty = false) {
|
|
for (let i = 0; i < node.props.length; i++) {
|
|
const p = node.props[i];
|
|
if (p.type === 7 /* DIRECTIVE */ &&
|
|
(allowEmpty || p.exp) &&
|
|
((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name) ? p.name === name : name.test(p.name))) {
|
|
return p;
|
|
}
|
|
}
|
|
}
|
|
function findProp(node, name, dynamicOnly = false, allowEmpty = false) {
|
|
for (let i = 0; i < node.props.length; i++) {
|
|
const p = node.props[i];
|
|
if (p.type === 6 /* ATTRIBUTE */) {
|
|
if (dynamicOnly)
|
|
continue;
|
|
if (p.name === name && (p.value || allowEmpty)) {
|
|
return p;
|
|
}
|
|
}
|
|
else if (p.name === 'bind' &&
|
|
(p.exp || allowEmpty) &&
|
|
isBindKey(p.arg, name)) {
|
|
return p;
|
|
}
|
|
}
|
|
}
|
|
function isBindKey(arg, name) {
|
|
return !!(arg && isStaticExp(arg) && arg.content === name);
|
|
}
|
|
function hasDynamicKeyVBind(node) {
|
|
return node.props.some(p => p.type === 7 /* DIRECTIVE */ &&
|
|
p.name === 'bind' &&
|
|
(!p.arg || // v-bind="obj"
|
|
p.arg.type !== 4 /* SIMPLE_EXPRESSION */ || // v-bind:[_ctx.foo]
|
|
!p.arg.isStatic) // v-bind:[foo]
|
|
);
|
|
}
|
|
function isText(node) {
|
|
return node.type === 5 /* INTERPOLATION */ || node.type === 2 /* TEXT */;
|
|
}
|
|
function isVSlot(p) {
|
|
return p.type === 7 /* DIRECTIVE */ && p.name === 'slot';
|
|
}
|
|
function isTemplateNode(node) {
|
|
return (node.type === 1 /* ELEMENT */ && node.tagType === 3 /* TEMPLATE */);
|
|
}
|
|
function isSlotOutlet(node) {
|
|
return node.type === 1 /* ELEMENT */ && node.tagType === 2 /* SLOT */;
|
|
}
|
|
function injectProp(node, prop, context) {
|
|
let propsWithInjection;
|
|
const props = node.type === 13 /* VNODE_CALL */ ? node.props : node.arguments[2];
|
|
if (props == null || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props)) {
|
|
propsWithInjection = createObjectExpression([prop]);
|
|
}
|
|
else if (props.type === 14 /* JS_CALL_EXPRESSION */) {
|
|
// merged props... add ours
|
|
// only inject key to object literal if it's the first argument so that
|
|
// if doesn't override user provided keys
|
|
const first = props.arguments[0];
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(first) && first.type === 15 /* JS_OBJECT_EXPRESSION */) {
|
|
first.properties.unshift(prop);
|
|
}
|
|
else {
|
|
if (props.callee === TO_HANDLERS) {
|
|
// #2366
|
|
propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
|
|
createObjectExpression([prop]),
|
|
props
|
|
]);
|
|
}
|
|
else {
|
|
props.arguments.unshift(createObjectExpression([prop]));
|
|
}
|
|
}
|
|
!propsWithInjection && (propsWithInjection = props);
|
|
}
|
|
else if (props.type === 15 /* JS_OBJECT_EXPRESSION */) {
|
|
let alreadyExists = false;
|
|
// check existing key to avoid overriding user provided keys
|
|
if (prop.key.type === 4 /* SIMPLE_EXPRESSION */) {
|
|
const propKeyName = prop.key.content;
|
|
alreadyExists = props.properties.some(p => p.key.type === 4 /* SIMPLE_EXPRESSION */ &&
|
|
p.key.content === propKeyName);
|
|
}
|
|
if (!alreadyExists) {
|
|
props.properties.unshift(prop);
|
|
}
|
|
propsWithInjection = props;
|
|
}
|
|
else {
|
|
// single v-bind with expression, return a merged replacement
|
|
propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
|
|
createObjectExpression([prop]),
|
|
props
|
|
]);
|
|
}
|
|
if (node.type === 13 /* VNODE_CALL */) {
|
|
node.props = propsWithInjection;
|
|
}
|
|
else {
|
|
node.arguments[2] = propsWithInjection;
|
|
}
|
|
}
|
|
function toValidAssetId(name, type) {
|
|
return `_${type}_${name.replace(/[^\w]/g, '_')}`;
|
|
}
|
|
// Check if a node contains expressions that reference current context scope ids
|
|
function hasScopeRef(node, ids) {
|
|
if (!node || Object.keys(ids).length === 0) {
|
|
return false;
|
|
}
|
|
switch (node.type) {
|
|
case 1 /* ELEMENT */:
|
|
for (let i = 0; i < node.props.length; i++) {
|
|
const p = node.props[i];
|
|
if (p.type === 7 /* DIRECTIVE */ &&
|
|
(hasScopeRef(p.arg, ids) || hasScopeRef(p.exp, ids))) {
|
|
return true;
|
|
}
|
|
}
|
|
return node.children.some(c => hasScopeRef(c, ids));
|
|
case 11 /* FOR */:
|
|
if (hasScopeRef(node.source, ids)) {
|
|
return true;
|
|
}
|
|
return node.children.some(c => hasScopeRef(c, ids));
|
|
case 9 /* IF */:
|
|
return node.branches.some(b => hasScopeRef(b, ids));
|
|
case 10 /* IF_BRANCH */:
|
|
if (hasScopeRef(node.condition, ids)) {
|
|
return true;
|
|
}
|
|
return node.children.some(c => hasScopeRef(c, ids));
|
|
case 4 /* SIMPLE_EXPRESSION */:
|
|
return (!node.isStatic &&
|
|
isSimpleIdentifier(node.content) &&
|
|
!!ids[node.content]);
|
|
case 8 /* COMPOUND_EXPRESSION */:
|
|
return node.children.some(c => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(c) && hasScopeRef(c, ids));
|
|
case 5 /* INTERPOLATION */:
|
|
case 12 /* TEXT_CALL */:
|
|
return hasScopeRef(node.content, ids);
|
|
case 2 /* TEXT */:
|
|
case 3 /* COMMENT */:
|
|
return false;
|
|
default:
|
|
if ((true)) ;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// The default decoder only provides escapes for characters reserved as part of
|
|
// the template syntax, and is only used if the custom renderer did not provide
|
|
// a platform-specific decoder.
|
|
const decodeRE = /&(gt|lt|amp|apos|quot);/g;
|
|
const decodeMap = {
|
|
gt: '>',
|
|
lt: '<',
|
|
amp: '&',
|
|
apos: "'",
|
|
quot: '"'
|
|
};
|
|
const defaultParserOptions = {
|
|
delimiters: [`{{`, `}}`],
|
|
getNamespace: () => 0 /* HTML */,
|
|
getTextMode: () => 0 /* DATA */,
|
|
isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,
|
|
isPreTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,
|
|
isCustomElement: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO,
|
|
decodeEntities: (rawText) => rawText.replace(decodeRE, (_, p1) => decodeMap[p1]),
|
|
onError: defaultOnError,
|
|
comments: false
|
|
};
|
|
function baseParse(content, options = {}) {
|
|
const context = createParserContext(content, options);
|
|
const start = getCursor(context);
|
|
return createRoot(parseChildren(context, 0 /* DATA */, []), getSelection(context, start));
|
|
}
|
|
function createParserContext(content, rawOptions) {
|
|
const options = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, defaultParserOptions);
|
|
for (const key in rawOptions) {
|
|
// @ts-ignore
|
|
options[key] = rawOptions[key] || defaultParserOptions[key];
|
|
}
|
|
return {
|
|
options,
|
|
column: 1,
|
|
line: 1,
|
|
offset: 0,
|
|
originalSource: content,
|
|
source: content,
|
|
inPre: false,
|
|
inVPre: false
|
|
};
|
|
}
|
|
function parseChildren(context, mode, ancestors) {
|
|
const parent = last(ancestors);
|
|
const ns = parent ? parent.ns : 0 /* HTML */;
|
|
const nodes = [];
|
|
while (!isEnd(context, mode, ancestors)) {
|
|
const s = context.source;
|
|
let node = undefined;
|
|
if (mode === 0 /* DATA */ || mode === 1 /* RCDATA */) {
|
|
if (!context.inVPre && startsWith(s, context.options.delimiters[0])) {
|
|
// '{{'
|
|
node = parseInterpolation(context, mode);
|
|
}
|
|
else if (mode === 0 /* DATA */ && s[0] === '<') {
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
|
|
if (s.length === 1) {
|
|
emitError(context, 5 /* EOF_BEFORE_TAG_NAME */, 1);
|
|
}
|
|
else if (s[1] === '!') {
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state
|
|
if (startsWith(s, '<!--')) {
|
|
node = parseComment(context);
|
|
}
|
|
else if (startsWith(s, '<!DOCTYPE')) {
|
|
// Ignore DOCTYPE by a limitation.
|
|
node = parseBogusComment(context);
|
|
}
|
|
else if (startsWith(s, '<![CDATA[')) {
|
|
if (ns !== 0 /* HTML */) {
|
|
node = parseCDATA(context, ancestors);
|
|
}
|
|
else {
|
|
emitError(context, 1 /* CDATA_IN_HTML_CONTENT */);
|
|
node = parseBogusComment(context);
|
|
}
|
|
}
|
|
else {
|
|
emitError(context, 11 /* INCORRECTLY_OPENED_COMMENT */);
|
|
node = parseBogusComment(context);
|
|
}
|
|
}
|
|
else if (s[1] === '/') {
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#end-tag-open-state
|
|
if (s.length === 2) {
|
|
emitError(context, 5 /* EOF_BEFORE_TAG_NAME */, 2);
|
|
}
|
|
else if (s[2] === '>') {
|
|
emitError(context, 14 /* MISSING_END_TAG_NAME */, 2);
|
|
advanceBy(context, 3);
|
|
continue;
|
|
}
|
|
else if (/[a-z]/i.test(s[2])) {
|
|
emitError(context, 23 /* X_INVALID_END_TAG */);
|
|
parseTag(context, 1 /* End */, parent);
|
|
continue;
|
|
}
|
|
else {
|
|
emitError(context, 12 /* INVALID_FIRST_CHARACTER_OF_TAG_NAME */, 2);
|
|
node = parseBogusComment(context);
|
|
}
|
|
}
|
|
else if (/[a-z]/i.test(s[1])) {
|
|
node = parseElement(context, ancestors);
|
|
}
|
|
else if (s[1] === '?') {
|
|
emitError(context, 21 /* UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME */, 1);
|
|
node = parseBogusComment(context);
|
|
}
|
|
else {
|
|
emitError(context, 12 /* INVALID_FIRST_CHARACTER_OF_TAG_NAME */, 1);
|
|
}
|
|
}
|
|
}
|
|
if (!node) {
|
|
node = parseText(context, mode);
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node)) {
|
|
for (let i = 0; i < node.length; i++) {
|
|
pushNode(nodes, node[i]);
|
|
}
|
|
}
|
|
else {
|
|
pushNode(nodes, node);
|
|
}
|
|
}
|
|
// Whitespace management for more efficient output
|
|
// (same as v2 whitespace: 'condense')
|
|
let removedWhitespace = false;
|
|
if (mode !== 2 /* RAWTEXT */) {
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
const node = nodes[i];
|
|
if (!context.inPre && node.type === 2 /* TEXT */) {
|
|
if (!/[^\t\r\n\f ]/.test(node.content)) {
|
|
const prev = nodes[i - 1];
|
|
const next = nodes[i + 1];
|
|
// If:
|
|
// - the whitespace is the first or last node, or:
|
|
// - the whitespace is adjacent to a comment, or:
|
|
// - the whitespace is between two elements AND contains newline
|
|
// Then the whitespace is ignored.
|
|
if (!prev ||
|
|
!next ||
|
|
prev.type === 3 /* COMMENT */ ||
|
|
next.type === 3 /* COMMENT */ ||
|
|
(prev.type === 1 /* ELEMENT */ &&
|
|
next.type === 1 /* ELEMENT */ &&
|
|
/[\r\n]/.test(node.content))) {
|
|
removedWhitespace = true;
|
|
nodes[i] = null;
|
|
}
|
|
else {
|
|
// Otherwise, condensed consecutive whitespace inside the text
|
|
// down to a single space
|
|
node.content = ' ';
|
|
}
|
|
}
|
|
else {
|
|
node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ');
|
|
}
|
|
}
|
|
// also remove comment nodes in prod by default
|
|
if (false) {}
|
|
}
|
|
if (context.inPre && parent && context.options.isPreTag(parent.tag)) {
|
|
// remove leading newline per html spec
|
|
// https://html.spec.whatwg.org/multipage/grouping-content.html#the-pre-element
|
|
const first = nodes[0];
|
|
if (first && first.type === 2 /* TEXT */) {
|
|
first.content = first.content.replace(/^\r?\n/, '');
|
|
}
|
|
}
|
|
}
|
|
return removedWhitespace ? nodes.filter(Boolean) : nodes;
|
|
}
|
|
function pushNode(nodes, node) {
|
|
if (node.type === 2 /* TEXT */) {
|
|
const prev = last(nodes);
|
|
// Merge if both this and the previous node are text and those are
|
|
// consecutive. This happens for cases like "a < b".
|
|
if (prev &&
|
|
prev.type === 2 /* TEXT */ &&
|
|
prev.loc.end.offset === node.loc.start.offset) {
|
|
prev.content += node.content;
|
|
prev.loc.end = node.loc.end;
|
|
prev.loc.source += node.loc.source;
|
|
return;
|
|
}
|
|
}
|
|
nodes.push(node);
|
|
}
|
|
function parseCDATA(context, ancestors) {
|
|
advanceBy(context, 9);
|
|
const nodes = parseChildren(context, 3 /* CDATA */, ancestors);
|
|
if (context.source.length === 0) {
|
|
emitError(context, 6 /* EOF_IN_CDATA */);
|
|
}
|
|
else {
|
|
advanceBy(context, 3);
|
|
}
|
|
return nodes;
|
|
}
|
|
function parseComment(context) {
|
|
const start = getCursor(context);
|
|
let content;
|
|
// Regular comment.
|
|
const match = /--(\!)?>/.exec(context.source);
|
|
if (!match) {
|
|
content = context.source.slice(4);
|
|
advanceBy(context, context.source.length);
|
|
emitError(context, 7 /* EOF_IN_COMMENT */);
|
|
}
|
|
else {
|
|
if (match.index <= 3) {
|
|
emitError(context, 0 /* ABRUPT_CLOSING_OF_EMPTY_COMMENT */);
|
|
}
|
|
if (match[1]) {
|
|
emitError(context, 10 /* INCORRECTLY_CLOSED_COMMENT */);
|
|
}
|
|
content = context.source.slice(4, match.index);
|
|
// Advancing with reporting nested comments.
|
|
const s = context.source.slice(0, match.index);
|
|
let prevIndex = 1, nestedIndex = 0;
|
|
while ((nestedIndex = s.indexOf('<!--', prevIndex)) !== -1) {
|
|
advanceBy(context, nestedIndex - prevIndex + 1);
|
|
if (nestedIndex + 4 < s.length) {
|
|
emitError(context, 16 /* NESTED_COMMENT */);
|
|
}
|
|
prevIndex = nestedIndex + 1;
|
|
}
|
|
advanceBy(context, match.index + match[0].length - prevIndex + 1);
|
|
}
|
|
return {
|
|
type: 3 /* COMMENT */,
|
|
content,
|
|
loc: getSelection(context, start)
|
|
};
|
|
}
|
|
function parseBogusComment(context) {
|
|
const start = getCursor(context);
|
|
const contentStart = context.source[1] === '?' ? 1 : 2;
|
|
let content;
|
|
const closeIndex = context.source.indexOf('>');
|
|
if (closeIndex === -1) {
|
|
content = context.source.slice(contentStart);
|
|
advanceBy(context, context.source.length);
|
|
}
|
|
else {
|
|
content = context.source.slice(contentStart, closeIndex);
|
|
advanceBy(context, closeIndex + 1);
|
|
}
|
|
return {
|
|
type: 3 /* COMMENT */,
|
|
content,
|
|
loc: getSelection(context, start)
|
|
};
|
|
}
|
|
function parseElement(context, ancestors) {
|
|
// Start tag.
|
|
const wasInPre = context.inPre;
|
|
const wasInVPre = context.inVPre;
|
|
const parent = last(ancestors);
|
|
const element = parseTag(context, 0 /* Start */, parent);
|
|
const isPreBoundary = context.inPre && !wasInPre;
|
|
const isVPreBoundary = context.inVPre && !wasInVPre;
|
|
if (element.isSelfClosing || context.options.isVoidTag(element.tag)) {
|
|
return element;
|
|
}
|
|
// Children.
|
|
ancestors.push(element);
|
|
const mode = context.options.getTextMode(element, parent);
|
|
const children = parseChildren(context, mode, ancestors);
|
|
ancestors.pop();
|
|
element.children = children;
|
|
// End tag.
|
|
if (startsWithEndTagOpen(context.source, element.tag)) {
|
|
parseTag(context, 1 /* End */, parent);
|
|
}
|
|
else {
|
|
emitError(context, 24 /* X_MISSING_END_TAG */, 0, element.loc.start);
|
|
if (context.source.length === 0 && element.tag.toLowerCase() === 'script') {
|
|
const first = children[0];
|
|
if (first && startsWith(first.loc.source, '<!--')) {
|
|
emitError(context, 8 /* EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT */);
|
|
}
|
|
}
|
|
}
|
|
element.loc = getSelection(context, element.loc.start);
|
|
if (isPreBoundary) {
|
|
context.inPre = false;
|
|
}
|
|
if (isVPreBoundary) {
|
|
context.inVPre = false;
|
|
}
|
|
return element;
|
|
}
|
|
const isSpecialTemplateDirective = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.makeMap)(`if,else,else-if,for,slot`);
|
|
/**
|
|
* Parse a tag (E.g. `<div id=a>`) with that type (start tag or end tag).
|
|
*/
|
|
function parseTag(context, type, parent) {
|
|
// Tag open.
|
|
const start = getCursor(context);
|
|
const match = /^<\/?([a-z][^\t\r\n\f />]*)/i.exec(context.source);
|
|
const tag = match[1];
|
|
const ns = context.options.getNamespace(tag, parent);
|
|
advanceBy(context, match[0].length);
|
|
advanceSpaces(context);
|
|
// save current state in case we need to re-parse attributes with v-pre
|
|
const cursor = getCursor(context);
|
|
const currentSource = context.source;
|
|
// Attributes.
|
|
let props = parseAttributes(context, type);
|
|
// check <pre> tag
|
|
if (context.options.isPreTag(tag)) {
|
|
context.inPre = true;
|
|
}
|
|
// check v-pre
|
|
if (!context.inVPre &&
|
|
props.some(p => p.type === 7 /* DIRECTIVE */ && p.name === 'pre')) {
|
|
context.inVPre = true;
|
|
// reset context
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)(context, cursor);
|
|
context.source = currentSource;
|
|
// re-parse attrs and filter out v-pre itself
|
|
props = parseAttributes(context, type).filter(p => p.name !== 'v-pre');
|
|
}
|
|
// Tag close.
|
|
let isSelfClosing = false;
|
|
if (context.source.length === 0) {
|
|
emitError(context, 9 /* EOF_IN_TAG */);
|
|
}
|
|
else {
|
|
isSelfClosing = startsWith(context.source, '/>');
|
|
if (type === 1 /* End */ && isSelfClosing) {
|
|
emitError(context, 4 /* END_TAG_WITH_TRAILING_SOLIDUS */);
|
|
}
|
|
advanceBy(context, isSelfClosing ? 2 : 1);
|
|
}
|
|
let tagType = 0 /* ELEMENT */;
|
|
const options = context.options;
|
|
if (!context.inVPre && !options.isCustomElement(tag)) {
|
|
const hasVIs = props.some(p => p.type === 7 /* DIRECTIVE */ && p.name === 'is');
|
|
if (options.isNativeTag && !hasVIs) {
|
|
if (!options.isNativeTag(tag))
|
|
tagType = 1 /* COMPONENT */;
|
|
}
|
|
else if (hasVIs ||
|
|
isCoreComponent(tag) ||
|
|
(options.isBuiltInComponent && options.isBuiltInComponent(tag)) ||
|
|
/^[A-Z]/.test(tag) ||
|
|
tag === 'component') {
|
|
tagType = 1 /* COMPONENT */;
|
|
}
|
|
if (tag === 'slot') {
|
|
tagType = 2 /* SLOT */;
|
|
}
|
|
else if (tag === 'template' &&
|
|
props.some(p => {
|
|
return (p.type === 7 /* DIRECTIVE */ && isSpecialTemplateDirective(p.name));
|
|
})) {
|
|
tagType = 3 /* TEMPLATE */;
|
|
}
|
|
}
|
|
return {
|
|
type: 1 /* ELEMENT */,
|
|
ns,
|
|
tag,
|
|
tagType,
|
|
props,
|
|
isSelfClosing,
|
|
children: [],
|
|
loc: getSelection(context, start),
|
|
codegenNode: undefined // to be created during transform phase
|
|
};
|
|
}
|
|
function parseAttributes(context, type) {
|
|
const props = [];
|
|
const attributeNames = new Set();
|
|
while (context.source.length > 0 &&
|
|
!startsWith(context.source, '>') &&
|
|
!startsWith(context.source, '/>')) {
|
|
if (startsWith(context.source, '/')) {
|
|
emitError(context, 22 /* UNEXPECTED_SOLIDUS_IN_TAG */);
|
|
advanceBy(context, 1);
|
|
advanceSpaces(context);
|
|
continue;
|
|
}
|
|
if (type === 1 /* End */) {
|
|
emitError(context, 3 /* END_TAG_WITH_ATTRIBUTES */);
|
|
}
|
|
const attr = parseAttribute(context, attributeNames);
|
|
if (type === 0 /* Start */) {
|
|
props.push(attr);
|
|
}
|
|
if (/^[^\t\r\n\f />]/.test(context.source)) {
|
|
emitError(context, 15 /* MISSING_WHITESPACE_BETWEEN_ATTRIBUTES */);
|
|
}
|
|
advanceSpaces(context);
|
|
}
|
|
return props;
|
|
}
|
|
function parseAttribute(context, nameSet) {
|
|
// Name.
|
|
const start = getCursor(context);
|
|
const match = /^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(context.source);
|
|
const name = match[0];
|
|
if (nameSet.has(name)) {
|
|
emitError(context, 2 /* DUPLICATE_ATTRIBUTE */);
|
|
}
|
|
nameSet.add(name);
|
|
if (name[0] === '=') {
|
|
emitError(context, 19 /* UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME */);
|
|
}
|
|
{
|
|
const pattern = /["'<]/g;
|
|
let m;
|
|
while ((m = pattern.exec(name))) {
|
|
emitError(context, 17 /* UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME */, m.index);
|
|
}
|
|
}
|
|
advanceBy(context, name.length);
|
|
// Value
|
|
let value = undefined;
|
|
if (/^[\t\r\n\f ]*=/.test(context.source)) {
|
|
advanceSpaces(context);
|
|
advanceBy(context, 1);
|
|
advanceSpaces(context);
|
|
value = parseAttributeValue(context);
|
|
if (!value) {
|
|
emitError(context, 13 /* MISSING_ATTRIBUTE_VALUE */);
|
|
}
|
|
}
|
|
const loc = getSelection(context, start);
|
|
if (!context.inVPre && /^(v-|:|@|#)/.test(name)) {
|
|
const match = /(?:^v-([a-z0-9-]+))?(?:(?::|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(name);
|
|
const dirName = match[1] ||
|
|
(startsWith(name, ':') ? 'bind' : startsWith(name, '@') ? 'on' : 'slot');
|
|
let arg;
|
|
if (match[2]) {
|
|
const isSlot = dirName === 'slot';
|
|
const startOffset = name.indexOf(match[2]);
|
|
const loc = getSelection(context, getNewPosition(context, start, startOffset), getNewPosition(context, start, startOffset + match[2].length + ((isSlot && match[3]) || '').length));
|
|
let content = match[2];
|
|
let isStatic = true;
|
|
if (content.startsWith('[')) {
|
|
isStatic = false;
|
|
if (!content.endsWith(']')) {
|
|
emitError(context, 26 /* X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END */);
|
|
}
|
|
content = content.substr(1, content.length - 2);
|
|
}
|
|
else if (isSlot) {
|
|
// #1241 special case for v-slot: vuetify relies extensively on slot
|
|
// names containing dots. v-slot doesn't have any modifiers and Vue 2.x
|
|
// supports such usage so we are keeping it consistent with 2.x.
|
|
content += match[3] || '';
|
|
}
|
|
arg = {
|
|
type: 4 /* SIMPLE_EXPRESSION */,
|
|
content,
|
|
isStatic,
|
|
constType: isStatic
|
|
? 3 /* CAN_STRINGIFY */
|
|
: 0 /* NOT_CONSTANT */,
|
|
loc
|
|
};
|
|
}
|
|
if (value && value.isQuoted) {
|
|
const valueLoc = value.loc;
|
|
valueLoc.start.offset++;
|
|
valueLoc.start.column++;
|
|
valueLoc.end = advancePositionWithClone(valueLoc.start, value.content);
|
|
valueLoc.source = valueLoc.source.slice(1, -1);
|
|
}
|
|
return {
|
|
type: 7 /* DIRECTIVE */,
|
|
name: dirName,
|
|
exp: value && {
|
|
type: 4 /* SIMPLE_EXPRESSION */,
|
|
content: value.content,
|
|
isStatic: false,
|
|
// Treat as non-constant by default. This can be potentially set to
|
|
// other values by `transformExpression` to make it eligible for hoisting.
|
|
constType: 0 /* NOT_CONSTANT */,
|
|
loc: value.loc
|
|
},
|
|
arg,
|
|
modifiers: match[3] ? match[3].substr(1).split('.') : [],
|
|
loc
|
|
};
|
|
}
|
|
return {
|
|
type: 6 /* ATTRIBUTE */,
|
|
name,
|
|
value: value && {
|
|
type: 2 /* TEXT */,
|
|
content: value.content,
|
|
loc: value.loc
|
|
},
|
|
loc
|
|
};
|
|
}
|
|
function parseAttributeValue(context) {
|
|
const start = getCursor(context);
|
|
let content;
|
|
const quote = context.source[0];
|
|
const isQuoted = quote === `"` || quote === `'`;
|
|
if (isQuoted) {
|
|
// Quoted value.
|
|
advanceBy(context, 1);
|
|
const endIndex = context.source.indexOf(quote);
|
|
if (endIndex === -1) {
|
|
content = parseTextData(context, context.source.length, 4 /* ATTRIBUTE_VALUE */);
|
|
}
|
|
else {
|
|
content = parseTextData(context, endIndex, 4 /* ATTRIBUTE_VALUE */);
|
|
advanceBy(context, 1);
|
|
}
|
|
}
|
|
else {
|
|
// Unquoted
|
|
const match = /^[^\t\r\n\f >]+/.exec(context.source);
|
|
if (!match) {
|
|
return undefined;
|
|
}
|
|
const unexpectedChars = /["'<=`]/g;
|
|
let m;
|
|
while ((m = unexpectedChars.exec(match[0]))) {
|
|
emitError(context, 18 /* UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE */, m.index);
|
|
}
|
|
content = parseTextData(context, match[0].length, 4 /* ATTRIBUTE_VALUE */);
|
|
}
|
|
return { content, isQuoted, loc: getSelection(context, start) };
|
|
}
|
|
function parseInterpolation(context, mode) {
|
|
const [open, close] = context.options.delimiters;
|
|
const closeIndex = context.source.indexOf(close, open.length);
|
|
if (closeIndex === -1) {
|
|
emitError(context, 25 /* X_MISSING_INTERPOLATION_END */);
|
|
return undefined;
|
|
}
|
|
const start = getCursor(context);
|
|
advanceBy(context, open.length);
|
|
const innerStart = getCursor(context);
|
|
const innerEnd = getCursor(context);
|
|
const rawContentLength = closeIndex - open.length;
|
|
const rawContent = context.source.slice(0, rawContentLength);
|
|
const preTrimContent = parseTextData(context, rawContentLength, mode);
|
|
const content = preTrimContent.trim();
|
|
const startOffset = preTrimContent.indexOf(content);
|
|
if (startOffset > 0) {
|
|
advancePositionWithMutation(innerStart, rawContent, startOffset);
|
|
}
|
|
const endOffset = rawContentLength - (preTrimContent.length - content.length - startOffset);
|
|
advancePositionWithMutation(innerEnd, rawContent, endOffset);
|
|
advanceBy(context, close.length);
|
|
return {
|
|
type: 5 /* INTERPOLATION */,
|
|
content: {
|
|
type: 4 /* SIMPLE_EXPRESSION */,
|
|
isStatic: false,
|
|
// Set `isConstant` to false by default and will decide in transformExpression
|
|
constType: 0 /* NOT_CONSTANT */,
|
|
content,
|
|
loc: getSelection(context, innerStart, innerEnd)
|
|
},
|
|
loc: getSelection(context, start)
|
|
};
|
|
}
|
|
function parseText(context, mode) {
|
|
const endTokens = ['<', context.options.delimiters[0]];
|
|
if (mode === 3 /* CDATA */) {
|
|
endTokens.push(']]>');
|
|
}
|
|
let endIndex = context.source.length;
|
|
for (let i = 0; i < endTokens.length; i++) {
|
|
const index = context.source.indexOf(endTokens[i], 1);
|
|
if (index !== -1 && endIndex > index) {
|
|
endIndex = index;
|
|
}
|
|
}
|
|
const start = getCursor(context);
|
|
const content = parseTextData(context, endIndex, mode);
|
|
return {
|
|
type: 2 /* TEXT */,
|
|
content,
|
|
loc: getSelection(context, start)
|
|
};
|
|
}
|
|
/**
|
|
* Get text data with a given length from the current location.
|
|
* This translates HTML entities in the text data.
|
|
*/
|
|
function parseTextData(context, length, mode) {
|
|
const rawText = context.source.slice(0, length);
|
|
advanceBy(context, length);
|
|
if (mode === 2 /* RAWTEXT */ ||
|
|
mode === 3 /* CDATA */ ||
|
|
rawText.indexOf('&') === -1) {
|
|
return rawText;
|
|
}
|
|
else {
|
|
// DATA or RCDATA containing "&"". Entity decoding required.
|
|
return context.options.decodeEntities(rawText, mode === 4 /* ATTRIBUTE_VALUE */);
|
|
}
|
|
}
|
|
function getCursor(context) {
|
|
const { column, line, offset } = context;
|
|
return { column, line, offset };
|
|
}
|
|
function getSelection(context, start, end) {
|
|
end = end || getCursor(context);
|
|
return {
|
|
start,
|
|
end,
|
|
source: context.originalSource.slice(start.offset, end.offset)
|
|
};
|
|
}
|
|
function last(xs) {
|
|
return xs[xs.length - 1];
|
|
}
|
|
function startsWith(source, searchString) {
|
|
return source.startsWith(searchString);
|
|
}
|
|
function advanceBy(context, numberOfCharacters) {
|
|
const { source } = context;
|
|
advancePositionWithMutation(context, source, numberOfCharacters);
|
|
context.source = source.slice(numberOfCharacters);
|
|
}
|
|
function advanceSpaces(context) {
|
|
const match = /^[\t\r\n\f ]+/.exec(context.source);
|
|
if (match) {
|
|
advanceBy(context, match[0].length);
|
|
}
|
|
}
|
|
function getNewPosition(context, start, numberOfCharacters) {
|
|
return advancePositionWithClone(start, context.originalSource.slice(start.offset, numberOfCharacters), numberOfCharacters);
|
|
}
|
|
function emitError(context, code, offset, loc = getCursor(context)) {
|
|
if (offset) {
|
|
loc.offset += offset;
|
|
loc.column += offset;
|
|
}
|
|
context.options.onError(createCompilerError(code, {
|
|
start: loc,
|
|
end: loc,
|
|
source: ''
|
|
}));
|
|
}
|
|
function isEnd(context, mode, ancestors) {
|
|
const s = context.source;
|
|
switch (mode) {
|
|
case 0 /* DATA */:
|
|
if (startsWith(s, '</')) {
|
|
// TODO: probably bad performance
|
|
for (let i = ancestors.length - 1; i >= 0; --i) {
|
|
if (startsWithEndTagOpen(s, ancestors[i].tag)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 1 /* RCDATA */:
|
|
case 2 /* RAWTEXT */: {
|
|
const parent = last(ancestors);
|
|
if (parent && startsWithEndTagOpen(s, parent.tag)) {
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case 3 /* CDATA */:
|
|
if (startsWith(s, ']]>')) {
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
return !s;
|
|
}
|
|
function startsWithEndTagOpen(source, tag) {
|
|
return (startsWith(source, '</') &&
|
|
source.substr(2, tag.length).toLowerCase() === tag.toLowerCase() &&
|
|
/[\t\r\n\f />]/.test(source[2 + tag.length] || '>'));
|
|
}
|
|
|
|
function hoistStatic(root, context) {
|
|
walk(root, context,
|
|
// Root node is unfortunately non-hoistable due to potential parent
|
|
// fallthrough attributes.
|
|
isSingleElementRoot(root, root.children[0]));
|
|
}
|
|
function isSingleElementRoot(root, child) {
|
|
const { children } = root;
|
|
return (children.length === 1 &&
|
|
child.type === 1 /* ELEMENT */ &&
|
|
!isSlotOutlet(child));
|
|
}
|
|
function walk(node, context, doNotHoistNode = false) {
|
|
let hasHoistedNode = false;
|
|
// Some transforms, e.g. transformAssetUrls from @vue/compiler-sfc, replaces
|
|
// static bindings with expressions. These expressions are guaranteed to be
|
|
// constant so they are still eligible for hoisting, but they are only
|
|
// available at runtime and therefore cannot be evaluated ahead of time.
|
|
// This is only a concern for pre-stringification (via transformHoist by
|
|
// @vue/compiler-dom), but doing it here allows us to perform only one full
|
|
// walk of the AST and allow `stringifyStatic` to stop walking as soon as its
|
|
// stringficiation threshold is met.
|
|
let canStringify = true;
|
|
const { children } = node;
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
// only plain elements & text calls are eligible for hoisting.
|
|
if (child.type === 1 /* ELEMENT */ &&
|
|
child.tagType === 0 /* ELEMENT */) {
|
|
const constantType = doNotHoistNode
|
|
? 0 /* NOT_CONSTANT */
|
|
: getConstantType(child, context);
|
|
if (constantType > 0 /* NOT_CONSTANT */) {
|
|
if (constantType < 3 /* CAN_STRINGIFY */) {
|
|
canStringify = false;
|
|
}
|
|
if (constantType >= 2 /* CAN_HOIST */) {
|
|
child.codegenNode.patchFlag =
|
|
-1 /* HOISTED */ + (( true) ? ` /* HOISTED */` : 0);
|
|
child.codegenNode = context.hoist(child.codegenNode);
|
|
hasHoistedNode = true;
|
|
continue;
|
|
}
|
|
}
|
|
else {
|
|
// node may contain dynamic children, but its props may be eligible for
|
|
// hoisting.
|
|
const codegenNode = child.codegenNode;
|
|
if (codegenNode.type === 13 /* VNODE_CALL */) {
|
|
const flag = getPatchFlag(codegenNode);
|
|
if ((!flag ||
|
|
flag === 512 /* NEED_PATCH */ ||
|
|
flag === 1 /* TEXT */) &&
|
|
getGeneratedPropsConstantType(child, context) >=
|
|
2 /* CAN_HOIST */) {
|
|
const props = getNodeProps(child);
|
|
if (props) {
|
|
codegenNode.props = context.hoist(props);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (child.type === 12 /* TEXT_CALL */) {
|
|
const contentType = getConstantType(child.content, context);
|
|
if (contentType > 0) {
|
|
if (contentType < 3 /* CAN_STRINGIFY */) {
|
|
canStringify = false;
|
|
}
|
|
if (contentType >= 2 /* CAN_HOIST */) {
|
|
child.codegenNode = context.hoist(child.codegenNode);
|
|
hasHoistedNode = true;
|
|
}
|
|
}
|
|
}
|
|
// walk further
|
|
if (child.type === 1 /* ELEMENT */) {
|
|
walk(child, context);
|
|
}
|
|
else if (child.type === 11 /* FOR */) {
|
|
// Do not hoist v-for single child because it has to be a block
|
|
walk(child, context, child.children.length === 1);
|
|
}
|
|
else if (child.type === 9 /* IF */) {
|
|
for (let i = 0; i < child.branches.length; i++) {
|
|
// Do not hoist v-if single child because it has to be a block
|
|
walk(child.branches[i], context, child.branches[i].children.length === 1);
|
|
}
|
|
}
|
|
}
|
|
if (canStringify && hasHoistedNode && context.transformHoist) {
|
|
context.transformHoist(children, context, node);
|
|
}
|
|
}
|
|
function getConstantType(node, context) {
|
|
const { constantCache } = context;
|
|
switch (node.type) {
|
|
case 1 /* ELEMENT */:
|
|
if (node.tagType !== 0 /* ELEMENT */) {
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
const cached = constantCache.get(node);
|
|
if (cached !== undefined) {
|
|
return cached;
|
|
}
|
|
const codegenNode = node.codegenNode;
|
|
if (codegenNode.type !== 13 /* VNODE_CALL */) {
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
const flag = getPatchFlag(codegenNode);
|
|
if (!flag) {
|
|
let returnType = 3 /* CAN_STRINGIFY */;
|
|
// Element itself has no patch flag. However we still need to check:
|
|
// 1. Even for a node with no patch flag, it is possible for it to contain
|
|
// non-hoistable expressions that refers to scope variables, e.g. compiler
|
|
// injected keys or cached event handlers. Therefore we need to always
|
|
// check the codegenNode's props to be sure.
|
|
const generatedPropsType = getGeneratedPropsConstantType(node, context);
|
|
if (generatedPropsType === 0 /* NOT_CONSTANT */) {
|
|
constantCache.set(node, 0 /* NOT_CONSTANT */);
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
if (generatedPropsType < returnType) {
|
|
returnType = generatedPropsType;
|
|
}
|
|
// 2. its children.
|
|
for (let i = 0; i < node.children.length; i++) {
|
|
const childType = getConstantType(node.children[i], context);
|
|
if (childType === 0 /* NOT_CONSTANT */) {
|
|
constantCache.set(node, 0 /* NOT_CONSTANT */);
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
if (childType < returnType) {
|
|
returnType = childType;
|
|
}
|
|
}
|
|
// 3. if the type is not already CAN_SKIP_PATCH which is the lowest non-0
|
|
// type, check if any of the props can cause the type to be lowered
|
|
// we can skip can_patch because it's guaranteed by the absence of a
|
|
// patchFlag.
|
|
if (returnType > 1 /* CAN_SKIP_PATCH */) {
|
|
for (let i = 0; i < node.props.length; i++) {
|
|
const p = node.props[i];
|
|
if (p.type === 7 /* DIRECTIVE */ && p.name === 'bind' && p.exp) {
|
|
const expType = getConstantType(p.exp, context);
|
|
if (expType === 0 /* NOT_CONSTANT */) {
|
|
constantCache.set(node, 0 /* NOT_CONSTANT */);
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
if (expType < returnType) {
|
|
returnType = expType;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// only svg/foreignObject could be block here, however if they are
|
|
// static then they don't need to be blocks since there will be no
|
|
// nested updates.
|
|
if (codegenNode.isBlock) {
|
|
codegenNode.isBlock = false;
|
|
context.helper(CREATE_VNODE);
|
|
}
|
|
constantCache.set(node, returnType);
|
|
return returnType;
|
|
}
|
|
else {
|
|
constantCache.set(node, 0 /* NOT_CONSTANT */);
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
case 2 /* TEXT */:
|
|
case 3 /* COMMENT */:
|
|
return 3 /* CAN_STRINGIFY */;
|
|
case 9 /* IF */:
|
|
case 11 /* FOR */:
|
|
case 10 /* IF_BRANCH */:
|
|
return 0 /* NOT_CONSTANT */;
|
|
case 5 /* INTERPOLATION */:
|
|
case 12 /* TEXT_CALL */:
|
|
return getConstantType(node.content, context);
|
|
case 4 /* SIMPLE_EXPRESSION */:
|
|
return node.constType;
|
|
case 8 /* COMPOUND_EXPRESSION */:
|
|
let returnType = 3 /* CAN_STRINGIFY */;
|
|
for (let i = 0; i < node.children.length; i++) {
|
|
const child = node.children[i];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(child)) {
|
|
continue;
|
|
}
|
|
const childType = getConstantType(child, context);
|
|
if (childType === 0 /* NOT_CONSTANT */) {
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
else if (childType < returnType) {
|
|
returnType = childType;
|
|
}
|
|
}
|
|
return returnType;
|
|
default:
|
|
if ((true)) ;
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
}
|
|
function getGeneratedPropsConstantType(node, context) {
|
|
let returnType = 3 /* CAN_STRINGIFY */;
|
|
const props = getNodeProps(node);
|
|
if (props && props.type === 15 /* JS_OBJECT_EXPRESSION */) {
|
|
const { properties } = props;
|
|
for (let i = 0; i < properties.length; i++) {
|
|
const { key, value } = properties[i];
|
|
const keyType = getConstantType(key, context);
|
|
if (keyType === 0 /* NOT_CONSTANT */) {
|
|
return keyType;
|
|
}
|
|
if (keyType < returnType) {
|
|
returnType = keyType;
|
|
}
|
|
if (value.type !== 4 /* SIMPLE_EXPRESSION */) {
|
|
return 0 /* NOT_CONSTANT */;
|
|
}
|
|
const valueType = getConstantType(value, context);
|
|
if (valueType === 0 /* NOT_CONSTANT */) {
|
|
return valueType;
|
|
}
|
|
if (valueType < returnType) {
|
|
returnType = valueType;
|
|
}
|
|
}
|
|
}
|
|
return returnType;
|
|
}
|
|
function getNodeProps(node) {
|
|
const codegenNode = node.codegenNode;
|
|
if (codegenNode.type === 13 /* VNODE_CALL */) {
|
|
return codegenNode.props;
|
|
}
|
|
}
|
|
function getPatchFlag(node) {
|
|
const flag = node.patchFlag;
|
|
return flag ? parseInt(flag, 10) : undefined;
|
|
}
|
|
|
|
function createTransformContext(root, { filename = '', prefixIdentifiers = false, hoistStatic = false, cacheHandlers = false, nodeTransforms = [], directiveTransforms = {}, transformHoist = null, isBuiltInComponent = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, isCustomElement = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, expressionPlugins = [], scopeId = null, ssr = false, ssrCssVars = ``, bindingMetadata = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.EMPTY_OBJ, inline = false, isTS = false, onError = defaultOnError }) {
|
|
const nameMatch = filename.replace(/\?.*$/, '').match(/([^/\\]+)\.\w+$/);
|
|
const context = {
|
|
// options
|
|
selfName: nameMatch && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(nameMatch[1])),
|
|
prefixIdentifiers,
|
|
hoistStatic,
|
|
cacheHandlers,
|
|
nodeTransforms,
|
|
directiveTransforms,
|
|
transformHoist,
|
|
isBuiltInComponent,
|
|
isCustomElement,
|
|
expressionPlugins,
|
|
scopeId,
|
|
ssr,
|
|
ssrCssVars,
|
|
bindingMetadata,
|
|
inline,
|
|
isTS,
|
|
onError,
|
|
// state
|
|
root,
|
|
helpers: new Set(),
|
|
components: new Set(),
|
|
directives: new Set(),
|
|
hoists: [],
|
|
imports: [],
|
|
constantCache: new Map(),
|
|
temps: 0,
|
|
cached: 0,
|
|
identifiers: Object.create(null),
|
|
scopes: {
|
|
vFor: 0,
|
|
vSlot: 0,
|
|
vPre: 0,
|
|
vOnce: 0
|
|
},
|
|
parent: null,
|
|
currentNode: root,
|
|
childIndex: 0,
|
|
// methods
|
|
helper(name) {
|
|
context.helpers.add(name);
|
|
return name;
|
|
},
|
|
helperString(name) {
|
|
return `_${helperNameMap[context.helper(name)]}`;
|
|
},
|
|
replaceNode(node) {
|
|
/* istanbul ignore if */
|
|
if ((true)) {
|
|
if (!context.currentNode) {
|
|
throw new Error(`Node being replaced is already removed.`);
|
|
}
|
|
if (!context.parent) {
|
|
throw new Error(`Cannot replace root node.`);
|
|
}
|
|
}
|
|
context.parent.children[context.childIndex] = context.currentNode = node;
|
|
},
|
|
removeNode(node) {
|
|
if (( true) && !context.parent) {
|
|
throw new Error(`Cannot remove root node.`);
|
|
}
|
|
const list = context.parent.children;
|
|
const removalIndex = node
|
|
? list.indexOf(node)
|
|
: context.currentNode
|
|
? context.childIndex
|
|
: -1;
|
|
/* istanbul ignore if */
|
|
if (( true) && removalIndex < 0) {
|
|
throw new Error(`node being removed is not a child of current parent`);
|
|
}
|
|
if (!node || node === context.currentNode) {
|
|
// current node removed
|
|
context.currentNode = null;
|
|
context.onNodeRemoved();
|
|
}
|
|
else {
|
|
// sibling node removed
|
|
if (context.childIndex > removalIndex) {
|
|
context.childIndex--;
|
|
context.onNodeRemoved();
|
|
}
|
|
}
|
|
context.parent.children.splice(removalIndex, 1);
|
|
},
|
|
onNodeRemoved: () => { },
|
|
addIdentifiers(exp) {
|
|
},
|
|
removeIdentifiers(exp) {
|
|
},
|
|
hoist(exp) {
|
|
context.hoists.push(exp);
|
|
const identifier = createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc, 2 /* CAN_HOIST */);
|
|
identifier.hoisted = exp;
|
|
return identifier;
|
|
},
|
|
cache(exp, isVNode = false) {
|
|
return createCacheExpression(++context.cached, exp, isVNode);
|
|
}
|
|
};
|
|
return context;
|
|
}
|
|
function transform(root, options) {
|
|
const context = createTransformContext(root, options);
|
|
traverseNode(root, context);
|
|
if (options.hoistStatic) {
|
|
hoistStatic(root, context);
|
|
}
|
|
if (!options.ssr) {
|
|
createRootCodegen(root, context);
|
|
}
|
|
// finalize meta information
|
|
root.helpers = [...context.helpers];
|
|
root.components = [...context.components];
|
|
root.directives = [...context.directives];
|
|
root.imports = context.imports;
|
|
root.hoists = context.hoists;
|
|
root.temps = context.temps;
|
|
root.cached = context.cached;
|
|
}
|
|
function createRootCodegen(root, context) {
|
|
const { helper } = context;
|
|
const { children } = root;
|
|
if (children.length === 1) {
|
|
const child = children[0];
|
|
// if the single child is an element, turn it into a block.
|
|
if (isSingleElementRoot(root, child) && child.codegenNode) {
|
|
// single element root is never hoisted so codegenNode will never be
|
|
// SimpleExpressionNode
|
|
const codegenNode = child.codegenNode;
|
|
if (codegenNode.type === 13 /* VNODE_CALL */) {
|
|
codegenNode.isBlock = true;
|
|
helper(OPEN_BLOCK);
|
|
helper(CREATE_BLOCK);
|
|
}
|
|
root.codegenNode = codegenNode;
|
|
}
|
|
else {
|
|
// - single <slot/>, IfNode, ForNode: already blocks.
|
|
// - single text node: always patched.
|
|
// root codegen falls through via genNode()
|
|
root.codegenNode = child;
|
|
}
|
|
}
|
|
else if (children.length > 1) {
|
|
// root has multiple nodes - return a fragment block.
|
|
let patchFlag = 64 /* STABLE_FRAGMENT */;
|
|
let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64];
|
|
// check if the fragment actually contains a single valid child with
|
|
// the rest being comments
|
|
if (( true) &&
|
|
children.filter(c => c.type !== 3 /* COMMENT */).length === 1) {
|
|
patchFlag |= 2048 /* DEV_ROOT_FRAGMENT */;
|
|
patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`;
|
|
}
|
|
root.codegenNode = createVNodeCall(context, helper(FRAGMENT), undefined, root.children, patchFlag + (( true) ? ` /* ${patchFlagText} */` : 0), undefined, undefined, true);
|
|
}
|
|
else ;
|
|
}
|
|
function traverseChildren(parent, context) {
|
|
let i = 0;
|
|
const nodeRemoved = () => {
|
|
i--;
|
|
};
|
|
for (; i < parent.children.length; i++) {
|
|
const child = parent.children[i];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child))
|
|
continue;
|
|
context.parent = parent;
|
|
context.childIndex = i;
|
|
context.onNodeRemoved = nodeRemoved;
|
|
traverseNode(child, context);
|
|
}
|
|
}
|
|
function traverseNode(node, context) {
|
|
context.currentNode = node;
|
|
// apply transform plugins
|
|
const { nodeTransforms } = context;
|
|
const exitFns = [];
|
|
for (let i = 0; i < nodeTransforms.length; i++) {
|
|
const onExit = nodeTransforms[i](node, context);
|
|
if (onExit) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(onExit)) {
|
|
exitFns.push(...onExit);
|
|
}
|
|
else {
|
|
exitFns.push(onExit);
|
|
}
|
|
}
|
|
if (!context.currentNode) {
|
|
// node was removed
|
|
return;
|
|
}
|
|
else {
|
|
// node may have been replaced
|
|
node = context.currentNode;
|
|
}
|
|
}
|
|
switch (node.type) {
|
|
case 3 /* COMMENT */:
|
|
if (!context.ssr) {
|
|
// inject import for the Comment symbol, which is needed for creating
|
|
// comment nodes with `createVNode`
|
|
context.helper(CREATE_COMMENT);
|
|
}
|
|
break;
|
|
case 5 /* INTERPOLATION */:
|
|
// no need to traverse, but we need to inject toString helper
|
|
if (!context.ssr) {
|
|
context.helper(TO_DISPLAY_STRING);
|
|
}
|
|
break;
|
|
// for container types, further traverse downwards
|
|
case 9 /* IF */:
|
|
for (let i = 0; i < node.branches.length; i++) {
|
|
traverseNode(node.branches[i], context);
|
|
}
|
|
break;
|
|
case 10 /* IF_BRANCH */:
|
|
case 11 /* FOR */:
|
|
case 1 /* ELEMENT */:
|
|
case 0 /* ROOT */:
|
|
traverseChildren(node, context);
|
|
break;
|
|
}
|
|
// exit transforms
|
|
context.currentNode = node;
|
|
let i = exitFns.length;
|
|
while (i--) {
|
|
exitFns[i]();
|
|
}
|
|
}
|
|
function createStructuralDirectiveTransform(name, fn) {
|
|
const matches = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name)
|
|
? (n) => n === name
|
|
: (n) => name.test(n);
|
|
return (node, context) => {
|
|
if (node.type === 1 /* ELEMENT */) {
|
|
const { props } = node;
|
|
// structural directive transforms are not concerned with slots
|
|
// as they are handled separately in vSlot.ts
|
|
if (node.tagType === 3 /* TEMPLATE */ && props.some(isVSlot)) {
|
|
return;
|
|
}
|
|
const exitFns = [];
|
|
for (let i = 0; i < props.length; i++) {
|
|
const prop = props[i];
|
|
if (prop.type === 7 /* DIRECTIVE */ && matches(prop.name)) {
|
|
// structural directives are removed to avoid infinite recursion
|
|
// also we remove them *before* applying so that it can further
|
|
// traverse itself in case it moves the node around
|
|
props.splice(i, 1);
|
|
i--;
|
|
const onExit = fn(node, prop, context);
|
|
if (onExit)
|
|
exitFns.push(onExit);
|
|
}
|
|
}
|
|
return exitFns;
|
|
}
|
|
};
|
|
}
|
|
|
|
const PURE_ANNOTATION = `/*#__PURE__*/`;
|
|
function createCodegenContext(ast, { mode = 'function', prefixIdentifiers = mode === 'module', sourceMap = false, filename = `template.vue.html`, scopeId = null, optimizeImports = false, runtimeGlobalName = `Vue`, runtimeModuleName = `vue`, ssr = false }) {
|
|
const context = {
|
|
mode,
|
|
prefixIdentifiers,
|
|
sourceMap,
|
|
filename,
|
|
scopeId,
|
|
optimizeImports,
|
|
runtimeGlobalName,
|
|
runtimeModuleName,
|
|
ssr,
|
|
source: ast.loc.source,
|
|
code: ``,
|
|
column: 1,
|
|
line: 1,
|
|
offset: 0,
|
|
indentLevel: 0,
|
|
pure: false,
|
|
map: undefined,
|
|
helper(key) {
|
|
return `_${helperNameMap[key]}`;
|
|
},
|
|
push(code, node) {
|
|
context.code += code;
|
|
},
|
|
indent() {
|
|
newline(++context.indentLevel);
|
|
},
|
|
deindent(withoutNewLine = false) {
|
|
if (withoutNewLine) {
|
|
--context.indentLevel;
|
|
}
|
|
else {
|
|
newline(--context.indentLevel);
|
|
}
|
|
},
|
|
newline() {
|
|
newline(context.indentLevel);
|
|
}
|
|
};
|
|
function newline(n) {
|
|
context.push('\n' + ` `.repeat(n));
|
|
}
|
|
return context;
|
|
}
|
|
function generate(ast, options = {}) {
|
|
const context = createCodegenContext(ast, options);
|
|
if (options.onContextCreated)
|
|
options.onContextCreated(context);
|
|
const { mode, push, prefixIdentifiers, indent, deindent, newline, scopeId, ssr } = context;
|
|
const hasHelpers = ast.helpers.length > 0;
|
|
const useWithBlock = !prefixIdentifiers && mode !== 'module';
|
|
// preambles
|
|
// in setup() inline mode, the preamble is generated in a sub context
|
|
// and returned separately.
|
|
const preambleContext = context;
|
|
{
|
|
genFunctionPreamble(ast, preambleContext);
|
|
}
|
|
// enter render function
|
|
const functionName = ssr ? `ssrRender` : `render`;
|
|
const args = ssr ? ['_ctx', '_push', '_parent', '_attrs'] : ['_ctx', '_cache'];
|
|
const signature = args.join(', ');
|
|
{
|
|
push(`function ${functionName}(${signature}) {`);
|
|
}
|
|
indent();
|
|
if (useWithBlock) {
|
|
push(`with (_ctx) {`);
|
|
indent();
|
|
// function mode const declarations should be inside with block
|
|
// also they should be renamed to avoid collision with user properties
|
|
if (hasHelpers) {
|
|
push(`const { ${ast.helpers
|
|
.map(s => `${helperNameMap[s]}: _${helperNameMap[s]}`)
|
|
.join(', ')} } = _Vue`);
|
|
push(`\n`);
|
|
newline();
|
|
}
|
|
}
|
|
// generate asset resolution statements
|
|
if (ast.components.length) {
|
|
genAssets(ast.components, 'component', context);
|
|
if (ast.directives.length || ast.temps > 0) {
|
|
newline();
|
|
}
|
|
}
|
|
if (ast.directives.length) {
|
|
genAssets(ast.directives, 'directive', context);
|
|
if (ast.temps > 0) {
|
|
newline();
|
|
}
|
|
}
|
|
if (ast.temps > 0) {
|
|
push(`let `);
|
|
for (let i = 0; i < ast.temps; i++) {
|
|
push(`${i > 0 ? `, ` : ``}_temp${i}`);
|
|
}
|
|
}
|
|
if (ast.components.length || ast.directives.length || ast.temps) {
|
|
push(`\n`);
|
|
newline();
|
|
}
|
|
// generate the VNode tree expression
|
|
if (!ssr) {
|
|
push(`return `);
|
|
}
|
|
if (ast.codegenNode) {
|
|
genNode(ast.codegenNode, context);
|
|
}
|
|
else {
|
|
push(`null`);
|
|
}
|
|
if (useWithBlock) {
|
|
deindent();
|
|
push(`}`);
|
|
}
|
|
deindent();
|
|
push(`}`);
|
|
return {
|
|
ast,
|
|
code: context.code,
|
|
preamble: ``,
|
|
// SourceMapGenerator does have toJSON() method but it's not in the types
|
|
map: context.map ? context.map.toJSON() : undefined
|
|
};
|
|
}
|
|
function genFunctionPreamble(ast, context) {
|
|
const { ssr, prefixIdentifiers, push, newline, runtimeModuleName, runtimeGlobalName } = context;
|
|
const VueBinding = runtimeGlobalName;
|
|
const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`;
|
|
// Generate const declaration for helpers
|
|
// In prefix mode, we place the const declaration at top so it's done
|
|
// only once; But if we not prefixing, we place the declaration inside the
|
|
// with block so it doesn't incur the `in` check cost for every helper access.
|
|
if (ast.helpers.length > 0) {
|
|
{
|
|
// "with" mode.
|
|
// save Vue in a separate variable to avoid collision
|
|
push(`const _Vue = ${VueBinding}\n`);
|
|
// in "with" mode, helpers are declared inside the with block to avoid
|
|
// has check cost, but hoists are lifted out of the function - we need
|
|
// to provide the helper here.
|
|
if (ast.hoists.length) {
|
|
const staticHelpers = [
|
|
CREATE_VNODE,
|
|
CREATE_COMMENT,
|
|
CREATE_TEXT,
|
|
CREATE_STATIC
|
|
]
|
|
.filter(helper => ast.helpers.includes(helper))
|
|
.map(aliasHelper)
|
|
.join(', ');
|
|
push(`const { ${staticHelpers} } = _Vue\n`);
|
|
}
|
|
}
|
|
}
|
|
genHoists(ast.hoists, context);
|
|
newline();
|
|
push(`return `);
|
|
}
|
|
function genAssets(assets, type, { helper, push, newline }) {
|
|
const resolver = helper(type === 'component' ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE);
|
|
for (let i = 0; i < assets.length; i++) {
|
|
const id = assets[i];
|
|
push(`const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)})`);
|
|
if (i < assets.length - 1) {
|
|
newline();
|
|
}
|
|
}
|
|
}
|
|
function genHoists(hoists, context) {
|
|
if (!hoists.length) {
|
|
return;
|
|
}
|
|
context.pure = true;
|
|
const { push, newline, helper, scopeId, mode } = context;
|
|
newline();
|
|
hoists.forEach((exp, i) => {
|
|
if (exp) {
|
|
push(`const _hoisted_${i + 1} = `);
|
|
genNode(exp, context);
|
|
newline();
|
|
}
|
|
});
|
|
context.pure = false;
|
|
}
|
|
function isText$1(n) {
|
|
return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(n) ||
|
|
n.type === 4 /* SIMPLE_EXPRESSION */ ||
|
|
n.type === 2 /* TEXT */ ||
|
|
n.type === 5 /* INTERPOLATION */ ||
|
|
n.type === 8 /* COMPOUND_EXPRESSION */);
|
|
}
|
|
function genNodeListAsArray(nodes, context) {
|
|
const multilines = nodes.length > 3 ||
|
|
((( true)) && nodes.some(n => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(n) || !isText$1(n)));
|
|
context.push(`[`);
|
|
multilines && context.indent();
|
|
genNodeList(nodes, context, multilines);
|
|
multilines && context.deindent();
|
|
context.push(`]`);
|
|
}
|
|
function genNodeList(nodes, context, multilines = false, comma = true) {
|
|
const { push, newline } = context;
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
const node = nodes[i];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) {
|
|
push(node);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node)) {
|
|
genNodeListAsArray(node, context);
|
|
}
|
|
else {
|
|
genNode(node, context);
|
|
}
|
|
if (i < nodes.length - 1) {
|
|
if (multilines) {
|
|
comma && push(',');
|
|
newline();
|
|
}
|
|
else {
|
|
comma && push(', ');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function genNode(node, context) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) {
|
|
context.push(node);
|
|
return;
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(node)) {
|
|
context.push(context.helper(node));
|
|
return;
|
|
}
|
|
switch (node.type) {
|
|
case 1 /* ELEMENT */:
|
|
case 9 /* IF */:
|
|
case 11 /* FOR */:
|
|
( true) &&
|
|
assert(node.codegenNode != null, `Codegen node is missing for element/if/for node. ` +
|
|
`Apply appropriate transforms first.`);
|
|
genNode(node.codegenNode, context);
|
|
break;
|
|
case 2 /* TEXT */:
|
|
genText(node, context);
|
|
break;
|
|
case 4 /* SIMPLE_EXPRESSION */:
|
|
genExpression(node, context);
|
|
break;
|
|
case 5 /* INTERPOLATION */:
|
|
genInterpolation(node, context);
|
|
break;
|
|
case 12 /* TEXT_CALL */:
|
|
genNode(node.codegenNode, context);
|
|
break;
|
|
case 8 /* COMPOUND_EXPRESSION */:
|
|
genCompoundExpression(node, context);
|
|
break;
|
|
case 3 /* COMMENT */:
|
|
genComment(node, context);
|
|
break;
|
|
case 13 /* VNODE_CALL */:
|
|
genVNodeCall(node, context);
|
|
break;
|
|
case 14 /* JS_CALL_EXPRESSION */:
|
|
genCallExpression(node, context);
|
|
break;
|
|
case 15 /* JS_OBJECT_EXPRESSION */:
|
|
genObjectExpression(node, context);
|
|
break;
|
|
case 17 /* JS_ARRAY_EXPRESSION */:
|
|
genArrayExpression(node, context);
|
|
break;
|
|
case 18 /* JS_FUNCTION_EXPRESSION */:
|
|
genFunctionExpression(node, context);
|
|
break;
|
|
case 19 /* JS_CONDITIONAL_EXPRESSION */:
|
|
genConditionalExpression(node, context);
|
|
break;
|
|
case 20 /* JS_CACHE_EXPRESSION */:
|
|
genCacheExpression(node, context);
|
|
break;
|
|
// SSR only types
|
|
case 21 /* JS_BLOCK_STATEMENT */:
|
|
break;
|
|
case 22 /* JS_TEMPLATE_LITERAL */:
|
|
break;
|
|
case 23 /* JS_IF_STATEMENT */:
|
|
break;
|
|
case 24 /* JS_ASSIGNMENT_EXPRESSION */:
|
|
break;
|
|
case 25 /* JS_SEQUENCE_EXPRESSION */:
|
|
break;
|
|
case 26 /* JS_RETURN_STATEMENT */:
|
|
break;
|
|
/* istanbul ignore next */
|
|
case 10 /* IF_BRANCH */:
|
|
// noop
|
|
break;
|
|
default:
|
|
if ((true)) {
|
|
assert(false, `unhandled codegen node type: ${node.type}`);
|
|
// make sure we exhaust all possible types
|
|
const exhaustiveCheck = node;
|
|
return exhaustiveCheck;
|
|
}
|
|
}
|
|
}
|
|
function genText(node, context) {
|
|
context.push(JSON.stringify(node.content), node);
|
|
}
|
|
function genExpression(node, context) {
|
|
const { content, isStatic } = node;
|
|
context.push(isStatic ? JSON.stringify(content) : content, node);
|
|
}
|
|
function genInterpolation(node, context) {
|
|
const { push, helper, pure } = context;
|
|
if (pure)
|
|
push(PURE_ANNOTATION);
|
|
push(`${helper(TO_DISPLAY_STRING)}(`);
|
|
genNode(node.content, context);
|
|
push(`)`);
|
|
}
|
|
function genCompoundExpression(node, context) {
|
|
for (let i = 0; i < node.children.length; i++) {
|
|
const child = node.children[i];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child)) {
|
|
context.push(child);
|
|
}
|
|
else {
|
|
genNode(child, context);
|
|
}
|
|
}
|
|
}
|
|
function genExpressionAsPropertyKey(node, context) {
|
|
const { push } = context;
|
|
if (node.type === 8 /* COMPOUND_EXPRESSION */) {
|
|
push(`[`);
|
|
genCompoundExpression(node, context);
|
|
push(`]`);
|
|
}
|
|
else if (node.isStatic) {
|
|
// only quote keys if necessary
|
|
const text = isSimpleIdentifier(node.content)
|
|
? node.content
|
|
: JSON.stringify(node.content);
|
|
push(text, node);
|
|
}
|
|
else {
|
|
push(`[${node.content}]`, node);
|
|
}
|
|
}
|
|
function genComment(node, context) {
|
|
if ((true)) {
|
|
const { push, helper, pure } = context;
|
|
if (pure) {
|
|
push(PURE_ANNOTATION);
|
|
}
|
|
push(`${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, node);
|
|
}
|
|
}
|
|
function genVNodeCall(node, context) {
|
|
const { push, helper, pure } = context;
|
|
const { tag, props, children, patchFlag, dynamicProps, directives, isBlock, disableTracking } = node;
|
|
if (directives) {
|
|
push(helper(WITH_DIRECTIVES) + `(`);
|
|
}
|
|
if (isBlock) {
|
|
push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `);
|
|
}
|
|
if (pure) {
|
|
push(PURE_ANNOTATION);
|
|
}
|
|
push(helper(isBlock ? CREATE_BLOCK : CREATE_VNODE) + `(`, node);
|
|
genNodeList(genNullableArgs([tag, props, children, patchFlag, dynamicProps]), context);
|
|
push(`)`);
|
|
if (isBlock) {
|
|
push(`)`);
|
|
}
|
|
if (directives) {
|
|
push(`, `);
|
|
genNode(directives, context);
|
|
push(`)`);
|
|
}
|
|
}
|
|
function genNullableArgs(args) {
|
|
let i = args.length;
|
|
while (i--) {
|
|
if (args[i] != null)
|
|
break;
|
|
}
|
|
return args.slice(0, i + 1).map(arg => arg || `null`);
|
|
}
|
|
// JavaScript
|
|
function genCallExpression(node, context) {
|
|
const { push, helper, pure } = context;
|
|
const callee = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node.callee) ? node.callee : helper(node.callee);
|
|
if (pure) {
|
|
push(PURE_ANNOTATION);
|
|
}
|
|
push(callee + `(`, node);
|
|
genNodeList(node.arguments, context);
|
|
push(`)`);
|
|
}
|
|
function genObjectExpression(node, context) {
|
|
const { push, indent, deindent, newline } = context;
|
|
const { properties } = node;
|
|
if (!properties.length) {
|
|
push(`{}`, node);
|
|
return;
|
|
}
|
|
const multilines = properties.length > 1 ||
|
|
((( true)) &&
|
|
properties.some(p => p.value.type !== 4 /* SIMPLE_EXPRESSION */));
|
|
push(multilines ? `{` : `{ `);
|
|
multilines && indent();
|
|
for (let i = 0; i < properties.length; i++) {
|
|
const { key, value } = properties[i];
|
|
// key
|
|
genExpressionAsPropertyKey(key, context);
|
|
push(`: `);
|
|
// value
|
|
genNode(value, context);
|
|
if (i < properties.length - 1) {
|
|
// will only reach this if it's multilines
|
|
push(`,`);
|
|
newline();
|
|
}
|
|
}
|
|
multilines && deindent();
|
|
push(multilines ? `}` : ` }`);
|
|
}
|
|
function genArrayExpression(node, context) {
|
|
genNodeListAsArray(node.elements, context);
|
|
}
|
|
function genFunctionExpression(node, context) {
|
|
const { push, indent, deindent, scopeId, mode } = context;
|
|
const { params, returns, body, newline, isSlot } = node;
|
|
if (isSlot) {
|
|
push(`_${helperNameMap[WITH_CTX]}(`);
|
|
}
|
|
push(`(`, node);
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(params)) {
|
|
genNodeList(params, context);
|
|
}
|
|
else if (params) {
|
|
genNode(params, context);
|
|
}
|
|
push(`) => `);
|
|
if (newline || body) {
|
|
push(`{`);
|
|
indent();
|
|
}
|
|
if (returns) {
|
|
if (newline) {
|
|
push(`return `);
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(returns)) {
|
|
genNodeListAsArray(returns, context);
|
|
}
|
|
else {
|
|
genNode(returns, context);
|
|
}
|
|
}
|
|
else if (body) {
|
|
genNode(body, context);
|
|
}
|
|
if (newline || body) {
|
|
deindent();
|
|
push(`}`);
|
|
}
|
|
if (isSlot) {
|
|
push(`)`);
|
|
}
|
|
}
|
|
function genConditionalExpression(node, context) {
|
|
const { test, consequent, alternate, newline: needNewline } = node;
|
|
const { push, indent, deindent, newline } = context;
|
|
if (test.type === 4 /* SIMPLE_EXPRESSION */) {
|
|
const needsParens = !isSimpleIdentifier(test.content);
|
|
needsParens && push(`(`);
|
|
genExpression(test, context);
|
|
needsParens && push(`)`);
|
|
}
|
|
else {
|
|
push(`(`);
|
|
genNode(test, context);
|
|
push(`)`);
|
|
}
|
|
needNewline && indent();
|
|
context.indentLevel++;
|
|
needNewline || push(` `);
|
|
push(`? `);
|
|
genNode(consequent, context);
|
|
context.indentLevel--;
|
|
needNewline && newline();
|
|
needNewline || push(` `);
|
|
push(`: `);
|
|
const isNested = alternate.type === 19 /* JS_CONDITIONAL_EXPRESSION */;
|
|
if (!isNested) {
|
|
context.indentLevel++;
|
|
}
|
|
genNode(alternate, context);
|
|
if (!isNested) {
|
|
context.indentLevel--;
|
|
}
|
|
needNewline && deindent(true /* without newline */);
|
|
}
|
|
function genCacheExpression(node, context) {
|
|
const { push, helper, indent, deindent, newline } = context;
|
|
push(`_cache[${node.index}] || (`);
|
|
if (node.isVNode) {
|
|
indent();
|
|
push(`${helper(SET_BLOCK_TRACKING)}(-1),`);
|
|
newline();
|
|
}
|
|
push(`_cache[${node.index}] = `);
|
|
genNode(node.value, context);
|
|
if (node.isVNode) {
|
|
push(`,`);
|
|
newline();
|
|
push(`${helper(SET_BLOCK_TRACKING)}(1),`);
|
|
newline();
|
|
push(`_cache[${node.index}]`);
|
|
deindent();
|
|
}
|
|
push(`)`);
|
|
}
|
|
|
|
// these keywords should not appear inside expressions, but operators like
|
|
// typeof, instanceof and in are allowed
|
|
const prohibitedKeywordRE = new RegExp('\\b' +
|
|
('do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
|
|
'super,throw,while,yield,delete,export,import,return,switch,default,' +
|
|
'extends,finally,continue,debugger,function,arguments,typeof,void')
|
|
.split(',')
|
|
.join('\\b|\\b') +
|
|
'\\b');
|
|
// strip strings in expressions
|
|
const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
|
|
/**
|
|
* Validate a non-prefixed expression.
|
|
* This is only called when using the in-browser runtime compiler since it
|
|
* doesn't prefix expressions.
|
|
*/
|
|
function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) {
|
|
const exp = node.content;
|
|
// empty expressions are validated per-directive since some directives
|
|
// do allow empty expressions.
|
|
if (!exp.trim()) {
|
|
return;
|
|
}
|
|
try {
|
|
new Function(asRawStatements
|
|
? ` ${exp} `
|
|
: `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`);
|
|
}
|
|
catch (e) {
|
|
let message = e.message;
|
|
const keywordMatch = exp
|
|
.replace(stripStringRE, '')
|
|
.match(prohibitedKeywordRE);
|
|
if (keywordMatch) {
|
|
message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`;
|
|
}
|
|
context.onError(createCompilerError(43 /* X_INVALID_EXPRESSION */, node.loc, undefined, message));
|
|
}
|
|
}
|
|
|
|
const transformExpression = (node, context) => {
|
|
if (node.type === 5 /* INTERPOLATION */) {
|
|
node.content = processExpression(node.content, context);
|
|
}
|
|
else if (node.type === 1 /* ELEMENT */) {
|
|
// handle directives on element
|
|
for (let i = 0; i < node.props.length; i++) {
|
|
const dir = node.props[i];
|
|
// do not process for v-on & v-for since they are special handled
|
|
if (dir.type === 7 /* DIRECTIVE */ && dir.name !== 'for') {
|
|
const exp = dir.exp;
|
|
const arg = dir.arg;
|
|
// do not process exp if this is v-on:arg - we need special handling
|
|
// for wrapping inline statements.
|
|
if (exp &&
|
|
exp.type === 4 /* SIMPLE_EXPRESSION */ &&
|
|
!(dir.name === 'on' && arg)) {
|
|
dir.exp = processExpression(exp, context,
|
|
// slot args must be processed as function params
|
|
dir.name === 'slot');
|
|
}
|
|
if (arg && arg.type === 4 /* SIMPLE_EXPRESSION */ && !arg.isStatic) {
|
|
dir.arg = processExpression(arg, context);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
// Important: since this function uses Node.js only dependencies, it should
|
|
// always be used with a leading !true check so that it can be
|
|
// tree-shaken from the browser build.
|
|
function processExpression(node, context,
|
|
// some expressions like v-slot props & v-for aliases should be parsed as
|
|
// function params
|
|
asParams = false,
|
|
// v-on handler values may contain multiple statements
|
|
asRawStatements = false) {
|
|
{
|
|
if ((true)) {
|
|
// simple in-browser validation (same logic in 2.x)
|
|
validateBrowserExpression(node, context, asParams, asRawStatements);
|
|
}
|
|
return node;
|
|
}
|
|
}
|
|
|
|
const transformIf = createStructuralDirectiveTransform(/^(if|else|else-if)$/, (node, dir, context) => {
|
|
return processIf(node, dir, context, (ifNode, branch, isRoot) => {
|
|
// #1587: We need to dynamically increment the key based on the current
|
|
// node's sibling nodes, since chained v-if/else branches are
|
|
// rendered at the same depth
|
|
const siblings = context.parent.children;
|
|
let i = siblings.indexOf(ifNode);
|
|
let key = 0;
|
|
while (i-- >= 0) {
|
|
const sibling = siblings[i];
|
|
if (sibling && sibling.type === 9 /* IF */) {
|
|
key += sibling.branches.length;
|
|
}
|
|
}
|
|
// Exit callback. Complete the codegenNode when all children have been
|
|
// transformed.
|
|
return () => {
|
|
if (isRoot) {
|
|
ifNode.codegenNode = createCodegenNodeForBranch(branch, key, context);
|
|
}
|
|
else {
|
|
// attach this branch's codegen node to the v-if root.
|
|
const parentCondition = getParentCondition(ifNode.codegenNode);
|
|
parentCondition.alternate = createCodegenNodeForBranch(branch, key + ifNode.branches.length - 1, context);
|
|
}
|
|
};
|
|
});
|
|
});
|
|
// target-agnostic transform used for both Client and SSR
|
|
function processIf(node, dir, context, processCodegen) {
|
|
if (dir.name !== 'else' &&
|
|
(!dir.exp || !dir.exp.content.trim())) {
|
|
const loc = dir.exp ? dir.exp.loc : node.loc;
|
|
context.onError(createCompilerError(27 /* X_V_IF_NO_EXPRESSION */, dir.loc));
|
|
dir.exp = createSimpleExpression(`true`, false, loc);
|
|
}
|
|
if ( true && dir.exp) {
|
|
validateBrowserExpression(dir.exp, context);
|
|
}
|
|
if (dir.name === 'if') {
|
|
const branch = createIfBranch(node, dir);
|
|
const ifNode = {
|
|
type: 9 /* IF */,
|
|
loc: node.loc,
|
|
branches: [branch]
|
|
};
|
|
context.replaceNode(ifNode);
|
|
if (processCodegen) {
|
|
return processCodegen(ifNode, branch, true);
|
|
}
|
|
}
|
|
else {
|
|
// locate the adjacent v-if
|
|
const siblings = context.parent.children;
|
|
const comments = [];
|
|
let i = siblings.indexOf(node);
|
|
while (i-- >= -1) {
|
|
const sibling = siblings[i];
|
|
if (( true) && sibling && sibling.type === 3 /* COMMENT */) {
|
|
context.removeNode(sibling);
|
|
comments.unshift(sibling);
|
|
continue;
|
|
}
|
|
if (sibling &&
|
|
sibling.type === 2 /* TEXT */ &&
|
|
!sibling.content.trim().length) {
|
|
context.removeNode(sibling);
|
|
continue;
|
|
}
|
|
if (sibling && sibling.type === 9 /* IF */) {
|
|
// move the node to the if node's branches
|
|
context.removeNode();
|
|
const branch = createIfBranch(node, dir);
|
|
if (( true) && comments.length) {
|
|
branch.children = [...comments, ...branch.children];
|
|
}
|
|
// check if user is forcing same key on different branches
|
|
if (true) {
|
|
const key = branch.userKey;
|
|
if (key) {
|
|
sibling.branches.forEach(({ userKey }) => {
|
|
if (isSameKey(userKey, key)) {
|
|
context.onError(createCompilerError(28 /* X_V_IF_SAME_KEY */, branch.userKey.loc));
|
|
}
|
|
});
|
|
}
|
|
}
|
|
sibling.branches.push(branch);
|
|
const onExit = processCodegen && processCodegen(sibling, branch, false);
|
|
// since the branch was removed, it will not be traversed.
|
|
// make sure to traverse here.
|
|
traverseNode(branch, context);
|
|
// call on exit
|
|
if (onExit)
|
|
onExit();
|
|
// make sure to reset currentNode after traversal to indicate this
|
|
// node has been removed.
|
|
context.currentNode = null;
|
|
}
|
|
else {
|
|
context.onError(createCompilerError(29 /* X_V_ELSE_NO_ADJACENT_IF */, node.loc));
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
function createIfBranch(node, dir) {
|
|
return {
|
|
type: 10 /* IF_BRANCH */,
|
|
loc: node.loc,
|
|
condition: dir.name === 'else' ? undefined : dir.exp,
|
|
children: node.tagType === 3 /* TEMPLATE */ && !findDir(node, 'for')
|
|
? node.children
|
|
: [node],
|
|
userKey: findProp(node, `key`)
|
|
};
|
|
}
|
|
function createCodegenNodeForBranch(branch, keyIndex, context) {
|
|
if (branch.condition) {
|
|
return createConditionalExpression(branch.condition, createChildrenCodegenNode(branch, keyIndex, context),
|
|
// make sure to pass in asBlock: true so that the comment node call
|
|
// closes the current block.
|
|
createCallExpression(context.helper(CREATE_COMMENT), [
|
|
( true) ? '"v-if"' : 0,
|
|
'true'
|
|
]));
|
|
}
|
|
else {
|
|
return createChildrenCodegenNode(branch, keyIndex, context);
|
|
}
|
|
}
|
|
function createChildrenCodegenNode(branch, keyIndex, context) {
|
|
const { helper } = context;
|
|
const keyProperty = createObjectProperty(`key`, createSimpleExpression(`${keyIndex}`, false, locStub, 2 /* CAN_HOIST */));
|
|
const { children } = branch;
|
|
const firstChild = children[0];
|
|
const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1 /* ELEMENT */;
|
|
if (needFragmentWrapper) {
|
|
if (children.length === 1 && firstChild.type === 11 /* FOR */) {
|
|
// optimize away nested fragments when child is a ForNode
|
|
const vnodeCall = firstChild.codegenNode;
|
|
injectProp(vnodeCall, keyProperty, context);
|
|
return vnodeCall;
|
|
}
|
|
else {
|
|
return createVNodeCall(context, helper(FRAGMENT), createObjectExpression([keyProperty]), children, 64 /* STABLE_FRAGMENT */ +
|
|
(( true)
|
|
? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64]} */`
|
|
: 0), undefined, undefined, true, false, branch.loc);
|
|
}
|
|
}
|
|
else {
|
|
const vnodeCall = firstChild
|
|
.codegenNode;
|
|
// Change createVNode to createBlock.
|
|
if (vnodeCall.type === 13 /* VNODE_CALL */) {
|
|
vnodeCall.isBlock = true;
|
|
helper(OPEN_BLOCK);
|
|
helper(CREATE_BLOCK);
|
|
}
|
|
// inject branch key
|
|
injectProp(vnodeCall, keyProperty, context);
|
|
return vnodeCall;
|
|
}
|
|
}
|
|
function isSameKey(a, b) {
|
|
if (!a || a.type !== b.type) {
|
|
return false;
|
|
}
|
|
if (a.type === 6 /* ATTRIBUTE */) {
|
|
if (a.value.content !== b.value.content) {
|
|
return false;
|
|
}
|
|
}
|
|
else {
|
|
// directive
|
|
const exp = a.exp;
|
|
const branchExp = b.exp;
|
|
if (exp.type !== branchExp.type) {
|
|
return false;
|
|
}
|
|
if (exp.type !== 4 /* SIMPLE_EXPRESSION */ ||
|
|
(exp.isStatic !== branchExp.isStatic ||
|
|
exp.content !== branchExp.content)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function getParentCondition(node) {
|
|
while (true) {
|
|
if (node.type === 19 /* JS_CONDITIONAL_EXPRESSION */) {
|
|
if (node.alternate.type === 19 /* JS_CONDITIONAL_EXPRESSION */) {
|
|
node = node.alternate;
|
|
}
|
|
else {
|
|
return node;
|
|
}
|
|
}
|
|
else if (node.type === 20 /* JS_CACHE_EXPRESSION */) {
|
|
node = node.value;
|
|
}
|
|
}
|
|
}
|
|
|
|
const transformFor = createStructuralDirectiveTransform('for', (node, dir, context) => {
|
|
const { helper } = context;
|
|
return processFor(node, dir, context, forNode => {
|
|
// create the loop render function expression now, and add the
|
|
// iterator on exit after all children have been traversed
|
|
const renderExp = createCallExpression(helper(RENDER_LIST), [
|
|
forNode.source
|
|
]);
|
|
const keyProp = findProp(node, `key`);
|
|
const keyProperty = keyProp
|
|
? createObjectProperty(`key`, keyProp.type === 6 /* ATTRIBUTE */
|
|
? createSimpleExpression(keyProp.value.content, true)
|
|
: keyProp.exp)
|
|
: null;
|
|
const isStableFragment = forNode.source.type === 4 /* SIMPLE_EXPRESSION */ &&
|
|
forNode.source.constType > 0 /* NOT_CONSTANT */;
|
|
const fragmentFlag = isStableFragment
|
|
? 64 /* STABLE_FRAGMENT */
|
|
: keyProp
|
|
? 128 /* KEYED_FRAGMENT */
|
|
: 256 /* UNKEYED_FRAGMENT */;
|
|
forNode.codegenNode = createVNodeCall(context, helper(FRAGMENT), undefined, renderExp, fragmentFlag +
|
|
(( true) ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[fragmentFlag]} */` : 0), undefined, undefined, true /* isBlock */, !isStableFragment /* disableTracking */, node.loc);
|
|
return () => {
|
|
// finish the codegen now that all children have been traversed
|
|
let childBlock;
|
|
const isTemplate = isTemplateNode(node);
|
|
const { children } = forNode;
|
|
// check <template v-for> key placement
|
|
if (( true) && isTemplate) {
|
|
node.children.some(c => {
|
|
if (c.type === 1 /* ELEMENT */) {
|
|
const key = findProp(c, 'key');
|
|
if (key) {
|
|
context.onError(createCompilerError(32 /* X_V_FOR_TEMPLATE_KEY_PLACEMENT */, key.loc));
|
|
return true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
const needFragmentWrapper = children.length !== 1 || children[0].type !== 1 /* ELEMENT */;
|
|
const slotOutlet = isSlotOutlet(node)
|
|
? node
|
|
: isTemplate &&
|
|
node.children.length === 1 &&
|
|
isSlotOutlet(node.children[0])
|
|
? node.children[0] // api-extractor somehow fails to infer this
|
|
: null;
|
|
if (slotOutlet) {
|
|
// <slot v-for="..."> or <template v-for="..."><slot/></template>
|
|
childBlock = slotOutlet.codegenNode;
|
|
if (isTemplate && keyProperty) {
|
|
// <template v-for="..." :key="..."><slot/></template>
|
|
// we need to inject the key to the renderSlot() call.
|
|
// the props for renderSlot is passed as the 3rd argument.
|
|
injectProp(childBlock, keyProperty, context);
|
|
}
|
|
}
|
|
else if (needFragmentWrapper) {
|
|
// <template v-for="..."> with text or multi-elements
|
|
// should generate a fragment block for each loop
|
|
childBlock = createVNodeCall(context, helper(FRAGMENT), keyProperty ? createObjectExpression([keyProperty]) : undefined, node.children, 64 /* STABLE_FRAGMENT */ +
|
|
(( true)
|
|
? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64]} */`
|
|
: 0), undefined, undefined, true);
|
|
}
|
|
else {
|
|
// Normal element v-for. Directly use the child's codegenNode
|
|
// but mark it as a block.
|
|
childBlock = children[0]
|
|
.codegenNode;
|
|
if (isTemplate && keyProperty) {
|
|
injectProp(childBlock, keyProperty, context);
|
|
}
|
|
childBlock.isBlock = !isStableFragment;
|
|
if (childBlock.isBlock) {
|
|
helper(OPEN_BLOCK);
|
|
helper(CREATE_BLOCK);
|
|
}
|
|
else {
|
|
helper(CREATE_VNODE);
|
|
}
|
|
}
|
|
renderExp.arguments.push(createFunctionExpression(createForLoopParams(forNode.parseResult), childBlock, true /* force newline */));
|
|
};
|
|
});
|
|
});
|
|
// target-agnostic transform used for both Client and SSR
|
|
function processFor(node, dir, context, processCodegen) {
|
|
if (!dir.exp) {
|
|
context.onError(createCompilerError(30 /* X_V_FOR_NO_EXPRESSION */, dir.loc));
|
|
return;
|
|
}
|
|
const parseResult = parseForExpression(
|
|
// can only be simple expression because vFor transform is applied
|
|
// before expression transform.
|
|
dir.exp, context);
|
|
if (!parseResult) {
|
|
context.onError(createCompilerError(31 /* X_V_FOR_MALFORMED_EXPRESSION */, dir.loc));
|
|
return;
|
|
}
|
|
const { addIdentifiers, removeIdentifiers, scopes } = context;
|
|
const { source, value, key, index } = parseResult;
|
|
const forNode = {
|
|
type: 11 /* FOR */,
|
|
loc: dir.loc,
|
|
source,
|
|
valueAlias: value,
|
|
keyAlias: key,
|
|
objectIndexAlias: index,
|
|
parseResult,
|
|
children: isTemplateNode(node) ? node.children : [node]
|
|
};
|
|
context.replaceNode(forNode);
|
|
// bookkeeping
|
|
scopes.vFor++;
|
|
const onExit = processCodegen && processCodegen(forNode);
|
|
return () => {
|
|
scopes.vFor--;
|
|
if (onExit)
|
|
onExit();
|
|
};
|
|
}
|
|
const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
|
|
// This regex doesn't cover the case if key or index aliases have destructuring,
|
|
// but those do not make sense in the first place, so this works in practice.
|
|
const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
|
|
const stripParensRE = /^\(|\)$/g;
|
|
function parseForExpression(input, context) {
|
|
const loc = input.loc;
|
|
const exp = input.content;
|
|
const inMatch = exp.match(forAliasRE);
|
|
if (!inMatch)
|
|
return;
|
|
const [, LHS, RHS] = inMatch;
|
|
const result = {
|
|
source: createAliasExpression(loc, RHS.trim(), exp.indexOf(RHS, LHS.length)),
|
|
value: undefined,
|
|
key: undefined,
|
|
index: undefined
|
|
};
|
|
if (true) {
|
|
validateBrowserExpression(result.source, context);
|
|
}
|
|
let valueContent = LHS.trim()
|
|
.replace(stripParensRE, '')
|
|
.trim();
|
|
const trimmedOffset = LHS.indexOf(valueContent);
|
|
const iteratorMatch = valueContent.match(forIteratorRE);
|
|
if (iteratorMatch) {
|
|
valueContent = valueContent.replace(forIteratorRE, '').trim();
|
|
const keyContent = iteratorMatch[1].trim();
|
|
let keyOffset;
|
|
if (keyContent) {
|
|
keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
|
|
result.key = createAliasExpression(loc, keyContent, keyOffset);
|
|
if (true) {
|
|
validateBrowserExpression(result.key, context, true);
|
|
}
|
|
}
|
|
if (iteratorMatch[2]) {
|
|
const indexContent = iteratorMatch[2].trim();
|
|
if (indexContent) {
|
|
result.index = createAliasExpression(loc, indexContent, exp.indexOf(indexContent, result.key
|
|
? keyOffset + keyContent.length
|
|
: trimmedOffset + valueContent.length));
|
|
if (true) {
|
|
validateBrowserExpression(result.index, context, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (valueContent) {
|
|
result.value = createAliasExpression(loc, valueContent, trimmedOffset);
|
|
if (true) {
|
|
validateBrowserExpression(result.value, context, true);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function createAliasExpression(range, content, offset) {
|
|
return createSimpleExpression(content, false, getInnerRange(range, offset, content.length));
|
|
}
|
|
function createForLoopParams({ value, key, index }) {
|
|
const params = [];
|
|
if (value) {
|
|
params.push(value);
|
|
}
|
|
if (key) {
|
|
if (!value) {
|
|
params.push(createSimpleExpression(`_`, false));
|
|
}
|
|
params.push(key);
|
|
}
|
|
if (index) {
|
|
if (!key) {
|
|
if (!value) {
|
|
params.push(createSimpleExpression(`_`, false));
|
|
}
|
|
params.push(createSimpleExpression(`__`, false));
|
|
}
|
|
params.push(index);
|
|
}
|
|
return params;
|
|
}
|
|
|
|
const defaultFallback = createSimpleExpression(`undefined`, false);
|
|
// A NodeTransform that:
|
|
// 1. Tracks scope identifiers for scoped slots so that they don't get prefixed
|
|
// by transformExpression. This is only applied in non-browser builds with
|
|
// { prefixIdentifiers: true }.
|
|
// 2. Track v-slot depths so that we know a slot is inside another slot.
|
|
// Note the exit callback is executed before buildSlots() on the same node,
|
|
// so only nested slots see positive numbers.
|
|
const trackSlotScopes = (node, context) => {
|
|
if (node.type === 1 /* ELEMENT */ &&
|
|
(node.tagType === 1 /* COMPONENT */ ||
|
|
node.tagType === 3 /* TEMPLATE */)) {
|
|
// We are only checking non-empty v-slot here
|
|
// since we only care about slots that introduce scope variables.
|
|
const vSlot = findDir(node, 'slot');
|
|
if (vSlot) {
|
|
vSlot.exp;
|
|
context.scopes.vSlot++;
|
|
return () => {
|
|
context.scopes.vSlot--;
|
|
};
|
|
}
|
|
}
|
|
};
|
|
// A NodeTransform that tracks scope identifiers for scoped slots with v-for.
|
|
// This transform is only applied in non-browser builds with { prefixIdentifiers: true }
|
|
const trackVForSlotScopes = (node, context) => {
|
|
let vFor;
|
|
if (isTemplateNode(node) &&
|
|
node.props.some(isVSlot) &&
|
|
(vFor = findDir(node, 'for'))) {
|
|
const result = (vFor.parseResult = parseForExpression(vFor.exp, context));
|
|
if (result) {
|
|
const { value, key, index } = result;
|
|
const { addIdentifiers, removeIdentifiers } = context;
|
|
value && addIdentifiers(value);
|
|
key && addIdentifiers(key);
|
|
index && addIdentifiers(index);
|
|
return () => {
|
|
value && removeIdentifiers(value);
|
|
key && removeIdentifiers(key);
|
|
index && removeIdentifiers(index);
|
|
};
|
|
}
|
|
}
|
|
};
|
|
const buildClientSlotFn = (props, children, loc) => createFunctionExpression(props, children, false /* newline */, true /* isSlot */, children.length ? children[0].loc : loc);
|
|
// Instead of being a DirectiveTransform, v-slot processing is called during
|
|
// transformElement to build the slots object for a component.
|
|
function buildSlots(node, context, buildSlotFn = buildClientSlotFn) {
|
|
context.helper(WITH_CTX);
|
|
const { children, loc } = node;
|
|
const slotsProperties = [];
|
|
const dynamicSlots = [];
|
|
const buildDefaultSlotProperty = (props, children) => createObjectProperty(`default`, buildSlotFn(props, children, loc));
|
|
// If the slot is inside a v-for or another v-slot, force it to be dynamic
|
|
// since it likely uses a scope variable.
|
|
let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0;
|
|
// 1. Check for slot with slotProps on component itself.
|
|
// <Comp v-slot="{ prop }"/>
|
|
const onComponentSlot = findDir(node, 'slot', true);
|
|
if (onComponentSlot) {
|
|
const { arg, exp } = onComponentSlot;
|
|
if (arg && !isStaticExp(arg)) {
|
|
hasDynamicSlots = true;
|
|
}
|
|
slotsProperties.push(createObjectProperty(arg || createSimpleExpression('default', true), buildSlotFn(exp, children, loc)));
|
|
}
|
|
// 2. Iterate through children and check for template slots
|
|
// <template v-slot:foo="{ prop }">
|
|
let hasTemplateSlots = false;
|
|
let hasNamedDefaultSlot = false;
|
|
const implicitDefaultChildren = [];
|
|
const seenSlotNames = new Set();
|
|
for (let i = 0; i < children.length; i++) {
|
|
const slotElement = children[i];
|
|
let slotDir;
|
|
if (!isTemplateNode(slotElement) ||
|
|
!(slotDir = findDir(slotElement, 'slot', true))) {
|
|
// not a <template v-slot>, skip.
|
|
if (slotElement.type !== 3 /* COMMENT */) {
|
|
implicitDefaultChildren.push(slotElement);
|
|
}
|
|
continue;
|
|
}
|
|
if (onComponentSlot) {
|
|
// already has on-component slot - this is incorrect usage.
|
|
context.onError(createCompilerError(36 /* X_V_SLOT_MIXED_SLOT_USAGE */, slotDir.loc));
|
|
break;
|
|
}
|
|
hasTemplateSlots = true;
|
|
const { children: slotChildren, loc: slotLoc } = slotElement;
|
|
const { arg: slotName = createSimpleExpression(`default`, true), exp: slotProps, loc: dirLoc } = slotDir;
|
|
// check if name is dynamic.
|
|
let staticSlotName;
|
|
if (isStaticExp(slotName)) {
|
|
staticSlotName = slotName ? slotName.content : `default`;
|
|
}
|
|
else {
|
|
hasDynamicSlots = true;
|
|
}
|
|
const slotFunction = buildSlotFn(slotProps, slotChildren, slotLoc);
|
|
// check if this slot is conditional (v-if/v-for)
|
|
let vIf;
|
|
let vElse;
|
|
let vFor;
|
|
if ((vIf = findDir(slotElement, 'if'))) {
|
|
hasDynamicSlots = true;
|
|
dynamicSlots.push(createConditionalExpression(vIf.exp, buildDynamicSlot(slotName, slotFunction), defaultFallback));
|
|
}
|
|
else if ((vElse = findDir(slotElement, /^else(-if)?$/, true /* allowEmpty */))) {
|
|
// find adjacent v-if
|
|
let j = i;
|
|
let prev;
|
|
while (j--) {
|
|
prev = children[j];
|
|
if (prev.type !== 3 /* COMMENT */) {
|
|
break;
|
|
}
|
|
}
|
|
if (prev && isTemplateNode(prev) && findDir(prev, 'if')) {
|
|
// remove node
|
|
children.splice(i, 1);
|
|
i--;
|
|
// attach this slot to previous conditional
|
|
let conditional = dynamicSlots[dynamicSlots.length - 1];
|
|
while (conditional.alternate.type === 19 /* JS_CONDITIONAL_EXPRESSION */) {
|
|
conditional = conditional.alternate;
|
|
}
|
|
conditional.alternate = vElse.exp
|
|
? createConditionalExpression(vElse.exp, buildDynamicSlot(slotName, slotFunction), defaultFallback)
|
|
: buildDynamicSlot(slotName, slotFunction);
|
|
}
|
|
else {
|
|
context.onError(createCompilerError(29 /* X_V_ELSE_NO_ADJACENT_IF */, vElse.loc));
|
|
}
|
|
}
|
|
else if ((vFor = findDir(slotElement, 'for'))) {
|
|
hasDynamicSlots = true;
|
|
const parseResult = vFor.parseResult ||
|
|
parseForExpression(vFor.exp, context);
|
|
if (parseResult) {
|
|
// Render the dynamic slots as an array and add it to the createSlot()
|
|
// args. The runtime knows how to handle it appropriately.
|
|
dynamicSlots.push(createCallExpression(context.helper(RENDER_LIST), [
|
|
parseResult.source,
|
|
createFunctionExpression(createForLoopParams(parseResult), buildDynamicSlot(slotName, slotFunction), true /* force newline */)
|
|
]));
|
|
}
|
|
else {
|
|
context.onError(createCompilerError(31 /* X_V_FOR_MALFORMED_EXPRESSION */, vFor.loc));
|
|
}
|
|
}
|
|
else {
|
|
// check duplicate static names
|
|
if (staticSlotName) {
|
|
if (seenSlotNames.has(staticSlotName)) {
|
|
context.onError(createCompilerError(37 /* X_V_SLOT_DUPLICATE_SLOT_NAMES */, dirLoc));
|
|
continue;
|
|
}
|
|
seenSlotNames.add(staticSlotName);
|
|
if (staticSlotName === 'default') {
|
|
hasNamedDefaultSlot = true;
|
|
}
|
|
}
|
|
slotsProperties.push(createObjectProperty(slotName, slotFunction));
|
|
}
|
|
}
|
|
if (!onComponentSlot) {
|
|
if (!hasTemplateSlots) {
|
|
// implicit default slot (on component)
|
|
slotsProperties.push(buildDefaultSlotProperty(undefined, children));
|
|
}
|
|
else if (implicitDefaultChildren.length) {
|
|
// implicit default slot (mixed with named slots)
|
|
if (hasNamedDefaultSlot) {
|
|
context.onError(createCompilerError(38 /* X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN */, implicitDefaultChildren[0].loc));
|
|
}
|
|
else {
|
|
slotsProperties.push(buildDefaultSlotProperty(undefined, implicitDefaultChildren));
|
|
}
|
|
}
|
|
}
|
|
const slotFlag = hasDynamicSlots
|
|
? 2 /* DYNAMIC */
|
|
: hasForwardedSlots(node.children)
|
|
? 3 /* FORWARDED */
|
|
: 1 /* STABLE */;
|
|
let slots = createObjectExpression(slotsProperties.concat(createObjectProperty(`_`,
|
|
// 2 = compiled but dynamic = can skip normalization, but must run diff
|
|
// 1 = compiled and static = can skip normalization AND diff as optimized
|
|
createSimpleExpression(slotFlag + (( true) ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.slotFlagsText[slotFlag]} */` : 0), false))), loc);
|
|
if (dynamicSlots.length) {
|
|
slots = createCallExpression(context.helper(CREATE_SLOTS), [
|
|
slots,
|
|
createArrayExpression(dynamicSlots)
|
|
]);
|
|
}
|
|
return {
|
|
slots,
|
|
hasDynamicSlots
|
|
};
|
|
}
|
|
function buildDynamicSlot(name, fn) {
|
|
return createObjectExpression([
|
|
createObjectProperty(`name`, name),
|
|
createObjectProperty(`fn`, fn)
|
|
]);
|
|
}
|
|
function hasForwardedSlots(children) {
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
if (child.type === 1 /* ELEMENT */) {
|
|
if (child.tagType === 2 /* SLOT */ ||
|
|
(child.tagType === 0 /* ELEMENT */ &&
|
|
hasForwardedSlots(child.children))) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// some directive transforms (e.g. v-model) may return a symbol for runtime
|
|
// import, which should be used instead of a resolveDirective call.
|
|
const directiveImportMap = new WeakMap();
|
|
// generate a JavaScript AST for this element's codegen
|
|
const transformElement = (node, context) => {
|
|
if (!(node.type === 1 /* ELEMENT */ &&
|
|
(node.tagType === 0 /* ELEMENT */ ||
|
|
node.tagType === 1 /* COMPONENT */))) {
|
|
return;
|
|
}
|
|
// perform the work on exit, after all child expressions have been
|
|
// processed and merged.
|
|
return function postTransformElement() {
|
|
const { tag, props } = node;
|
|
const isComponent = node.tagType === 1 /* COMPONENT */;
|
|
// The goal of the transform is to create a codegenNode implementing the
|
|
// VNodeCall interface.
|
|
const vnodeTag = isComponent
|
|
? resolveComponentType(node, context)
|
|
: `"${tag}"`;
|
|
const isDynamicComponent = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT;
|
|
let vnodeProps;
|
|
let vnodeChildren;
|
|
let vnodePatchFlag;
|
|
let patchFlag = 0;
|
|
let vnodeDynamicProps;
|
|
let dynamicPropNames;
|
|
let vnodeDirectives;
|
|
let shouldUseBlock =
|
|
// dynamic component may resolve to plain elements
|
|
isDynamicComponent ||
|
|
vnodeTag === TELEPORT ||
|
|
vnodeTag === SUSPENSE ||
|
|
(!isComponent &&
|
|
// <svg> and <foreignObject> must be forced into blocks so that block
|
|
// updates inside get proper isSVG flag at runtime. (#639, #643)
|
|
// This is technically web-specific, but splitting the logic out of core
|
|
// leads to too much unnecessary complexity.
|
|
(tag === 'svg' ||
|
|
tag === 'foreignObject' ||
|
|
// #938: elements with dynamic keys should be forced into blocks
|
|
findProp(node, 'key', true)));
|
|
// props
|
|
if (props.length > 0) {
|
|
const propsBuildResult = buildProps(node, context);
|
|
vnodeProps = propsBuildResult.props;
|
|
patchFlag = propsBuildResult.patchFlag;
|
|
dynamicPropNames = propsBuildResult.dynamicPropNames;
|
|
const directives = propsBuildResult.directives;
|
|
vnodeDirectives =
|
|
directives && directives.length
|
|
? createArrayExpression(directives.map(dir => buildDirectiveArgs(dir, context)))
|
|
: undefined;
|
|
}
|
|
// children
|
|
if (node.children.length > 0) {
|
|
if (vnodeTag === KEEP_ALIVE) {
|
|
// Although a built-in component, we compile KeepAlive with raw children
|
|
// instead of slot functions so that it can be used inside Transition
|
|
// or other Transition-wrapping HOCs.
|
|
// To ensure correct updates with block optimizations, we need to:
|
|
// 1. Force keep-alive into a block. This avoids its children being
|
|
// collected by a parent block.
|
|
shouldUseBlock = true;
|
|
// 2. Force keep-alive to always be updated, since it uses raw children.
|
|
patchFlag |= 1024 /* DYNAMIC_SLOTS */;
|
|
if (( true) && node.children.length > 1) {
|
|
context.onError(createCompilerError(44 /* X_KEEP_ALIVE_INVALID_CHILDREN */, {
|
|
start: node.children[0].loc.start,
|
|
end: node.children[node.children.length - 1].loc.end,
|
|
source: ''
|
|
}));
|
|
}
|
|
}
|
|
const shouldBuildAsSlots = isComponent &&
|
|
// Teleport is not a real component and has dedicated runtime handling
|
|
vnodeTag !== TELEPORT &&
|
|
// explained above.
|
|
vnodeTag !== KEEP_ALIVE;
|
|
if (shouldBuildAsSlots) {
|
|
const { slots, hasDynamicSlots } = buildSlots(node, context);
|
|
vnodeChildren = slots;
|
|
if (hasDynamicSlots) {
|
|
patchFlag |= 1024 /* DYNAMIC_SLOTS */;
|
|
}
|
|
}
|
|
else if (node.children.length === 1 && vnodeTag !== TELEPORT) {
|
|
const child = node.children[0];
|
|
const type = child.type;
|
|
// check for dynamic text children
|
|
const hasDynamicTextChild = type === 5 /* INTERPOLATION */ ||
|
|
type === 8 /* COMPOUND_EXPRESSION */;
|
|
if (hasDynamicTextChild &&
|
|
getConstantType(child, context) === 0 /* NOT_CONSTANT */) {
|
|
patchFlag |= 1 /* TEXT */;
|
|
}
|
|
// pass directly if the only child is a text node
|
|
// (plain / interpolation / expression)
|
|
if (hasDynamicTextChild || type === 2 /* TEXT */) {
|
|
vnodeChildren = child;
|
|
}
|
|
else {
|
|
vnodeChildren = node.children;
|
|
}
|
|
}
|
|
else {
|
|
vnodeChildren = node.children;
|
|
}
|
|
}
|
|
// patchFlag & dynamicPropNames
|
|
if (patchFlag !== 0) {
|
|
if ((true)) {
|
|
if (patchFlag < 0) {
|
|
// special flags (negative and mutually exclusive)
|
|
vnodePatchFlag = patchFlag + ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[patchFlag]} */`;
|
|
}
|
|
else {
|
|
// bitwise flags
|
|
const flagNames = Object.keys(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames)
|
|
.map(Number)
|
|
.filter(n => n > 0 && patchFlag & n)
|
|
.map(n => _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[n])
|
|
.join(`, `);
|
|
vnodePatchFlag = patchFlag + ` /* ${flagNames} */`;
|
|
}
|
|
}
|
|
else {}
|
|
if (dynamicPropNames && dynamicPropNames.length) {
|
|
vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames);
|
|
}
|
|
}
|
|
node.codegenNode = createVNodeCall(context, vnodeTag, vnodeProps, vnodeChildren, vnodePatchFlag, vnodeDynamicProps, vnodeDirectives, !!shouldUseBlock, false /* disableTracking */, node.loc);
|
|
};
|
|
};
|
|
function resolveComponentType(node, context, ssr = false) {
|
|
const { tag } = node;
|
|
// 1. dynamic component
|
|
const isProp = node.tag === 'component' ? findProp(node, 'is') : findDir(node, 'is');
|
|
if (isProp) {
|
|
const exp = isProp.type === 6 /* ATTRIBUTE */
|
|
? isProp.value && createSimpleExpression(isProp.value.content, true)
|
|
: isProp.exp;
|
|
if (exp) {
|
|
return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [
|
|
exp
|
|
]);
|
|
}
|
|
}
|
|
// 2. built-in components (Teleport, Transition, KeepAlive, Suspense...)
|
|
const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag);
|
|
if (builtIn) {
|
|
// built-ins are simply fallthroughs / have special handling during ssr
|
|
// so we don't need to import their runtime equivalents
|
|
if (!ssr)
|
|
context.helper(builtIn);
|
|
return builtIn;
|
|
}
|
|
// 5. user component (resolve)
|
|
context.helper(RESOLVE_COMPONENT);
|
|
context.components.add(tag);
|
|
return toValidAssetId(tag, `component`);
|
|
}
|
|
function buildProps(node, context, props = node.props, ssr = false) {
|
|
const { tag, loc: elementLoc } = node;
|
|
const isComponent = node.tagType === 1 /* COMPONENT */;
|
|
let properties = [];
|
|
const mergeArgs = [];
|
|
const runtimeDirectives = [];
|
|
// patchFlag analysis
|
|
let patchFlag = 0;
|
|
let hasRef = false;
|
|
let hasClassBinding = false;
|
|
let hasStyleBinding = false;
|
|
let hasHydrationEventBinding = false;
|
|
let hasDynamicKeys = false;
|
|
let hasVnodeHook = false;
|
|
const dynamicPropNames = [];
|
|
const analyzePatchFlag = ({ key, value }) => {
|
|
if (isStaticExp(key)) {
|
|
const name = key.content;
|
|
const isEventHandler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name);
|
|
if (!isComponent &&
|
|
isEventHandler &&
|
|
// omit the flag for click handlers because hydration gives click
|
|
// dedicated fast path.
|
|
name.toLowerCase() !== 'onclick' &&
|
|
// omit v-model handlers
|
|
name !== 'onUpdate:modelValue' &&
|
|
// omit onVnodeXXX hooks
|
|
!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) {
|
|
hasHydrationEventBinding = true;
|
|
}
|
|
if (isEventHandler && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) {
|
|
hasVnodeHook = true;
|
|
}
|
|
if (value.type === 20 /* JS_CACHE_EXPRESSION */ ||
|
|
((value.type === 4 /* SIMPLE_EXPRESSION */ ||
|
|
value.type === 8 /* COMPOUND_EXPRESSION */) &&
|
|
getConstantType(value, context) > 0)) {
|
|
// skip if the prop is a cached handler or has constant value
|
|
return;
|
|
}
|
|
if (name === 'ref') {
|
|
hasRef = true;
|
|
}
|
|
else if (name === 'class' && !isComponent) {
|
|
hasClassBinding = true;
|
|
}
|
|
else if (name === 'style' && !isComponent) {
|
|
hasStyleBinding = true;
|
|
}
|
|
else if (name !== 'key' && !dynamicPropNames.includes(name)) {
|
|
dynamicPropNames.push(name);
|
|
}
|
|
}
|
|
else {
|
|
hasDynamicKeys = true;
|
|
}
|
|
};
|
|
for (let i = 0; i < props.length; i++) {
|
|
// static attribute
|
|
const prop = props[i];
|
|
if (prop.type === 6 /* ATTRIBUTE */) {
|
|
const { loc, name, value } = prop;
|
|
let isStatic = true;
|
|
if (name === 'ref') {
|
|
hasRef = true;
|
|
}
|
|
// skip :is on <component>
|
|
if (name === 'is' && tag === 'component') {
|
|
continue;
|
|
}
|
|
properties.push(createObjectProperty(createSimpleExpression(name, true, getInnerRange(loc, 0, name.length)), createSimpleExpression(value ? value.content : '', isStatic, value ? value.loc : loc)));
|
|
}
|
|
else {
|
|
// directives
|
|
const { name, arg, exp, loc } = prop;
|
|
const isBind = name === 'bind';
|
|
const isOn = name === 'on';
|
|
// skip v-slot - it is handled by its dedicated transform.
|
|
if (name === 'slot') {
|
|
if (!isComponent) {
|
|
context.onError(createCompilerError(39 /* X_V_SLOT_MISPLACED */, loc));
|
|
}
|
|
continue;
|
|
}
|
|
// skip v-once - it is handled by its dedicated transform.
|
|
if (name === 'once') {
|
|
continue;
|
|
}
|
|
// skip v-is and :is on <component>
|
|
if (name === 'is' ||
|
|
(isBind && tag === 'component' && isBindKey(arg, 'is'))) {
|
|
continue;
|
|
}
|
|
// skip v-on in SSR compilation
|
|
if (isOn && ssr) {
|
|
continue;
|
|
}
|
|
// special case for v-bind and v-on with no argument
|
|
if (!arg && (isBind || isOn)) {
|
|
hasDynamicKeys = true;
|
|
if (exp) {
|
|
if (properties.length) {
|
|
mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
|
|
properties = [];
|
|
}
|
|
if (isBind) {
|
|
mergeArgs.push(exp);
|
|
}
|
|
else {
|
|
// v-on="obj" -> toHandlers(obj)
|
|
mergeArgs.push({
|
|
type: 14 /* JS_CALL_EXPRESSION */,
|
|
loc,
|
|
callee: context.helper(TO_HANDLERS),
|
|
arguments: [exp]
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
context.onError(createCompilerError(isBind
|
|
? 33 /* X_V_BIND_NO_EXPRESSION */
|
|
: 34 /* X_V_ON_NO_EXPRESSION */, loc));
|
|
}
|
|
continue;
|
|
}
|
|
const directiveTransform = context.directiveTransforms[name];
|
|
if (directiveTransform) {
|
|
// has built-in directive transform.
|
|
const { props, needRuntime } = directiveTransform(prop, node, context);
|
|
!ssr && props.forEach(analyzePatchFlag);
|
|
properties.push(...props);
|
|
if (needRuntime) {
|
|
runtimeDirectives.push(prop);
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(needRuntime)) {
|
|
directiveImportMap.set(prop, needRuntime);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// no built-in transform, this is a user custom directive.
|
|
runtimeDirectives.push(prop);
|
|
}
|
|
}
|
|
}
|
|
let propsExpression = undefined;
|
|
// has v-bind="object" or v-on="object", wrap with mergeProps
|
|
if (mergeArgs.length) {
|
|
if (properties.length) {
|
|
mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
|
|
}
|
|
if (mergeArgs.length > 1) {
|
|
propsExpression = createCallExpression(context.helper(MERGE_PROPS), mergeArgs, elementLoc);
|
|
}
|
|
else {
|
|
// single v-bind with nothing else - no need for a mergeProps call
|
|
propsExpression = mergeArgs[0];
|
|
}
|
|
}
|
|
else if (properties.length) {
|
|
propsExpression = createObjectExpression(dedupeProperties(properties), elementLoc);
|
|
}
|
|
// patchFlag analysis
|
|
if (hasDynamicKeys) {
|
|
patchFlag |= 16 /* FULL_PROPS */;
|
|
}
|
|
else {
|
|
if (hasClassBinding) {
|
|
patchFlag |= 2 /* CLASS */;
|
|
}
|
|
if (hasStyleBinding) {
|
|
patchFlag |= 4 /* STYLE */;
|
|
}
|
|
if (dynamicPropNames.length) {
|
|
patchFlag |= 8 /* PROPS */;
|
|
}
|
|
if (hasHydrationEventBinding) {
|
|
patchFlag |= 32 /* HYDRATE_EVENTS */;
|
|
}
|
|
}
|
|
if ((patchFlag === 0 || patchFlag === 32 /* HYDRATE_EVENTS */) &&
|
|
(hasRef || hasVnodeHook || runtimeDirectives.length > 0)) {
|
|
patchFlag |= 512 /* NEED_PATCH */;
|
|
}
|
|
return {
|
|
props: propsExpression,
|
|
directives: runtimeDirectives,
|
|
patchFlag,
|
|
dynamicPropNames
|
|
};
|
|
}
|
|
// Dedupe props in an object literal.
|
|
// Literal duplicated attributes would have been warned during the parse phase,
|
|
// however, it's possible to encounter duplicated `onXXX` handlers with different
|
|
// modifiers. We also need to merge static and dynamic class / style attributes.
|
|
// - onXXX handlers / style: merge into array
|
|
// - class: merge into single expression with concatenation
|
|
function dedupeProperties(properties) {
|
|
const knownProps = new Map();
|
|
const deduped = [];
|
|
for (let i = 0; i < properties.length; i++) {
|
|
const prop = properties[i];
|
|
// dynamic keys are always allowed
|
|
if (prop.key.type === 8 /* COMPOUND_EXPRESSION */ || !prop.key.isStatic) {
|
|
deduped.push(prop);
|
|
continue;
|
|
}
|
|
const name = prop.key.content;
|
|
const existing = knownProps.get(name);
|
|
if (existing) {
|
|
if (name === 'style' || name === 'class' || name.startsWith('on')) {
|
|
mergeAsArray(existing, prop);
|
|
}
|
|
// unexpected duplicate, should have emitted error during parse
|
|
}
|
|
else {
|
|
knownProps.set(name, prop);
|
|
deduped.push(prop);
|
|
}
|
|
}
|
|
return deduped;
|
|
}
|
|
function mergeAsArray(existing, incoming) {
|
|
if (existing.value.type === 17 /* JS_ARRAY_EXPRESSION */) {
|
|
existing.value.elements.push(incoming.value);
|
|
}
|
|
else {
|
|
existing.value = createArrayExpression([existing.value, incoming.value], existing.loc);
|
|
}
|
|
}
|
|
function buildDirectiveArgs(dir, context) {
|
|
const dirArgs = [];
|
|
const runtime = directiveImportMap.get(dir);
|
|
if (runtime) {
|
|
// built-in directive with runtime
|
|
dirArgs.push(context.helperString(runtime));
|
|
}
|
|
else {
|
|
{
|
|
// inject statement for resolving directive
|
|
context.helper(RESOLVE_DIRECTIVE);
|
|
context.directives.add(dir.name);
|
|
dirArgs.push(toValidAssetId(dir.name, `directive`));
|
|
}
|
|
}
|
|
const { loc } = dir;
|
|
if (dir.exp)
|
|
dirArgs.push(dir.exp);
|
|
if (dir.arg) {
|
|
if (!dir.exp) {
|
|
dirArgs.push(`void 0`);
|
|
}
|
|
dirArgs.push(dir.arg);
|
|
}
|
|
if (Object.keys(dir.modifiers).length) {
|
|
if (!dir.arg) {
|
|
if (!dir.exp) {
|
|
dirArgs.push(`void 0`);
|
|
}
|
|
dirArgs.push(`void 0`);
|
|
}
|
|
const trueExpression = createSimpleExpression(`true`, false, loc);
|
|
dirArgs.push(createObjectExpression(dir.modifiers.map(modifier => createObjectProperty(modifier, trueExpression)), loc));
|
|
}
|
|
return createArrayExpression(dirArgs, dir.loc);
|
|
}
|
|
function stringifyDynamicPropNames(props) {
|
|
let propsNamesString = `[`;
|
|
for (let i = 0, l = props.length; i < l; i++) {
|
|
propsNamesString += JSON.stringify(props[i]);
|
|
if (i < l - 1)
|
|
propsNamesString += ', ';
|
|
}
|
|
return propsNamesString + `]`;
|
|
}
|
|
|
|
( true)
|
|
? Object.freeze({})
|
|
: 0;
|
|
( true) ? Object.freeze([]) : 0;
|
|
const cacheStringFunction = (fn) => {
|
|
const cache = Object.create(null);
|
|
return ((str) => {
|
|
const hit = cache[str];
|
|
return hit || (cache[str] = fn(str));
|
|
});
|
|
};
|
|
const camelizeRE = /-(\w)/g;
|
|
/**
|
|
* @private
|
|
*/
|
|
const camelize = cacheStringFunction((str) => {
|
|
return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
|
|
});
|
|
|
|
const transformSlotOutlet = (node, context) => {
|
|
if (isSlotOutlet(node)) {
|
|
const { children, loc } = node;
|
|
const { slotName, slotProps } = processSlotOutlet(node, context);
|
|
const slotArgs = [
|
|
context.prefixIdentifiers ? `_ctx.$slots` : `$slots`,
|
|
slotName
|
|
];
|
|
if (slotProps) {
|
|
slotArgs.push(slotProps);
|
|
}
|
|
if (children.length) {
|
|
if (!slotProps) {
|
|
slotArgs.push(`{}`);
|
|
}
|
|
slotArgs.push(createFunctionExpression([], children, false, false, loc));
|
|
}
|
|
node.codegenNode = createCallExpression(context.helper(RENDER_SLOT), slotArgs, loc);
|
|
}
|
|
};
|
|
function processSlotOutlet(node, context) {
|
|
let slotName = `"default"`;
|
|
let slotProps = undefined;
|
|
const nonNameProps = [];
|
|
for (let i = 0; i < node.props.length; i++) {
|
|
const p = node.props[i];
|
|
if (p.type === 6 /* ATTRIBUTE */) {
|
|
if (p.value) {
|
|
if (p.name === 'name') {
|
|
slotName = JSON.stringify(p.value.content);
|
|
}
|
|
else {
|
|
p.name = camelize(p.name);
|
|
nonNameProps.push(p);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (p.name === 'bind' && isBindKey(p.arg, 'name')) {
|
|
if (p.exp)
|
|
slotName = p.exp;
|
|
}
|
|
else {
|
|
if (p.name === 'bind' && p.arg && isStaticExp(p.arg)) {
|
|
p.arg.content = camelize(p.arg.content);
|
|
}
|
|
nonNameProps.push(p);
|
|
}
|
|
}
|
|
}
|
|
if (nonNameProps.length > 0) {
|
|
const { props, directives } = buildProps(node, context, nonNameProps);
|
|
slotProps = props;
|
|
if (directives.length) {
|
|
context.onError(createCompilerError(35 /* X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET */, directives[0].loc));
|
|
}
|
|
}
|
|
return {
|
|
slotName,
|
|
slotProps
|
|
};
|
|
}
|
|
|
|
const fnExpRE = /^\s*([\w$_]+|\([^)]*?\))\s*=>|^\s*function(?:\s+[\w$]+)?\s*\(/;
|
|
const transformOn = (dir, node, context, augmentor) => {
|
|
const { loc, modifiers, arg } = dir;
|
|
if (!dir.exp && !modifiers.length) {
|
|
context.onError(createCompilerError(34 /* X_V_ON_NO_EXPRESSION */, loc));
|
|
}
|
|
let eventName;
|
|
if (arg.type === 4 /* SIMPLE_EXPRESSION */) {
|
|
if (arg.isStatic) {
|
|
const rawName = arg.content;
|
|
// for all event listeners, auto convert it to camelCase. See issue #2249
|
|
eventName = createSimpleExpression((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(rawName)), true, arg.loc);
|
|
}
|
|
else {
|
|
// #2388
|
|
eventName = createCompoundExpression([
|
|
`${context.helperString(TO_HANDLER_KEY)}(`,
|
|
arg,
|
|
`)`
|
|
]);
|
|
}
|
|
}
|
|
else {
|
|
// already a compound expression.
|
|
eventName = arg;
|
|
eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`);
|
|
eventName.children.push(`)`);
|
|
}
|
|
// handler processing
|
|
let exp = dir.exp;
|
|
if (exp && !exp.content.trim()) {
|
|
exp = undefined;
|
|
}
|
|
let shouldCache = context.cacheHandlers && !exp;
|
|
if (exp) {
|
|
const isMemberExp = isMemberExpression(exp.content);
|
|
const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content));
|
|
const hasMultipleStatements = exp.content.includes(`;`);
|
|
if (true) {
|
|
validateBrowserExpression(exp, context, false, hasMultipleStatements);
|
|
}
|
|
if (isInlineStatement || (shouldCache && isMemberExp)) {
|
|
// wrap inline statement in a function expression
|
|
exp = createCompoundExpression([
|
|
`${isInlineStatement
|
|
? `$event`
|
|
: `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`,
|
|
exp,
|
|
hasMultipleStatements ? `}` : `)`
|
|
]);
|
|
}
|
|
}
|
|
let ret = {
|
|
props: [
|
|
createObjectProperty(eventName, exp || createSimpleExpression(`() => {}`, false, loc))
|
|
]
|
|
};
|
|
// apply extended compiler augmentor
|
|
if (augmentor) {
|
|
ret = augmentor(ret);
|
|
}
|
|
if (shouldCache) {
|
|
// cache handlers so that it's always the same handler being passed down.
|
|
// this avoids unnecessary re-renders when users use inline handlers on
|
|
// components.
|
|
ret.props[0].value = context.cache(ret.props[0].value);
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
// v-bind without arg is handled directly in ./transformElements.ts due to it affecting
|
|
// codegen for the entire props object. This transform here is only for v-bind
|
|
// *with* args.
|
|
const transformBind = (dir, node, context) => {
|
|
const { exp, modifiers, loc } = dir;
|
|
const arg = dir.arg;
|
|
if (arg.type !== 4 /* SIMPLE_EXPRESSION */) {
|
|
arg.children.unshift(`(`);
|
|
arg.children.push(`) || ""`);
|
|
}
|
|
else if (!arg.isStatic) {
|
|
arg.content = `${arg.content} || ""`;
|
|
}
|
|
// .prop is no longer necessary due to new patch behavior
|
|
// .sync is replaced by v-model:arg
|
|
if (modifiers.includes('camel')) {
|
|
if (arg.type === 4 /* SIMPLE_EXPRESSION */) {
|
|
if (arg.isStatic) {
|
|
arg.content = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content);
|
|
}
|
|
else {
|
|
arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`;
|
|
}
|
|
}
|
|
else {
|
|
arg.children.unshift(`${context.helperString(CAMELIZE)}(`);
|
|
arg.children.push(`)`);
|
|
}
|
|
}
|
|
if (!exp ||
|
|
(exp.type === 4 /* SIMPLE_EXPRESSION */ && !exp.content.trim())) {
|
|
context.onError(createCompilerError(33 /* X_V_BIND_NO_EXPRESSION */, loc));
|
|
return {
|
|
props: [createObjectProperty(arg, createSimpleExpression('', true, loc))]
|
|
};
|
|
}
|
|
return {
|
|
props: [createObjectProperty(arg, exp)]
|
|
};
|
|
};
|
|
|
|
// Merge adjacent text nodes and expressions into a single expression
|
|
// e.g. <div>abc {{ d }} {{ e }}</div> should have a single expression node as child.
|
|
const transformText = (node, context) => {
|
|
if (node.type === 0 /* ROOT */ ||
|
|
node.type === 1 /* ELEMENT */ ||
|
|
node.type === 11 /* FOR */ ||
|
|
node.type === 10 /* IF_BRANCH */) {
|
|
// perform the transform on node exit so that all expressions have already
|
|
// been processed.
|
|
return () => {
|
|
const children = node.children;
|
|
let currentContainer = undefined;
|
|
let hasText = false;
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
if (isText(child)) {
|
|
hasText = true;
|
|
for (let j = i + 1; j < children.length; j++) {
|
|
const next = children[j];
|
|
if (isText(next)) {
|
|
if (!currentContainer) {
|
|
currentContainer = children[i] = {
|
|
type: 8 /* COMPOUND_EXPRESSION */,
|
|
loc: child.loc,
|
|
children: [child]
|
|
};
|
|
}
|
|
// merge adjacent text node into current
|
|
currentContainer.children.push(` + `, next);
|
|
children.splice(j, 1);
|
|
j--;
|
|
}
|
|
else {
|
|
currentContainer = undefined;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!hasText ||
|
|
// if this is a plain element with a single text child, leave it
|
|
// as-is since the runtime has dedicated fast path for this by directly
|
|
// setting textContent of the element.
|
|
// for component root it's always normalized anyway.
|
|
(children.length === 1 &&
|
|
(node.type === 0 /* ROOT */ ||
|
|
(node.type === 1 /* ELEMENT */ &&
|
|
node.tagType === 0 /* ELEMENT */)))) {
|
|
return;
|
|
}
|
|
// pre-convert text nodes into createTextVNode(text) calls to avoid
|
|
// runtime normalization.
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
if (isText(child) || child.type === 8 /* COMPOUND_EXPRESSION */) {
|
|
const callArgs = [];
|
|
// createTextVNode defaults to single whitespace, so if it is a
|
|
// single space the code could be an empty call to save bytes.
|
|
if (child.type !== 2 /* TEXT */ || child.content !== ' ') {
|
|
callArgs.push(child);
|
|
}
|
|
// mark dynamic text with flag so it gets patched inside a block
|
|
if (!context.ssr &&
|
|
getConstantType(child, context) === 0 /* NOT_CONSTANT */) {
|
|
callArgs.push(1 /* TEXT */ +
|
|
(( true) ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[1]} */` : 0));
|
|
}
|
|
children[i] = {
|
|
type: 12 /* TEXT_CALL */,
|
|
content: child,
|
|
loc: child.loc,
|
|
codegenNode: createCallExpression(context.helper(CREATE_TEXT), callArgs)
|
|
};
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|
|
|
|
const seen = new WeakSet();
|
|
const transformOnce = (node, context) => {
|
|
if (node.type === 1 /* ELEMENT */ && findDir(node, 'once', true)) {
|
|
if (seen.has(node)) {
|
|
return;
|
|
}
|
|
seen.add(node);
|
|
context.helper(SET_BLOCK_TRACKING);
|
|
return () => {
|
|
const cur = context.currentNode;
|
|
if (cur.codegenNode) {
|
|
cur.codegenNode = context.cache(cur.codegenNode, true /* isVNode */);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
|
|
const transformModel = (dir, node, context) => {
|
|
const { exp, arg } = dir;
|
|
if (!exp) {
|
|
context.onError(createCompilerError(40 /* X_V_MODEL_NO_EXPRESSION */, dir.loc));
|
|
return createTransformProps();
|
|
}
|
|
const rawExp = exp.loc.source;
|
|
const expString = exp.type === 4 /* SIMPLE_EXPRESSION */ ? exp.content : rawExp;
|
|
// im SFC <script setup> inline mode, the exp may have been transformed into
|
|
// _unref(exp)
|
|
context.bindingMetadata[rawExp];
|
|
const maybeRef = !true /* SETUP_CONST */;
|
|
if (!isMemberExpression(expString) && !maybeRef) {
|
|
context.onError(createCompilerError(41 /* X_V_MODEL_MALFORMED_EXPRESSION */, exp.loc));
|
|
return createTransformProps();
|
|
}
|
|
const propName = arg ? arg : createSimpleExpression('modelValue', true);
|
|
const eventName = arg
|
|
? isStaticExp(arg)
|
|
? `onUpdate:${arg.content}`
|
|
: createCompoundExpression(['"onUpdate:" + ', arg])
|
|
: `onUpdate:modelValue`;
|
|
let assignmentExp;
|
|
const eventArg = context.isTS ? `($event: any)` : `$event`;
|
|
{
|
|
assignmentExp = createCompoundExpression([
|
|
`${eventArg} => (`,
|
|
exp,
|
|
` = $event)`
|
|
]);
|
|
}
|
|
const props = [
|
|
// modelValue: foo
|
|
createObjectProperty(propName, dir.exp),
|
|
// "onUpdate:modelValue": $event => (foo = $event)
|
|
createObjectProperty(eventName, assignmentExp)
|
|
];
|
|
// modelModifiers: { foo: true, "bar-baz": true }
|
|
if (dir.modifiers.length && node.tagType === 1 /* COMPONENT */) {
|
|
const modifiers = dir.modifiers
|
|
.map(m => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`)
|
|
.join(`, `);
|
|
const modifiersKey = arg
|
|
? isStaticExp(arg)
|
|
? `${arg.content}Modifiers`
|
|
: createCompoundExpression([arg, ' + "Modifiers"'])
|
|
: `modelModifiers`;
|
|
props.push(createObjectProperty(modifiersKey, createSimpleExpression(`{ ${modifiers} }`, false, dir.loc, 2 /* CAN_HOIST */)));
|
|
}
|
|
return createTransformProps(props);
|
|
};
|
|
function createTransformProps(props = []) {
|
|
return { props };
|
|
}
|
|
|
|
function getBaseTransformPreset(prefixIdentifiers) {
|
|
return [
|
|
[
|
|
transformOnce,
|
|
transformIf,
|
|
transformFor,
|
|
...(( true)
|
|
? [transformExpression]
|
|
: 0),
|
|
transformSlotOutlet,
|
|
transformElement,
|
|
trackSlotScopes,
|
|
transformText
|
|
],
|
|
{
|
|
on: transformOn,
|
|
bind: transformBind,
|
|
model: transformModel
|
|
}
|
|
];
|
|
}
|
|
// we name it `baseCompile` so that higher order compilers like
|
|
// @vue/compiler-dom can export `compile` while re-exporting everything else.
|
|
function baseCompile(template, options = {}) {
|
|
const onError = options.onError || defaultOnError;
|
|
const isModuleMode = options.mode === 'module';
|
|
/* istanbul ignore if */
|
|
{
|
|
if (options.prefixIdentifiers === true) {
|
|
onError(createCompilerError(45 /* X_PREFIX_ID_NOT_SUPPORTED */));
|
|
}
|
|
else if (isModuleMode) {
|
|
onError(createCompilerError(46 /* X_MODULE_MODE_NOT_SUPPORTED */));
|
|
}
|
|
}
|
|
const prefixIdentifiers = !true ;
|
|
if (options.cacheHandlers) {
|
|
onError(createCompilerError(47 /* X_CACHE_HANDLER_NOT_SUPPORTED */));
|
|
}
|
|
if (options.scopeId && !isModuleMode) {
|
|
onError(createCompilerError(48 /* X_SCOPE_ID_NOT_SUPPORTED */));
|
|
}
|
|
const ast = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(template) ? baseParse(template, options) : template;
|
|
const [nodeTransforms, directiveTransforms] = getBaseTransformPreset();
|
|
transform(ast, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, options, {
|
|
prefixIdentifiers,
|
|
nodeTransforms: [
|
|
...nodeTransforms,
|
|
...(options.nodeTransforms || []) // user transforms
|
|
],
|
|
directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, directiveTransforms, options.directiveTransforms || {} // user transforms
|
|
)
|
|
}));
|
|
return generate(ast, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, options, {
|
|
prefixIdentifiers
|
|
}));
|
|
}
|
|
|
|
const noopDirectiveTransform = () => ({ props: [] });
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js":
|
|
/*!*************************************************************************!*\
|
|
!*** ./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js ***!
|
|
\*************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "BASE_TRANSITION": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.BASE_TRANSITION),
|
|
/* harmony export */ "CAMELIZE": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAMELIZE),
|
|
/* harmony export */ "CAPITALIZE": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAPITALIZE),
|
|
/* harmony export */ "CREATE_BLOCK": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_BLOCK),
|
|
/* harmony export */ "CREATE_COMMENT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_COMMENT),
|
|
/* harmony export */ "CREATE_SLOTS": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_SLOTS),
|
|
/* harmony export */ "CREATE_STATIC": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_STATIC),
|
|
/* harmony export */ "CREATE_TEXT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_TEXT),
|
|
/* harmony export */ "CREATE_VNODE": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_VNODE),
|
|
/* harmony export */ "FRAGMENT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.FRAGMENT),
|
|
/* harmony export */ "IS_REF": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_REF),
|
|
/* harmony export */ "KEEP_ALIVE": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.KEEP_ALIVE),
|
|
/* harmony export */ "MERGE_PROPS": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.MERGE_PROPS),
|
|
/* harmony export */ "OPEN_BLOCK": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.OPEN_BLOCK),
|
|
/* harmony export */ "POP_SCOPE_ID": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.POP_SCOPE_ID),
|
|
/* harmony export */ "PUSH_SCOPE_ID": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.PUSH_SCOPE_ID),
|
|
/* harmony export */ "RENDER_LIST": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_LIST),
|
|
/* harmony export */ "RENDER_SLOT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_SLOT),
|
|
/* harmony export */ "RESOLVE_COMPONENT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_COMPONENT),
|
|
/* harmony export */ "RESOLVE_DIRECTIVE": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DIRECTIVE),
|
|
/* harmony export */ "RESOLVE_DYNAMIC_COMPONENT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DYNAMIC_COMPONENT),
|
|
/* harmony export */ "SET_BLOCK_TRACKING": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SET_BLOCK_TRACKING),
|
|
/* harmony export */ "SUSPENSE": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SUSPENSE),
|
|
/* harmony export */ "TELEPORT": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TELEPORT),
|
|
/* harmony export */ "TO_DISPLAY_STRING": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING),
|
|
/* harmony export */ "TO_HANDLERS": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLERS),
|
|
/* harmony export */ "TO_HANDLER_KEY": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLER_KEY),
|
|
/* harmony export */ "UNREF": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.UNREF),
|
|
/* harmony export */ "WITH_CTX": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_CTX),
|
|
/* harmony export */ "WITH_DIRECTIVES": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_DIRECTIVES),
|
|
/* harmony export */ "WITH_SCOPE_ID": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_SCOPE_ID),
|
|
/* harmony export */ "advancePositionWithClone": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithClone),
|
|
/* harmony export */ "advancePositionWithMutation": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithMutation),
|
|
/* harmony export */ "assert": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.assert),
|
|
/* harmony export */ "baseCompile": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile),
|
|
/* harmony export */ "baseParse": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse),
|
|
/* harmony export */ "buildProps": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildProps),
|
|
/* harmony export */ "buildSlots": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildSlots),
|
|
/* harmony export */ "createArrayExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createArrayExpression),
|
|
/* harmony export */ "createAssignmentExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createAssignmentExpression),
|
|
/* harmony export */ "createBlockStatement": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createBlockStatement),
|
|
/* harmony export */ "createCacheExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCacheExpression),
|
|
/* harmony export */ "createCallExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression),
|
|
/* harmony export */ "createCompilerError": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError),
|
|
/* harmony export */ "createCompoundExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression),
|
|
/* harmony export */ "createConditionalExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createConditionalExpression),
|
|
/* harmony export */ "createForLoopParams": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createForLoopParams),
|
|
/* harmony export */ "createFunctionExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createFunctionExpression),
|
|
/* harmony export */ "createIfStatement": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createIfStatement),
|
|
/* harmony export */ "createInterpolation": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createInterpolation),
|
|
/* harmony export */ "createObjectExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectExpression),
|
|
/* harmony export */ "createObjectProperty": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty),
|
|
/* harmony export */ "createReturnStatement": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createReturnStatement),
|
|
/* harmony export */ "createRoot": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createRoot),
|
|
/* harmony export */ "createSequenceExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSequenceExpression),
|
|
/* harmony export */ "createSimpleExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression),
|
|
/* harmony export */ "createStructuralDirectiveTransform": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createStructuralDirectiveTransform),
|
|
/* harmony export */ "createTemplateLiteral": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTemplateLiteral),
|
|
/* harmony export */ "createTransformContext": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTransformContext),
|
|
/* harmony export */ "createVNodeCall": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createVNodeCall),
|
|
/* harmony export */ "findDir": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findDir),
|
|
/* harmony export */ "findProp": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp),
|
|
/* harmony export */ "generate": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generate),
|
|
/* harmony export */ "generateCodeFrame": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame),
|
|
/* harmony export */ "getBaseTransformPreset": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getBaseTransformPreset),
|
|
/* harmony export */ "getInnerRange": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getInnerRange),
|
|
/* harmony export */ "hasDynamicKeyVBind": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind),
|
|
/* harmony export */ "hasScopeRef": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasScopeRef),
|
|
/* harmony export */ "helperNameMap": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.helperNameMap),
|
|
/* harmony export */ "injectProp": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.injectProp),
|
|
/* harmony export */ "isBindKey": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBindKey),
|
|
/* harmony export */ "isBuiltInType": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBuiltInType),
|
|
/* harmony export */ "isCoreComponent": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isCoreComponent),
|
|
/* harmony export */ "isMemberExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpression),
|
|
/* harmony export */ "isSimpleIdentifier": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSimpleIdentifier),
|
|
/* harmony export */ "isSlotOutlet": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSlotOutlet),
|
|
/* harmony export */ "isStaticExp": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp),
|
|
/* harmony export */ "isTemplateNode": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isTemplateNode),
|
|
/* harmony export */ "isText": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isText),
|
|
/* harmony export */ "isVSlot": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isVSlot),
|
|
/* harmony export */ "locStub": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.locStub),
|
|
/* harmony export */ "noopDirectiveTransform": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform),
|
|
/* harmony export */ "processExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processExpression),
|
|
/* harmony export */ "processFor": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processFor),
|
|
/* harmony export */ "processIf": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processIf),
|
|
/* harmony export */ "processSlotOutlet": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processSlotOutlet),
|
|
/* harmony export */ "registerRuntimeHelpers": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers),
|
|
/* harmony export */ "resolveComponentType": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponentType),
|
|
/* harmony export */ "toValidAssetId": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.toValidAssetId),
|
|
/* harmony export */ "trackSlotScopes": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackSlotScopes),
|
|
/* harmony export */ "trackVForSlotScopes": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackVForSlotScopes),
|
|
/* harmony export */ "transform": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transform),
|
|
/* harmony export */ "transformBind": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformBind),
|
|
/* harmony export */ "transformElement": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformElement),
|
|
/* harmony export */ "transformExpression": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformExpression),
|
|
/* harmony export */ "transformModel": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel),
|
|
/* harmony export */ "transformOn": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn),
|
|
/* harmony export */ "traverseNode": () => (/* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.traverseNode),
|
|
/* harmony export */ "DOMDirectiveTransforms": () => (/* binding */ DOMDirectiveTransforms),
|
|
/* harmony export */ "DOMNodeTransforms": () => (/* binding */ DOMNodeTransforms),
|
|
/* harmony export */ "TRANSITION": () => (/* binding */ TRANSITION),
|
|
/* harmony export */ "TRANSITION_GROUP": () => (/* binding */ TRANSITION_GROUP),
|
|
/* harmony export */ "V_MODEL_CHECKBOX": () => (/* binding */ V_MODEL_CHECKBOX),
|
|
/* harmony export */ "V_MODEL_DYNAMIC": () => (/* binding */ V_MODEL_DYNAMIC),
|
|
/* harmony export */ "V_MODEL_RADIO": () => (/* binding */ V_MODEL_RADIO),
|
|
/* harmony export */ "V_MODEL_SELECT": () => (/* binding */ V_MODEL_SELECT),
|
|
/* harmony export */ "V_MODEL_TEXT": () => (/* binding */ V_MODEL_TEXT),
|
|
/* harmony export */ "V_ON_WITH_KEYS": () => (/* binding */ V_ON_WITH_KEYS),
|
|
/* harmony export */ "V_ON_WITH_MODIFIERS": () => (/* binding */ V_ON_WITH_MODIFIERS),
|
|
/* harmony export */ "V_SHOW": () => (/* binding */ V_SHOW),
|
|
/* harmony export */ "compile": () => (/* binding */ compile),
|
|
/* harmony export */ "createDOMCompilerError": () => (/* binding */ createDOMCompilerError),
|
|
/* harmony export */ "parse": () => (/* binding */ parse),
|
|
/* harmony export */ "parserOptions": () => (/* binding */ parserOptions),
|
|
/* harmony export */ "transformStyle": () => (/* binding */ transformStyle)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/compiler-core */ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js");
|
|
/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
|
|
|
|
|
|
|
|
|
|
const V_MODEL_RADIO = Symbol(( true) ? `vModelRadio` : 0);
|
|
const V_MODEL_CHECKBOX = Symbol(( true) ? `vModelCheckbox` : 0);
|
|
const V_MODEL_TEXT = Symbol(( true) ? `vModelText` : 0);
|
|
const V_MODEL_SELECT = Symbol(( true) ? `vModelSelect` : 0);
|
|
const V_MODEL_DYNAMIC = Symbol(( true) ? `vModelDynamic` : 0);
|
|
const V_ON_WITH_MODIFIERS = Symbol(( true) ? `vOnModifiersGuard` : 0);
|
|
const V_ON_WITH_KEYS = Symbol(( true) ? `vOnKeysGuard` : 0);
|
|
const V_SHOW = Symbol(( true) ? `vShow` : 0);
|
|
const TRANSITION = Symbol(( true) ? `Transition` : 0);
|
|
const TRANSITION_GROUP = Symbol(( true) ? `TransitionGroup` : 0);
|
|
(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers)({
|
|
[V_MODEL_RADIO]: `vModelRadio`,
|
|
[V_MODEL_CHECKBOX]: `vModelCheckbox`,
|
|
[V_MODEL_TEXT]: `vModelText`,
|
|
[V_MODEL_SELECT]: `vModelSelect`,
|
|
[V_MODEL_DYNAMIC]: `vModelDynamic`,
|
|
[V_ON_WITH_MODIFIERS]: `withModifiers`,
|
|
[V_ON_WITH_KEYS]: `withKeys`,
|
|
[V_SHOW]: `vShow`,
|
|
[TRANSITION]: `Transition`,
|
|
[TRANSITION_GROUP]: `TransitionGroup`
|
|
});
|
|
|
|
/* eslint-disable no-restricted-globals */
|
|
let decoder;
|
|
function decodeHtmlBrowser(raw) {
|
|
(decoder || (decoder = document.createElement('div'))).innerHTML = raw;
|
|
return decoder.textContent;
|
|
}
|
|
|
|
const isRawTextContainer = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('style,iframe,script,noscript', true);
|
|
const parserOptions = {
|
|
isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.isVoidTag,
|
|
isNativeTag: tag => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag),
|
|
isPreTag: tag => tag === 'pre',
|
|
decodeEntities: decodeHtmlBrowser ,
|
|
isBuiltInComponent: (tag) => {
|
|
if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBuiltInType)(tag, `Transition`)) {
|
|
return TRANSITION;
|
|
}
|
|
else if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isBuiltInType)(tag, `TransitionGroup`)) {
|
|
return TRANSITION_GROUP;
|
|
}
|
|
},
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
|
|
getNamespace(tag, parent) {
|
|
let ns = parent ? parent.ns : 0 /* HTML */;
|
|
if (parent && ns === 2 /* MATH_ML */) {
|
|
if (parent.tag === 'annotation-xml') {
|
|
if (tag === 'svg') {
|
|
return 1 /* SVG */;
|
|
}
|
|
if (parent.props.some(a => a.type === 6 /* ATTRIBUTE */ &&
|
|
a.name === 'encoding' &&
|
|
a.value != null &&
|
|
(a.value.content === 'text/html' ||
|
|
a.value.content === 'application/xhtml+xml'))) {
|
|
ns = 0 /* HTML */;
|
|
}
|
|
}
|
|
else if (/^m(?:[ions]|text)$/.test(parent.tag) &&
|
|
tag !== 'mglyph' &&
|
|
tag !== 'malignmark') {
|
|
ns = 0 /* HTML */;
|
|
}
|
|
}
|
|
else if (parent && ns === 1 /* SVG */) {
|
|
if (parent.tag === 'foreignObject' ||
|
|
parent.tag === 'desc' ||
|
|
parent.tag === 'title') {
|
|
ns = 0 /* HTML */;
|
|
}
|
|
}
|
|
if (ns === 0 /* HTML */) {
|
|
if (tag === 'svg') {
|
|
return 1 /* SVG */;
|
|
}
|
|
if (tag === 'math') {
|
|
return 2 /* MATH_ML */;
|
|
}
|
|
}
|
|
return ns;
|
|
},
|
|
// https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
|
|
getTextMode({ tag, ns }) {
|
|
if (ns === 0 /* HTML */) {
|
|
if (tag === 'textarea' || tag === 'title') {
|
|
return 1 /* RCDATA */;
|
|
}
|
|
if (isRawTextContainer(tag)) {
|
|
return 2 /* RAWTEXT */;
|
|
}
|
|
}
|
|
return 0 /* DATA */;
|
|
}
|
|
};
|
|
|
|
// Parse inline CSS strings for static style attributes into an object.
|
|
// This is a NodeTransform since it works on the static `style` attribute and
|
|
// converts it into a dynamic equivalent:
|
|
// style="color: red" -> :style='{ "color": "red" }'
|
|
// It is then processed by `transformElement` and included in the generated
|
|
// props.
|
|
const transformStyle = node => {
|
|
if (node.type === 1 /* ELEMENT */) {
|
|
node.props.forEach((p, i) => {
|
|
if (p.type === 6 /* ATTRIBUTE */ && p.name === 'style' && p.value) {
|
|
// replace p with an expression node
|
|
node.props[i] = {
|
|
type: 7 /* DIRECTIVE */,
|
|
name: `bind`,
|
|
arg: (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`style`, true, p.loc),
|
|
exp: parseInlineCSS(p.value.content, p.loc),
|
|
modifiers: [],
|
|
loc: p.loc
|
|
};
|
|
}
|
|
});
|
|
}
|
|
};
|
|
const parseInlineCSS = (cssText, loc) => {
|
|
const normalized = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.parseStringStyle)(cssText);
|
|
return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(JSON.stringify(normalized), false, loc, 3 /* CAN_STRINGIFY */);
|
|
};
|
|
|
|
function createDOMCompilerError(code, loc) {
|
|
return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError)(code, loc, true ? DOMErrorMessages : 0);
|
|
}
|
|
const DOMErrorMessages = {
|
|
[49 /* X_V_HTML_NO_EXPRESSION */]: `v-html is missing expression.`,
|
|
[50 /* X_V_HTML_WITH_CHILDREN */]: `v-html will override element children.`,
|
|
[51 /* X_V_TEXT_NO_EXPRESSION */]: `v-text is missing expression.`,
|
|
[52 /* X_V_TEXT_WITH_CHILDREN */]: `v-text will override element children.`,
|
|
[53 /* X_V_MODEL_ON_INVALID_ELEMENT */]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
|
|
[54 /* X_V_MODEL_ARG_ON_ELEMENT */]: `v-model argument is not supported on plain elements.`,
|
|
[55 /* X_V_MODEL_ON_FILE_INPUT_ELEMENT */]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
|
|
[56 /* X_V_MODEL_UNNECESSARY_VALUE */]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
|
|
[57 /* X_V_SHOW_NO_EXPRESSION */]: `v-show is missing expression.`,
|
|
[58 /* X_TRANSITION_INVALID_CHILDREN */]: `<Transition> expects exactly one child element or component.`,
|
|
[59 /* X_IGNORED_SIDE_EFFECT_TAG */]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
|
|
};
|
|
|
|
const transformVHtml = (dir, node, context) => {
|
|
const { exp, loc } = dir;
|
|
if (!exp) {
|
|
context.onError(createDOMCompilerError(49 /* X_V_HTML_NO_EXPRESSION */, loc));
|
|
}
|
|
if (node.children.length) {
|
|
context.onError(createDOMCompilerError(50 /* X_V_HTML_WITH_CHILDREN */, loc));
|
|
node.children.length = 0;
|
|
}
|
|
return {
|
|
props: [
|
|
(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`innerHTML`, true, loc), exp || (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)('', true))
|
|
]
|
|
};
|
|
};
|
|
|
|
const transformVText = (dir, node, context) => {
|
|
const { exp, loc } = dir;
|
|
if (!exp) {
|
|
context.onError(createDOMCompilerError(51 /* X_V_TEXT_NO_EXPRESSION */, loc));
|
|
}
|
|
if (node.children.length) {
|
|
context.onError(createDOMCompilerError(52 /* X_V_TEXT_WITH_CHILDREN */, loc));
|
|
node.children.length = 0;
|
|
}
|
|
return {
|
|
props: [
|
|
(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`textContent`, true), exp
|
|
? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helperString(_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING), [exp], loc)
|
|
: (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)('', true))
|
|
]
|
|
};
|
|
};
|
|
|
|
const transformModel = (dir, node, context) => {
|
|
const baseResult = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel)(dir, node, context);
|
|
// base transform has errors OR component v-model (only need props)
|
|
if (!baseResult.props.length || node.tagType === 1 /* COMPONENT */) {
|
|
return baseResult;
|
|
}
|
|
if (dir.arg) {
|
|
context.onError(createDOMCompilerError(54 /* X_V_MODEL_ARG_ON_ELEMENT */, dir.arg.loc));
|
|
}
|
|
function checkDuplicatedValue() {
|
|
const value = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp)(node, 'value');
|
|
if (value) {
|
|
context.onError(createDOMCompilerError(56 /* X_V_MODEL_UNNECESSARY_VALUE */, value.loc));
|
|
}
|
|
}
|
|
const { tag } = node;
|
|
const isCustomElement = context.isCustomElement(tag);
|
|
if (tag === 'input' ||
|
|
tag === 'textarea' ||
|
|
tag === 'select' ||
|
|
isCustomElement) {
|
|
let directiveToUse = V_MODEL_TEXT;
|
|
let isInvalidType = false;
|
|
if (tag === 'input' || isCustomElement) {
|
|
const type = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp)(node, `type`);
|
|
if (type) {
|
|
if (type.type === 7 /* DIRECTIVE */) {
|
|
// :type="foo"
|
|
directiveToUse = V_MODEL_DYNAMIC;
|
|
}
|
|
else if (type.value) {
|
|
switch (type.value.content) {
|
|
case 'radio':
|
|
directiveToUse = V_MODEL_RADIO;
|
|
break;
|
|
case 'checkbox':
|
|
directiveToUse = V_MODEL_CHECKBOX;
|
|
break;
|
|
case 'file':
|
|
isInvalidType = true;
|
|
context.onError(createDOMCompilerError(55 /* X_V_MODEL_ON_FILE_INPUT_ELEMENT */, dir.loc));
|
|
break;
|
|
default:
|
|
// text type
|
|
( true) && checkDuplicatedValue();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind)(node)) {
|
|
// element has bindings with dynamic keys, which can possibly contain
|
|
// "type".
|
|
directiveToUse = V_MODEL_DYNAMIC;
|
|
}
|
|
else {
|
|
// text type
|
|
( true) && checkDuplicatedValue();
|
|
}
|
|
}
|
|
else if (tag === 'select') {
|
|
directiveToUse = V_MODEL_SELECT;
|
|
}
|
|
else {
|
|
// textarea
|
|
( true) && checkDuplicatedValue();
|
|
}
|
|
// inject runtime directive
|
|
// by returning the helper symbol via needRuntime
|
|
// the import will replaced a resolveDirective call.
|
|
if (!isInvalidType) {
|
|
baseResult.needRuntime = context.helper(directiveToUse);
|
|
}
|
|
}
|
|
else {
|
|
context.onError(createDOMCompilerError(53 /* X_V_MODEL_ON_INVALID_ELEMENT */, dir.loc));
|
|
}
|
|
// native vmodel doesn't need the `modelValue` props since they are also
|
|
// passed to the runtime as `binding.value`. removing it reduces code size.
|
|
baseResult.props = baseResult.props.filter(p => !(p.key.type === 4 /* SIMPLE_EXPRESSION */ &&
|
|
p.key.content === 'modelValue'));
|
|
return baseResult;
|
|
};
|
|
|
|
const isEventOptionModifier = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(`passive,once,capture`);
|
|
const isNonKeyModifier = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(
|
|
// event propagation management
|
|
`stop,prevent,self,` +
|
|
// system modifiers + exact
|
|
`ctrl,shift,alt,meta,exact,` +
|
|
// mouse
|
|
`middle`);
|
|
// left & right could be mouse or key modifiers based on event type
|
|
const maybeKeyModifier = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('left,right');
|
|
const isKeyboardEvent = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(`onkeyup,onkeydown,onkeypress`, true);
|
|
const resolveModifiers = (key, modifiers) => {
|
|
const keyModifiers = [];
|
|
const nonKeyModifiers = [];
|
|
const eventOptionModifiers = [];
|
|
for (let i = 0; i < modifiers.length; i++) {
|
|
const modifier = modifiers[i];
|
|
if (isEventOptionModifier(modifier)) {
|
|
// eventOptionModifiers: modifiers for addEventListener() options,
|
|
// e.g. .passive & .capture
|
|
eventOptionModifiers.push(modifier);
|
|
}
|
|
else {
|
|
// runtimeModifiers: modifiers that needs runtime guards
|
|
if (maybeKeyModifier(modifier)) {
|
|
if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key)) {
|
|
if (isKeyboardEvent(key.content)) {
|
|
keyModifiers.push(modifier);
|
|
}
|
|
else {
|
|
nonKeyModifiers.push(modifier);
|
|
}
|
|
}
|
|
else {
|
|
keyModifiers.push(modifier);
|
|
nonKeyModifiers.push(modifier);
|
|
}
|
|
}
|
|
else {
|
|
if (isNonKeyModifier(modifier)) {
|
|
nonKeyModifiers.push(modifier);
|
|
}
|
|
else {
|
|
keyModifiers.push(modifier);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
keyModifiers,
|
|
nonKeyModifiers,
|
|
eventOptionModifiers
|
|
};
|
|
};
|
|
const transformClick = (key, event) => {
|
|
const isStaticClick = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) && key.content.toLowerCase() === 'onclick';
|
|
return isStaticClick
|
|
? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(event, true)
|
|
: key.type !== 4 /* SIMPLE_EXPRESSION */
|
|
? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([
|
|
`(`,
|
|
key,
|
|
`) === "onClick" ? "${event}" : (`,
|
|
key,
|
|
`)`
|
|
])
|
|
: key;
|
|
};
|
|
const transformOn = (dir, node, context) => {
|
|
return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn)(dir, node, context, baseResult => {
|
|
const { modifiers } = dir;
|
|
if (!modifiers.length)
|
|
return baseResult;
|
|
let { key, value: handlerExp } = baseResult.props[0];
|
|
const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers);
|
|
// normalize click.right and click.middle since they don't actually fire
|
|
if (nonKeyModifiers.includes('right')) {
|
|
key = transformClick(key, `onContextmenu`);
|
|
}
|
|
if (nonKeyModifiers.includes('middle')) {
|
|
key = transformClick(key, `onMouseup`);
|
|
}
|
|
if (nonKeyModifiers.length) {
|
|
handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_MODIFIERS), [
|
|
handlerExp,
|
|
JSON.stringify(nonKeyModifiers)
|
|
]);
|
|
}
|
|
if (keyModifiers.length &&
|
|
// if event name is dynamic, always wrap with keys guard
|
|
(!(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) || isKeyboardEvent(key.content))) {
|
|
handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_KEYS), [
|
|
handlerExp,
|
|
JSON.stringify(keyModifiers)
|
|
]);
|
|
}
|
|
if (eventOptionModifiers.length) {
|
|
const modifierPostfix = eventOptionModifiers.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join('');
|
|
key = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key)
|
|
? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`${key.content}${modifierPostfix}`, true)
|
|
: (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([`(`, key, `) + "${modifierPostfix}"`]);
|
|
}
|
|
return {
|
|
props: [(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)(key, handlerExp)]
|
|
};
|
|
});
|
|
};
|
|
|
|
const transformShow = (dir, node, context) => {
|
|
const { exp, loc } = dir;
|
|
if (!exp) {
|
|
context.onError(createDOMCompilerError(57 /* X_V_SHOW_NO_EXPRESSION */, loc));
|
|
}
|
|
return {
|
|
props: [],
|
|
needRuntime: context.helper(V_SHOW)
|
|
};
|
|
};
|
|
|
|
const warnTransitionChildren = (node, context) => {
|
|
if (node.type === 1 /* ELEMENT */ &&
|
|
node.tagType === 1 /* COMPONENT */) {
|
|
const component = context.isBuiltInComponent(node.tag);
|
|
if (component === TRANSITION) {
|
|
return () => {
|
|
if (node.children.length && hasMultipleChildren(node)) {
|
|
context.onError(createDOMCompilerError(58 /* X_TRANSITION_INVALID_CHILDREN */, {
|
|
start: node.children[0].loc.start,
|
|
end: node.children[node.children.length - 1].loc.end,
|
|
source: ''
|
|
}));
|
|
}
|
|
};
|
|
}
|
|
}
|
|
};
|
|
function hasMultipleChildren(node) {
|
|
// #1352 filter out potential comment nodes.
|
|
const children = (node.children = node.children.filter(c => c.type !== 3 /* COMMENT */));
|
|
const child = children[0];
|
|
return (children.length !== 1 ||
|
|
child.type === 11 /* FOR */ ||
|
|
(child.type === 9 /* IF */ && child.branches.some(hasMultipleChildren)));
|
|
}
|
|
|
|
const ignoreSideEffectTags = (node, context) => {
|
|
if (node.type === 1 /* ELEMENT */ &&
|
|
node.tagType === 0 /* ELEMENT */ &&
|
|
(node.tag === 'script' || node.tag === 'style')) {
|
|
context.onError(createDOMCompilerError(59 /* X_IGNORED_SIDE_EFFECT_TAG */, node.loc));
|
|
context.removeNode();
|
|
}
|
|
};
|
|
|
|
const DOMNodeTransforms = [
|
|
transformStyle,
|
|
...(( true) ? [warnTransitionChildren] : 0)
|
|
];
|
|
const DOMDirectiveTransforms = {
|
|
cloak: _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform,
|
|
html: transformVHtml,
|
|
text: transformVText,
|
|
model: transformModel,
|
|
on: transformOn,
|
|
show: transformShow
|
|
};
|
|
function compile(template, options = {}) {
|
|
return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options, {
|
|
nodeTransforms: [
|
|
// ignore <script> and <tag>
|
|
// this is not put inside DOMNodeTransforms because that list is used
|
|
// by compiler-ssr to generate vnode fallback branches
|
|
ignoreSideEffectTags,
|
|
...DOMNodeTransforms,
|
|
...(options.nodeTransforms || [])
|
|
],
|
|
directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, DOMDirectiveTransforms, options.directiveTransforms || {}),
|
|
transformHoist: null
|
|
}));
|
|
}
|
|
function parse(template, options = {}) {
|
|
return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options));
|
|
}
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js":
|
|
/*!*********************************************************************!*\
|
|
!*** ./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js ***!
|
|
\*********************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "ITERATE_KEY": () => (/* binding */ ITERATE_KEY),
|
|
/* harmony export */ "computed": () => (/* binding */ computed),
|
|
/* harmony export */ "customRef": () => (/* binding */ customRef),
|
|
/* harmony export */ "effect": () => (/* binding */ effect),
|
|
/* harmony export */ "enableTracking": () => (/* binding */ enableTracking),
|
|
/* harmony export */ "isProxy": () => (/* binding */ isProxy),
|
|
/* harmony export */ "isReactive": () => (/* binding */ isReactive),
|
|
/* harmony export */ "isReadonly": () => (/* binding */ isReadonly),
|
|
/* harmony export */ "isRef": () => (/* binding */ isRef),
|
|
/* harmony export */ "markRaw": () => (/* binding */ markRaw),
|
|
/* harmony export */ "pauseTracking": () => (/* binding */ pauseTracking),
|
|
/* harmony export */ "proxyRefs": () => (/* binding */ proxyRefs),
|
|
/* harmony export */ "reactive": () => (/* binding */ reactive),
|
|
/* harmony export */ "readonly": () => (/* binding */ readonly),
|
|
/* harmony export */ "ref": () => (/* binding */ ref),
|
|
/* harmony export */ "resetTracking": () => (/* binding */ resetTracking),
|
|
/* harmony export */ "shallowReactive": () => (/* binding */ shallowReactive),
|
|
/* harmony export */ "shallowReadonly": () => (/* binding */ shallowReadonly),
|
|
/* harmony export */ "shallowRef": () => (/* binding */ shallowRef),
|
|
/* harmony export */ "stop": () => (/* binding */ stop),
|
|
/* harmony export */ "toRaw": () => (/* binding */ toRaw),
|
|
/* harmony export */ "toRef": () => (/* binding */ toRef),
|
|
/* harmony export */ "toRefs": () => (/* binding */ toRefs),
|
|
/* harmony export */ "track": () => (/* binding */ track),
|
|
/* harmony export */ "trigger": () => (/* binding */ trigger),
|
|
/* harmony export */ "triggerRef": () => (/* binding */ triggerRef),
|
|
/* harmony export */ "unref": () => (/* binding */ unref)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
|
|
|
|
|
|
const targetMap = new WeakMap();
|
|
const effectStack = [];
|
|
let activeEffect;
|
|
const ITERATE_KEY = Symbol(( true) ? 'iterate' : 0);
|
|
const MAP_KEY_ITERATE_KEY = Symbol(( true) ? 'Map key iterate' : 0);
|
|
function isEffect(fn) {
|
|
return fn && fn._isEffect === true;
|
|
}
|
|
function effect(fn, options = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.EMPTY_OBJ) {
|
|
if (isEffect(fn)) {
|
|
fn = fn.raw;
|
|
}
|
|
const effect = createReactiveEffect(fn, options);
|
|
if (!options.lazy) {
|
|
effect();
|
|
}
|
|
return effect;
|
|
}
|
|
function stop(effect) {
|
|
if (effect.active) {
|
|
cleanup(effect);
|
|
if (effect.options.onStop) {
|
|
effect.options.onStop();
|
|
}
|
|
effect.active = false;
|
|
}
|
|
}
|
|
let uid = 0;
|
|
function createReactiveEffect(fn, options) {
|
|
const effect = function reactiveEffect() {
|
|
if (!effect.active) {
|
|
return options.scheduler ? undefined : fn();
|
|
}
|
|
if (!effectStack.includes(effect)) {
|
|
cleanup(effect);
|
|
try {
|
|
enableTracking();
|
|
effectStack.push(effect);
|
|
activeEffect = effect;
|
|
return fn();
|
|
}
|
|
finally {
|
|
effectStack.pop();
|
|
resetTracking();
|
|
activeEffect = effectStack[effectStack.length - 1];
|
|
}
|
|
}
|
|
};
|
|
effect.id = uid++;
|
|
effect.allowRecurse = !!options.allowRecurse;
|
|
effect._isEffect = true;
|
|
effect.active = true;
|
|
effect.raw = fn;
|
|
effect.deps = [];
|
|
effect.options = options;
|
|
return effect;
|
|
}
|
|
function cleanup(effect) {
|
|
const { deps } = effect;
|
|
if (deps.length) {
|
|
for (let i = 0; i < deps.length; i++) {
|
|
deps[i].delete(effect);
|
|
}
|
|
deps.length = 0;
|
|
}
|
|
}
|
|
let shouldTrack = true;
|
|
const trackStack = [];
|
|
function pauseTracking() {
|
|
trackStack.push(shouldTrack);
|
|
shouldTrack = false;
|
|
}
|
|
function enableTracking() {
|
|
trackStack.push(shouldTrack);
|
|
shouldTrack = true;
|
|
}
|
|
function resetTracking() {
|
|
const last = trackStack.pop();
|
|
shouldTrack = last === undefined ? true : last;
|
|
}
|
|
function track(target, type, key) {
|
|
if (!shouldTrack || activeEffect === undefined) {
|
|
return;
|
|
}
|
|
let depsMap = targetMap.get(target);
|
|
if (!depsMap) {
|
|
targetMap.set(target, (depsMap = new Map()));
|
|
}
|
|
let dep = depsMap.get(key);
|
|
if (!dep) {
|
|
depsMap.set(key, (dep = new Set()));
|
|
}
|
|
if (!dep.has(activeEffect)) {
|
|
dep.add(activeEffect);
|
|
activeEffect.deps.push(dep);
|
|
if (( true) && activeEffect.options.onTrack) {
|
|
activeEffect.options.onTrack({
|
|
effect: activeEffect,
|
|
target,
|
|
type,
|
|
key
|
|
});
|
|
}
|
|
}
|
|
}
|
|
function trigger(target, type, key, newValue, oldValue, oldTarget) {
|
|
const depsMap = targetMap.get(target);
|
|
if (!depsMap) {
|
|
// never been tracked
|
|
return;
|
|
}
|
|
const effects = new Set();
|
|
const add = (effectsToAdd) => {
|
|
if (effectsToAdd) {
|
|
effectsToAdd.forEach(effect => {
|
|
if (effect !== activeEffect || effect.allowRecurse) {
|
|
effects.add(effect);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
if (type === "clear" /* CLEAR */) {
|
|
// collection being cleared
|
|
// trigger all effects for target
|
|
depsMap.forEach(add);
|
|
}
|
|
else if (key === 'length' && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {
|
|
depsMap.forEach((dep, key) => {
|
|
if (key === 'length' || key >= newValue) {
|
|
add(dep);
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
// schedule runs for SET | ADD | DELETE
|
|
if (key !== void 0) {
|
|
add(depsMap.get(key));
|
|
}
|
|
// also run for iteration key on ADD | DELETE | Map.SET
|
|
switch (type) {
|
|
case "add" /* ADD */:
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {
|
|
add(depsMap.get(ITERATE_KEY));
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {
|
|
add(depsMap.get(MAP_KEY_ITERATE_KEY));
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key)) {
|
|
// new index added to array -> length changes
|
|
add(depsMap.get('length'));
|
|
}
|
|
break;
|
|
case "delete" /* DELETE */:
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) {
|
|
add(depsMap.get(ITERATE_KEY));
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {
|
|
add(depsMap.get(MAP_KEY_ITERATE_KEY));
|
|
}
|
|
}
|
|
break;
|
|
case "set" /* SET */:
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) {
|
|
add(depsMap.get(ITERATE_KEY));
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
const run = (effect) => {
|
|
if (( true) && effect.options.onTrigger) {
|
|
effect.options.onTrigger({
|
|
effect,
|
|
target,
|
|
key,
|
|
type,
|
|
newValue,
|
|
oldValue,
|
|
oldTarget
|
|
});
|
|
}
|
|
if (effect.options.scheduler) {
|
|
effect.options.scheduler(effect);
|
|
}
|
|
else {
|
|
effect();
|
|
}
|
|
};
|
|
effects.forEach(run);
|
|
}
|
|
|
|
const isNonTrackableKeys = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.makeMap)(`__proto__,__v_isRef,__isVue`);
|
|
const builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol)
|
|
.map(key => Symbol[key])
|
|
.filter(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol));
|
|
const get = /*#__PURE__*/ createGetter();
|
|
const shallowGet = /*#__PURE__*/ createGetter(false, true);
|
|
const readonlyGet = /*#__PURE__*/ createGetter(true);
|
|
const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true);
|
|
const arrayInstrumentations = {};
|
|
['includes', 'indexOf', 'lastIndexOf'].forEach(key => {
|
|
const method = Array.prototype[key];
|
|
arrayInstrumentations[key] = function (...args) {
|
|
const arr = toRaw(this);
|
|
for (let i = 0, l = this.length; i < l; i++) {
|
|
track(arr, "get" /* GET */, i + '');
|
|
}
|
|
// we run the method using the original args first (which may be reactive)
|
|
const res = method.apply(arr, args);
|
|
if (res === -1 || res === false) {
|
|
// if that didn't work, run it again using raw values.
|
|
return method.apply(arr, args.map(toRaw));
|
|
}
|
|
else {
|
|
return res;
|
|
}
|
|
};
|
|
});
|
|
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(key => {
|
|
const method = Array.prototype[key];
|
|
arrayInstrumentations[key] = function (...args) {
|
|
pauseTracking();
|
|
const res = method.apply(this, args);
|
|
resetTracking();
|
|
return res;
|
|
};
|
|
});
|
|
function createGetter(isReadonly = false, shallow = false) {
|
|
return function get(target, key, receiver) {
|
|
if (key === "__v_isReactive" /* IS_REACTIVE */) {
|
|
return !isReadonly;
|
|
}
|
|
else if (key === "__v_isReadonly" /* IS_READONLY */) {
|
|
return isReadonly;
|
|
}
|
|
else if (key === "__v_raw" /* RAW */ &&
|
|
receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) {
|
|
return target;
|
|
}
|
|
const targetIsArray = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target);
|
|
if (!isReadonly && targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(arrayInstrumentations, key)) {
|
|
return Reflect.get(arrayInstrumentations, key, receiver);
|
|
}
|
|
const res = Reflect.get(target, key, receiver);
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key)
|
|
? builtInSymbols.has(key)
|
|
: isNonTrackableKeys(key)) {
|
|
return res;
|
|
}
|
|
if (!isReadonly) {
|
|
track(target, "get" /* GET */, key);
|
|
}
|
|
if (shallow) {
|
|
return res;
|
|
}
|
|
if (isRef(res)) {
|
|
// ref unwrapping - does not apply for Array + integer key.
|
|
const shouldUnwrap = !targetIsArray || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key);
|
|
return shouldUnwrap ? res.value : res;
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(res)) {
|
|
// Convert returned value into a proxy as well. we do the isObject check
|
|
// here to avoid invalid value warning. Also need to lazy access readonly
|
|
// and reactive here to avoid circular dependency.
|
|
return isReadonly ? readonly(res) : reactive(res);
|
|
}
|
|
return res;
|
|
};
|
|
}
|
|
const set = /*#__PURE__*/ createSetter();
|
|
const shallowSet = /*#__PURE__*/ createSetter(true);
|
|
function createSetter(shallow = false) {
|
|
return function set(target, key, value, receiver) {
|
|
const oldValue = target[key];
|
|
if (!shallow) {
|
|
value = toRaw(value);
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && isRef(oldValue) && !isRef(value)) {
|
|
oldValue.value = value;
|
|
return true;
|
|
}
|
|
}
|
|
const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key)
|
|
? Number(key) < target.length
|
|
: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key);
|
|
const result = Reflect.set(target, key, value, receiver);
|
|
// don't trigger if target is something up in the prototype chain of original
|
|
if (target === toRaw(receiver)) {
|
|
if (!hadKey) {
|
|
trigger(target, "add" /* ADD */, key, value);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) {
|
|
trigger(target, "set" /* SET */, key, value, oldValue);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
function deleteProperty(target, key) {
|
|
const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key);
|
|
const oldValue = target[key];
|
|
const result = Reflect.deleteProperty(target, key);
|
|
if (result && hadKey) {
|
|
trigger(target, "delete" /* DELETE */, key, undefined, oldValue);
|
|
}
|
|
return result;
|
|
}
|
|
function has(target, key) {
|
|
const result = Reflect.has(target, key);
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) || !builtInSymbols.has(key)) {
|
|
track(target, "has" /* HAS */, key);
|
|
}
|
|
return result;
|
|
}
|
|
function ownKeys(target) {
|
|
track(target, "iterate" /* ITERATE */, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) ? 'length' : ITERATE_KEY);
|
|
return Reflect.ownKeys(target);
|
|
}
|
|
const mutableHandlers = {
|
|
get,
|
|
set,
|
|
deleteProperty,
|
|
has,
|
|
ownKeys
|
|
};
|
|
const readonlyHandlers = {
|
|
get: readonlyGet,
|
|
set(target, key) {
|
|
if ((true)) {
|
|
console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
|
|
}
|
|
return true;
|
|
},
|
|
deleteProperty(target, key) {
|
|
if ((true)) {
|
|
console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
const shallowReactiveHandlers = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, mutableHandlers, {
|
|
get: shallowGet,
|
|
set: shallowSet
|
|
});
|
|
// Props handlers are special in the sense that it should not unwrap top-level
|
|
// refs (in order to allow refs to be explicitly passed down), but should
|
|
// retain the reactivity of the normal readonly object.
|
|
const shallowReadonlyHandlers = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, readonlyHandlers, {
|
|
get: shallowReadonlyGet
|
|
});
|
|
|
|
const toReactive = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? reactive(value) : value;
|
|
const toReadonly = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? readonly(value) : value;
|
|
const toShallow = (value) => value;
|
|
const getProto = (v) => Reflect.getPrototypeOf(v);
|
|
function get$1(target, key, isReadonly = false, isShallow = false) {
|
|
// #1772: readonly(reactive(Map)) should return readonly + reactive version
|
|
// of the value
|
|
target = target["__v_raw" /* RAW */];
|
|
const rawTarget = toRaw(target);
|
|
const rawKey = toRaw(key);
|
|
if (key !== rawKey) {
|
|
!isReadonly && track(rawTarget, "get" /* GET */, key);
|
|
}
|
|
!isReadonly && track(rawTarget, "get" /* GET */, rawKey);
|
|
const { has } = getProto(rawTarget);
|
|
const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
|
|
if (has.call(rawTarget, key)) {
|
|
return wrap(target.get(key));
|
|
}
|
|
else if (has.call(rawTarget, rawKey)) {
|
|
return wrap(target.get(rawKey));
|
|
}
|
|
}
|
|
function has$1(key, isReadonly = false) {
|
|
const target = this["__v_raw" /* RAW */];
|
|
const rawTarget = toRaw(target);
|
|
const rawKey = toRaw(key);
|
|
if (key !== rawKey) {
|
|
!isReadonly && track(rawTarget, "has" /* HAS */, key);
|
|
}
|
|
!isReadonly && track(rawTarget, "has" /* HAS */, rawKey);
|
|
return key === rawKey
|
|
? target.has(key)
|
|
: target.has(key) || target.has(rawKey);
|
|
}
|
|
function size(target, isReadonly = false) {
|
|
target = target["__v_raw" /* RAW */];
|
|
!isReadonly && track(toRaw(target), "iterate" /* ITERATE */, ITERATE_KEY);
|
|
return Reflect.get(target, 'size', target);
|
|
}
|
|
function add(value) {
|
|
value = toRaw(value);
|
|
const target = toRaw(this);
|
|
const proto = getProto(target);
|
|
const hadKey = proto.has.call(target, value);
|
|
if (!hadKey) {
|
|
target.add(value);
|
|
trigger(target, "add" /* ADD */, value, value);
|
|
}
|
|
return this;
|
|
}
|
|
function set$1(key, value) {
|
|
value = toRaw(value);
|
|
const target = toRaw(this);
|
|
const { has, get } = getProto(target);
|
|
let hadKey = has.call(target, key);
|
|
if (!hadKey) {
|
|
key = toRaw(key);
|
|
hadKey = has.call(target, key);
|
|
}
|
|
else if ((true)) {
|
|
checkIdentityKeys(target, has, key);
|
|
}
|
|
const oldValue = get.call(target, key);
|
|
target.set(key, value);
|
|
if (!hadKey) {
|
|
trigger(target, "add" /* ADD */, key, value);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) {
|
|
trigger(target, "set" /* SET */, key, value, oldValue);
|
|
}
|
|
return this;
|
|
}
|
|
function deleteEntry(key) {
|
|
const target = toRaw(this);
|
|
const { has, get } = getProto(target);
|
|
let hadKey = has.call(target, key);
|
|
if (!hadKey) {
|
|
key = toRaw(key);
|
|
hadKey = has.call(target, key);
|
|
}
|
|
else if ((true)) {
|
|
checkIdentityKeys(target, has, key);
|
|
}
|
|
const oldValue = get ? get.call(target, key) : undefined;
|
|
// forward the operation before queueing reactions
|
|
const result = target.delete(key);
|
|
if (hadKey) {
|
|
trigger(target, "delete" /* DELETE */, key, undefined, oldValue);
|
|
}
|
|
return result;
|
|
}
|
|
function clear() {
|
|
const target = toRaw(this);
|
|
const hadItems = target.size !== 0;
|
|
const oldTarget = ( true)
|
|
? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)
|
|
? new Map(target)
|
|
: new Set(target)
|
|
: 0;
|
|
// forward the operation before queueing reactions
|
|
const result = target.clear();
|
|
if (hadItems) {
|
|
trigger(target, "clear" /* CLEAR */, undefined, undefined, oldTarget);
|
|
}
|
|
return result;
|
|
}
|
|
function createForEach(isReadonly, isShallow) {
|
|
return function forEach(callback, thisArg) {
|
|
const observed = this;
|
|
const target = observed["__v_raw" /* RAW */];
|
|
const rawTarget = toRaw(target);
|
|
const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
|
|
!isReadonly && track(rawTarget, "iterate" /* ITERATE */, ITERATE_KEY);
|
|
return target.forEach((value, key) => {
|
|
// important: make sure the callback is
|
|
// 1. invoked with the reactive map as `this` and 3rd arg
|
|
// 2. the value received should be a corresponding reactive/readonly.
|
|
return callback.call(thisArg, wrap(value), wrap(key), observed);
|
|
});
|
|
};
|
|
}
|
|
function createIterableMethod(method, isReadonly, isShallow) {
|
|
return function (...args) {
|
|
const target = this["__v_raw" /* RAW */];
|
|
const rawTarget = toRaw(target);
|
|
const targetIsMap = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(rawTarget);
|
|
const isPair = method === 'entries' || (method === Symbol.iterator && targetIsMap);
|
|
const isKeyOnly = method === 'keys' && targetIsMap;
|
|
const innerIterator = target[method](...args);
|
|
const wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive;
|
|
!isReadonly &&
|
|
track(rawTarget, "iterate" /* ITERATE */, isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
|
|
// return a wrapped iterator which returns observed versions of the
|
|
// values emitted from the real iterator
|
|
return {
|
|
// iterator protocol
|
|
next() {
|
|
const { value, done } = innerIterator.next();
|
|
return done
|
|
? { value, done }
|
|
: {
|
|
value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
|
|
done
|
|
};
|
|
},
|
|
// iterable protocol
|
|
[Symbol.iterator]() {
|
|
return this;
|
|
}
|
|
};
|
|
};
|
|
}
|
|
function createReadonlyMethod(type) {
|
|
return function (...args) {
|
|
if ((true)) {
|
|
const key = args[0] ? `on key "${args[0]}" ` : ``;
|
|
console.warn(`${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)(type)} operation ${key}failed: target is readonly.`, toRaw(this));
|
|
}
|
|
return type === "delete" /* DELETE */ ? false : this;
|
|
};
|
|
}
|
|
const mutableInstrumentations = {
|
|
get(key) {
|
|
return get$1(this, key);
|
|
},
|
|
get size() {
|
|
return size(this);
|
|
},
|
|
has: has$1,
|
|
add,
|
|
set: set$1,
|
|
delete: deleteEntry,
|
|
clear,
|
|
forEach: createForEach(false, false)
|
|
};
|
|
const shallowInstrumentations = {
|
|
get(key) {
|
|
return get$1(this, key, false, true);
|
|
},
|
|
get size() {
|
|
return size(this);
|
|
},
|
|
has: has$1,
|
|
add,
|
|
set: set$1,
|
|
delete: deleteEntry,
|
|
clear,
|
|
forEach: createForEach(false, true)
|
|
};
|
|
const readonlyInstrumentations = {
|
|
get(key) {
|
|
return get$1(this, key, true);
|
|
},
|
|
get size() {
|
|
return size(this, true);
|
|
},
|
|
has(key) {
|
|
return has$1.call(this, key, true);
|
|
},
|
|
add: createReadonlyMethod("add" /* ADD */),
|
|
set: createReadonlyMethod("set" /* SET */),
|
|
delete: createReadonlyMethod("delete" /* DELETE */),
|
|
clear: createReadonlyMethod("clear" /* CLEAR */),
|
|
forEach: createForEach(true, false)
|
|
};
|
|
const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
|
|
iteratorMethods.forEach(method => {
|
|
mutableInstrumentations[method] = createIterableMethod(method, false, false);
|
|
readonlyInstrumentations[method] = createIterableMethod(method, true, false);
|
|
shallowInstrumentations[method] = createIterableMethod(method, false, true);
|
|
});
|
|
function createInstrumentationGetter(isReadonly, shallow) {
|
|
const instrumentations = shallow
|
|
? shallowInstrumentations
|
|
: isReadonly
|
|
? readonlyInstrumentations
|
|
: mutableInstrumentations;
|
|
return (target, key, receiver) => {
|
|
if (key === "__v_isReactive" /* IS_REACTIVE */) {
|
|
return !isReadonly;
|
|
}
|
|
else if (key === "__v_isReadonly" /* IS_READONLY */) {
|
|
return isReadonly;
|
|
}
|
|
else if (key === "__v_raw" /* RAW */) {
|
|
return target;
|
|
}
|
|
return Reflect.get((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(instrumentations, key) && key in target
|
|
? instrumentations
|
|
: target, key, receiver);
|
|
};
|
|
}
|
|
const mutableCollectionHandlers = {
|
|
get: createInstrumentationGetter(false, false)
|
|
};
|
|
const shallowCollectionHandlers = {
|
|
get: createInstrumentationGetter(false, true)
|
|
};
|
|
const readonlyCollectionHandlers = {
|
|
get: createInstrumentationGetter(true, false)
|
|
};
|
|
function checkIdentityKeys(target, has, key) {
|
|
const rawKey = toRaw(key);
|
|
if (rawKey !== key && has.call(target, rawKey)) {
|
|
const type = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(target);
|
|
console.warn(`Reactive ${type} contains both the raw and reactive ` +
|
|
`versions of the same object${type === `Map` ? ` as keys` : ``}, ` +
|
|
`which can lead to inconsistencies. ` +
|
|
`Avoid differentiating between the raw and reactive versions ` +
|
|
`of an object and only use the reactive version if possible.`);
|
|
}
|
|
}
|
|
|
|
const reactiveMap = new WeakMap();
|
|
const readonlyMap = new WeakMap();
|
|
function targetTypeMap(rawType) {
|
|
switch (rawType) {
|
|
case 'Object':
|
|
case 'Array':
|
|
return 1 /* COMMON */;
|
|
case 'Map':
|
|
case 'Set':
|
|
case 'WeakMap':
|
|
case 'WeakSet':
|
|
return 2 /* COLLECTION */;
|
|
default:
|
|
return 0 /* INVALID */;
|
|
}
|
|
}
|
|
function getTargetType(value) {
|
|
return value["__v_skip" /* SKIP */] || !Object.isExtensible(value)
|
|
? 0 /* INVALID */
|
|
: targetTypeMap((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(value));
|
|
}
|
|
function reactive(target) {
|
|
// if trying to observe a readonly proxy, return the readonly version.
|
|
if (target && target["__v_isReadonly" /* IS_READONLY */]) {
|
|
return target;
|
|
}
|
|
return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers);
|
|
}
|
|
/**
|
|
* Return a shallowly-reactive copy of the original object, where only the root
|
|
* level properties are reactive. It also does not auto-unwrap refs (even at the
|
|
* root level).
|
|
*/
|
|
function shallowReactive(target) {
|
|
return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers);
|
|
}
|
|
/**
|
|
* Creates a readonly copy of the original object. Note the returned copy is not
|
|
* made reactive, but `readonly` can be called on an already reactive object.
|
|
*/
|
|
function readonly(target) {
|
|
return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers);
|
|
}
|
|
/**
|
|
* Returns a reactive-copy of the original object, where only the root level
|
|
* properties are readonly, and does NOT unwrap refs nor recursively convert
|
|
* returned properties.
|
|
* This is used for creating the props proxy object for stateful components.
|
|
*/
|
|
function shallowReadonly(target) {
|
|
return createReactiveObject(target, true, shallowReadonlyHandlers, readonlyCollectionHandlers);
|
|
}
|
|
function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(target)) {
|
|
if ((true)) {
|
|
console.warn(`value cannot be made reactive: ${String(target)}`);
|
|
}
|
|
return target;
|
|
}
|
|
// target is already a Proxy, return it.
|
|
// exception: calling readonly() on a reactive object
|
|
if (target["__v_raw" /* RAW */] &&
|
|
!(isReadonly && target["__v_isReactive" /* IS_REACTIVE */])) {
|
|
return target;
|
|
}
|
|
// target already has corresponding Proxy
|
|
const proxyMap = isReadonly ? readonlyMap : reactiveMap;
|
|
const existingProxy = proxyMap.get(target);
|
|
if (existingProxy) {
|
|
return existingProxy;
|
|
}
|
|
// only a whitelist of value types can be observed.
|
|
const targetType = getTargetType(target);
|
|
if (targetType === 0 /* INVALID */) {
|
|
return target;
|
|
}
|
|
const proxy = new Proxy(target, targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers);
|
|
proxyMap.set(target, proxy);
|
|
return proxy;
|
|
}
|
|
function isReactive(value) {
|
|
if (isReadonly(value)) {
|
|
return isReactive(value["__v_raw" /* RAW */]);
|
|
}
|
|
return !!(value && value["__v_isReactive" /* IS_REACTIVE */]);
|
|
}
|
|
function isReadonly(value) {
|
|
return !!(value && value["__v_isReadonly" /* IS_READONLY */]);
|
|
}
|
|
function isProxy(value) {
|
|
return isReactive(value) || isReadonly(value);
|
|
}
|
|
function toRaw(observed) {
|
|
return ((observed && toRaw(observed["__v_raw" /* RAW */])) || observed);
|
|
}
|
|
function markRaw(value) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.def)(value, "__v_skip" /* SKIP */, true);
|
|
return value;
|
|
}
|
|
|
|
const convert = (val) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(val) ? reactive(val) : val;
|
|
function isRef(r) {
|
|
return Boolean(r && r.__v_isRef === true);
|
|
}
|
|
function ref(value) {
|
|
return createRef(value);
|
|
}
|
|
function shallowRef(value) {
|
|
return createRef(value, true);
|
|
}
|
|
class RefImpl {
|
|
constructor(_rawValue, _shallow = false) {
|
|
this._rawValue = _rawValue;
|
|
this._shallow = _shallow;
|
|
this.__v_isRef = true;
|
|
this._value = _shallow ? _rawValue : convert(_rawValue);
|
|
}
|
|
get value() {
|
|
track(toRaw(this), "get" /* GET */, 'value');
|
|
return this._value;
|
|
}
|
|
set value(newVal) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(toRaw(newVal), this._rawValue)) {
|
|
this._rawValue = newVal;
|
|
this._value = this._shallow ? newVal : convert(newVal);
|
|
trigger(toRaw(this), "set" /* SET */, 'value', newVal);
|
|
}
|
|
}
|
|
}
|
|
function createRef(rawValue, shallow = false) {
|
|
if (isRef(rawValue)) {
|
|
return rawValue;
|
|
}
|
|
return new RefImpl(rawValue, shallow);
|
|
}
|
|
function triggerRef(ref) {
|
|
trigger(toRaw(ref), "set" /* SET */, 'value', ( true) ? ref.value : 0);
|
|
}
|
|
function unref(ref) {
|
|
return isRef(ref) ? ref.value : ref;
|
|
}
|
|
const shallowUnwrapHandlers = {
|
|
get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
|
|
set: (target, key, value, receiver) => {
|
|
const oldValue = target[key];
|
|
if (isRef(oldValue) && !isRef(value)) {
|
|
oldValue.value = value;
|
|
return true;
|
|
}
|
|
else {
|
|
return Reflect.set(target, key, value, receiver);
|
|
}
|
|
}
|
|
};
|
|
function proxyRefs(objectWithRefs) {
|
|
return isReactive(objectWithRefs)
|
|
? objectWithRefs
|
|
: new Proxy(objectWithRefs, shallowUnwrapHandlers);
|
|
}
|
|
class CustomRefImpl {
|
|
constructor(factory) {
|
|
this.__v_isRef = true;
|
|
const { get, set } = factory(() => track(this, "get" /* GET */, 'value'), () => trigger(this, "set" /* SET */, 'value'));
|
|
this._get = get;
|
|
this._set = set;
|
|
}
|
|
get value() {
|
|
return this._get();
|
|
}
|
|
set value(newVal) {
|
|
this._set(newVal);
|
|
}
|
|
}
|
|
function customRef(factory) {
|
|
return new CustomRefImpl(factory);
|
|
}
|
|
function toRefs(object) {
|
|
if (( true) && !isProxy(object)) {
|
|
console.warn(`toRefs() expects a reactive object but received a plain one.`);
|
|
}
|
|
const ret = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(object) ? new Array(object.length) : {};
|
|
for (const key in object) {
|
|
ret[key] = toRef(object, key);
|
|
}
|
|
return ret;
|
|
}
|
|
class ObjectRefImpl {
|
|
constructor(_object, _key) {
|
|
this._object = _object;
|
|
this._key = _key;
|
|
this.__v_isRef = true;
|
|
}
|
|
get value() {
|
|
return this._object[this._key];
|
|
}
|
|
set value(newVal) {
|
|
this._object[this._key] = newVal;
|
|
}
|
|
}
|
|
function toRef(object, key) {
|
|
return isRef(object[key])
|
|
? object[key]
|
|
: new ObjectRefImpl(object, key);
|
|
}
|
|
|
|
class ComputedRefImpl {
|
|
constructor(getter, _setter, isReadonly) {
|
|
this._setter = _setter;
|
|
this._dirty = true;
|
|
this.__v_isRef = true;
|
|
this.effect = effect(getter, {
|
|
lazy: true,
|
|
scheduler: () => {
|
|
if (!this._dirty) {
|
|
this._dirty = true;
|
|
trigger(toRaw(this), "set" /* SET */, 'value');
|
|
}
|
|
}
|
|
});
|
|
this["__v_isReadonly" /* IS_READONLY */] = isReadonly;
|
|
}
|
|
get value() {
|
|
if (this._dirty) {
|
|
this._value = this.effect();
|
|
this._dirty = false;
|
|
}
|
|
track(toRaw(this), "get" /* GET */, 'value');
|
|
return this._value;
|
|
}
|
|
set value(newValue) {
|
|
this._setter(newValue);
|
|
}
|
|
}
|
|
function computed(getterOrOptions) {
|
|
let getter;
|
|
let setter;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(getterOrOptions)) {
|
|
getter = getterOrOptions;
|
|
setter = ( true)
|
|
? () => {
|
|
console.warn('Write operation failed: computed value is readonly');
|
|
}
|
|
: 0;
|
|
}
|
|
else {
|
|
getter = getterOrOptions.get;
|
|
setter = getterOrOptions.set;
|
|
}
|
|
return new ComputedRefImpl(getter, setter, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(getterOrOptions) || !getterOrOptions.set);
|
|
}
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js":
|
|
/*!*************************************************************************!*\
|
|
!*** ./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js ***!
|
|
\*************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "customRef": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.customRef),
|
|
/* harmony export */ "isProxy": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy),
|
|
/* harmony export */ "isReactive": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive),
|
|
/* harmony export */ "isReadonly": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly),
|
|
/* harmony export */ "isRef": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef),
|
|
/* harmony export */ "markRaw": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw),
|
|
/* harmony export */ "proxyRefs": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs),
|
|
/* harmony export */ "reactive": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive),
|
|
/* harmony export */ "readonly": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.readonly),
|
|
/* harmony export */ "ref": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref),
|
|
/* harmony export */ "shallowReactive": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive),
|
|
/* harmony export */ "shallowReadonly": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly),
|
|
/* harmony export */ "shallowRef": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowRef),
|
|
/* harmony export */ "toRaw": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw),
|
|
/* harmony export */ "toRef": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRef),
|
|
/* harmony export */ "toRefs": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRefs),
|
|
/* harmony export */ "triggerRef": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.triggerRef),
|
|
/* harmony export */ "unref": () => (/* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.unref),
|
|
/* harmony export */ "camelize": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize),
|
|
/* harmony export */ "capitalize": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize),
|
|
/* harmony export */ "toDisplayString": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toDisplayString),
|
|
/* harmony export */ "toHandlerKey": () => (/* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey),
|
|
/* harmony export */ "BaseTransition": () => (/* binding */ BaseTransition),
|
|
/* harmony export */ "Comment": () => (/* binding */ Comment),
|
|
/* harmony export */ "Fragment": () => (/* binding */ Fragment),
|
|
/* harmony export */ "KeepAlive": () => (/* binding */ KeepAlive),
|
|
/* harmony export */ "Static": () => (/* binding */ Static),
|
|
/* harmony export */ "Suspense": () => (/* binding */ Suspense),
|
|
/* harmony export */ "Teleport": () => (/* binding */ Teleport),
|
|
/* harmony export */ "Text": () => (/* binding */ Text),
|
|
/* harmony export */ "callWithAsyncErrorHandling": () => (/* binding */ callWithAsyncErrorHandling),
|
|
/* harmony export */ "callWithErrorHandling": () => (/* binding */ callWithErrorHandling),
|
|
/* harmony export */ "cloneVNode": () => (/* binding */ cloneVNode),
|
|
/* harmony export */ "computed": () => (/* binding */ computed),
|
|
/* harmony export */ "createBlock": () => (/* binding */ createBlock),
|
|
/* harmony export */ "createCommentVNode": () => (/* binding */ createCommentVNode),
|
|
/* harmony export */ "createHydrationRenderer": () => (/* binding */ createHydrationRenderer),
|
|
/* harmony export */ "createRenderer": () => (/* binding */ createRenderer),
|
|
/* harmony export */ "createSlots": () => (/* binding */ createSlots),
|
|
/* harmony export */ "createStaticVNode": () => (/* binding */ createStaticVNode),
|
|
/* harmony export */ "createTextVNode": () => (/* binding */ createTextVNode),
|
|
/* harmony export */ "createVNode": () => (/* binding */ createVNode),
|
|
/* harmony export */ "defineAsyncComponent": () => (/* binding */ defineAsyncComponent),
|
|
/* harmony export */ "defineComponent": () => (/* binding */ defineComponent),
|
|
/* harmony export */ "defineEmit": () => (/* binding */ defineEmit),
|
|
/* harmony export */ "defineProps": () => (/* binding */ defineProps),
|
|
/* harmony export */ "devtools": () => (/* binding */ devtools),
|
|
/* harmony export */ "getCurrentInstance": () => (/* binding */ getCurrentInstance),
|
|
/* harmony export */ "getTransitionRawChildren": () => (/* binding */ getTransitionRawChildren),
|
|
/* harmony export */ "h": () => (/* binding */ h),
|
|
/* harmony export */ "handleError": () => (/* binding */ handleError),
|
|
/* harmony export */ "initCustomFormatter": () => (/* binding */ initCustomFormatter),
|
|
/* harmony export */ "inject": () => (/* binding */ inject),
|
|
/* harmony export */ "isRuntimeOnly": () => (/* binding */ isRuntimeOnly),
|
|
/* harmony export */ "isVNode": () => (/* binding */ isVNode),
|
|
/* harmony export */ "mergeProps": () => (/* binding */ mergeProps),
|
|
/* harmony export */ "nextTick": () => (/* binding */ nextTick),
|
|
/* harmony export */ "onActivated": () => (/* binding */ onActivated),
|
|
/* harmony export */ "onBeforeMount": () => (/* binding */ onBeforeMount),
|
|
/* harmony export */ "onBeforeUnmount": () => (/* binding */ onBeforeUnmount),
|
|
/* harmony export */ "onBeforeUpdate": () => (/* binding */ onBeforeUpdate),
|
|
/* harmony export */ "onDeactivated": () => (/* binding */ onDeactivated),
|
|
/* harmony export */ "onErrorCaptured": () => (/* binding */ onErrorCaptured),
|
|
/* harmony export */ "onMounted": () => (/* binding */ onMounted),
|
|
/* harmony export */ "onRenderTracked": () => (/* binding */ onRenderTracked),
|
|
/* harmony export */ "onRenderTriggered": () => (/* binding */ onRenderTriggered),
|
|
/* harmony export */ "onUnmounted": () => (/* binding */ onUnmounted),
|
|
/* harmony export */ "onUpdated": () => (/* binding */ onUpdated),
|
|
/* harmony export */ "openBlock": () => (/* binding */ openBlock),
|
|
/* harmony export */ "popScopeId": () => (/* binding */ popScopeId),
|
|
/* harmony export */ "provide": () => (/* binding */ provide),
|
|
/* harmony export */ "pushScopeId": () => (/* binding */ pushScopeId),
|
|
/* harmony export */ "queuePostFlushCb": () => (/* binding */ queuePostFlushCb),
|
|
/* harmony export */ "registerRuntimeCompiler": () => (/* binding */ registerRuntimeCompiler),
|
|
/* harmony export */ "renderList": () => (/* binding */ renderList),
|
|
/* harmony export */ "renderSlot": () => (/* binding */ renderSlot),
|
|
/* harmony export */ "resolveComponent": () => (/* binding */ resolveComponent),
|
|
/* harmony export */ "resolveDirective": () => (/* binding */ resolveDirective),
|
|
/* harmony export */ "resolveDynamicComponent": () => (/* binding */ resolveDynamicComponent),
|
|
/* harmony export */ "resolveTransitionHooks": () => (/* binding */ resolveTransitionHooks),
|
|
/* harmony export */ "setBlockTracking": () => (/* binding */ setBlockTracking),
|
|
/* harmony export */ "setDevtoolsHook": () => (/* binding */ setDevtoolsHook),
|
|
/* harmony export */ "setTransitionHooks": () => (/* binding */ setTransitionHooks),
|
|
/* harmony export */ "ssrContextKey": () => (/* binding */ ssrContextKey),
|
|
/* harmony export */ "ssrUtils": () => (/* binding */ ssrUtils),
|
|
/* harmony export */ "toHandlers": () => (/* binding */ toHandlers),
|
|
/* harmony export */ "transformVNodeArgs": () => (/* binding */ transformVNodeArgs),
|
|
/* harmony export */ "useContext": () => (/* binding */ useContext),
|
|
/* harmony export */ "useSSRContext": () => (/* binding */ useSSRContext),
|
|
/* harmony export */ "useTransitionState": () => (/* binding */ useTransitionState),
|
|
/* harmony export */ "version": () => (/* binding */ version),
|
|
/* harmony export */ "warn": () => (/* binding */ warn),
|
|
/* harmony export */ "watch": () => (/* binding */ watch),
|
|
/* harmony export */ "watchEffect": () => (/* binding */ watchEffect),
|
|
/* harmony export */ "withCtx": () => (/* binding */ withCtx),
|
|
/* harmony export */ "withDirectives": () => (/* binding */ withDirectives),
|
|
/* harmony export */ "withScopeId": () => (/* binding */ withScopeId)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/reactivity */ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js");
|
|
/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
|
|
|
|
|
|
|
|
|
|
|
|
const stack = [];
|
|
function pushWarningContext(vnode) {
|
|
stack.push(vnode);
|
|
}
|
|
function popWarningContext() {
|
|
stack.pop();
|
|
}
|
|
function warn(msg, ...args) {
|
|
// avoid props formatting or warn handler tracking deps that might be mutated
|
|
// during patch, leading to infinite recursion.
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
|
|
const instance = stack.length ? stack[stack.length - 1].component : null;
|
|
const appWarnHandler = instance && instance.appContext.config.warnHandler;
|
|
const trace = getComponentTrace();
|
|
if (appWarnHandler) {
|
|
callWithErrorHandling(appWarnHandler, instance, 11 /* APP_WARN_HANDLER */, [
|
|
msg + args.join(''),
|
|
instance && instance.proxy,
|
|
trace
|
|
.map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`)
|
|
.join('\n'),
|
|
trace
|
|
]);
|
|
}
|
|
else {
|
|
const warnArgs = [`[Vue warn]: ${msg}`, ...args];
|
|
/* istanbul ignore if */
|
|
if (trace.length &&
|
|
// avoid spamming console during tests
|
|
!false) {
|
|
warnArgs.push(`\n`, ...formatTrace(trace));
|
|
}
|
|
console.warn(...warnArgs);
|
|
}
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
|
|
}
|
|
function getComponentTrace() {
|
|
let currentVNode = stack[stack.length - 1];
|
|
if (!currentVNode) {
|
|
return [];
|
|
}
|
|
// we can't just use the stack because it will be incomplete during updates
|
|
// that did not start from the root. Re-construct the parent chain using
|
|
// instance parent pointers.
|
|
const normalizedStack = [];
|
|
while (currentVNode) {
|
|
const last = normalizedStack[0];
|
|
if (last && last.vnode === currentVNode) {
|
|
last.recurseCount++;
|
|
}
|
|
else {
|
|
normalizedStack.push({
|
|
vnode: currentVNode,
|
|
recurseCount: 0
|
|
});
|
|
}
|
|
const parentInstance = currentVNode.component && currentVNode.component.parent;
|
|
currentVNode = parentInstance && parentInstance.vnode;
|
|
}
|
|
return normalizedStack;
|
|
}
|
|
/* istanbul ignore next */
|
|
function formatTrace(trace) {
|
|
const logs = [];
|
|
trace.forEach((entry, i) => {
|
|
logs.push(...(i === 0 ? [] : [`\n`]), ...formatTraceEntry(entry));
|
|
});
|
|
return logs;
|
|
}
|
|
function formatTraceEntry({ vnode, recurseCount }) {
|
|
const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
|
|
const isRoot = vnode.component ? vnode.component.parent == null : false;
|
|
const open = ` at <${formatComponentName(vnode.component, vnode.type, isRoot)}`;
|
|
const close = `>` + postfix;
|
|
return vnode.props
|
|
? [open, ...formatProps(vnode.props), close]
|
|
: [open + close];
|
|
}
|
|
/* istanbul ignore next */
|
|
function formatProps(props) {
|
|
const res = [];
|
|
const keys = Object.keys(props);
|
|
keys.slice(0, 3).forEach(key => {
|
|
res.push(...formatProp(key, props[key]));
|
|
});
|
|
if (keys.length > 3) {
|
|
res.push(` ...`);
|
|
}
|
|
return res;
|
|
}
|
|
/* istanbul ignore next */
|
|
function formatProp(key, value, raw) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) {
|
|
value = JSON.stringify(value);
|
|
return raw ? value : [`${key}=${value}`];
|
|
}
|
|
else if (typeof value === 'number' ||
|
|
typeof value === 'boolean' ||
|
|
value == null) {
|
|
return raw ? value : [`${key}=${value}`];
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) {
|
|
value = formatProp(key, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value.value), true);
|
|
return raw ? value : [`${key}=Ref<`, value, `>`];
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
|
|
return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
|
|
}
|
|
else {
|
|
value = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value);
|
|
return raw ? value : [`${key}=`, value];
|
|
}
|
|
}
|
|
|
|
const ErrorTypeStrings = {
|
|
["bc" /* BEFORE_CREATE */]: 'beforeCreate hook',
|
|
["c" /* CREATED */]: 'created hook',
|
|
["bm" /* BEFORE_MOUNT */]: 'beforeMount hook',
|
|
["m" /* MOUNTED */]: 'mounted hook',
|
|
["bu" /* BEFORE_UPDATE */]: 'beforeUpdate hook',
|
|
["u" /* UPDATED */]: 'updated',
|
|
["bum" /* BEFORE_UNMOUNT */]: 'beforeUnmount hook',
|
|
["um" /* UNMOUNTED */]: 'unmounted hook',
|
|
["a" /* ACTIVATED */]: 'activated hook',
|
|
["da" /* DEACTIVATED */]: 'deactivated hook',
|
|
["ec" /* ERROR_CAPTURED */]: 'errorCaptured hook',
|
|
["rtc" /* RENDER_TRACKED */]: 'renderTracked hook',
|
|
["rtg" /* RENDER_TRIGGERED */]: 'renderTriggered hook',
|
|
[0 /* SETUP_FUNCTION */]: 'setup function',
|
|
[1 /* RENDER_FUNCTION */]: 'render function',
|
|
[2 /* WATCH_GETTER */]: 'watcher getter',
|
|
[3 /* WATCH_CALLBACK */]: 'watcher callback',
|
|
[4 /* WATCH_CLEANUP */]: 'watcher cleanup function',
|
|
[5 /* NATIVE_EVENT_HANDLER */]: 'native event handler',
|
|
[6 /* COMPONENT_EVENT_HANDLER */]: 'component event handler',
|
|
[7 /* VNODE_HOOK */]: 'vnode hook',
|
|
[8 /* DIRECTIVE_HOOK */]: 'directive hook',
|
|
[9 /* TRANSITION_HOOK */]: 'transition hook',
|
|
[10 /* APP_ERROR_HANDLER */]: 'app errorHandler',
|
|
[11 /* APP_WARN_HANDLER */]: 'app warnHandler',
|
|
[12 /* FUNCTION_REF */]: 'ref function',
|
|
[13 /* ASYNC_COMPONENT_LOADER */]: 'async component loader',
|
|
[14 /* SCHEDULER */]: 'scheduler flush. This is likely a Vue internals bug. ' +
|
|
'Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/vue-next'
|
|
};
|
|
function callWithErrorHandling(fn, instance, type, args) {
|
|
let res;
|
|
try {
|
|
res = args ? fn(...args) : fn();
|
|
}
|
|
catch (err) {
|
|
handleError(err, instance, type);
|
|
}
|
|
return res;
|
|
}
|
|
function callWithAsyncErrorHandling(fn, instance, type, args) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(fn)) {
|
|
const res = callWithErrorHandling(fn, instance, type, args);
|
|
if (res && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(res)) {
|
|
res.catch(err => {
|
|
handleError(err, instance, type);
|
|
});
|
|
}
|
|
return res;
|
|
}
|
|
const values = [];
|
|
for (let i = 0; i < fn.length; i++) {
|
|
values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
|
|
}
|
|
return values;
|
|
}
|
|
function handleError(err, instance, type, throwInDev = true) {
|
|
const contextVNode = instance ? instance.vnode : null;
|
|
if (instance) {
|
|
let cur = instance.parent;
|
|
// the exposed instance is the render proxy to keep it consistent with 2.x
|
|
const exposedInstance = instance.proxy;
|
|
// in production the hook receives only the error code
|
|
const errorInfo = ( true) ? ErrorTypeStrings[type] : 0;
|
|
while (cur) {
|
|
const errorCapturedHooks = cur.ec;
|
|
if (errorCapturedHooks) {
|
|
for (let i = 0; i < errorCapturedHooks.length; i++) {
|
|
if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
cur = cur.parent;
|
|
}
|
|
// app-level handling
|
|
const appErrorHandler = instance.appContext.config.errorHandler;
|
|
if (appErrorHandler) {
|
|
callWithErrorHandling(appErrorHandler, null, 10 /* APP_ERROR_HANDLER */, [err, exposedInstance, errorInfo]);
|
|
return;
|
|
}
|
|
}
|
|
logError(err, type, contextVNode, throwInDev);
|
|
}
|
|
function logError(err, type, contextVNode, throwInDev = true) {
|
|
if ((true)) {
|
|
const info = ErrorTypeStrings[type];
|
|
if (contextVNode) {
|
|
pushWarningContext(contextVNode);
|
|
}
|
|
warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
|
|
if (contextVNode) {
|
|
popWarningContext();
|
|
}
|
|
// crash in dev by default so it's more noticeable
|
|
if (throwInDev) {
|
|
throw err;
|
|
}
|
|
else {
|
|
console.error(err);
|
|
}
|
|
}
|
|
else {}
|
|
}
|
|
|
|
let isFlushing = false;
|
|
let isFlushPending = false;
|
|
const queue = [];
|
|
let flushIndex = 0;
|
|
const pendingPreFlushCbs = [];
|
|
let activePreFlushCbs = null;
|
|
let preFlushIndex = 0;
|
|
const pendingPostFlushCbs = [];
|
|
let activePostFlushCbs = null;
|
|
let postFlushIndex = 0;
|
|
const resolvedPromise = Promise.resolve();
|
|
let currentFlushPromise = null;
|
|
let currentPreFlushParentJob = null;
|
|
const RECURSION_LIMIT = 100;
|
|
function nextTick(fn) {
|
|
const p = currentFlushPromise || resolvedPromise;
|
|
return fn ? p.then(this ? fn.bind(this) : fn) : p;
|
|
}
|
|
// #2768
|
|
// Use binary-search to find a suitable position in the queue,
|
|
// so that the queue maintains the increasing order of job's id,
|
|
// which can prevent the job from being skipped and also can avoid repeated patching.
|
|
function findInsertionIndex(job) {
|
|
// the start index should be `flushIndex + 1`
|
|
let start = flushIndex + 1;
|
|
let end = queue.length;
|
|
const jobId = getId(job);
|
|
while (start < end) {
|
|
const middle = (start + end) >>> 1;
|
|
const middleJobId = getId(queue[middle]);
|
|
middleJobId < jobId ? (start = middle + 1) : (end = middle);
|
|
}
|
|
return start;
|
|
}
|
|
function queueJob(job) {
|
|
// the dedupe search uses the startIndex argument of Array.includes()
|
|
// by default the search index includes the current job that is being run
|
|
// so it cannot recursively trigger itself again.
|
|
// if the job is a watch() callback, the search will start with a +1 index to
|
|
// allow it recursively trigger itself - it is the user's responsibility to
|
|
// ensure it doesn't end up in an infinite loop.
|
|
if ((!queue.length ||
|
|
!queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) &&
|
|
job !== currentPreFlushParentJob) {
|
|
const pos = findInsertionIndex(job);
|
|
if (pos > -1) {
|
|
queue.splice(pos, 0, job);
|
|
}
|
|
else {
|
|
queue.push(job);
|
|
}
|
|
queueFlush();
|
|
}
|
|
}
|
|
function queueFlush() {
|
|
if (!isFlushing && !isFlushPending) {
|
|
isFlushPending = true;
|
|
currentFlushPromise = resolvedPromise.then(flushJobs);
|
|
}
|
|
}
|
|
function invalidateJob(job) {
|
|
const i = queue.indexOf(job);
|
|
if (i > -1) {
|
|
queue.splice(i, 1);
|
|
}
|
|
}
|
|
function queueCb(cb, activeQueue, pendingQueue, index) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(cb)) {
|
|
if (!activeQueue ||
|
|
!activeQueue.includes(cb, cb.allowRecurse ? index + 1 : index)) {
|
|
pendingQueue.push(cb);
|
|
}
|
|
}
|
|
else {
|
|
// if cb is an array, it is a component lifecycle hook which can only be
|
|
// triggered by a job, which is already deduped in the main queue, so
|
|
// we can skip duplicate check here to improve perf
|
|
pendingQueue.push(...cb);
|
|
}
|
|
queueFlush();
|
|
}
|
|
function queuePreFlushCb(cb) {
|
|
queueCb(cb, activePreFlushCbs, pendingPreFlushCbs, preFlushIndex);
|
|
}
|
|
function queuePostFlushCb(cb) {
|
|
queueCb(cb, activePostFlushCbs, pendingPostFlushCbs, postFlushIndex);
|
|
}
|
|
function flushPreFlushCbs(seen, parentJob = null) {
|
|
if (pendingPreFlushCbs.length) {
|
|
currentPreFlushParentJob = parentJob;
|
|
activePreFlushCbs = [...new Set(pendingPreFlushCbs)];
|
|
pendingPreFlushCbs.length = 0;
|
|
if ((true)) {
|
|
seen = seen || new Map();
|
|
}
|
|
for (preFlushIndex = 0; preFlushIndex < activePreFlushCbs.length; preFlushIndex++) {
|
|
if ((true)) {
|
|
checkRecursiveUpdates(seen, activePreFlushCbs[preFlushIndex]);
|
|
}
|
|
activePreFlushCbs[preFlushIndex]();
|
|
}
|
|
activePreFlushCbs = null;
|
|
preFlushIndex = 0;
|
|
currentPreFlushParentJob = null;
|
|
// recursively flush until it drains
|
|
flushPreFlushCbs(seen, parentJob);
|
|
}
|
|
}
|
|
function flushPostFlushCbs(seen) {
|
|
if (pendingPostFlushCbs.length) {
|
|
const deduped = [...new Set(pendingPostFlushCbs)];
|
|
pendingPostFlushCbs.length = 0;
|
|
// #1947 already has active queue, nested flushPostFlushCbs call
|
|
if (activePostFlushCbs) {
|
|
activePostFlushCbs.push(...deduped);
|
|
return;
|
|
}
|
|
activePostFlushCbs = deduped;
|
|
if ((true)) {
|
|
seen = seen || new Map();
|
|
}
|
|
activePostFlushCbs.sort((a, b) => getId(a) - getId(b));
|
|
for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
|
|
if ((true)) {
|
|
checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex]);
|
|
}
|
|
activePostFlushCbs[postFlushIndex]();
|
|
}
|
|
activePostFlushCbs = null;
|
|
postFlushIndex = 0;
|
|
}
|
|
}
|
|
const getId = (job) => job.id == null ? Infinity : job.id;
|
|
function flushJobs(seen) {
|
|
isFlushPending = false;
|
|
isFlushing = true;
|
|
if ((true)) {
|
|
seen = seen || new Map();
|
|
}
|
|
flushPreFlushCbs(seen);
|
|
// Sort queue before flush.
|
|
// This ensures that:
|
|
// 1. Components are updated from parent to child. (because parent is always
|
|
// created before the child so its render effect will have smaller
|
|
// priority number)
|
|
// 2. If a component is unmounted during a parent component's update,
|
|
// its update can be skipped.
|
|
queue.sort((a, b) => getId(a) - getId(b));
|
|
try {
|
|
for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
|
|
const job = queue[flushIndex];
|
|
if (job) {
|
|
if ((true)) {
|
|
checkRecursiveUpdates(seen, job);
|
|
}
|
|
callWithErrorHandling(job, null, 14 /* SCHEDULER */);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
flushIndex = 0;
|
|
queue.length = 0;
|
|
flushPostFlushCbs(seen);
|
|
isFlushing = false;
|
|
currentFlushPromise = null;
|
|
// some postFlushCb queued jobs!
|
|
// keep flushing until it drains.
|
|
if (queue.length || pendingPostFlushCbs.length) {
|
|
flushJobs(seen);
|
|
}
|
|
}
|
|
}
|
|
function checkRecursiveUpdates(seen, fn) {
|
|
if (!seen.has(fn)) {
|
|
seen.set(fn, 1);
|
|
}
|
|
else {
|
|
const count = seen.get(fn);
|
|
if (count > RECURSION_LIMIT) {
|
|
throw new Error(`Maximum recursive updates exceeded. ` +
|
|
`This means you have a reactive effect that is mutating its own ` +
|
|
`dependencies and thus recursively triggering itself. Possible sources ` +
|
|
`include component template, render function, updated hook or ` +
|
|
`watcher source function.`);
|
|
}
|
|
else {
|
|
seen.set(fn, count + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* eslint-disable no-restricted-globals */
|
|
let isHmrUpdating = false;
|
|
const hmrDirtyComponents = new Set();
|
|
// Expose the HMR runtime on the global object
|
|
// This makes it entirely tree-shakable without polluting the exports and makes
|
|
// it easier to be used in toolings like vue-loader
|
|
// Note: for a component to be eligible for HMR it also needs the __hmrId option
|
|
// to be set so that its instances can be registered / removed.
|
|
if ((true)) {
|
|
const globalObject = typeof __webpack_require__.g !== 'undefined'
|
|
? __webpack_require__.g
|
|
: typeof self !== 'undefined'
|
|
? self
|
|
: typeof window !== 'undefined'
|
|
? window
|
|
: {};
|
|
globalObject.__VUE_HMR_RUNTIME__ = {
|
|
createRecord: tryWrap(createRecord),
|
|
rerender: tryWrap(rerender),
|
|
reload: tryWrap(reload)
|
|
};
|
|
}
|
|
const map = new Map();
|
|
function registerHMR(instance) {
|
|
const id = instance.type.__hmrId;
|
|
let record = map.get(id);
|
|
if (!record) {
|
|
createRecord(id, instance.type);
|
|
record = map.get(id);
|
|
}
|
|
record.instances.add(instance);
|
|
}
|
|
function unregisterHMR(instance) {
|
|
map.get(instance.type.__hmrId).instances.delete(instance);
|
|
}
|
|
function createRecord(id, component) {
|
|
if (!component) {
|
|
warn(`HMR API usage is out of date.\n` +
|
|
`Please upgrade vue-loader/vite/rollup-plugin-vue or other relevant ` +
|
|
`dependency that handles Vue SFC compilation.`);
|
|
component = {};
|
|
}
|
|
if (map.has(id)) {
|
|
return false;
|
|
}
|
|
map.set(id, {
|
|
component: isClassComponent(component) ? component.__vccOpts : component,
|
|
instances: new Set()
|
|
});
|
|
return true;
|
|
}
|
|
function rerender(id, newRender) {
|
|
const record = map.get(id);
|
|
if (!record)
|
|
return;
|
|
if (newRender)
|
|
record.component.render = newRender;
|
|
// Array.from creates a snapshot which avoids the set being mutated during
|
|
// updates
|
|
Array.from(record.instances).forEach(instance => {
|
|
if (newRender) {
|
|
instance.render = newRender;
|
|
}
|
|
instance.renderCache = [];
|
|
// this flag forces child components with slot content to update
|
|
isHmrUpdating = true;
|
|
instance.update();
|
|
isHmrUpdating = false;
|
|
});
|
|
}
|
|
function reload(id, newComp) {
|
|
const record = map.get(id);
|
|
if (!record)
|
|
return;
|
|
// Array.from creates a snapshot which avoids the set being mutated during
|
|
// updates
|
|
const { component, instances } = record;
|
|
if (!hmrDirtyComponents.has(component)) {
|
|
// 1. Update existing comp definition to match new one
|
|
newComp = isClassComponent(newComp) ? newComp.__vccOpts : newComp;
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(component, newComp);
|
|
for (const key in component) {
|
|
if (!(key in newComp)) {
|
|
delete component[key];
|
|
}
|
|
}
|
|
// 2. Mark component dirty. This forces the renderer to replace the component
|
|
// on patch.
|
|
hmrDirtyComponents.add(component);
|
|
// 3. Make sure to unmark the component after the reload.
|
|
queuePostFlushCb(() => {
|
|
hmrDirtyComponents.delete(component);
|
|
});
|
|
}
|
|
Array.from(instances).forEach(instance => {
|
|
if (instance.parent) {
|
|
// 4. Force the parent instance to re-render. This will cause all updated
|
|
// components to be unmounted and re-mounted. Queue the update so that we
|
|
// don't end up forcing the same parent to re-render multiple times.
|
|
queueJob(instance.parent.update);
|
|
}
|
|
else if (instance.appContext.reload) {
|
|
// root instance mounted via createApp() has a reload method
|
|
instance.appContext.reload();
|
|
}
|
|
else if (typeof window !== 'undefined') {
|
|
// root instance inside tree created via raw render(). Force reload.
|
|
window.location.reload();
|
|
}
|
|
else {
|
|
console.warn('[HMR] Root or manually mounted instance modified. Full reload required.');
|
|
}
|
|
});
|
|
}
|
|
function tryWrap(fn) {
|
|
return (id, arg) => {
|
|
try {
|
|
return fn(id, arg);
|
|
}
|
|
catch (e) {
|
|
console.error(e);
|
|
console.warn(`[HMR] Something went wrong during Vue component hot-reload. ` +
|
|
`Full reload required.`);
|
|
}
|
|
};
|
|
}
|
|
|
|
let devtools;
|
|
function setDevtoolsHook(hook) {
|
|
devtools = hook;
|
|
}
|
|
function devtoolsInitApp(app, version) {
|
|
// TODO queue if devtools is undefined
|
|
if (!devtools)
|
|
return;
|
|
devtools.emit("app:init" /* APP_INIT */, app, version, {
|
|
Fragment,
|
|
Text,
|
|
Comment,
|
|
Static
|
|
});
|
|
}
|
|
function devtoolsUnmountApp(app) {
|
|
if (!devtools)
|
|
return;
|
|
devtools.emit("app:unmount" /* APP_UNMOUNT */, app);
|
|
}
|
|
const devtoolsComponentAdded = /*#__PURE__*/ createDevtoolsComponentHook("component:added" /* COMPONENT_ADDED */);
|
|
const devtoolsComponentUpdated = /*#__PURE__*/ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */);
|
|
const devtoolsComponentRemoved = /*#__PURE__*/ createDevtoolsComponentHook("component:removed" /* COMPONENT_REMOVED */);
|
|
function createDevtoolsComponentHook(hook) {
|
|
return (component) => {
|
|
if (!devtools)
|
|
return;
|
|
devtools.emit(hook, component.appContext.app, component.uid, component.parent ? component.parent.uid : undefined, component);
|
|
};
|
|
}
|
|
function devtoolsComponentEmit(component, event, params) {
|
|
if (!devtools)
|
|
return;
|
|
devtools.emit("component:emit" /* COMPONENT_EMIT */, component.appContext.app, component, event, params);
|
|
}
|
|
|
|
function emit(instance, event, ...rawArgs) {
|
|
const props = instance.vnode.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
if ((true)) {
|
|
const { emitsOptions, propsOptions: [propsOptions] } = instance;
|
|
if (emitsOptions) {
|
|
if (!(event in emitsOptions)) {
|
|
if (!propsOptions || !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event) in propsOptions)) {
|
|
warn(`Component emitted event "${event}" but it is neither declared in ` +
|
|
`the emits option nor as an "${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event)}" prop.`);
|
|
}
|
|
}
|
|
else {
|
|
const validator = emitsOptions[event];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(validator)) {
|
|
const isValid = validator(...rawArgs);
|
|
if (!isValid) {
|
|
warn(`Invalid event arguments: event validation failed for event "${event}".`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let args = rawArgs;
|
|
const isModelListener = event.startsWith('update:');
|
|
// for v-model update:xxx events, apply modifiers on args
|
|
const modelArg = isModelListener && event.slice(7);
|
|
if (modelArg && modelArg in props) {
|
|
const modifiersKey = `${modelArg === 'modelValue' ? 'model' : modelArg}Modifiers`;
|
|
const { number, trim } = props[modifiersKey] || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
if (trim) {
|
|
args = rawArgs.map(a => a.trim());
|
|
}
|
|
else if (number) {
|
|
args = rawArgs.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber);
|
|
}
|
|
}
|
|
if (true) {
|
|
devtoolsComponentEmit(instance, event, args);
|
|
}
|
|
if ((true)) {
|
|
const lowerCaseEvent = event.toLowerCase();
|
|
if (lowerCaseEvent !== event && props[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(lowerCaseEvent)]) {
|
|
warn(`Event "${lowerCaseEvent}" is emitted in component ` +
|
|
`${formatComponentName(instance, instance.type)} but the handler is registered for "${event}". ` +
|
|
`Note that HTML attributes are case-insensitive and you cannot use ` +
|
|
`v-on to listen to camelCase events when using in-DOM templates. ` +
|
|
`You should probably use "${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event)}" instead of "${event}".`);
|
|
}
|
|
}
|
|
// convert handler name to camelCase. See issue #2249
|
|
let handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(event));
|
|
let handler = props[handlerName];
|
|
// for v-model update:xxx events, also trigger kebab-case equivalent
|
|
// for props passed via kebab-case
|
|
if (!handler && isModelListener) {
|
|
handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event));
|
|
handler = props[handlerName];
|
|
}
|
|
if (handler) {
|
|
callWithAsyncErrorHandling(handler, instance, 6 /* COMPONENT_EVENT_HANDLER */, args);
|
|
}
|
|
const onceHandler = props[handlerName + `Once`];
|
|
if (onceHandler) {
|
|
if (!instance.emitted) {
|
|
(instance.emitted = {})[handlerName] = true;
|
|
}
|
|
else if (instance.emitted[handlerName]) {
|
|
return;
|
|
}
|
|
callWithAsyncErrorHandling(onceHandler, instance, 6 /* COMPONENT_EVENT_HANDLER */, args);
|
|
}
|
|
}
|
|
function normalizeEmitsOptions(comp, appContext, asMixin = false) {
|
|
if (!appContext.deopt && comp.__emits !== undefined) {
|
|
return comp.__emits;
|
|
}
|
|
const raw = comp.emits;
|
|
let normalized = {};
|
|
// apply mixin/extends props
|
|
let hasExtends = false;
|
|
if (__VUE_OPTIONS_API__ && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {
|
|
const extendEmits = (raw) => {
|
|
hasExtends = true;
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, normalizeEmitsOptions(raw, appContext, true));
|
|
};
|
|
if (!asMixin && appContext.mixins.length) {
|
|
appContext.mixins.forEach(extendEmits);
|
|
}
|
|
if (comp.extends) {
|
|
extendEmits(comp.extends);
|
|
}
|
|
if (comp.mixins) {
|
|
comp.mixins.forEach(extendEmits);
|
|
}
|
|
}
|
|
if (!raw && !hasExtends) {
|
|
return (comp.__emits = null);
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
|
|
raw.forEach(key => (normalized[key] = null));
|
|
}
|
|
else {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, raw);
|
|
}
|
|
return (comp.__emits = normalized);
|
|
}
|
|
// Check if an incoming prop key is a declared emit event listener.
|
|
// e.g. With `emits: { click: null }`, props named `onClick` and `onclick` are
|
|
// both considered matched listeners.
|
|
function isEmitListener(options, key) {
|
|
if (!options || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
|
|
return false;
|
|
}
|
|
key = key.slice(2).replace(/Once$/, '');
|
|
return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key[0].toLowerCase() + key.slice(1)) ||
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) ||
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key));
|
|
}
|
|
|
|
/**
|
|
* mark the current rendering instance for asset resolution (e.g.
|
|
* resolveComponent, resolveDirective) during render
|
|
*/
|
|
let currentRenderingInstance = null;
|
|
function setCurrentRenderingInstance(instance) {
|
|
currentRenderingInstance = instance;
|
|
}
|
|
/**
|
|
* dev only flag to track whether $attrs was used during render.
|
|
* If $attrs was used during render then the warning for failed attrs
|
|
* fallthrough can be suppressed.
|
|
*/
|
|
let accessedAttrs = false;
|
|
function markAttrsAccessed() {
|
|
accessedAttrs = true;
|
|
}
|
|
function renderComponentRoot(instance) {
|
|
const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, data, setupState, ctx } = instance;
|
|
let result;
|
|
currentRenderingInstance = instance;
|
|
if ((true)) {
|
|
accessedAttrs = false;
|
|
}
|
|
try {
|
|
let fallthroughAttrs;
|
|
if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) {
|
|
// withProxy is a proxy with a different `has` trap only for
|
|
// runtime-compiled render functions using `with` block.
|
|
const proxyToUse = withProxy || proxy;
|
|
result = normalizeVNode(render.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx));
|
|
fallthroughAttrs = attrs;
|
|
}
|
|
else {
|
|
// functional
|
|
const render = Component;
|
|
// in dev, mark attrs accessed if optional props (attrs === props)
|
|
if (( true) && attrs === props) {
|
|
markAttrsAccessed();
|
|
}
|
|
result = normalizeVNode(render.length > 1
|
|
? render(props, ( true)
|
|
? {
|
|
get attrs() {
|
|
markAttrsAccessed();
|
|
return attrs;
|
|
},
|
|
slots,
|
|
emit
|
|
}
|
|
: 0)
|
|
: render(props, null /* we know it doesn't need it */));
|
|
fallthroughAttrs = Component.props
|
|
? attrs
|
|
: getFunctionalFallthrough(attrs);
|
|
}
|
|
// attr merging
|
|
// in dev mode, comments are preserved, and it's possible for a template
|
|
// to have comments along side the root element which makes it a fragment
|
|
let root = result;
|
|
let setRoot = undefined;
|
|
if (( true) &&
|
|
result.patchFlag > 0 &&
|
|
result.patchFlag & 2048 /* DEV_ROOT_FRAGMENT */) {
|
|
;
|
|
[root, setRoot] = getChildRoot(result);
|
|
}
|
|
if (Component.inheritAttrs !== false && fallthroughAttrs) {
|
|
const keys = Object.keys(fallthroughAttrs);
|
|
const { shapeFlag } = root;
|
|
if (keys.length) {
|
|
if (shapeFlag & 1 /* ELEMENT */ ||
|
|
shapeFlag & 6 /* COMPONENT */) {
|
|
if (propsOptions && keys.some(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)) {
|
|
// If a v-model listener (onUpdate:xxx) has a corresponding declared
|
|
// prop, it indicates this component expects to handle v-model and
|
|
// it should not fallthrough.
|
|
// related: #1543, #1643, #1989
|
|
fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions);
|
|
}
|
|
root = cloneVNode(root, fallthroughAttrs);
|
|
}
|
|
else if (( true) && !accessedAttrs && root.type !== Comment) {
|
|
const allAttrs = Object.keys(attrs);
|
|
const eventAttrs = [];
|
|
const extraAttrs = [];
|
|
for (let i = 0, l = allAttrs.length; i < l; i++) {
|
|
const key = allAttrs[i];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
|
|
// ignore v-model handlers when they fail to fallthrough
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) {
|
|
// remove `on`, lowercase first letter to reflect event casing
|
|
// accurately
|
|
eventAttrs.push(key[2].toLowerCase() + key.slice(3));
|
|
}
|
|
}
|
|
else {
|
|
extraAttrs.push(key);
|
|
}
|
|
}
|
|
if (extraAttrs.length) {
|
|
warn(`Extraneous non-props attributes (` +
|
|
`${extraAttrs.join(', ')}) ` +
|
|
`were passed to component but could not be automatically inherited ` +
|
|
`because component renders fragment or text root nodes.`);
|
|
}
|
|
if (eventAttrs.length) {
|
|
warn(`Extraneous non-emits event listeners (` +
|
|
`${eventAttrs.join(', ')}) ` +
|
|
`were passed to component but could not be automatically inherited ` +
|
|
`because component renders fragment or text root nodes. ` +
|
|
`If the listener is intended to be a component custom event listener only, ` +
|
|
`declare it using the "emits" option.`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// inherit directives
|
|
if (vnode.dirs) {
|
|
if (( true) && !isElementRoot(root)) {
|
|
warn(`Runtime directive used on component with non-element root node. ` +
|
|
`The directives will not function as intended.`);
|
|
}
|
|
root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
|
|
}
|
|
// inherit transition data
|
|
if (vnode.transition) {
|
|
if (( true) && !isElementRoot(root)) {
|
|
warn(`Component inside <Transition> renders non-element root node ` +
|
|
`that cannot be animated.`);
|
|
}
|
|
root.transition = vnode.transition;
|
|
}
|
|
if (( true) && setRoot) {
|
|
setRoot(root);
|
|
}
|
|
else {
|
|
result = root;
|
|
}
|
|
}
|
|
catch (err) {
|
|
handleError(err, instance, 1 /* RENDER_FUNCTION */);
|
|
result = createVNode(Comment);
|
|
}
|
|
currentRenderingInstance = null;
|
|
return result;
|
|
}
|
|
/**
|
|
* dev only
|
|
* In dev mode, template root level comments are rendered, which turns the
|
|
* template into a fragment root, but we need to locate the single element
|
|
* root for attrs and scope id processing.
|
|
*/
|
|
const getChildRoot = (vnode) => {
|
|
const rawChildren = vnode.children;
|
|
const dynamicChildren = vnode.dynamicChildren;
|
|
const childRoot = filterSingleRoot(rawChildren);
|
|
if (!childRoot) {
|
|
return [vnode, undefined];
|
|
}
|
|
const index = rawChildren.indexOf(childRoot);
|
|
const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;
|
|
const setRoot = (updatedRoot) => {
|
|
rawChildren[index] = updatedRoot;
|
|
if (dynamicChildren) {
|
|
if (dynamicIndex > -1) {
|
|
dynamicChildren[dynamicIndex] = updatedRoot;
|
|
}
|
|
else if (updatedRoot.patchFlag > 0) {
|
|
vnode.dynamicChildren = [...dynamicChildren, updatedRoot];
|
|
}
|
|
}
|
|
};
|
|
return [normalizeVNode(childRoot), setRoot];
|
|
};
|
|
function filterSingleRoot(children) {
|
|
let singleRoot;
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
if (isVNode(child)) {
|
|
// ignore user comment
|
|
if (child.type !== Comment || child.children === 'v-if') {
|
|
if (singleRoot) {
|
|
// has more than 1 non-comment child, return now
|
|
return;
|
|
}
|
|
else {
|
|
singleRoot = child;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
return singleRoot;
|
|
}
|
|
const getFunctionalFallthrough = (attrs) => {
|
|
let res;
|
|
for (const key in attrs) {
|
|
if (key === 'class' || key === 'style' || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
|
|
(res || (res = {}))[key] = attrs[key];
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
const filterModelListeners = (attrs, props) => {
|
|
const res = {};
|
|
for (const key in attrs) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key) || !(key.slice(9) in props)) {
|
|
res[key] = attrs[key];
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
const isElementRoot = (vnode) => {
|
|
return (vnode.shapeFlag & 6 /* COMPONENT */ ||
|
|
vnode.shapeFlag & 1 /* ELEMENT */ ||
|
|
vnode.type === Comment // potential v-if branch switch
|
|
);
|
|
};
|
|
function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
|
|
const { props: prevProps, children: prevChildren, component } = prevVNode;
|
|
const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
|
|
const emits = component.emitsOptions;
|
|
// Parent component's render function was hot-updated. Since this may have
|
|
// caused the child component's slots content to have changed, we need to
|
|
// force the child to update as well.
|
|
if (( true) && (prevChildren || nextChildren) && isHmrUpdating) {
|
|
return true;
|
|
}
|
|
// force child update for runtime directive or transition on component vnode.
|
|
if (nextVNode.dirs || nextVNode.transition) {
|
|
return true;
|
|
}
|
|
if (optimized && patchFlag >= 0) {
|
|
if (patchFlag & 1024 /* DYNAMIC_SLOTS */) {
|
|
// slot content that references values that might have changed,
|
|
// e.g. in a v-for
|
|
return true;
|
|
}
|
|
if (patchFlag & 16 /* FULL_PROPS */) {
|
|
if (!prevProps) {
|
|
return !!nextProps;
|
|
}
|
|
// presence of this flag indicates props are always non-null
|
|
return hasPropsChanged(prevProps, nextProps, emits);
|
|
}
|
|
else if (patchFlag & 8 /* PROPS */) {
|
|
const dynamicProps = nextVNode.dynamicProps;
|
|
for (let i = 0; i < dynamicProps.length; i++) {
|
|
const key = dynamicProps[i];
|
|
if (nextProps[key] !== prevProps[key] &&
|
|
!isEmitListener(emits, key)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// this path is only taken by manually written render functions
|
|
// so presence of any children leads to a forced update
|
|
if (prevChildren || nextChildren) {
|
|
if (!nextChildren || !nextChildren.$stable) {
|
|
return true;
|
|
}
|
|
}
|
|
if (prevProps === nextProps) {
|
|
return false;
|
|
}
|
|
if (!prevProps) {
|
|
return !!nextProps;
|
|
}
|
|
if (!nextProps) {
|
|
return true;
|
|
}
|
|
return hasPropsChanged(prevProps, nextProps, emits);
|
|
}
|
|
return false;
|
|
}
|
|
function hasPropsChanged(prevProps, nextProps, emitsOptions) {
|
|
const nextKeys = Object.keys(nextProps);
|
|
if (nextKeys.length !== Object.keys(prevProps).length) {
|
|
return true;
|
|
}
|
|
for (let i = 0; i < nextKeys.length; i++) {
|
|
const key = nextKeys[i];
|
|
if (nextProps[key] !== prevProps[key] &&
|
|
!isEmitListener(emitsOptions, key)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function updateHOCHostEl({ vnode, parent }, el // HostNode
|
|
) {
|
|
while (parent && parent.subTree === vnode) {
|
|
(vnode = parent.vnode).el = el;
|
|
parent = parent.parent;
|
|
}
|
|
}
|
|
|
|
const isSuspense = (type) => type.__isSuspense;
|
|
// Suspense exposes a component-like API, and is treated like a component
|
|
// in the compiler, but internally it's a special built-in type that hooks
|
|
// directly into the renderer.
|
|
const SuspenseImpl = {
|
|
// In order to make Suspense tree-shakable, we need to avoid importing it
|
|
// directly in the renderer. The renderer checks for the __isSuspense flag
|
|
// on a vnode's type and calls the `process` method, passing in renderer
|
|
// internals.
|
|
__isSuspense: true,
|
|
process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized,
|
|
// platform-specific impl passed from renderer
|
|
rendererInternals) {
|
|
if (n1 == null) {
|
|
mountSuspense(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, rendererInternals);
|
|
}
|
|
else {
|
|
patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, rendererInternals);
|
|
}
|
|
},
|
|
hydrate: hydrateSuspense,
|
|
create: createSuspenseBoundary
|
|
};
|
|
// Force-casted public typing for h and TSX props inference
|
|
const Suspense = (SuspenseImpl
|
|
);
|
|
function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, optimized, rendererInternals) {
|
|
const { p: patch, o: { createElement } } = rendererInternals;
|
|
const hiddenContainer = createElement('div');
|
|
const suspense = (vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, optimized, rendererInternals));
|
|
// start mounting the content subtree in an off-dom container
|
|
patch(null, (suspense.pendingBranch = vnode.ssContent), hiddenContainer, null, parentComponent, suspense, isSVG);
|
|
// now check if we have encountered any async deps
|
|
if (suspense.deps > 0) {
|
|
// has async
|
|
// mount the fallback tree
|
|
patch(null, vnode.ssFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context
|
|
isSVG);
|
|
setActiveBranch(suspense, vnode.ssFallback);
|
|
}
|
|
else {
|
|
// Suspense has no async deps. Just resolve.
|
|
suspense.resolve();
|
|
}
|
|
}
|
|
function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, { p: patch, um: unmount, o: { createElement } }) {
|
|
const suspense = (n2.suspense = n1.suspense);
|
|
suspense.vnode = n2;
|
|
n2.el = n1.el;
|
|
const newBranch = n2.ssContent;
|
|
const newFallback = n2.ssFallback;
|
|
const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;
|
|
if (pendingBranch) {
|
|
suspense.pendingBranch = newBranch;
|
|
if (isSameVNodeType(newBranch, pendingBranch)) {
|
|
// same root type but content may have changed.
|
|
patch(pendingBranch, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
}
|
|
else if (isInFallback) {
|
|
patch(activeBranch, newFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context
|
|
isSVG);
|
|
setActiveBranch(suspense, newFallback);
|
|
}
|
|
}
|
|
else {
|
|
// toggled before pending tree is resolved
|
|
suspense.pendingId++;
|
|
if (isHydrating) {
|
|
// if toggled before hydration is finished, the current DOM tree is
|
|
// no longer valid. set it as the active branch so it will be unmounted
|
|
// when resolved
|
|
suspense.isHydrating = false;
|
|
suspense.activeBranch = pendingBranch;
|
|
}
|
|
else {
|
|
unmount(pendingBranch, parentComponent, suspense);
|
|
}
|
|
// increment pending ID. this is used to invalidate async callbacks
|
|
// reset suspense state
|
|
suspense.deps = 0;
|
|
// discard effects from pending branch
|
|
suspense.effects.length = 0;
|
|
// discard previous container
|
|
suspense.hiddenContainer = createElement('div');
|
|
if (isInFallback) {
|
|
// already in fallback state
|
|
patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
}
|
|
else {
|
|
patch(activeBranch, newFallback, container, anchor, parentComponent, null, // fallback tree will not have suspense context
|
|
isSVG);
|
|
setActiveBranch(suspense, newFallback);
|
|
}
|
|
}
|
|
else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
|
|
// toggled "back" to current active branch
|
|
patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG);
|
|
// force resolve
|
|
suspense.resolve(true);
|
|
}
|
|
else {
|
|
// switched to a 3rd branch
|
|
patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
|
|
if (suspense.deps <= 0) {
|
|
suspense.resolve();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {
|
|
// root did not change, just normal patch
|
|
patch(activeBranch, newBranch, container, anchor, parentComponent, suspense, isSVG);
|
|
setActiveBranch(suspense, newBranch);
|
|
}
|
|
else {
|
|
// root node toggled
|
|
// invoke @pending event
|
|
const onPending = n2.props && n2.props.onPending;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(onPending)) {
|
|
onPending();
|
|
}
|
|
// mount pending branch in off-dom container
|
|
suspense.pendingBranch = newBranch;
|
|
suspense.pendingId++;
|
|
patch(null, newBranch, suspense.hiddenContainer, null, parentComponent, suspense, isSVG);
|
|
if (suspense.deps <= 0) {
|
|
// incoming branch has no async deps, resolve now.
|
|
suspense.resolve();
|
|
}
|
|
else {
|
|
const { timeout, pendingId } = suspense;
|
|
if (timeout > 0) {
|
|
setTimeout(() => {
|
|
if (suspense.pendingId === pendingId) {
|
|
suspense.fallback(newFallback);
|
|
}
|
|
}, timeout);
|
|
}
|
|
else if (timeout === 0) {
|
|
suspense.fallback(newFallback);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let hasWarned = false;
|
|
function createSuspenseBoundary(vnode, parent, parentComponent, container, hiddenContainer, anchor, isSVG, optimized, rendererInternals, isHydrating = false) {
|
|
/* istanbul ignore if */
|
|
if ( true && !hasWarned) {
|
|
hasWarned = true;
|
|
// @ts-ignore `console.info` cannot be null error
|
|
console[console.info ? 'info' : 'log'](`<Suspense> is an experimental feature and its API will likely change.`);
|
|
}
|
|
const { p: patch, m: move, um: unmount, n: next, o: { parentNode, remove } } = rendererInternals;
|
|
const timeout = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(vnode.props && vnode.props.timeout);
|
|
const suspense = {
|
|
vnode,
|
|
parent,
|
|
parentComponent,
|
|
isSVG,
|
|
container,
|
|
hiddenContainer,
|
|
anchor,
|
|
deps: 0,
|
|
pendingId: 0,
|
|
timeout: typeof timeout === 'number' ? timeout : -1,
|
|
activeBranch: null,
|
|
pendingBranch: null,
|
|
isInFallback: true,
|
|
isHydrating,
|
|
isUnmounted: false,
|
|
effects: [],
|
|
resolve(resume = false) {
|
|
if ((true)) {
|
|
if (!resume && !suspense.pendingBranch) {
|
|
throw new Error(`suspense.resolve() is called without a pending branch.`);
|
|
}
|
|
if (suspense.isUnmounted) {
|
|
throw new Error(`suspense.resolve() is called on an already unmounted suspense boundary.`);
|
|
}
|
|
}
|
|
const { vnode, activeBranch, pendingBranch, pendingId, effects, parentComponent, container } = suspense;
|
|
if (suspense.isHydrating) {
|
|
suspense.isHydrating = false;
|
|
}
|
|
else if (!resume) {
|
|
const delayEnter = activeBranch &&
|
|
pendingBranch.transition &&
|
|
pendingBranch.transition.mode === 'out-in';
|
|
if (delayEnter) {
|
|
activeBranch.transition.afterLeave = () => {
|
|
if (pendingId === suspense.pendingId) {
|
|
move(pendingBranch, container, anchor, 0 /* ENTER */);
|
|
}
|
|
};
|
|
}
|
|
// this is initial anchor on mount
|
|
let { anchor } = suspense;
|
|
// unmount current active tree
|
|
if (activeBranch) {
|
|
// if the fallback tree was mounted, it may have been moved
|
|
// as part of a parent suspense. get the latest anchor for insertion
|
|
anchor = next(activeBranch);
|
|
unmount(activeBranch, parentComponent, suspense, true);
|
|
}
|
|
if (!delayEnter) {
|
|
// move content from off-dom container to actual container
|
|
move(pendingBranch, container, anchor, 0 /* ENTER */);
|
|
}
|
|
}
|
|
setActiveBranch(suspense, pendingBranch);
|
|
suspense.pendingBranch = null;
|
|
suspense.isInFallback = false;
|
|
// flush buffered effects
|
|
// check if there is a pending parent suspense
|
|
let parent = suspense.parent;
|
|
let hasUnresolvedAncestor = false;
|
|
while (parent) {
|
|
if (parent.pendingBranch) {
|
|
// found a pending parent suspense, merge buffered post jobs
|
|
// into that parent
|
|
parent.effects.push(...effects);
|
|
hasUnresolvedAncestor = true;
|
|
break;
|
|
}
|
|
parent = parent.parent;
|
|
}
|
|
// no pending parent suspense, flush all jobs
|
|
if (!hasUnresolvedAncestor) {
|
|
queuePostFlushCb(effects);
|
|
}
|
|
suspense.effects = [];
|
|
// invoke @resolve event
|
|
const onResolve = vnode.props && vnode.props.onResolve;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(onResolve)) {
|
|
onResolve();
|
|
}
|
|
},
|
|
fallback(fallbackVNode) {
|
|
if (!suspense.pendingBranch) {
|
|
return;
|
|
}
|
|
const { vnode, activeBranch, parentComponent, container, isSVG } = suspense;
|
|
// invoke @fallback event
|
|
const onFallback = vnode.props && vnode.props.onFallback;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(onFallback)) {
|
|
onFallback();
|
|
}
|
|
const anchor = next(activeBranch);
|
|
const mountFallback = () => {
|
|
if (!suspense.isInFallback) {
|
|
return;
|
|
}
|
|
// mount the fallback tree
|
|
patch(null, fallbackVNode, container, anchor, parentComponent, null, // fallback tree will not have suspense context
|
|
isSVG);
|
|
setActiveBranch(suspense, fallbackVNode);
|
|
};
|
|
const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === 'out-in';
|
|
if (delayEnter) {
|
|
activeBranch.transition.afterLeave = mountFallback;
|
|
}
|
|
// unmount current active branch
|
|
unmount(activeBranch, parentComponent, null, // no suspense so unmount hooks fire now
|
|
true // shouldRemove
|
|
);
|
|
suspense.isInFallback = true;
|
|
if (!delayEnter) {
|
|
mountFallback();
|
|
}
|
|
},
|
|
move(container, anchor, type) {
|
|
suspense.activeBranch &&
|
|
move(suspense.activeBranch, container, anchor, type);
|
|
suspense.container = container;
|
|
},
|
|
next() {
|
|
return suspense.activeBranch && next(suspense.activeBranch);
|
|
},
|
|
registerDep(instance, setupRenderEffect) {
|
|
const isInPendingSuspense = !!suspense.pendingBranch;
|
|
if (isInPendingSuspense) {
|
|
suspense.deps++;
|
|
}
|
|
const hydratedEl = instance.vnode.el;
|
|
instance
|
|
.asyncDep.catch(err => {
|
|
handleError(err, instance, 0 /* SETUP_FUNCTION */);
|
|
})
|
|
.then(asyncSetupResult => {
|
|
// retry when the setup() promise resolves.
|
|
// component may have been unmounted before resolve.
|
|
if (instance.isUnmounted ||
|
|
suspense.isUnmounted ||
|
|
suspense.pendingId !== instance.suspenseId) {
|
|
return;
|
|
}
|
|
// retry from this component
|
|
instance.asyncResolved = true;
|
|
const { vnode } = instance;
|
|
if ((true)) {
|
|
pushWarningContext(vnode);
|
|
}
|
|
handleSetupResult(instance, asyncSetupResult);
|
|
if (hydratedEl) {
|
|
// vnode may have been replaced if an update happened before the
|
|
// async dep is resolved.
|
|
vnode.el = hydratedEl;
|
|
}
|
|
const placeholder = !hydratedEl && instance.subTree.el;
|
|
setupRenderEffect(instance, vnode,
|
|
// component may have been moved before resolve.
|
|
// if this is not a hydration, instance.subTree will be the comment
|
|
// placeholder.
|
|
parentNode(hydratedEl || instance.subTree.el),
|
|
// anchor will not be used if this is hydration, so only need to
|
|
// consider the comment placeholder case.
|
|
hydratedEl ? null : next(instance.subTree), suspense, isSVG, optimized);
|
|
if (placeholder) {
|
|
remove(placeholder);
|
|
}
|
|
updateHOCHostEl(instance, vnode.el);
|
|
if ((true)) {
|
|
popWarningContext();
|
|
}
|
|
// only decrease deps count if suspense is not already resolved
|
|
if (isInPendingSuspense && --suspense.deps === 0) {
|
|
suspense.resolve();
|
|
}
|
|
});
|
|
},
|
|
unmount(parentSuspense, doRemove) {
|
|
suspense.isUnmounted = true;
|
|
if (suspense.activeBranch) {
|
|
unmount(suspense.activeBranch, parentComponent, parentSuspense, doRemove);
|
|
}
|
|
if (suspense.pendingBranch) {
|
|
unmount(suspense.pendingBranch, parentComponent, parentSuspense, doRemove);
|
|
}
|
|
}
|
|
};
|
|
return suspense;
|
|
}
|
|
function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, optimized, rendererInternals, hydrateNode) {
|
|
/* eslint-disable no-restricted-globals */
|
|
const suspense = (vnode.suspense = createSuspenseBoundary(vnode, parentSuspense, parentComponent, node.parentNode, document.createElement('div'), null, isSVG, optimized, rendererInternals, true /* hydrating */));
|
|
// there are two possible scenarios for server-rendered suspense:
|
|
// - success: ssr content should be fully resolved
|
|
// - failure: ssr content should be the fallback branch.
|
|
// however, on the client we don't really know if it has failed or not
|
|
// attempt to hydrate the DOM assuming it has succeeded, but we still
|
|
// need to construct a suspense boundary first
|
|
const result = hydrateNode(node, (suspense.pendingBranch = vnode.ssContent), parentComponent, suspense, optimized);
|
|
if (suspense.deps === 0) {
|
|
suspense.resolve();
|
|
}
|
|
return result;
|
|
/* eslint-enable no-restricted-globals */
|
|
}
|
|
function normalizeSuspenseChildren(vnode) {
|
|
const { shapeFlag, children } = vnode;
|
|
let content;
|
|
let fallback;
|
|
if (shapeFlag & 32 /* SLOTS_CHILDREN */) {
|
|
content = normalizeSuspenseSlot(children.default);
|
|
fallback = normalizeSuspenseSlot(children.fallback);
|
|
}
|
|
else {
|
|
content = normalizeSuspenseSlot(children);
|
|
fallback = normalizeVNode(null);
|
|
}
|
|
return {
|
|
content,
|
|
fallback
|
|
};
|
|
}
|
|
function normalizeSuspenseSlot(s) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) {
|
|
s = s();
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(s)) {
|
|
const singleChild = filterSingleRoot(s);
|
|
if (( true) && !singleChild) {
|
|
warn(`<Suspense> slots expect a single root node.`);
|
|
}
|
|
s = singleChild;
|
|
}
|
|
return normalizeVNode(s);
|
|
}
|
|
function queueEffectWithSuspense(fn, suspense) {
|
|
if (suspense && suspense.pendingBranch) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn)) {
|
|
suspense.effects.push(...fn);
|
|
}
|
|
else {
|
|
suspense.effects.push(fn);
|
|
}
|
|
}
|
|
else {
|
|
queuePostFlushCb(fn);
|
|
}
|
|
}
|
|
function setActiveBranch(suspense, branch) {
|
|
suspense.activeBranch = branch;
|
|
const { vnode, parentComponent } = suspense;
|
|
const el = (vnode.el = branch.el);
|
|
// in case suspense is the root node of a component,
|
|
// recursively update the HOC el
|
|
if (parentComponent && parentComponent.subTree === vnode) {
|
|
parentComponent.vnode.el = el;
|
|
updateHOCHostEl(parentComponent, el);
|
|
}
|
|
}
|
|
|
|
let isRenderingCompiledSlot = 0;
|
|
const setCompiledSlotRendering = (n) => (isRenderingCompiledSlot += n);
|
|
/**
|
|
* Compiler runtime helper for rendering `<slot/>`
|
|
* @private
|
|
*/
|
|
function renderSlot(slots, name, props = {},
|
|
// this is not a user-facing function, so the fallback is always generated by
|
|
// the compiler and guaranteed to be a function returning an array
|
|
fallback) {
|
|
let slot = slots[name];
|
|
if (( true) && slot && slot.length > 1) {
|
|
warn(`SSR-optimized slot function detected in a non-SSR-optimized render ` +
|
|
`function. You need to mark this component with $dynamic-slots in the ` +
|
|
`parent template.`);
|
|
slot = () => [];
|
|
}
|
|
// a compiled slot disables block tracking by default to avoid manual
|
|
// invocation interfering with template-based block tracking, but in
|
|
// `renderSlot` we can be sure that it's template-based so we can force
|
|
// enable it.
|
|
isRenderingCompiledSlot++;
|
|
openBlock();
|
|
const validSlotContent = slot && ensureValidVNode(slot(props));
|
|
const rendered = createBlock(Fragment, { key: props.key || `_${name}` }, validSlotContent || (fallback ? fallback() : []), validSlotContent && slots._ === 1 /* STABLE */
|
|
? 64 /* STABLE_FRAGMENT */
|
|
: -2 /* BAIL */);
|
|
isRenderingCompiledSlot--;
|
|
return rendered;
|
|
}
|
|
function ensureValidVNode(vnodes) {
|
|
return vnodes.some(child => {
|
|
if (!isVNode(child))
|
|
return true;
|
|
if (child.type === Comment)
|
|
return false;
|
|
if (child.type === Fragment &&
|
|
!ensureValidVNode(child.children))
|
|
return false;
|
|
return true;
|
|
})
|
|
? vnodes
|
|
: null;
|
|
}
|
|
|
|
/**
|
|
* Wrap a slot function to memoize current rendering instance
|
|
* @private
|
|
*/
|
|
function withCtx(fn, ctx = currentRenderingInstance) {
|
|
if (!ctx)
|
|
return fn;
|
|
const renderFnWithContext = (...args) => {
|
|
// If a user calls a compiled slot inside a template expression (#1745), it
|
|
// can mess up block tracking, so by default we need to push a null block to
|
|
// avoid that. This isn't necessary if rendering a compiled `<slot>`.
|
|
if (!isRenderingCompiledSlot) {
|
|
openBlock(true /* null block that disables tracking */);
|
|
}
|
|
const owner = currentRenderingInstance;
|
|
setCurrentRenderingInstance(ctx);
|
|
const res = fn(...args);
|
|
setCurrentRenderingInstance(owner);
|
|
if (!isRenderingCompiledSlot) {
|
|
closeBlock();
|
|
}
|
|
return res;
|
|
};
|
|
renderFnWithContext._c = true;
|
|
return renderFnWithContext;
|
|
}
|
|
|
|
// SFC scoped style ID management.
|
|
let currentScopeId = null;
|
|
const scopeIdStack = [];
|
|
/**
|
|
* @private
|
|
*/
|
|
function pushScopeId(id) {
|
|
scopeIdStack.push((currentScopeId = id));
|
|
}
|
|
/**
|
|
* @private
|
|
*/
|
|
function popScopeId() {
|
|
scopeIdStack.pop();
|
|
currentScopeId = scopeIdStack[scopeIdStack.length - 1] || null;
|
|
}
|
|
/**
|
|
* @private
|
|
*/
|
|
function withScopeId(id) {
|
|
return ((fn) => withCtx(function () {
|
|
pushScopeId(id);
|
|
const res = fn.apply(this, arguments);
|
|
popScopeId();
|
|
return res;
|
|
}));
|
|
}
|
|
|
|
function initProps(instance, rawProps, isStateful, // result of bitwise flag comparison
|
|
isSSR = false) {
|
|
const props = {};
|
|
const attrs = {};
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(attrs, InternalObjectKey, 1);
|
|
setFullProps(instance, rawProps, props, attrs);
|
|
// validation
|
|
if ((true)) {
|
|
validateProps(props, instance);
|
|
}
|
|
if (isStateful) {
|
|
// stateful
|
|
instance.props = isSSR ? props : (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive)(props);
|
|
}
|
|
else {
|
|
if (!instance.type.props) {
|
|
// functional w/ optional props, props === attrs
|
|
instance.props = attrs;
|
|
}
|
|
else {
|
|
// functional w/ declared props
|
|
instance.props = props;
|
|
}
|
|
}
|
|
instance.attrs = attrs;
|
|
}
|
|
function updateProps(instance, rawProps, rawPrevProps, optimized) {
|
|
const { props, attrs, vnode: { patchFlag } } = instance;
|
|
const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
|
|
const [options] = instance.propsOptions;
|
|
if (
|
|
// always force full diff in dev
|
|
// - #1942 if hmr is enabled with sfc component
|
|
// - vite#872 non-sfc component used by sfc component
|
|
!(( true) &&
|
|
(instance.type.__hmrId ||
|
|
(instance.parent && instance.parent.type.__hmrId))) &&
|
|
(optimized || patchFlag > 0) &&
|
|
!(patchFlag & 16 /* FULL_PROPS */)) {
|
|
if (patchFlag & 8 /* PROPS */) {
|
|
// Compiler-generated props & no keys change, just set the updated
|
|
// the props.
|
|
const propsToUpdate = instance.vnode.dynamicProps;
|
|
for (let i = 0; i < propsToUpdate.length; i++) {
|
|
const key = propsToUpdate[i];
|
|
// PROPS flag guarantees rawProps to be non-null
|
|
const value = rawProps[key];
|
|
if (options) {
|
|
// attr / props separation was done on init and will be consistent
|
|
// in this code path, so just check if attrs have it.
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(attrs, key)) {
|
|
attrs[key] = value;
|
|
}
|
|
else {
|
|
const camelizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);
|
|
props[camelizedKey] = resolvePropValue(options, rawCurrentProps, camelizedKey, value, instance);
|
|
}
|
|
}
|
|
else {
|
|
attrs[key] = value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// full props update.
|
|
setFullProps(instance, rawProps, props, attrs);
|
|
// in case of dynamic props, check if we need to delete keys from
|
|
// the props object
|
|
let kebabKey;
|
|
for (const key in rawCurrentProps) {
|
|
if (!rawProps ||
|
|
// for camelCase
|
|
(!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) &&
|
|
// it's possible the original props was passed in as kebab-case
|
|
// and converted to camelCase (#955)
|
|
((kebabKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) === key || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, kebabKey)))) {
|
|
if (options) {
|
|
if (rawPrevProps &&
|
|
// for camelCase
|
|
(rawPrevProps[key] !== undefined ||
|
|
// for kebab-case
|
|
rawPrevProps[kebabKey] !== undefined)) {
|
|
props[key] = resolvePropValue(options, rawProps || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, key, undefined, instance);
|
|
}
|
|
}
|
|
else {
|
|
delete props[key];
|
|
}
|
|
}
|
|
}
|
|
// in the case of functional component w/o props declaration, props and
|
|
// attrs point to the same object so it should already have been updated.
|
|
if (attrs !== rawCurrentProps) {
|
|
for (const key in attrs) {
|
|
if (!rawProps || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key)) {
|
|
delete attrs[key];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// trigger updates for $attrs in case it's used in component slots
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.trigger)(instance, "set" /* SET */, '$attrs');
|
|
if (( true) && rawProps) {
|
|
validateProps(props, instance);
|
|
}
|
|
}
|
|
function setFullProps(instance, rawProps, props, attrs) {
|
|
const [options, needCastKeys] = instance.propsOptions;
|
|
if (rawProps) {
|
|
for (const key in rawProps) {
|
|
const value = rawProps[key];
|
|
// key, ref are reserved and never passed down
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {
|
|
continue;
|
|
}
|
|
// prop option names are camelized during normalization, so to support
|
|
// kebab -> camel conversion here we need to camelize the key.
|
|
let camelKey;
|
|
if (options && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, (camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key)))) {
|
|
props[camelKey] = value;
|
|
}
|
|
else if (!isEmitListener(instance.emitsOptions, key)) {
|
|
// Any non-declared (either as a prop or an emitted event) props are put
|
|
// into a separate `attrs` object for spreading. Make sure to preserve
|
|
// original key casing
|
|
attrs[key] = value;
|
|
}
|
|
}
|
|
}
|
|
if (needCastKeys) {
|
|
const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
|
|
for (let i = 0; i < needCastKeys.length; i++) {
|
|
const key = needCastKeys[i];
|
|
props[key] = resolvePropValue(options, rawCurrentProps, key, rawCurrentProps[key], instance);
|
|
}
|
|
}
|
|
}
|
|
function resolvePropValue(options, props, key, value, instance) {
|
|
const opt = options[key];
|
|
if (opt != null) {
|
|
const hasDefault = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(opt, 'default');
|
|
// default values
|
|
if (hasDefault && value === undefined) {
|
|
const defaultValue = opt.default;
|
|
if (opt.type !== Function && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue)) {
|
|
setCurrentInstance(instance);
|
|
value = defaultValue(props);
|
|
setCurrentInstance(null);
|
|
}
|
|
else {
|
|
value = defaultValue;
|
|
}
|
|
}
|
|
// boolean casting
|
|
if (opt[0 /* shouldCast */]) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(props, key) && !hasDefault) {
|
|
value = false;
|
|
}
|
|
else if (opt[1 /* shouldCastTrue */] &&
|
|
(value === '' || value === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key))) {
|
|
value = true;
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
function normalizePropsOptions(comp, appContext, asMixin = false) {
|
|
if (!appContext.deopt && comp.__props) {
|
|
return comp.__props;
|
|
}
|
|
const raw = comp.props;
|
|
const normalized = {};
|
|
const needCastKeys = [];
|
|
// apply mixin/extends props
|
|
let hasExtends = false;
|
|
if (__VUE_OPTIONS_API__ && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {
|
|
const extendProps = (raw) => {
|
|
hasExtends = true;
|
|
const [props, keys] = normalizePropsOptions(raw, appContext, true);
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, props);
|
|
if (keys)
|
|
needCastKeys.push(...keys);
|
|
};
|
|
if (!asMixin && appContext.mixins.length) {
|
|
appContext.mixins.forEach(extendProps);
|
|
}
|
|
if (comp.extends) {
|
|
extendProps(comp.extends);
|
|
}
|
|
if (comp.mixins) {
|
|
comp.mixins.forEach(extendProps);
|
|
}
|
|
}
|
|
if (!raw && !hasExtends) {
|
|
return (comp.__props = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR);
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
|
|
for (let i = 0; i < raw.length; i++) {
|
|
if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw[i])) {
|
|
warn(`props must be strings when using array syntax.`, raw[i]);
|
|
}
|
|
const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(raw[i]);
|
|
if (validatePropName(normalizedKey)) {
|
|
normalized[normalizedKey] = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
}
|
|
}
|
|
}
|
|
else if (raw) {
|
|
if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) {
|
|
warn(`invalid props options`, raw);
|
|
}
|
|
for (const key in raw) {
|
|
const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key);
|
|
if (validatePropName(normalizedKey)) {
|
|
const opt = raw[key];
|
|
const prop = (normalized[normalizedKey] =
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) ? { type: opt } : opt);
|
|
if (prop) {
|
|
const booleanIndex = getTypeIndex(Boolean, prop.type);
|
|
const stringIndex = getTypeIndex(String, prop.type);
|
|
prop[0 /* shouldCast */] = booleanIndex > -1;
|
|
prop[1 /* shouldCastTrue */] =
|
|
stringIndex < 0 || booleanIndex < stringIndex;
|
|
// if the prop needs boolean casting or default value
|
|
if (booleanIndex > -1 || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(prop, 'default')) {
|
|
needCastKeys.push(normalizedKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (comp.__props = [normalized, needCastKeys]);
|
|
}
|
|
function validatePropName(key) {
|
|
if (key[0] !== '$') {
|
|
return true;
|
|
}
|
|
else if ((true)) {
|
|
warn(`Invalid prop name: "${key}" is a reserved property.`);
|
|
}
|
|
return false;
|
|
}
|
|
// use function string name to check type constructors
|
|
// so that it works across vms / iframes.
|
|
function getType(ctor) {
|
|
const match = ctor && ctor.toString().match(/^\s*function (\w+)/);
|
|
return match ? match[1] : '';
|
|
}
|
|
function isSameType(a, b) {
|
|
return getType(a) === getType(b);
|
|
}
|
|
function getTypeIndex(type, expectedTypes) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expectedTypes)) {
|
|
for (let i = 0, len = expectedTypes.length; i < len; i++) {
|
|
if (isSameType(expectedTypes[i], type)) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(expectedTypes)) {
|
|
return isSameType(expectedTypes, type) ? 0 : -1;
|
|
}
|
|
return -1;
|
|
}
|
|
/**
|
|
* dev only
|
|
*/
|
|
function validateProps(props, instance) {
|
|
const rawValues = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
|
|
const options = instance.propsOptions[0];
|
|
for (const key in options) {
|
|
let opt = options[key];
|
|
if (opt == null)
|
|
continue;
|
|
validateProp(key, rawValues[key], opt, !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawValues, key));
|
|
}
|
|
}
|
|
/**
|
|
* dev only
|
|
*/
|
|
function validateProp(name, value, prop, isAbsent) {
|
|
const { type, required, validator } = prop;
|
|
// required!
|
|
if (required && isAbsent) {
|
|
warn('Missing required prop: "' + name + '"');
|
|
return;
|
|
}
|
|
// missing but optional
|
|
if (value == null && !prop.required) {
|
|
return;
|
|
}
|
|
// type check
|
|
if (type != null && type !== true) {
|
|
let isValid = false;
|
|
const types = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(type) ? type : [type];
|
|
const expectedTypes = [];
|
|
// value is valid as long as one of the specified types match
|
|
for (let i = 0; i < types.length && !isValid; i++) {
|
|
const { valid, expectedType } = assertType(value, types[i]);
|
|
expectedTypes.push(expectedType || '');
|
|
isValid = valid;
|
|
}
|
|
if (!isValid) {
|
|
warn(getInvalidTypeMessage(name, value, expectedTypes));
|
|
return;
|
|
}
|
|
}
|
|
// custom validator
|
|
if (validator && !validator(value)) {
|
|
warn('Invalid prop: custom validator check failed for prop "' + name + '".');
|
|
}
|
|
}
|
|
const isSimpleType = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('String,Number,Boolean,Function,Symbol,BigInt');
|
|
/**
|
|
* dev only
|
|
*/
|
|
function assertType(value, type) {
|
|
let valid;
|
|
const expectedType = getType(type);
|
|
if (isSimpleType(expectedType)) {
|
|
const t = typeof value;
|
|
valid = t === expectedType.toLowerCase();
|
|
// for primitive wrapper objects
|
|
if (!valid && t === 'object') {
|
|
valid = value instanceof type;
|
|
}
|
|
}
|
|
else if (expectedType === 'Object') {
|
|
valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value);
|
|
}
|
|
else if (expectedType === 'Array') {
|
|
valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value);
|
|
}
|
|
else {
|
|
valid = value instanceof type;
|
|
}
|
|
return {
|
|
valid,
|
|
expectedType
|
|
};
|
|
}
|
|
/**
|
|
* dev only
|
|
*/
|
|
function getInvalidTypeMessage(name, value, expectedTypes) {
|
|
let message = `Invalid prop: type check failed for prop "${name}".` +
|
|
` Expected ${expectedTypes.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join(', ')}`;
|
|
const expectedType = expectedTypes[0];
|
|
const receivedType = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toRawType)(value);
|
|
const expectedValue = styleValue(value, expectedType);
|
|
const receivedValue = styleValue(value, receivedType);
|
|
// check if we need to specify expected value
|
|
if (expectedTypes.length === 1 &&
|
|
isExplicable(expectedType) &&
|
|
!isBoolean(expectedType, receivedType)) {
|
|
message += ` with value ${expectedValue}`;
|
|
}
|
|
message += `, got ${receivedType} `;
|
|
// check if we need to specify received value
|
|
if (isExplicable(receivedType)) {
|
|
message += `with value ${receivedValue}.`;
|
|
}
|
|
return message;
|
|
}
|
|
/**
|
|
* dev only
|
|
*/
|
|
function styleValue(value, type) {
|
|
if (type === 'String') {
|
|
return `"${value}"`;
|
|
}
|
|
else if (type === 'Number') {
|
|
return `${Number(value)}`;
|
|
}
|
|
else {
|
|
return `${value}`;
|
|
}
|
|
}
|
|
/**
|
|
* dev only
|
|
*/
|
|
function isExplicable(type) {
|
|
const explicitTypes = ['string', 'number', 'boolean'];
|
|
return explicitTypes.some(elem => type.toLowerCase() === elem);
|
|
}
|
|
/**
|
|
* dev only
|
|
*/
|
|
function isBoolean(...args) {
|
|
return args.some(elem => elem.toLowerCase() === 'boolean');
|
|
}
|
|
|
|
function injectHook(type, hook, target = currentInstance, prepend = false) {
|
|
if (target) {
|
|
const hooks = target[type] || (target[type] = []);
|
|
// cache the error handling wrapper for injected hooks so the same hook
|
|
// can be properly deduped by the scheduler. "__weh" stands for "with error
|
|
// handling".
|
|
const wrappedHook = hook.__weh ||
|
|
(hook.__weh = (...args) => {
|
|
if (target.isUnmounted) {
|
|
return;
|
|
}
|
|
// disable tracking inside all lifecycle hooks
|
|
// since they can potentially be called inside effects.
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
|
|
// Set currentInstance during hook invocation.
|
|
// This assumes the hook does not synchronously trigger other hooks, which
|
|
// can only be false when the user does something really funky.
|
|
setCurrentInstance(target);
|
|
const res = callWithAsyncErrorHandling(hook, target, type, args);
|
|
setCurrentInstance(null);
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
|
|
return res;
|
|
});
|
|
if (prepend) {
|
|
hooks.unshift(wrappedHook);
|
|
}
|
|
else {
|
|
hooks.push(wrappedHook);
|
|
}
|
|
return wrappedHook;
|
|
}
|
|
else if ((true)) {
|
|
const apiName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(ErrorTypeStrings[type].replace(/ hook$/, ''));
|
|
warn(`${apiName} is called when there is no active component instance to be ` +
|
|
`associated with. ` +
|
|
`Lifecycle injection APIs can only be used during execution of setup().` +
|
|
(` If you are using async setup(), make sure to register lifecycle ` +
|
|
`hooks before the first await statement.`
|
|
));
|
|
}
|
|
}
|
|
const createHook = (lifecycle) => (hook, target = currentInstance) =>
|
|
// post-create lifecycle registrations are noops during SSR
|
|
!isInSSRComponentSetup && injectHook(lifecycle, hook, target);
|
|
const onBeforeMount = createHook("bm" /* BEFORE_MOUNT */);
|
|
const onMounted = createHook("m" /* MOUNTED */);
|
|
const onBeforeUpdate = createHook("bu" /* BEFORE_UPDATE */);
|
|
const onUpdated = createHook("u" /* UPDATED */);
|
|
const onBeforeUnmount = createHook("bum" /* BEFORE_UNMOUNT */);
|
|
const onUnmounted = createHook("um" /* UNMOUNTED */);
|
|
const onRenderTriggered = createHook("rtg" /* RENDER_TRIGGERED */);
|
|
const onRenderTracked = createHook("rtc" /* RENDER_TRACKED */);
|
|
const onErrorCaptured = (hook, target = currentInstance) => {
|
|
injectHook("ec" /* ERROR_CAPTURED */, hook, target);
|
|
};
|
|
|
|
// Simple effect.
|
|
function watchEffect(effect, options) {
|
|
return doWatch(effect, null, options);
|
|
}
|
|
// initial value for watchers to trigger on undefined initial values
|
|
const INITIAL_WATCHER_VALUE = {};
|
|
// implementation
|
|
function watch(source, cb, options) {
|
|
if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(cb)) {
|
|
warn(`\`watch(fn, options?)\` signature has been moved to a separate API. ` +
|
|
`Use \`watchEffect(fn, options?)\` instead. \`watch\` now only ` +
|
|
`supports \`watch(source, cb, options?) signature.`);
|
|
}
|
|
return doWatch(source, cb, options);
|
|
}
|
|
function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, instance = currentInstance) {
|
|
if (( true) && !cb) {
|
|
if (immediate !== undefined) {
|
|
warn(`watch() "immediate" option is only respected when using the ` +
|
|
`watch(source, callback, options?) signature.`);
|
|
}
|
|
if (deep !== undefined) {
|
|
warn(`watch() "deep" option is only respected when using the ` +
|
|
`watch(source, callback, options?) signature.`);
|
|
}
|
|
}
|
|
const warnInvalidSource = (s) => {
|
|
warn(`Invalid watch source: `, s, `A watch source can only be a getter/effect function, a ref, ` +
|
|
`a reactive object, or an array of these types.`);
|
|
};
|
|
let getter;
|
|
let forceTrigger = false;
|
|
if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(source)) {
|
|
getter = () => source.value;
|
|
forceTrigger = !!source._shallow;
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(source)) {
|
|
getter = () => source;
|
|
deep = true;
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source)) {
|
|
getter = () => source.map(s => {
|
|
if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(s)) {
|
|
return s.value;
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s)) {
|
|
return traverse(s);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) {
|
|
return callWithErrorHandling(s, instance, 2 /* WATCH_GETTER */, [
|
|
instance && instance.proxy
|
|
]);
|
|
}
|
|
else {
|
|
( true) && warnInvalidSource(s);
|
|
}
|
|
});
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) {
|
|
if (cb) {
|
|
// getter with cb
|
|
getter = () => callWithErrorHandling(source, instance, 2 /* WATCH_GETTER */, [
|
|
instance && instance.proxy
|
|
]);
|
|
}
|
|
else {
|
|
// no cb -> simple effect
|
|
getter = () => {
|
|
if (instance && instance.isUnmounted) {
|
|
return;
|
|
}
|
|
if (cleanup) {
|
|
cleanup();
|
|
}
|
|
return callWithErrorHandling(source, instance, 3 /* WATCH_CALLBACK */, [onInvalidate]);
|
|
};
|
|
}
|
|
}
|
|
else {
|
|
getter = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
|
|
( true) && warnInvalidSource(source);
|
|
}
|
|
if (cb && deep) {
|
|
const baseGetter = getter;
|
|
getter = () => traverse(baseGetter());
|
|
}
|
|
let cleanup;
|
|
const onInvalidate = (fn) => {
|
|
cleanup = runner.options.onStop = () => {
|
|
callWithErrorHandling(fn, instance, 4 /* WATCH_CLEANUP */);
|
|
};
|
|
};
|
|
let oldValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source) ? [] : INITIAL_WATCHER_VALUE;
|
|
const job = () => {
|
|
if (!runner.active) {
|
|
return;
|
|
}
|
|
if (cb) {
|
|
// watch(source, cb)
|
|
const newValue = runner();
|
|
if (deep || forceTrigger || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(newValue, oldValue)) {
|
|
// cleanup before running cb again
|
|
if (cleanup) {
|
|
cleanup();
|
|
}
|
|
callWithAsyncErrorHandling(cb, instance, 3 /* WATCH_CALLBACK */, [
|
|
newValue,
|
|
// pass undefined as the old value when it's changed for the first time
|
|
oldValue === INITIAL_WATCHER_VALUE ? undefined : oldValue,
|
|
onInvalidate
|
|
]);
|
|
oldValue = newValue;
|
|
}
|
|
}
|
|
else {
|
|
// watchEffect
|
|
runner();
|
|
}
|
|
};
|
|
// important: mark the job as a watcher callback so that scheduler knows
|
|
// it is allowed to self-trigger (#1727)
|
|
job.allowRecurse = !!cb;
|
|
let scheduler;
|
|
if (flush === 'sync') {
|
|
scheduler = job;
|
|
}
|
|
else if (flush === 'post') {
|
|
scheduler = () => queuePostRenderEffect(job, instance && instance.suspense);
|
|
}
|
|
else {
|
|
// default: 'pre'
|
|
scheduler = () => {
|
|
if (!instance || instance.isMounted) {
|
|
queuePreFlushCb(job);
|
|
}
|
|
else {
|
|
// with 'pre' option, the first call must happen before
|
|
// the component is mounted so it is called synchronously.
|
|
job();
|
|
}
|
|
};
|
|
}
|
|
const runner = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effect)(getter, {
|
|
lazy: true,
|
|
onTrack,
|
|
onTrigger,
|
|
scheduler
|
|
});
|
|
recordInstanceBoundEffect(runner, instance);
|
|
// initial run
|
|
if (cb) {
|
|
if (immediate) {
|
|
job();
|
|
}
|
|
else {
|
|
oldValue = runner();
|
|
}
|
|
}
|
|
else if (flush === 'post') {
|
|
queuePostRenderEffect(runner, instance && instance.suspense);
|
|
}
|
|
else {
|
|
runner();
|
|
}
|
|
return () => {
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.stop)(runner);
|
|
if (instance) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(instance.effects, runner);
|
|
}
|
|
};
|
|
}
|
|
// this.$watch
|
|
function instanceWatch(source, cb, options) {
|
|
const publicThis = this.proxy;
|
|
const getter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source)
|
|
? () => publicThis[source]
|
|
: source.bind(publicThis);
|
|
return doWatch(getter, cb.bind(publicThis), options, this);
|
|
}
|
|
function traverse(value, seen = new Set()) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value) || seen.has(value)) {
|
|
return value;
|
|
}
|
|
seen.add(value);
|
|
if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) {
|
|
traverse(value.value, seen);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
|
|
for (let i = 0; i < value.length; i++) {
|
|
traverse(value[i], seen);
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMap)(value)) {
|
|
value.forEach((v) => {
|
|
traverse(v, seen);
|
|
});
|
|
}
|
|
else {
|
|
for (const key in value) {
|
|
traverse(value[key], seen);
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
function useTransitionState() {
|
|
const state = {
|
|
isMounted: false,
|
|
isLeaving: false,
|
|
isUnmounting: false,
|
|
leavingVNodes: new Map()
|
|
};
|
|
onMounted(() => {
|
|
state.isMounted = true;
|
|
});
|
|
onBeforeUnmount(() => {
|
|
state.isUnmounting = true;
|
|
});
|
|
return state;
|
|
}
|
|
const TransitionHookValidator = [Function, Array];
|
|
const BaseTransitionImpl = {
|
|
name: `BaseTransition`,
|
|
props: {
|
|
mode: String,
|
|
appear: Boolean,
|
|
persisted: Boolean,
|
|
// enter
|
|
onBeforeEnter: TransitionHookValidator,
|
|
onEnter: TransitionHookValidator,
|
|
onAfterEnter: TransitionHookValidator,
|
|
onEnterCancelled: TransitionHookValidator,
|
|
// leave
|
|
onBeforeLeave: TransitionHookValidator,
|
|
onLeave: TransitionHookValidator,
|
|
onAfterLeave: TransitionHookValidator,
|
|
onLeaveCancelled: TransitionHookValidator,
|
|
// appear
|
|
onBeforeAppear: TransitionHookValidator,
|
|
onAppear: TransitionHookValidator,
|
|
onAfterAppear: TransitionHookValidator,
|
|
onAppearCancelled: TransitionHookValidator
|
|
},
|
|
setup(props, { slots }) {
|
|
const instance = getCurrentInstance();
|
|
const state = useTransitionState();
|
|
let prevTransitionKey;
|
|
return () => {
|
|
const children = slots.default && getTransitionRawChildren(slots.default(), true);
|
|
if (!children || !children.length) {
|
|
return;
|
|
}
|
|
// warn multiple elements
|
|
if (( true) && children.length > 1) {
|
|
warn('<transition> can only be used on a single element or component. Use ' +
|
|
'<transition-group> for lists.');
|
|
}
|
|
// there's no need to track reactivity for these props so use the raw
|
|
// props for a bit better perf
|
|
const rawProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props);
|
|
const { mode } = rawProps;
|
|
// check mode
|
|
if (( true) && mode && !['in-out', 'out-in', 'default'].includes(mode)) {
|
|
warn(`invalid <transition> mode: ${mode}`);
|
|
}
|
|
// at this point children has a guaranteed length of 1.
|
|
const child = children[0];
|
|
if (state.isLeaving) {
|
|
return emptyPlaceholder(child);
|
|
}
|
|
// in the case of <transition><keep-alive/></transition>, we need to
|
|
// compare the type of the kept-alive children.
|
|
const innerChild = getKeepAliveChild(child);
|
|
if (!innerChild) {
|
|
return emptyPlaceholder(child);
|
|
}
|
|
const enterHooks = resolveTransitionHooks(innerChild, rawProps, state, instance);
|
|
setTransitionHooks(innerChild, enterHooks);
|
|
const oldChild = instance.subTree;
|
|
const oldInnerChild = oldChild && getKeepAliveChild(oldChild);
|
|
let transitionKeyChanged = false;
|
|
const { getTransitionKey } = innerChild.type;
|
|
if (getTransitionKey) {
|
|
const key = getTransitionKey();
|
|
if (prevTransitionKey === undefined) {
|
|
prevTransitionKey = key;
|
|
}
|
|
else if (key !== prevTransitionKey) {
|
|
prevTransitionKey = key;
|
|
transitionKeyChanged = true;
|
|
}
|
|
}
|
|
// handle mode
|
|
if (oldInnerChild &&
|
|
oldInnerChild.type !== Comment &&
|
|
(!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) {
|
|
const leavingHooks = resolveTransitionHooks(oldInnerChild, rawProps, state, instance);
|
|
// update old tree's hooks in case of dynamic transition
|
|
setTransitionHooks(oldInnerChild, leavingHooks);
|
|
// switching between different views
|
|
if (mode === 'out-in') {
|
|
state.isLeaving = true;
|
|
// return placeholder node and queue update when leave finishes
|
|
leavingHooks.afterLeave = () => {
|
|
state.isLeaving = false;
|
|
instance.update();
|
|
};
|
|
return emptyPlaceholder(child);
|
|
}
|
|
else if (mode === 'in-out') {
|
|
leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
|
|
const leavingVNodesCache = getLeavingNodesForType(state, oldInnerChild);
|
|
leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
|
|
// early removal callback
|
|
el._leaveCb = () => {
|
|
earlyRemove();
|
|
el._leaveCb = undefined;
|
|
delete enterHooks.delayedLeave;
|
|
};
|
|
enterHooks.delayedLeave = delayedLeave;
|
|
};
|
|
}
|
|
}
|
|
return child;
|
|
};
|
|
}
|
|
};
|
|
// export the public type for h/tsx inference
|
|
// also to avoid inline import() in generated d.ts files
|
|
const BaseTransition = BaseTransitionImpl;
|
|
function getLeavingNodesForType(state, vnode) {
|
|
const { leavingVNodes } = state;
|
|
let leavingVNodesCache = leavingVNodes.get(vnode.type);
|
|
if (!leavingVNodesCache) {
|
|
leavingVNodesCache = Object.create(null);
|
|
leavingVNodes.set(vnode.type, leavingVNodesCache);
|
|
}
|
|
return leavingVNodesCache;
|
|
}
|
|
// The transition hooks are attached to the vnode as vnode.transition
|
|
// and will be called at appropriate timing in the renderer.
|
|
function resolveTransitionHooks(vnode, props, state, instance) {
|
|
const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props;
|
|
const key = String(vnode.key);
|
|
const leavingVNodesCache = getLeavingNodesForType(state, vnode);
|
|
const callHook = (hook, args) => {
|
|
hook &&
|
|
callWithAsyncErrorHandling(hook, instance, 9 /* TRANSITION_HOOK */, args);
|
|
};
|
|
const hooks = {
|
|
mode,
|
|
persisted,
|
|
beforeEnter(el) {
|
|
let hook = onBeforeEnter;
|
|
if (!state.isMounted) {
|
|
if (appear) {
|
|
hook = onBeforeAppear || onBeforeEnter;
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
// for same element (v-show)
|
|
if (el._leaveCb) {
|
|
el._leaveCb(true /* cancelled */);
|
|
}
|
|
// for toggled element with same key (v-if)
|
|
const leavingVNode = leavingVNodesCache[key];
|
|
if (leavingVNode &&
|
|
isSameVNodeType(vnode, leavingVNode) &&
|
|
leavingVNode.el._leaveCb) {
|
|
// force early removal (not cancelled)
|
|
leavingVNode.el._leaveCb();
|
|
}
|
|
callHook(hook, [el]);
|
|
},
|
|
enter(el) {
|
|
let hook = onEnter;
|
|
let afterHook = onAfterEnter;
|
|
let cancelHook = onEnterCancelled;
|
|
if (!state.isMounted) {
|
|
if (appear) {
|
|
hook = onAppear || onEnter;
|
|
afterHook = onAfterAppear || onAfterEnter;
|
|
cancelHook = onAppearCancelled || onEnterCancelled;
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
let called = false;
|
|
const done = (el._enterCb = (cancelled) => {
|
|
if (called)
|
|
return;
|
|
called = true;
|
|
if (cancelled) {
|
|
callHook(cancelHook, [el]);
|
|
}
|
|
else {
|
|
callHook(afterHook, [el]);
|
|
}
|
|
if (hooks.delayedLeave) {
|
|
hooks.delayedLeave();
|
|
}
|
|
el._enterCb = undefined;
|
|
});
|
|
if (hook) {
|
|
hook(el, done);
|
|
if (hook.length <= 1) {
|
|
done();
|
|
}
|
|
}
|
|
else {
|
|
done();
|
|
}
|
|
},
|
|
leave(el, remove) {
|
|
const key = String(vnode.key);
|
|
if (el._enterCb) {
|
|
el._enterCb(true /* cancelled */);
|
|
}
|
|
if (state.isUnmounting) {
|
|
return remove();
|
|
}
|
|
callHook(onBeforeLeave, [el]);
|
|
let called = false;
|
|
const done = (el._leaveCb = (cancelled) => {
|
|
if (called)
|
|
return;
|
|
called = true;
|
|
remove();
|
|
if (cancelled) {
|
|
callHook(onLeaveCancelled, [el]);
|
|
}
|
|
else {
|
|
callHook(onAfterLeave, [el]);
|
|
}
|
|
el._leaveCb = undefined;
|
|
if (leavingVNodesCache[key] === vnode) {
|
|
delete leavingVNodesCache[key];
|
|
}
|
|
});
|
|
leavingVNodesCache[key] = vnode;
|
|
if (onLeave) {
|
|
onLeave(el, done);
|
|
if (onLeave.length <= 1) {
|
|
done();
|
|
}
|
|
}
|
|
else {
|
|
done();
|
|
}
|
|
},
|
|
clone(vnode) {
|
|
return resolveTransitionHooks(vnode, props, state, instance);
|
|
}
|
|
};
|
|
return hooks;
|
|
}
|
|
// the placeholder really only handles one special case: KeepAlive
|
|
// in the case of a KeepAlive in a leave phase we need to return a KeepAlive
|
|
// placeholder with empty content to avoid the KeepAlive instance from being
|
|
// unmounted.
|
|
function emptyPlaceholder(vnode) {
|
|
if (isKeepAlive(vnode)) {
|
|
vnode = cloneVNode(vnode);
|
|
vnode.children = null;
|
|
return vnode;
|
|
}
|
|
}
|
|
function getKeepAliveChild(vnode) {
|
|
return isKeepAlive(vnode)
|
|
? vnode.children
|
|
? vnode.children[0]
|
|
: undefined
|
|
: vnode;
|
|
}
|
|
function setTransitionHooks(vnode, hooks) {
|
|
if (vnode.shapeFlag & 6 /* COMPONENT */ && vnode.component) {
|
|
setTransitionHooks(vnode.component.subTree, hooks);
|
|
}
|
|
else if (vnode.shapeFlag & 128 /* SUSPENSE */) {
|
|
vnode.ssContent.transition = hooks.clone(vnode.ssContent);
|
|
vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
|
|
}
|
|
else {
|
|
vnode.transition = hooks;
|
|
}
|
|
}
|
|
function getTransitionRawChildren(children, keepComment = false) {
|
|
let ret = [];
|
|
let keyedFragmentCount = 0;
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
// handle fragment children case, e.g. v-for
|
|
if (child.type === Fragment) {
|
|
if (child.patchFlag & 128 /* KEYED_FRAGMENT */)
|
|
keyedFragmentCount++;
|
|
ret = ret.concat(getTransitionRawChildren(child.children, keepComment));
|
|
}
|
|
// comment placeholders should be skipped, e.g. v-if
|
|
else if (keepComment || child.type !== Comment) {
|
|
ret.push(child);
|
|
}
|
|
}
|
|
// #1126 if a transition children list contains multiple sub fragments, these
|
|
// fragments will be merged into a flat children array. Since each v-for
|
|
// fragment may contain different static bindings inside, we need to de-op
|
|
// these children to force full diffs to ensure correct behavior.
|
|
if (keyedFragmentCount > 1) {
|
|
for (let i = 0; i < ret.length; i++) {
|
|
ret[i].patchFlag = -2 /* BAIL */;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
|
|
const KeepAliveImpl = {
|
|
name: `KeepAlive`,
|
|
// Marker for special handling inside the renderer. We are not using a ===
|
|
// check directly on KeepAlive in the renderer, because importing it directly
|
|
// would prevent it from being tree-shaken.
|
|
__isKeepAlive: true,
|
|
props: {
|
|
include: [String, RegExp, Array],
|
|
exclude: [String, RegExp, Array],
|
|
max: [String, Number]
|
|
},
|
|
setup(props, { slots }) {
|
|
const cache = new Map();
|
|
const keys = new Set();
|
|
let current = null;
|
|
const instance = getCurrentInstance();
|
|
const parentSuspense = instance.suspense;
|
|
// KeepAlive communicates with the instantiated renderer via the
|
|
// ctx where the renderer passes in its internals,
|
|
// and the KeepAlive instance exposes activate/deactivate implementations.
|
|
// The whole point of this is to avoid importing KeepAlive directly in the
|
|
// renderer to facilitate tree-shaking.
|
|
const sharedContext = instance.ctx;
|
|
const { renderer: { p: patch, m: move, um: _unmount, o: { createElement } } } = sharedContext;
|
|
const storageContainer = createElement('div');
|
|
sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {
|
|
const instance = vnode.component;
|
|
move(vnode, container, anchor, 0 /* ENTER */, parentSuspense);
|
|
// in case props have changed
|
|
patch(instance.vnode, vnode, container, anchor, instance, parentSuspense, isSVG, optimized);
|
|
queuePostRenderEffect(() => {
|
|
instance.isDeactivated = false;
|
|
if (instance.a) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.a);
|
|
}
|
|
const vnodeHook = vnode.props && vnode.props.onVnodeMounted;
|
|
if (vnodeHook) {
|
|
invokeVNodeHook(vnodeHook, instance.parent, vnode);
|
|
}
|
|
}, parentSuspense);
|
|
};
|
|
sharedContext.deactivate = (vnode) => {
|
|
const instance = vnode.component;
|
|
move(vnode, storageContainer, null, 1 /* LEAVE */, parentSuspense);
|
|
queuePostRenderEffect(() => {
|
|
if (instance.da) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.da);
|
|
}
|
|
const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;
|
|
if (vnodeHook) {
|
|
invokeVNodeHook(vnodeHook, instance.parent, vnode);
|
|
}
|
|
instance.isDeactivated = true;
|
|
}, parentSuspense);
|
|
};
|
|
function unmount(vnode) {
|
|
// reset the shapeFlag so it can be properly unmounted
|
|
resetShapeFlag(vnode);
|
|
_unmount(vnode, instance, parentSuspense);
|
|
}
|
|
function pruneCache(filter) {
|
|
cache.forEach((vnode, key) => {
|
|
const name = getComponentName(vnode.type);
|
|
if (name && (!filter || !filter(name))) {
|
|
pruneCacheEntry(key);
|
|
}
|
|
});
|
|
}
|
|
function pruneCacheEntry(key) {
|
|
const cached = cache.get(key);
|
|
if (!current || cached.type !== current.type) {
|
|
unmount(cached);
|
|
}
|
|
else if (current) {
|
|
// current active instance should no longer be kept-alive.
|
|
// we can't unmount it now but it might be later, so reset its flag now.
|
|
resetShapeFlag(current);
|
|
}
|
|
cache.delete(key);
|
|
keys.delete(key);
|
|
}
|
|
// prune cache on include/exclude prop change
|
|
watch(() => [props.include, props.exclude], ([include, exclude]) => {
|
|
include && pruneCache(name => matches(include, name));
|
|
exclude && pruneCache(name => !matches(exclude, name));
|
|
},
|
|
// prune post-render after `current` has been updated
|
|
{ flush: 'post', deep: true });
|
|
// cache sub tree after render
|
|
let pendingCacheKey = null;
|
|
const cacheSubtree = () => {
|
|
// fix #1621, the pendingCacheKey could be 0
|
|
if (pendingCacheKey != null) {
|
|
cache.set(pendingCacheKey, getInnerChild(instance.subTree));
|
|
}
|
|
};
|
|
onMounted(cacheSubtree);
|
|
onUpdated(cacheSubtree);
|
|
onBeforeUnmount(() => {
|
|
cache.forEach(cached => {
|
|
const { subTree, suspense } = instance;
|
|
const vnode = getInnerChild(subTree);
|
|
if (cached.type === vnode.type) {
|
|
// current instance will be unmounted as part of keep-alive's unmount
|
|
resetShapeFlag(vnode);
|
|
// but invoke its deactivated hook here
|
|
const da = vnode.component.da;
|
|
da && queuePostRenderEffect(da, suspense);
|
|
return;
|
|
}
|
|
unmount(cached);
|
|
});
|
|
});
|
|
return () => {
|
|
pendingCacheKey = null;
|
|
if (!slots.default) {
|
|
return null;
|
|
}
|
|
const children = slots.default();
|
|
const rawVNode = children[0];
|
|
if (children.length > 1) {
|
|
if ((true)) {
|
|
warn(`KeepAlive should contain exactly one component child.`);
|
|
}
|
|
current = null;
|
|
return children;
|
|
}
|
|
else if (!isVNode(rawVNode) ||
|
|
(!(rawVNode.shapeFlag & 4 /* STATEFUL_COMPONENT */) &&
|
|
!(rawVNode.shapeFlag & 128 /* SUSPENSE */))) {
|
|
current = null;
|
|
return rawVNode;
|
|
}
|
|
let vnode = getInnerChild(rawVNode);
|
|
const comp = vnode.type;
|
|
const name = getComponentName(comp);
|
|
const { include, exclude, max } = props;
|
|
if ((include && (!name || !matches(include, name))) ||
|
|
(exclude && name && matches(exclude, name))) {
|
|
current = vnode;
|
|
return rawVNode;
|
|
}
|
|
const key = vnode.key == null ? comp : vnode.key;
|
|
const cachedVNode = cache.get(key);
|
|
// clone vnode if it's reused because we are going to mutate it
|
|
if (vnode.el) {
|
|
vnode = cloneVNode(vnode);
|
|
if (rawVNode.shapeFlag & 128 /* SUSPENSE */) {
|
|
rawVNode.ssContent = vnode;
|
|
}
|
|
}
|
|
// #1513 it's possible for the returned vnode to be cloned due to attr
|
|
// fallthrough or scopeId, so the vnode here may not be the final vnode
|
|
// that is mounted. Instead of caching it directly, we store the pending
|
|
// key and cache `instance.subTree` (the normalized vnode) in
|
|
// beforeMount/beforeUpdate hooks.
|
|
pendingCacheKey = key;
|
|
if (cachedVNode) {
|
|
// copy over mounted state
|
|
vnode.el = cachedVNode.el;
|
|
vnode.component = cachedVNode.component;
|
|
if (vnode.transition) {
|
|
// recursively update transition hooks on subTree
|
|
setTransitionHooks(vnode, vnode.transition);
|
|
}
|
|
// avoid vnode being mounted as fresh
|
|
vnode.shapeFlag |= 512 /* COMPONENT_KEPT_ALIVE */;
|
|
// make this key the freshest
|
|
keys.delete(key);
|
|
keys.add(key);
|
|
}
|
|
else {
|
|
keys.add(key);
|
|
// prune oldest entry
|
|
if (max && keys.size > parseInt(max, 10)) {
|
|
pruneCacheEntry(keys.values().next().value);
|
|
}
|
|
}
|
|
// avoid vnode being unmounted
|
|
vnode.shapeFlag |= 256 /* COMPONENT_SHOULD_KEEP_ALIVE */;
|
|
current = vnode;
|
|
return rawVNode;
|
|
};
|
|
}
|
|
};
|
|
// export the public type for h/tsx inference
|
|
// also to avoid inline import() in generated d.ts files
|
|
const KeepAlive = KeepAliveImpl;
|
|
function matches(pattern, name) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(pattern)) {
|
|
return pattern.some((p) => matches(p, name));
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(pattern)) {
|
|
return pattern.split(',').indexOf(name) > -1;
|
|
}
|
|
else if (pattern.test) {
|
|
return pattern.test(name);
|
|
}
|
|
/* istanbul ignore next */
|
|
return false;
|
|
}
|
|
function onActivated(hook, target) {
|
|
registerKeepAliveHook(hook, "a" /* ACTIVATED */, target);
|
|
}
|
|
function onDeactivated(hook, target) {
|
|
registerKeepAliveHook(hook, "da" /* DEACTIVATED */, target);
|
|
}
|
|
function registerKeepAliveHook(hook, type, target = currentInstance) {
|
|
// cache the deactivate branch check wrapper for injected hooks so the same
|
|
// hook can be properly deduped by the scheduler. "__wdc" stands for "with
|
|
// deactivation check".
|
|
const wrappedHook = hook.__wdc ||
|
|
(hook.__wdc = () => {
|
|
// only fire the hook if the target instance is NOT in a deactivated branch.
|
|
let current = target;
|
|
while (current) {
|
|
if (current.isDeactivated) {
|
|
return;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
hook();
|
|
});
|
|
injectHook(type, wrappedHook, target);
|
|
// In addition to registering it on the target instance, we walk up the parent
|
|
// chain and register it on all ancestor instances that are keep-alive roots.
|
|
// This avoids the need to walk the entire component tree when invoking these
|
|
// hooks, and more importantly, avoids the need to track child components in
|
|
// arrays.
|
|
if (target) {
|
|
let current = target.parent;
|
|
while (current && current.parent) {
|
|
if (isKeepAlive(current.parent.vnode)) {
|
|
injectToKeepAliveRoot(wrappedHook, type, target, current);
|
|
}
|
|
current = current.parent;
|
|
}
|
|
}
|
|
}
|
|
function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
|
|
// injectHook wraps the original for error handling, so make sure to remove
|
|
// the wrapped version.
|
|
const injected = injectHook(type, hook, keepAliveRoot, true /* prepend */);
|
|
onUnmounted(() => {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(keepAliveRoot[type], injected);
|
|
}, target);
|
|
}
|
|
function resetShapeFlag(vnode) {
|
|
let shapeFlag = vnode.shapeFlag;
|
|
if (shapeFlag & 256 /* COMPONENT_SHOULD_KEEP_ALIVE */) {
|
|
shapeFlag -= 256 /* COMPONENT_SHOULD_KEEP_ALIVE */;
|
|
}
|
|
if (shapeFlag & 512 /* COMPONENT_KEPT_ALIVE */) {
|
|
shapeFlag -= 512 /* COMPONENT_KEPT_ALIVE */;
|
|
}
|
|
vnode.shapeFlag = shapeFlag;
|
|
}
|
|
function getInnerChild(vnode) {
|
|
return vnode.shapeFlag & 128 /* SUSPENSE */ ? vnode.ssContent : vnode;
|
|
}
|
|
|
|
const isInternalKey = (key) => key[0] === '_' || key === '$stable';
|
|
const normalizeSlotValue = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)
|
|
? value.map(normalizeVNode)
|
|
: [normalizeVNode(value)];
|
|
const normalizeSlot = (key, rawSlot, ctx) => withCtx((props) => {
|
|
if (( true) && currentInstance) {
|
|
warn(`Slot "${key}" invoked outside of the render function: ` +
|
|
`this will not track dependencies used in the slot. ` +
|
|
`Invoke the slot function inside the render function instead.`);
|
|
}
|
|
return normalizeSlotValue(rawSlot(props));
|
|
}, ctx);
|
|
const normalizeObjectSlots = (rawSlots, slots) => {
|
|
const ctx = rawSlots._ctx;
|
|
for (const key in rawSlots) {
|
|
if (isInternalKey(key))
|
|
continue;
|
|
const value = rawSlots[key];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
|
|
slots[key] = normalizeSlot(key, value, ctx);
|
|
}
|
|
else if (value != null) {
|
|
if ((true)) {
|
|
warn(`Non-function value encountered for slot "${key}". ` +
|
|
`Prefer function slots for better performance.`);
|
|
}
|
|
const normalized = normalizeSlotValue(value);
|
|
slots[key] = () => normalized;
|
|
}
|
|
}
|
|
};
|
|
const normalizeVNodeSlots = (instance, children) => {
|
|
if (( true) && !isKeepAlive(instance.vnode)) {
|
|
warn(`Non-function value encountered for default slot. ` +
|
|
`Prefer function slots for better performance.`);
|
|
}
|
|
const normalized = normalizeSlotValue(children);
|
|
instance.slots.default = () => normalized;
|
|
};
|
|
const initSlots = (instance, children) => {
|
|
if (instance.vnode.shapeFlag & 32 /* SLOTS_CHILDREN */) {
|
|
const type = children._;
|
|
if (type) {
|
|
instance.slots = children;
|
|
// make compiler marker non-enumerable
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(children, '_', type);
|
|
}
|
|
else {
|
|
normalizeObjectSlots(children, (instance.slots = {}));
|
|
}
|
|
}
|
|
else {
|
|
instance.slots = {};
|
|
if (children) {
|
|
normalizeVNodeSlots(instance, children);
|
|
}
|
|
}
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(instance.slots, InternalObjectKey, 1);
|
|
};
|
|
const updateSlots = (instance, children) => {
|
|
const { vnode, slots } = instance;
|
|
let needDeletionCheck = true;
|
|
let deletionComparisonTarget = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
if (vnode.shapeFlag & 32 /* SLOTS_CHILDREN */) {
|
|
const type = children._;
|
|
if (type) {
|
|
// compiled slots.
|
|
if (( true) && isHmrUpdating) {
|
|
// Parent was HMR updated so slot content may have changed.
|
|
// force update slots and mark instance for hmr as well
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(slots, children);
|
|
}
|
|
else if (type === 1 /* STABLE */) {
|
|
// compiled AND stable.
|
|
// no need to update, and skip stale slots removal.
|
|
needDeletionCheck = false;
|
|
}
|
|
else {
|
|
// compiled but dynamic (v-if/v-for on slots) - update slots, but skip
|
|
// normalization.
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(slots, children);
|
|
}
|
|
}
|
|
else {
|
|
needDeletionCheck = !children.$stable;
|
|
normalizeObjectSlots(children, slots);
|
|
}
|
|
deletionComparisonTarget = children;
|
|
}
|
|
else if (children) {
|
|
// non slot object children (direct value) passed to a component
|
|
normalizeVNodeSlots(instance, children);
|
|
deletionComparisonTarget = { default: 1 };
|
|
}
|
|
// delete stale slots
|
|
if (needDeletionCheck) {
|
|
for (const key in slots) {
|
|
if (!isInternalKey(key) && !(key in deletionComparisonTarget)) {
|
|
delete slots[key];
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
Runtime helper for applying directives to a vnode. Example usage:
|
|
|
|
const comp = resolveComponent('comp')
|
|
const foo = resolveDirective('foo')
|
|
const bar = resolveDirective('bar')
|
|
|
|
return withDirectives(h(comp), [
|
|
[foo, this.x],
|
|
[bar, this.y]
|
|
])
|
|
*/
|
|
const isBuiltInDirective = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text');
|
|
function validateDirectiveName(name) {
|
|
if (isBuiltInDirective(name)) {
|
|
warn('Do not use built-in directive ids as custom directive id: ' + name);
|
|
}
|
|
}
|
|
/**
|
|
* Adds directives to a VNode.
|
|
*/
|
|
function withDirectives(vnode, directives) {
|
|
const internalInstance = currentRenderingInstance;
|
|
if (internalInstance === null) {
|
|
( true) && warn(`withDirectives can only be used inside render functions.`);
|
|
return vnode;
|
|
}
|
|
const instance = internalInstance.proxy;
|
|
const bindings = vnode.dirs || (vnode.dirs = []);
|
|
for (let i = 0; i < directives.length; i++) {
|
|
let [dir, value, arg, modifiers = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ] = directives[i];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dir)) {
|
|
dir = {
|
|
mounted: dir,
|
|
updated: dir
|
|
};
|
|
}
|
|
bindings.push({
|
|
dir,
|
|
instance,
|
|
value,
|
|
oldValue: void 0,
|
|
arg,
|
|
modifiers
|
|
});
|
|
}
|
|
return vnode;
|
|
}
|
|
function invokeDirectiveHook(vnode, prevVNode, instance, name) {
|
|
const bindings = vnode.dirs;
|
|
const oldBindings = prevVNode && prevVNode.dirs;
|
|
for (let i = 0; i < bindings.length; i++) {
|
|
const binding = bindings[i];
|
|
if (oldBindings) {
|
|
binding.oldValue = oldBindings[i].value;
|
|
}
|
|
const hook = binding.dir[name];
|
|
if (hook) {
|
|
callWithAsyncErrorHandling(hook, instance, 8 /* DIRECTIVE_HOOK */, [
|
|
vnode.el,
|
|
binding,
|
|
vnode,
|
|
prevVNode
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
function createAppContext() {
|
|
return {
|
|
app: null,
|
|
config: {
|
|
isNativeTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO,
|
|
performance: false,
|
|
globalProperties: {},
|
|
optionMergeStrategies: {},
|
|
isCustomElement: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO,
|
|
errorHandler: undefined,
|
|
warnHandler: undefined
|
|
},
|
|
mixins: [],
|
|
components: {},
|
|
directives: {},
|
|
provides: Object.create(null)
|
|
};
|
|
}
|
|
let uid = 0;
|
|
function createAppAPI(render, hydrate) {
|
|
return function createApp(rootComponent, rootProps = null) {
|
|
if (rootProps != null && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(rootProps)) {
|
|
( true) && warn(`root props passed to app.mount() must be an object.`);
|
|
rootProps = null;
|
|
}
|
|
const context = createAppContext();
|
|
const installedPlugins = new Set();
|
|
let isMounted = false;
|
|
const app = (context.app = {
|
|
_uid: uid++,
|
|
_component: rootComponent,
|
|
_props: rootProps,
|
|
_container: null,
|
|
_context: context,
|
|
version,
|
|
get config() {
|
|
return context.config;
|
|
},
|
|
set config(v) {
|
|
if ((true)) {
|
|
warn(`app.config cannot be replaced. Modify individual options instead.`);
|
|
}
|
|
},
|
|
use(plugin, ...options) {
|
|
if (installedPlugins.has(plugin)) {
|
|
( true) && warn(`Plugin has already been applied to target app.`);
|
|
}
|
|
else if (plugin && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin.install)) {
|
|
installedPlugins.add(plugin);
|
|
plugin.install(app, ...options);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin)) {
|
|
installedPlugins.add(plugin);
|
|
plugin(app, ...options);
|
|
}
|
|
else if ((true)) {
|
|
warn(`A plugin must either be a function or an object with an "install" ` +
|
|
`function.`);
|
|
}
|
|
return app;
|
|
},
|
|
mixin(mixin) {
|
|
if (__VUE_OPTIONS_API__) {
|
|
if (!context.mixins.includes(mixin)) {
|
|
context.mixins.push(mixin);
|
|
// global mixin with props/emits de-optimizes props/emits
|
|
// normalization caching.
|
|
if (mixin.props || mixin.emits) {
|
|
context.deopt = true;
|
|
}
|
|
}
|
|
else if ((true)) {
|
|
warn('Mixin has already been applied to target app' +
|
|
(mixin.name ? `: ${mixin.name}` : ''));
|
|
}
|
|
}
|
|
else if ((true)) {
|
|
warn('Mixins are only available in builds supporting Options API');
|
|
}
|
|
return app;
|
|
},
|
|
component(name, component) {
|
|
if ((true)) {
|
|
validateComponentName(name, context.config);
|
|
}
|
|
if (!component) {
|
|
return context.components[name];
|
|
}
|
|
if (( true) && context.components[name]) {
|
|
warn(`Component "${name}" has already been registered in target app.`);
|
|
}
|
|
context.components[name] = component;
|
|
return app;
|
|
},
|
|
directive(name, directive) {
|
|
if ((true)) {
|
|
validateDirectiveName(name);
|
|
}
|
|
if (!directive) {
|
|
return context.directives[name];
|
|
}
|
|
if (( true) && context.directives[name]) {
|
|
warn(`Directive "${name}" has already been registered in target app.`);
|
|
}
|
|
context.directives[name] = directive;
|
|
return app;
|
|
},
|
|
mount(rootContainer, isHydrate) {
|
|
if (!isMounted) {
|
|
const vnode = createVNode(rootComponent, rootProps);
|
|
// store app context on the root VNode.
|
|
// this will be set on the root instance on initial mount.
|
|
vnode.appContext = context;
|
|
// HMR root reload
|
|
if ((true)) {
|
|
context.reload = () => {
|
|
render(cloneVNode(vnode), rootContainer);
|
|
};
|
|
}
|
|
if (isHydrate && hydrate) {
|
|
hydrate(vnode, rootContainer);
|
|
}
|
|
else {
|
|
render(vnode, rootContainer);
|
|
}
|
|
isMounted = true;
|
|
app._container = rootContainer;
|
|
rootContainer.__vue_app__ = app;
|
|
if (true) {
|
|
devtoolsInitApp(app, version);
|
|
}
|
|
return vnode.component.proxy;
|
|
}
|
|
else if ((true)) {
|
|
warn(`App has already been mounted.\n` +
|
|
`If you want to remount the same app, move your app creation logic ` +
|
|
`into a factory function and create fresh app instances for each ` +
|
|
`mount - e.g. \`const createMyApp = () => createApp(App)\``);
|
|
}
|
|
},
|
|
unmount() {
|
|
if (isMounted) {
|
|
render(null, app._container);
|
|
if (true) {
|
|
devtoolsUnmountApp(app);
|
|
}
|
|
delete app._container.__vue_app__;
|
|
}
|
|
else if ((true)) {
|
|
warn(`Cannot unmount an app that is not mounted.`);
|
|
}
|
|
},
|
|
provide(key, value) {
|
|
if (( true) && key in context.provides) {
|
|
warn(`App already provides property with key "${String(key)}". ` +
|
|
`It will be overwritten with the new value.`);
|
|
}
|
|
// TypeScript doesn't allow symbols as index type
|
|
// https://github.com/Microsoft/TypeScript/issues/24587
|
|
context.provides[key] = value;
|
|
return app;
|
|
}
|
|
});
|
|
return app;
|
|
};
|
|
}
|
|
|
|
let hasMismatch = false;
|
|
const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== 'foreignObject';
|
|
const isComment = (node) => node.nodeType === 8 /* COMMENT */;
|
|
// Note: hydration is DOM-specific
|
|
// But we have to place it in core due to tight coupling with core - splitting
|
|
// it out creates a ton of unnecessary complexity.
|
|
// Hydration also depends on some renderer internal logic which needs to be
|
|
// passed in via arguments.
|
|
function createHydrationFunctions(rendererInternals) {
|
|
const { mt: mountComponent, p: patch, o: { patchProp, nextSibling, parentNode, remove, insert, createComment } } = rendererInternals;
|
|
const hydrate = (vnode, container) => {
|
|
if (( true) && !container.hasChildNodes()) {
|
|
warn(`Attempting to hydrate existing markup but container is empty. ` +
|
|
`Performing full mount instead.`);
|
|
patch(null, vnode, container);
|
|
return;
|
|
}
|
|
hasMismatch = false;
|
|
hydrateNode(container.firstChild, vnode, null, null);
|
|
flushPostFlushCbs();
|
|
if (hasMismatch && !false) {
|
|
// this error should show up in production
|
|
console.error(`Hydration completed but contains mismatches.`);
|
|
}
|
|
};
|
|
const hydrateNode = (node, vnode, parentComponent, parentSuspense, optimized = false) => {
|
|
const isFragmentStart = isComment(node) && node.data === '[';
|
|
const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, isFragmentStart);
|
|
const { type, ref, shapeFlag } = vnode;
|
|
const domType = node.nodeType;
|
|
vnode.el = node;
|
|
let nextNode = null;
|
|
switch (type) {
|
|
case Text:
|
|
if (domType !== 3 /* TEXT */) {
|
|
nextNode = onMismatch();
|
|
}
|
|
else {
|
|
if (node.data !== vnode.children) {
|
|
hasMismatch = true;
|
|
( true) &&
|
|
warn(`Hydration text mismatch:` +
|
|
`\n- Client: ${JSON.stringify(node.data)}` +
|
|
`\n- Server: ${JSON.stringify(vnode.children)}`);
|
|
node.data = vnode.children;
|
|
}
|
|
nextNode = nextSibling(node);
|
|
}
|
|
break;
|
|
case Comment:
|
|
if (domType !== 8 /* COMMENT */ || isFragmentStart) {
|
|
nextNode = onMismatch();
|
|
}
|
|
else {
|
|
nextNode = nextSibling(node);
|
|
}
|
|
break;
|
|
case Static:
|
|
if (domType !== 1 /* ELEMENT */) {
|
|
nextNode = onMismatch();
|
|
}
|
|
else {
|
|
// determine anchor, adopt content
|
|
nextNode = node;
|
|
// if the static vnode has its content stripped during build,
|
|
// adopt it from the server-rendered HTML.
|
|
const needToAdoptContent = !vnode.children.length;
|
|
for (let i = 0; i < vnode.staticCount; i++) {
|
|
if (needToAdoptContent)
|
|
vnode.children += nextNode.outerHTML;
|
|
if (i === vnode.staticCount - 1) {
|
|
vnode.anchor = nextNode;
|
|
}
|
|
nextNode = nextSibling(nextNode);
|
|
}
|
|
return nextNode;
|
|
}
|
|
break;
|
|
case Fragment:
|
|
if (!isFragmentStart) {
|
|
nextNode = onMismatch();
|
|
}
|
|
else {
|
|
nextNode = hydrateFragment(node, vnode, parentComponent, parentSuspense, optimized);
|
|
}
|
|
break;
|
|
default:
|
|
if (shapeFlag & 1 /* ELEMENT */) {
|
|
if (domType !== 1 /* ELEMENT */ ||
|
|
vnode.type !== node.tagName.toLowerCase()) {
|
|
nextNode = onMismatch();
|
|
}
|
|
else {
|
|
nextNode = hydrateElement(node, vnode, parentComponent, parentSuspense, optimized);
|
|
}
|
|
}
|
|
else if (shapeFlag & 6 /* COMPONENT */) {
|
|
// when setting up the render effect, if the initial vnode already
|
|
// has .el set, the component will perform hydration instead of mount
|
|
// on its sub-tree.
|
|
const container = parentNode(node);
|
|
const hydrateComponent = () => {
|
|
mountComponent(vnode, container, null, parentComponent, parentSuspense, isSVGContainer(container), optimized);
|
|
};
|
|
// async component
|
|
const loadAsync = vnode.type.__asyncLoader;
|
|
if (loadAsync) {
|
|
loadAsync().then(hydrateComponent);
|
|
}
|
|
else {
|
|
hydrateComponent();
|
|
}
|
|
// component may be async, so in the case of fragments we cannot rely
|
|
// on component's rendered output to determine the end of the fragment
|
|
// instead, we do a lookahead to find the end anchor node.
|
|
nextNode = isFragmentStart
|
|
? locateClosingAsyncAnchor(node)
|
|
: nextSibling(node);
|
|
}
|
|
else if (shapeFlag & 64 /* TELEPORT */) {
|
|
if (domType !== 8 /* COMMENT */) {
|
|
nextNode = onMismatch();
|
|
}
|
|
else {
|
|
nextNode = vnode.type.hydrate(node, vnode, parentComponent, parentSuspense, optimized, rendererInternals, hydrateChildren);
|
|
}
|
|
}
|
|
else if (shapeFlag & 128 /* SUSPENSE */) {
|
|
nextNode = vnode.type.hydrate(node, vnode, parentComponent, parentSuspense, isSVGContainer(parentNode(node)), optimized, rendererInternals, hydrateNode);
|
|
}
|
|
else if ((true)) {
|
|
warn('Invalid HostVNode type:', type, `(${typeof type})`);
|
|
}
|
|
}
|
|
if (ref != null) {
|
|
setRef(ref, null, parentSuspense, vnode);
|
|
}
|
|
return nextNode;
|
|
};
|
|
const hydrateElement = (el, vnode, parentComponent, parentSuspense, optimized) => {
|
|
optimized = optimized || !!vnode.dynamicChildren;
|
|
const { props, patchFlag, shapeFlag, dirs } = vnode;
|
|
// skip props & children if this is hoisted static nodes
|
|
if (patchFlag !== -1 /* HOISTED */) {
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, 'created');
|
|
}
|
|
// props
|
|
if (props) {
|
|
if (!optimized ||
|
|
(patchFlag & 16 /* FULL_PROPS */ ||
|
|
patchFlag & 32 /* HYDRATE_EVENTS */)) {
|
|
for (const key in props) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
|
|
patchProp(el, key, null, props[key]);
|
|
}
|
|
}
|
|
}
|
|
else if (props.onClick) {
|
|
// Fast path for click listeners (which is most often) to avoid
|
|
// iterating through props.
|
|
patchProp(el, 'onClick', null, props.onClick);
|
|
}
|
|
}
|
|
// vnode / directive hooks
|
|
let vnodeHooks;
|
|
if ((vnodeHooks = props && props.onVnodeBeforeMount)) {
|
|
invokeVNodeHook(vnodeHooks, parentComponent, vnode);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount');
|
|
}
|
|
if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
|
|
queueEffectWithSuspense(() => {
|
|
vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);
|
|
dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted');
|
|
}, parentSuspense);
|
|
}
|
|
// children
|
|
if (shapeFlag & 16 /* ARRAY_CHILDREN */ &&
|
|
// skip if element has innerHTML / textContent
|
|
!(props && (props.innerHTML || props.textContent))) {
|
|
let next = hydrateChildren(el.firstChild, vnode, el, parentComponent, parentSuspense, optimized);
|
|
let hasWarned = false;
|
|
while (next) {
|
|
hasMismatch = true;
|
|
if (( true) && !hasWarned) {
|
|
warn(`Hydration children mismatch in <${vnode.type}>: ` +
|
|
`server rendered element contains more child nodes than client vdom.`);
|
|
hasWarned = true;
|
|
}
|
|
// The SSRed DOM contains more nodes than it should. Remove them.
|
|
const cur = next;
|
|
next = next.nextSibling;
|
|
remove(cur);
|
|
}
|
|
}
|
|
else if (shapeFlag & 8 /* TEXT_CHILDREN */) {
|
|
if (el.textContent !== vnode.children) {
|
|
hasMismatch = true;
|
|
( true) &&
|
|
warn(`Hydration text content mismatch in <${vnode.type}>:\n` +
|
|
`- Client: ${el.textContent}\n` +
|
|
`- Server: ${vnode.children}`);
|
|
el.textContent = vnode.children;
|
|
}
|
|
}
|
|
}
|
|
return el.nextSibling;
|
|
};
|
|
const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, optimized) => {
|
|
optimized = optimized || !!parentVNode.dynamicChildren;
|
|
const children = parentVNode.children;
|
|
const l = children.length;
|
|
let hasWarned = false;
|
|
for (let i = 0; i < l; i++) {
|
|
const vnode = optimized
|
|
? children[i]
|
|
: (children[i] = normalizeVNode(children[i]));
|
|
if (node) {
|
|
node = hydrateNode(node, vnode, parentComponent, parentSuspense, optimized);
|
|
}
|
|
else {
|
|
hasMismatch = true;
|
|
if (( true) && !hasWarned) {
|
|
warn(`Hydration children mismatch in <${container.tagName.toLowerCase()}>: ` +
|
|
`server rendered element contains fewer child nodes than client vdom.`);
|
|
hasWarned = true;
|
|
}
|
|
// the SSRed DOM didn't contain enough nodes. Mount the missing ones.
|
|
patch(null, vnode, container, null, parentComponent, parentSuspense, isSVGContainer(container));
|
|
}
|
|
}
|
|
return node;
|
|
};
|
|
const hydrateFragment = (node, vnode, parentComponent, parentSuspense, optimized) => {
|
|
const container = parentNode(node);
|
|
const next = hydrateChildren(nextSibling(node), vnode, container, parentComponent, parentSuspense, optimized);
|
|
if (next && isComment(next) && next.data === ']') {
|
|
return nextSibling((vnode.anchor = next));
|
|
}
|
|
else {
|
|
// fragment didn't hydrate successfully, since we didn't get a end anchor
|
|
// back. This should have led to node/children mismatch warnings.
|
|
hasMismatch = true;
|
|
// since the anchor is missing, we need to create one and insert it
|
|
insert((vnode.anchor = createComment(`]`)), container, next);
|
|
return next;
|
|
}
|
|
};
|
|
const handleMismatch = (node, vnode, parentComponent, parentSuspense, isFragment) => {
|
|
hasMismatch = true;
|
|
( true) &&
|
|
warn(`Hydration node mismatch:\n- Client vnode:`, vnode.type, `\n- Server rendered DOM:`, node, node.nodeType === 3 /* TEXT */
|
|
? `(text)`
|
|
: isComment(node) && node.data === '['
|
|
? `(start of fragment)`
|
|
: ``);
|
|
vnode.el = null;
|
|
if (isFragment) {
|
|
// remove excessive fragment nodes
|
|
const end = locateClosingAsyncAnchor(node);
|
|
while (true) {
|
|
const next = nextSibling(node);
|
|
if (next && next !== end) {
|
|
remove(next);
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
const next = nextSibling(node);
|
|
const container = parentNode(node);
|
|
remove(node);
|
|
patch(null, vnode, container, next, parentComponent, parentSuspense, isSVGContainer(container));
|
|
return next;
|
|
};
|
|
const locateClosingAsyncAnchor = (node) => {
|
|
let match = 0;
|
|
while (node) {
|
|
node = nextSibling(node);
|
|
if (node && isComment(node)) {
|
|
if (node.data === '[')
|
|
match++;
|
|
if (node.data === ']') {
|
|
if (match === 0) {
|
|
return nextSibling(node);
|
|
}
|
|
else {
|
|
match--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return node;
|
|
};
|
|
return [hydrate, hydrateNode];
|
|
}
|
|
|
|
let supported;
|
|
let perf;
|
|
function startMeasure(instance, type) {
|
|
if (instance.appContext.config.performance && isSupported()) {
|
|
perf.mark(`vue-${type}-${instance.uid}`);
|
|
}
|
|
}
|
|
function endMeasure(instance, type) {
|
|
if (instance.appContext.config.performance && isSupported()) {
|
|
const startTag = `vue-${type}-${instance.uid}`;
|
|
const endTag = startTag + `:end`;
|
|
perf.mark(endTag);
|
|
perf.measure(`<${formatComponentName(instance, instance.type)}> ${type}`, startTag, endTag);
|
|
perf.clearMarks(startTag);
|
|
perf.clearMarks(endTag);
|
|
}
|
|
}
|
|
function isSupported() {
|
|
if (supported !== undefined) {
|
|
return supported;
|
|
}
|
|
/* eslint-disable no-restricted-globals */
|
|
if (typeof window !== 'undefined' && window.performance) {
|
|
supported = true;
|
|
perf = window.performance;
|
|
}
|
|
else {
|
|
supported = false;
|
|
}
|
|
/* eslint-enable no-restricted-globals */
|
|
return supported;
|
|
}
|
|
|
|
/**
|
|
* This is only called in esm-bundler builds.
|
|
* It is called when a renderer is created, in `baseCreateRenderer` so that
|
|
* importing runtime-core is side-effects free.
|
|
*
|
|
* istanbul-ignore-next
|
|
*/
|
|
function initFeatureFlags() {
|
|
let needWarn = false;
|
|
if (typeof __VUE_OPTIONS_API__ !== 'boolean') {
|
|
needWarn = true;
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_OPTIONS_API__ = true;
|
|
}
|
|
if (typeof __VUE_PROD_DEVTOOLS__ !== 'boolean') {
|
|
needWarn = true;
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_PROD_DEVTOOLS__ = false;
|
|
}
|
|
if (( true) && needWarn) {
|
|
console.warn(`You are running the esm-bundler build of Vue. It is recommended to ` +
|
|
`configure your bundler to explicitly replace feature flag globals ` +
|
|
`with boolean literals to get proper tree-shaking in the final bundle. ` +
|
|
`See http://link.vuejs.org/feature-flags for more details.`);
|
|
}
|
|
}
|
|
|
|
// implementation, close to no-op
|
|
function defineComponent(options) {
|
|
return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(options) ? { setup: options, name: options.name } : options;
|
|
}
|
|
|
|
const isAsyncWrapper = (i) => !!i.type.__asyncLoader;
|
|
function defineAsyncComponent(source) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) {
|
|
source = { loader: source };
|
|
}
|
|
const { loader, loadingComponent, errorComponent, delay = 200, timeout, // undefined = never times out
|
|
suspensible = true, onError: userOnError } = source;
|
|
let pendingRequest = null;
|
|
let resolvedComp;
|
|
let retries = 0;
|
|
const retry = () => {
|
|
retries++;
|
|
pendingRequest = null;
|
|
return load();
|
|
};
|
|
const load = () => {
|
|
let thisRequest;
|
|
return (pendingRequest ||
|
|
(thisRequest = pendingRequest = loader()
|
|
.catch(err => {
|
|
err = err instanceof Error ? err : new Error(String(err));
|
|
if (userOnError) {
|
|
return new Promise((resolve, reject) => {
|
|
const userRetry = () => resolve(retry());
|
|
const userFail = () => reject(err);
|
|
userOnError(err, userRetry, userFail, retries + 1);
|
|
});
|
|
}
|
|
else {
|
|
throw err;
|
|
}
|
|
})
|
|
.then((comp) => {
|
|
if (thisRequest !== pendingRequest && pendingRequest) {
|
|
return pendingRequest;
|
|
}
|
|
if (( true) && !comp) {
|
|
warn(`Async component loader resolved to undefined. ` +
|
|
`If you are using retry(), make sure to return its return value.`);
|
|
}
|
|
// interop module default
|
|
if (comp &&
|
|
(comp.__esModule || comp[Symbol.toStringTag] === 'Module')) {
|
|
comp = comp.default;
|
|
}
|
|
if (( true) && comp && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) {
|
|
throw new Error(`Invalid async component load result: ${comp}`);
|
|
}
|
|
resolvedComp = comp;
|
|
return comp;
|
|
})));
|
|
};
|
|
return defineComponent({
|
|
__asyncLoader: load,
|
|
name: 'AsyncComponentWrapper',
|
|
setup() {
|
|
const instance = currentInstance;
|
|
// already resolved
|
|
if (resolvedComp) {
|
|
return () => createInnerComp(resolvedComp, instance);
|
|
}
|
|
const onError = (err) => {
|
|
pendingRequest = null;
|
|
handleError(err, instance, 13 /* ASYNC_COMPONENT_LOADER */, !errorComponent /* do not throw in dev if user provided error component */);
|
|
};
|
|
// suspense-controlled or SSR.
|
|
if ((suspensible && instance.suspense) ||
|
|
(false )) {
|
|
return load()
|
|
.then(comp => {
|
|
return () => createInnerComp(comp, instance);
|
|
})
|
|
.catch(err => {
|
|
onError(err);
|
|
return () => errorComponent
|
|
? createVNode(errorComponent, {
|
|
error: err
|
|
})
|
|
: null;
|
|
});
|
|
}
|
|
const loaded = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(false);
|
|
const error = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)();
|
|
const delayed = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(!!delay);
|
|
if (delay) {
|
|
setTimeout(() => {
|
|
delayed.value = false;
|
|
}, delay);
|
|
}
|
|
if (timeout != null) {
|
|
setTimeout(() => {
|
|
if (!loaded.value && !error.value) {
|
|
const err = new Error(`Async component timed out after ${timeout}ms.`);
|
|
onError(err);
|
|
error.value = err;
|
|
}
|
|
}, timeout);
|
|
}
|
|
load()
|
|
.then(() => {
|
|
loaded.value = true;
|
|
})
|
|
.catch(err => {
|
|
onError(err);
|
|
error.value = err;
|
|
});
|
|
return () => {
|
|
if (loaded.value && resolvedComp) {
|
|
return createInnerComp(resolvedComp, instance);
|
|
}
|
|
else if (error.value && errorComponent) {
|
|
return createVNode(errorComponent, {
|
|
error: error.value
|
|
});
|
|
}
|
|
else if (loadingComponent && !delayed.value) {
|
|
return createVNode(loadingComponent);
|
|
}
|
|
};
|
|
}
|
|
});
|
|
}
|
|
function createInnerComp(comp, { vnode: { ref, props, children } }) {
|
|
const vnode = createVNode(comp, props, children);
|
|
// ensure inner component inherits the async wrapper's ref owner
|
|
vnode.ref = ref;
|
|
return vnode;
|
|
}
|
|
|
|
const prodEffectOptions = {
|
|
scheduler: queueJob,
|
|
// #1801, #2043 component render effects should allow recursive updates
|
|
allowRecurse: true
|
|
};
|
|
function createDevEffectOptions(instance) {
|
|
return {
|
|
scheduler: queueJob,
|
|
allowRecurse: true,
|
|
onTrack: instance.rtc ? e => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtc, e) : void 0,
|
|
onTrigger: instance.rtg ? e => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtg, e) : void 0
|
|
};
|
|
}
|
|
const queuePostRenderEffect = queueEffectWithSuspense
|
|
;
|
|
const setRef = (rawRef, oldRawRef, parentSuspense, vnode) => {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(rawRef)) {
|
|
rawRef.forEach((r, i) => setRef(r, oldRawRef && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode));
|
|
return;
|
|
}
|
|
let value;
|
|
if (!vnode || isAsyncWrapper(vnode)) {
|
|
value = null;
|
|
}
|
|
else {
|
|
if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) {
|
|
value = vnode.component.exposed || vnode.component.proxy;
|
|
}
|
|
else {
|
|
value = vnode.el;
|
|
}
|
|
}
|
|
const { i: owner, r: ref } = rawRef;
|
|
if (( true) && !owner) {
|
|
warn(`Missing ref owner context. ref cannot be used on hoisted vnodes. ` +
|
|
`A vnode with ref must be created inside the render function.`);
|
|
return;
|
|
}
|
|
const oldRef = oldRawRef && oldRawRef.r;
|
|
const refs = owner.refs === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ ? (owner.refs = {}) : owner.refs;
|
|
const setupState = owner.setupState;
|
|
// unset old ref
|
|
if (oldRef != null && oldRef !== ref) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(oldRef)) {
|
|
refs[oldRef] = null;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, oldRef)) {
|
|
setupState[oldRef] = null;
|
|
}
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(oldRef)) {
|
|
oldRef.value = null;
|
|
}
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref)) {
|
|
const doSet = () => {
|
|
refs[ref] = value;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) {
|
|
setupState[ref] = value;
|
|
}
|
|
};
|
|
// #1789: for non-null values, set them after render
|
|
// null values means this is unmount and it should not overwrite another
|
|
// ref with the same key
|
|
if (value) {
|
|
doSet.id = -1;
|
|
queuePostRenderEffect(doSet, parentSuspense);
|
|
}
|
|
else {
|
|
doSet();
|
|
}
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref)) {
|
|
const doSet = () => {
|
|
ref.value = value;
|
|
};
|
|
if (value) {
|
|
doSet.id = -1;
|
|
queuePostRenderEffect(doSet, parentSuspense);
|
|
}
|
|
else {
|
|
doSet();
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref)) {
|
|
callWithErrorHandling(ref, owner, 12 /* FUNCTION_REF */, [value, refs]);
|
|
}
|
|
else if ((true)) {
|
|
warn('Invalid template ref type:', value, `(${typeof value})`);
|
|
}
|
|
};
|
|
/**
|
|
* The createRenderer function accepts two generic arguments:
|
|
* HostNode and HostElement, corresponding to Node and Element types in the
|
|
* host environment. For example, for runtime-dom, HostNode would be the DOM
|
|
* `Node` interface and HostElement would be the DOM `Element` interface.
|
|
*
|
|
* Custom renderers can pass in the platform specific types like this:
|
|
*
|
|
* ``` js
|
|
* const { render, createApp } = createRenderer<Node, Element>({
|
|
* patchProp,
|
|
* ...nodeOps
|
|
* })
|
|
* ```
|
|
*/
|
|
function createRenderer(options) {
|
|
return baseCreateRenderer(options);
|
|
}
|
|
// Separate API for creating hydration-enabled renderer.
|
|
// Hydration logic is only used when calling this function, making it
|
|
// tree-shakable.
|
|
function createHydrationRenderer(options) {
|
|
return baseCreateRenderer(options, createHydrationFunctions);
|
|
}
|
|
// implementation
|
|
function baseCreateRenderer(options, createHydrationFns) {
|
|
// compile-time feature flags check
|
|
{
|
|
initFeatureFlags();
|
|
}
|
|
if (true) {
|
|
const target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)();
|
|
target.__VUE__ = true;
|
|
setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__);
|
|
}
|
|
const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, forcePatchProp: hostForcePatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, cloneNode: hostCloneNode, insertStaticContent: hostInsertStaticContent } = options;
|
|
// Note: functions inside this closure should use `const xxx = () => {}`
|
|
// style in order to prevent being inlined by minifiers.
|
|
const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, optimized = false) => {
|
|
// patching & not same type, unmount old tree
|
|
if (n1 && !isSameVNodeType(n1, n2)) {
|
|
anchor = getNextHostNode(n1);
|
|
unmount(n1, parentComponent, parentSuspense, true);
|
|
n1 = null;
|
|
}
|
|
if (n2.patchFlag === -2 /* BAIL */) {
|
|
optimized = false;
|
|
n2.dynamicChildren = null;
|
|
}
|
|
const { type, ref, shapeFlag } = n2;
|
|
switch (type) {
|
|
case Text:
|
|
processText(n1, n2, container, anchor);
|
|
break;
|
|
case Comment:
|
|
processCommentNode(n1, n2, container, anchor);
|
|
break;
|
|
case Static:
|
|
if (n1 == null) {
|
|
mountStaticNode(n2, container, anchor, isSVG);
|
|
}
|
|
else if ((true)) {
|
|
patchStaticNode(n1, n2, container, isSVG);
|
|
}
|
|
break;
|
|
case Fragment:
|
|
processFragment(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
break;
|
|
default:
|
|
if (shapeFlag & 1 /* ELEMENT */) {
|
|
processElement(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else if (shapeFlag & 6 /* COMPONENT */) {
|
|
processComponent(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else if (shapeFlag & 64 /* TELEPORT */) {
|
|
type.process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, internals);
|
|
}
|
|
else if (shapeFlag & 128 /* SUSPENSE */) {
|
|
type.process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, internals);
|
|
}
|
|
else if ((true)) {
|
|
warn('Invalid VNode type:', type, `(${typeof type})`);
|
|
}
|
|
}
|
|
// set ref
|
|
if (ref != null && parentComponent) {
|
|
setRef(ref, n1 && n1.ref, parentSuspense, n2);
|
|
}
|
|
};
|
|
const processText = (n1, n2, container, anchor) => {
|
|
if (n1 == null) {
|
|
hostInsert((n2.el = hostCreateText(n2.children)), container, anchor);
|
|
}
|
|
else {
|
|
const el = (n2.el = n1.el);
|
|
if (n2.children !== n1.children) {
|
|
hostSetText(el, n2.children);
|
|
}
|
|
}
|
|
};
|
|
const processCommentNode = (n1, n2, container, anchor) => {
|
|
if (n1 == null) {
|
|
hostInsert((n2.el = hostCreateComment(n2.children || '')), container, anchor);
|
|
}
|
|
else {
|
|
// there's no support for dynamic comments
|
|
n2.el = n1.el;
|
|
}
|
|
};
|
|
const mountStaticNode = (n2, container, anchor, isSVG) => {
|
|
[n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, isSVG);
|
|
};
|
|
/**
|
|
* Dev / HMR only
|
|
*/
|
|
const patchStaticNode = (n1, n2, container, isSVG) => {
|
|
// static nodes are only patched during dev for HMR
|
|
if (n2.children !== n1.children) {
|
|
const anchor = hostNextSibling(n1.anchor);
|
|
// remove existing
|
|
removeStaticNode(n1);
|
|
[n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, isSVG);
|
|
}
|
|
else {
|
|
n2.el = n1.el;
|
|
n2.anchor = n1.anchor;
|
|
}
|
|
};
|
|
const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
|
|
let next;
|
|
while (el && el !== anchor) {
|
|
next = hostNextSibling(el);
|
|
hostInsert(el, container, nextSibling);
|
|
el = next;
|
|
}
|
|
hostInsert(anchor, container, nextSibling);
|
|
};
|
|
const removeStaticNode = ({ el, anchor }) => {
|
|
let next;
|
|
while (el && el !== anchor) {
|
|
next = hostNextSibling(el);
|
|
hostRemove(el);
|
|
el = next;
|
|
}
|
|
hostRemove(anchor);
|
|
};
|
|
const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
isSVG = isSVG || n2.type === 'svg';
|
|
if (n1 == null) {
|
|
mountElement(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else {
|
|
patchElement(n1, n2, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
};
|
|
const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
let el;
|
|
let vnodeHook;
|
|
const { type, props, shapeFlag, transition, scopeId, patchFlag, dirs } = vnode;
|
|
if (false /* HOISTED */) {}
|
|
else {
|
|
el = vnode.el = hostCreateElement(vnode.type, isSVG, props && props.is);
|
|
// mount children first, since some props may rely on child content
|
|
// being already rendered, e.g. `<select value>`
|
|
if (shapeFlag & 8 /* TEXT_CHILDREN */) {
|
|
hostSetElementText(el, vnode.children);
|
|
}
|
|
else if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
mountChildren(vnode.children, el, null, parentComponent, parentSuspense, isSVG && type !== 'foreignObject', optimized || !!vnode.dynamicChildren);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, 'created');
|
|
}
|
|
// props
|
|
if (props) {
|
|
for (const key in props) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) {
|
|
hostPatchProp(el, key, null, props[key], isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
|
|
}
|
|
}
|
|
if ((vnodeHook = props.onVnodeBeforeMount)) {
|
|
invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
}
|
|
}
|
|
// scopeId
|
|
setScopeId(el, scopeId, vnode, parentComponent);
|
|
}
|
|
if (true) {
|
|
Object.defineProperty(el, '__vnode', {
|
|
value: vnode,
|
|
enumerable: false
|
|
});
|
|
Object.defineProperty(el, '__vueParentComponent', {
|
|
value: parentComponent,
|
|
enumerable: false
|
|
});
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount');
|
|
}
|
|
// #1583 For inside suspense + suspense not resolved case, enter hook should call when suspense resolved
|
|
// #1689 For inside suspense + suspense resolved case, just call it
|
|
const needCallTransitionHooks = (!parentSuspense || (parentSuspense && !parentSuspense.pendingBranch)) &&
|
|
transition &&
|
|
!transition.persisted;
|
|
if (needCallTransitionHooks) {
|
|
transition.beforeEnter(el);
|
|
}
|
|
hostInsert(el, container, anchor);
|
|
if ((vnodeHook = props && props.onVnodeMounted) ||
|
|
needCallTransitionHooks ||
|
|
dirs) {
|
|
queuePostRenderEffect(() => {
|
|
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
needCallTransitionHooks && transition.enter(el);
|
|
dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted');
|
|
}, parentSuspense);
|
|
}
|
|
};
|
|
const setScopeId = (el, scopeId, vnode, parentComponent) => {
|
|
if (scopeId) {
|
|
hostSetScopeId(el, scopeId);
|
|
}
|
|
if (parentComponent) {
|
|
const treeOwnerId = parentComponent.type.__scopeId;
|
|
// vnode's own scopeId and the current patched component's scopeId is
|
|
// different - this is a slot content node.
|
|
if (treeOwnerId && treeOwnerId !== scopeId) {
|
|
hostSetScopeId(el, treeOwnerId + '-s');
|
|
}
|
|
let subTree = parentComponent.subTree;
|
|
if (( true) && subTree.type === Fragment) {
|
|
subTree =
|
|
filterSingleRoot(subTree.children) || subTree;
|
|
}
|
|
if (vnode === subTree) {
|
|
setScopeId(el, parentComponent.vnode.scopeId, parentComponent.vnode, parentComponent.parent);
|
|
}
|
|
}
|
|
};
|
|
const mountChildren = (children, container, anchor, parentComponent, parentSuspense, isSVG, optimized, start = 0) => {
|
|
for (let i = start; i < children.length; i++) {
|
|
const child = (children[i] = optimized
|
|
? cloneIfMounted(children[i])
|
|
: normalizeVNode(children[i]));
|
|
patch(null, child, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
};
|
|
const patchElement = (n1, n2, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
const el = (n2.el = n1.el);
|
|
let { patchFlag, dynamicChildren, dirs } = n2;
|
|
// #1426 take the old vnode's patch flag into account since user may clone a
|
|
// compiler-generated vnode, which de-opts to FULL_PROPS
|
|
patchFlag |= n1.patchFlag & 16 /* FULL_PROPS */;
|
|
const oldProps = n1.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
const newProps = n2.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
let vnodeHook;
|
|
if ((vnodeHook = newProps.onVnodeBeforeUpdate)) {
|
|
invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
|
|
}
|
|
if (dirs) {
|
|
invokeDirectiveHook(n2, n1, parentComponent, 'beforeUpdate');
|
|
}
|
|
if (( true) && isHmrUpdating) {
|
|
// HMR updated, force full diff
|
|
patchFlag = 0;
|
|
optimized = false;
|
|
dynamicChildren = null;
|
|
}
|
|
if (patchFlag > 0) {
|
|
// the presence of a patchFlag means this element's render code was
|
|
// generated by the compiler and can take the fast path.
|
|
// in this path old node and new node are guaranteed to have the same shape
|
|
// (i.e. at the exact same position in the source template)
|
|
if (patchFlag & 16 /* FULL_PROPS */) {
|
|
// element props contain dynamic keys, full diff needed
|
|
patchProps(el, n2, oldProps, newProps, parentComponent, parentSuspense, isSVG);
|
|
}
|
|
else {
|
|
// class
|
|
// this flag is matched when the element has dynamic class bindings.
|
|
if (patchFlag & 2 /* CLASS */) {
|
|
if (oldProps.class !== newProps.class) {
|
|
hostPatchProp(el, 'class', null, newProps.class, isSVG);
|
|
}
|
|
}
|
|
// style
|
|
// this flag is matched when the element has dynamic style bindings
|
|
if (patchFlag & 4 /* STYLE */) {
|
|
hostPatchProp(el, 'style', oldProps.style, newProps.style, isSVG);
|
|
}
|
|
// props
|
|
// This flag is matched when the element has dynamic prop/attr bindings
|
|
// other than class and style. The keys of dynamic prop/attrs are saved for
|
|
// faster iteration.
|
|
// Note dynamic keys like :[foo]="bar" will cause this optimization to
|
|
// bail out and go through a full diff because we need to unset the old key
|
|
if (patchFlag & 8 /* PROPS */) {
|
|
// if the flag is present then dynamicProps must be non-null
|
|
const propsToUpdate = n2.dynamicProps;
|
|
for (let i = 0; i < propsToUpdate.length; i++) {
|
|
const key = propsToUpdate[i];
|
|
const prev = oldProps[key];
|
|
const next = newProps[key];
|
|
if (next !== prev ||
|
|
(hostForcePatchProp && hostForcePatchProp(el, key))) {
|
|
hostPatchProp(el, key, prev, next, isSVG, n1.children, parentComponent, parentSuspense, unmountChildren);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// text
|
|
// This flag is matched when the element has only dynamic text children.
|
|
if (patchFlag & 1 /* TEXT */) {
|
|
if (n1.children !== n2.children) {
|
|
hostSetElementText(el, n2.children);
|
|
}
|
|
}
|
|
}
|
|
else if (!optimized && dynamicChildren == null) {
|
|
// unoptimized, full diff
|
|
patchProps(el, n2, oldProps, newProps, parentComponent, parentSuspense, isSVG);
|
|
}
|
|
const areChildrenSVG = isSVG && n2.type !== 'foreignObject';
|
|
if (dynamicChildren) {
|
|
patchBlockChildren(n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, areChildrenSVG);
|
|
if (( true) && parentComponent && parentComponent.type.__hmrId) {
|
|
traverseStaticChildren(n1, n2);
|
|
}
|
|
}
|
|
else if (!optimized) {
|
|
// full diff
|
|
patchChildren(n1, n2, el, null, parentComponent, parentSuspense, areChildrenSVG);
|
|
}
|
|
if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
|
|
queuePostRenderEffect(() => {
|
|
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
|
|
dirs && invokeDirectiveHook(n2, n1, parentComponent, 'updated');
|
|
}, parentSuspense);
|
|
}
|
|
};
|
|
// The fast path for blocks.
|
|
const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, isSVG) => {
|
|
for (let i = 0; i < newChildren.length; i++) {
|
|
const oldVNode = oldChildren[i];
|
|
const newVNode = newChildren[i];
|
|
// Determine the container (parent element) for the patch.
|
|
const container =
|
|
// - In the case of a Fragment, we need to provide the actual parent
|
|
// of the Fragment itself so it can move its children.
|
|
oldVNode.type === Fragment ||
|
|
// - In the case of different nodes, there is going to be a replacement
|
|
// which also requires the correct parent container
|
|
!isSameVNodeType(oldVNode, newVNode) ||
|
|
// - In the case of a component, it could contain anything.
|
|
oldVNode.shapeFlag & 6 /* COMPONENT */ ||
|
|
oldVNode.shapeFlag & 64 /* TELEPORT */
|
|
? hostParentNode(oldVNode.el)
|
|
: // In other cases, the parent container is not actually used so we
|
|
// just pass the block element here to avoid a DOM parentNode call.
|
|
fallbackContainer;
|
|
patch(oldVNode, newVNode, container, null, parentComponent, parentSuspense, isSVG, true);
|
|
}
|
|
};
|
|
const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {
|
|
if (oldProps !== newProps) {
|
|
for (const key in newProps) {
|
|
// empty string is not valid prop
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key))
|
|
continue;
|
|
const next = newProps[key];
|
|
const prev = oldProps[key];
|
|
if (next !== prev ||
|
|
(hostForcePatchProp && hostForcePatchProp(el, key))) {
|
|
hostPatchProp(el, key, prev, next, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
|
|
}
|
|
}
|
|
if (oldProps !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
|
|
for (const key in oldProps) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) && !(key in newProps)) {
|
|
hostPatchProp(el, key, oldProps[key], null, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
const fragmentStartAnchor = (n2.el = n1 ? n1.el : hostCreateText(''));
|
|
const fragmentEndAnchor = (n2.anchor = n1 ? n1.anchor : hostCreateText(''));
|
|
let { patchFlag, dynamicChildren } = n2;
|
|
if (patchFlag > 0) {
|
|
optimized = true;
|
|
}
|
|
if (( true) && isHmrUpdating) {
|
|
// HMR updated, force full diff
|
|
patchFlag = 0;
|
|
optimized = false;
|
|
dynamicChildren = null;
|
|
}
|
|
if (n1 == null) {
|
|
hostInsert(fragmentStartAnchor, container, anchor);
|
|
hostInsert(fragmentEndAnchor, container, anchor);
|
|
// a fragment can only have array children
|
|
// since they are either generated by the compiler, or implicitly created
|
|
// from arrays.
|
|
mountChildren(n2.children, container, fragmentEndAnchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else {
|
|
if (patchFlag > 0 &&
|
|
patchFlag & 64 /* STABLE_FRAGMENT */ &&
|
|
dynamicChildren &&
|
|
// #2715 the previous fragment could've been a BAILed one as a result
|
|
// of renderSlot() with no valid children
|
|
n1.dynamicChildren) {
|
|
// a stable fragment (template root or <template v-for>) doesn't need to
|
|
// patch children order, but it may contain dynamicChildren.
|
|
patchBlockChildren(n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, isSVG);
|
|
if (( true) && parentComponent && parentComponent.type.__hmrId) {
|
|
traverseStaticChildren(n1, n2);
|
|
}
|
|
else if (
|
|
// #2080 if the stable fragment has a key, it's a <template v-for> that may
|
|
// get moved around. Make sure all root level vnodes inherit el.
|
|
// #2134 or if it's a component root, it may also get moved around
|
|
// as the component is being moved.
|
|
n2.key != null ||
|
|
(parentComponent && n2 === parentComponent.subTree)) {
|
|
traverseStaticChildren(n1, n2, true /* shallow */);
|
|
}
|
|
}
|
|
else {
|
|
// keyed / unkeyed, or manual fragments.
|
|
// for keyed & unkeyed, since they are compiler generated from v-for,
|
|
// each child is guaranteed to be a block so the fragment will never
|
|
// have dynamicChildren.
|
|
patchChildren(n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
}
|
|
};
|
|
const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
if (n1 == null) {
|
|
if (n2.shapeFlag & 512 /* COMPONENT_KEPT_ALIVE */) {
|
|
parentComponent.ctx.activate(n2, container, anchor, isSVG, optimized);
|
|
}
|
|
else {
|
|
mountComponent(n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
}
|
|
else {
|
|
updateComponent(n1, n2, optimized);
|
|
}
|
|
};
|
|
const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
const instance = (initialVNode.component = createComponentInstance(initialVNode, parentComponent, parentSuspense));
|
|
if (( true) && instance.type.__hmrId) {
|
|
registerHMR(instance);
|
|
}
|
|
if ((true)) {
|
|
pushWarningContext(initialVNode);
|
|
startMeasure(instance, `mount`);
|
|
}
|
|
// inject renderer internals for keepAlive
|
|
if (isKeepAlive(initialVNode)) {
|
|
instance.ctx.renderer = internals;
|
|
}
|
|
// resolve props and slots for setup context
|
|
if ((true)) {
|
|
startMeasure(instance, `init`);
|
|
}
|
|
setupComponent(instance);
|
|
if ((true)) {
|
|
endMeasure(instance, `init`);
|
|
}
|
|
// setup() is async. This component relies on async logic to be resolved
|
|
// before proceeding
|
|
if (instance.asyncDep) {
|
|
parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect);
|
|
// Give it a placeholder if this is not hydration
|
|
// TODO handle self-defined fallback
|
|
if (!initialVNode.el) {
|
|
const placeholder = (instance.subTree = createVNode(Comment));
|
|
processCommentNode(null, placeholder, container, anchor);
|
|
}
|
|
return;
|
|
}
|
|
setupRenderEffect(instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized);
|
|
if ((true)) {
|
|
popWarningContext();
|
|
endMeasure(instance, `mount`);
|
|
}
|
|
};
|
|
const updateComponent = (n1, n2, optimized) => {
|
|
const instance = (n2.component = n1.component);
|
|
if (shouldUpdateComponent(n1, n2, optimized)) {
|
|
if (instance.asyncDep &&
|
|
!instance.asyncResolved) {
|
|
// async & still pending - just update props and slots
|
|
// since the component's reactive effect for render isn't set-up yet
|
|
if ((true)) {
|
|
pushWarningContext(n2);
|
|
}
|
|
updateComponentPreRender(instance, n2, optimized);
|
|
if ((true)) {
|
|
popWarningContext();
|
|
}
|
|
return;
|
|
}
|
|
else {
|
|
// normal update
|
|
instance.next = n2;
|
|
// in case the child component is also queued, remove it to avoid
|
|
// double updating the same child component in the same flush.
|
|
invalidateJob(instance.update);
|
|
// instance.update is the reactive effect runner.
|
|
instance.update();
|
|
}
|
|
}
|
|
else {
|
|
// no update needed. just copy over properties
|
|
n2.component = n1.component;
|
|
n2.el = n1.el;
|
|
instance.vnode = n2;
|
|
}
|
|
};
|
|
const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {
|
|
// create reactive effect for rendering
|
|
instance.update = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effect)(function componentEffect() {
|
|
if (!instance.isMounted) {
|
|
let vnodeHook;
|
|
const { el, props } = initialVNode;
|
|
const { bm, m, parent } = instance;
|
|
// beforeMount hook
|
|
if (bm) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bm);
|
|
}
|
|
// onVnodeBeforeMount
|
|
if ((vnodeHook = props && props.onVnodeBeforeMount)) {
|
|
invokeVNodeHook(vnodeHook, parent, initialVNode);
|
|
}
|
|
// render
|
|
if ((true)) {
|
|
startMeasure(instance, `render`);
|
|
}
|
|
const subTree = (instance.subTree = renderComponentRoot(instance));
|
|
if ((true)) {
|
|
endMeasure(instance, `render`);
|
|
}
|
|
if (el && hydrateNode) {
|
|
if ((true)) {
|
|
startMeasure(instance, `hydrate`);
|
|
}
|
|
// vnode has adopted host node - perform hydration instead of mount.
|
|
hydrateNode(initialVNode.el, subTree, instance, parentSuspense);
|
|
if ((true)) {
|
|
endMeasure(instance, `hydrate`);
|
|
}
|
|
}
|
|
else {
|
|
if ((true)) {
|
|
startMeasure(instance, `patch`);
|
|
}
|
|
patch(null, subTree, container, anchor, instance, parentSuspense, isSVG);
|
|
if ((true)) {
|
|
endMeasure(instance, `patch`);
|
|
}
|
|
initialVNode.el = subTree.el;
|
|
}
|
|
// mounted hook
|
|
if (m) {
|
|
queuePostRenderEffect(m, parentSuspense);
|
|
}
|
|
// onVnodeMounted
|
|
if ((vnodeHook = props && props.onVnodeMounted)) {
|
|
const scopedInitialVNode = initialVNode;
|
|
queuePostRenderEffect(() => {
|
|
invokeVNodeHook(vnodeHook, parent, scopedInitialVNode);
|
|
}, parentSuspense);
|
|
}
|
|
// activated hook for keep-alive roots.
|
|
// #1742 activated hook must be accessed after first render
|
|
// since the hook may be injected by a child keep-alive
|
|
const { a } = instance;
|
|
if (a &&
|
|
initialVNode.shapeFlag & 256 /* COMPONENT_SHOULD_KEEP_ALIVE */) {
|
|
queuePostRenderEffect(a, parentSuspense);
|
|
}
|
|
instance.isMounted = true;
|
|
if (true) {
|
|
devtoolsComponentAdded(instance);
|
|
}
|
|
// #2458: deference mount-only object parameters to prevent memleaks
|
|
initialVNode = container = anchor = null;
|
|
}
|
|
else {
|
|
// updateComponent
|
|
// This is triggered by mutation of component's own state (next: null)
|
|
// OR parent calling processComponent (next: VNode)
|
|
let { next, bu, u, parent, vnode } = instance;
|
|
let originNext = next;
|
|
let vnodeHook;
|
|
if ((true)) {
|
|
pushWarningContext(next || instance.vnode);
|
|
}
|
|
if (next) {
|
|
next.el = vnode.el;
|
|
updateComponentPreRender(instance, next, optimized);
|
|
}
|
|
else {
|
|
next = vnode;
|
|
}
|
|
// beforeUpdate hook
|
|
if (bu) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bu);
|
|
}
|
|
// onVnodeBeforeUpdate
|
|
if ((vnodeHook = next.props && next.props.onVnodeBeforeUpdate)) {
|
|
invokeVNodeHook(vnodeHook, parent, next, vnode);
|
|
}
|
|
// render
|
|
if ((true)) {
|
|
startMeasure(instance, `render`);
|
|
}
|
|
const nextTree = renderComponentRoot(instance);
|
|
if ((true)) {
|
|
endMeasure(instance, `render`);
|
|
}
|
|
const prevTree = instance.subTree;
|
|
instance.subTree = nextTree;
|
|
if ((true)) {
|
|
startMeasure(instance, `patch`);
|
|
}
|
|
patch(prevTree, nextTree,
|
|
// parent may have changed if it's in a teleport
|
|
hostParentNode(prevTree.el),
|
|
// anchor may have changed if it's in a fragment
|
|
getNextHostNode(prevTree), instance, parentSuspense, isSVG);
|
|
if ((true)) {
|
|
endMeasure(instance, `patch`);
|
|
}
|
|
next.el = nextTree.el;
|
|
if (originNext === null) {
|
|
// self-triggered update. In case of HOC, update parent component
|
|
// vnode el. HOC is indicated by parent instance's subTree pointing
|
|
// to child component's vnode
|
|
updateHOCHostEl(instance, nextTree.el);
|
|
}
|
|
// updated hook
|
|
if (u) {
|
|
queuePostRenderEffect(u, parentSuspense);
|
|
}
|
|
// onVnodeUpdated
|
|
if ((vnodeHook = next.props && next.props.onVnodeUpdated)) {
|
|
queuePostRenderEffect(() => {
|
|
invokeVNodeHook(vnodeHook, parent, next, vnode);
|
|
}, parentSuspense);
|
|
}
|
|
if (true) {
|
|
devtoolsComponentUpdated(instance);
|
|
}
|
|
if ((true)) {
|
|
popWarningContext();
|
|
}
|
|
}
|
|
}, ( true) ? createDevEffectOptions(instance) : 0);
|
|
};
|
|
const updateComponentPreRender = (instance, nextVNode, optimized) => {
|
|
nextVNode.component = instance;
|
|
const prevProps = instance.vnode.props;
|
|
instance.vnode = nextVNode;
|
|
instance.next = null;
|
|
updateProps(instance, nextVNode.props, prevProps, optimized);
|
|
updateSlots(instance, nextVNode.children);
|
|
// props update may have triggered pre-flush watchers.
|
|
// flush them before the render update.
|
|
flushPreFlushCbs(undefined, instance.update);
|
|
};
|
|
const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized = false) => {
|
|
const c1 = n1 && n1.children;
|
|
const prevShapeFlag = n1 ? n1.shapeFlag : 0;
|
|
const c2 = n2.children;
|
|
const { patchFlag, shapeFlag } = n2;
|
|
// fast path
|
|
if (patchFlag > 0) {
|
|
if (patchFlag & 128 /* KEYED_FRAGMENT */) {
|
|
// this could be either fully-keyed or mixed (some keyed some not)
|
|
// presence of patchFlag means children are guaranteed to be arrays
|
|
patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
return;
|
|
}
|
|
else if (patchFlag & 256 /* UNKEYED_FRAGMENT */) {
|
|
// unkeyed
|
|
patchUnkeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
return;
|
|
}
|
|
}
|
|
// children has 3 possibilities: text, array or no children.
|
|
if (shapeFlag & 8 /* TEXT_CHILDREN */) {
|
|
// text children fast path
|
|
if (prevShapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
unmountChildren(c1, parentComponent, parentSuspense);
|
|
}
|
|
if (c2 !== c1) {
|
|
hostSetElementText(container, c2);
|
|
}
|
|
}
|
|
else {
|
|
if (prevShapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
// prev children was array
|
|
if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
// two arrays, cannot assume anything, do full diff
|
|
patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else {
|
|
// no new children, just unmount old
|
|
unmountChildren(c1, parentComponent, parentSuspense, true);
|
|
}
|
|
}
|
|
else {
|
|
// prev children was text OR null
|
|
// new children is array OR null
|
|
if (prevShapeFlag & 8 /* TEXT_CHILDREN */) {
|
|
hostSetElementText(container, '');
|
|
}
|
|
// mount new if array
|
|
if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
mountChildren(c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
c1 = c1 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
|
|
c2 = c2 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
|
|
const oldLength = c1.length;
|
|
const newLength = c2.length;
|
|
const commonLength = Math.min(oldLength, newLength);
|
|
let i;
|
|
for (i = 0; i < commonLength; i++) {
|
|
const nextChild = (c2[i] = optimized
|
|
? cloneIfMounted(c2[i])
|
|
: normalizeVNode(c2[i]));
|
|
patch(c1[i], nextChild, container, null, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
if (oldLength > newLength) {
|
|
// remove old
|
|
unmountChildren(c1, parentComponent, parentSuspense, true, false, commonLength);
|
|
}
|
|
else {
|
|
// mount new
|
|
mountChildren(c2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, commonLength);
|
|
}
|
|
};
|
|
// can be all-keyed or mixed
|
|
const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, optimized) => {
|
|
let i = 0;
|
|
const l2 = c2.length;
|
|
let e1 = c1.length - 1; // prev ending index
|
|
let e2 = l2 - 1; // next ending index
|
|
// 1. sync from start
|
|
// (a b) c
|
|
// (a b) d e
|
|
while (i <= e1 && i <= e2) {
|
|
const n1 = c1[i];
|
|
const n2 = (c2[i] = optimized
|
|
? cloneIfMounted(c2[i])
|
|
: normalizeVNode(c2[i]));
|
|
if (isSameVNodeType(n1, n2)) {
|
|
patch(n1, n2, container, null, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
// 2. sync from end
|
|
// a (b c)
|
|
// d e (b c)
|
|
while (i <= e1 && i <= e2) {
|
|
const n1 = c1[e1];
|
|
const n2 = (c2[e2] = optimized
|
|
? cloneIfMounted(c2[e2])
|
|
: normalizeVNode(c2[e2]));
|
|
if (isSameVNodeType(n1, n2)) {
|
|
patch(n1, n2, container, null, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
e1--;
|
|
e2--;
|
|
}
|
|
// 3. common sequence + mount
|
|
// (a b)
|
|
// (a b) c
|
|
// i = 2, e1 = 1, e2 = 2
|
|
// (a b)
|
|
// c (a b)
|
|
// i = 0, e1 = -1, e2 = 0
|
|
if (i > e1) {
|
|
if (i <= e2) {
|
|
const nextPos = e2 + 1;
|
|
const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
|
|
while (i <= e2) {
|
|
patch(null, (c2[i] = optimized
|
|
? cloneIfMounted(c2[i])
|
|
: normalizeVNode(c2[i])), container, anchor, parentComponent, parentSuspense, isSVG);
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
// 4. common sequence + unmount
|
|
// (a b) c
|
|
// (a b)
|
|
// i = 2, e1 = 2, e2 = 1
|
|
// a (b c)
|
|
// (b c)
|
|
// i = 0, e1 = 0, e2 = -1
|
|
else if (i > e2) {
|
|
while (i <= e1) {
|
|
unmount(c1[i], parentComponent, parentSuspense, true);
|
|
i++;
|
|
}
|
|
}
|
|
// 5. unknown sequence
|
|
// [i ... e1 + 1]: a b [c d e] f g
|
|
// [i ... e2 + 1]: a b [e d c h] f g
|
|
// i = 2, e1 = 4, e2 = 5
|
|
else {
|
|
const s1 = i; // prev starting index
|
|
const s2 = i; // next starting index
|
|
// 5.1 build key:index map for newChildren
|
|
const keyToNewIndexMap = new Map();
|
|
for (i = s2; i <= e2; i++) {
|
|
const nextChild = (c2[i] = optimized
|
|
? cloneIfMounted(c2[i])
|
|
: normalizeVNode(c2[i]));
|
|
if (nextChild.key != null) {
|
|
if (( true) && keyToNewIndexMap.has(nextChild.key)) {
|
|
warn(`Duplicate keys found during update:`, JSON.stringify(nextChild.key), `Make sure keys are unique.`);
|
|
}
|
|
keyToNewIndexMap.set(nextChild.key, i);
|
|
}
|
|
}
|
|
// 5.2 loop through old children left to be patched and try to patch
|
|
// matching nodes & remove nodes that are no longer present
|
|
let j;
|
|
let patched = 0;
|
|
const toBePatched = e2 - s2 + 1;
|
|
let moved = false;
|
|
// used to track whether any node has moved
|
|
let maxNewIndexSoFar = 0;
|
|
// works as Map<newIndex, oldIndex>
|
|
// Note that oldIndex is offset by +1
|
|
// and oldIndex = 0 is a special value indicating the new node has
|
|
// no corresponding old node.
|
|
// used for determining longest stable subsequence
|
|
const newIndexToOldIndexMap = new Array(toBePatched);
|
|
for (i = 0; i < toBePatched; i++)
|
|
newIndexToOldIndexMap[i] = 0;
|
|
for (i = s1; i <= e1; i++) {
|
|
const prevChild = c1[i];
|
|
if (patched >= toBePatched) {
|
|
// all new children have been patched so this can only be a removal
|
|
unmount(prevChild, parentComponent, parentSuspense, true);
|
|
continue;
|
|
}
|
|
let newIndex;
|
|
if (prevChild.key != null) {
|
|
newIndex = keyToNewIndexMap.get(prevChild.key);
|
|
}
|
|
else {
|
|
// key-less node, try to locate a key-less node of the same type
|
|
for (j = s2; j <= e2; j++) {
|
|
if (newIndexToOldIndexMap[j - s2] === 0 &&
|
|
isSameVNodeType(prevChild, c2[j])) {
|
|
newIndex = j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (newIndex === undefined) {
|
|
unmount(prevChild, parentComponent, parentSuspense, true);
|
|
}
|
|
else {
|
|
newIndexToOldIndexMap[newIndex - s2] = i + 1;
|
|
if (newIndex >= maxNewIndexSoFar) {
|
|
maxNewIndexSoFar = newIndex;
|
|
}
|
|
else {
|
|
moved = true;
|
|
}
|
|
patch(prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, isSVG, optimized);
|
|
patched++;
|
|
}
|
|
}
|
|
// 5.3 move and mount
|
|
// generate longest stable subsequence only when nodes have moved
|
|
const increasingNewIndexSequence = moved
|
|
? getSequence(newIndexToOldIndexMap)
|
|
: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
|
|
j = increasingNewIndexSequence.length - 1;
|
|
// looping backwards so that we can use last patched node as anchor
|
|
for (i = toBePatched - 1; i >= 0; i--) {
|
|
const nextIndex = s2 + i;
|
|
const nextChild = c2[nextIndex];
|
|
const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;
|
|
if (newIndexToOldIndexMap[i] === 0) {
|
|
// mount new
|
|
patch(null, nextChild, container, anchor, parentComponent, parentSuspense, isSVG);
|
|
}
|
|
else if (moved) {
|
|
// move if:
|
|
// There is no stable subsequence (e.g. a reverse)
|
|
// OR current node is not among the stable sequence
|
|
if (j < 0 || i !== increasingNewIndexSequence[j]) {
|
|
move(nextChild, container, anchor, 2 /* REORDER */);
|
|
}
|
|
else {
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
|
|
const { el, type, transition, children, shapeFlag } = vnode;
|
|
if (shapeFlag & 6 /* COMPONENT */) {
|
|
move(vnode.component.subTree, container, anchor, moveType);
|
|
return;
|
|
}
|
|
if (shapeFlag & 128 /* SUSPENSE */) {
|
|
vnode.suspense.move(container, anchor, moveType);
|
|
return;
|
|
}
|
|
if (shapeFlag & 64 /* TELEPORT */) {
|
|
type.move(vnode, container, anchor, internals);
|
|
return;
|
|
}
|
|
if (type === Fragment) {
|
|
hostInsert(el, container, anchor);
|
|
for (let i = 0; i < children.length; i++) {
|
|
move(children[i], container, anchor, moveType);
|
|
}
|
|
hostInsert(vnode.anchor, container, anchor);
|
|
return;
|
|
}
|
|
if (type === Static) {
|
|
moveStaticNode(vnode, container, anchor);
|
|
return;
|
|
}
|
|
// single nodes
|
|
const needTransition = moveType !== 2 /* REORDER */ &&
|
|
shapeFlag & 1 /* ELEMENT */ &&
|
|
transition;
|
|
if (needTransition) {
|
|
if (moveType === 0 /* ENTER */) {
|
|
transition.beforeEnter(el);
|
|
hostInsert(el, container, anchor);
|
|
queuePostRenderEffect(() => transition.enter(el), parentSuspense);
|
|
}
|
|
else {
|
|
const { leave, delayLeave, afterLeave } = transition;
|
|
const remove = () => hostInsert(el, container, anchor);
|
|
const performLeave = () => {
|
|
leave(el, () => {
|
|
remove();
|
|
afterLeave && afterLeave();
|
|
});
|
|
};
|
|
if (delayLeave) {
|
|
delayLeave(el, remove, performLeave);
|
|
}
|
|
else {
|
|
performLeave();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
hostInsert(el, container, anchor);
|
|
}
|
|
};
|
|
const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
|
|
const { type, props, ref, children, dynamicChildren, shapeFlag, patchFlag, dirs } = vnode;
|
|
// unset ref
|
|
if (ref != null) {
|
|
setRef(ref, null, parentSuspense, null);
|
|
}
|
|
if (shapeFlag & 256 /* COMPONENT_SHOULD_KEEP_ALIVE */) {
|
|
parentComponent.ctx.deactivate(vnode);
|
|
return;
|
|
}
|
|
const shouldInvokeDirs = shapeFlag & 1 /* ELEMENT */ && dirs;
|
|
let vnodeHook;
|
|
if ((vnodeHook = props && props.onVnodeBeforeUnmount)) {
|
|
invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
}
|
|
if (shapeFlag & 6 /* COMPONENT */) {
|
|
unmountComponent(vnode.component, parentSuspense, doRemove);
|
|
}
|
|
else {
|
|
if (shapeFlag & 128 /* SUSPENSE */) {
|
|
vnode.suspense.unmount(parentSuspense, doRemove);
|
|
return;
|
|
}
|
|
if (shouldInvokeDirs) {
|
|
invokeDirectiveHook(vnode, null, parentComponent, 'beforeUnmount');
|
|
}
|
|
if (dynamicChildren &&
|
|
// #1153: fast path should not be taken for non-stable (v-for) fragments
|
|
(type !== Fragment ||
|
|
(patchFlag > 0 && patchFlag & 64 /* STABLE_FRAGMENT */))) {
|
|
// fast path for block nodes: only need to unmount dynamic children.
|
|
unmountChildren(dynamicChildren, parentComponent, parentSuspense, false, true);
|
|
}
|
|
else if ((type === Fragment &&
|
|
(patchFlag & 128 /* KEYED_FRAGMENT */ ||
|
|
patchFlag & 256 /* UNKEYED_FRAGMENT */)) ||
|
|
(!optimized && shapeFlag & 16 /* ARRAY_CHILDREN */)) {
|
|
unmountChildren(children, parentComponent, parentSuspense);
|
|
}
|
|
// an unmounted teleport should always remove its children if not disabled
|
|
if (shapeFlag & 64 /* TELEPORT */ &&
|
|
(doRemove || !isTeleportDisabled(vnode.props))) {
|
|
vnode.type.remove(vnode, internals);
|
|
}
|
|
if (doRemove) {
|
|
remove(vnode);
|
|
}
|
|
}
|
|
if ((vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {
|
|
queuePostRenderEffect(() => {
|
|
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
|
|
shouldInvokeDirs &&
|
|
invokeDirectiveHook(vnode, null, parentComponent, 'unmounted');
|
|
}, parentSuspense);
|
|
}
|
|
};
|
|
const remove = vnode => {
|
|
const { type, el, anchor, transition } = vnode;
|
|
if (type === Fragment) {
|
|
removeFragment(el, anchor);
|
|
return;
|
|
}
|
|
if (type === Static) {
|
|
removeStaticNode(vnode);
|
|
return;
|
|
}
|
|
const performRemove = () => {
|
|
hostRemove(el);
|
|
if (transition && !transition.persisted && transition.afterLeave) {
|
|
transition.afterLeave();
|
|
}
|
|
};
|
|
if (vnode.shapeFlag & 1 /* ELEMENT */ &&
|
|
transition &&
|
|
!transition.persisted) {
|
|
const { leave, delayLeave } = transition;
|
|
const performLeave = () => leave(el, performRemove);
|
|
if (delayLeave) {
|
|
delayLeave(vnode.el, performRemove, performLeave);
|
|
}
|
|
else {
|
|
performLeave();
|
|
}
|
|
}
|
|
else {
|
|
performRemove();
|
|
}
|
|
};
|
|
const removeFragment = (cur, end) => {
|
|
// For fragments, directly remove all contained DOM nodes.
|
|
// (fragment child nodes cannot have transition)
|
|
let next;
|
|
while (cur !== end) {
|
|
next = hostNextSibling(cur);
|
|
hostRemove(cur);
|
|
cur = next;
|
|
}
|
|
hostRemove(end);
|
|
};
|
|
const unmountComponent = (instance, parentSuspense, doRemove) => {
|
|
if (( true) && instance.type.__hmrId) {
|
|
unregisterHMR(instance);
|
|
}
|
|
const { bum, effects, update, subTree, um } = instance;
|
|
// beforeUnmount hook
|
|
if (bum) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bum);
|
|
}
|
|
if (effects) {
|
|
for (let i = 0; i < effects.length; i++) {
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.stop)(effects[i]);
|
|
}
|
|
}
|
|
// update may be null if a component is unmounted before its async
|
|
// setup has resolved.
|
|
if (update) {
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.stop)(update);
|
|
unmount(subTree, instance, parentSuspense, doRemove);
|
|
}
|
|
// unmounted hook
|
|
if (um) {
|
|
queuePostRenderEffect(um, parentSuspense);
|
|
}
|
|
queuePostRenderEffect(() => {
|
|
instance.isUnmounted = true;
|
|
}, parentSuspense);
|
|
// A component with async dep inside a pending suspense is unmounted before
|
|
// its async dep resolves. This should remove the dep from the suspense, and
|
|
// cause the suspense to resolve immediately if that was the last dep.
|
|
if (parentSuspense &&
|
|
parentSuspense.pendingBranch &&
|
|
!parentSuspense.isUnmounted &&
|
|
instance.asyncDep &&
|
|
!instance.asyncResolved &&
|
|
instance.suspenseId === parentSuspense.pendingId) {
|
|
parentSuspense.deps--;
|
|
if (parentSuspense.deps === 0) {
|
|
parentSuspense.resolve();
|
|
}
|
|
}
|
|
if (true) {
|
|
devtoolsComponentRemoved(instance);
|
|
}
|
|
};
|
|
const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
|
|
for (let i = start; i < children.length; i++) {
|
|
unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
|
|
}
|
|
};
|
|
const getNextHostNode = vnode => {
|
|
if (vnode.shapeFlag & 6 /* COMPONENT */) {
|
|
return getNextHostNode(vnode.component.subTree);
|
|
}
|
|
if (vnode.shapeFlag & 128 /* SUSPENSE */) {
|
|
return vnode.suspense.next();
|
|
}
|
|
return hostNextSibling((vnode.anchor || vnode.el));
|
|
};
|
|
const render = (vnode, container) => {
|
|
if (vnode == null) {
|
|
if (container._vnode) {
|
|
unmount(container._vnode, null, null, true);
|
|
}
|
|
}
|
|
else {
|
|
patch(container._vnode || null, vnode, container);
|
|
}
|
|
flushPostFlushCbs();
|
|
container._vnode = vnode;
|
|
};
|
|
const internals = {
|
|
p: patch,
|
|
um: unmount,
|
|
m: move,
|
|
r: remove,
|
|
mt: mountComponent,
|
|
mc: mountChildren,
|
|
pc: patchChildren,
|
|
pbc: patchBlockChildren,
|
|
n: getNextHostNode,
|
|
o: options
|
|
};
|
|
let hydrate;
|
|
let hydrateNode;
|
|
if (createHydrationFns) {
|
|
[hydrate, hydrateNode] = createHydrationFns(internals);
|
|
}
|
|
return {
|
|
render,
|
|
hydrate,
|
|
createApp: createAppAPI(render, hydrate)
|
|
};
|
|
}
|
|
function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
|
|
callWithAsyncErrorHandling(hook, instance, 7 /* VNODE_HOOK */, [
|
|
vnode,
|
|
prevVNode
|
|
]);
|
|
}
|
|
/**
|
|
* #1156
|
|
* When a component is HMR-enabled, we need to make sure that all static nodes
|
|
* inside a block also inherit the DOM element from the previous tree so that
|
|
* HMR updates (which are full updates) can retrieve the element for patching.
|
|
*
|
|
* #2080
|
|
* Inside keyed `template` fragment static children, if a fragment is moved,
|
|
* the children will always moved so that need inherit el form previous nodes
|
|
* to ensure correct moved position.
|
|
*/
|
|
function traverseStaticChildren(n1, n2, shallow = false) {
|
|
const ch1 = n1.children;
|
|
const ch2 = n2.children;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch1) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch2)) {
|
|
for (let i = 0; i < ch1.length; i++) {
|
|
// this is only called in the optimized path so array children are
|
|
// guaranteed to be vnodes
|
|
const c1 = ch1[i];
|
|
let c2 = ch2[i];
|
|
if (c2.shapeFlag & 1 /* ELEMENT */ && !c2.dynamicChildren) {
|
|
if (c2.patchFlag <= 0 || c2.patchFlag === 32 /* HYDRATE_EVENTS */) {
|
|
c2 = ch2[i] = cloneIfMounted(ch2[i]);
|
|
c2.el = c1.el;
|
|
}
|
|
if (!shallow)
|
|
traverseStaticChildren(c1, c2);
|
|
}
|
|
// also inherit for comment nodes, but not placeholders (e.g. v-if which
|
|
// would have received .el during block patch)
|
|
if (( true) && c2.type === Comment && !c2.el) {
|
|
c2.el = c1.el;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// https://en.wikipedia.org/wiki/Longest_increasing_subsequence
|
|
function getSequence(arr) {
|
|
const p = arr.slice();
|
|
const result = [0];
|
|
let i, j, u, v, c;
|
|
const len = arr.length;
|
|
for (i = 0; i < len; i++) {
|
|
const arrI = arr[i];
|
|
if (arrI !== 0) {
|
|
j = result[result.length - 1];
|
|
if (arr[j] < arrI) {
|
|
p[i] = j;
|
|
result.push(i);
|
|
continue;
|
|
}
|
|
u = 0;
|
|
v = result.length - 1;
|
|
while (u < v) {
|
|
c = ((u + v) / 2) | 0;
|
|
if (arr[result[c]] < arrI) {
|
|
u = c + 1;
|
|
}
|
|
else {
|
|
v = c;
|
|
}
|
|
}
|
|
if (arrI < arr[result[u]]) {
|
|
if (u > 0) {
|
|
p[i] = result[u - 1];
|
|
}
|
|
result[u] = i;
|
|
}
|
|
}
|
|
}
|
|
u = result.length;
|
|
v = result[u - 1];
|
|
while (u-- > 0) {
|
|
result[u] = v;
|
|
v = p[v];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
const isTeleport = (type) => type.__isTeleport;
|
|
const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === '');
|
|
const isTargetSVG = (target) => typeof SVGElement !== 'undefined' && target instanceof SVGElement;
|
|
const resolveTarget = (props, select) => {
|
|
const targetSelector = props && props.to;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(targetSelector)) {
|
|
if (!select) {
|
|
( true) &&
|
|
warn(`Current renderer does not support string target for Teleports. ` +
|
|
`(missing querySelector renderer option)`);
|
|
return null;
|
|
}
|
|
else {
|
|
const target = select(targetSelector);
|
|
if (!target) {
|
|
( true) &&
|
|
warn(`Failed to locate Teleport target with selector "${targetSelector}". ` +
|
|
`Note the target element must exist before the component is mounted - ` +
|
|
`i.e. the target cannot be rendered by the component itself, and ` +
|
|
`ideally should be outside of the entire Vue component tree.`);
|
|
}
|
|
return target;
|
|
}
|
|
}
|
|
else {
|
|
if (( true) && !targetSelector && !isTeleportDisabled(props)) {
|
|
warn(`Invalid Teleport target: ${targetSelector}`);
|
|
}
|
|
return targetSelector;
|
|
}
|
|
};
|
|
const TeleportImpl = {
|
|
__isTeleport: true,
|
|
process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, optimized, internals) {
|
|
const { mc: mountChildren, pc: patchChildren, pbc: patchBlockChildren, o: { insert, querySelector, createText, createComment } } = internals;
|
|
const disabled = isTeleportDisabled(n2.props);
|
|
const { shapeFlag, children } = n2;
|
|
if (n1 == null) {
|
|
// insert anchors in the main view
|
|
const placeholder = (n2.el = ( true)
|
|
? createComment('teleport start')
|
|
: 0);
|
|
const mainAnchor = (n2.anchor = ( true)
|
|
? createComment('teleport end')
|
|
: 0);
|
|
insert(placeholder, container, anchor);
|
|
insert(mainAnchor, container, anchor);
|
|
const target = (n2.target = resolveTarget(n2.props, querySelector));
|
|
const targetAnchor = (n2.targetAnchor = createText(''));
|
|
if (target) {
|
|
insert(targetAnchor, target);
|
|
// #2652 we could be teleporting from a non-SVG tree into an SVG tree
|
|
isSVG = isSVG || isTargetSVG(target);
|
|
}
|
|
else if (( true) && !disabled) {
|
|
warn('Invalid Teleport target on mount:', target, `(${typeof target})`);
|
|
}
|
|
const mount = (container, anchor) => {
|
|
// Teleport *always* has Array children. This is enforced in both the
|
|
// compiler and vnode children normalization.
|
|
if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
mountChildren(children, container, anchor, parentComponent, parentSuspense, isSVG, optimized);
|
|
}
|
|
};
|
|
if (disabled) {
|
|
mount(container, mainAnchor);
|
|
}
|
|
else if (target) {
|
|
mount(target, targetAnchor);
|
|
}
|
|
}
|
|
else {
|
|
// update content
|
|
n2.el = n1.el;
|
|
const mainAnchor = (n2.anchor = n1.anchor);
|
|
const target = (n2.target = n1.target);
|
|
const targetAnchor = (n2.targetAnchor = n1.targetAnchor);
|
|
const wasDisabled = isTeleportDisabled(n1.props);
|
|
const currentContainer = wasDisabled ? container : target;
|
|
const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;
|
|
isSVG = isSVG || isTargetSVG(target);
|
|
if (n2.dynamicChildren) {
|
|
// fast path when the teleport happens to be a block root
|
|
patchBlockChildren(n1.dynamicChildren, n2.dynamicChildren, currentContainer, parentComponent, parentSuspense, isSVG);
|
|
// even in block tree mode we need to make sure all root-level nodes
|
|
// in the teleport inherit previous DOM references so that they can
|
|
// be moved in future patches.
|
|
traverseStaticChildren(n1, n2, true);
|
|
}
|
|
else if (!optimized) {
|
|
patchChildren(n1, n2, currentContainer, currentAnchor, parentComponent, parentSuspense, isSVG);
|
|
}
|
|
if (disabled) {
|
|
if (!wasDisabled) {
|
|
// enabled -> disabled
|
|
// move into main container
|
|
moveTeleport(n2, container, mainAnchor, internals, 1 /* TOGGLE */);
|
|
}
|
|
}
|
|
else {
|
|
// target changed
|
|
if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {
|
|
const nextTarget = (n2.target = resolveTarget(n2.props, querySelector));
|
|
if (nextTarget) {
|
|
moveTeleport(n2, nextTarget, null, internals, 0 /* TARGET_CHANGE */);
|
|
}
|
|
else if ((true)) {
|
|
warn('Invalid Teleport target on update:', target, `(${typeof target})`);
|
|
}
|
|
}
|
|
else if (wasDisabled) {
|
|
// disabled -> enabled
|
|
// move into teleport target
|
|
moveTeleport(n2, target, targetAnchor, internals, 1 /* TOGGLE */);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
remove(vnode, { r: remove, o: { remove: hostRemove } }) {
|
|
const { shapeFlag, children, anchor } = vnode;
|
|
hostRemove(anchor);
|
|
if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
for (let i = 0; i < children.length; i++) {
|
|
remove(children[i]);
|
|
}
|
|
}
|
|
},
|
|
move: moveTeleport,
|
|
hydrate: hydrateTeleport
|
|
};
|
|
function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2 /* REORDER */) {
|
|
// move target anchor if this is a target change.
|
|
if (moveType === 0 /* TARGET_CHANGE */) {
|
|
insert(vnode.targetAnchor, container, parentAnchor);
|
|
}
|
|
const { el, anchor, shapeFlag, children, props } = vnode;
|
|
const isReorder = moveType === 2 /* REORDER */;
|
|
// move main view anchor if this is a re-order.
|
|
if (isReorder) {
|
|
insert(el, container, parentAnchor);
|
|
}
|
|
// if this is a re-order and teleport is enabled (content is in target)
|
|
// do not move children. So the opposite is: only move children if this
|
|
// is not a reorder, or the teleport is disabled
|
|
if (!isReorder || isTeleportDisabled(props)) {
|
|
// Teleport has either Array children or no children.
|
|
if (shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
for (let i = 0; i < children.length; i++) {
|
|
move(children[i], container, parentAnchor, 2 /* REORDER */);
|
|
}
|
|
}
|
|
}
|
|
// move main view anchor if this is a re-order.
|
|
if (isReorder) {
|
|
insert(anchor, container, parentAnchor);
|
|
}
|
|
}
|
|
function hydrateTeleport(node, vnode, parentComponent, parentSuspense, optimized, { o: { nextSibling, parentNode, querySelector } }, hydrateChildren) {
|
|
const target = (vnode.target = resolveTarget(vnode.props, querySelector));
|
|
if (target) {
|
|
// if multiple teleports rendered to the same target element, we need to
|
|
// pick up from where the last teleport finished instead of the first node
|
|
const targetNode = target._lpa || target.firstChild;
|
|
if (vnode.shapeFlag & 16 /* ARRAY_CHILDREN */) {
|
|
if (isTeleportDisabled(vnode.props)) {
|
|
vnode.anchor = hydrateChildren(nextSibling(node), vnode, parentNode(node), parentComponent, parentSuspense, optimized);
|
|
vnode.targetAnchor = targetNode;
|
|
}
|
|
else {
|
|
vnode.anchor = nextSibling(node);
|
|
vnode.targetAnchor = hydrateChildren(targetNode, vnode, target, parentComponent, parentSuspense, optimized);
|
|
}
|
|
target._lpa =
|
|
vnode.targetAnchor && nextSibling(vnode.targetAnchor);
|
|
}
|
|
}
|
|
return vnode.anchor && nextSibling(vnode.anchor);
|
|
}
|
|
// Force-casted public typing for h and TSX props inference
|
|
const Teleport = TeleportImpl;
|
|
|
|
const COMPONENTS = 'components';
|
|
const DIRECTIVES = 'directives';
|
|
/**
|
|
* @private
|
|
*/
|
|
function resolveComponent(name) {
|
|
return resolveAsset(COMPONENTS, name) || name;
|
|
}
|
|
const NULL_DYNAMIC_COMPONENT = Symbol();
|
|
/**
|
|
* @private
|
|
*/
|
|
function resolveDynamicComponent(component) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(component)) {
|
|
return resolveAsset(COMPONENTS, component, false) || component;
|
|
}
|
|
else {
|
|
// invalid types will fallthrough to createVNode and raise warning
|
|
return (component || NULL_DYNAMIC_COMPONENT);
|
|
}
|
|
}
|
|
/**
|
|
* @private
|
|
*/
|
|
function resolveDirective(name) {
|
|
return resolveAsset(DIRECTIVES, name);
|
|
}
|
|
// implementation
|
|
function resolveAsset(type, name, warnMissing = true) {
|
|
const instance = currentRenderingInstance || currentInstance;
|
|
if (instance) {
|
|
const Component = instance.type;
|
|
// self name has highest priority
|
|
if (type === COMPONENTS) {
|
|
// special self referencing call generated by compiler
|
|
// inferred from SFC filename
|
|
if (name === `_self`) {
|
|
return Component;
|
|
}
|
|
const selfName = getComponentName(Component);
|
|
if (selfName &&
|
|
(selfName === name ||
|
|
selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name) ||
|
|
selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)))) {
|
|
return Component;
|
|
}
|
|
}
|
|
const res =
|
|
// local registration
|
|
// check instance[type] first for components with mixin or extends.
|
|
resolve(instance[type] || Component[type], name) ||
|
|
// global registration
|
|
resolve(instance.appContext[type], name);
|
|
if (( true) && warnMissing && !res) {
|
|
warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`);
|
|
}
|
|
return res;
|
|
}
|
|
else if ((true)) {
|
|
warn(`resolve${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(type.slice(0, -1))} ` +
|
|
`can only be used in render() or setup().`);
|
|
}
|
|
}
|
|
function resolve(registry, name) {
|
|
return (registry &&
|
|
(registry[name] ||
|
|
registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)] ||
|
|
registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name))]));
|
|
}
|
|
|
|
const Fragment = Symbol(( true) ? 'Fragment' : 0);
|
|
const Text = Symbol(( true) ? 'Text' : 0);
|
|
const Comment = Symbol(( true) ? 'Comment' : 0);
|
|
const Static = Symbol(( true) ? 'Static' : 0);
|
|
// Since v-if and v-for are the two possible ways node structure can dynamically
|
|
// change, once we consider v-if branches and each v-for fragment a block, we
|
|
// can divide a template into nested blocks, and within each block the node
|
|
// structure would be stable. This allows us to skip most children diffing
|
|
// and only worry about the dynamic nodes (indicated by patch flags).
|
|
const blockStack = [];
|
|
let currentBlock = null;
|
|
/**
|
|
* Open a block.
|
|
* This must be called before `createBlock`. It cannot be part of `createBlock`
|
|
* because the children of the block are evaluated before `createBlock` itself
|
|
* is called. The generated code typically looks like this:
|
|
*
|
|
* ```js
|
|
* function render() {
|
|
* return (openBlock(),createBlock('div', null, [...]))
|
|
* }
|
|
* ```
|
|
* disableTracking is true when creating a v-for fragment block, since a v-for
|
|
* fragment always diffs its children.
|
|
*
|
|
* @private
|
|
*/
|
|
function openBlock(disableTracking = false) {
|
|
blockStack.push((currentBlock = disableTracking ? null : []));
|
|
}
|
|
function closeBlock() {
|
|
blockStack.pop();
|
|
currentBlock = blockStack[blockStack.length - 1] || null;
|
|
}
|
|
// Whether we should be tracking dynamic child nodes inside a block.
|
|
// Only tracks when this value is > 0
|
|
// We are not using a simple boolean because this value may need to be
|
|
// incremented/decremented by nested usage of v-once (see below)
|
|
let shouldTrack = 1;
|
|
/**
|
|
* Block tracking sometimes needs to be disabled, for example during the
|
|
* creation of a tree that needs to be cached by v-once. The compiler generates
|
|
* code like this:
|
|
*
|
|
* ``` js
|
|
* _cache[1] || (
|
|
* setBlockTracking(-1),
|
|
* _cache[1] = createVNode(...),
|
|
* setBlockTracking(1),
|
|
* _cache[1]
|
|
* )
|
|
* ```
|
|
*
|
|
* @private
|
|
*/
|
|
function setBlockTracking(value) {
|
|
shouldTrack += value;
|
|
}
|
|
/**
|
|
* Create a block root vnode. Takes the same exact arguments as `createVNode`.
|
|
* A block root keeps track of dynamic nodes within the block in the
|
|
* `dynamicChildren` array.
|
|
*
|
|
* @private
|
|
*/
|
|
function createBlock(type, props, children, patchFlag, dynamicProps) {
|
|
const vnode = createVNode(type, props, children, patchFlag, dynamicProps, true /* isBlock: prevent a block from tracking itself */);
|
|
// save current block children on the block vnode
|
|
vnode.dynamicChildren = currentBlock || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR;
|
|
// close block
|
|
closeBlock();
|
|
// a block is always going to be patched, so track it as a child of its
|
|
// parent block
|
|
if (shouldTrack > 0 && currentBlock) {
|
|
currentBlock.push(vnode);
|
|
}
|
|
return vnode;
|
|
}
|
|
function isVNode(value) {
|
|
return value ? value.__v_isVNode === true : false;
|
|
}
|
|
function isSameVNodeType(n1, n2) {
|
|
if (( true) &&
|
|
n2.shapeFlag & 6 /* COMPONENT */ &&
|
|
hmrDirtyComponents.has(n2.type)) {
|
|
// HMR only: if the component has been hot-updated, force a reload.
|
|
return false;
|
|
}
|
|
return n1.type === n2.type && n1.key === n2.key;
|
|
}
|
|
let vnodeArgsTransformer;
|
|
/**
|
|
* Internal API for registering an arguments transform for createVNode
|
|
* used for creating stubs in the test-utils
|
|
* It is *internal* but needs to be exposed for test-utils to pick up proper
|
|
* typings
|
|
*/
|
|
function transformVNodeArgs(transformer) {
|
|
vnodeArgsTransformer = transformer;
|
|
}
|
|
const createVNodeWithArgsTransform = (...args) => {
|
|
return _createVNode(...(vnodeArgsTransformer
|
|
? vnodeArgsTransformer(args, currentRenderingInstance)
|
|
: args));
|
|
};
|
|
const InternalObjectKey = `__vInternal`;
|
|
const normalizeKey = ({ key }) => key != null ? key : null;
|
|
const normalizeRef = ({ ref }) => {
|
|
return (ref != null
|
|
? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref)
|
|
? { i: currentRenderingInstance, r: ref }
|
|
: ref
|
|
: null);
|
|
};
|
|
const createVNode = (( true)
|
|
? createVNodeWithArgsTransform
|
|
: 0);
|
|
function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
|
|
if (!type || type === NULL_DYNAMIC_COMPONENT) {
|
|
if (( true) && !type) {
|
|
warn(`Invalid vnode type when creating vnode: ${type}.`);
|
|
}
|
|
type = Comment;
|
|
}
|
|
if (isVNode(type)) {
|
|
// createVNode receiving an existing vnode. This happens in cases like
|
|
// <component :is="vnode"/>
|
|
// #2078 make sure to merge refs during the clone instead of overwriting it
|
|
const cloned = cloneVNode(type, props, true /* mergeRef: true */);
|
|
if (children) {
|
|
normalizeChildren(cloned, children);
|
|
}
|
|
return cloned;
|
|
}
|
|
// class component normalization.
|
|
if (isClassComponent(type)) {
|
|
type = type.__vccOpts;
|
|
}
|
|
// class & style normalization.
|
|
if (props) {
|
|
// for reactive or proxy objects, we need to clone it to enable mutation.
|
|
if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(props) || InternalObjectKey in props) {
|
|
props = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, props);
|
|
}
|
|
let { class: klass, style } = props;
|
|
if (klass && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(klass)) {
|
|
props.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)(klass);
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(style)) {
|
|
// reactive state objects need to be cloned since they are likely to be
|
|
// mutated
|
|
if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(style) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(style)) {
|
|
style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, style);
|
|
}
|
|
props.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)(style);
|
|
}
|
|
}
|
|
// encode the vnode type information into a bitmap
|
|
const shapeFlag = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(type)
|
|
? 1 /* ELEMENT */
|
|
: isSuspense(type)
|
|
? 128 /* SUSPENSE */
|
|
: isTeleport(type)
|
|
? 64 /* TELEPORT */
|
|
: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(type)
|
|
? 4 /* STATEFUL_COMPONENT */
|
|
: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(type)
|
|
? 2 /* FUNCTIONAL_COMPONENT */
|
|
: 0;
|
|
if (( true) && shapeFlag & 4 /* STATEFUL_COMPONENT */ && (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(type)) {
|
|
type = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(type);
|
|
warn(`Vue received a Component which was made a reactive object. This can ` +
|
|
`lead to unnecessary performance overhead, and should be avoided by ` +
|
|
`marking the component with \`markRaw\` or using \`shallowRef\` ` +
|
|
`instead of \`ref\`.`, `\nComponent that was made reactive: `, type);
|
|
}
|
|
const vnode = {
|
|
__v_isVNode: true,
|
|
["__v_skip" /* SKIP */]: true,
|
|
type,
|
|
props,
|
|
key: props && normalizeKey(props),
|
|
ref: props && normalizeRef(props),
|
|
scopeId: currentScopeId,
|
|
children: null,
|
|
component: null,
|
|
suspense: null,
|
|
ssContent: null,
|
|
ssFallback: null,
|
|
dirs: null,
|
|
transition: null,
|
|
el: null,
|
|
anchor: null,
|
|
target: null,
|
|
targetAnchor: null,
|
|
staticCount: 0,
|
|
shapeFlag,
|
|
patchFlag,
|
|
dynamicProps,
|
|
dynamicChildren: null,
|
|
appContext: null
|
|
};
|
|
// validate key
|
|
if (( true) && vnode.key !== vnode.key) {
|
|
warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type);
|
|
}
|
|
normalizeChildren(vnode, children);
|
|
// normalize suspense children
|
|
if (shapeFlag & 128 /* SUSPENSE */) {
|
|
const { content, fallback } = normalizeSuspenseChildren(vnode);
|
|
vnode.ssContent = content;
|
|
vnode.ssFallback = fallback;
|
|
}
|
|
if (shouldTrack > 0 &&
|
|
// avoid a block node from tracking itself
|
|
!isBlockNode &&
|
|
// has current parent block
|
|
currentBlock &&
|
|
// presence of a patch flag indicates this node needs patching on updates.
|
|
// component nodes also should always be patched, because even if the
|
|
// component doesn't need to update, it needs to persist the instance on to
|
|
// the next vnode so that it can be properly unmounted later.
|
|
(patchFlag > 0 || shapeFlag & 6 /* COMPONENT */) &&
|
|
// the EVENTS flag is only for hydration and if it is the only flag, the
|
|
// vnode should not be considered dynamic due to handler caching.
|
|
patchFlag !== 32 /* HYDRATE_EVENTS */) {
|
|
currentBlock.push(vnode);
|
|
}
|
|
return vnode;
|
|
}
|
|
function cloneVNode(vnode, extraProps, mergeRef = false) {
|
|
// This is intentionally NOT using spread or extend to avoid the runtime
|
|
// key enumeration cost.
|
|
const { props, ref, patchFlag, children } = vnode;
|
|
const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
|
|
return {
|
|
__v_isVNode: true,
|
|
["__v_skip" /* SKIP */]: true,
|
|
type: vnode.type,
|
|
props: mergedProps,
|
|
key: mergedProps && normalizeKey(mergedProps),
|
|
ref: extraProps && extraProps.ref
|
|
? // #2078 in the case of <component :is="vnode" ref="extra"/>
|
|
// if the vnode itself already has a ref, cloneVNode will need to merge
|
|
// the refs so the single vnode can be set on multiple refs
|
|
mergeRef && ref
|
|
? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ref)
|
|
? ref.concat(normalizeRef(extraProps))
|
|
: [ref, normalizeRef(extraProps)]
|
|
: normalizeRef(extraProps)
|
|
: ref,
|
|
scopeId: vnode.scopeId,
|
|
children: ( true) && patchFlag === -1 /* HOISTED */ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children)
|
|
? children.map(deepCloneVNode)
|
|
: children,
|
|
target: vnode.target,
|
|
targetAnchor: vnode.targetAnchor,
|
|
staticCount: vnode.staticCount,
|
|
shapeFlag: vnode.shapeFlag,
|
|
// if the vnode is cloned with extra props, we can no longer assume its
|
|
// existing patch flag to be reliable and need to add the FULL_PROPS flag.
|
|
// note: perserve flag for fragments since they use the flag for children
|
|
// fast paths only.
|
|
patchFlag: extraProps && vnode.type !== Fragment
|
|
? patchFlag === -1 // hoisted node
|
|
? 16 /* FULL_PROPS */
|
|
: patchFlag | 16 /* FULL_PROPS */
|
|
: patchFlag,
|
|
dynamicProps: vnode.dynamicProps,
|
|
dynamicChildren: vnode.dynamicChildren,
|
|
appContext: vnode.appContext,
|
|
dirs: vnode.dirs,
|
|
transition: vnode.transition,
|
|
// These should technically only be non-null on mounted VNodes. However,
|
|
// they *should* be copied for kept-alive vnodes. So we just always copy
|
|
// them since them being non-null during a mount doesn't affect the logic as
|
|
// they will simply be overwritten.
|
|
component: vnode.component,
|
|
suspense: vnode.suspense,
|
|
ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
|
|
ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
|
|
el: vnode.el,
|
|
anchor: vnode.anchor
|
|
};
|
|
}
|
|
/**
|
|
* Dev only, for HMR of hoisted vnodes reused in v-for
|
|
* https://github.com/vitejs/vite/issues/2022
|
|
*/
|
|
function deepCloneVNode(vnode) {
|
|
const cloned = cloneVNode(vnode);
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(vnode.children)) {
|
|
cloned.children = vnode.children.map(deepCloneVNode);
|
|
}
|
|
return cloned;
|
|
}
|
|
/**
|
|
* @private
|
|
*/
|
|
function createTextVNode(text = ' ', flag = 0) {
|
|
return createVNode(Text, null, text, flag);
|
|
}
|
|
/**
|
|
* @private
|
|
*/
|
|
function createStaticVNode(content, numberOfNodes) {
|
|
// A static vnode can contain multiple stringified elements, and the number
|
|
// of elements is necessary for hydration.
|
|
const vnode = createVNode(Static, null, content);
|
|
vnode.staticCount = numberOfNodes;
|
|
return vnode;
|
|
}
|
|
/**
|
|
* @private
|
|
*/
|
|
function createCommentVNode(text = '',
|
|
// when used as the v-else branch, the comment node must be created as a
|
|
// block to ensure correct updates.
|
|
asBlock = false) {
|
|
return asBlock
|
|
? (openBlock(), createBlock(Comment, null, text))
|
|
: createVNode(Comment, null, text);
|
|
}
|
|
function normalizeVNode(child) {
|
|
if (child == null || typeof child === 'boolean') {
|
|
// empty placeholder
|
|
return createVNode(Comment);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(child)) {
|
|
// fragment
|
|
return createVNode(Fragment, null, child);
|
|
}
|
|
else if (typeof child === 'object') {
|
|
// already vnode, this should be the most common since compiled templates
|
|
// always produce all-vnode children arrays
|
|
return child.el === null ? child : cloneVNode(child);
|
|
}
|
|
else {
|
|
// strings and numbers
|
|
return createVNode(Text, null, String(child));
|
|
}
|
|
}
|
|
// optimized normalization for template-compiled render fns
|
|
function cloneIfMounted(child) {
|
|
return child.el === null ? child : cloneVNode(child);
|
|
}
|
|
function normalizeChildren(vnode, children) {
|
|
let type = 0;
|
|
const { shapeFlag } = vnode;
|
|
if (children == null) {
|
|
children = null;
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children)) {
|
|
type = 16 /* ARRAY_CHILDREN */;
|
|
}
|
|
else if (typeof children === 'object') {
|
|
if (shapeFlag & 1 /* ELEMENT */ || shapeFlag & 64 /* TELEPORT */) {
|
|
// Normalize slot to plain children for plain element and Teleport
|
|
const slot = children.default;
|
|
if (slot) {
|
|
// _c marker is added by withCtx() indicating this is a compiled slot
|
|
slot._c && setCompiledSlotRendering(1);
|
|
normalizeChildren(vnode, slot());
|
|
slot._c && setCompiledSlotRendering(-1);
|
|
}
|
|
return;
|
|
}
|
|
else {
|
|
type = 32 /* SLOTS_CHILDREN */;
|
|
const slotFlag = children._;
|
|
if (!slotFlag && !(InternalObjectKey in children)) {
|
|
children._ctx = currentRenderingInstance;
|
|
}
|
|
else if (slotFlag === 3 /* FORWARDED */ && currentRenderingInstance) {
|
|
// a child component receives forwarded slots from the parent.
|
|
// its slot type is determined by its parent's slot type.
|
|
if (currentRenderingInstance.vnode.patchFlag & 1024 /* DYNAMIC_SLOTS */) {
|
|
children._ = 2 /* DYNAMIC */;
|
|
vnode.patchFlag |= 1024 /* DYNAMIC_SLOTS */;
|
|
}
|
|
else {
|
|
children._ = 1 /* STABLE */;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(children)) {
|
|
children = { default: children, _ctx: currentRenderingInstance };
|
|
type = 32 /* SLOTS_CHILDREN */;
|
|
}
|
|
else {
|
|
children = String(children);
|
|
// force teleport children to array so it can be moved around
|
|
if (shapeFlag & 64 /* TELEPORT */) {
|
|
type = 16 /* ARRAY_CHILDREN */;
|
|
children = [createTextVNode(children)];
|
|
}
|
|
else {
|
|
type = 8 /* TEXT_CHILDREN */;
|
|
}
|
|
}
|
|
vnode.children = children;
|
|
vnode.shapeFlag |= type;
|
|
}
|
|
function mergeProps(...args) {
|
|
const ret = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, args[0]);
|
|
for (let i = 1; i < args.length; i++) {
|
|
const toMerge = args[i];
|
|
for (const key in toMerge) {
|
|
if (key === 'class') {
|
|
if (ret.class !== toMerge.class) {
|
|
ret.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([ret.class, toMerge.class]);
|
|
}
|
|
}
|
|
else if (key === 'style') {
|
|
ret.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)([ret.style, toMerge.style]);
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
|
|
const existing = ret[key];
|
|
const incoming = toMerge[key];
|
|
if (existing !== incoming) {
|
|
ret[key] = existing
|
|
? [].concat(existing, toMerge[key])
|
|
: incoming;
|
|
}
|
|
}
|
|
else if (key !== '') {
|
|
ret[key] = toMerge[key];
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function provide(key, value) {
|
|
if (!currentInstance) {
|
|
if ((true)) {
|
|
warn(`provide() can only be used inside setup().`);
|
|
}
|
|
}
|
|
else {
|
|
let provides = currentInstance.provides;
|
|
// by default an instance inherits its parent's provides object
|
|
// but when it needs to provide values of its own, it creates its
|
|
// own provides object using parent provides object as prototype.
|
|
// this way in `inject` we can simply look up injections from direct
|
|
// parent and let the prototype chain do the work.
|
|
const parentProvides = currentInstance.parent && currentInstance.parent.provides;
|
|
if (parentProvides === provides) {
|
|
provides = currentInstance.provides = Object.create(parentProvides);
|
|
}
|
|
// TS doesn't allow symbol as index type
|
|
provides[key] = value;
|
|
}
|
|
}
|
|
function inject(key, defaultValue, treatDefaultAsFactory = false) {
|
|
// fallback to `currentRenderingInstance` so that this can be called in
|
|
// a functional component
|
|
const instance = currentInstance || currentRenderingInstance;
|
|
if (instance) {
|
|
// #2400
|
|
// to support `app.use` plugins,
|
|
// fallback to appContext's `provides` if the intance is at root
|
|
const provides = instance.parent == null
|
|
? instance.vnode.appContext && instance.vnode.appContext.provides
|
|
: instance.parent.provides;
|
|
if (provides && key in provides) {
|
|
// TS doesn't allow symbol as index type
|
|
return provides[key];
|
|
}
|
|
else if (arguments.length > 1) {
|
|
return treatDefaultAsFactory && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue)
|
|
? defaultValue()
|
|
: defaultValue;
|
|
}
|
|
else if ((true)) {
|
|
warn(`injection "${String(key)}" not found.`);
|
|
}
|
|
}
|
|
else if ((true)) {
|
|
warn(`inject() can only be used inside setup() or functional components.`);
|
|
}
|
|
}
|
|
|
|
function createDuplicateChecker() {
|
|
const cache = Object.create(null);
|
|
return (type, key) => {
|
|
if (cache[key]) {
|
|
warn(`${type} property "${key}" is already defined in ${cache[key]}.`);
|
|
}
|
|
else {
|
|
cache[key] = type;
|
|
}
|
|
};
|
|
}
|
|
let isInBeforeCreate = false;
|
|
function applyOptions(instance, options, deferredData = [], deferredWatch = [], deferredProvide = [], asMixin = false) {
|
|
const {
|
|
// composition
|
|
mixins, extends: extendsOptions,
|
|
// state
|
|
data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions,
|
|
// assets
|
|
components, directives,
|
|
// lifecycle
|
|
beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured,
|
|
// public API
|
|
expose } = options;
|
|
const publicThis = instance.proxy;
|
|
const ctx = instance.ctx;
|
|
const globalMixins = instance.appContext.mixins;
|
|
if (asMixin && render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {
|
|
instance.render = render;
|
|
}
|
|
// applyOptions is called non-as-mixin once per instance
|
|
if (!asMixin) {
|
|
isInBeforeCreate = true;
|
|
callSyncHook('beforeCreate', "bc" /* BEFORE_CREATE */, options, instance, globalMixins);
|
|
isInBeforeCreate = false;
|
|
// global mixins are applied first
|
|
applyMixins(instance, globalMixins, deferredData, deferredWatch, deferredProvide);
|
|
}
|
|
// extending a base component...
|
|
if (extendsOptions) {
|
|
applyOptions(instance, extendsOptions, deferredData, deferredWatch, deferredProvide, true);
|
|
}
|
|
// local mixins
|
|
if (mixins) {
|
|
applyMixins(instance, mixins, deferredData, deferredWatch, deferredProvide);
|
|
}
|
|
const checkDuplicateProperties = ( true) ? createDuplicateChecker() : 0;
|
|
if ((true)) {
|
|
const [propsOptions] = instance.propsOptions;
|
|
if (propsOptions) {
|
|
for (const key in propsOptions) {
|
|
checkDuplicateProperties("Props" /* PROPS */, key);
|
|
}
|
|
}
|
|
}
|
|
// options initialization order (to be consistent with Vue 2):
|
|
// - props (already done outside of this function)
|
|
// - inject
|
|
// - methods
|
|
// - data (deferred since it relies on `this` access)
|
|
// - computed
|
|
// - watch (deferred since it relies on `this` access)
|
|
if (injectOptions) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(injectOptions)) {
|
|
for (let i = 0; i < injectOptions.length; i++) {
|
|
const key = injectOptions[i];
|
|
ctx[key] = inject(key);
|
|
if ((true)) {
|
|
checkDuplicateProperties("Inject" /* INJECT */, key);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
for (const key in injectOptions) {
|
|
const opt = injectOptions[key];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opt)) {
|
|
ctx[key] = inject(opt.from || key, opt.default, true /* treat default function as factory */);
|
|
}
|
|
else {
|
|
ctx[key] = inject(opt);
|
|
}
|
|
if ((true)) {
|
|
checkDuplicateProperties("Inject" /* INJECT */, key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (methods) {
|
|
for (const key in methods) {
|
|
const methodHandler = methods[key];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(methodHandler)) {
|
|
// In dev mode, we use the `createRenderContext` function to define methods to the proxy target,
|
|
// and those are read-only but reconfigurable, so it needs to be redefined here
|
|
if ((true)) {
|
|
Object.defineProperty(ctx, key, {
|
|
value: methodHandler.bind(publicThis),
|
|
configurable: true,
|
|
enumerable: true,
|
|
writable: true
|
|
});
|
|
}
|
|
else {}
|
|
if ((true)) {
|
|
checkDuplicateProperties("Methods" /* METHODS */, key);
|
|
}
|
|
}
|
|
else if ((true)) {
|
|
warn(`Method "${key}" has type "${typeof methodHandler}" in the component definition. ` +
|
|
`Did you reference the function correctly?`);
|
|
}
|
|
}
|
|
}
|
|
if (!asMixin) {
|
|
if (deferredData.length) {
|
|
deferredData.forEach(dataFn => resolveData(instance, dataFn, publicThis));
|
|
}
|
|
if (dataOptions) {
|
|
// @ts-ignore dataOptions is not fully type safe
|
|
resolveData(instance, dataOptions, publicThis);
|
|
}
|
|
if ((true)) {
|
|
const rawData = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.data);
|
|
for (const key in rawData) {
|
|
checkDuplicateProperties("Data" /* DATA */, key);
|
|
// expose data on ctx during dev
|
|
if (key[0] !== '$' && key[0] !== '_') {
|
|
Object.defineProperty(ctx, key, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
get: () => rawData[key],
|
|
set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (dataOptions) {
|
|
deferredData.push(dataOptions);
|
|
}
|
|
if (computedOptions) {
|
|
for (const key in computedOptions) {
|
|
const opt = computedOptions[key];
|
|
const get = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt)
|
|
? opt.bind(publicThis, publicThis)
|
|
: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.get)
|
|
? opt.get.bind(publicThis, publicThis)
|
|
: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
|
|
if (( true) && get === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {
|
|
warn(`Computed property "${key}" has no getter.`);
|
|
}
|
|
const set = !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.set)
|
|
? opt.set.bind(publicThis)
|
|
: ( true)
|
|
? () => {
|
|
warn(`Write operation failed: computed property "${key}" is readonly.`);
|
|
}
|
|
: 0;
|
|
const c = computed({
|
|
get,
|
|
set
|
|
});
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => c.value,
|
|
set: v => (c.value = v)
|
|
});
|
|
if ((true)) {
|
|
checkDuplicateProperties("Computed" /* COMPUTED */, key);
|
|
}
|
|
}
|
|
}
|
|
if (watchOptions) {
|
|
deferredWatch.push(watchOptions);
|
|
}
|
|
if (!asMixin && deferredWatch.length) {
|
|
deferredWatch.forEach(watchOptions => {
|
|
for (const key in watchOptions) {
|
|
createWatcher(watchOptions[key], ctx, publicThis, key);
|
|
}
|
|
});
|
|
}
|
|
if (provideOptions) {
|
|
deferredProvide.push(provideOptions);
|
|
}
|
|
if (!asMixin && deferredProvide.length) {
|
|
deferredProvide.forEach(provideOptions => {
|
|
const provides = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(provideOptions)
|
|
? provideOptions.call(publicThis)
|
|
: provideOptions;
|
|
Reflect.ownKeys(provides).forEach(key => {
|
|
provide(key, provides[key]);
|
|
});
|
|
});
|
|
}
|
|
// asset options.
|
|
// To reduce memory usage, only components with mixins or extends will have
|
|
// resolved asset registry attached to instance.
|
|
if (asMixin) {
|
|
if (components) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(instance.components ||
|
|
(instance.components = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, instance.type.components)), components);
|
|
}
|
|
if (directives) {
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(instance.directives ||
|
|
(instance.directives = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, instance.type.directives)), directives);
|
|
}
|
|
}
|
|
// lifecycle options
|
|
if (!asMixin) {
|
|
callSyncHook('created', "c" /* CREATED */, options, instance, globalMixins);
|
|
}
|
|
if (beforeMount) {
|
|
onBeforeMount(beforeMount.bind(publicThis));
|
|
}
|
|
if (mounted) {
|
|
onMounted(mounted.bind(publicThis));
|
|
}
|
|
if (beforeUpdate) {
|
|
onBeforeUpdate(beforeUpdate.bind(publicThis));
|
|
}
|
|
if (updated) {
|
|
onUpdated(updated.bind(publicThis));
|
|
}
|
|
if (activated) {
|
|
onActivated(activated.bind(publicThis));
|
|
}
|
|
if (deactivated) {
|
|
onDeactivated(deactivated.bind(publicThis));
|
|
}
|
|
if (errorCaptured) {
|
|
onErrorCaptured(errorCaptured.bind(publicThis));
|
|
}
|
|
if (renderTracked) {
|
|
onRenderTracked(renderTracked.bind(publicThis));
|
|
}
|
|
if (renderTriggered) {
|
|
onRenderTriggered(renderTriggered.bind(publicThis));
|
|
}
|
|
if (( true) && beforeDestroy) {
|
|
warn(`\`beforeDestroy\` has been renamed to \`beforeUnmount\`.`);
|
|
}
|
|
if (beforeUnmount) {
|
|
onBeforeUnmount(beforeUnmount.bind(publicThis));
|
|
}
|
|
if (( true) && destroyed) {
|
|
warn(`\`destroyed\` has been renamed to \`unmounted\`.`);
|
|
}
|
|
if (unmounted) {
|
|
onUnmounted(unmounted.bind(publicThis));
|
|
}
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expose)) {
|
|
if (!asMixin) {
|
|
if (expose.length) {
|
|
const exposed = instance.exposed || (instance.exposed = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)({}));
|
|
expose.forEach(key => {
|
|
exposed[key] = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRef)(publicThis, key);
|
|
});
|
|
}
|
|
else if (!instance.exposed) {
|
|
instance.exposed = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
}
|
|
}
|
|
else if ((true)) {
|
|
warn(`The \`expose\` option is ignored when used in mixins.`);
|
|
}
|
|
}
|
|
}
|
|
function callSyncHook(name, type, options, instance, globalMixins) {
|
|
callHookFromMixins(name, type, globalMixins, instance);
|
|
const { extends: base, mixins } = options;
|
|
if (base) {
|
|
callHookFromExtends(name, type, base, instance);
|
|
}
|
|
if (mixins) {
|
|
callHookFromMixins(name, type, mixins, instance);
|
|
}
|
|
const selfHook = options[name];
|
|
if (selfHook) {
|
|
callWithAsyncErrorHandling(selfHook.bind(instance.proxy), instance, type);
|
|
}
|
|
}
|
|
function callHookFromExtends(name, type, base, instance) {
|
|
if (base.extends) {
|
|
callHookFromExtends(name, type, base.extends, instance);
|
|
}
|
|
const baseHook = base[name];
|
|
if (baseHook) {
|
|
callWithAsyncErrorHandling(baseHook.bind(instance.proxy), instance, type);
|
|
}
|
|
}
|
|
function callHookFromMixins(name, type, mixins, instance) {
|
|
for (let i = 0; i < mixins.length; i++) {
|
|
const chainedMixins = mixins[i].mixins;
|
|
if (chainedMixins) {
|
|
callHookFromMixins(name, type, chainedMixins, instance);
|
|
}
|
|
const fn = mixins[i][name];
|
|
if (fn) {
|
|
callWithAsyncErrorHandling(fn.bind(instance.proxy), instance, type);
|
|
}
|
|
}
|
|
}
|
|
function applyMixins(instance, mixins, deferredData, deferredWatch, deferredProvide) {
|
|
for (let i = 0; i < mixins.length; i++) {
|
|
applyOptions(instance, mixins[i], deferredData, deferredWatch, deferredProvide, true);
|
|
}
|
|
}
|
|
function resolveData(instance, dataFn, publicThis) {
|
|
if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dataFn)) {
|
|
warn(`The data option must be a function. ` +
|
|
`Plain object usage is no longer supported.`);
|
|
}
|
|
const data = dataFn.call(publicThis, publicThis);
|
|
if (( true) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(data)) {
|
|
warn(`data() returned a Promise - note data() cannot be async; If you ` +
|
|
`intend to perform data fetching before component renders, use ` +
|
|
`async setup() + <Suspense>.`);
|
|
}
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(data)) {
|
|
( true) && warn(`data() should return an object.`);
|
|
}
|
|
else if (instance.data === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
|
|
instance.data = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive)(data);
|
|
}
|
|
else {
|
|
// existing data: this is a mixin or extends.
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(instance.data, data);
|
|
}
|
|
}
|
|
function createWatcher(raw, ctx, publicThis, key) {
|
|
const getter = key.includes('.')
|
|
? createPathGetter(publicThis, key)
|
|
: () => publicThis[key];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw)) {
|
|
const handler = ctx[raw];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) {
|
|
watch(getter, handler);
|
|
}
|
|
else if ((true)) {
|
|
warn(`Invalid watch handler specified by key "${raw}"`, handler);
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw)) {
|
|
watch(getter, raw.bind(publicThis));
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) {
|
|
raw.forEach(r => createWatcher(r, ctx, publicThis, key));
|
|
}
|
|
else {
|
|
const handler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw.handler)
|
|
? raw.handler.bind(publicThis)
|
|
: ctx[raw.handler];
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) {
|
|
watch(getter, handler, raw);
|
|
}
|
|
else if ((true)) {
|
|
warn(`Invalid watch handler specified by key "${raw.handler}"`, handler);
|
|
}
|
|
}
|
|
}
|
|
else if ((true)) {
|
|
warn(`Invalid watch option: "${key}"`, raw);
|
|
}
|
|
}
|
|
function createPathGetter(ctx, path) {
|
|
const segments = path.split('.');
|
|
return () => {
|
|
let cur = ctx;
|
|
for (let i = 0; i < segments.length && cur; i++) {
|
|
cur = cur[segments[i]];
|
|
}
|
|
return cur;
|
|
};
|
|
}
|
|
function resolveMergedOptions(instance) {
|
|
const raw = instance.type;
|
|
const { __merged, mixins, extends: extendsOptions } = raw;
|
|
if (__merged)
|
|
return __merged;
|
|
const globalMixins = instance.appContext.mixins;
|
|
if (!globalMixins.length && !mixins && !extendsOptions)
|
|
return raw;
|
|
const options = {};
|
|
globalMixins.forEach(m => mergeOptions(options, m, instance));
|
|
mergeOptions(options, raw, instance);
|
|
return (raw.__merged = options);
|
|
}
|
|
function mergeOptions(to, from, instance) {
|
|
const strats = instance.appContext.config.optionMergeStrategies;
|
|
const { mixins, extends: extendsOptions } = from;
|
|
extendsOptions && mergeOptions(to, extendsOptions, instance);
|
|
mixins &&
|
|
mixins.forEach((m) => mergeOptions(to, m, instance));
|
|
for (const key in from) {
|
|
if (strats && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(strats, key)) {
|
|
to[key] = strats[key](to[key], from[key], instance.proxy, key);
|
|
}
|
|
else {
|
|
to[key] = from[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* #2437 In Vue 3, functional components do not have a public instance proxy but
|
|
* they exist in the internal parent chain. For code that relies on traversing
|
|
* public $parent chains, skip functional ones and go to the parent instead.
|
|
*/
|
|
const getPublicInstance = (i) => {
|
|
if (!i)
|
|
return null;
|
|
if (isStatefulComponent(i))
|
|
return i.exposed ? i.exposed : i.proxy;
|
|
return getPublicInstance(i.parent);
|
|
};
|
|
const publicPropertiesMap = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(Object.create(null), {
|
|
$: i => i,
|
|
$el: i => i.vnode.el,
|
|
$data: i => i.data,
|
|
$props: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.props) : 0),
|
|
$attrs: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.attrs) : 0),
|
|
$slots: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.slots) : 0),
|
|
$refs: i => (( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.refs) : 0),
|
|
$parent: i => getPublicInstance(i.parent),
|
|
$root: i => getPublicInstance(i.root),
|
|
$emit: i => i.emit,
|
|
$options: i => (__VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type),
|
|
$forceUpdate: i => () => queueJob(i.update),
|
|
$nextTick: i => nextTick.bind(i.proxy),
|
|
$watch: i => (__VUE_OPTIONS_API__ ? instanceWatch.bind(i) : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP)
|
|
});
|
|
const PublicInstanceProxyHandlers = {
|
|
get({ _: instance }, key) {
|
|
const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
|
|
// let @vue/reactivity know it should never observe Vue public instances.
|
|
if (key === "__v_skip" /* SKIP */) {
|
|
return true;
|
|
}
|
|
// for internal formatters to know that this is a Vue instance
|
|
if (( true) && key === '__isVue') {
|
|
return true;
|
|
}
|
|
// data / props / ctx
|
|
// This getter gets called for every property access on the render context
|
|
// during render and is a major hotspot. The most expensive part of this
|
|
// is the multiple hasOwn() calls. It's much faster to do a simple property
|
|
// access on a plain object, so we use an accessCache object (with null
|
|
// prototype) to memoize what access type a key corresponds to.
|
|
let normalizedProps;
|
|
if (key[0] !== '$') {
|
|
const n = accessCache[key];
|
|
if (n !== undefined) {
|
|
switch (n) {
|
|
case 0 /* SETUP */:
|
|
return setupState[key];
|
|
case 1 /* DATA */:
|
|
return data[key];
|
|
case 3 /* CONTEXT */:
|
|
return ctx[key];
|
|
case 2 /* PROPS */:
|
|
return props[key];
|
|
// default: just fallthrough
|
|
}
|
|
}
|
|
else if (setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, key)) {
|
|
accessCache[key] = 0 /* SETUP */;
|
|
return setupState[key];
|
|
}
|
|
else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {
|
|
accessCache[key] = 1 /* DATA */;
|
|
return data[key];
|
|
}
|
|
else if (
|
|
// only cache other properties when instance has declared (thus stable)
|
|
// props
|
|
(normalizedProps = instance.propsOptions[0]) &&
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key)) {
|
|
accessCache[key] = 2 /* PROPS */;
|
|
return props[key];
|
|
}
|
|
else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) {
|
|
accessCache[key] = 3 /* CONTEXT */;
|
|
return ctx[key];
|
|
}
|
|
else if (!__VUE_OPTIONS_API__ || !isInBeforeCreate) {
|
|
accessCache[key] = 4 /* OTHER */;
|
|
}
|
|
}
|
|
const publicGetter = publicPropertiesMap[key];
|
|
let cssModule, globalProperties;
|
|
// public $xxx properties
|
|
if (publicGetter) {
|
|
if (key === '$attrs') {
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, "get" /* GET */, key);
|
|
( true) && markAttrsAccessed();
|
|
}
|
|
return publicGetter(instance);
|
|
}
|
|
else if (
|
|
// css module (injected by vue-loader)
|
|
(cssModule = type.__cssModules) &&
|
|
(cssModule = cssModule[key])) {
|
|
return cssModule;
|
|
}
|
|
else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) {
|
|
// user may set custom properties to `this` that start with `$`
|
|
accessCache[key] = 3 /* CONTEXT */;
|
|
return ctx[key];
|
|
}
|
|
else if (
|
|
// global properties
|
|
((globalProperties = appContext.config.globalProperties),
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(globalProperties, key))) {
|
|
return globalProperties[key];
|
|
}
|
|
else if (( true) &&
|
|
currentRenderingInstance &&
|
|
(!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(key) ||
|
|
// #1091 avoid internal isRef/isVNode checks on component instance leading
|
|
// to infinite warning loop
|
|
key.indexOf('__v') !== 0)) {
|
|
if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ &&
|
|
(key[0] === '$' || key[0] === '_') &&
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {
|
|
warn(`Property ${JSON.stringify(key)} must be accessed via $data because it starts with a reserved ` +
|
|
`character ("$" or "_") and is not proxied on the render context.`);
|
|
}
|
|
else if (instance === currentRenderingInstance) {
|
|
warn(`Property ${JSON.stringify(key)} was accessed during render ` +
|
|
`but is not defined on instance.`);
|
|
}
|
|
}
|
|
},
|
|
set({ _: instance }, key, value) {
|
|
const { data, setupState, ctx } = instance;
|
|
if (setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, key)) {
|
|
setupState[key] = value;
|
|
}
|
|
else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) {
|
|
data[key] = value;
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(instance.props, key)) {
|
|
( true) &&
|
|
warn(`Attempting to mutate prop "${key}". Props are readonly.`, instance);
|
|
return false;
|
|
}
|
|
if (key[0] === '$' && key.slice(1) in instance) {
|
|
( true) &&
|
|
warn(`Attempting to mutate public property "${key}". ` +
|
|
`Properties starting with $ are reserved and readonly.`, instance);
|
|
return false;
|
|
}
|
|
else {
|
|
if (( true) && key in instance.appContext.config.globalProperties) {
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
value
|
|
});
|
|
}
|
|
else {
|
|
ctx[key] = value;
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
has({ _: { data, setupState, accessCache, ctx, appContext, propsOptions } }, key) {
|
|
let normalizedProps;
|
|
return (accessCache[key] !== undefined ||
|
|
(data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) ||
|
|
(setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, key)) ||
|
|
((normalizedProps = propsOptions[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key)) ||
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key) ||
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(publicPropertiesMap, key) ||
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(appContext.config.globalProperties, key));
|
|
}
|
|
};
|
|
if (true) {
|
|
PublicInstanceProxyHandlers.ownKeys = (target) => {
|
|
warn(`Avoid app logic that relies on enumerating keys on a component instance. ` +
|
|
`The keys will be empty in production mode to avoid performance overhead.`);
|
|
return Reflect.ownKeys(target);
|
|
};
|
|
}
|
|
const RuntimeCompiledPublicInstanceProxyHandlers = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, PublicInstanceProxyHandlers, {
|
|
get(target, key) {
|
|
// fast path for unscopables when using `with` block
|
|
if (key === Symbol.unscopables) {
|
|
return;
|
|
}
|
|
return PublicInstanceProxyHandlers.get(target, key, target);
|
|
},
|
|
has(_, key) {
|
|
const has = key[0] !== '_' && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isGloballyWhitelisted)(key);
|
|
if (( true) && !has && PublicInstanceProxyHandlers.has(_, key)) {
|
|
warn(`Property ${JSON.stringify(key)} should not start with _ which is a reserved prefix for Vue internals.`);
|
|
}
|
|
return has;
|
|
}
|
|
});
|
|
// In dev mode, the proxy target exposes the same properties as seen on `this`
|
|
// for easier console inspection. In prod mode it will be an empty object so
|
|
// these properties definitions can be skipped.
|
|
function createRenderContext(instance) {
|
|
const target = {};
|
|
// expose internal instance for proxy handlers
|
|
Object.defineProperty(target, `_`, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
get: () => instance
|
|
});
|
|
// expose public properties
|
|
Object.keys(publicPropertiesMap).forEach(key => {
|
|
Object.defineProperty(target, key, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
get: () => publicPropertiesMap[key](instance),
|
|
// intercepted by the proxy so no need for implementation,
|
|
// but needed to prevent set errors
|
|
set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
|
|
});
|
|
});
|
|
// expose global properties
|
|
const { globalProperties } = instance.appContext.config;
|
|
Object.keys(globalProperties).forEach(key => {
|
|
Object.defineProperty(target, key, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
get: () => globalProperties[key],
|
|
set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
|
|
});
|
|
});
|
|
return target;
|
|
}
|
|
// dev only
|
|
function exposePropsOnRenderContext(instance) {
|
|
const { ctx, propsOptions: [propsOptions] } = instance;
|
|
if (propsOptions) {
|
|
Object.keys(propsOptions).forEach(key => {
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => instance.props[key],
|
|
set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
|
|
});
|
|
});
|
|
}
|
|
}
|
|
// dev only
|
|
function exposeSetupStateOnRenderContext(instance) {
|
|
const { ctx, setupState } = instance;
|
|
Object.keys((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(setupState)).forEach(key => {
|
|
if (key[0] === '$' || key[0] === '_') {
|
|
warn(`setup() return property ${JSON.stringify(key)} should not start with "$" or "_" ` +
|
|
`which are reserved prefixes for Vue internals.`);
|
|
return;
|
|
}
|
|
Object.defineProperty(ctx, key, {
|
|
enumerable: true,
|
|
configurable: true,
|
|
get: () => setupState[key],
|
|
set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP
|
|
});
|
|
});
|
|
}
|
|
|
|
const emptyAppContext = createAppContext();
|
|
let uid$1 = 0;
|
|
function createComponentInstance(vnode, parent, suspense) {
|
|
const type = vnode.type;
|
|
// inherit parent app context - or - if root, adopt from root vnode
|
|
const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
|
|
const instance = {
|
|
uid: uid$1++,
|
|
vnode,
|
|
type,
|
|
parent,
|
|
appContext,
|
|
root: null,
|
|
next: null,
|
|
subTree: null,
|
|
update: null,
|
|
render: null,
|
|
proxy: null,
|
|
exposed: null,
|
|
withProxy: null,
|
|
effects: null,
|
|
provides: parent ? parent.provides : Object.create(appContext.provides),
|
|
accessCache: null,
|
|
renderCache: [],
|
|
// local resovled assets
|
|
components: null,
|
|
directives: null,
|
|
// resolved props and emits options
|
|
propsOptions: normalizePropsOptions(type, appContext),
|
|
emitsOptions: normalizeEmitsOptions(type, appContext),
|
|
// emit
|
|
emit: null,
|
|
emitted: null,
|
|
// state
|
|
ctx: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
data: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
props: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
attrs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
slots: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
refs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
setupState: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ,
|
|
setupContext: null,
|
|
// suspense related
|
|
suspense,
|
|
suspenseId: suspense ? suspense.pendingId : 0,
|
|
asyncDep: null,
|
|
asyncResolved: false,
|
|
// lifecycle hooks
|
|
// not using enums here because it results in computed properties
|
|
isMounted: false,
|
|
isUnmounted: false,
|
|
isDeactivated: false,
|
|
bc: null,
|
|
c: null,
|
|
bm: null,
|
|
m: null,
|
|
bu: null,
|
|
u: null,
|
|
um: null,
|
|
bum: null,
|
|
da: null,
|
|
a: null,
|
|
rtg: null,
|
|
rtc: null,
|
|
ec: null
|
|
};
|
|
if ((true)) {
|
|
instance.ctx = createRenderContext(instance);
|
|
}
|
|
else {}
|
|
instance.root = parent ? parent.root : instance;
|
|
instance.emit = emit.bind(null, instance);
|
|
return instance;
|
|
}
|
|
let currentInstance = null;
|
|
const getCurrentInstance = () => currentInstance || currentRenderingInstance;
|
|
const setCurrentInstance = (instance) => {
|
|
currentInstance = instance;
|
|
};
|
|
const isBuiltInTag = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)('slot,component');
|
|
function validateComponentName(name, config) {
|
|
const appIsNativeTag = config.isNativeTag || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO;
|
|
if (isBuiltInTag(name) || appIsNativeTag(name)) {
|
|
warn('Do not use built-in or reserved HTML elements as component id: ' + name);
|
|
}
|
|
}
|
|
function isStatefulComponent(instance) {
|
|
return instance.vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */;
|
|
}
|
|
let isInSSRComponentSetup = false;
|
|
function setupComponent(instance, isSSR = false) {
|
|
isInSSRComponentSetup = isSSR;
|
|
const { props, children } = instance.vnode;
|
|
const isStateful = isStatefulComponent(instance);
|
|
initProps(instance, props, isStateful, isSSR);
|
|
initSlots(instance, children);
|
|
const setupResult = isStateful
|
|
? setupStatefulComponent(instance, isSSR)
|
|
: undefined;
|
|
isInSSRComponentSetup = false;
|
|
return setupResult;
|
|
}
|
|
function setupStatefulComponent(instance, isSSR) {
|
|
const Component = instance.type;
|
|
if ((true)) {
|
|
if (Component.name) {
|
|
validateComponentName(Component.name, instance.appContext.config);
|
|
}
|
|
if (Component.components) {
|
|
const names = Object.keys(Component.components);
|
|
for (let i = 0; i < names.length; i++) {
|
|
validateComponentName(names[i], instance.appContext.config);
|
|
}
|
|
}
|
|
if (Component.directives) {
|
|
const names = Object.keys(Component.directives);
|
|
for (let i = 0; i < names.length; i++) {
|
|
validateDirectiveName(names[i]);
|
|
}
|
|
}
|
|
}
|
|
// 0. create render proxy property access cache
|
|
instance.accessCache = Object.create(null);
|
|
// 1. create public instance / render proxy
|
|
// also mark it raw so it's never observed
|
|
instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);
|
|
if ((true)) {
|
|
exposePropsOnRenderContext(instance);
|
|
}
|
|
// 2. call setup()
|
|
const { setup } = Component;
|
|
if (setup) {
|
|
const setupContext = (instance.setupContext =
|
|
setup.length > 1 ? createSetupContext(instance) : null);
|
|
currentInstance = instance;
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
|
|
const setupResult = callWithErrorHandling(setup, instance, 0 /* SETUP_FUNCTION */, [( true) ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(instance.props) : 0, setupContext]);
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
|
|
currentInstance = null;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(setupResult)) {
|
|
if (isSSR) {
|
|
// return the promise so server-renderer can wait on it
|
|
return setupResult.then((resolvedResult) => {
|
|
handleSetupResult(instance, resolvedResult);
|
|
});
|
|
}
|
|
else {
|
|
// async setup returned Promise.
|
|
// bail here and wait for re-entry.
|
|
instance.asyncDep = setupResult;
|
|
}
|
|
}
|
|
else {
|
|
handleSetupResult(instance, setupResult);
|
|
}
|
|
}
|
|
else {
|
|
finishComponentSetup(instance);
|
|
}
|
|
}
|
|
function handleSetupResult(instance, setupResult, isSSR) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(setupResult)) {
|
|
// setup returned an inline render function
|
|
{
|
|
instance.render = setupResult;
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(setupResult)) {
|
|
if (( true) && isVNode(setupResult)) {
|
|
warn(`setup() should not return VNodes directly - ` +
|
|
`return a render function instead.`);
|
|
}
|
|
// setup returned bindings.
|
|
// assuming a render function compiled from template is present.
|
|
if (true) {
|
|
instance.devtoolsRawSetupState = setupResult;
|
|
}
|
|
instance.setupState = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)(setupResult);
|
|
if ((true)) {
|
|
exposeSetupStateOnRenderContext(instance);
|
|
}
|
|
}
|
|
else if (( true) && setupResult !== undefined) {
|
|
warn(`setup() should return an object. Received: ${setupResult === null ? 'null' : typeof setupResult}`);
|
|
}
|
|
finishComponentSetup(instance);
|
|
}
|
|
let compile;
|
|
// dev only
|
|
const isRuntimeOnly = () => !compile;
|
|
/**
|
|
* For runtime-dom to register the compiler.
|
|
* Note the exported method uses any to avoid d.ts relying on the compiler types.
|
|
*/
|
|
function registerRuntimeCompiler(_compile) {
|
|
compile = _compile;
|
|
}
|
|
function finishComponentSetup(instance, isSSR) {
|
|
const Component = instance.type;
|
|
// template / render function normalization
|
|
if (!instance.render) {
|
|
// could be set from setup()
|
|
if (compile && Component.template && !Component.render) {
|
|
if ((true)) {
|
|
startMeasure(instance, `compile`);
|
|
}
|
|
Component.render = compile(Component.template, {
|
|
isCustomElement: instance.appContext.config.isCustomElement,
|
|
delimiters: Component.delimiters
|
|
});
|
|
if ((true)) {
|
|
endMeasure(instance, `compile`);
|
|
}
|
|
}
|
|
instance.render = (Component.render || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP);
|
|
// for runtime-compiled render functions using `with` blocks, the render
|
|
// proxy used needs a different `has` handler which is more performant and
|
|
// also only allows a whitelist of globals to fallthrough.
|
|
if (instance.render._rc) {
|
|
instance.withProxy = new Proxy(instance.ctx, RuntimeCompiledPublicInstanceProxyHandlers);
|
|
}
|
|
}
|
|
// support for 2.x options
|
|
if (__VUE_OPTIONS_API__) {
|
|
currentInstance = instance;
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)();
|
|
applyOptions(instance, Component);
|
|
(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)();
|
|
currentInstance = null;
|
|
}
|
|
// warn missing template/render
|
|
if (( true) && !Component.render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) {
|
|
/* istanbul ignore if */
|
|
if (!compile && Component.template) {
|
|
warn(`Component provided template option but ` +
|
|
`runtime compilation is not supported in this build of Vue.` +
|
|
(` Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".`
|
|
) /* should not happen */);
|
|
}
|
|
else {
|
|
warn(`Component is missing template or render function.`);
|
|
}
|
|
}
|
|
}
|
|
const attrHandlers = {
|
|
get: (target, key) => {
|
|
if ((true)) {
|
|
markAttrsAccessed();
|
|
}
|
|
return target[key];
|
|
},
|
|
set: () => {
|
|
warn(`setupContext.attrs is readonly.`);
|
|
return false;
|
|
},
|
|
deleteProperty: () => {
|
|
warn(`setupContext.attrs is readonly.`);
|
|
return false;
|
|
}
|
|
};
|
|
function createSetupContext(instance) {
|
|
const expose = exposed => {
|
|
if (( true) && instance.exposed) {
|
|
warn(`expose() should be called only once per setup().`);
|
|
}
|
|
instance.exposed = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)(exposed);
|
|
};
|
|
if ((true)) {
|
|
// We use getters in dev in case libs like test-utils overwrite instance
|
|
// properties (overwrites should not be done in prod)
|
|
return Object.freeze({
|
|
get props() {
|
|
return instance.props;
|
|
},
|
|
get attrs() {
|
|
return new Proxy(instance.attrs, attrHandlers);
|
|
},
|
|
get slots() {
|
|
return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(instance.slots);
|
|
},
|
|
get emit() {
|
|
return (event, ...args) => instance.emit(event, ...args);
|
|
},
|
|
expose
|
|
});
|
|
}
|
|
else {}
|
|
}
|
|
// record effects created during a component's setup() so that they can be
|
|
// stopped when the component unmounts
|
|
function recordInstanceBoundEffect(effect, instance = currentInstance) {
|
|
if (instance) {
|
|
(instance.effects || (instance.effects = [])).push(effect);
|
|
}
|
|
}
|
|
const classifyRE = /(?:^|[-_])(\w)/g;
|
|
const classify = (str) => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '');
|
|
function getComponentName(Component) {
|
|
return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Component)
|
|
? Component.displayName || Component.name
|
|
: Component.name;
|
|
}
|
|
/* istanbul ignore next */
|
|
function formatComponentName(instance, Component, isRoot = false) {
|
|
let name = getComponentName(Component);
|
|
if (!name && Component.__file) {
|
|
const match = Component.__file.match(/([^/\\]+)\.\w+$/);
|
|
if (match) {
|
|
name = match[1];
|
|
}
|
|
}
|
|
if (!name && instance && instance.parent) {
|
|
// try to infer the name based on reverse resolution
|
|
const inferFromRegistry = (registry) => {
|
|
for (const key in registry) {
|
|
if (registry[key] === Component) {
|
|
return key;
|
|
}
|
|
}
|
|
};
|
|
name =
|
|
inferFromRegistry(instance.components ||
|
|
instance.parent.type.components) || inferFromRegistry(instance.appContext.components);
|
|
}
|
|
return name ? classify(name) : isRoot ? `App` : `Anonymous`;
|
|
}
|
|
function isClassComponent(value) {
|
|
return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value) && '__vccOpts' in value;
|
|
}
|
|
|
|
function computed(getterOrOptions) {
|
|
const c = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.computed)(getterOrOptions);
|
|
recordInstanceBoundEffect(c.effect);
|
|
return c;
|
|
}
|
|
|
|
// implementation
|
|
function defineProps() {
|
|
if ((true)) {
|
|
warn(`defineProps() is a compiler-hint helper that is only usable inside ` +
|
|
`<script setup> of a single file component. Its arguments should be ` +
|
|
`compiled away and passing it at runtime has no effect.`);
|
|
}
|
|
return null;
|
|
}
|
|
// implementation
|
|
function defineEmit() {
|
|
if ((true)) {
|
|
warn(`defineEmit() is a compiler-hint helper that is only usable inside ` +
|
|
`<script setup> of a single file component. Its arguments should be ` +
|
|
`compiled away and passing it at runtime has no effect.`);
|
|
}
|
|
return null;
|
|
}
|
|
function useContext() {
|
|
const i = getCurrentInstance();
|
|
if (( true) && !i) {
|
|
warn(`useContext() called without active instance.`);
|
|
}
|
|
return i.setupContext || (i.setupContext = createSetupContext(i));
|
|
}
|
|
|
|
// Actual implementation
|
|
function h(type, propsOrChildren, children) {
|
|
const l = arguments.length;
|
|
if (l === 2) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(propsOrChildren) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(propsOrChildren)) {
|
|
// single vnode without props
|
|
if (isVNode(propsOrChildren)) {
|
|
return createVNode(type, null, [propsOrChildren]);
|
|
}
|
|
// props without children
|
|
return createVNode(type, propsOrChildren);
|
|
}
|
|
else {
|
|
// omit props
|
|
return createVNode(type, null, propsOrChildren);
|
|
}
|
|
}
|
|
else {
|
|
if (l > 3) {
|
|
children = Array.prototype.slice.call(arguments, 2);
|
|
}
|
|
else if (l === 3 && isVNode(children)) {
|
|
children = [children];
|
|
}
|
|
return createVNode(type, propsOrChildren, children);
|
|
}
|
|
}
|
|
|
|
const ssrContextKey = Symbol(( true) ? `ssrContext` : 0);
|
|
const useSSRContext = () => {
|
|
{
|
|
const ctx = inject(ssrContextKey);
|
|
if (!ctx) {
|
|
warn(`Server rendering context not provided. Make sure to only call ` +
|
|
`useSSRContext() conditionally in the server build.`);
|
|
}
|
|
return ctx;
|
|
}
|
|
};
|
|
|
|
function initCustomFormatter() {
|
|
/* eslint-disable no-restricted-globals */
|
|
if ( false || typeof window === 'undefined') {
|
|
return;
|
|
}
|
|
const vueStyle = { style: 'color:#3ba776' };
|
|
const numberStyle = { style: 'color:#0b1bc9' };
|
|
const stringStyle = { style: 'color:#b62e24' };
|
|
const keywordStyle = { style: 'color:#9d288c' };
|
|
// custom formatter for Chrome
|
|
// https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html
|
|
const formatter = {
|
|
header(obj) {
|
|
// TODO also format ComponentPublicInstance & ctx.slots/attrs in setup
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) {
|
|
return null;
|
|
}
|
|
if (obj.__isVue) {
|
|
return ['div', vueStyle, `VueInstance`];
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(obj)) {
|
|
return [
|
|
'div',
|
|
{},
|
|
['span', vueStyle, genRefFlag(obj)],
|
|
'<',
|
|
formatValue(obj.value),
|
|
`>`
|
|
];
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(obj)) {
|
|
return [
|
|
'div',
|
|
{},
|
|
['span', vueStyle, 'Reactive'],
|
|
'<',
|
|
formatValue(obj),
|
|
`>${(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj) ? ` (readonly)` : ``}`
|
|
];
|
|
}
|
|
else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj)) {
|
|
return [
|
|
'div',
|
|
{},
|
|
['span', vueStyle, 'Readonly'],
|
|
'<',
|
|
formatValue(obj),
|
|
'>'
|
|
];
|
|
}
|
|
return null;
|
|
},
|
|
hasBody(obj) {
|
|
return obj && obj.__isVue;
|
|
},
|
|
body(obj) {
|
|
if (obj && obj.__isVue) {
|
|
return [
|
|
'div',
|
|
{},
|
|
...formatInstance(obj.$)
|
|
];
|
|
}
|
|
}
|
|
};
|
|
function formatInstance(instance) {
|
|
const blocks = [];
|
|
if (instance.type.props && instance.props) {
|
|
blocks.push(createInstanceBlock('props', (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.props)));
|
|
}
|
|
if (instance.setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
|
|
blocks.push(createInstanceBlock('setup', instance.setupState));
|
|
}
|
|
if (instance.data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) {
|
|
blocks.push(createInstanceBlock('data', (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.data)));
|
|
}
|
|
const computed = extractKeys(instance, 'computed');
|
|
if (computed) {
|
|
blocks.push(createInstanceBlock('computed', computed));
|
|
}
|
|
const injected = extractKeys(instance, 'inject');
|
|
if (injected) {
|
|
blocks.push(createInstanceBlock('injected', injected));
|
|
}
|
|
blocks.push([
|
|
'div',
|
|
{},
|
|
[
|
|
'span',
|
|
{
|
|
style: keywordStyle.style + ';opacity:0.66'
|
|
},
|
|
'$ (internal): '
|
|
],
|
|
['object', { object: instance }]
|
|
]);
|
|
return blocks;
|
|
}
|
|
function createInstanceBlock(type, target) {
|
|
target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, target);
|
|
if (!Object.keys(target).length) {
|
|
return ['span', {}];
|
|
}
|
|
return [
|
|
'div',
|
|
{ style: 'line-height:1.25em;margin-bottom:0.6em' },
|
|
[
|
|
'div',
|
|
{
|
|
style: 'color:#476582'
|
|
},
|
|
type
|
|
],
|
|
[
|
|
'div',
|
|
{
|
|
style: 'padding-left:1.25em'
|
|
},
|
|
...Object.keys(target).map(key => {
|
|
return [
|
|
'div',
|
|
{},
|
|
['span', keywordStyle, key + ': '],
|
|
formatValue(target[key], false)
|
|
];
|
|
})
|
|
]
|
|
];
|
|
}
|
|
function formatValue(v, asRaw = true) {
|
|
if (typeof v === 'number') {
|
|
return ['span', numberStyle, v];
|
|
}
|
|
else if (typeof v === 'string') {
|
|
return ['span', stringStyle, JSON.stringify(v)];
|
|
}
|
|
else if (typeof v === 'boolean') {
|
|
return ['span', keywordStyle, v];
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(v)) {
|
|
return ['object', { object: asRaw ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(v) : v }];
|
|
}
|
|
else {
|
|
return ['span', stringStyle, String(v)];
|
|
}
|
|
}
|
|
function extractKeys(instance, type) {
|
|
const Comp = instance.type;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Comp)) {
|
|
return;
|
|
}
|
|
const extracted = {};
|
|
for (const key in instance.ctx) {
|
|
if (isKeyOfType(Comp, key, type)) {
|
|
extracted[key] = instance.ctx[key];
|
|
}
|
|
}
|
|
return extracted;
|
|
}
|
|
function isKeyOfType(Comp, key, type) {
|
|
const opts = Comp[type];
|
|
if (((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opts) && opts.includes(key)) ||
|
|
((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opts) && key in opts)) {
|
|
return true;
|
|
}
|
|
if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {
|
|
return true;
|
|
}
|
|
if (Comp.mixins && Comp.mixins.some(m => isKeyOfType(m, key, type))) {
|
|
return true;
|
|
}
|
|
}
|
|
function genRefFlag(v) {
|
|
if (v._shallow) {
|
|
return `ShallowRef`;
|
|
}
|
|
if (v.effect) {
|
|
return `ComputedRef`;
|
|
}
|
|
return `Ref`;
|
|
}
|
|
if (window.devtoolsFormatters) {
|
|
window.devtoolsFormatters.push(formatter);
|
|
}
|
|
else {
|
|
window.devtoolsFormatters = [formatter];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Actual implementation
|
|
*/
|
|
function renderList(source, renderItem) {
|
|
let ret;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source)) {
|
|
ret = new Array(source.length);
|
|
for (let i = 0, l = source.length; i < l; i++) {
|
|
ret[i] = renderItem(source[i], i);
|
|
}
|
|
}
|
|
else if (typeof source === 'number') {
|
|
if (( true) && !Number.isInteger(source)) {
|
|
warn(`The v-for range expect an integer value but got ${source}.`);
|
|
return [];
|
|
}
|
|
ret = new Array(source);
|
|
for (let i = 0; i < source; i++) {
|
|
ret[i] = renderItem(i + 1, i);
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(source)) {
|
|
if (source[Symbol.iterator]) {
|
|
ret = Array.from(source, renderItem);
|
|
}
|
|
else {
|
|
const keys = Object.keys(source);
|
|
ret = new Array(keys.length);
|
|
for (let i = 0, l = keys.length; i < l; i++) {
|
|
const key = keys[i];
|
|
ret[i] = renderItem(source[key], key, i);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
ret = [];
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* For prefixing keys in v-on="obj" with "on"
|
|
* @private
|
|
*/
|
|
function toHandlers(obj) {
|
|
const ret = {};
|
|
if (( true) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) {
|
|
warn(`v-on with no argument expects an object value.`);
|
|
return ret;
|
|
}
|
|
for (const key in obj) {
|
|
ret[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(key)] = obj[key];
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* Compiler runtime helper for creating dynamic slots object
|
|
* @private
|
|
*/
|
|
function createSlots(slots, dynamicSlots) {
|
|
for (let i = 0; i < dynamicSlots.length; i++) {
|
|
const slot = dynamicSlots[i];
|
|
// array of dynamic slot generated by <template v-for="..." #[...]>
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(slot)) {
|
|
for (let j = 0; j < slot.length; j++) {
|
|
slots[slot[j].name] = slot[j].fn;
|
|
}
|
|
}
|
|
else if (slot) {
|
|
// conditional single slot generated by <template v-if="..." #foo>
|
|
slots[slot.name] = slot.fn;
|
|
}
|
|
}
|
|
return slots;
|
|
}
|
|
|
|
// Core API ------------------------------------------------------------------
|
|
const version = "3.0.7";
|
|
/**
|
|
* SSR utils for \@vue/server-renderer. Only exposed in cjs builds.
|
|
* @internal
|
|
*/
|
|
const ssrUtils = (null);
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js":
|
|
/*!***********************************************************************!*\
|
|
!*** ./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js ***!
|
|
\***********************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "BaseTransition": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition),
|
|
/* harmony export */ "Comment": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Comment),
|
|
/* harmony export */ "Fragment": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment),
|
|
/* harmony export */ "KeepAlive": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.KeepAlive),
|
|
/* harmony export */ "Static": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static),
|
|
/* harmony export */ "Suspense": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Suspense),
|
|
/* harmony export */ "Teleport": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Teleport),
|
|
/* harmony export */ "Text": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Text),
|
|
/* harmony export */ "callWithAsyncErrorHandling": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling),
|
|
/* harmony export */ "callWithErrorHandling": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling),
|
|
/* harmony export */ "camelize": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.camelize),
|
|
/* harmony export */ "capitalize": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.capitalize),
|
|
/* harmony export */ "cloneVNode": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.cloneVNode),
|
|
/* harmony export */ "computed": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.computed),
|
|
/* harmony export */ "createBlock": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createBlock),
|
|
/* harmony export */ "createCommentVNode": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode),
|
|
/* harmony export */ "createHydrationRenderer": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer),
|
|
/* harmony export */ "createRenderer": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer),
|
|
/* harmony export */ "createSlots": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createSlots),
|
|
/* harmony export */ "createStaticVNode": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode),
|
|
/* harmony export */ "createTextVNode": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createTextVNode),
|
|
/* harmony export */ "createVNode": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode),
|
|
/* harmony export */ "customRef": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.customRef),
|
|
/* harmony export */ "defineAsyncComponent": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent),
|
|
/* harmony export */ "defineComponent": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent),
|
|
/* harmony export */ "defineEmit": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineEmit),
|
|
/* harmony export */ "defineProps": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineProps),
|
|
/* harmony export */ "devtools": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.devtools),
|
|
/* harmony export */ "getCurrentInstance": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance),
|
|
/* harmony export */ "getTransitionRawChildren": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren),
|
|
/* harmony export */ "h": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h),
|
|
/* harmony export */ "handleError": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.handleError),
|
|
/* harmony export */ "initCustomFormatter": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter),
|
|
/* harmony export */ "inject": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.inject),
|
|
/* harmony export */ "isProxy": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isProxy),
|
|
/* harmony export */ "isReactive": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReactive),
|
|
/* harmony export */ "isReadonly": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReadonly),
|
|
/* harmony export */ "isRef": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRef),
|
|
/* harmony export */ "isRuntimeOnly": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly),
|
|
/* harmony export */ "isVNode": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isVNode),
|
|
/* harmony export */ "markRaw": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.markRaw),
|
|
/* harmony export */ "mergeProps": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeProps),
|
|
/* harmony export */ "nextTick": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick),
|
|
/* harmony export */ "onActivated": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onActivated),
|
|
/* harmony export */ "onBeforeMount": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount),
|
|
/* harmony export */ "onBeforeUnmount": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount),
|
|
/* harmony export */ "onBeforeUpdate": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate),
|
|
/* harmony export */ "onDeactivated": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onDeactivated),
|
|
/* harmony export */ "onErrorCaptured": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured),
|
|
/* harmony export */ "onMounted": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted),
|
|
/* harmony export */ "onRenderTracked": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked),
|
|
/* harmony export */ "onRenderTriggered": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered),
|
|
/* harmony export */ "onUnmounted": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted),
|
|
/* harmony export */ "onUpdated": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated),
|
|
/* harmony export */ "openBlock": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.openBlock),
|
|
/* harmony export */ "popScopeId": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.popScopeId),
|
|
/* harmony export */ "provide": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.provide),
|
|
/* harmony export */ "proxyRefs": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.proxyRefs),
|
|
/* harmony export */ "pushScopeId": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.pushScopeId),
|
|
/* harmony export */ "queuePostFlushCb": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb),
|
|
/* harmony export */ "reactive": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.reactive),
|
|
/* harmony export */ "readonly": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.readonly),
|
|
/* harmony export */ "ref": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ref),
|
|
/* harmony export */ "registerRuntimeCompiler": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler),
|
|
/* harmony export */ "renderList": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderList),
|
|
/* harmony export */ "renderSlot": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderSlot),
|
|
/* harmony export */ "resolveComponent": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponent),
|
|
/* harmony export */ "resolveDirective": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDirective),
|
|
/* harmony export */ "resolveDynamicComponent": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent),
|
|
/* harmony export */ "resolveTransitionHooks": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks),
|
|
/* harmony export */ "setBlockTracking": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking),
|
|
/* harmony export */ "setDevtoolsHook": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook),
|
|
/* harmony export */ "setTransitionHooks": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks),
|
|
/* harmony export */ "shallowReactive": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReactive),
|
|
/* harmony export */ "shallowReadonly": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly),
|
|
/* harmony export */ "shallowRef": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowRef),
|
|
/* harmony export */ "ssrContextKey": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey),
|
|
/* harmony export */ "ssrUtils": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrUtils),
|
|
/* harmony export */ "toDisplayString": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toDisplayString),
|
|
/* harmony export */ "toHandlerKey": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey),
|
|
/* harmony export */ "toHandlers": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlers),
|
|
/* harmony export */ "toRaw": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRaw),
|
|
/* harmony export */ "toRef": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRef),
|
|
/* harmony export */ "toRefs": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRefs),
|
|
/* harmony export */ "transformVNodeArgs": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs),
|
|
/* harmony export */ "triggerRef": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.triggerRef),
|
|
/* harmony export */ "unref": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.unref),
|
|
/* harmony export */ "useContext": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useContext),
|
|
/* harmony export */ "useSSRContext": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSSRContext),
|
|
/* harmony export */ "useTransitionState": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState),
|
|
/* harmony export */ "version": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.version),
|
|
/* harmony export */ "warn": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn),
|
|
/* harmony export */ "watch": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watch),
|
|
/* harmony export */ "watchEffect": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchEffect),
|
|
/* harmony export */ "withCtx": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withCtx),
|
|
/* harmony export */ "withDirectives": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDirectives),
|
|
/* harmony export */ "withScopeId": () => (/* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withScopeId),
|
|
/* harmony export */ "Transition": () => (/* binding */ Transition),
|
|
/* harmony export */ "TransitionGroup": () => (/* binding */ TransitionGroup),
|
|
/* harmony export */ "createApp": () => (/* binding */ createApp),
|
|
/* harmony export */ "createSSRApp": () => (/* binding */ createSSRApp),
|
|
/* harmony export */ "hydrate": () => (/* binding */ hydrate),
|
|
/* harmony export */ "render": () => (/* binding */ render),
|
|
/* harmony export */ "useCssModule": () => (/* binding */ useCssModule),
|
|
/* harmony export */ "useCssVars": () => (/* binding */ useCssVars),
|
|
/* harmony export */ "vModelCheckbox": () => (/* binding */ vModelCheckbox),
|
|
/* harmony export */ "vModelDynamic": () => (/* binding */ vModelDynamic),
|
|
/* harmony export */ "vModelRadio": () => (/* binding */ vModelRadio),
|
|
/* harmony export */ "vModelSelect": () => (/* binding */ vModelSelect),
|
|
/* harmony export */ "vModelText": () => (/* binding */ vModelText),
|
|
/* harmony export */ "vShow": () => (/* binding */ vShow),
|
|
/* harmony export */ "withKeys": () => (/* binding */ withKeys),
|
|
/* harmony export */ "withModifiers": () => (/* binding */ withModifiers)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
|
|
/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-core */ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js");
|
|
/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/runtime-core */ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js");
|
|
|
|
|
|
|
|
|
|
const svgNS = 'http://www.w3.org/2000/svg';
|
|
const doc = (typeof document !== 'undefined' ? document : null);
|
|
let tempContainer;
|
|
let tempSVGContainer;
|
|
const nodeOps = {
|
|
insert: (child, parent, anchor) => {
|
|
parent.insertBefore(child, anchor || null);
|
|
},
|
|
remove: child => {
|
|
const parent = child.parentNode;
|
|
if (parent) {
|
|
parent.removeChild(child);
|
|
}
|
|
},
|
|
createElement: (tag, isSVG, is) => isSVG
|
|
? doc.createElementNS(svgNS, tag)
|
|
: doc.createElement(tag, is ? { is } : undefined),
|
|
createText: text => doc.createTextNode(text),
|
|
createComment: text => doc.createComment(text),
|
|
setText: (node, text) => {
|
|
node.nodeValue = text;
|
|
},
|
|
setElementText: (el, text) => {
|
|
el.textContent = text;
|
|
},
|
|
parentNode: node => node.parentNode,
|
|
nextSibling: node => node.nextSibling,
|
|
querySelector: selector => doc.querySelector(selector),
|
|
setScopeId(el, id) {
|
|
el.setAttribute(id, '');
|
|
},
|
|
cloneNode(el) {
|
|
return el.cloneNode(true);
|
|
},
|
|
// __UNSAFE__
|
|
// Reason: innerHTML.
|
|
// Static content here can only come from compiled templates.
|
|
// As long as the user only uses trusted templates, this is safe.
|
|
insertStaticContent(content, parent, anchor, isSVG) {
|
|
const temp = isSVG
|
|
? tempSVGContainer ||
|
|
(tempSVGContainer = doc.createElementNS(svgNS, 'svg'))
|
|
: tempContainer || (tempContainer = doc.createElement('div'));
|
|
temp.innerHTML = content;
|
|
const first = temp.firstChild;
|
|
let node = first;
|
|
let last = node;
|
|
while (node) {
|
|
last = node;
|
|
nodeOps.insert(node, parent, anchor);
|
|
node = temp.firstChild;
|
|
}
|
|
return [first, last];
|
|
}
|
|
};
|
|
|
|
// compiler should normalize class + :class bindings on the same element
|
|
// into a single binding ['staticClass', dynamic]
|
|
function patchClass(el, value, isSVG) {
|
|
if (value == null) {
|
|
value = '';
|
|
}
|
|
if (isSVG) {
|
|
el.setAttribute('class', value);
|
|
}
|
|
else {
|
|
// directly setting className should be faster than setAttribute in theory
|
|
// if this is an element during a transition, take the temporary transition
|
|
// classes into account.
|
|
const transitionClasses = el._vtc;
|
|
if (transitionClasses) {
|
|
value = (value
|
|
? [value, ...transitionClasses]
|
|
: [...transitionClasses]).join(' ');
|
|
}
|
|
el.className = value;
|
|
}
|
|
}
|
|
|
|
function patchStyle(el, prev, next) {
|
|
const style = el.style;
|
|
if (!next) {
|
|
el.removeAttribute('style');
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(next)) {
|
|
if (prev !== next) {
|
|
const current = style.display;
|
|
style.cssText = next;
|
|
// indicates that the `display` of the element is controlled by `v-show`,
|
|
// so we always keep the current `display` value regardless of the `style` value,
|
|
// thus handing over control to `v-show`.
|
|
if ('_vod' in el) {
|
|
style.display = current;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
for (const key in next) {
|
|
setStyle(style, key, next[key]);
|
|
}
|
|
if (prev && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(prev)) {
|
|
for (const key in prev) {
|
|
if (next[key] == null) {
|
|
setStyle(style, key, '');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const importantRE = /\s*!important$/;
|
|
function setStyle(style, name, val) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(val)) {
|
|
val.forEach(v => setStyle(style, name, v));
|
|
}
|
|
else {
|
|
if (name.startsWith('--')) {
|
|
// custom property definition
|
|
style.setProperty(name, val);
|
|
}
|
|
else {
|
|
const prefixed = autoPrefix(style, name);
|
|
if (importantRE.test(val)) {
|
|
// !important
|
|
style.setProperty((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(prefixed), val.replace(importantRE, ''), 'important');
|
|
}
|
|
else {
|
|
style[prefixed] = val;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const prefixes = ['Webkit', 'Moz', 'ms'];
|
|
const prefixCache = {};
|
|
function autoPrefix(style, rawName) {
|
|
const cached = prefixCache[rawName];
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
let name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(rawName);
|
|
if (name !== 'filter' && name in style) {
|
|
return (prefixCache[rawName] = name);
|
|
}
|
|
name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(name);
|
|
for (let i = 0; i < prefixes.length; i++) {
|
|
const prefixed = prefixes[i] + name;
|
|
if (prefixed in style) {
|
|
return (prefixCache[rawName] = prefixed);
|
|
}
|
|
}
|
|
return rawName;
|
|
}
|
|
|
|
const xlinkNS = 'http://www.w3.org/1999/xlink';
|
|
function patchAttr(el, key, value, isSVG) {
|
|
if (isSVG && key.startsWith('xlink:')) {
|
|
if (value == null) {
|
|
el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
|
|
}
|
|
else {
|
|
el.setAttributeNS(xlinkNS, key, value);
|
|
}
|
|
}
|
|
else {
|
|
// note we are only checking boolean attributes that don't have a
|
|
// corresponding dom prop of the same name here.
|
|
const isBoolean = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSpecialBooleanAttr)(key);
|
|
if (value == null || (isBoolean && value === false)) {
|
|
el.removeAttribute(key);
|
|
}
|
|
else {
|
|
el.setAttribute(key, isBoolean ? '' : value);
|
|
}
|
|
}
|
|
}
|
|
|
|
// __UNSAFE__
|
|
// functions. The user is responsible for using them with only trusted content.
|
|
function patchDOMProp(el, key, value,
|
|
// the following args are passed only due to potential innerHTML/textContent
|
|
// overriding existing VNodes, in which case the old tree must be properly
|
|
// unmounted.
|
|
prevChildren, parentComponent, parentSuspense, unmountChildren) {
|
|
if (key === 'innerHTML' || key === 'textContent') {
|
|
if (prevChildren) {
|
|
unmountChildren(prevChildren, parentComponent, parentSuspense);
|
|
}
|
|
el[key] = value == null ? '' : value;
|
|
return;
|
|
}
|
|
if (key === 'value' && el.tagName !== 'PROGRESS') {
|
|
// store value as _value as well since
|
|
// non-string values will be stringified.
|
|
el._value = value;
|
|
const newValue = value == null ? '' : value;
|
|
if (el.value !== newValue) {
|
|
el.value = newValue;
|
|
}
|
|
return;
|
|
}
|
|
if (value === '' || value == null) {
|
|
const type = typeof el[key];
|
|
if (value === '' && type === 'boolean') {
|
|
// e.g. <select multiple> compiles to { multiple: '' }
|
|
el[key] = true;
|
|
return;
|
|
}
|
|
else if (value == null && type === 'string') {
|
|
// e.g. <div :id="null">
|
|
el[key] = '';
|
|
el.removeAttribute(key);
|
|
return;
|
|
}
|
|
else if (type === 'number') {
|
|
// e.g. <img :width="null">
|
|
el[key] = 0;
|
|
el.removeAttribute(key);
|
|
return;
|
|
}
|
|
}
|
|
// some properties perform value validation and throw
|
|
try {
|
|
el[key] = value;
|
|
}
|
|
catch (e) {
|
|
if ((true)) {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Failed setting prop "${key}" on <${el.tagName.toLowerCase()}>: ` +
|
|
`value ${value} is invalid.`, e);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Async edge case fix requires storing an event listener's attach timestamp.
|
|
let _getNow = Date.now;
|
|
// Determine what event timestamp the browser is using. Annoyingly, the
|
|
// timestamp can either be hi-res (relative to page load) or low-res
|
|
// (relative to UNIX epoch), so in order to compare time we have to use the
|
|
// same timestamp type when saving the flush timestamp.
|
|
if (typeof document !== 'undefined' &&
|
|
_getNow() > document.createEvent('Event').timeStamp) {
|
|
// if the low-res timestamp which is bigger than the event timestamp
|
|
// (which is evaluated AFTER) it means the event is using a hi-res timestamp,
|
|
// and we need to use the hi-res version for event listeners as well.
|
|
_getNow = () => performance.now();
|
|
}
|
|
// To avoid the overhead of repeatedly calling performance.now(), we cache
|
|
// and use the same timestamp for all event listeners attached in the same tick.
|
|
let cachedNow = 0;
|
|
const p = Promise.resolve();
|
|
const reset = () => {
|
|
cachedNow = 0;
|
|
};
|
|
const getNow = () => cachedNow || (p.then(reset), (cachedNow = _getNow()));
|
|
function addEventListener(el, event, handler, options) {
|
|
el.addEventListener(event, handler, options);
|
|
}
|
|
function removeEventListener(el, event, handler, options) {
|
|
el.removeEventListener(event, handler, options);
|
|
}
|
|
function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
|
|
// vei = vue event invokers
|
|
const invokers = el._vei || (el._vei = {});
|
|
const existingInvoker = invokers[rawName];
|
|
if (nextValue && existingInvoker) {
|
|
// patch
|
|
existingInvoker.value = nextValue;
|
|
}
|
|
else {
|
|
const [name, options] = parseName(rawName);
|
|
if (nextValue) {
|
|
// add
|
|
const invoker = (invokers[rawName] = createInvoker(nextValue, instance));
|
|
addEventListener(el, name, invoker, options);
|
|
}
|
|
else if (existingInvoker) {
|
|
// remove
|
|
removeEventListener(el, name, existingInvoker, options);
|
|
invokers[rawName] = undefined;
|
|
}
|
|
}
|
|
}
|
|
const optionsModifierRE = /(?:Once|Passive|Capture)$/;
|
|
function parseName(name) {
|
|
let options;
|
|
if (optionsModifierRE.test(name)) {
|
|
options = {};
|
|
let m;
|
|
while ((m = name.match(optionsModifierRE))) {
|
|
name = name.slice(0, name.length - m[0].length);
|
|
options[m[0].toLowerCase()] = true;
|
|
}
|
|
}
|
|
return [(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(name.slice(2)), options];
|
|
}
|
|
function createInvoker(initialValue, instance) {
|
|
const invoker = (e) => {
|
|
// async edge case #6566: inner click event triggers patch, event handler
|
|
// attached to outer element during patch, and triggered again. This
|
|
// happens because browsers fire microtask ticks between event propagation.
|
|
// the solution is simple: we save the timestamp when a handler is attached,
|
|
// and the handler would only fire if the event passed to it was fired
|
|
// AFTER it was attached.
|
|
const timeStamp = e.timeStamp || _getNow();
|
|
if (timeStamp >= invoker.attached - 1) {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling)(patchStopImmediatePropagation(e, invoker.value), instance, 5 /* NATIVE_EVENT_HANDLER */, [e]);
|
|
}
|
|
};
|
|
invoker.value = initialValue;
|
|
invoker.attached = getNow();
|
|
return invoker;
|
|
}
|
|
function patchStopImmediatePropagation(e, value) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
|
|
const originalStop = e.stopImmediatePropagation;
|
|
e.stopImmediatePropagation = () => {
|
|
originalStop.call(e);
|
|
e._stopped = true;
|
|
};
|
|
return value.map(fn => (e) => !e._stopped && fn(e));
|
|
}
|
|
else {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
const nativeOnRE = /^on[a-z]/;
|
|
const forcePatchProp = (_, key) => key === 'value';
|
|
const patchProp = (el, key, prevValue, nextValue, isSVG = false, prevChildren, parentComponent, parentSuspense, unmountChildren) => {
|
|
switch (key) {
|
|
// special
|
|
case 'class':
|
|
patchClass(el, nextValue, isSVG);
|
|
break;
|
|
case 'style':
|
|
patchStyle(el, prevValue, nextValue);
|
|
break;
|
|
default:
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) {
|
|
// ignore v-model listeners
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) {
|
|
patchEvent(el, key, prevValue, nextValue, parentComponent);
|
|
}
|
|
}
|
|
else if (shouldSetAsProp(el, key, nextValue, isSVG)) {
|
|
patchDOMProp(el, key, nextValue, prevChildren, parentComponent, parentSuspense, unmountChildren);
|
|
}
|
|
else {
|
|
// special case for <input v-model type="checkbox"> with
|
|
// :true-value & :false-value
|
|
// store value as dom properties since non-string values will be
|
|
// stringified.
|
|
if (key === 'true-value') {
|
|
el._trueValue = nextValue;
|
|
}
|
|
else if (key === 'false-value') {
|
|
el._falseValue = nextValue;
|
|
}
|
|
patchAttr(el, key, nextValue, isSVG);
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
function shouldSetAsProp(el, key, value, isSVG) {
|
|
if (isSVG) {
|
|
// most keys must be set as attribute on svg elements to work
|
|
// ...except innerHTML
|
|
if (key === 'innerHTML') {
|
|
return true;
|
|
}
|
|
// or native onclick with function values
|
|
if (key in el && nativeOnRE.test(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
// spellcheck and draggable are numerated attrs, however their
|
|
// corresponding DOM properties are actually booleans - this leads to
|
|
// setting it with a string "false" value leading it to be coerced to
|
|
// `true`, so we need to always treat them as attributes.
|
|
// Note that `contentEditable` doesn't have this problem: its DOM
|
|
// property is also enumerated string values.
|
|
if (key === 'spellcheck' || key === 'draggable') {
|
|
return false;
|
|
}
|
|
// #1787, #2840 form property on form elements is readonly and must be set as
|
|
// attribute.
|
|
if (key === 'form') {
|
|
return false;
|
|
}
|
|
// #1526 <input list> must be set as attribute
|
|
if (key === 'list' && el.tagName === 'INPUT') {
|
|
return false;
|
|
}
|
|
// #2766 <textarea type> must be set as attribute
|
|
if (key === 'type' && el.tagName === 'TEXTAREA') {
|
|
return false;
|
|
}
|
|
// native onclick with string value, must be set as attribute
|
|
if (nativeOnRE.test(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) {
|
|
return false;
|
|
}
|
|
return key in el;
|
|
}
|
|
|
|
function useCssModule(name = '$style') {
|
|
/* istanbul ignore else */
|
|
{
|
|
const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();
|
|
if (!instance) {
|
|
( true) && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssModule must be called inside setup()`);
|
|
return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
}
|
|
const modules = instance.type.__cssModules;
|
|
if (!modules) {
|
|
( true) && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS modules injected.`);
|
|
return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
}
|
|
const mod = modules[name];
|
|
if (!mod) {
|
|
( true) &&
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS module named "${name}".`);
|
|
return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ;
|
|
}
|
|
return mod;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Runtime helper for SFC's CSS variable injection feature.
|
|
* @private
|
|
*/
|
|
function useCssVars(getter) {
|
|
const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();
|
|
/* istanbul ignore next */
|
|
if (!instance) {
|
|
( true) &&
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssVars is called without current active component instance.`);
|
|
return;
|
|
}
|
|
const setVars = () => setVarsOnVNode(instance.subTree, getter(instance.proxy));
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchEffect)(setVars, { flush: 'post' }));
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated)(setVars);
|
|
}
|
|
function setVarsOnVNode(vnode, vars) {
|
|
if (vnode.shapeFlag & 128 /* SUSPENSE */) {
|
|
const suspense = vnode.suspense;
|
|
vnode = suspense.activeBranch;
|
|
if (suspense.pendingBranch && !suspense.isHydrating) {
|
|
suspense.effects.push(() => {
|
|
setVarsOnVNode(suspense.activeBranch, vars);
|
|
});
|
|
}
|
|
}
|
|
// drill down HOCs until it's a non-component vnode
|
|
while (vnode.component) {
|
|
vnode = vnode.component.subTree;
|
|
}
|
|
if (vnode.shapeFlag & 1 /* ELEMENT */ && vnode.el) {
|
|
const style = vnode.el.style;
|
|
for (const key in vars) {
|
|
style.setProperty(`--${key}`, vars[key]);
|
|
}
|
|
}
|
|
else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment) {
|
|
vnode.children.forEach(c => setVarsOnVNode(c, vars));
|
|
}
|
|
}
|
|
|
|
const TRANSITION = 'transition';
|
|
const ANIMATION = 'animation';
|
|
// DOM Transition is a higher-order-component based on the platform-agnostic
|
|
// base Transition component, with DOM-specific logic.
|
|
const Transition = (props, { slots }) => (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h)(_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition, resolveTransitionProps(props), slots);
|
|
Transition.displayName = 'Transition';
|
|
const DOMTransitionPropsValidators = {
|
|
name: String,
|
|
type: String,
|
|
css: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
duration: [String, Number, Object],
|
|
enterFromClass: String,
|
|
enterActiveClass: String,
|
|
enterToClass: String,
|
|
appearFromClass: String,
|
|
appearActiveClass: String,
|
|
appearToClass: String,
|
|
leaveFromClass: String,
|
|
leaveActiveClass: String,
|
|
leaveToClass: String
|
|
};
|
|
const TransitionPropsValidators = (Transition.props = /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition.props, DOMTransitionPropsValidators));
|
|
function resolveTransitionProps(rawProps) {
|
|
let { name = 'v', type, css = true, duration, enterFromClass = `${name}-enter-from`, enterActiveClass = `${name}-enter-active`, enterToClass = `${name}-enter-to`, appearFromClass = enterFromClass, appearActiveClass = enterActiveClass, appearToClass = enterToClass, leaveFromClass = `${name}-leave-from`, leaveActiveClass = `${name}-leave-active`, leaveToClass = `${name}-leave-to` } = rawProps;
|
|
const baseProps = {};
|
|
for (const key in rawProps) {
|
|
if (!(key in DOMTransitionPropsValidators)) {
|
|
baseProps[key] = rawProps[key];
|
|
}
|
|
}
|
|
if (!css) {
|
|
return baseProps;
|
|
}
|
|
const durations = normalizeDuration(duration);
|
|
const enterDuration = durations && durations[0];
|
|
const leaveDuration = durations && durations[1];
|
|
const { onBeforeEnter, onEnter, onEnterCancelled, onLeave, onLeaveCancelled, onBeforeAppear = onBeforeEnter, onAppear = onEnter, onAppearCancelled = onEnterCancelled } = baseProps;
|
|
const finishEnter = (el, isAppear, done) => {
|
|
removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
|
|
removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
|
|
done && done();
|
|
};
|
|
const finishLeave = (el, done) => {
|
|
removeTransitionClass(el, leaveToClass);
|
|
removeTransitionClass(el, leaveActiveClass);
|
|
done && done();
|
|
};
|
|
const makeEnterHook = (isAppear) => {
|
|
return (el, done) => {
|
|
const hook = isAppear ? onAppear : onEnter;
|
|
const resolve = () => finishEnter(el, isAppear, done);
|
|
hook && hook(el, resolve);
|
|
nextFrame(() => {
|
|
removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
|
|
addTransitionClass(el, isAppear ? appearToClass : enterToClass);
|
|
if (!(hook && hook.length > 1)) {
|
|
whenTransitionEnds(el, type, enterDuration, resolve);
|
|
}
|
|
});
|
|
};
|
|
};
|
|
return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(baseProps, {
|
|
onBeforeEnter(el) {
|
|
onBeforeEnter && onBeforeEnter(el);
|
|
addTransitionClass(el, enterFromClass);
|
|
addTransitionClass(el, enterActiveClass);
|
|
},
|
|
onBeforeAppear(el) {
|
|
onBeforeAppear && onBeforeAppear(el);
|
|
addTransitionClass(el, appearFromClass);
|
|
addTransitionClass(el, appearActiveClass);
|
|
},
|
|
onEnter: makeEnterHook(false),
|
|
onAppear: makeEnterHook(true),
|
|
onLeave(el, done) {
|
|
const resolve = () => finishLeave(el, done);
|
|
addTransitionClass(el, leaveFromClass);
|
|
// force reflow so *-leave-from classes immediately take effect (#2593)
|
|
forceReflow();
|
|
addTransitionClass(el, leaveActiveClass);
|
|
nextFrame(() => {
|
|
removeTransitionClass(el, leaveFromClass);
|
|
addTransitionClass(el, leaveToClass);
|
|
if (!(onLeave && onLeave.length > 1)) {
|
|
whenTransitionEnds(el, type, leaveDuration, resolve);
|
|
}
|
|
});
|
|
onLeave && onLeave(el, resolve);
|
|
},
|
|
onEnterCancelled(el) {
|
|
finishEnter(el, false);
|
|
onEnterCancelled && onEnterCancelled(el);
|
|
},
|
|
onAppearCancelled(el) {
|
|
finishEnter(el, true);
|
|
onAppearCancelled && onAppearCancelled(el);
|
|
},
|
|
onLeaveCancelled(el) {
|
|
finishLeave(el);
|
|
onLeaveCancelled && onLeaveCancelled(el);
|
|
}
|
|
});
|
|
}
|
|
function normalizeDuration(duration) {
|
|
if (duration == null) {
|
|
return null;
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(duration)) {
|
|
return [NumberOf(duration.enter), NumberOf(duration.leave)];
|
|
}
|
|
else {
|
|
const n = NumberOf(duration);
|
|
return [n, n];
|
|
}
|
|
}
|
|
function NumberOf(val) {
|
|
const res = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(val);
|
|
if ((true))
|
|
validateDuration(res);
|
|
return res;
|
|
}
|
|
function validateDuration(val) {
|
|
if (typeof val !== 'number') {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<transition> explicit duration is not a valid number - ` +
|
|
`got ${JSON.stringify(val)}.`);
|
|
}
|
|
else if (isNaN(val)) {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<transition> explicit duration is NaN - ` +
|
|
'the duration expression might be incorrect.');
|
|
}
|
|
}
|
|
function addTransitionClass(el, cls) {
|
|
cls.split(/\s+/).forEach(c => c && el.classList.add(c));
|
|
(el._vtc ||
|
|
(el._vtc = new Set())).add(cls);
|
|
}
|
|
function removeTransitionClass(el, cls) {
|
|
cls.split(/\s+/).forEach(c => c && el.classList.remove(c));
|
|
const { _vtc } = el;
|
|
if (_vtc) {
|
|
_vtc.delete(cls);
|
|
if (!_vtc.size) {
|
|
el._vtc = undefined;
|
|
}
|
|
}
|
|
}
|
|
function nextFrame(cb) {
|
|
requestAnimationFrame(() => {
|
|
requestAnimationFrame(cb);
|
|
});
|
|
}
|
|
let endId = 0;
|
|
function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
|
|
const id = (el._endId = ++endId);
|
|
const resolveIfNotStale = () => {
|
|
if (id === el._endId) {
|
|
resolve();
|
|
}
|
|
};
|
|
if (explicitTimeout) {
|
|
return setTimeout(resolveIfNotStale, explicitTimeout);
|
|
}
|
|
const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
|
|
if (!type) {
|
|
return resolve();
|
|
}
|
|
const endEvent = type + 'end';
|
|
let ended = 0;
|
|
const end = () => {
|
|
el.removeEventListener(endEvent, onEnd);
|
|
resolveIfNotStale();
|
|
};
|
|
const onEnd = (e) => {
|
|
if (e.target === el && ++ended >= propCount) {
|
|
end();
|
|
}
|
|
};
|
|
setTimeout(() => {
|
|
if (ended < propCount) {
|
|
end();
|
|
}
|
|
}, timeout + 1);
|
|
el.addEventListener(endEvent, onEnd);
|
|
}
|
|
function getTransitionInfo(el, expectedType) {
|
|
const styles = window.getComputedStyle(el);
|
|
// JSDOM may return undefined for transition properties
|
|
const getStyleProperties = (key) => (styles[key] || '').split(', ');
|
|
const transitionDelays = getStyleProperties(TRANSITION + 'Delay');
|
|
const transitionDurations = getStyleProperties(TRANSITION + 'Duration');
|
|
const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
|
|
const animationDelays = getStyleProperties(ANIMATION + 'Delay');
|
|
const animationDurations = getStyleProperties(ANIMATION + 'Duration');
|
|
const animationTimeout = getTimeout(animationDelays, animationDurations);
|
|
let type = null;
|
|
let timeout = 0;
|
|
let propCount = 0;
|
|
/* istanbul ignore if */
|
|
if (expectedType === TRANSITION) {
|
|
if (transitionTimeout > 0) {
|
|
type = TRANSITION;
|
|
timeout = transitionTimeout;
|
|
propCount = transitionDurations.length;
|
|
}
|
|
}
|
|
else if (expectedType === ANIMATION) {
|
|
if (animationTimeout > 0) {
|
|
type = ANIMATION;
|
|
timeout = animationTimeout;
|
|
propCount = animationDurations.length;
|
|
}
|
|
}
|
|
else {
|
|
timeout = Math.max(transitionTimeout, animationTimeout);
|
|
type =
|
|
timeout > 0
|
|
? transitionTimeout > animationTimeout
|
|
? TRANSITION
|
|
: ANIMATION
|
|
: null;
|
|
propCount = type
|
|
? type === TRANSITION
|
|
? transitionDurations.length
|
|
: animationDurations.length
|
|
: 0;
|
|
}
|
|
const hasTransform = type === TRANSITION &&
|
|
/\b(transform|all)(,|$)/.test(styles[TRANSITION + 'Property']);
|
|
return {
|
|
type,
|
|
timeout,
|
|
propCount,
|
|
hasTransform
|
|
};
|
|
}
|
|
function getTimeout(delays, durations) {
|
|
while (delays.length < durations.length) {
|
|
delays = delays.concat(delays);
|
|
}
|
|
return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
|
|
}
|
|
// Old versions of Chromium (below 61.0.3163.100) formats floating pointer
|
|
// numbers in a locale-dependent way, using a comma instead of a dot.
|
|
// If comma is not replaced with a dot, the input will be rounded down
|
|
// (i.e. acting as a floor function) causing unexpected behaviors
|
|
function toMs(s) {
|
|
return Number(s.slice(0, -1).replace(',', '.')) * 1000;
|
|
}
|
|
// synchronously force layout to put elements into a certain state
|
|
function forceReflow() {
|
|
return document.body.offsetHeight;
|
|
}
|
|
|
|
const positionMap = new WeakMap();
|
|
const newPositionMap = new WeakMap();
|
|
const TransitionGroupImpl = {
|
|
name: 'TransitionGroup',
|
|
props: /*#__PURE__*/ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, TransitionPropsValidators, {
|
|
tag: String,
|
|
moveClass: String
|
|
}),
|
|
setup(props, { slots }) {
|
|
const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)();
|
|
const state = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState)();
|
|
let prevChildren;
|
|
let children;
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated)(() => {
|
|
// children is guaranteed to exist after initial render
|
|
if (!prevChildren.length) {
|
|
return;
|
|
}
|
|
const moveClass = props.moveClass || `${props.name || 'v'}-move`;
|
|
if (!hasCSSTransform(prevChildren[0].el, instance.vnode.el, moveClass)) {
|
|
return;
|
|
}
|
|
// we divide the work into three loops to avoid mixing DOM reads and writes
|
|
// in each iteration - which helps prevent layout thrashing.
|
|
prevChildren.forEach(callPendingCbs);
|
|
prevChildren.forEach(recordPosition);
|
|
const movedChildren = prevChildren.filter(applyTranslation);
|
|
// force reflow to put everything in position
|
|
forceReflow();
|
|
movedChildren.forEach(c => {
|
|
const el = c.el;
|
|
const style = el.style;
|
|
addTransitionClass(el, moveClass);
|
|
style.transform = style.webkitTransform = style.transitionDuration = '';
|
|
const cb = (el._moveCb = (e) => {
|
|
if (e && e.target !== el) {
|
|
return;
|
|
}
|
|
if (!e || /transform$/.test(e.propertyName)) {
|
|
el.removeEventListener('transitionend', cb);
|
|
el._moveCb = null;
|
|
removeTransitionClass(el, moveClass);
|
|
}
|
|
});
|
|
el.addEventListener('transitionend', cb);
|
|
});
|
|
});
|
|
return () => {
|
|
const rawProps = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__.toRaw)(props);
|
|
const cssTransitionProps = resolveTransitionProps(rawProps);
|
|
const tag = rawProps.tag || _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment;
|
|
prevChildren = children;
|
|
children = slots.default ? (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren)(slots.default()) : [];
|
|
for (let i = 0; i < children.length; i++) {
|
|
const child = children[i];
|
|
if (child.key != null) {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)(child, (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(child, cssTransitionProps, state, instance));
|
|
}
|
|
else if ((true)) {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<TransitionGroup> children must be keyed.`);
|
|
}
|
|
}
|
|
if (prevChildren) {
|
|
for (let i = 0; i < prevChildren.length; i++) {
|
|
const child = prevChildren[i];
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)(child, (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(child, cssTransitionProps, state, instance));
|
|
positionMap.set(child, child.el.getBoundingClientRect());
|
|
}
|
|
}
|
|
return (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(tag, null, children);
|
|
};
|
|
}
|
|
};
|
|
const TransitionGroup = TransitionGroupImpl;
|
|
function callPendingCbs(c) {
|
|
const el = c.el;
|
|
if (el._moveCb) {
|
|
el._moveCb();
|
|
}
|
|
if (el._enterCb) {
|
|
el._enterCb();
|
|
}
|
|
}
|
|
function recordPosition(c) {
|
|
newPositionMap.set(c, c.el.getBoundingClientRect());
|
|
}
|
|
function applyTranslation(c) {
|
|
const oldPos = positionMap.get(c);
|
|
const newPos = newPositionMap.get(c);
|
|
const dx = oldPos.left - newPos.left;
|
|
const dy = oldPos.top - newPos.top;
|
|
if (dx || dy) {
|
|
const s = c.el.style;
|
|
s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;
|
|
s.transitionDuration = '0s';
|
|
return c;
|
|
}
|
|
}
|
|
function hasCSSTransform(el, root, moveClass) {
|
|
// Detect whether an element with the move class applied has
|
|
// CSS transitions. Since the element may be inside an entering
|
|
// transition at this very moment, we make a clone of it and remove
|
|
// all other transition classes applied to ensure only the move class
|
|
// is applied.
|
|
const clone = el.cloneNode();
|
|
if (el._vtc) {
|
|
el._vtc.forEach(cls => {
|
|
cls.split(/\s+/).forEach(c => c && clone.classList.remove(c));
|
|
});
|
|
}
|
|
moveClass.split(/\s+/).forEach(c => c && clone.classList.add(c));
|
|
clone.style.display = 'none';
|
|
const container = (root.nodeType === 1
|
|
? root
|
|
: root.parentNode);
|
|
container.appendChild(clone);
|
|
const { hasTransform } = getTransitionInfo(clone);
|
|
container.removeChild(clone);
|
|
return hasTransform;
|
|
}
|
|
|
|
const getModelAssigner = (vnode) => {
|
|
const fn = vnode.props['onUpdate:modelValue'];
|
|
return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn) ? value => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(fn, value) : fn;
|
|
};
|
|
function onCompositionStart(e) {
|
|
e.target.composing = true;
|
|
}
|
|
function onCompositionEnd(e) {
|
|
const target = e.target;
|
|
if (target.composing) {
|
|
target.composing = false;
|
|
trigger(target, 'input');
|
|
}
|
|
}
|
|
function trigger(el, type) {
|
|
const e = document.createEvent('HTMLEvents');
|
|
e.initEvent(type, true, true);
|
|
el.dispatchEvent(e);
|
|
}
|
|
// We are exporting the v-model runtime directly as vnode hooks so that it can
|
|
// be tree-shaken in case v-model is never used.
|
|
const vModelText = {
|
|
created(el, { modifiers: { lazy, trim, number } }, vnode) {
|
|
el._assign = getModelAssigner(vnode);
|
|
const castToNumber = number || el.type === 'number';
|
|
addEventListener(el, lazy ? 'change' : 'input', e => {
|
|
if (e.target.composing)
|
|
return;
|
|
let domValue = el.value;
|
|
if (trim) {
|
|
domValue = domValue.trim();
|
|
}
|
|
else if (castToNumber) {
|
|
domValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(domValue);
|
|
}
|
|
el._assign(domValue);
|
|
});
|
|
if (trim) {
|
|
addEventListener(el, 'change', () => {
|
|
el.value = el.value.trim();
|
|
});
|
|
}
|
|
if (!lazy) {
|
|
addEventListener(el, 'compositionstart', onCompositionStart);
|
|
addEventListener(el, 'compositionend', onCompositionEnd);
|
|
// Safari < 10.2 & UIWebView doesn't fire compositionend when
|
|
// switching focus before confirming composition choice
|
|
// this also fixes the issue where some browsers e.g. iOS Chrome
|
|
// fires "change" instead of "input" on autocomplete.
|
|
addEventListener(el, 'change', onCompositionEnd);
|
|
}
|
|
},
|
|
// set value on mounted so it's after min/max for type="range"
|
|
mounted(el, { value }) {
|
|
el.value = value == null ? '' : value;
|
|
},
|
|
beforeUpdate(el, { value, modifiers: { trim, number } }, vnode) {
|
|
el._assign = getModelAssigner(vnode);
|
|
// avoid clearing unresolved text. #2302
|
|
if (el.composing)
|
|
return;
|
|
if (document.activeElement === el) {
|
|
if (trim && el.value.trim() === value) {
|
|
return;
|
|
}
|
|
if ((number || el.type === 'number') && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(el.value) === value) {
|
|
return;
|
|
}
|
|
}
|
|
const newValue = value == null ? '' : value;
|
|
if (el.value !== newValue) {
|
|
el.value = newValue;
|
|
}
|
|
}
|
|
};
|
|
const vModelCheckbox = {
|
|
created(el, _, vnode) {
|
|
el._assign = getModelAssigner(vnode);
|
|
addEventListener(el, 'change', () => {
|
|
const modelValue = el._modelValue;
|
|
const elementValue = getValue(el);
|
|
const checked = el.checked;
|
|
const assign = el._assign;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(modelValue)) {
|
|
const index = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(modelValue, elementValue);
|
|
const found = index !== -1;
|
|
if (checked && !found) {
|
|
assign(modelValue.concat(elementValue));
|
|
}
|
|
else if (!checked && found) {
|
|
const filtered = [...modelValue];
|
|
filtered.splice(index, 1);
|
|
assign(filtered);
|
|
}
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(modelValue)) {
|
|
const cloned = new Set(modelValue);
|
|
if (checked) {
|
|
cloned.add(elementValue);
|
|
}
|
|
else {
|
|
cloned.delete(elementValue);
|
|
}
|
|
assign(cloned);
|
|
}
|
|
else {
|
|
assign(getCheckboxValue(el, checked));
|
|
}
|
|
});
|
|
},
|
|
// set initial checked on mount to wait for true-value/false-value
|
|
mounted: setChecked,
|
|
beforeUpdate(el, binding, vnode) {
|
|
el._assign = getModelAssigner(vnode);
|
|
setChecked(el, binding, vnode);
|
|
}
|
|
};
|
|
function setChecked(el, { value, oldValue }, vnode) {
|
|
el._modelValue = value;
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
|
|
el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1;
|
|
}
|
|
else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {
|
|
el.checked = value.has(vnode.props.value);
|
|
}
|
|
else if (value !== oldValue) {
|
|
el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, getCheckboxValue(el, true));
|
|
}
|
|
}
|
|
const vModelRadio = {
|
|
created(el, { value }, vnode) {
|
|
el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value);
|
|
el._assign = getModelAssigner(vnode);
|
|
addEventListener(el, 'change', () => {
|
|
el._assign(getValue(el));
|
|
});
|
|
},
|
|
beforeUpdate(el, { value, oldValue }, vnode) {
|
|
el._assign = getModelAssigner(vnode);
|
|
if (value !== oldValue) {
|
|
el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value);
|
|
}
|
|
}
|
|
};
|
|
const vModelSelect = {
|
|
created(el, { value, modifiers: { number } }, vnode) {
|
|
const isSetModel = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value);
|
|
addEventListener(el, 'change', () => {
|
|
const selectedVal = Array.prototype.filter
|
|
.call(el.options, (o) => o.selected)
|
|
.map((o) => number ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(getValue(o)) : getValue(o));
|
|
el._assign(el.multiple
|
|
? isSetModel
|
|
? new Set(selectedVal)
|
|
: selectedVal
|
|
: selectedVal[0]);
|
|
});
|
|
el._assign = getModelAssigner(vnode);
|
|
},
|
|
// set value in mounted & updated because <select> relies on its children
|
|
// <option>s.
|
|
mounted(el, { value }) {
|
|
setSelected(el, value);
|
|
},
|
|
beforeUpdate(el, _binding, vnode) {
|
|
el._assign = getModelAssigner(vnode);
|
|
},
|
|
updated(el, { value }) {
|
|
setSelected(el, value);
|
|
}
|
|
};
|
|
function setSelected(el, value) {
|
|
const isMultiple = el.multiple;
|
|
if (isMultiple && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) {
|
|
( true) &&
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<select multiple v-model> expects an Array or Set value for its binding, ` +
|
|
`but got ${Object.prototype.toString.call(value).slice(8, -1)}.`);
|
|
return;
|
|
}
|
|
for (let i = 0, l = el.options.length; i < l; i++) {
|
|
const option = el.options[i];
|
|
const optionValue = getValue(option);
|
|
if (isMultiple) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
|
|
option.selected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, optionValue) > -1;
|
|
}
|
|
else {
|
|
option.selected = value.has(optionValue);
|
|
}
|
|
}
|
|
else {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(getValue(option), value)) {
|
|
el.selectedIndex = i;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if (!isMultiple) {
|
|
el.selectedIndex = -1;
|
|
}
|
|
}
|
|
// retrieve raw value set via :value bindings
|
|
function getValue(el) {
|
|
return '_value' in el ? el._value : el.value;
|
|
}
|
|
// retrieve raw value for true-value and false-value set via :true-value or :false-value bindings
|
|
function getCheckboxValue(el, checked) {
|
|
const key = checked ? '_trueValue' : '_falseValue';
|
|
return key in el ? el[key] : checked;
|
|
}
|
|
const vModelDynamic = {
|
|
created(el, binding, vnode) {
|
|
callModelHook(el, binding, vnode, null, 'created');
|
|
},
|
|
mounted(el, binding, vnode) {
|
|
callModelHook(el, binding, vnode, null, 'mounted');
|
|
},
|
|
beforeUpdate(el, binding, vnode, prevVNode) {
|
|
callModelHook(el, binding, vnode, prevVNode, 'beforeUpdate');
|
|
},
|
|
updated(el, binding, vnode, prevVNode) {
|
|
callModelHook(el, binding, vnode, prevVNode, 'updated');
|
|
}
|
|
};
|
|
function callModelHook(el, binding, vnode, prevVNode, hook) {
|
|
let modelToUse;
|
|
switch (el.tagName) {
|
|
case 'SELECT':
|
|
modelToUse = vModelSelect;
|
|
break;
|
|
case 'TEXTAREA':
|
|
modelToUse = vModelText;
|
|
break;
|
|
default:
|
|
switch (vnode.props && vnode.props.type) {
|
|
case 'checkbox':
|
|
modelToUse = vModelCheckbox;
|
|
break;
|
|
case 'radio':
|
|
modelToUse = vModelRadio;
|
|
break;
|
|
default:
|
|
modelToUse = vModelText;
|
|
}
|
|
}
|
|
const fn = modelToUse[hook];
|
|
fn && fn(el, binding, vnode, prevVNode);
|
|
}
|
|
|
|
const systemModifiers = ['ctrl', 'shift', 'alt', 'meta'];
|
|
const modifierGuards = {
|
|
stop: e => e.stopPropagation(),
|
|
prevent: e => e.preventDefault(),
|
|
self: e => e.target !== e.currentTarget,
|
|
ctrl: e => !e.ctrlKey,
|
|
shift: e => !e.shiftKey,
|
|
alt: e => !e.altKey,
|
|
meta: e => !e.metaKey,
|
|
left: e => 'button' in e && e.button !== 0,
|
|
middle: e => 'button' in e && e.button !== 1,
|
|
right: e => 'button' in e && e.button !== 2,
|
|
exact: (e, modifiers) => systemModifiers.some(m => e[`${m}Key`] && !modifiers.includes(m))
|
|
};
|
|
/**
|
|
* @private
|
|
*/
|
|
const withModifiers = (fn, modifiers) => {
|
|
return (event, ...args) => {
|
|
for (let i = 0; i < modifiers.length; i++) {
|
|
const guard = modifierGuards[modifiers[i]];
|
|
if (guard && guard(event, modifiers))
|
|
return;
|
|
}
|
|
return fn(event, ...args);
|
|
};
|
|
};
|
|
// Kept for 2.x compat.
|
|
// Note: IE11 compat for `spacebar` and `del` is removed for now.
|
|
const keyNames = {
|
|
esc: 'escape',
|
|
space: ' ',
|
|
up: 'arrow-up',
|
|
left: 'arrow-left',
|
|
right: 'arrow-right',
|
|
down: 'arrow-down',
|
|
delete: 'backspace'
|
|
};
|
|
/**
|
|
* @private
|
|
*/
|
|
const withKeys = (fn, modifiers) => {
|
|
return (event) => {
|
|
if (!('key' in event))
|
|
return;
|
|
const eventKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event.key);
|
|
if (
|
|
// None of the provided key modifiers match the current event key
|
|
!modifiers.some(k => k === eventKey || keyNames[k] === eventKey)) {
|
|
return;
|
|
}
|
|
return fn(event);
|
|
};
|
|
};
|
|
|
|
const vShow = {
|
|
beforeMount(el, { value }, { transition }) {
|
|
el._vod = el.style.display === 'none' ? '' : el.style.display;
|
|
if (transition && value) {
|
|
transition.beforeEnter(el);
|
|
}
|
|
else {
|
|
setDisplay(el, value);
|
|
}
|
|
},
|
|
mounted(el, { value }, { transition }) {
|
|
if (transition && value) {
|
|
transition.enter(el);
|
|
}
|
|
},
|
|
updated(el, { value, oldValue }, { transition }) {
|
|
if (!value === !oldValue)
|
|
return;
|
|
if (transition) {
|
|
if (value) {
|
|
transition.beforeEnter(el);
|
|
setDisplay(el, true);
|
|
transition.enter(el);
|
|
}
|
|
else {
|
|
transition.leave(el, () => {
|
|
setDisplay(el, false);
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
setDisplay(el, value);
|
|
}
|
|
},
|
|
beforeUnmount(el, { value }) {
|
|
setDisplay(el, value);
|
|
}
|
|
};
|
|
function setDisplay(el, value) {
|
|
el.style.display = value ? el._vod : 'none';
|
|
}
|
|
|
|
const rendererOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({ patchProp, forcePatchProp }, nodeOps);
|
|
// lazy create the renderer - this makes core renderer logic tree-shakable
|
|
// in case the user only imports reactivity utilities from Vue.
|
|
let renderer;
|
|
let enabledHydration = false;
|
|
function ensureRenderer() {
|
|
return renderer || (renderer = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer)(rendererOptions));
|
|
}
|
|
function ensureHydrationRenderer() {
|
|
renderer = enabledHydration
|
|
? renderer
|
|
: (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer)(rendererOptions);
|
|
enabledHydration = true;
|
|
return renderer;
|
|
}
|
|
// use explicit type casts here to avoid import() calls in rolled-up d.ts
|
|
const render = ((...args) => {
|
|
ensureRenderer().render(...args);
|
|
});
|
|
const hydrate = ((...args) => {
|
|
ensureHydrationRenderer().hydrate(...args);
|
|
});
|
|
const createApp = ((...args) => {
|
|
const app = ensureRenderer().createApp(...args);
|
|
if ((true)) {
|
|
injectNativeTagCheck(app);
|
|
injectCustomElementCheck(app);
|
|
}
|
|
const { mount } = app;
|
|
app.mount = (containerOrSelector) => {
|
|
const container = normalizeContainer(containerOrSelector);
|
|
if (!container)
|
|
return;
|
|
const component = app._component;
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(component) && !component.render && !component.template) {
|
|
component.template = container.innerHTML;
|
|
}
|
|
// clear content before mounting
|
|
container.innerHTML = '';
|
|
const proxy = mount(container);
|
|
if (container instanceof Element) {
|
|
container.removeAttribute('v-cloak');
|
|
container.setAttribute('data-v-app', '');
|
|
}
|
|
return proxy;
|
|
};
|
|
return app;
|
|
});
|
|
const createSSRApp = ((...args) => {
|
|
const app = ensureHydrationRenderer().createApp(...args);
|
|
if ((true)) {
|
|
injectNativeTagCheck(app);
|
|
injectCustomElementCheck(app);
|
|
}
|
|
const { mount } = app;
|
|
app.mount = (containerOrSelector) => {
|
|
const container = normalizeContainer(containerOrSelector);
|
|
if (container) {
|
|
return mount(container, true);
|
|
}
|
|
};
|
|
return app;
|
|
});
|
|
function injectNativeTagCheck(app) {
|
|
// Inject `isNativeTag`
|
|
// this is used for component name validation (dev only)
|
|
Object.defineProperty(app.config, 'isNativeTag', {
|
|
value: (tag) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag),
|
|
writable: false
|
|
});
|
|
}
|
|
// dev only
|
|
function injectCustomElementCheck(app) {
|
|
if ((0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly)()) {
|
|
const value = app.config.isCustomElement;
|
|
Object.defineProperty(app.config, 'isCustomElement', {
|
|
get() {
|
|
return value;
|
|
},
|
|
set() {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`The \`isCustomElement\` config option is only respected when using the runtime compiler.` +
|
|
`If you are using the runtime-only build, \`isCustomElement\` must be passed to \`@vue/compiler-dom\` in the build setup instead` +
|
|
`- for example, via the \`compilerOptions\` option in vue-loader: https://vue-loader.vuejs.org/options.html#compileroptions.`);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function normalizeContainer(container) {
|
|
if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(container)) {
|
|
const res = document.querySelector(container);
|
|
if (( true) && !res) {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Failed to mount app: mount target selector "${container}" returned null.`);
|
|
}
|
|
return res;
|
|
}
|
|
if (( true) &&
|
|
container instanceof window.ShadowRoot &&
|
|
container.mode === 'closed') {
|
|
(0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs`);
|
|
}
|
|
return container;
|
|
}
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/@vue/shared/dist/shared.esm-bundler.js":
|
|
/*!*************************************************************!*\
|
|
!*** ./node_modules/@vue/shared/dist/shared.esm-bundler.js ***!
|
|
\*************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "EMPTY_ARR": () => (/* binding */ EMPTY_ARR),
|
|
/* harmony export */ "EMPTY_OBJ": () => (/* binding */ EMPTY_OBJ),
|
|
/* harmony export */ "NO": () => (/* binding */ NO),
|
|
/* harmony export */ "NOOP": () => (/* binding */ NOOP),
|
|
/* harmony export */ "PatchFlagNames": () => (/* binding */ PatchFlagNames),
|
|
/* harmony export */ "babelParserDefaultPlugins": () => (/* binding */ babelParserDefaultPlugins),
|
|
/* harmony export */ "camelize": () => (/* binding */ camelize),
|
|
/* harmony export */ "capitalize": () => (/* binding */ capitalize),
|
|
/* harmony export */ "def": () => (/* binding */ def),
|
|
/* harmony export */ "escapeHtml": () => (/* binding */ escapeHtml),
|
|
/* harmony export */ "escapeHtmlComment": () => (/* binding */ escapeHtmlComment),
|
|
/* harmony export */ "extend": () => (/* binding */ extend),
|
|
/* harmony export */ "generateCodeFrame": () => (/* binding */ generateCodeFrame),
|
|
/* harmony export */ "getGlobalThis": () => (/* binding */ getGlobalThis),
|
|
/* harmony export */ "hasChanged": () => (/* binding */ hasChanged),
|
|
/* harmony export */ "hasOwn": () => (/* binding */ hasOwn),
|
|
/* harmony export */ "hyphenate": () => (/* binding */ hyphenate),
|
|
/* harmony export */ "invokeArrayFns": () => (/* binding */ invokeArrayFns),
|
|
/* harmony export */ "isArray": () => (/* binding */ isArray),
|
|
/* harmony export */ "isBooleanAttr": () => (/* binding */ isBooleanAttr),
|
|
/* harmony export */ "isDate": () => (/* binding */ isDate),
|
|
/* harmony export */ "isFunction": () => (/* binding */ isFunction),
|
|
/* harmony export */ "isGloballyWhitelisted": () => (/* binding */ isGloballyWhitelisted),
|
|
/* harmony export */ "isHTMLTag": () => (/* binding */ isHTMLTag),
|
|
/* harmony export */ "isIntegerKey": () => (/* binding */ isIntegerKey),
|
|
/* harmony export */ "isKnownAttr": () => (/* binding */ isKnownAttr),
|
|
/* harmony export */ "isMap": () => (/* binding */ isMap),
|
|
/* harmony export */ "isModelListener": () => (/* binding */ isModelListener),
|
|
/* harmony export */ "isNoUnitNumericStyleProp": () => (/* binding */ isNoUnitNumericStyleProp),
|
|
/* harmony export */ "isObject": () => (/* binding */ isObject),
|
|
/* harmony export */ "isOn": () => (/* binding */ isOn),
|
|
/* harmony export */ "isPlainObject": () => (/* binding */ isPlainObject),
|
|
/* harmony export */ "isPromise": () => (/* binding */ isPromise),
|
|
/* harmony export */ "isReservedProp": () => (/* binding */ isReservedProp),
|
|
/* harmony export */ "isSSRSafeAttrName": () => (/* binding */ isSSRSafeAttrName),
|
|
/* harmony export */ "isSVGTag": () => (/* binding */ isSVGTag),
|
|
/* harmony export */ "isSet": () => (/* binding */ isSet),
|
|
/* harmony export */ "isSpecialBooleanAttr": () => (/* binding */ isSpecialBooleanAttr),
|
|
/* harmony export */ "isString": () => (/* binding */ isString),
|
|
/* harmony export */ "isSymbol": () => (/* binding */ isSymbol),
|
|
/* harmony export */ "isVoidTag": () => (/* binding */ isVoidTag),
|
|
/* harmony export */ "looseEqual": () => (/* binding */ looseEqual),
|
|
/* harmony export */ "looseIndexOf": () => (/* binding */ looseIndexOf),
|
|
/* harmony export */ "makeMap": () => (/* binding */ makeMap),
|
|
/* harmony export */ "normalizeClass": () => (/* binding */ normalizeClass),
|
|
/* harmony export */ "normalizeStyle": () => (/* binding */ normalizeStyle),
|
|
/* harmony export */ "objectToString": () => (/* binding */ objectToString),
|
|
/* harmony export */ "parseStringStyle": () => (/* binding */ parseStringStyle),
|
|
/* harmony export */ "propsToAttrMap": () => (/* binding */ propsToAttrMap),
|
|
/* harmony export */ "remove": () => (/* binding */ remove),
|
|
/* harmony export */ "slotFlagsText": () => (/* binding */ slotFlagsText),
|
|
/* harmony export */ "stringifyStyle": () => (/* binding */ stringifyStyle),
|
|
/* harmony export */ "toDisplayString": () => (/* binding */ toDisplayString),
|
|
/* harmony export */ "toHandlerKey": () => (/* binding */ toHandlerKey),
|
|
/* harmony export */ "toNumber": () => (/* binding */ toNumber),
|
|
/* harmony export */ "toRawType": () => (/* binding */ toRawType),
|
|
/* harmony export */ "toTypeString": () => (/* binding */ toTypeString)
|
|
/* harmony export */ });
|
|
/**
|
|
* Make a map and return a function for checking if a key
|
|
* is in that map.
|
|
* IMPORTANT: all calls of this function must be prefixed with
|
|
* \/\*#\_\_PURE\_\_\*\/
|
|
* So that rollup can tree-shake them if necessary.
|
|
*/
|
|
function makeMap(str, expectsLowerCase) {
|
|
const map = Object.create(null);
|
|
const list = str.split(',');
|
|
for (let i = 0; i < list.length; i++) {
|
|
map[list[i]] = true;
|
|
}
|
|
return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];
|
|
}
|
|
|
|
/**
|
|
* dev only flag -> name mapping
|
|
*/
|
|
const PatchFlagNames = {
|
|
[1 /* TEXT */]: `TEXT`,
|
|
[2 /* CLASS */]: `CLASS`,
|
|
[4 /* STYLE */]: `STYLE`,
|
|
[8 /* PROPS */]: `PROPS`,
|
|
[16 /* FULL_PROPS */]: `FULL_PROPS`,
|
|
[32 /* HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,
|
|
[64 /* STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,
|
|
[128 /* KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,
|
|
[256 /* UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,
|
|
[512 /* NEED_PATCH */]: `NEED_PATCH`,
|
|
[1024 /* DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,
|
|
[2048 /* DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,
|
|
[-1 /* HOISTED */]: `HOISTED`,
|
|
[-2 /* BAIL */]: `BAIL`
|
|
};
|
|
|
|
/**
|
|
* Dev only
|
|
*/
|
|
const slotFlagsText = {
|
|
[1 /* STABLE */]: 'STABLE',
|
|
[2 /* DYNAMIC */]: 'DYNAMIC',
|
|
[3 /* FORWARDED */]: 'FORWARDED'
|
|
};
|
|
|
|
const GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +
|
|
'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +
|
|
'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';
|
|
const isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);
|
|
|
|
const range = 2;
|
|
function generateCodeFrame(source, start = 0, end = source.length) {
|
|
const lines = source.split(/\r?\n/);
|
|
let count = 0;
|
|
const res = [];
|
|
for (let i = 0; i < lines.length; i++) {
|
|
count += lines[i].length + 1;
|
|
if (count >= start) {
|
|
for (let j = i - range; j <= i + range || end > count; j++) {
|
|
if (j < 0 || j >= lines.length)
|
|
continue;
|
|
const line = j + 1;
|
|
res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);
|
|
const lineLength = lines[j].length;
|
|
if (j === i) {
|
|
// push underline
|
|
const pad = start - (count - lineLength) + 1;
|
|
const length = Math.max(1, end > count ? lineLength - pad : end - start);
|
|
res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));
|
|
}
|
|
else if (j > i) {
|
|
if (end > count) {
|
|
const length = Math.max(Math.min(end - count, lineLength), 1);
|
|
res.push(` | ` + '^'.repeat(length));
|
|
}
|
|
count += lineLength + 1;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return res.join('\n');
|
|
}
|
|
|
|
/**
|
|
* On the client we only need to offer special cases for boolean attributes that
|
|
* have different names from their corresponding dom properties:
|
|
* - itemscope -> N/A
|
|
* - allowfullscreen -> allowFullscreen
|
|
* - formnovalidate -> formNoValidate
|
|
* - ismap -> isMap
|
|
* - nomodule -> noModule
|
|
* - novalidate -> noValidate
|
|
* - readonly -> readOnly
|
|
*/
|
|
const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
|
|
const isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);
|
|
/**
|
|
* The full list is needed during SSR to produce the correct initial markup.
|
|
*/
|
|
const isBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs +
|
|
`,async,autofocus,autoplay,controls,default,defer,disabled,hidden,` +
|
|
`loop,open,required,reversed,scoped,seamless,` +
|
|
`checked,muted,multiple,selected`);
|
|
const unsafeAttrCharRE = /[>/="'\u0009\u000a\u000c\u0020]/;
|
|
const attrValidationCache = {};
|
|
function isSSRSafeAttrName(name) {
|
|
if (attrValidationCache.hasOwnProperty(name)) {
|
|
return attrValidationCache[name];
|
|
}
|
|
const isUnsafe = unsafeAttrCharRE.test(name);
|
|
if (isUnsafe) {
|
|
console.error(`unsafe attribute name: ${name}`);
|
|
}
|
|
return (attrValidationCache[name] = !isUnsafe);
|
|
}
|
|
const propsToAttrMap = {
|
|
acceptCharset: 'accept-charset',
|
|
className: 'class',
|
|
htmlFor: 'for',
|
|
httpEquiv: 'http-equiv'
|
|
};
|
|
/**
|
|
* CSS properties that accept plain numbers
|
|
*/
|
|
const isNoUnitNumericStyleProp = /*#__PURE__*/ makeMap(`animation-iteration-count,border-image-outset,border-image-slice,` +
|
|
`border-image-width,box-flex,box-flex-group,box-ordinal-group,column-count,` +
|
|
`columns,flex,flex-grow,flex-positive,flex-shrink,flex-negative,flex-order,` +
|
|
`grid-row,grid-row-end,grid-row-span,grid-row-start,grid-column,` +
|
|
`grid-column-end,grid-column-span,grid-column-start,font-weight,line-clamp,` +
|
|
`line-height,opacity,order,orphans,tab-size,widows,z-index,zoom,` +
|
|
// SVG
|
|
`fill-opacity,flood-opacity,stop-opacity,stroke-dasharray,stroke-dashoffset,` +
|
|
`stroke-miterlimit,stroke-opacity,stroke-width`);
|
|
/**
|
|
* Known attributes, this is used for stringification of runtime static nodes
|
|
* so that we don't stringify bindings that cannot be set from HTML.
|
|
* Don't also forget to allow `data-*` and `aria-*`!
|
|
* Generated from https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes
|
|
*/
|
|
const isKnownAttr = /*#__PURE__*/ makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,` +
|
|
`autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,` +
|
|
`border,buffered,capture,challenge,charset,checked,cite,class,code,` +
|
|
`codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,` +
|
|
`coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,` +
|
|
`disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,` +
|
|
`formaction,formenctype,formmethod,formnovalidate,formtarget,headers,` +
|
|
`height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,` +
|
|
`ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,` +
|
|
`manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,` +
|
|
`open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,` +
|
|
`referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,` +
|
|
`selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,` +
|
|
`start,step,style,summary,tabindex,target,title,translate,type,usemap,` +
|
|
`value,width,wrap`);
|
|
|
|
function normalizeStyle(value) {
|
|
if (isArray(value)) {
|
|
const res = {};
|
|
for (let i = 0; i < value.length; i++) {
|
|
const item = value[i];
|
|
const normalized = normalizeStyle(isString(item) ? parseStringStyle(item) : item);
|
|
if (normalized) {
|
|
for (const key in normalized) {
|
|
res[key] = normalized[key];
|
|
}
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
else if (isObject(value)) {
|
|
return value;
|
|
}
|
|
}
|
|
const listDelimiterRE = /;(?![^(]*\))/g;
|
|
const propertyDelimiterRE = /:(.+)/;
|
|
function parseStringStyle(cssText) {
|
|
const ret = {};
|
|
cssText.split(listDelimiterRE).forEach(item => {
|
|
if (item) {
|
|
const tmp = item.split(propertyDelimiterRE);
|
|
tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
|
|
}
|
|
});
|
|
return ret;
|
|
}
|
|
function stringifyStyle(styles) {
|
|
let ret = '';
|
|
if (!styles) {
|
|
return ret;
|
|
}
|
|
for (const key in styles) {
|
|
const value = styles[key];
|
|
const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);
|
|
if (isString(value) ||
|
|
(typeof value === 'number' && isNoUnitNumericStyleProp(normalizedKey))) {
|
|
// only render valid values
|
|
ret += `${normalizedKey}:${value};`;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
function normalizeClass(value) {
|
|
let res = '';
|
|
if (isString(value)) {
|
|
res = value;
|
|
}
|
|
else if (isArray(value)) {
|
|
for (let i = 0; i < value.length; i++) {
|
|
const normalized = normalizeClass(value[i]);
|
|
if (normalized) {
|
|
res += normalized + ' ';
|
|
}
|
|
}
|
|
}
|
|
else if (isObject(value)) {
|
|
for (const name in value) {
|
|
if (value[name]) {
|
|
res += name + ' ';
|
|
}
|
|
}
|
|
}
|
|
return res.trim();
|
|
}
|
|
|
|
// These tag configs are shared between compiler-dom and runtime-dom, so they
|
|
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element
|
|
const HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +
|
|
'header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,' +
|
|
'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +
|
|
'data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,' +
|
|
'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +
|
|
'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +
|
|
'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +
|
|
'option,output,progress,select,textarea,details,dialog,menu,' +
|
|
'summary,template,blockquote,iframe,tfoot';
|
|
// https://developer.mozilla.org/en-US/docs/Web/SVG/Element
|
|
const SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +
|
|
'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +
|
|
'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +
|
|
'feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +
|
|
'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +
|
|
'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +
|
|
'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +
|
|
'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +
|
|
'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +
|
|
'text,textPath,title,tspan,unknown,use,view';
|
|
const VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';
|
|
const isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);
|
|
const isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);
|
|
const isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);
|
|
|
|
const escapeRE = /["'&<>]/;
|
|
function escapeHtml(string) {
|
|
const str = '' + string;
|
|
const match = escapeRE.exec(str);
|
|
if (!match) {
|
|
return str;
|
|
}
|
|
let html = '';
|
|
let escaped;
|
|
let index;
|
|
let lastIndex = 0;
|
|
for (index = match.index; index < str.length; index++) {
|
|
switch (str.charCodeAt(index)) {
|
|
case 34: // "
|
|
escaped = '"';
|
|
break;
|
|
case 38: // &
|
|
escaped = '&';
|
|
break;
|
|
case 39: // '
|
|
escaped = ''';
|
|
break;
|
|
case 60: // <
|
|
escaped = '<';
|
|
break;
|
|
case 62: // >
|
|
escaped = '>';
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
if (lastIndex !== index) {
|
|
html += str.substring(lastIndex, index);
|
|
}
|
|
lastIndex = index + 1;
|
|
html += escaped;
|
|
}
|
|
return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
|
|
}
|
|
// https://www.w3.org/TR/html52/syntax.html#comments
|
|
const commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;
|
|
function escapeHtmlComment(src) {
|
|
return src.replace(commentStripRE, '');
|
|
}
|
|
|
|
function looseCompareArrays(a, b) {
|
|
if (a.length !== b.length)
|
|
return false;
|
|
let equal = true;
|
|
for (let i = 0; equal && i < a.length; i++) {
|
|
equal = looseEqual(a[i], b[i]);
|
|
}
|
|
return equal;
|
|
}
|
|
function looseEqual(a, b) {
|
|
if (a === b)
|
|
return true;
|
|
let aValidType = isDate(a);
|
|
let bValidType = isDate(b);
|
|
if (aValidType || bValidType) {
|
|
return aValidType && bValidType ? a.getTime() === b.getTime() : false;
|
|
}
|
|
aValidType = isArray(a);
|
|
bValidType = isArray(b);
|
|
if (aValidType || bValidType) {
|
|
return aValidType && bValidType ? looseCompareArrays(a, b) : false;
|
|
}
|
|
aValidType = isObject(a);
|
|
bValidType = isObject(b);
|
|
if (aValidType || bValidType) {
|
|
/* istanbul ignore if: this if will probably never be called */
|
|
if (!aValidType || !bValidType) {
|
|
return false;
|
|
}
|
|
const aKeysCount = Object.keys(a).length;
|
|
const bKeysCount = Object.keys(b).length;
|
|
if (aKeysCount !== bKeysCount) {
|
|
return false;
|
|
}
|
|
for (const key in a) {
|
|
const aHasKey = a.hasOwnProperty(key);
|
|
const bHasKey = b.hasOwnProperty(key);
|
|
if ((aHasKey && !bHasKey) ||
|
|
(!aHasKey && bHasKey) ||
|
|
!looseEqual(a[key], b[key])) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return String(a) === String(b);
|
|
}
|
|
function looseIndexOf(arr, val) {
|
|
return arr.findIndex(item => looseEqual(item, val));
|
|
}
|
|
|
|
/**
|
|
* For converting {{ interpolation }} values to displayed strings.
|
|
* @private
|
|
*/
|
|
const toDisplayString = (val) => {
|
|
return val == null
|
|
? ''
|
|
: isObject(val)
|
|
? JSON.stringify(val, replacer, 2)
|
|
: String(val);
|
|
};
|
|
const replacer = (_key, val) => {
|
|
if (isMap(val)) {
|
|
return {
|
|
[`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => {
|
|
entries[`${key} =>`] = val;
|
|
return entries;
|
|
}, {})
|
|
};
|
|
}
|
|
else if (isSet(val)) {
|
|
return {
|
|
[`Set(${val.size})`]: [...val.values()]
|
|
};
|
|
}
|
|
else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {
|
|
return String(val);
|
|
}
|
|
return val;
|
|
};
|
|
|
|
/**
|
|
* List of @babel/parser plugins that are used for template expression
|
|
* transforms and SFC script transforms. By default we enable proposals slated
|
|
* for ES2020. This will need to be updated as the spec moves forward.
|
|
* Full list at https://babeljs.io/docs/en/next/babel-parser#plugins
|
|
*/
|
|
const babelParserDefaultPlugins = [
|
|
'bigInt',
|
|
'optionalChaining',
|
|
'nullishCoalescingOperator'
|
|
];
|
|
const EMPTY_OBJ = ( true)
|
|
? Object.freeze({})
|
|
: 0;
|
|
const EMPTY_ARR = ( true) ? Object.freeze([]) : 0;
|
|
const NOOP = () => { };
|
|
/**
|
|
* Always return false.
|
|
*/
|
|
const NO = () => false;
|
|
const onRE = /^on[^a-z]/;
|
|
const isOn = (key) => onRE.test(key);
|
|
const isModelListener = (key) => key.startsWith('onUpdate:');
|
|
const extend = Object.assign;
|
|
const remove = (arr, el) => {
|
|
const i = arr.indexOf(el);
|
|
if (i > -1) {
|
|
arr.splice(i, 1);
|
|
}
|
|
};
|
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
const hasOwn = (val, key) => hasOwnProperty.call(val, key);
|
|
const isArray = Array.isArray;
|
|
const isMap = (val) => toTypeString(val) === '[object Map]';
|
|
const isSet = (val) => toTypeString(val) === '[object Set]';
|
|
const isDate = (val) => val instanceof Date;
|
|
const isFunction = (val) => typeof val === 'function';
|
|
const isString = (val) => typeof val === 'string';
|
|
const isSymbol = (val) => typeof val === 'symbol';
|
|
const isObject = (val) => val !== null && typeof val === 'object';
|
|
const isPromise = (val) => {
|
|
return isObject(val) && isFunction(val.then) && isFunction(val.catch);
|
|
};
|
|
const objectToString = Object.prototype.toString;
|
|
const toTypeString = (value) => objectToString.call(value);
|
|
const toRawType = (value) => {
|
|
// extract "RawType" from strings like "[object RawType]"
|
|
return toTypeString(value).slice(8, -1);
|
|
};
|
|
const isPlainObject = (val) => toTypeString(val) === '[object Object]';
|
|
const isIntegerKey = (key) => isString(key) &&
|
|
key !== 'NaN' &&
|
|
key[0] !== '-' &&
|
|
'' + parseInt(key, 10) === key;
|
|
const isReservedProp = /*#__PURE__*/ makeMap(
|
|
// the leading comma is intentional so empty string "" is also included
|
|
',key,ref,' +
|
|
'onVnodeBeforeMount,onVnodeMounted,' +
|
|
'onVnodeBeforeUpdate,onVnodeUpdated,' +
|
|
'onVnodeBeforeUnmount,onVnodeUnmounted');
|
|
const cacheStringFunction = (fn) => {
|
|
const cache = Object.create(null);
|
|
return ((str) => {
|
|
const hit = cache[str];
|
|
return hit || (cache[str] = fn(str));
|
|
});
|
|
};
|
|
const camelizeRE = /-(\w)/g;
|
|
/**
|
|
* @private
|
|
*/
|
|
const camelize = cacheStringFunction((str) => {
|
|
return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
|
|
});
|
|
const hyphenateRE = /\B([A-Z])/g;
|
|
/**
|
|
* @private
|
|
*/
|
|
const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());
|
|
/**
|
|
* @private
|
|
*/
|
|
const capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));
|
|
/**
|
|
* @private
|
|
*/
|
|
const toHandlerKey = cacheStringFunction((str) => (str ? `on${capitalize(str)}` : ``));
|
|
// compare whether a value has changed, accounting for NaN.
|
|
const hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);
|
|
const invokeArrayFns = (fns, arg) => {
|
|
for (let i = 0; i < fns.length; i++) {
|
|
fns[i](arg);
|
|
}
|
|
};
|
|
const def = (obj, key, value) => {
|
|
Object.defineProperty(obj, key, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value
|
|
});
|
|
};
|
|
const toNumber = (val) => {
|
|
const n = parseFloat(val);
|
|
return isNaN(n) ? val : n;
|
|
};
|
|
let _globalThis;
|
|
const getGlobalThis = () => {
|
|
return (_globalThis ||
|
|
(_globalThis =
|
|
typeof globalThis !== 'undefined'
|
|
? globalThis
|
|
: typeof self !== 'undefined'
|
|
? self
|
|
: typeof window !== 'undefined'
|
|
? window
|
|
: typeof __webpack_require__.g !== 'undefined'
|
|
? __webpack_require__.g
|
|
: {}));
|
|
};
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/index.js":
|
|
/*!*************************************!*\
|
|
!*** ./node_modules/axios/index.js ***!
|
|
\*************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
module.exports = __webpack_require__(/*! ./lib/axios */ "./node_modules/axios/lib/axios.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/adapters/xhr.js":
|
|
/*!************************************************!*\
|
|
!*** ./node_modules/axios/lib/adapters/xhr.js ***!
|
|
\************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
var settle = __webpack_require__(/*! ./../core/settle */ "./node_modules/axios/lib/core/settle.js");
|
|
var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./node_modules/axios/lib/helpers/cookies.js");
|
|
var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js");
|
|
var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js");
|
|
var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./node_modules/axios/lib/helpers/parseHeaders.js");
|
|
var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./node_modules/axios/lib/helpers/isURLSameOrigin.js");
|
|
var createError = __webpack_require__(/*! ../core/createError */ "./node_modules/axios/lib/core/createError.js");
|
|
|
|
module.exports = function xhrAdapter(config) {
|
|
return new Promise(function dispatchXhrRequest(resolve, reject) {
|
|
var requestData = config.data;
|
|
var requestHeaders = config.headers;
|
|
|
|
if (utils.isFormData(requestData)) {
|
|
delete requestHeaders['Content-Type']; // Let the browser set it
|
|
}
|
|
|
|
var request = new XMLHttpRequest();
|
|
|
|
// HTTP basic authentication
|
|
if (config.auth) {
|
|
var username = config.auth.username || '';
|
|
var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
|
|
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
|
|
}
|
|
|
|
var fullPath = buildFullPath(config.baseURL, config.url);
|
|
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
|
|
|
|
// Set the request timeout in MS
|
|
request.timeout = config.timeout;
|
|
|
|
// Listen for ready state
|
|
request.onreadystatechange = function handleLoad() {
|
|
if (!request || request.readyState !== 4) {
|
|
return;
|
|
}
|
|
|
|
// The request errored out and we didn't get a response, this will be
|
|
// handled by onerror instead
|
|
// With one exception: request that using file: protocol, most browsers
|
|
// will return status as 0 even though it's a successful request
|
|
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
|
|
return;
|
|
}
|
|
|
|
// Prepare the response
|
|
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
|
|
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
|
|
var response = {
|
|
data: responseData,
|
|
status: request.status,
|
|
statusText: request.statusText,
|
|
headers: responseHeaders,
|
|
config: config,
|
|
request: request
|
|
};
|
|
|
|
settle(resolve, reject, response);
|
|
|
|
// Clean up request
|
|
request = null;
|
|
};
|
|
|
|
// Handle browser request cancellation (as opposed to a manual cancellation)
|
|
request.onabort = function handleAbort() {
|
|
if (!request) {
|
|
return;
|
|
}
|
|
|
|
reject(createError('Request aborted', config, 'ECONNABORTED', request));
|
|
|
|
// Clean up request
|
|
request = null;
|
|
};
|
|
|
|
// Handle low level network errors
|
|
request.onerror = function handleError() {
|
|
// Real errors are hidden from us by the browser
|
|
// onerror should only fire if it's a network error
|
|
reject(createError('Network Error', config, null, request));
|
|
|
|
// Clean up request
|
|
request = null;
|
|
};
|
|
|
|
// Handle timeout
|
|
request.ontimeout = function handleTimeout() {
|
|
var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';
|
|
if (config.timeoutErrorMessage) {
|
|
timeoutErrorMessage = config.timeoutErrorMessage;
|
|
}
|
|
reject(createError(timeoutErrorMessage, config, 'ECONNABORTED',
|
|
request));
|
|
|
|
// Clean up request
|
|
request = null;
|
|
};
|
|
|
|
// Add xsrf header
|
|
// This is only done if running in a standard browser environment.
|
|
// Specifically not if we're in a web worker, or react-native.
|
|
if (utils.isStandardBrowserEnv()) {
|
|
// Add xsrf header
|
|
var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
|
|
cookies.read(config.xsrfCookieName) :
|
|
undefined;
|
|
|
|
if (xsrfValue) {
|
|
requestHeaders[config.xsrfHeaderName] = xsrfValue;
|
|
}
|
|
}
|
|
|
|
// Add headers to the request
|
|
if ('setRequestHeader' in request) {
|
|
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
|
|
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
|
|
// Remove Content-Type if data is undefined
|
|
delete requestHeaders[key];
|
|
} else {
|
|
// Otherwise add header to the request
|
|
request.setRequestHeader(key, val);
|
|
}
|
|
});
|
|
}
|
|
|
|
// Add withCredentials to request if needed
|
|
if (!utils.isUndefined(config.withCredentials)) {
|
|
request.withCredentials = !!config.withCredentials;
|
|
}
|
|
|
|
// Add responseType to request if needed
|
|
if (config.responseType) {
|
|
try {
|
|
request.responseType = config.responseType;
|
|
} catch (e) {
|
|
// Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
|
|
// But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
|
|
if (config.responseType !== 'json') {
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handle progress if needed
|
|
if (typeof config.onDownloadProgress === 'function') {
|
|
request.addEventListener('progress', config.onDownloadProgress);
|
|
}
|
|
|
|
// Not all browsers support upload events
|
|
if (typeof config.onUploadProgress === 'function' && request.upload) {
|
|
request.upload.addEventListener('progress', config.onUploadProgress);
|
|
}
|
|
|
|
if (config.cancelToken) {
|
|
// Handle cancellation
|
|
config.cancelToken.promise.then(function onCanceled(cancel) {
|
|
if (!request) {
|
|
return;
|
|
}
|
|
|
|
request.abort();
|
|
reject(cancel);
|
|
// Clean up request
|
|
request = null;
|
|
});
|
|
}
|
|
|
|
if (!requestData) {
|
|
requestData = null;
|
|
}
|
|
|
|
// Send the request
|
|
request.send(requestData);
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/axios.js":
|
|
/*!*****************************************!*\
|
|
!*** ./node_modules/axios/lib/axios.js ***!
|
|
\*****************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js");
|
|
var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js");
|
|
var Axios = __webpack_require__(/*! ./core/Axios */ "./node_modules/axios/lib/core/Axios.js");
|
|
var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js");
|
|
var defaults = __webpack_require__(/*! ./defaults */ "./node_modules/axios/lib/defaults.js");
|
|
|
|
/**
|
|
* Create an instance of Axios
|
|
*
|
|
* @param {Object} defaultConfig The default config for the instance
|
|
* @return {Axios} A new instance of Axios
|
|
*/
|
|
function createInstance(defaultConfig) {
|
|
var context = new Axios(defaultConfig);
|
|
var instance = bind(Axios.prototype.request, context);
|
|
|
|
// Copy axios.prototype to instance
|
|
utils.extend(instance, Axios.prototype, context);
|
|
|
|
// Copy context to instance
|
|
utils.extend(instance, context);
|
|
|
|
return instance;
|
|
}
|
|
|
|
// Create the default instance to be exported
|
|
var axios = createInstance(defaults);
|
|
|
|
// Expose Axios class to allow class inheritance
|
|
axios.Axios = Axios;
|
|
|
|
// Factory for creating new instances
|
|
axios.create = function create(instanceConfig) {
|
|
return createInstance(mergeConfig(axios.defaults, instanceConfig));
|
|
};
|
|
|
|
// Expose Cancel & CancelToken
|
|
axios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ "./node_modules/axios/lib/cancel/Cancel.js");
|
|
axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./node_modules/axios/lib/cancel/CancelToken.js");
|
|
axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js");
|
|
|
|
// Expose all/spread
|
|
axios.all = function all(promises) {
|
|
return Promise.all(promises);
|
|
};
|
|
axios.spread = __webpack_require__(/*! ./helpers/spread */ "./node_modules/axios/lib/helpers/spread.js");
|
|
|
|
// Expose isAxiosError
|
|
axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_modules/axios/lib/helpers/isAxiosError.js");
|
|
|
|
module.exports = axios;
|
|
|
|
// Allow use of default import syntax in TypeScript
|
|
module.exports.default = axios;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/cancel/Cancel.js":
|
|
/*!*************************************************!*\
|
|
!*** ./node_modules/axios/lib/cancel/Cancel.js ***!
|
|
\*************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* A `Cancel` is an object that is thrown when an operation is canceled.
|
|
*
|
|
* @class
|
|
* @param {string=} message The message.
|
|
*/
|
|
function Cancel(message) {
|
|
this.message = message;
|
|
}
|
|
|
|
Cancel.prototype.toString = function toString() {
|
|
return 'Cancel' + (this.message ? ': ' + this.message : '');
|
|
};
|
|
|
|
Cancel.prototype.__CANCEL__ = true;
|
|
|
|
module.exports = Cancel;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/cancel/CancelToken.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/axios/lib/cancel/CancelToken.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var Cancel = __webpack_require__(/*! ./Cancel */ "./node_modules/axios/lib/cancel/Cancel.js");
|
|
|
|
/**
|
|
* A `CancelToken` is an object that can be used to request cancellation of an operation.
|
|
*
|
|
* @class
|
|
* @param {Function} executor The executor function.
|
|
*/
|
|
function CancelToken(executor) {
|
|
if (typeof executor !== 'function') {
|
|
throw new TypeError('executor must be a function.');
|
|
}
|
|
|
|
var resolvePromise;
|
|
this.promise = new Promise(function promiseExecutor(resolve) {
|
|
resolvePromise = resolve;
|
|
});
|
|
|
|
var token = this;
|
|
executor(function cancel(message) {
|
|
if (token.reason) {
|
|
// Cancellation has already been requested
|
|
return;
|
|
}
|
|
|
|
token.reason = new Cancel(message);
|
|
resolvePromise(token.reason);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Throws a `Cancel` if cancellation has been requested.
|
|
*/
|
|
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
|
|
if (this.reason) {
|
|
throw this.reason;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Returns an object that contains a new `CancelToken` and a function that, when called,
|
|
* cancels the `CancelToken`.
|
|
*/
|
|
CancelToken.source = function source() {
|
|
var cancel;
|
|
var token = new CancelToken(function executor(c) {
|
|
cancel = c;
|
|
});
|
|
return {
|
|
token: token,
|
|
cancel: cancel
|
|
};
|
|
};
|
|
|
|
module.exports = CancelToken;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/cancel/isCancel.js":
|
|
/*!***************************************************!*\
|
|
!*** ./node_modules/axios/lib/cancel/isCancel.js ***!
|
|
\***************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = function isCancel(value) {
|
|
return !!(value && value.__CANCEL__);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/Axios.js":
|
|
/*!**********************************************!*\
|
|
!*** ./node_modules/axios/lib/core/Axios.js ***!
|
|
\**********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js");
|
|
var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js");
|
|
var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js");
|
|
var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js");
|
|
|
|
/**
|
|
* Create a new instance of Axios
|
|
*
|
|
* @param {Object} instanceConfig The default config for the instance
|
|
*/
|
|
function Axios(instanceConfig) {
|
|
this.defaults = instanceConfig;
|
|
this.interceptors = {
|
|
request: new InterceptorManager(),
|
|
response: new InterceptorManager()
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Dispatch a request
|
|
*
|
|
* @param {Object} config The config specific for this request (merged with this.defaults)
|
|
*/
|
|
Axios.prototype.request = function request(config) {
|
|
/*eslint no-param-reassign:0*/
|
|
// Allow for axios('example/url'[, config]) a la fetch API
|
|
if (typeof config === 'string') {
|
|
config = arguments[1] || {};
|
|
config.url = arguments[0];
|
|
} else {
|
|
config = config || {};
|
|
}
|
|
|
|
config = mergeConfig(this.defaults, config);
|
|
|
|
// Set config.method
|
|
if (config.method) {
|
|
config.method = config.method.toLowerCase();
|
|
} else if (this.defaults.method) {
|
|
config.method = this.defaults.method.toLowerCase();
|
|
} else {
|
|
config.method = 'get';
|
|
}
|
|
|
|
// Hook up interceptors middleware
|
|
var chain = [dispatchRequest, undefined];
|
|
var promise = Promise.resolve(config);
|
|
|
|
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
|
|
chain.unshift(interceptor.fulfilled, interceptor.rejected);
|
|
});
|
|
|
|
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
|
|
chain.push(interceptor.fulfilled, interceptor.rejected);
|
|
});
|
|
|
|
while (chain.length) {
|
|
promise = promise.then(chain.shift(), chain.shift());
|
|
}
|
|
|
|
return promise;
|
|
};
|
|
|
|
Axios.prototype.getUri = function getUri(config) {
|
|
config = mergeConfig(this.defaults, config);
|
|
return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
|
|
};
|
|
|
|
// Provide aliases for supported request methods
|
|
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
|
|
/*eslint func-names:0*/
|
|
Axios.prototype[method] = function(url, config) {
|
|
return this.request(mergeConfig(config || {}, {
|
|
method: method,
|
|
url: url,
|
|
data: (config || {}).data
|
|
}));
|
|
};
|
|
});
|
|
|
|
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
|
|
/*eslint func-names:0*/
|
|
Axios.prototype[method] = function(url, data, config) {
|
|
return this.request(mergeConfig(config || {}, {
|
|
method: method,
|
|
url: url,
|
|
data: data
|
|
}));
|
|
};
|
|
});
|
|
|
|
module.exports = Axios;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/InterceptorManager.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/InterceptorManager.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
function InterceptorManager() {
|
|
this.handlers = [];
|
|
}
|
|
|
|
/**
|
|
* Add a new interceptor to the stack
|
|
*
|
|
* @param {Function} fulfilled The function to handle `then` for a `Promise`
|
|
* @param {Function} rejected The function to handle `reject` for a `Promise`
|
|
*
|
|
* @return {Number} An ID used to remove interceptor later
|
|
*/
|
|
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
|
|
this.handlers.push({
|
|
fulfilled: fulfilled,
|
|
rejected: rejected
|
|
});
|
|
return this.handlers.length - 1;
|
|
};
|
|
|
|
/**
|
|
* Remove an interceptor from the stack
|
|
*
|
|
* @param {Number} id The ID that was returned by `use`
|
|
*/
|
|
InterceptorManager.prototype.eject = function eject(id) {
|
|
if (this.handlers[id]) {
|
|
this.handlers[id] = null;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Iterate over all the registered interceptors
|
|
*
|
|
* This method is particularly useful for skipping over any
|
|
* interceptors that may have become `null` calling `eject`.
|
|
*
|
|
* @param {Function} fn The function to call for each interceptor
|
|
*/
|
|
InterceptorManager.prototype.forEach = function forEach(fn) {
|
|
utils.forEach(this.handlers, function forEachHandler(h) {
|
|
if (h !== null) {
|
|
fn(h);
|
|
}
|
|
});
|
|
};
|
|
|
|
module.exports = InterceptorManager;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/buildFullPath.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/buildFullPath.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./node_modules/axios/lib/helpers/isAbsoluteURL.js");
|
|
var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./node_modules/axios/lib/helpers/combineURLs.js");
|
|
|
|
/**
|
|
* Creates a new URL by combining the baseURL with the requestedURL,
|
|
* only when the requestedURL is not already an absolute URL.
|
|
* If the requestURL is absolute, this function returns the requestedURL untouched.
|
|
*
|
|
* @param {string} baseURL The base URL
|
|
* @param {string} requestedURL Absolute or relative URL to combine
|
|
* @returns {string} The combined full path
|
|
*/
|
|
module.exports = function buildFullPath(baseURL, requestedURL) {
|
|
if (baseURL && !isAbsoluteURL(requestedURL)) {
|
|
return combineURLs(baseURL, requestedURL);
|
|
}
|
|
return requestedURL;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/createError.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/createError.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var enhanceError = __webpack_require__(/*! ./enhanceError */ "./node_modules/axios/lib/core/enhanceError.js");
|
|
|
|
/**
|
|
* Create an Error with the specified message, config, error code, request and response.
|
|
*
|
|
* @param {string} message The error message.
|
|
* @param {Object} config The config.
|
|
* @param {string} [code] The error code (for example, 'ECONNABORTED').
|
|
* @param {Object} [request] The request.
|
|
* @param {Object} [response] The response.
|
|
* @returns {Error} The created error.
|
|
*/
|
|
module.exports = function createError(message, config, code, request, response) {
|
|
var error = new Error(message);
|
|
return enhanceError(error, config, code, request, response);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/dispatchRequest.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/dispatchRequest.js ***!
|
|
\********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
var transformData = __webpack_require__(/*! ./transformData */ "./node_modules/axios/lib/core/transformData.js");
|
|
var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js");
|
|
var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults.js");
|
|
|
|
/**
|
|
* Throws a `Cancel` if cancellation has been requested.
|
|
*/
|
|
function throwIfCancellationRequested(config) {
|
|
if (config.cancelToken) {
|
|
config.cancelToken.throwIfRequested();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Dispatch a request to the server using the configured adapter.
|
|
*
|
|
* @param {object} config The config that is to be used for the request
|
|
* @returns {Promise} The Promise to be fulfilled
|
|
*/
|
|
module.exports = function dispatchRequest(config) {
|
|
throwIfCancellationRequested(config);
|
|
|
|
// Ensure headers exist
|
|
config.headers = config.headers || {};
|
|
|
|
// Transform request data
|
|
config.data = transformData(
|
|
config.data,
|
|
config.headers,
|
|
config.transformRequest
|
|
);
|
|
|
|
// Flatten headers
|
|
config.headers = utils.merge(
|
|
config.headers.common || {},
|
|
config.headers[config.method] || {},
|
|
config.headers
|
|
);
|
|
|
|
utils.forEach(
|
|
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
|
|
function cleanHeaderConfig(method) {
|
|
delete config.headers[method];
|
|
}
|
|
);
|
|
|
|
var adapter = config.adapter || defaults.adapter;
|
|
|
|
return adapter(config).then(function onAdapterResolution(response) {
|
|
throwIfCancellationRequested(config);
|
|
|
|
// Transform response data
|
|
response.data = transformData(
|
|
response.data,
|
|
response.headers,
|
|
config.transformResponse
|
|
);
|
|
|
|
return response;
|
|
}, function onAdapterRejection(reason) {
|
|
if (!isCancel(reason)) {
|
|
throwIfCancellationRequested(config);
|
|
|
|
// Transform response data
|
|
if (reason && reason.response) {
|
|
reason.response.data = transformData(
|
|
reason.response.data,
|
|
reason.response.headers,
|
|
config.transformResponse
|
|
);
|
|
}
|
|
}
|
|
|
|
return Promise.reject(reason);
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/enhanceError.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/enhanceError.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Update an Error with the specified config, error code, and response.
|
|
*
|
|
* @param {Error} error The error to update.
|
|
* @param {Object} config The config.
|
|
* @param {string} [code] The error code (for example, 'ECONNABORTED').
|
|
* @param {Object} [request] The request.
|
|
* @param {Object} [response] The response.
|
|
* @returns {Error} The error.
|
|
*/
|
|
module.exports = function enhanceError(error, config, code, request, response) {
|
|
error.config = config;
|
|
if (code) {
|
|
error.code = code;
|
|
}
|
|
|
|
error.request = request;
|
|
error.response = response;
|
|
error.isAxiosError = true;
|
|
|
|
error.toJSON = function toJSON() {
|
|
return {
|
|
// Standard
|
|
message: this.message,
|
|
name: this.name,
|
|
// Microsoft
|
|
description: this.description,
|
|
number: this.number,
|
|
// Mozilla
|
|
fileName: this.fileName,
|
|
lineNumber: this.lineNumber,
|
|
columnNumber: this.columnNumber,
|
|
stack: this.stack,
|
|
// Axios
|
|
config: this.config,
|
|
code: this.code
|
|
};
|
|
};
|
|
return error;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/mergeConfig.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/mergeConfig.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
/**
|
|
* Config-specific merge-function which creates a new config-object
|
|
* by merging two configuration objects together.
|
|
*
|
|
* @param {Object} config1
|
|
* @param {Object} config2
|
|
* @returns {Object} New object resulting from merging config2 to config1
|
|
*/
|
|
module.exports = function mergeConfig(config1, config2) {
|
|
// eslint-disable-next-line no-param-reassign
|
|
config2 = config2 || {};
|
|
var config = {};
|
|
|
|
var valueFromConfig2Keys = ['url', 'method', 'data'];
|
|
var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];
|
|
var defaultToConfig2Keys = [
|
|
'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',
|
|
'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',
|
|
'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress',
|
|
'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent',
|
|
'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'
|
|
];
|
|
var directMergeKeys = ['validateStatus'];
|
|
|
|
function getMergedValue(target, source) {
|
|
if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
|
|
return utils.merge(target, source);
|
|
} else if (utils.isPlainObject(source)) {
|
|
return utils.merge({}, source);
|
|
} else if (utils.isArray(source)) {
|
|
return source.slice();
|
|
}
|
|
return source;
|
|
}
|
|
|
|
function mergeDeepProperties(prop) {
|
|
if (!utils.isUndefined(config2[prop])) {
|
|
config[prop] = getMergedValue(config1[prop], config2[prop]);
|
|
} else if (!utils.isUndefined(config1[prop])) {
|
|
config[prop] = getMergedValue(undefined, config1[prop]);
|
|
}
|
|
}
|
|
|
|
utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
|
|
if (!utils.isUndefined(config2[prop])) {
|
|
config[prop] = getMergedValue(undefined, config2[prop]);
|
|
}
|
|
});
|
|
|
|
utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
|
|
|
|
utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
|
|
if (!utils.isUndefined(config2[prop])) {
|
|
config[prop] = getMergedValue(undefined, config2[prop]);
|
|
} else if (!utils.isUndefined(config1[prop])) {
|
|
config[prop] = getMergedValue(undefined, config1[prop]);
|
|
}
|
|
});
|
|
|
|
utils.forEach(directMergeKeys, function merge(prop) {
|
|
if (prop in config2) {
|
|
config[prop] = getMergedValue(config1[prop], config2[prop]);
|
|
} else if (prop in config1) {
|
|
config[prop] = getMergedValue(undefined, config1[prop]);
|
|
}
|
|
});
|
|
|
|
var axiosKeys = valueFromConfig2Keys
|
|
.concat(mergeDeepPropertiesKeys)
|
|
.concat(defaultToConfig2Keys)
|
|
.concat(directMergeKeys);
|
|
|
|
var otherKeys = Object
|
|
.keys(config1)
|
|
.concat(Object.keys(config2))
|
|
.filter(function filterAxiosKeys(key) {
|
|
return axiosKeys.indexOf(key) === -1;
|
|
});
|
|
|
|
utils.forEach(otherKeys, mergeDeepProperties);
|
|
|
|
return config;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/settle.js":
|
|
/*!***********************************************!*\
|
|
!*** ./node_modules/axios/lib/core/settle.js ***!
|
|
\***********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var createError = __webpack_require__(/*! ./createError */ "./node_modules/axios/lib/core/createError.js");
|
|
|
|
/**
|
|
* Resolve or reject a Promise based on response status.
|
|
*
|
|
* @param {Function} resolve A function that resolves the promise.
|
|
* @param {Function} reject A function that rejects the promise.
|
|
* @param {object} response The response.
|
|
*/
|
|
module.exports = function settle(resolve, reject, response) {
|
|
var validateStatus = response.config.validateStatus;
|
|
if (!response.status || !validateStatus || validateStatus(response.status)) {
|
|
resolve(response);
|
|
} else {
|
|
reject(createError(
|
|
'Request failed with status code ' + response.status,
|
|
response.config,
|
|
null,
|
|
response.request,
|
|
response
|
|
));
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/core/transformData.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/axios/lib/core/transformData.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
/**
|
|
* Transform the data for a request or a response
|
|
*
|
|
* @param {Object|String} data The data to be transformed
|
|
* @param {Array} headers The headers for the request or response
|
|
* @param {Array|Function} fns A single function or Array of functions
|
|
* @returns {*} The resulting transformed data
|
|
*/
|
|
module.exports = function transformData(data, headers, fns) {
|
|
/*eslint no-param-reassign:0*/
|
|
utils.forEach(fns, function transform(fn) {
|
|
data = fn(data, headers);
|
|
});
|
|
|
|
return data;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/defaults.js":
|
|
/*!********************************************!*\
|
|
!*** ./node_modules/axios/lib/defaults.js ***!
|
|
\********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
/* provided dependency */ var process = __webpack_require__(/*! process/browser */ "./node_modules/process/browser.js");
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js");
|
|
var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js");
|
|
|
|
var DEFAULT_CONTENT_TYPE = {
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
};
|
|
|
|
function setContentTypeIfUnset(headers, value) {
|
|
if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
|
|
headers['Content-Type'] = value;
|
|
}
|
|
}
|
|
|
|
function getDefaultAdapter() {
|
|
var adapter;
|
|
if (typeof XMLHttpRequest !== 'undefined') {
|
|
// For browsers use XHR adapter
|
|
adapter = __webpack_require__(/*! ./adapters/xhr */ "./node_modules/axios/lib/adapters/xhr.js");
|
|
} else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
|
|
// For node use HTTP adapter
|
|
adapter = __webpack_require__(/*! ./adapters/http */ "./node_modules/axios/lib/adapters/xhr.js");
|
|
}
|
|
return adapter;
|
|
}
|
|
|
|
var defaults = {
|
|
adapter: getDefaultAdapter(),
|
|
|
|
transformRequest: [function transformRequest(data, headers) {
|
|
normalizeHeaderName(headers, 'Accept');
|
|
normalizeHeaderName(headers, 'Content-Type');
|
|
if (utils.isFormData(data) ||
|
|
utils.isArrayBuffer(data) ||
|
|
utils.isBuffer(data) ||
|
|
utils.isStream(data) ||
|
|
utils.isFile(data) ||
|
|
utils.isBlob(data)
|
|
) {
|
|
return data;
|
|
}
|
|
if (utils.isArrayBufferView(data)) {
|
|
return data.buffer;
|
|
}
|
|
if (utils.isURLSearchParams(data)) {
|
|
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
|
|
return data.toString();
|
|
}
|
|
if (utils.isObject(data)) {
|
|
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
|
|
return JSON.stringify(data);
|
|
}
|
|
return data;
|
|
}],
|
|
|
|
transformResponse: [function transformResponse(data) {
|
|
/*eslint no-param-reassign:0*/
|
|
if (typeof data === 'string') {
|
|
try {
|
|
data = JSON.parse(data);
|
|
} catch (e) { /* Ignore */ }
|
|
}
|
|
return data;
|
|
}],
|
|
|
|
/**
|
|
* A timeout in milliseconds to abort a request. If set to 0 (default) a
|
|
* timeout is not created.
|
|
*/
|
|
timeout: 0,
|
|
|
|
xsrfCookieName: 'XSRF-TOKEN',
|
|
xsrfHeaderName: 'X-XSRF-TOKEN',
|
|
|
|
maxContentLength: -1,
|
|
maxBodyLength: -1,
|
|
|
|
validateStatus: function validateStatus(status) {
|
|
return status >= 200 && status < 300;
|
|
}
|
|
};
|
|
|
|
defaults.headers = {
|
|
common: {
|
|
'Accept': 'application/json, text/plain, */*'
|
|
}
|
|
};
|
|
|
|
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
|
|
defaults.headers[method] = {};
|
|
});
|
|
|
|
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
|
|
defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
|
|
});
|
|
|
|
module.exports = defaults;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/bind.js":
|
|
/*!************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/bind.js ***!
|
|
\************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
module.exports = function bind(fn, thisArg) {
|
|
return function wrap() {
|
|
var args = new Array(arguments.length);
|
|
for (var i = 0; i < args.length; i++) {
|
|
args[i] = arguments[i];
|
|
}
|
|
return fn.apply(thisArg, args);
|
|
};
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/buildURL.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/buildURL.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
function encode(val) {
|
|
return encodeURIComponent(val).
|
|
replace(/%3A/gi, ':').
|
|
replace(/%24/g, '$').
|
|
replace(/%2C/gi, ',').
|
|
replace(/%20/g, '+').
|
|
replace(/%5B/gi, '[').
|
|
replace(/%5D/gi, ']');
|
|
}
|
|
|
|
/**
|
|
* Build a URL by appending params to the end
|
|
*
|
|
* @param {string} url The base of the url (e.g., http://www.google.com)
|
|
* @param {object} [params] The params to be appended
|
|
* @returns {string} The formatted url
|
|
*/
|
|
module.exports = function buildURL(url, params, paramsSerializer) {
|
|
/*eslint no-param-reassign:0*/
|
|
if (!params) {
|
|
return url;
|
|
}
|
|
|
|
var serializedParams;
|
|
if (paramsSerializer) {
|
|
serializedParams = paramsSerializer(params);
|
|
} else if (utils.isURLSearchParams(params)) {
|
|
serializedParams = params.toString();
|
|
} else {
|
|
var parts = [];
|
|
|
|
utils.forEach(params, function serialize(val, key) {
|
|
if (val === null || typeof val === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (utils.isArray(val)) {
|
|
key = key + '[]';
|
|
} else {
|
|
val = [val];
|
|
}
|
|
|
|
utils.forEach(val, function parseValue(v) {
|
|
if (utils.isDate(v)) {
|
|
v = v.toISOString();
|
|
} else if (utils.isObject(v)) {
|
|
v = JSON.stringify(v);
|
|
}
|
|
parts.push(encode(key) + '=' + encode(v));
|
|
});
|
|
});
|
|
|
|
serializedParams = parts.join('&');
|
|
}
|
|
|
|
if (serializedParams) {
|
|
var hashmarkIndex = url.indexOf('#');
|
|
if (hashmarkIndex !== -1) {
|
|
url = url.slice(0, hashmarkIndex);
|
|
}
|
|
|
|
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
|
|
}
|
|
|
|
return url;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/combineURLs.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/combineURLs.js ***!
|
|
\*******************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Creates a new URL by combining the specified URLs
|
|
*
|
|
* @param {string} baseURL The base URL
|
|
* @param {string} relativeURL The relative URL
|
|
* @returns {string} The combined URL
|
|
*/
|
|
module.exports = function combineURLs(baseURL, relativeURL) {
|
|
return relativeURL
|
|
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
|
|
: baseURL;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/cookies.js":
|
|
/*!***************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/cookies.js ***!
|
|
\***************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
module.exports = (
|
|
utils.isStandardBrowserEnv() ?
|
|
|
|
// Standard browser envs support document.cookie
|
|
(function standardBrowserEnv() {
|
|
return {
|
|
write: function write(name, value, expires, path, domain, secure) {
|
|
var cookie = [];
|
|
cookie.push(name + '=' + encodeURIComponent(value));
|
|
|
|
if (utils.isNumber(expires)) {
|
|
cookie.push('expires=' + new Date(expires).toGMTString());
|
|
}
|
|
|
|
if (utils.isString(path)) {
|
|
cookie.push('path=' + path);
|
|
}
|
|
|
|
if (utils.isString(domain)) {
|
|
cookie.push('domain=' + domain);
|
|
}
|
|
|
|
if (secure === true) {
|
|
cookie.push('secure');
|
|
}
|
|
|
|
document.cookie = cookie.join('; ');
|
|
},
|
|
|
|
read: function read(name) {
|
|
var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
|
|
return (match ? decodeURIComponent(match[3]) : null);
|
|
},
|
|
|
|
remove: function remove(name) {
|
|
this.write(name, '', Date.now() - 86400000);
|
|
}
|
|
};
|
|
})() :
|
|
|
|
// Non standard browser env (web workers, react-native) lack needed support.
|
|
(function nonStandardBrowserEnv() {
|
|
return {
|
|
write: function write() {},
|
|
read: function read() { return null; },
|
|
remove: function remove() {}
|
|
};
|
|
})()
|
|
);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***!
|
|
\*********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Determines whether the specified URL is absolute
|
|
*
|
|
* @param {string} url The URL to test
|
|
* @returns {boolean} True if the specified URL is absolute, otherwise false
|
|
*/
|
|
module.exports = function isAbsoluteURL(url) {
|
|
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
|
|
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
|
|
// by any combination of letters, digits, plus, period, or hyphen.
|
|
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/isAxiosError.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/isAxiosError.js ***!
|
|
\********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Determines whether the payload is an error thrown by Axios
|
|
*
|
|
* @param {*} payload The value to test
|
|
* @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
|
|
*/
|
|
module.exports = function isAxiosError(payload) {
|
|
return (typeof payload === 'object') && (payload.isAxiosError === true);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
module.exports = (
|
|
utils.isStandardBrowserEnv() ?
|
|
|
|
// Standard browser envs have full support of the APIs needed to test
|
|
// whether the request URL is of the same origin as current location.
|
|
(function standardBrowserEnv() {
|
|
var msie = /(msie|trident)/i.test(navigator.userAgent);
|
|
var urlParsingNode = document.createElement('a');
|
|
var originURL;
|
|
|
|
/**
|
|
* Parse a URL to discover it's components
|
|
*
|
|
* @param {String} url The URL to be parsed
|
|
* @returns {Object}
|
|
*/
|
|
function resolveURL(url) {
|
|
var href = url;
|
|
|
|
if (msie) {
|
|
// IE needs attribute set twice to normalize properties
|
|
urlParsingNode.setAttribute('href', href);
|
|
href = urlParsingNode.href;
|
|
}
|
|
|
|
urlParsingNode.setAttribute('href', href);
|
|
|
|
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
|
|
return {
|
|
href: urlParsingNode.href,
|
|
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
|
|
host: urlParsingNode.host,
|
|
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
|
|
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
|
|
hostname: urlParsingNode.hostname,
|
|
port: urlParsingNode.port,
|
|
pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
|
|
urlParsingNode.pathname :
|
|
'/' + urlParsingNode.pathname
|
|
};
|
|
}
|
|
|
|
originURL = resolveURL(window.location.href);
|
|
|
|
/**
|
|
* Determine if a URL shares the same origin as the current location
|
|
*
|
|
* @param {String} requestURL The URL to test
|
|
* @returns {boolean} True if URL shares the same origin, otherwise false
|
|
*/
|
|
return function isURLSameOrigin(requestURL) {
|
|
var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
|
|
return (parsed.protocol === originURL.protocol &&
|
|
parsed.host === originURL.host);
|
|
};
|
|
})() :
|
|
|
|
// Non standard browser envs (web workers, react-native) lack needed support.
|
|
(function nonStandardBrowserEnv() {
|
|
return function isURLSameOrigin() {
|
|
return true;
|
|
};
|
|
})()
|
|
);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js":
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***!
|
|
\***************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
module.exports = function normalizeHeaderName(headers, normalizedName) {
|
|
utils.forEach(headers, function processHeader(value, name) {
|
|
if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
|
|
headers[normalizedName] = value;
|
|
delete headers[name];
|
|
}
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/parseHeaders.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/parseHeaders.js ***!
|
|
\********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js");
|
|
|
|
// Headers whose duplicates are ignored by node
|
|
// c.f. https://nodejs.org/api/http.html#http_message_headers
|
|
var ignoreDuplicateOf = [
|
|
'age', 'authorization', 'content-length', 'content-type', 'etag',
|
|
'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
|
|
'last-modified', 'location', 'max-forwards', 'proxy-authorization',
|
|
'referer', 'retry-after', 'user-agent'
|
|
];
|
|
|
|
/**
|
|
* Parse headers into an object
|
|
*
|
|
* ```
|
|
* Date: Wed, 27 Aug 2014 08:58:49 GMT
|
|
* Content-Type: application/json
|
|
* Connection: keep-alive
|
|
* Transfer-Encoding: chunked
|
|
* ```
|
|
*
|
|
* @param {String} headers Headers needing to be parsed
|
|
* @returns {Object} Headers parsed into an object
|
|
*/
|
|
module.exports = function parseHeaders(headers) {
|
|
var parsed = {};
|
|
var key;
|
|
var val;
|
|
var i;
|
|
|
|
if (!headers) { return parsed; }
|
|
|
|
utils.forEach(headers.split('\n'), function parser(line) {
|
|
i = line.indexOf(':');
|
|
key = utils.trim(line.substr(0, i)).toLowerCase();
|
|
val = utils.trim(line.substr(i + 1));
|
|
|
|
if (key) {
|
|
if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
|
|
return;
|
|
}
|
|
if (key === 'set-cookie') {
|
|
parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
|
|
} else {
|
|
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
|
|
}
|
|
}
|
|
});
|
|
|
|
return parsed;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/helpers/spread.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/axios/lib/helpers/spread.js ***!
|
|
\**************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Syntactic sugar for invoking a function and expanding an array for arguments.
|
|
*
|
|
* Common use case would be to use `Function.prototype.apply`.
|
|
*
|
|
* ```js
|
|
* function f(x, y, z) {}
|
|
* var args = [1, 2, 3];
|
|
* f.apply(null, args);
|
|
* ```
|
|
*
|
|
* With `spread` this example can be re-written.
|
|
*
|
|
* ```js
|
|
* spread(function(x, y, z) {})([1, 2, 3]);
|
|
* ```
|
|
*
|
|
* @param {Function} callback
|
|
* @returns {Function}
|
|
*/
|
|
module.exports = function spread(callback) {
|
|
return function wrap(arr) {
|
|
return callback.apply(null, arr);
|
|
};
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/axios/lib/utils.js":
|
|
/*!*****************************************!*\
|
|
!*** ./node_modules/axios/lib/utils.js ***!
|
|
\*****************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js");
|
|
|
|
/*global toString:true*/
|
|
|
|
// utils is a library of generic helper functions non-specific to axios
|
|
|
|
var toString = Object.prototype.toString;
|
|
|
|
/**
|
|
* Determine if a value is an Array
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is an Array, otherwise false
|
|
*/
|
|
function isArray(val) {
|
|
return toString.call(val) === '[object Array]';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is undefined
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if the value is undefined, otherwise false
|
|
*/
|
|
function isUndefined(val) {
|
|
return typeof val === 'undefined';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a Buffer
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a Buffer, otherwise false
|
|
*/
|
|
function isBuffer(val) {
|
|
return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
|
|
&& typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is an ArrayBuffer
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is an ArrayBuffer, otherwise false
|
|
*/
|
|
function isArrayBuffer(val) {
|
|
return toString.call(val) === '[object ArrayBuffer]';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a FormData
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is an FormData, otherwise false
|
|
*/
|
|
function isFormData(val) {
|
|
return (typeof FormData !== 'undefined') && (val instanceof FormData);
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a view on an ArrayBuffer
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
|
|
*/
|
|
function isArrayBufferView(val) {
|
|
var result;
|
|
if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
|
|
result = ArrayBuffer.isView(val);
|
|
} else {
|
|
result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a String
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a String, otherwise false
|
|
*/
|
|
function isString(val) {
|
|
return typeof val === 'string';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a Number
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a Number, otherwise false
|
|
*/
|
|
function isNumber(val) {
|
|
return typeof val === 'number';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is an Object
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is an Object, otherwise false
|
|
*/
|
|
function isObject(val) {
|
|
return val !== null && typeof val === 'object';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a plain Object
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @return {boolean} True if value is a plain Object, otherwise false
|
|
*/
|
|
function isPlainObject(val) {
|
|
if (toString.call(val) !== '[object Object]') {
|
|
return false;
|
|
}
|
|
|
|
var prototype = Object.getPrototypeOf(val);
|
|
return prototype === null || prototype === Object.prototype;
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a Date
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a Date, otherwise false
|
|
*/
|
|
function isDate(val) {
|
|
return toString.call(val) === '[object Date]';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a File
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a File, otherwise false
|
|
*/
|
|
function isFile(val) {
|
|
return toString.call(val) === '[object File]';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a Blob
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a Blob, otherwise false
|
|
*/
|
|
function isBlob(val) {
|
|
return toString.call(val) === '[object Blob]';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a Function
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a Function, otherwise false
|
|
*/
|
|
function isFunction(val) {
|
|
return toString.call(val) === '[object Function]';
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a Stream
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a Stream, otherwise false
|
|
*/
|
|
function isStream(val) {
|
|
return isObject(val) && isFunction(val.pipe);
|
|
}
|
|
|
|
/**
|
|
* Determine if a value is a URLSearchParams object
|
|
*
|
|
* @param {Object} val The value to test
|
|
* @returns {boolean} True if value is a URLSearchParams object, otherwise false
|
|
*/
|
|
function isURLSearchParams(val) {
|
|
return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
|
|
}
|
|
|
|
/**
|
|
* Trim excess whitespace off the beginning and end of a string
|
|
*
|
|
* @param {String} str The String to trim
|
|
* @returns {String} The String freed of excess whitespace
|
|
*/
|
|
function trim(str) {
|
|
return str.replace(/^\s*/, '').replace(/\s*$/, '');
|
|
}
|
|
|
|
/**
|
|
* Determine if we're running in a standard browser environment
|
|
*
|
|
* This allows axios to run in a web worker, and react-native.
|
|
* Both environments support XMLHttpRequest, but not fully standard globals.
|
|
*
|
|
* web workers:
|
|
* typeof window -> undefined
|
|
* typeof document -> undefined
|
|
*
|
|
* react-native:
|
|
* navigator.product -> 'ReactNative'
|
|
* nativescript
|
|
* navigator.product -> 'NativeScript' or 'NS'
|
|
*/
|
|
function isStandardBrowserEnv() {
|
|
if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
|
|
navigator.product === 'NativeScript' ||
|
|
navigator.product === 'NS')) {
|
|
return false;
|
|
}
|
|
return (
|
|
typeof window !== 'undefined' &&
|
|
typeof document !== 'undefined'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Iterate over an Array or an Object invoking a function for each item.
|
|
*
|
|
* If `obj` is an Array callback will be called passing
|
|
* the value, index, and complete array for each item.
|
|
*
|
|
* If 'obj' is an Object callback will be called passing
|
|
* the value, key, and complete object for each property.
|
|
*
|
|
* @param {Object|Array} obj The object to iterate
|
|
* @param {Function} fn The callback to invoke for each item
|
|
*/
|
|
function forEach(obj, fn) {
|
|
// Don't bother if no value provided
|
|
if (obj === null || typeof obj === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
// Force an array if not already something iterable
|
|
if (typeof obj !== 'object') {
|
|
/*eslint no-param-reassign:0*/
|
|
obj = [obj];
|
|
}
|
|
|
|
if (isArray(obj)) {
|
|
// Iterate over array values
|
|
for (var i = 0, l = obj.length; i < l; i++) {
|
|
fn.call(null, obj[i], i, obj);
|
|
}
|
|
} else {
|
|
// Iterate over object keys
|
|
for (var key in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
fn.call(null, obj[key], key, obj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Accepts varargs expecting each argument to be an object, then
|
|
* immutably merges the properties of each object and returns result.
|
|
*
|
|
* When multiple objects contain the same key the later object in
|
|
* the arguments list will take precedence.
|
|
*
|
|
* Example:
|
|
*
|
|
* ```js
|
|
* var result = merge({foo: 123}, {foo: 456});
|
|
* console.log(result.foo); // outputs 456
|
|
* ```
|
|
*
|
|
* @param {Object} obj1 Object to merge
|
|
* @returns {Object} Result of all merge properties
|
|
*/
|
|
function merge(/* obj1, obj2, obj3, ... */) {
|
|
var result = {};
|
|
function assignValue(val, key) {
|
|
if (isPlainObject(result[key]) && isPlainObject(val)) {
|
|
result[key] = merge(result[key], val);
|
|
} else if (isPlainObject(val)) {
|
|
result[key] = merge({}, val);
|
|
} else if (isArray(val)) {
|
|
result[key] = val.slice();
|
|
} else {
|
|
result[key] = val;
|
|
}
|
|
}
|
|
|
|
for (var i = 0, l = arguments.length; i < l; i++) {
|
|
forEach(arguments[i], assignValue);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Extends object a by mutably adding to it the properties of object b.
|
|
*
|
|
* @param {Object} a The object to be extended
|
|
* @param {Object} b The object to copy properties from
|
|
* @param {Object} thisArg The object to bind function to
|
|
* @return {Object} The resulting value of object a
|
|
*/
|
|
function extend(a, b, thisArg) {
|
|
forEach(b, function assignValue(val, key) {
|
|
if (thisArg && typeof val === 'function') {
|
|
a[key] = bind(val, thisArg);
|
|
} else {
|
|
a[key] = val;
|
|
}
|
|
});
|
|
return a;
|
|
}
|
|
|
|
/**
|
|
* Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
|
|
*
|
|
* @param {string} content with BOM
|
|
* @return {string} content value without BOM
|
|
*/
|
|
function stripBOM(content) {
|
|
if (content.charCodeAt(0) === 0xFEFF) {
|
|
content = content.slice(1);
|
|
}
|
|
return content;
|
|
}
|
|
|
|
module.exports = {
|
|
isArray: isArray,
|
|
isArrayBuffer: isArrayBuffer,
|
|
isBuffer: isBuffer,
|
|
isFormData: isFormData,
|
|
isArrayBufferView: isArrayBufferView,
|
|
isString: isString,
|
|
isNumber: isNumber,
|
|
isObject: isObject,
|
|
isPlainObject: isPlainObject,
|
|
isUndefined: isUndefined,
|
|
isDate: isDate,
|
|
isFile: isFile,
|
|
isBlob: isBlob,
|
|
isFunction: isFunction,
|
|
isStream: isStream,
|
|
isURLSearchParams: isURLSearchParams,
|
|
isStandardBrowserEnv: isStandardBrowserEnv,
|
|
forEach: forEach,
|
|
merge: merge,
|
|
extend: extend,
|
|
trim: trim,
|
|
stripBOM: stripBOM
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=script&lang=js":
|
|
/*!**********************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=script&lang=js ***!
|
|
\**********************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuedraggable */ "./node_modules/vuedraggable/dist/vuedraggable.umd.js");
|
|
/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,vue__WEBPACK_IMPORTED_MODULE_1__.defineComponent)({
|
|
name: 'gdoo-form-designer',
|
|
props: ['items', 'parent_id', 'table'],
|
|
setup: function setup(props) {
|
|
var activeItem = (0,vue__WEBPACK_IMPORTED_MODULE_1__.inject)('activeItem');
|
|
(0,vue__WEBPACK_IMPORTED_MODULE_1__.watch)(activeItem, function (oldItem, newItem) {
|
|
props.items.forEach(function (item) {
|
|
if (item.item_id == newItem.item_id) {
|
|
for (var key in newItem) {
|
|
item[key] = newItem[key];
|
|
}
|
|
}
|
|
});
|
|
});
|
|
return {
|
|
activeItem: activeItem
|
|
};
|
|
},
|
|
components: {
|
|
'draggable': (vuedraggable__WEBPACK_IMPORTED_MODULE_0___default())
|
|
},
|
|
methods: {
|
|
onMove: function onMove(item) {
|
|
var me = this;
|
|
var oldItem = item.draggedContext.element;
|
|
var newItem = item.relatedContext.element; // 获取容器dom
|
|
|
|
var node = item.to.offsetParent; // 子表节点不能拖出子表容器
|
|
|
|
if (oldItem.table_id > 0) {
|
|
// 不能把子表节点拖入其他容器
|
|
if (newItem == undefined) {
|
|
return false;
|
|
}
|
|
|
|
if (oldItem.table_id == newItem.table_id) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
// 新容器为空
|
|
if (newItem == undefined) {
|
|
var item_table = node.getAttribute('item-table'); // 不允许把普通节点拖入子表
|
|
|
|
if (item_table == 1) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
// 不允许普通节点拖入子表
|
|
if (newItem.table_id) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onChange: function onChange(item) {
|
|
var me = this;
|
|
|
|
if (item.added) {
|
|
var row = item.added.element;
|
|
row.parent_id = me.parent_id; // 已经设置了id
|
|
|
|
if (row.item_id > 0) {
|
|
return;
|
|
}
|
|
|
|
row.item_id = getItemMaxId();
|
|
|
|
if (row.type == 'component') {} else {
|
|
row.field = getFieldMaxId();
|
|
|
|
if (me.table) {
|
|
row.table_id = row.parent_id;
|
|
row.width = '200px';
|
|
delete row.grid;
|
|
} else {
|
|
row.table_id = 0;
|
|
}
|
|
}
|
|
|
|
for (var key in me.activeItem) {
|
|
delete me.activeItem[key];
|
|
}
|
|
|
|
for (var key in row) {
|
|
me.activeItem[key] = row[key];
|
|
}
|
|
}
|
|
},
|
|
nodeShow: function nodeShow(item) {
|
|
for (var key in this.activeItem) {
|
|
delete this.activeItem[key];
|
|
}
|
|
|
|
for (var key in item) {
|
|
if (key == 'children') {
|
|
continue;
|
|
}
|
|
|
|
this.activeItem[key] = item[key];
|
|
}
|
|
},
|
|
nodeDelete: function nodeDelete(index) {
|
|
this.items.splice(index, 1);
|
|
}
|
|
}
|
|
}));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFrameHeader.vue?vue&type=script&lang=js":
|
|
/*!*********************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFrameHeader.vue?vue&type=script&lang=js ***!
|
|
\*********************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({
|
|
name: 'gdoo-frame-header',
|
|
data: function data() {
|
|
return {
|
|
user: {},
|
|
countNotification: 0,
|
|
countTotal: 0,
|
|
countArticle: 0,
|
|
countMail: 0,
|
|
realtime: settings.realtime
|
|
};
|
|
},
|
|
mounted: function mounted() {
|
|
var _this = this;
|
|
|
|
var me = this;
|
|
this.getUser();
|
|
this.tick();
|
|
this.timer = setInterval(function () {
|
|
return _this.tick();
|
|
}, 1000 * 60);
|
|
},
|
|
methods: {
|
|
// 获取用户信息
|
|
getUser: function getUser() {
|
|
var me = this;
|
|
$.get(app.url('user/profile/getUser'), function (res) {
|
|
me.user = res;
|
|
}, 'json');
|
|
},
|
|
support: function support() {
|
|
viewDialog({
|
|
title: '关于',
|
|
dialogClass: 'modal-md',
|
|
url: app.url('index/index/support'),
|
|
close: function close() {
|
|
$(this).dialog("close");
|
|
}
|
|
});
|
|
},
|
|
chatToggle: function chatToggle() {
|
|
function openWin(u, w, h) {
|
|
var l = (screen.width - w) / 2;
|
|
var t = (screen.height - h) / 2;
|
|
var s = 'width=' + w + ', height=' + h + ', top=' + t + ', left=' + l;
|
|
s += ', status=no, toolbar=no, scrollbars=no, menubar=no, location=no, resizable=no';
|
|
open(u, 'gdooChatBox', s);
|
|
}
|
|
|
|
openWin(app.url('chat/chat/index'), 900, 600);
|
|
},
|
|
tick: function tick() {
|
|
var me = this;
|
|
$.get(app.url('user/message/count'), function (count) {
|
|
if (me.countNotification == count) {
|
|
return;
|
|
}
|
|
|
|
me.countTotal = count;
|
|
me.countNotification = count;
|
|
}, 'json'); // 查询待办列表
|
|
|
|
$.post(app.url('index/index/badges'), function (res) {
|
|
var menus = {};
|
|
var groups = {};
|
|
$.each(res, function (key, rows) {
|
|
var badge = $('#badge_' + key);
|
|
var menu_id = badge.data('menu_id');
|
|
var group_id = badge.data('group_id');
|
|
|
|
if (rows.total) {
|
|
if (menu_id > 0) {
|
|
menus[menu_id] = menu_id;
|
|
}
|
|
|
|
if (group_id > 0) {
|
|
groups[group_id] = group_id;
|
|
}
|
|
|
|
badge.show();
|
|
badge.text(rows.total);
|
|
} else {
|
|
badge.hide();
|
|
}
|
|
});
|
|
$.each(menus, function (menu_id) {
|
|
$('#badge_menu_' + menu_id).show();
|
|
});
|
|
$.each(groups, function (group_id) {
|
|
$('#badge_group_' + group_id).show();
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=script&lang=js":
|
|
/*!********************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=script&lang=js ***!
|
|
\********************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({
|
|
name: 'gdoo-grid-header',
|
|
props: ['header', 'grid', 'action'],
|
|
setup: function setup(props) {
|
|
var tabBtn = function tabBtn(btn) {
|
|
props.header.tabs.active = btn.value;
|
|
|
|
if (btn.type == 'a') {
|
|
location.href = '/' + btn.url;
|
|
} else {
|
|
props.grid.remoteData({
|
|
page: 1,
|
|
tab: btn.value
|
|
});
|
|
}
|
|
};
|
|
|
|
var actBtn = function actBtn(btn) {
|
|
props.action[btn]();
|
|
};
|
|
|
|
var linkBtn = function linkBtn(btn) {
|
|
if (btn.action) {
|
|
props.action[btn.action]();
|
|
}
|
|
};
|
|
|
|
var byBtn = function byBtn(btn) {
|
|
props.header.bys.name = btn.name;
|
|
props.header.bys.active = btn.value;
|
|
props.grid.remoteData({
|
|
page: 1,
|
|
by: btn.value
|
|
});
|
|
};
|
|
/*
|
|
function url(url, query) {
|
|
let params = this.toRaw(me.header.search_form.params);
|
|
for (const key in query) {
|
|
params[key] = query[key];
|
|
}
|
|
return app.url(url, params);
|
|
}
|
|
*/
|
|
|
|
|
|
return {
|
|
tabBtn: tabBtn,
|
|
actBtn: actBtn,
|
|
linkBtn: linkBtn,
|
|
byBtn: byBtn
|
|
};
|
|
},
|
|
methods: {}
|
|
}));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=template&id=493ea437":
|
|
/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=template&id=493ea437 ***!
|
|
\**************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "render": () => (/* binding */ render)
|
|
/* harmony export */ });
|
|
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
|
|
var _hoisted_1 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "remove fa fa-trash",
|
|
title: "删除"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_2 = {
|
|
key: 0
|
|
};
|
|
var _hoisted_3 = {
|
|
key: 1,
|
|
"class": "af-item-content"
|
|
};
|
|
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
var _component__self = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("_self");
|
|
|
|
var _component_draggable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("draggable");
|
|
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_draggable, {
|
|
chosenClass: "af-chosen",
|
|
ghostClass: "af-ghost",
|
|
move: _ctx.onMove,
|
|
onChange: _ctx.onChange,
|
|
"class": "af-draggable",
|
|
list: _ctx.items,
|
|
"item-key": "item_id",
|
|
group: "gdooComponent"
|
|
}, {
|
|
item: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
|
|
var element = _ref.element,
|
|
index = _ref.index;
|
|
return [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", {
|
|
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(function ($event) {
|
|
return _ctx.nodeShow(element);
|
|
}, ["stop"]),
|
|
"class": 'af-item af-item-' + element.type + (_ctx.activeItem.item_id == element.item_id ? ' af-item-active' : ''),
|
|
"item-id": element.item_id,
|
|
"item-table": element.table,
|
|
key: element.item_id,
|
|
style: 'width:' + (element.table_id > 0 ? element.width : 'calc(' + element.grid / 12 * 100 + '% - 5px)')
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": 'af-panel af-panel-' + element.type
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(function ($event) {
|
|
return _ctx.nodeDelete(index);
|
|
}, ["stop"])
|
|
}, [_hoisted_1], 8
|
|
/* PROPS */
|
|
, ["onClick"]), element.type == 'component' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", _hoisted_2, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(element.name), 1
|
|
/* TEXT */
|
|
)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("label", {
|
|
"class": "af-item-label",
|
|
style: element.label_width ? 'width:' + element.label_width : ''
|
|
}, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(element.name), 5
|
|
/* TEXT, STYLE */
|
|
), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, element.hide_name == 0]]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": "af-item-control",
|
|
style: 'margin-left:' + (element.hide_name == 0 ? element.label_width : '0px')
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("input", {
|
|
"class": "form-control input-sm",
|
|
"onUpdate:modelValue": function onUpdateModelValue($event) {
|
|
return element.value = $event;
|
|
},
|
|
style: element.field_width ? 'width:' + element.field_width : ''
|
|
}, null, 12
|
|
/* STYLE, PROPS */
|
|
, ["onUpdate:modelValue"]), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, element.value]])], 4
|
|
/* STYLE */
|
|
)]))], 2
|
|
/* CLASS */
|
|
), element.type == 'component' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", {
|
|
key: 0,
|
|
"class": 'af-component fa-group-' + element.type + (element.table == 1 ? ' af-table-component af-over-x' : '')
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component__self, {
|
|
table: element.table == 1,
|
|
parent_id: element.item_id,
|
|
items: element.children
|
|
}, null, 8
|
|
/* PROPS */
|
|
, ["table", "parent_id", "items"])], 2
|
|
/* CLASS */
|
|
)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)], 14
|
|
/* CLASS, STYLE, PROPS */
|
|
, ["onClick", "item-id", "item-table"]))];
|
|
}),
|
|
_: 1
|
|
/* STABLE */
|
|
|
|
}, 8
|
|
/* PROPS */
|
|
, ["move", "onChange", "list"]);
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFrameHeader.vue?vue&type=template&id=2d2750a2":
|
|
/*!*************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFrameHeader.vue?vue&type=template&id=2d2750a2 ***!
|
|
\*************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "render": () => (/* binding */ render)
|
|
/* harmony export */ });
|
|
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
var _hoisted_1 = {
|
|
"class": "nav navbar-nav navbar-right m-n hidden-xs nav-user"
|
|
};
|
|
var _hoisted_2 = {
|
|
"class": "dropdown hidden-xs"
|
|
};
|
|
var _hoisted_3 = {
|
|
href: "#",
|
|
"data-toggle": "dropdown",
|
|
title: "通知",
|
|
"class": "dropdown-toggle"
|
|
};
|
|
var _hoisted_4 = {
|
|
"class": "fa fa-bell-o pulse-box"
|
|
};
|
|
|
|
var _hoisted_5 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": "visible-xs-inline"
|
|
}, "通知", -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_6 = {
|
|
"class": "dropdown-menu w-xl"
|
|
};
|
|
var _hoisted_7 = {
|
|
"class": "panel bg-white"
|
|
};
|
|
var _hoisted_8 = {
|
|
"class": "list-group no-radius"
|
|
};
|
|
|
|
var _hoisted_9 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode)("<span class=\"pull-left thumb-sm\"><i class=\"fa fa-bullhorn fa-2x text-danger\"></i></span><span class=\"block m-b-none\"><span><span class=\"text-danger pull-right-xs\">0</span> 条未读公告</span><br><small class=\"text-muted text-xs\">点击阅读</small></span>", 2);
|
|
|
|
var _hoisted_11 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode)("<span class=\"pull-left thumb-sm\"><i class=\"fa fa-envelope-o fa-2x text-success\"></i></span><span class=\"block m-b-none\"><span><span class=\"text-danger pull-right-xs\">2</span> 条未读邮件</span><br><small class=\"text-muted text-xs\">点击阅读</small></span>", 2);
|
|
|
|
var _hoisted_13 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": "pull-left thumb-sm"
|
|
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-bell-o fa-2x text-info"
|
|
})], -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_14 = {
|
|
"class": "block m-b-none"
|
|
};
|
|
var _hoisted_15 = {
|
|
"class": "text-danger pull-right-xs"
|
|
};
|
|
|
|
var _hoisted_16 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 条未读通知");
|
|
|
|
var _hoisted_17 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("br", null, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_18 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": "text-muted text-xs"
|
|
}, "点击阅读", -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_19 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": "panel-footer text-sm"
|
|
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "#",
|
|
"class": "pull-right"
|
|
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-cog"
|
|
})]), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "#"
|
|
}, "提醒设置")], -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_20 = {
|
|
"class": "dropdown"
|
|
};
|
|
var _hoisted_21 = {
|
|
href: "javascript:;",
|
|
"data-toggle": "dropdown",
|
|
"class": "dropdown-toggle clear hidden-xs"
|
|
};
|
|
var _hoisted_22 = {
|
|
"class": "thumb-xs avatar m-t-n-sm m-b-n-sm m-r-sm"
|
|
};
|
|
|
|
var _hoisted_23 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "on md b-white bottom"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_24 = {
|
|
"class": "hidden-sm hidden-md"
|
|
};
|
|
|
|
var _hoisted_25 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)();
|
|
|
|
var _hoisted_26 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("b", {
|
|
"class": "caret"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_27 = {
|
|
"class": "dropdown-menu animated fadeInRight"
|
|
};
|
|
|
|
var _hoisted_28 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", null, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "javascript:;",
|
|
"data-toggle": "addtab",
|
|
"data-url": "user/profile/index",
|
|
"data-id": "02",
|
|
"data-name": "个人资料"
|
|
}, "个人资料")], -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_29 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", {
|
|
"class": "divider"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("ul", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": [_ctx.countTotal > 0 ? 'pulse' : 'hidden']
|
|
}, null, 2
|
|
/* CLASS */
|
|
)]), _hoisted_5]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "#",
|
|
"class": [_ctx.countArticle > 0 ? 'list-group-item' : 'hidden']
|
|
}, [_hoisted_9], 2
|
|
/* CLASS */
|
|
), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "#",
|
|
"class": [_ctx.countMail > 0 ? 'list-group-item' : 'hidden']
|
|
}, [_hoisted_11], 2
|
|
/* CLASS */
|
|
), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "#",
|
|
"class": [_ctx.countNotification > 0 ? 'list-group-item' : 'hidden'],
|
|
"data-toggle": "addtab",
|
|
"data-url": "user/message/index",
|
|
"data-id": "00",
|
|
"data-name": "通知提醒"
|
|
}, [_hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.countNotification), 1
|
|
/* TEXT */
|
|
), _hoisted_16]), _hoisted_17, _hoisted_18])], 2
|
|
/* CLASS */
|
|
)]), _hoisted_19])])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("img", {
|
|
src: _ctx.user.avatar,
|
|
"class": "img-circle"
|
|
}, null, 8
|
|
/* PROPS */
|
|
, ["src"]), _hoisted_23]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", _hoisted_24, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.user.name), 1
|
|
/* TEXT */
|
|
), _hoisted_25, _hoisted_26]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" dropdown "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("ul", _hoisted_27, [_hoisted_28, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: "javascript:;",
|
|
onClick: _cache[1] || (_cache[1] = function () {
|
|
return _ctx.support && _ctx.support.apply(_ctx, arguments);
|
|
})
|
|
}, "关于")]), _hoisted_29, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
href: _ctx.url('user/auth/logout')
|
|
}, "退出", 8
|
|
/* PROPS */
|
|
, ["href"])])])])]);
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true":
|
|
/*!************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true ***!
|
|
\************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "render": () => (/* binding */ render)
|
|
/* harmony export */ });
|
|
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
|
|
var _withId = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.withScopeId)("data-v-2f0acfdb");
|
|
|
|
(0,vue__WEBPACK_IMPORTED_MODULE_0__.pushScopeId)("data-v-2f0acfdb");
|
|
|
|
var _hoisted_1 = {
|
|
key: 0,
|
|
"class": "panel-heading tabs-box"
|
|
};
|
|
var _hoisted_2 = {
|
|
"class": "nav nav-tabs"
|
|
};
|
|
var _hoisted_3 = {
|
|
"class": "wrapper-xs"
|
|
};
|
|
var _hoisted_4 = {
|
|
"class": "pull-right"
|
|
};
|
|
|
|
var _hoisted_5 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-trash"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_6 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "icon icon-plus"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_7 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 新建");
|
|
|
|
var _hoisted_8 = {
|
|
"class": "btn-group btn-l-line"
|
|
};
|
|
|
|
var _hoisted_9 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
"class": "btn btn-info btn-sm",
|
|
"data-toggle": "dropdown",
|
|
"aria-expanded": "false"
|
|
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-bars"
|
|
}), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 操作 "), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": "caret"
|
|
})], -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_10 = {
|
|
"class": "dropdown-menu"
|
|
};
|
|
var _hoisted_11 = {
|
|
key: 0,
|
|
"class": "divider"
|
|
};
|
|
var _hoisted_12 = {
|
|
key: 1
|
|
};
|
|
|
|
var _hoisted_13 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "'fa ' + button.icon"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_14 = {
|
|
"class": "visible-xs"
|
|
};
|
|
var _hoisted_15 = {
|
|
"class": "btn-group btn-l-line"
|
|
};
|
|
|
|
var _hoisted_16 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-search"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_17 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 搜索");
|
|
|
|
var _hoisted_18 = {
|
|
"class": "form-group search-group btn-l-line"
|
|
};
|
|
var _hoisted_19 = {
|
|
name: "field_0",
|
|
id: "search-field-0",
|
|
"class": "form-control input-sm"
|
|
};
|
|
|
|
var _hoisted_20 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("option", {
|
|
"data-type": "empty",
|
|
value: ""
|
|
}, "筛选条件", -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_21 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": "form-group btn-l-line",
|
|
style: {
|
|
"display": "none"
|
|
}
|
|
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("select", {
|
|
name: "condition_0",
|
|
id: "search-condition-0",
|
|
"class": "form-control input-sm"
|
|
})], -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_22 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": "form-group btn-l-line",
|
|
id: "search-value-0"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_23 = {
|
|
"class": "btn-group btn-l-line"
|
|
};
|
|
|
|
var _hoisted_24 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode)("<button id=\"search-submit\" type=\"submit\" class=\"btn btn-sm btn-default\" data-v-2f0acfdb><i class=\"fa fa-search\" data-v-2f0acfdb></i> 搜索</button><button type=\"button\" class=\"btn btn-default btn-sm dropdown-toggle\" data-toggle=\"dropdown\" data-v-2f0acfdb><span class=\"caret\" data-v-2f0acfdb></span><span class=\"sr-only\" data-v-2f0acfdb>Toggle Dropdown</span></button>", 2);
|
|
|
|
var _hoisted_26 = {
|
|
"class": "dropdown-menu text-xs",
|
|
role: "menu"
|
|
};
|
|
|
|
var _hoisted_27 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-search"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_28 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 高级搜索");
|
|
|
|
var _hoisted_29 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": "fa fa-search"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_30 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 筛选");
|
|
|
|
var _hoisted_31 = {
|
|
key: 3,
|
|
"class": "btn-group btn-l-line",
|
|
role: "group"
|
|
};
|
|
var _hoisted_32 = {
|
|
type: "button",
|
|
"class": "btn btn-sm btn-default dropdown-toggle",
|
|
"data-toggle": "dropdown",
|
|
"aria-haspopup": "true",
|
|
"aria-expanded": "false"
|
|
};
|
|
|
|
var _hoisted_33 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": "fa fa-filter"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_34 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", {
|
|
"class": "caret"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
var _hoisted_35 = {
|
|
"class": "dropdown-menu",
|
|
role: "menu"
|
|
};
|
|
var _hoisted_36 = {
|
|
key: 0,
|
|
"class": "divider"
|
|
};
|
|
var _hoisted_37 = {
|
|
style: {
|
|
"display": "none"
|
|
}
|
|
};
|
|
var _hoisted_38 = {
|
|
"class": "wrapper-xs1 search-form-advanced"
|
|
};
|
|
var _hoisted_39 = {
|
|
"class": "row"
|
|
};
|
|
var _hoisted_40 = {
|
|
key: 0,
|
|
"class": "wrapper-xs"
|
|
};
|
|
var _hoisted_41 = {
|
|
"class": "form-group"
|
|
};
|
|
var _hoisted_42 = {
|
|
"class": "control-label col-xs-3"
|
|
};
|
|
var _hoisted_43 = {
|
|
"class": "col-xs-2"
|
|
};
|
|
var _hoisted_44 = {
|
|
"class": "form-group",
|
|
style: {
|
|
"display": "none"
|
|
}
|
|
};
|
|
var _hoisted_45 = {
|
|
"class": "col-xs-7"
|
|
};
|
|
|
|
var _hoisted_46 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": "clearfix"
|
|
}, null, -1
|
|
/* HOISTED */
|
|
);
|
|
|
|
(0,vue__WEBPACK_IMPORTED_MODULE_0__.popScopeId)();
|
|
|
|
var render = /*#__PURE__*/_withId(function (_ctx, _cache, $props, $setup, $data, $options) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [_ctx.header.tabs.items.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("ul", _hoisted_2, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.tabs.items, function (tab) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("li", {
|
|
"class": _ctx.header.tabs.active == tab.value ? 'active' : ''
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
"class": "text-sm",
|
|
onClick: function onClick($event) {
|
|
return _ctx.tabBtn(tab);
|
|
}
|
|
}, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(tab.name), 9
|
|
/* TEXT, PROPS */
|
|
, ["onClick"])], 2
|
|
/* CLASS */
|
|
);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_4, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.right_buttons, function (button) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [button.display ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("a", {
|
|
key: 0,
|
|
onClick: function onClick($event) {
|
|
return _ctx.linkBtn(button);
|
|
},
|
|
"class": 'btn btn-sm btn-r-line btn-' + button.color
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": 'fa ' + button.icon
|
|
}, null, 2
|
|
/* CLASS */
|
|
), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(button.name), 1
|
|
/* TEXT */
|
|
)], 10
|
|
/* CLASS, PROPS */
|
|
, ["onClick"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)], 64
|
|
/* STABLE_FRAGMENT */
|
|
);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
)), _ctx.header.trash_btn ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("a", {
|
|
key: 0,
|
|
onClick: _cache[1] || (_cache[1] = function ($event) {
|
|
return _ctx.actBtn('trash');
|
|
}),
|
|
"class": 'btn btn-sm btn-r-line btn-default ' + (_ctx.header.search_form.query.by == 'trash' ? 'active' : '')
|
|
}, [_hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)("回收站 (" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.header.trash_count) + ")", 1
|
|
/* TEXT */
|
|
)], 2
|
|
/* CLASS */
|
|
)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]), _ctx.header.access.create && _ctx.header.create_btn ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("a", {
|
|
key: 0,
|
|
onClick: _cache[2] || (_cache[2] = function ($event) {
|
|
return _ctx.actBtn('create');
|
|
}),
|
|
"class": "btn btn-sm btn-l-line btn-success hinted",
|
|
title: '新建' + _ctx.header.name
|
|
}, [_hoisted_6, _hoisted_7], 8
|
|
/* PROPS */
|
|
, ["title"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_8, [_hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("ul", _hoisted_10, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.center_buttons, function (button) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [button.action == 'divider' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("li", _hoisted_11)) : button.display == 1 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("li", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
onClick: function onClick($event) {
|
|
return _ctx.linkBtn(button);
|
|
}
|
|
}, [_hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(button.name), 1
|
|
/* TEXT */
|
|
)], 8
|
|
/* PROPS */
|
|
, ["onClick"])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)], 64
|
|
/* STABLE_FRAGMENT */
|
|
);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
))])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("span", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
onClick: _cache[3] || (_cache[3] = function ($event) {
|
|
return _ctx.actBtn('filter');
|
|
}),
|
|
"class": "btn btn-sm btn-default"
|
|
}, [_hoisted_16, _hoisted_17])])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 简单搜索表单 "), _ctx.header.search_form.simple_search ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("form", {
|
|
key: 1,
|
|
id: _ctx.header.table + '-search-form',
|
|
"class": "search-inline-form form-inline hidden-xs",
|
|
name: "mysearch",
|
|
method: "get"
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("select", _hoisted_19, [_hoisted_20, ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.search_form.columns, function (column) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("option", {
|
|
"data-type": column.form_type,
|
|
"data-title": column.name,
|
|
value: column.field
|
|
}, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(column.name), 9
|
|
/* TEXT, PROPS */
|
|
, ["data-type", "data-title", "value"]);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
))])]), _hoisted_21, _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_23, [_hoisted_24, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("ul", _hoisted_26, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("li", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
onClick: _cache[4] || (_cache[4] = function ($event) {
|
|
return _ctx.actBtn('filter');
|
|
})
|
|
}, [_hoisted_27, _hoisted_28])])])])], 8
|
|
/* PROPS */
|
|
, ["id"])) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("a", {
|
|
key: 2,
|
|
"class": "btn btn-sm btn-l-line btn-default",
|
|
onClick: _cache[5] || (_cache[5] = function ($event) {
|
|
return _ctx.actBtn('filter');
|
|
})
|
|
}, [_hoisted_29, _hoisted_30])), _ctx.header.bys.items.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", _hoisted_31, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("button", _hoisted_32, [_hoisted_33, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.header.bys.name) + " ", 1
|
|
/* TEXT */
|
|
), _hoisted_34]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("ul", _hoisted_35, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.bys.items, function (item) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [item.value == 'divider' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("li", _hoisted_36)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("li", {
|
|
key: 1,
|
|
"class": item.value == _ctx.header.bys.active ? 'active' : ''
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("a", {
|
|
onClick: function onClick($event) {
|
|
return _ctx.byBtn(item);
|
|
}
|
|
}, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.name), 9
|
|
/* TEXT, PROPS */
|
|
, ["onClick"])], 2
|
|
/* CLASS */
|
|
))], 64
|
|
/* STABLE_FRAGMENT */
|
|
);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.left_buttons, function (button) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [button.display == 1 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("a", {
|
|
key: 0,
|
|
onClick: function onClick($event) {
|
|
return _ctx.linkBtn(button);
|
|
},
|
|
"class": 'btn btn-sm btn-l-line btn-' + button.color
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("i", {
|
|
"class": 'fa ' + button.icon
|
|
}, null, 2
|
|
/* CLASS */
|
|
), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(button.name), 1
|
|
/* TEXT */
|
|
)], 10
|
|
/* CLASS, PROPS */
|
|
, ["onClick"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)], 64
|
|
/* STABLE_FRAGMENT */
|
|
);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_37, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("form", {
|
|
id: _ctx.header.table + '-search-form-advanced',
|
|
"class": "search-form",
|
|
method: "get"
|
|
}, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_38, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_39, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.header.search_form.columns, function (column, i) {
|
|
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [column.form_type != 'text2' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)("div", _hoisted_40, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_41, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("label", _hoisted_42, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(column.name), 1
|
|
/* TEXT */
|
|
), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("\r\n if (is_array($column['form_type'])) {\r\n $_type = $column['form_type'][0];\r\n } else {\r\n $_type = $column['form_type'];\r\n }\r\n "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("input", {
|
|
type: "hidden",
|
|
name: 'field_' + i,
|
|
id: 'advanced-search-field-' + i,
|
|
"data-title": column.name,
|
|
"data-type": column.form_type,
|
|
value: column.field
|
|
}, null, 8
|
|
/* PROPS */
|
|
, ["name", "id", "data-title", "data-type", "value"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_43, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_44, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("select", {
|
|
name: 'condition_' + i,
|
|
id: 'advanced-search-condition-' + i,
|
|
"class": "form-control input-sm"
|
|
}, null, 8
|
|
/* PROPS */
|
|
, ["name", "id"])])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_45, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", {
|
|
"class": "form-group",
|
|
id: 'advanced-search-value-' + i
|
|
}, null, 8
|
|
/* PROPS */
|
|
, ["id"])]), _hoisted_46])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)], 64
|
|
/* STABLE_FRAGMENT */
|
|
);
|
|
}), 256
|
|
/* UNKEYED_FRAGMENT */
|
|
))])])], 8
|
|
/* PROPS */
|
|
, ["id"])])])], 64
|
|
/* STABLE_FRAGMENT */
|
|
);
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/bootstrap.js":
|
|
/*!***********************************!*\
|
|
!*** ./resources/js/bootstrap.js ***!
|
|
\***********************************/
|
|
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
window._ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
|
|
/**
|
|
* We'll load jQuery and the Bootstrap jQuery plugin which provides support
|
|
* for JavaScript based Bootstrap features such as modals and tabs. This
|
|
* code may be modified to fit the specific needs of your application.
|
|
*/
|
|
|
|
try {// window.$ = window.jQuery = require('jquery');
|
|
// require('bootstrap');
|
|
} catch (e) {}
|
|
/**
|
|
* We'll load the axios HTTP library which allows us to easily issue requests
|
|
* to our Laravel back-end. This library automatically handles sending the
|
|
* CSRF token as a header based on the value of the "XSRF" token cookie.
|
|
*/
|
|
|
|
|
|
window.axios = __webpack_require__(/*! axios */ "./node_modules/axios/index.js");
|
|
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
|
/**
|
|
* Next we will register the CSRF Token as a common header with Axios so that
|
|
* all outgoing HTTP requests automatically have it attached. This is just
|
|
* a simple convenience so we don't have to attach every token manually.
|
|
*/
|
|
|
|
/*
|
|
let token = document.head.querySelector('meta[name="csrf-token"]');
|
|
|
|
if (token) {
|
|
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
|
|
} else {
|
|
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* Echo exposes an expressive API for subscribing to channels and listening
|
|
* for events that are broadcast by Laravel. Echo and event broadcasting
|
|
* allows your team to easily build robust real-time web applications.
|
|
*/
|
|
|
|
/*
|
|
import Echo from 'laravel-echo'
|
|
window.Pusher = require('pusher-js');
|
|
|
|
window.Echo = new Echo({
|
|
broadcaster: 'pusher',
|
|
key: process.env.MIX_PUSHER_APP_KEY,
|
|
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
|
|
encrypted: true
|
|
});
|
|
*/
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue2-datepicker/index.css":
|
|
/*!********************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue2-datepicker/index.css ***!
|
|
\********************************************************************************************************************************************************************************/
|
|
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
|
|
/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
// Imports
|
|
|
|
var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});
|
|
// Module
|
|
___CSS_LOADER_EXPORT___.push([module.id, ".mx-icon-left:before,.mx-icon-right:before,.mx-icon-double-left:before,.mx-icon-double-right:before,.mx-icon-double-left:after,.mx-icon-double-right:after{content:\"\";position:relative;top:-1px;display:inline-block;width:10px;height:10px;vertical-align:middle;border-style:solid;border-color:currentColor;border-width:2px 0 0 2px;border-radius:1px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate(-45deg) scale(0.7);transform:rotate(-45deg) scale(0.7)}.mx-icon-double-left:after{left:-4px}.mx-icon-double-right:before{left:4px}.mx-icon-right:before,.mx-icon-double-right:before,.mx-icon-double-right:after{-webkit-transform:rotate(135deg) scale(0.7);transform:rotate(135deg) scale(0.7)}.mx-btn{-webkit-box-sizing:border-box;box-sizing:border-box;line-height:1;font-size:14px;font-weight:500;padding:7px 15px;margin:0;cursor:pointer;background-color:transparent;outline:none;border:1px solid rgba(0,0,0,.1);border-radius:4px;color:#73879c;white-space:nowrap}.mx-btn:hover{border-color:#1284e7;color:#1284e7}.mx-btn-text{border:0;padding:0 4px;text-align:left;line-height:inherit}.mx-scrollbar{height:100%}.mx-scrollbar:hover .mx-scrollbar-track{opacity:1}.mx-scrollbar-wrap{height:100%;overflow-x:hidden;overflow-y:auto}.mx-scrollbar-track{position:absolute;top:2px;right:2px;bottom:2px;width:6px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity .24s ease-out;transition:opacity .24s ease-out}.mx-scrollbar-track .mx-scrollbar-thumb{position:absolute;width:100%;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:background-color .3s;transition:background-color .3s}.mx-zoom-in-down-enter-active,.mx-zoom-in-down-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(0.23, 1, 0.32, 1),-webkit-transform .3s cubic-bezier(0.23, 1, 0.32, 1);transition:opacity .3s cubic-bezier(0.23, 1, 0.32, 1),-webkit-transform .3s cubic-bezier(0.23, 1, 0.32, 1);transition:transform .3s cubic-bezier(0.23, 1, 0.32, 1),opacity .3s cubic-bezier(0.23, 1, 0.32, 1);transition:transform .3s cubic-bezier(0.23, 1, 0.32, 1),opacity .3s cubic-bezier(0.23, 1, 0.32, 1),-webkit-transform .3s cubic-bezier(0.23, 1, 0.32, 1);-webkit-transform-origin:center top;transform-origin:center top}.mx-zoom-in-down-enter,.mx-zoom-in-down-enter-from,.mx-zoom-in-down-leave-to{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.mx-datepicker{position:relative;display:inline-block;width:210px}.mx-datepicker svg{width:1em;height:1em;vertical-align:-0.15em;fill:currentColor;overflow:hidden}.mx-datepicker-range{width:320px}.mx-datepicker-inline{width:auto}.mx-input-wrapper{position:relative}.mx-input-wrapper .mx-icon-clear{display:none}.mx-input-wrapper:hover .mx-icon-clear{display:block}.mx-input-wrapper:hover .mx-icon-clear+.mx-icon-calendar{display:none}.mx-input{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:34px;padding:6px 30px;padding-left:10px;font-size:14px;line-height:1.4;color:#555;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.mx-input:hover,.mx-input:focus{border-color:#409aff}.mx-input:disabled,.mx-input.disabled{color:#ccc;background-color:#f3f3f3;border-color:#ccc;cursor:not-allowed}.mx-input:focus{outline:none}.mx-input::-ms-clear{display:none}.mx-icon-calendar,.mx-icon-clear{position:absolute;top:50%;right:8px;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:16px;line-height:1;color:rgba(0,0,0,.5);vertical-align:middle}.mx-icon-clear{cursor:pointer}.mx-icon-clear:hover{color:rgba(0,0,0,.8)}.mx-datepicker-main{font:14px/1.5 \"Helvetica Neue\",Helvetica,Arial,\"Microsoft Yahei\",sans-serif;color:#73879c;background-color:#fff;border:1px solid #e8e8e8}.mx-datepicker-popup{position:absolute;margin-top:1px;margin-bottom:1px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);z-index:2001}.mx-datepicker-sidebar{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;width:100px;padding:6px;overflow:auto}.mx-datepicker-sidebar+.mx-datepicker-content{margin-left:100px;border-left:1px solid #e8e8e8}.mx-datepicker-body{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mx-btn-shortcut{display:block;padding:0 6px;line-height:24px}.mx-range-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}@media(max-width: 750px){.mx-range-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.mx-datepicker-header{padding:6px 8px;border-bottom:1px solid #e8e8e8}.mx-datepicker-footer{padding:6px 8px;text-align:right;border-top:1px solid #e8e8e8}.mx-calendar{-webkit-box-sizing:border-box;box-sizing:border-box;width:248px;padding:6px 12px}.mx-calendar+.mx-calendar{border-left:1px solid #e8e8e8}.mx-calendar-header,.mx-time-header{-webkit-box-sizing:border-box;box-sizing:border-box;height:34px;line-height:34px;text-align:center;overflow:hidden}.mx-btn-icon-left,.mx-btn-icon-double-left{float:left}.mx-btn-icon-right,.mx-btn-icon-double-right{float:right}.mx-calendar-header-label{font-size:14px}.mx-calendar-decade-separator{margin:0 2px}.mx-calendar-decade-separator:after{content:\"~\"}.mx-calendar-content{position:relative;height:224px;-webkit-box-sizing:border-box;box-sizing:border-box}.mx-calendar-content .cell{cursor:pointer}.mx-calendar-content .cell:hover{color:#73879c;background-color:#f3f9fe}.mx-calendar-content .cell.active{color:#fff;background-color:#1284e7}.mx-calendar-content .cell.in-range,.mx-calendar-content .cell.hover-in-range{color:#73879c;background-color:#dbedfb}.mx-calendar-content .cell.disabled{cursor:not-allowed;color:#ccc;background-color:#f3f3f3}.mx-calendar-week-mode .mx-date-row{cursor:pointer}.mx-calendar-week-mode .mx-date-row:hover{background-color:#f3f9fe}.mx-calendar-week-mode .mx-date-row.mx-active-week{background-color:#dbedfb}.mx-calendar-week-mode .mx-date-row .cell:hover{color:inherit;background-color:transparent}.mx-calendar-week-mode .mx-date-row .cell.active{color:inherit;background-color:transparent}.mx-week-number{opacity:.5}.mx-table{table-layout:fixed;border-collapse:separate;border-spacing:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center}.mx-table th{padding:0;font-weight:500;vertical-align:middle}.mx-table td{padding:0;vertical-align:middle}.mx-table-date td,.mx-table-date th{height:32px;font-size:12px}.mx-table-date .today{color:#2a90e9}.mx-table-date .cell.not-current-month{color:#ccc;background:none}.mx-time{-webkit-box-flex:1;-ms-flex:1;flex:1;width:224px;background:#fff}.mx-time+.mx-time{border-left:1px solid #e8e8e8}.mx-calendar-time{position:absolute;top:0;left:0;width:100%;height:100%}.mx-time-header{border-bottom:1px solid #e8e8e8}.mx-time-content{height:224px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.mx-time-columns{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;height:100%;overflow:hidden}.mx-time-column{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;border-left:1px solid #e8e8e8;text-align:center}.mx-time-column:first-child{border-left:0}.mx-time-column .mx-time-list{margin:0;padding:0;list-style:none}.mx-time-column .mx-time-list::after{content:\"\";display:block;height:192px}.mx-time-column .mx-time-item{cursor:pointer;font-size:12px;height:32px;line-height:32px}.mx-time-column .mx-time-item:hover{color:#73879c;background-color:#f3f9fe}.mx-time-column .mx-time-item.active{color:#1284e7;background-color:transparent;font-weight:700}.mx-time-column .mx-time-item.disabled{cursor:not-allowed;color:#ccc;background-color:#f3f3f3}.mx-time-option{cursor:pointer;padding:8px 10px;font-size:14px;line-height:20px}.mx-time-option:hover{color:#73879c;background-color:#f3f9fe}.mx-time-option.active{color:#1284e7;background-color:transparent;font-weight:700}.mx-time-option.disabled{cursor:not-allowed;color:#ccc;background-color:#f3f3f3}\n", ""]);
|
|
// Exports
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css":
|
|
/*!***********************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css ***!
|
|
\***********************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
|
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
// Imports
|
|
|
|
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});
|
|
// Module
|
|
___CSS_LOADER_EXPORT___.push([module.id, "\n.af-draggable {\r\n min-height: 40px;\r\n padding: 0;\r\n float: left;\r\n width: 100%;\n}\n.af-component {\r\n padding: 5px;\r\n padding-bottom: 0;\r\n padding-right: 0;\n}\n.af-item-component {\r\n border: 1px dashed #ccc;\r\n margin-bottom: 5px;\r\n cursor: move;\r\n float: left;\r\n position: relative;\n}\n.af-item {\r\n float: left;\r\n margin-right: 5px;\n}\n.af-panel-component {\r\n color: #aaa;\r\n padding: 5px;\r\n padding-bottom: 0;\n}\n.af-item:not(.af-item-component) {\r\n padding-bottom: 5px;\n}\n.af-panel:not(.af-panel-component) {\r\n position: relative;\r\n padding: 5px;\r\n padding-right: 5px;\r\n background-color: #eee;\r\n border: 1px solid transparent;\r\n cursor: move;\n}\n.af-item-component.af-item-active {\r\n border: 1px dashed #409eff;\n}\n.af-item-active:not(.af-item-component) .af-panel {\r\n background: #f6f7ff;\r\n border: 1px dashed #409eff;\r\n color: #409eff;\n}\n.af-item-label {\r\n width: 150px;\r\n text-align: right;\r\n float: left;\r\n line-height: 28px;\r\n vertical-align: middle;\r\n padding: 0 10px 0 0;\r\n font-weight: normal;\n}\n.af-item-control {\r\n margin-left: 150px;\n}\n.af-panel .fa {\r\n display: none;\r\n text-align: center;\r\n border: 1px solid #409eff;\r\n background: #fff;\r\n z-index: 999;\n}\n.af-item-active > .af-panel .fa {\r\n display: inline-block;\r\n position: absolute;\r\n top: -5px;\r\n right: 5px;\r\n color: #409eff;\r\n padding: 3px 5px;\n}\n.af-item-active .fa:hover {\r\n background: #409eff;\r\n color: #fff;\n}\n.af-left-group-item.af-ghost,\r\n.af-panel-component.af-ghost .af-panel {\r\n border: 1px dashed #409eff;\r\n color: #409eff;\n}\n.af-left-group-item.af-ghost {\r\n float: left;\r\n margin: 0;\r\n margin-bottom: 5px;\r\n width:calc(100% - 5px);\n}\n.af-table-component {\r\n overflow: hidden;\r\n overflow-x: auto;\r\n white-space: nowrap;\n}\n.af-table-component .af-item { \r\n float: none;\r\n display: inline-block;\n}\n.af-table-component .af-item-label {\r\n width: auto;\r\n float: none;\r\n text-align: left;\r\n line-height: inherit;\n}\n.af-table-component .af-item-control {\r\n margin-left: 0;\n}\n.af-table-component .af-ghost {\r\n width: 200px;\n}\r\n\r\n", ""]);
|
|
// Exports
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css":
|
|
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css ***!
|
|
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
|
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
// Imports
|
|
|
|
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});
|
|
// Module
|
|
___CSS_LOADER_EXPORT___.push([module.id, "\n.btn-r-line[data-v-2f0acfdb] {\r\n margin-left: 4px;\n}\n.btn-l-line[data-v-2f0acfdb] {\r\n margin-right: 4px;\n}\r\n", ""]);
|
|
// Exports
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/css-loader/dist/runtime/api.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/css-loader/dist/runtime/api.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
Author Tobias Koppers @sokra
|
|
*/
|
|
// css base code, injected by the css-loader
|
|
// eslint-disable-next-line func-names
|
|
module.exports = function (cssWithMappingToString) {
|
|
var list = []; // return the list of modules as css string
|
|
|
|
list.toString = function toString() {
|
|
return this.map(function (item) {
|
|
var content = cssWithMappingToString(item);
|
|
|
|
if (item[2]) {
|
|
return "@media ".concat(item[2], " {").concat(content, "}");
|
|
}
|
|
|
|
return content;
|
|
}).join("");
|
|
}; // import a list of modules into the list
|
|
// eslint-disable-next-line func-names
|
|
|
|
|
|
list.i = function (modules, mediaQuery, dedupe) {
|
|
if (typeof modules === "string") {
|
|
// eslint-disable-next-line no-param-reassign
|
|
modules = [[null, modules, ""]];
|
|
}
|
|
|
|
var alreadyImportedModules = {};
|
|
|
|
if (dedupe) {
|
|
for (var i = 0; i < this.length; i++) {
|
|
// eslint-disable-next-line prefer-destructuring
|
|
var id = this[i][0];
|
|
|
|
if (id != null) {
|
|
alreadyImportedModules[id] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var _i = 0; _i < modules.length; _i++) {
|
|
var item = [].concat(modules[_i]);
|
|
|
|
if (dedupe && alreadyImportedModules[item[0]]) {
|
|
// eslint-disable-next-line no-continue
|
|
continue;
|
|
}
|
|
|
|
if (mediaQuery) {
|
|
if (!item[2]) {
|
|
item[2] = mediaQuery;
|
|
} else {
|
|
item[2] = "".concat(mediaQuery, " and ").concat(item[2]);
|
|
}
|
|
}
|
|
|
|
list.push(item);
|
|
}
|
|
};
|
|
|
|
return list;
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/date-format-parse/es/format.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/date-format-parse/es/format.js ***!
|
|
\*****************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "format": () => (/* binding */ format)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./node_modules/date-format-parse/es/util.js");
|
|
/* harmony import */ var _locale_en__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./locale/en */ "./node_modules/date-format-parse/es/locale/en.js");
|
|
|
|
|
|
var REGEX_FORMAT = /\[([^\]]+)]|YYYY|YY?|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|Z{1,2}|S{1,3}|w{1,2}|x|X|a|A/g;
|
|
|
|
function pad(val) {
|
|
var len = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
|
|
var output = "".concat(Math.abs(val));
|
|
var sign = val < 0 ? '-' : '';
|
|
|
|
while (output.length < len) {
|
|
output = "0".concat(output);
|
|
}
|
|
|
|
return sign + output;
|
|
}
|
|
|
|
function getOffset(date) {
|
|
return Math.round(date.getTimezoneOffset() / 15) * 15;
|
|
}
|
|
|
|
function formatTimezone(offset) {
|
|
var delimeter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
var sign = offset > 0 ? '-' : '+';
|
|
var absOffset = Math.abs(offset);
|
|
var hours = Math.floor(absOffset / 60);
|
|
var minutes = absOffset % 60;
|
|
return sign + pad(hours, 2) + delimeter + pad(minutes, 2);
|
|
}
|
|
|
|
var meridiem = function meridiem(h, _, isLowercase) {
|
|
var word = h < 12 ? 'AM' : 'PM';
|
|
return isLowercase ? word.toLocaleLowerCase() : word;
|
|
};
|
|
|
|
var formatFlags = {
|
|
Y: function Y(date) {
|
|
var y = date.getFullYear();
|
|
return y <= 9999 ? "".concat(y) : "+".concat(y);
|
|
},
|
|
// Year: 00, 01, ..., 99
|
|
YY: function YY(date) {
|
|
return pad(date.getFullYear(), 4).substr(2);
|
|
},
|
|
// Year: 1900, 1901, ..., 2099
|
|
YYYY: function YYYY(date) {
|
|
return pad(date.getFullYear(), 4);
|
|
},
|
|
// Month: 1, 2, ..., 12
|
|
M: function M(date) {
|
|
return date.getMonth() + 1;
|
|
},
|
|
// Month: 01, 02, ..., 12
|
|
MM: function MM(date) {
|
|
return pad(date.getMonth() + 1, 2);
|
|
},
|
|
MMM: function MMM(date, locale) {
|
|
return locale.monthsShort[date.getMonth()];
|
|
},
|
|
MMMM: function MMMM(date, locale) {
|
|
return locale.months[date.getMonth()];
|
|
},
|
|
// Day of month: 1, 2, ..., 31
|
|
D: function D(date) {
|
|
return date.getDate();
|
|
},
|
|
// Day of month: 01, 02, ..., 31
|
|
DD: function DD(date) {
|
|
return pad(date.getDate(), 2);
|
|
},
|
|
// Hour: 0, 1, ... 23
|
|
H: function H(date) {
|
|
return date.getHours();
|
|
},
|
|
// Hour: 00, 01, ..., 23
|
|
HH: function HH(date) {
|
|
return pad(date.getHours(), 2);
|
|
},
|
|
// Hour: 1, 2, ..., 12
|
|
h: function h(date) {
|
|
var hours = date.getHours();
|
|
|
|
if (hours === 0) {
|
|
return 12;
|
|
}
|
|
|
|
if (hours > 12) {
|
|
return hours % 12;
|
|
}
|
|
|
|
return hours;
|
|
},
|
|
// Hour: 01, 02, ..., 12
|
|
hh: function hh() {
|
|
var hours = formatFlags.h.apply(formatFlags, arguments);
|
|
return pad(hours, 2);
|
|
},
|
|
// Minute: 0, 1, ..., 59
|
|
m: function m(date) {
|
|
return date.getMinutes();
|
|
},
|
|
// Minute: 00, 01, ..., 59
|
|
mm: function mm(date) {
|
|
return pad(date.getMinutes(), 2);
|
|
},
|
|
// Second: 0, 1, ..., 59
|
|
s: function s(date) {
|
|
return date.getSeconds();
|
|
},
|
|
// Second: 00, 01, ..., 59
|
|
ss: function ss(date) {
|
|
return pad(date.getSeconds(), 2);
|
|
},
|
|
// 1/10 of second: 0, 1, ..., 9
|
|
S: function S(date) {
|
|
return Math.floor(date.getMilliseconds() / 100);
|
|
},
|
|
// 1/100 of second: 00, 01, ..., 99
|
|
SS: function SS(date) {
|
|
return pad(Math.floor(date.getMilliseconds() / 10), 2);
|
|
},
|
|
// Millisecond: 000, 001, ..., 999
|
|
SSS: function SSS(date) {
|
|
return pad(date.getMilliseconds(), 3);
|
|
},
|
|
// Day of week: 0, 1, ..., 6
|
|
d: function d(date) {
|
|
return date.getDay();
|
|
},
|
|
// Day of week: 'Su', 'Mo', ..., 'Sa'
|
|
dd: function dd(date, locale) {
|
|
return locale.weekdaysMin[date.getDay()];
|
|
},
|
|
// Day of week: 'Sun', 'Mon',..., 'Sat'
|
|
ddd: function ddd(date, locale) {
|
|
return locale.weekdaysShort[date.getDay()];
|
|
},
|
|
// Day of week: 'Sunday', 'Monday', ...,'Saturday'
|
|
dddd: function dddd(date, locale) {
|
|
return locale.weekdays[date.getDay()];
|
|
},
|
|
// AM, PM
|
|
A: function A(date, locale) {
|
|
var meridiemFunc = locale.meridiem || meridiem;
|
|
return meridiemFunc(date.getHours(), date.getMinutes(), false);
|
|
},
|
|
// am, pm
|
|
a: function a(date, locale) {
|
|
var meridiemFunc = locale.meridiem || meridiem;
|
|
return meridiemFunc(date.getHours(), date.getMinutes(), true);
|
|
},
|
|
// Timezone: -01:00, +00:00, ... +12:00
|
|
Z: function Z(date) {
|
|
return formatTimezone(getOffset(date), ':');
|
|
},
|
|
// Timezone: -0100, +0000, ... +1200
|
|
ZZ: function ZZ(date) {
|
|
return formatTimezone(getOffset(date));
|
|
},
|
|
// Seconds timestamp: 512969520
|
|
X: function X(date) {
|
|
return Math.floor(date.getTime() / 1000);
|
|
},
|
|
// Milliseconds timestamp: 512969520900
|
|
x: function x(date) {
|
|
return date.getTime();
|
|
},
|
|
w: function w(date, locale) {
|
|
return (0,_util__WEBPACK_IMPORTED_MODULE_0__.getWeek)(date, {
|
|
firstDayOfWeek: locale.firstDayOfWeek,
|
|
firstWeekContainsDate: locale.firstWeekContainsDate
|
|
});
|
|
},
|
|
ww: function ww(date, locale) {
|
|
return pad(formatFlags.w(date, locale), 2);
|
|
}
|
|
};
|
|
function format(val, str) {
|
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
var formatStr = str ? String(str) : 'YYYY-MM-DDTHH:mm:ss.SSSZ';
|
|
var date = (0,_util__WEBPACK_IMPORTED_MODULE_0__.toDate)(val);
|
|
|
|
if (!(0,_util__WEBPACK_IMPORTED_MODULE_0__.isValidDate)(date)) {
|
|
return 'Invalid Date';
|
|
}
|
|
|
|
var locale = options.locale || _locale_en__WEBPACK_IMPORTED_MODULE_1__.default;
|
|
return formatStr.replace(REGEX_FORMAT, function (match, p1) {
|
|
if (p1) {
|
|
return p1;
|
|
}
|
|
|
|
if (typeof formatFlags[match] === 'function') {
|
|
return "".concat(formatFlags[match](date, locale));
|
|
}
|
|
|
|
return match;
|
|
});
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/date-format-parse/es/index.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/date-format-parse/es/index.js ***!
|
|
\****************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "format": () => (/* reexport safe */ _format__WEBPACK_IMPORTED_MODULE_0__.format),
|
|
/* harmony export */ "parse": () => (/* reexport safe */ _parse__WEBPACK_IMPORTED_MODULE_1__.parse),
|
|
/* harmony export */ "isDate": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_2__.isDate),
|
|
/* harmony export */ "toDate": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_2__.toDate),
|
|
/* harmony export */ "isValidDate": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_2__.isValidDate),
|
|
/* harmony export */ "getWeek": () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_2__.getWeek)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _format__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./format */ "./node_modules/date-format-parse/es/format.js");
|
|
/* harmony import */ var _parse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parse */ "./node_modules/date-format-parse/es/parse.js");
|
|
/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "./node_modules/date-format-parse/es/util.js");
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/date-format-parse/es/locale/en.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/date-format-parse/es/locale/en.js ***!
|
|
\********************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
var locale = {
|
|
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
|
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
|
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
|
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
weekdaysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
|
firstDayOfWeek: 0,
|
|
firstWeekContainsDate: 1
|
|
};
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (locale);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/date-format-parse/es/parse.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/date-format-parse/es/parse.js ***!
|
|
\****************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "parse": () => (/* binding */ parse)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _locale_en__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./locale/en */ "./node_modules/date-format-parse/es/locale/en.js");
|
|
/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "./node_modules/date-format-parse/es/util.js");
|
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
|
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
|
|
|
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
|
|
|
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
|
|
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
|
|
|
|
|
var formattingTokens = /(\[[^\[]*\])|(MM?M?M?|Do|DD?|ddd?d?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|S{1,3}|x|X|ZZ?|.)/g;
|
|
var match1 = /\d/; // 0 - 9
|
|
|
|
var match2 = /\d\d/; // 00 - 99
|
|
|
|
var match3 = /\d{3}/; // 000 - 999
|
|
|
|
var match4 = /\d{4}/; // 0000 - 9999
|
|
|
|
var match1to2 = /\d\d?/; // 0 - 99
|
|
|
|
var matchShortOffset = /[+-]\d\d:?\d\d/; // +00:00 -00:00 +0000 or -0000
|
|
|
|
var matchSigned = /[+-]?\d+/; // -inf - inf
|
|
|
|
var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
|
|
// const matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; // Word
|
|
|
|
var YEAR = 'year';
|
|
var MONTH = 'month';
|
|
var DAY = 'day';
|
|
var HOUR = 'hour';
|
|
var MINUTE = 'minute';
|
|
var SECOND = 'second';
|
|
var MILLISECOND = 'millisecond';
|
|
var parseFlags = {};
|
|
|
|
var addParseFlag = function addParseFlag(token, regex, callback) {
|
|
var tokens = Array.isArray(token) ? token : [token];
|
|
var func;
|
|
|
|
if (typeof callback === 'string') {
|
|
func = function func(input) {
|
|
var value = parseInt(input, 10);
|
|
return _defineProperty({}, callback, value);
|
|
};
|
|
} else {
|
|
func = callback;
|
|
}
|
|
|
|
tokens.forEach(function (key) {
|
|
parseFlags[key] = [regex, func];
|
|
});
|
|
};
|
|
|
|
var escapeStringRegExp = function escapeStringRegExp(str) {
|
|
return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
|
|
};
|
|
|
|
var matchWordRegExp = function matchWordRegExp(localeKey) {
|
|
return function (locale) {
|
|
var array = locale[localeKey];
|
|
|
|
if (!Array.isArray(array)) {
|
|
throw new Error("Locale[".concat(localeKey, "] need an array"));
|
|
}
|
|
|
|
return new RegExp(array.map(escapeStringRegExp).join('|'));
|
|
};
|
|
};
|
|
|
|
var matchWordCallback = function matchWordCallback(localeKey, key) {
|
|
return function (input, locale) {
|
|
var array = locale[localeKey];
|
|
|
|
if (!Array.isArray(array)) {
|
|
throw new Error("Locale[".concat(localeKey, "] need an array"));
|
|
}
|
|
|
|
var index = array.indexOf(input);
|
|
|
|
if (index < 0) {
|
|
throw new Error('Invalid Word');
|
|
}
|
|
|
|
return _defineProperty({}, key, index);
|
|
};
|
|
};
|
|
|
|
addParseFlag('Y', matchSigned, YEAR);
|
|
addParseFlag('YY', match2, function (input) {
|
|
var year = new Date().getFullYear();
|
|
var cent = Math.floor(year / 100);
|
|
var value = parseInt(input, 10);
|
|
value = (value > 68 ? cent - 1 : cent) * 100 + value;
|
|
return _defineProperty({}, YEAR, value);
|
|
});
|
|
addParseFlag('YYYY', match4, YEAR);
|
|
addParseFlag('M', match1to2, function (input) {
|
|
return _defineProperty({}, MONTH, parseInt(input, 10) - 1);
|
|
});
|
|
addParseFlag('MM', match2, function (input) {
|
|
return _defineProperty({}, MONTH, parseInt(input, 10) - 1);
|
|
});
|
|
addParseFlag('MMM', matchWordRegExp('monthsShort'), matchWordCallback('monthsShort', MONTH));
|
|
addParseFlag('MMMM', matchWordRegExp('months'), matchWordCallback('months', MONTH));
|
|
addParseFlag('D', match1to2, DAY);
|
|
addParseFlag('DD', match2, DAY);
|
|
addParseFlag(['H', 'h'], match1to2, HOUR);
|
|
addParseFlag(['HH', 'hh'], match2, HOUR);
|
|
addParseFlag('m', match1to2, MINUTE);
|
|
addParseFlag('mm', match2, MINUTE);
|
|
addParseFlag('s', match1to2, SECOND);
|
|
addParseFlag('ss', match2, SECOND);
|
|
addParseFlag('S', match1, function (input) {
|
|
return _defineProperty({}, MILLISECOND, parseInt(input, 10) * 100);
|
|
});
|
|
addParseFlag('SS', match2, function (input) {
|
|
return _defineProperty({}, MILLISECOND, parseInt(input, 10) * 10);
|
|
});
|
|
addParseFlag('SSS', match3, MILLISECOND);
|
|
|
|
function matchMeridiem(locale) {
|
|
return locale.meridiemParse || /[ap]\.?m?\.?/i;
|
|
}
|
|
|
|
function defaultIsPM(input) {
|
|
return "".concat(input).toLowerCase().charAt(0) === 'p';
|
|
}
|
|
|
|
addParseFlag(['A', 'a'], matchMeridiem, function (input, locale) {
|
|
var isPM = typeof locale.isPM === 'function' ? locale.isPM(input) : defaultIsPM(input);
|
|
return {
|
|
isPM: isPM
|
|
};
|
|
});
|
|
|
|
function offsetFromString(str) {
|
|
var _ref8 = str.match(/([+-]|\d\d)/g) || ['-', '0', '0'],
|
|
_ref9 = _slicedToArray(_ref8, 3),
|
|
symbol = _ref9[0],
|
|
hour = _ref9[1],
|
|
minute = _ref9[2];
|
|
|
|
var minutes = parseInt(hour, 10) * 60 + parseInt(minute, 10);
|
|
|
|
if (minutes === 0) {
|
|
return 0;
|
|
}
|
|
|
|
return symbol === '+' ? -minutes : +minutes;
|
|
}
|
|
|
|
addParseFlag(['Z', 'ZZ'], matchShortOffset, function (input) {
|
|
return {
|
|
offset: offsetFromString(input)
|
|
};
|
|
});
|
|
addParseFlag('x', matchSigned, function (input) {
|
|
return {
|
|
date: new Date(parseInt(input, 10))
|
|
};
|
|
});
|
|
addParseFlag('X', matchTimestamp, function (input) {
|
|
return {
|
|
date: new Date(parseFloat(input) * 1000)
|
|
};
|
|
});
|
|
addParseFlag('d', match1, 'weekday');
|
|
addParseFlag('dd', matchWordRegExp('weekdaysMin'), matchWordCallback('weekdaysMin', 'weekday'));
|
|
addParseFlag('ddd', matchWordRegExp('weekdaysShort'), matchWordCallback('weekdaysShort', 'weekday'));
|
|
addParseFlag('dddd', matchWordRegExp('weekdays'), matchWordCallback('weekdays', 'weekday'));
|
|
addParseFlag('w', match1to2, 'week');
|
|
addParseFlag('ww', match2, 'week');
|
|
|
|
function to24hour(hour, isPM) {
|
|
if (hour !== undefined && isPM !== undefined) {
|
|
if (isPM) {
|
|
if (hour < 12) {
|
|
return hour + 12;
|
|
}
|
|
} else if (hour === 12) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return hour;
|
|
}
|
|
|
|
function getFullInputArray(input) {
|
|
var backupDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();
|
|
var result = [0, 0, 1, 0, 0, 0, 0];
|
|
var backupArr = [backupDate.getFullYear(), backupDate.getMonth(), backupDate.getDate(), backupDate.getHours(), backupDate.getMinutes(), backupDate.getSeconds(), backupDate.getMilliseconds()];
|
|
var useBackup = true;
|
|
|
|
for (var i = 0; i < 7; i++) {
|
|
if (input[i] === undefined) {
|
|
result[i] = useBackup ? backupArr[i] : result[i];
|
|
} else {
|
|
result[i] = input[i];
|
|
useBackup = false;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function createDate(y, m, d, h, M, s, ms) {
|
|
var date;
|
|
|
|
if (y < 100 && y >= 0) {
|
|
date = new Date(y + 400, m, d, h, M, s, ms);
|
|
|
|
if (isFinite(date.getFullYear())) {
|
|
date.setFullYear(y);
|
|
}
|
|
} else {
|
|
date = new Date(y, m, d, h, M, s, ms);
|
|
}
|
|
|
|
return date;
|
|
}
|
|
|
|
function createUTCDate() {
|
|
var date;
|
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
var y = args[0];
|
|
|
|
if (y < 100 && y >= 0) {
|
|
args[0] += 400;
|
|
date = new Date(Date.UTC.apply(Date, args)); // eslint-disable-next-line no-restricted-globals
|
|
|
|
if (isFinite(date.getUTCFullYear())) {
|
|
date.setUTCFullYear(y);
|
|
}
|
|
} else {
|
|
date = new Date(Date.UTC.apply(Date, args));
|
|
}
|
|
|
|
return date;
|
|
}
|
|
|
|
function makeParser(dateString, format, locale) {
|
|
var tokens = format.match(formattingTokens);
|
|
|
|
if (!tokens) {
|
|
throw new Error();
|
|
}
|
|
|
|
var length = tokens.length;
|
|
var mark = {};
|
|
|
|
for (var i = 0; i < length; i += 1) {
|
|
var token = tokens[i];
|
|
var parseTo = parseFlags[token];
|
|
|
|
if (!parseTo) {
|
|
var word = token.replace(/^\[|\]$/g, '');
|
|
|
|
if (dateString.indexOf(word) === 0) {
|
|
dateString = dateString.substr(word.length);
|
|
} else {
|
|
throw new Error('not match');
|
|
}
|
|
} else {
|
|
var regex = typeof parseTo[0] === 'function' ? parseTo[0](locale) : parseTo[0];
|
|
var parser = parseTo[1];
|
|
var value = (regex.exec(dateString) || [])[0];
|
|
var obj = parser(value, locale);
|
|
mark = _objectSpread({}, mark, {}, obj);
|
|
dateString = dateString.replace(value, '');
|
|
}
|
|
}
|
|
|
|
return mark;
|
|
}
|
|
|
|
function parse(str, format) {
|
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
|
|
try {
|
|
var _options$locale = options.locale,
|
|
_locale = _options$locale === void 0 ? _locale_en__WEBPACK_IMPORTED_MODULE_0__.default : _options$locale,
|
|
_options$backupDate = options.backupDate,
|
|
backupDate = _options$backupDate === void 0 ? new Date() : _options$backupDate;
|
|
|
|
var parseResult = makeParser(str, format, _locale);
|
|
var year = parseResult.year,
|
|
month = parseResult.month,
|
|
day = parseResult.day,
|
|
hour = parseResult.hour,
|
|
minute = parseResult.minute,
|
|
second = parseResult.second,
|
|
millisecond = parseResult.millisecond,
|
|
isPM = parseResult.isPM,
|
|
date = parseResult.date,
|
|
offset = parseResult.offset,
|
|
weekday = parseResult.weekday,
|
|
week = parseResult.week;
|
|
|
|
if (date) {
|
|
return date;
|
|
}
|
|
|
|
var inputArray = [year, month, day, hour, minute, second, millisecond];
|
|
inputArray[3] = to24hour(inputArray[3], isPM); // check week
|
|
|
|
if (week !== undefined && month === undefined && day === undefined) {
|
|
// new Date(year, 3) make sure in current year
|
|
var firstDate = (0,_util__WEBPACK_IMPORTED_MODULE_1__.startOfWeekYear)(year === undefined ? backupDate : new Date(year, 3), {
|
|
firstDayOfWeek: _locale.firstDayOfWeek,
|
|
firstWeekContainsDate: _locale.firstWeekContainsDate
|
|
});
|
|
return new Date(firstDate.getTime() + (week - 1) * 7 * 24 * 3600 * 1000);
|
|
}
|
|
|
|
var parsedDate;
|
|
var result = getFullInputArray(inputArray, backupDate);
|
|
|
|
if (offset !== undefined) {
|
|
result[6] += offset * 60 * 1000;
|
|
parsedDate = createUTCDate.apply(void 0, _toConsumableArray(result));
|
|
} else {
|
|
parsedDate = createDate.apply(void 0, _toConsumableArray(result));
|
|
} // check weekday
|
|
|
|
|
|
if (weekday !== undefined && parsedDate.getDay() !== weekday) {
|
|
return new Date(NaN);
|
|
}
|
|
|
|
return parsedDate;
|
|
} catch (e) {
|
|
return new Date(NaN);
|
|
}
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/date-format-parse/es/util.js":
|
|
/*!***************************************************!*\
|
|
!*** ./node_modules/date-format-parse/es/util.js ***!
|
|
\***************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "isDate": () => (/* binding */ isDate),
|
|
/* harmony export */ "toDate": () => (/* binding */ toDate),
|
|
/* harmony export */ "isValidDate": () => (/* binding */ isValidDate),
|
|
/* harmony export */ "startOfWeek": () => (/* binding */ startOfWeek),
|
|
/* harmony export */ "startOfWeekYear": () => (/* binding */ startOfWeekYear),
|
|
/* harmony export */ "getWeek": () => (/* binding */ getWeek)
|
|
/* harmony export */ });
|
|
function isDate(value) {
|
|
return value instanceof Date || Object.prototype.toString.call(value) === '[object Date]';
|
|
}
|
|
function toDate(value) {
|
|
if (isDate(value)) {
|
|
return new Date(value.getTime());
|
|
}
|
|
|
|
if (value == null) {
|
|
return new Date(NaN);
|
|
}
|
|
|
|
return new Date(value);
|
|
}
|
|
function isValidDate(value) {
|
|
return isDate(value) && !isNaN(value.getTime());
|
|
}
|
|
function startOfWeek(value) {
|
|
var firstDayOfWeek = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
|
|
if (!(firstDayOfWeek >= 0 && firstDayOfWeek <= 6)) {
|
|
throw new RangeError('weekStartsOn must be between 0 and 6');
|
|
}
|
|
|
|
var date = toDate(value);
|
|
var day = date.getDay();
|
|
var diff = (day + 7 - firstDayOfWeek) % 7;
|
|
date.setDate(date.getDate() - diff);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
function startOfWeekYear(value) {
|
|
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
_ref$firstDayOfWeek = _ref.firstDayOfWeek,
|
|
firstDayOfWeek = _ref$firstDayOfWeek === void 0 ? 0 : _ref$firstDayOfWeek,
|
|
_ref$firstWeekContain = _ref.firstWeekContainsDate,
|
|
firstWeekContainsDate = _ref$firstWeekContain === void 0 ? 1 : _ref$firstWeekContain;
|
|
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
throw new RangeError('firstWeekContainsDate must be between 1 and 7');
|
|
}
|
|
|
|
var date = toDate(value);
|
|
var year = date.getFullYear();
|
|
var firstDateOfFirstWeek = new Date(0);
|
|
|
|
for (var i = year + 1; i >= year - 1; i--) {
|
|
firstDateOfFirstWeek.setFullYear(i, 0, firstWeekContainsDate);
|
|
firstDateOfFirstWeek.setHours(0, 0, 0, 0);
|
|
firstDateOfFirstWeek = startOfWeek(firstDateOfFirstWeek, firstDayOfWeek);
|
|
|
|
if (date.getTime() >= firstDateOfFirstWeek.getTime()) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return firstDateOfFirstWeek;
|
|
}
|
|
function getWeek(value) {
|
|
var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
_ref2$firstDayOfWeek = _ref2.firstDayOfWeek,
|
|
firstDayOfWeek = _ref2$firstDayOfWeek === void 0 ? 0 : _ref2$firstDayOfWeek,
|
|
_ref2$firstWeekContai = _ref2.firstWeekContainsDate,
|
|
firstWeekContainsDate = _ref2$firstWeekContai === void 0 ? 1 : _ref2$firstWeekContai;
|
|
|
|
var date = toDate(value);
|
|
var firstDateOfThisWeek = startOfWeek(date, firstDayOfWeek);
|
|
var firstDateOfFirstWeek = startOfWeekYear(date, {
|
|
firstDayOfWeek: firstDayOfWeek,
|
|
firstWeekContainsDate: firstWeekContainsDate
|
|
});
|
|
var diff = firstDateOfThisWeek.getTime() - firstDateOfFirstWeek.getTime();
|
|
return Math.round(diff / (7 * 24 * 3600 * 1000)) + 1;
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/lodash/lodash.js":
|
|
/*!***************************************!*\
|
|
!*** ./node_modules/lodash/lodash.js ***!
|
|
\***************************************/
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* module decorator */ module = __webpack_require__.nmd(module);
|
|
var __WEBPACK_AMD_DEFINE_RESULT__;/**
|
|
* @license
|
|
* Lodash <https://lodash.com/>
|
|
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
|
* Released under MIT license <https://lodash.com/license>
|
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
*/
|
|
;(function() {
|
|
|
|
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
|
|
var undefined;
|
|
|
|
/** Used as the semantic version number. */
|
|
var VERSION = '4.17.21';
|
|
|
|
/** Used as the size to enable large array optimizations. */
|
|
var LARGE_ARRAY_SIZE = 200;
|
|
|
|
/** Error message constants. */
|
|
var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
|
|
FUNC_ERROR_TEXT = 'Expected a function',
|
|
INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
|
|
|
|
/** Used to stand-in for `undefined` hash values. */
|
|
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|
|
|
/** Used as the maximum memoize cache size. */
|
|
var MAX_MEMOIZE_SIZE = 500;
|
|
|
|
/** Used as the internal argument placeholder. */
|
|
var PLACEHOLDER = '__lodash_placeholder__';
|
|
|
|
/** Used to compose bitmasks for cloning. */
|
|
var CLONE_DEEP_FLAG = 1,
|
|
CLONE_FLAT_FLAG = 2,
|
|
CLONE_SYMBOLS_FLAG = 4;
|
|
|
|
/** Used to compose bitmasks for value comparisons. */
|
|
var COMPARE_PARTIAL_FLAG = 1,
|
|
COMPARE_UNORDERED_FLAG = 2;
|
|
|
|
/** Used to compose bitmasks for function metadata. */
|
|
var WRAP_BIND_FLAG = 1,
|
|
WRAP_BIND_KEY_FLAG = 2,
|
|
WRAP_CURRY_BOUND_FLAG = 4,
|
|
WRAP_CURRY_FLAG = 8,
|
|
WRAP_CURRY_RIGHT_FLAG = 16,
|
|
WRAP_PARTIAL_FLAG = 32,
|
|
WRAP_PARTIAL_RIGHT_FLAG = 64,
|
|
WRAP_ARY_FLAG = 128,
|
|
WRAP_REARG_FLAG = 256,
|
|
WRAP_FLIP_FLAG = 512;
|
|
|
|
/** Used as default options for `_.truncate`. */
|
|
var DEFAULT_TRUNC_LENGTH = 30,
|
|
DEFAULT_TRUNC_OMISSION = '...';
|
|
|
|
/** Used to detect hot functions by number of calls within a span of milliseconds. */
|
|
var HOT_COUNT = 800,
|
|
HOT_SPAN = 16;
|
|
|
|
/** Used to indicate the type of lazy iteratees. */
|
|
var LAZY_FILTER_FLAG = 1,
|
|
LAZY_MAP_FLAG = 2,
|
|
LAZY_WHILE_FLAG = 3;
|
|
|
|
/** Used as references for various `Number` constants. */
|
|
var INFINITY = 1 / 0,
|
|
MAX_SAFE_INTEGER = 9007199254740991,
|
|
MAX_INTEGER = 1.7976931348623157e+308,
|
|
NAN = 0 / 0;
|
|
|
|
/** Used as references for the maximum length and index of an array. */
|
|
var MAX_ARRAY_LENGTH = 4294967295,
|
|
MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
|
|
HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
|
|
|
|
/** Used to associate wrap methods with their bit flags. */
|
|
var wrapFlags = [
|
|
['ary', WRAP_ARY_FLAG],
|
|
['bind', WRAP_BIND_FLAG],
|
|
['bindKey', WRAP_BIND_KEY_FLAG],
|
|
['curry', WRAP_CURRY_FLAG],
|
|
['curryRight', WRAP_CURRY_RIGHT_FLAG],
|
|
['flip', WRAP_FLIP_FLAG],
|
|
['partial', WRAP_PARTIAL_FLAG],
|
|
['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
|
|
['rearg', WRAP_REARG_FLAG]
|
|
];
|
|
|
|
/** `Object#toString` result references. */
|
|
var argsTag = '[object Arguments]',
|
|
arrayTag = '[object Array]',
|
|
asyncTag = '[object AsyncFunction]',
|
|
boolTag = '[object Boolean]',
|
|
dateTag = '[object Date]',
|
|
domExcTag = '[object DOMException]',
|
|
errorTag = '[object Error]',
|
|
funcTag = '[object Function]',
|
|
genTag = '[object GeneratorFunction]',
|
|
mapTag = '[object Map]',
|
|
numberTag = '[object Number]',
|
|
nullTag = '[object Null]',
|
|
objectTag = '[object Object]',
|
|
promiseTag = '[object Promise]',
|
|
proxyTag = '[object Proxy]',
|
|
regexpTag = '[object RegExp]',
|
|
setTag = '[object Set]',
|
|
stringTag = '[object String]',
|
|
symbolTag = '[object Symbol]',
|
|
undefinedTag = '[object Undefined]',
|
|
weakMapTag = '[object WeakMap]',
|
|
weakSetTag = '[object WeakSet]';
|
|
|
|
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 match empty string literals in compiled template source. */
|
|
var reEmptyStringLeading = /\b__p \+= '';/g,
|
|
reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
|
|
reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
|
|
|
|
/** Used to match HTML entities and HTML characters. */
|
|
var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
|
|
reUnescapedHtml = /[&<>"']/g,
|
|
reHasEscapedHtml = RegExp(reEscapedHtml.source),
|
|
reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
|
|
|
|
/** Used to match template delimiters. */
|
|
var reEscape = /<%-([\s\S]+?)%>/g,
|
|
reEvaluate = /<%([\s\S]+?)%>/g,
|
|
reInterpolate = /<%=([\s\S]+?)%>/g;
|
|
|
|
/** Used to match property names within property paths. */
|
|
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
|
|
reIsPlainProp = /^\w*$/,
|
|
rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
|
|
|
/**
|
|
* Used to match `RegExp`
|
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
|
*/
|
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
|
|
reHasRegExpChar = RegExp(reRegExpChar.source);
|
|
|
|
/** Used to match leading whitespace. */
|
|
var reTrimStart = /^\s+/;
|
|
|
|
/** Used to match a single whitespace character. */
|
|
var reWhitespace = /\s/;
|
|
|
|
/** Used to match wrap detail comments. */
|
|
var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
|
|
reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
|
|
reSplitDetails = /,? & /;
|
|
|
|
/** Used to match words composed of alphanumeric characters. */
|
|
var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
|
|
|
|
/**
|
|
* Used to validate the `validate` option in `_.template` variable.
|
|
*
|
|
* Forbids characters which could potentially change the meaning of the function argument definition:
|
|
* - "()," (modification of function parameters)
|
|
* - "=" (default value)
|
|
* - "[]{}" (destructuring of function parameters)
|
|
* - "/" (beginning of a comment)
|
|
* - whitespace
|
|
*/
|
|
var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
|
|
|
|
/** Used to match backslashes in property paths. */
|
|
var reEscapeChar = /\\(\\)?/g;
|
|
|
|
/**
|
|
* Used to match
|
|
* [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
|
|
*/
|
|
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
|
|
|
|
/** Used to match `RegExp` flags from their coerced string values. */
|
|
var reFlags = /\w*$/;
|
|
|
|
/** Used to detect bad signed hexadecimal string values. */
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
|
|
/** Used to detect binary string values. */
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
|
|
/** Used to detect host constructors (Safari). */
|
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|
|
|
/** Used to detect octal string values. */
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
|
|
/** Used to detect unsigned integer values. */
|
|
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
|
|
|
/** Used to match Latin Unicode letters (excluding mathematical operators). */
|
|
var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
|
|
|
|
/** Used to ensure capturing order of template delimiters. */
|
|
var reNoMatch = /($^)/;
|
|
|
|
/** Used to match unescaped characters in compiled string literals. */
|
|
var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
|
|
|
|
/** Used to compose unicode character classes. */
|
|
var rsAstralRange = '\\ud800-\\udfff',
|
|
rsComboMarksRange = '\\u0300-\\u036f',
|
|
reComboHalfMarksRange = '\\ufe20-\\ufe2f',
|
|
rsComboSymbolsRange = '\\u20d0-\\u20ff',
|
|
rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
|
|
rsDingbatRange = '\\u2700-\\u27bf',
|
|
rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
|
|
rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
|
|
rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
|
|
rsPunctuationRange = '\\u2000-\\u206f',
|
|
rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
|
|
rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
|
|
rsVarRange = '\\ufe0e\\ufe0f',
|
|
rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
|
|
|
|
/** Used to compose unicode capture groups. */
|
|
var rsApos = "['\u2019]",
|
|
rsAstral = '[' + rsAstralRange + ']',
|
|
rsBreak = '[' + rsBreakRange + ']',
|
|
rsCombo = '[' + rsComboRange + ']',
|
|
rsDigits = '\\d+',
|
|
rsDingbat = '[' + rsDingbatRange + ']',
|
|
rsLower = '[' + rsLowerRange + ']',
|
|
rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
|
|
rsFitz = '\\ud83c[\\udffb-\\udfff]',
|
|
rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
|
|
rsNonAstral = '[^' + rsAstralRange + ']',
|
|
rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
|
|
rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
|
|
rsUpper = '[' + rsUpperRange + ']',
|
|
rsZWJ = '\\u200d';
|
|
|
|
/** Used to compose unicode regexes. */
|
|
var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
|
|
rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
|
|
rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
|
|
rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
|
|
reOptMod = rsModifier + '?',
|
|
rsOptVar = '[' + rsVarRange + ']?',
|
|
rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
|
|
rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
|
|
rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
|
|
rsSeq = rsOptVar + reOptMod + rsOptJoin,
|
|
rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
|
|
rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
|
|
|
|
/** Used to match apostrophes. */
|
|
var reApos = RegExp(rsApos, 'g');
|
|
|
|
/**
|
|
* Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
|
|
* [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
|
|
*/
|
|
var reComboMark = RegExp(rsCombo, 'g');
|
|
|
|
/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
|
|
var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
|
|
|
|
/** Used to match complex or compound words. */
|
|
var reUnicodeWord = RegExp([
|
|
rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
|
|
rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
|
|
rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
|
|
rsUpper + '+' + rsOptContrUpper,
|
|
rsOrdUpper,
|
|
rsOrdLower,
|
|
rsDigits,
|
|
rsEmoji
|
|
].join('|'), 'g');
|
|
|
|
/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
|
|
var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
|
|
|
|
/** Used to detect strings that need a more robust regexp to match words. */
|
|
var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
|
|
|
|
/** Used to assign default `context` object properties. */
|
|
var contextProps = [
|
|
'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
|
|
'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
|
|
'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
|
|
'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
|
|
'_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
|
|
];
|
|
|
|
/** Used to make template sourceURLs easier to identify. */
|
|
var templateCounter = -1;
|
|
|
|
/** Used to identify `toStringTag` values of typed arrays. */
|
|
var typedArrayTags = {};
|
|
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
|
|
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
|
|
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
|
|
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
|
|
typedArrayTags[uint32Tag] = true;
|
|
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
|
|
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
|
|
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
|
|
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
|
|
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
|
|
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
|
|
typedArrayTags[setTag] = typedArrayTags[stringTag] =
|
|
typedArrayTags[weakMapTag] = false;
|
|
|
|
/** 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;
|
|
|
|
/** Used to map Latin Unicode letters to basic Latin letters. */
|
|
var deburredLetters = {
|
|
// Latin-1 Supplement block.
|
|
'\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
|
|
'\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
|
|
'\xc7': 'C', '\xe7': 'c',
|
|
'\xd0': 'D', '\xf0': 'd',
|
|
'\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
|
|
'\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
|
|
'\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
|
|
'\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
|
|
'\xd1': 'N', '\xf1': 'n',
|
|
'\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
|
|
'\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
|
|
'\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
|
|
'\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
|
|
'\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
|
|
'\xc6': 'Ae', '\xe6': 'ae',
|
|
'\xde': 'Th', '\xfe': 'th',
|
|
'\xdf': 'ss',
|
|
// Latin Extended-A block.
|
|
'\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
|
|
'\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
|
|
'\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
|
|
'\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
|
|
'\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
|
|
'\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
|
|
'\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
|
|
'\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
|
|
'\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
|
|
'\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
|
|
'\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
|
|
'\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
|
|
'\u0134': 'J', '\u0135': 'j',
|
|
'\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
|
|
'\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
|
|
'\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
|
|
'\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
|
|
'\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
|
|
'\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
|
|
'\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
|
|
'\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
|
|
'\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
|
|
'\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
|
|
'\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
|
|
'\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
|
|
'\u0163': 't', '\u0165': 't', '\u0167': 't',
|
|
'\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
|
|
'\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
|
|
'\u0174': 'W', '\u0175': 'w',
|
|
'\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
|
|
'\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
|
|
'\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
|
|
'\u0132': 'IJ', '\u0133': 'ij',
|
|
'\u0152': 'Oe', '\u0153': 'oe',
|
|
'\u0149': "'n", '\u017f': 's'
|
|
};
|
|
|
|
/** Used to map characters to HTML entities. */
|
|
var htmlEscapes = {
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
"'": '''
|
|
};
|
|
|
|
/** Used to map HTML entities to characters. */
|
|
var htmlUnescapes = {
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
''': "'"
|
|
};
|
|
|
|
/** Used to escape characters for inclusion in compiled string literals. */
|
|
var stringEscapes = {
|
|
'\\': '\\',
|
|
"'": "'",
|
|
'\n': 'n',
|
|
'\r': 'r',
|
|
'\u2028': 'u2028',
|
|
'\u2029': 'u2029'
|
|
};
|
|
|
|
/** Built-in method references without a dependency on `root`. */
|
|
var freeParseFloat = parseFloat,
|
|
freeParseInt = parseInt;
|
|
|
|
/** Detect free variable `global` from Node.js. */
|
|
var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
|
|
|
|
/** Detect free variable `self`. */
|
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|
|
|
/** Used as a reference to the global object. */
|
|
var root = freeGlobal || freeSelf || Function('return this')();
|
|
|
|
/** Detect free variable `exports`. */
|
|
var freeExports = true && exports && !exports.nodeType && exports;
|
|
|
|
/** Detect free variable `module`. */
|
|
var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module;
|
|
|
|
/** Detect the popular CommonJS extension `module.exports`. */
|
|
var moduleExports = freeModule && freeModule.exports === freeExports;
|
|
|
|
/** Detect free variable `process` from Node.js. */
|
|
var freeProcess = moduleExports && freeGlobal.process;
|
|
|
|
/** Used to access faster Node.js helpers. */
|
|
var nodeUtil = (function() {
|
|
try {
|
|
// Use `util.types` for Node.js 10+.
|
|
var types = freeModule && freeModule.require && freeModule.require('util').types;
|
|
|
|
if (types) {
|
|
return types;
|
|
}
|
|
|
|
// Legacy `process.binding('util')` for Node.js < 10.
|
|
return freeProcess && freeProcess.binding && freeProcess.binding('util');
|
|
} catch (e) {}
|
|
}());
|
|
|
|
/* Node.js helper references. */
|
|
var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
|
|
nodeIsDate = nodeUtil && nodeUtil.isDate,
|
|
nodeIsMap = nodeUtil && nodeUtil.isMap,
|
|
nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
|
|
nodeIsSet = nodeUtil && nodeUtil.isSet,
|
|
nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* Gets the size of an ASCII `string`.
|
|
*
|
|
* @private
|
|
* @param {string} string The string inspect.
|
|
* @returns {number} Returns the string size.
|
|
*/
|
|
var asciiSize = baseProperty('length');
|
|
|
|
/**
|
|
* 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('');
|
|
}
|
|
|
|
/**
|
|
* 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) || [];
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.mean` and `_.meanBy` without support for
|
|
* iteratee shorthands.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} iteratee The function invoked per iteration.
|
|
* @returns {number} Returns the mean.
|
|
*/
|
|
function baseMean(array, iteratee) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? (baseSum(array, iteratee) / length) : NAN;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.property` without support for deep paths.
|
|
*
|
|
* @private
|
|
* @param {string} key The key of the property to get.
|
|
* @returns {Function} Returns the new accessor function.
|
|
*/
|
|
function baseProperty(key) {
|
|
return function(object) {
|
|
return object == null ? undefined : object[key];
|
|
};
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.propertyOf` without support for deep paths.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Function} Returns the new accessor function.
|
|
*/
|
|
function basePropertyOf(object) {
|
|
return function(key) {
|
|
return object == null ? undefined : object[key];
|
|
};
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.reduce` and `_.reduceRight`, without support
|
|
* for iteratee shorthands, which iterates over `collection` using `eachFunc`.
|
|
*
|
|
* @private
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} iteratee The function invoked per iteration.
|
|
* @param {*} accumulator The initial value.
|
|
* @param {boolean} initAccum Specify using the first or last element of
|
|
* `collection` as the initial value.
|
|
* @param {Function} eachFunc The function to iterate over `collection`.
|
|
* @returns {*} Returns the accumulated value.
|
|
*/
|
|
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
|
|
eachFunc(collection, function(value, index, collection) {
|
|
accumulator = initAccum
|
|
? (initAccum = false, value)
|
|
: iteratee(accumulator, value, index, collection);
|
|
});
|
|
return accumulator;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sortBy` which uses `comparer` to define the
|
|
* sort order of `array` and replaces criteria objects with their corresponding
|
|
* values.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to sort.
|
|
* @param {Function} comparer The function to define sort order.
|
|
* @returns {Array} Returns `array`.
|
|
*/
|
|
function baseSortBy(array, comparer) {
|
|
var length = array.length;
|
|
|
|
array.sort(comparer);
|
|
while (length--) {
|
|
array[length] = array[length].value;
|
|
}
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sum` and `_.sumBy` without support for
|
|
* iteratee shorthands.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} iteratee The function invoked per iteration.
|
|
* @returns {number} Returns the sum.
|
|
*/
|
|
function baseSum(array, iteratee) {
|
|
var result,
|
|
index = -1,
|
|
length = array.length;
|
|
|
|
while (++index < length) {
|
|
var current = iteratee(array[index]);
|
|
if (current !== undefined) {
|
|
result = result === undefined ? current : (result + current);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.times` without support for iteratee shorthands
|
|
* or max array length checks.
|
|
*
|
|
* @private
|
|
* @param {number} n The number of times to invoke `iteratee`.
|
|
* @param {Function} iteratee The function invoked per iteration.
|
|
* @returns {Array} Returns the array of results.
|
|
*/
|
|
function baseTimes(n, iteratee) {
|
|
var index = -1,
|
|
result = Array(n);
|
|
|
|
while (++index < n) {
|
|
result[index] = iteratee(index);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
|
|
* of key-value pairs for `object` corresponding to the property names of `props`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @param {Array} props The property names to get values for.
|
|
* @returns {Object} Returns the key-value pairs.
|
|
*/
|
|
function baseToPairs(object, props) {
|
|
return arrayMap(props, function(key) {
|
|
return [key, object[key]];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.trim`.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to trim.
|
|
* @returns {string} Returns the trimmed string.
|
|
*/
|
|
function baseTrim(string) {
|
|
return string
|
|
? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
|
|
: string;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.unary` without support for storing metadata.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to cap arguments for.
|
|
* @returns {Function} Returns the new capped function.
|
|
*/
|
|
function baseUnary(func) {
|
|
return function(value) {
|
|
return func(value);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.values` and `_.valuesIn` which creates an
|
|
* array of `object` property values corresponding to the property names
|
|
* of `props`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @param {Array} props The property names to get values for.
|
|
* @returns {Object} Returns the array of property values.
|
|
*/
|
|
function baseValues(object, props) {
|
|
return arrayMap(props, function(key) {
|
|
return object[key];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Checks if a `cache` value for `key` exists.
|
|
*
|
|
* @private
|
|
* @param {Object} cache The cache to query.
|
|
* @param {string} key The key of the entry to check.
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
*/
|
|
function cacheHas(cache, key) {
|
|
return cache.has(key);
|
|
}
|
|
|
|
/**
|
|
* Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
|
|
* that is not found in the character symbols.
|
|
*
|
|
* @private
|
|
* @param {Array} strSymbols The string symbols to inspect.
|
|
* @param {Array} chrSymbols The character symbols to find.
|
|
* @returns {number} Returns the index of the first unmatched string symbol.
|
|
*/
|
|
function charsStartIndex(strSymbols, chrSymbols) {
|
|
var index = -1,
|
|
length = strSymbols.length;
|
|
|
|
while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
|
|
return index;
|
|
}
|
|
|
|
/**
|
|
* Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
|
|
* that is not found in the character symbols.
|
|
*
|
|
* @private
|
|
* @param {Array} strSymbols The string symbols to inspect.
|
|
* @param {Array} chrSymbols The character symbols to find.
|
|
* @returns {number} Returns the index of the last unmatched string symbol.
|
|
*/
|
|
function charsEndIndex(strSymbols, chrSymbols) {
|
|
var index = strSymbols.length;
|
|
|
|
while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
|
|
return index;
|
|
}
|
|
|
|
/**
|
|
* Gets the number of `placeholder` occurrences in `array`.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to inspect.
|
|
* @param {*} placeholder The placeholder to search for.
|
|
* @returns {number} Returns the placeholder count.
|
|
*/
|
|
function countHolders(array, placeholder) {
|
|
var length = array.length,
|
|
result = 0;
|
|
|
|
while (length--) {
|
|
if (array[length] === placeholder) {
|
|
++result;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
|
|
* letters to basic Latin letters.
|
|
*
|
|
* @private
|
|
* @param {string} letter The matched letter to deburr.
|
|
* @returns {string} Returns the deburred letter.
|
|
*/
|
|
var deburrLetter = basePropertyOf(deburredLetters);
|
|
|
|
/**
|
|
* Used by `_.escape` to convert characters to HTML entities.
|
|
*
|
|
* @private
|
|
* @param {string} chr The matched character to escape.
|
|
* @returns {string} Returns the escaped character.
|
|
*/
|
|
var escapeHtmlChar = basePropertyOf(htmlEscapes);
|
|
|
|
/**
|
|
* Used by `_.template` to escape characters for inclusion in compiled string literals.
|
|
*
|
|
* @private
|
|
* @param {string} chr The matched character to escape.
|
|
* @returns {string} Returns the escaped character.
|
|
*/
|
|
function escapeStringChar(chr) {
|
|
return '\\' + stringEscapes[chr];
|
|
}
|
|
|
|
/**
|
|
* Gets the value at `key` of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} [object] The object to query.
|
|
* @param {string} key The key of the property to get.
|
|
* @returns {*} Returns the property value.
|
|
*/
|
|
function getValue(object, key) {
|
|
return object == null ? undefined : object[key];
|
|
}
|
|
|
|
/**
|
|
* Checks if `string` contains Unicode symbols.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to inspect.
|
|
* @returns {boolean} Returns `true` if a symbol is found, else `false`.
|
|
*/
|
|
function hasUnicode(string) {
|
|
return reHasUnicode.test(string);
|
|
}
|
|
|
|
/**
|
|
* Checks if `string` contains a word composed of Unicode symbols.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to inspect.
|
|
* @returns {boolean} Returns `true` if a word is found, else `false`.
|
|
*/
|
|
function hasUnicodeWord(string) {
|
|
return reHasUnicodeWord.test(string);
|
|
}
|
|
|
|
/**
|
|
* Converts `iterator` to an array.
|
|
*
|
|
* @private
|
|
* @param {Object} iterator The iterator to convert.
|
|
* @returns {Array} Returns the converted array.
|
|
*/
|
|
function iteratorToArray(iterator) {
|
|
var data,
|
|
result = [];
|
|
|
|
while (!(data = iterator.next()).done) {
|
|
result.push(data.value);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts `map` to its key-value pairs.
|
|
*
|
|
* @private
|
|
* @param {Object} map The map to convert.
|
|
* @returns {Array} Returns the key-value pairs.
|
|
*/
|
|
function mapToArray(map) {
|
|
var index = -1,
|
|
result = Array(map.size);
|
|
|
|
map.forEach(function(value, key) {
|
|
result[++index] = [key, value];
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates a unary function that invokes `func` with its argument transformed.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to wrap.
|
|
* @param {Function} transform The argument transform.
|
|
* @returns {Function} Returns the new function.
|
|
*/
|
|
function overArg(func, transform) {
|
|
return function(arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Replaces all `placeholder` elements in `array` with an internal placeholder
|
|
* and returns an array of their indexes.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to modify.
|
|
* @param {*} placeholder The placeholder to replace.
|
|
* @returns {Array} Returns the new array of placeholder indexes.
|
|
*/
|
|
function replaceHolders(array, placeholder) {
|
|
var index = -1,
|
|
length = array.length,
|
|
resIndex = 0,
|
|
result = [];
|
|
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (value === placeholder || value === PLACEHOLDER) {
|
|
array[index] = PLACEHOLDER;
|
|
result[resIndex++] = index;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts `set` to an array of its values.
|
|
*
|
|
* @private
|
|
* @param {Object} set The set to convert.
|
|
* @returns {Array} Returns the values.
|
|
*/
|
|
function setToArray(set) {
|
|
var index = -1,
|
|
result = Array(set.size);
|
|
|
|
set.forEach(function(value) {
|
|
result[++index] = value;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts `set` to its value-value pairs.
|
|
*
|
|
* @private
|
|
* @param {Object} set The set to convert.
|
|
* @returns {Array} Returns the value-value pairs.
|
|
*/
|
|
function setToPairs(set) {
|
|
var index = -1,
|
|
result = Array(set.size);
|
|
|
|
set.forEach(function(value) {
|
|
result[++index] = [value, value];
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `_.indexOf` which performs strict equality
|
|
* comparisons of values, i.e. `===`.
|
|
*
|
|
* @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 strictIndexOf(array, value, fromIndex) {
|
|
var index = fromIndex - 1,
|
|
length = array.length;
|
|
|
|
while (++index < length) {
|
|
if (array[index] === value) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `_.lastIndexOf` which performs strict equality
|
|
* comparisons of values, i.e. `===`.
|
|
*
|
|
* @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 strictLastIndexOf(array, value, fromIndex) {
|
|
var index = fromIndex + 1;
|
|
while (index--) {
|
|
if (array[index] === value) {
|
|
return index;
|
|
}
|
|
}
|
|
return index;
|
|
}
|
|
|
|
/**
|
|
* Gets the number of symbols in `string`.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to inspect.
|
|
* @returns {number} Returns the string size.
|
|
*/
|
|
function stringSize(string) {
|
|
return hasUnicode(string)
|
|
? unicodeSize(string)
|
|
: asciiSize(string);
|
|
}
|
|
|
|
/**
|
|
* Converts `string` to an array.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to convert.
|
|
* @returns {Array} Returns the converted array.
|
|
*/
|
|
function stringToArray(string) {
|
|
return hasUnicode(string)
|
|
? unicodeToArray(string)
|
|
: asciiToArray(string);
|
|
}
|
|
|
|
/**
|
|
* Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
|
|
* character of `string`.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to inspect.
|
|
* @returns {number} Returns the index of the last non-whitespace character.
|
|
*/
|
|
function trimmedEndIndex(string) {
|
|
var index = string.length;
|
|
|
|
while (index-- && reWhitespace.test(string.charAt(index))) {}
|
|
return index;
|
|
}
|
|
|
|
/**
|
|
* Used by `_.unescape` to convert HTML entities to characters.
|
|
*
|
|
* @private
|
|
* @param {string} chr The matched character to unescape.
|
|
* @returns {string} Returns the unescaped character.
|
|
*/
|
|
var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
|
|
|
|
/**
|
|
* Gets the size of a Unicode `string`.
|
|
*
|
|
* @private
|
|
* @param {string} string The string inspect.
|
|
* @returns {number} Returns the string size.
|
|
*/
|
|
function unicodeSize(string) {
|
|
var result = reUnicode.lastIndex = 0;
|
|
while (reUnicode.test(string)) {
|
|
++result;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts a Unicode `string` to an array.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to convert.
|
|
* @returns {Array} Returns the converted array.
|
|
*/
|
|
function unicodeToArray(string) {
|
|
return string.match(reUnicode) || [];
|
|
}
|
|
|
|
/**
|
|
* Splits a Unicode `string` into an array of its words.
|
|
*
|
|
* @private
|
|
* @param {string} The string to inspect.
|
|
* @returns {Array} Returns the words of `string`.
|
|
*/
|
|
function unicodeWords(string) {
|
|
return string.match(reUnicodeWord) || [];
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Create a new pristine `lodash` function using the `context` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.1.0
|
|
* @category Util
|
|
* @param {Object} [context=root] The context object.
|
|
* @returns {Function} Returns a new `lodash` function.
|
|
* @example
|
|
*
|
|
* _.mixin({ 'foo': _.constant('foo') });
|
|
*
|
|
* var lodash = _.runInContext();
|
|
* lodash.mixin({ 'bar': lodash.constant('bar') });
|
|
*
|
|
* _.isFunction(_.foo);
|
|
* // => true
|
|
* _.isFunction(_.bar);
|
|
* // => false
|
|
*
|
|
* lodash.isFunction(lodash.foo);
|
|
* // => false
|
|
* lodash.isFunction(lodash.bar);
|
|
* // => true
|
|
*
|
|
* // Create a suped-up `defer` in Node.js.
|
|
* var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
|
|
*/
|
|
var runInContext = (function runInContext(context) {
|
|
context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
|
|
|
|
/** Built-in constructor references. */
|
|
var Array = context.Array,
|
|
Date = context.Date,
|
|
Error = context.Error,
|
|
Function = context.Function,
|
|
Math = context.Math,
|
|
Object = context.Object,
|
|
RegExp = context.RegExp,
|
|
String = context.String,
|
|
TypeError = context.TypeError;
|
|
|
|
/** Used for built-in method references. */
|
|
var arrayProto = Array.prototype,
|
|
funcProto = Function.prototype,
|
|
objectProto = Object.prototype;
|
|
|
|
/** Used to detect overreaching core-js shims. */
|
|
var coreJsData = context['__core-js_shared__'];
|
|
|
|
/** 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 generate unique IDs. */
|
|
var idCounter = 0;
|
|
|
|
/** Used to detect methods masquerading as native. */
|
|
var maskSrcKey = (function() {
|
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
|
return uid ? ('Symbol(src)_1.' + uid) : '';
|
|
}());
|
|
|
|
/**
|
|
* Used to resolve the
|
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|
* of values.
|
|
*/
|
|
var nativeObjectToString = objectProto.toString;
|
|
|
|
/** Used to infer the `Object` constructor. */
|
|
var objectCtorString = funcToString.call(Object);
|
|
|
|
/** Used to restore the original `_` reference in `_.noConflict`. */
|
|
var oldDash = root._;
|
|
|
|
/** Used to detect if a method is native. */
|
|
var reIsNative = RegExp('^' +
|
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|
);
|
|
|
|
/** Built-in value references. */
|
|
var Buffer = moduleExports ? context.Buffer : undefined,
|
|
Symbol = context.Symbol,
|
|
Uint8Array = context.Uint8Array,
|
|
allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
|
|
getPrototype = overArg(Object.getPrototypeOf, Object),
|
|
objectCreate = Object.create,
|
|
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
|
splice = arrayProto.splice,
|
|
spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
|
|
symIterator = Symbol ? Symbol.iterator : undefined,
|
|
symToStringTag = Symbol ? Symbol.toStringTag : undefined;
|
|
|
|
var defineProperty = (function() {
|
|
try {
|
|
var func = getNative(Object, 'defineProperty');
|
|
func({}, '', {});
|
|
return func;
|
|
} catch (e) {}
|
|
}());
|
|
|
|
/** Mocked built-ins. */
|
|
var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
|
|
ctxNow = Date && Date.now !== root.Date.now && Date.now,
|
|
ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
|
|
|
|
/* Built-in method references for those with the same name as other `lodash` methods. */
|
|
var nativeCeil = Math.ceil,
|
|
nativeFloor = Math.floor,
|
|
nativeGetSymbols = Object.getOwnPropertySymbols,
|
|
nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
|
|
nativeIsFinite = context.isFinite,
|
|
nativeJoin = arrayProto.join,
|
|
nativeKeys = overArg(Object.keys, Object),
|
|
nativeMax = Math.max,
|
|
nativeMin = Math.min,
|
|
nativeNow = Date.now,
|
|
nativeParseInt = context.parseInt,
|
|
nativeRandom = Math.random,
|
|
nativeReverse = arrayProto.reverse;
|
|
|
|
/* Built-in method references that are verified to be native. */
|
|
var DataView = getNative(context, 'DataView'),
|
|
Map = getNative(context, 'Map'),
|
|
Promise = getNative(context, 'Promise'),
|
|
Set = getNative(context, 'Set'),
|
|
WeakMap = getNative(context, 'WeakMap'),
|
|
nativeCreate = getNative(Object, 'create');
|
|
|
|
/** Used to store function metadata. */
|
|
var metaMap = WeakMap && new WeakMap;
|
|
|
|
/** Used to lookup unminified function names. */
|
|
var realNames = {};
|
|
|
|
/** Used to detect maps, sets, and weakmaps. */
|
|
var dataViewCtorString = toSource(DataView),
|
|
mapCtorString = toSource(Map),
|
|
promiseCtorString = toSource(Promise),
|
|
setCtorString = toSource(Set),
|
|
weakMapCtorString = toSource(WeakMap);
|
|
|
|
/** Used to convert symbols to primitives and strings. */
|
|
var symbolProto = Symbol ? Symbol.prototype : undefined,
|
|
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
|
|
symbolToString = symbolProto ? symbolProto.toString : undefined;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Creates a `lodash` object which wraps `value` to enable implicit method
|
|
* chain sequences. Methods that operate on and return arrays, collections,
|
|
* and functions can be chained together. Methods that retrieve a single value
|
|
* or may return a primitive value will automatically end the chain sequence
|
|
* and return the unwrapped value. Otherwise, the value must be unwrapped
|
|
* with `_#value`.
|
|
*
|
|
* Explicit chain sequences, which must be unwrapped with `_#value`, may be
|
|
* enabled using `_.chain`.
|
|
*
|
|
* The execution of chained methods is lazy, that is, it's deferred until
|
|
* `_#value` is implicitly or explicitly called.
|
|
*
|
|
* Lazy evaluation allows several methods to support shortcut fusion.
|
|
* Shortcut fusion is an optimization to merge iteratee calls; this avoids
|
|
* the creation of intermediate arrays and can greatly reduce the number of
|
|
* iteratee executions. Sections of a chain sequence qualify for shortcut
|
|
* fusion if the section is applied to an array and iteratees accept only
|
|
* one argument. The heuristic for whether a section qualifies for shortcut
|
|
* fusion is subject to change.
|
|
*
|
|
* Chaining is supported in custom builds as long as the `_#value` method is
|
|
* directly or indirectly included in the build.
|
|
*
|
|
* In addition to lodash methods, wrappers have `Array` and `String` methods.
|
|
*
|
|
* The wrapper `Array` methods are:
|
|
* `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
|
|
*
|
|
* The wrapper `String` methods are:
|
|
* `replace` and `split`
|
|
*
|
|
* The wrapper methods that support shortcut fusion are:
|
|
* `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
|
|
* `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
|
|
* `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
|
|
*
|
|
* The chainable wrapper methods are:
|
|
* `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
|
|
* `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
|
|
* `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
|
|
* `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
|
|
* `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
|
|
* `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
|
|
* `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
|
|
* `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
|
|
* `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
|
|
* `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
|
|
* `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
|
|
* `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
|
|
* `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
|
|
* `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
|
|
* `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
|
|
* `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
|
|
* `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
|
|
* `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
|
|
* `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
|
|
* `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
|
|
* `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
|
|
* `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
|
|
* `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
|
|
* `zipObject`, `zipObjectDeep`, and `zipWith`
|
|
*
|
|
* The wrapper methods that are **not** chainable by default are:
|
|
* `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
|
|
* `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
|
|
* `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
|
|
* `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
|
|
* `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
|
|
* `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
|
|
* `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
|
|
* `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
|
|
* `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
|
|
* `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
|
|
* `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
|
|
* `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
|
|
* `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
|
|
* `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
|
|
* `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
|
|
* `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
|
|
* `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
|
|
* `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
|
|
* `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
|
|
* `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
|
|
* `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
|
|
* `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
|
|
* `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
|
|
* `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
|
|
* `upperFirst`, `value`, and `words`
|
|
*
|
|
* @name _
|
|
* @constructor
|
|
* @category Seq
|
|
* @param {*} value The value to wrap in a `lodash` instance.
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* function square(n) {
|
|
* return n * n;
|
|
* }
|
|
*
|
|
* var wrapped = _([1, 2, 3]);
|
|
*
|
|
* // Returns an unwrapped value.
|
|
* wrapped.reduce(_.add);
|
|
* // => 6
|
|
*
|
|
* // Returns a wrapped value.
|
|
* var squares = wrapped.map(square);
|
|
*
|
|
* _.isArray(squares);
|
|
* // => false
|
|
*
|
|
* _.isArray(squares.value());
|
|
* // => true
|
|
*/
|
|
function lodash(value) {
|
|
if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
|
|
if (value instanceof LodashWrapper) {
|
|
return value;
|
|
}
|
|
if (hasOwnProperty.call(value, '__wrapped__')) {
|
|
return wrapperClone(value);
|
|
}
|
|
}
|
|
return new LodashWrapper(value);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
};
|
|
}());
|
|
|
|
/**
|
|
* The function whose prototype chain sequence wrappers inherit from.
|
|
*
|
|
* @private
|
|
*/
|
|
function baseLodash() {
|
|
// No operation performed.
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* By default, the template delimiters used by lodash are like those in
|
|
* embedded Ruby (ERB) as well as ES2015 template strings. Change the
|
|
* following template settings to use alternative delimiters.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @type {Object}
|
|
*/
|
|
lodash.templateSettings = {
|
|
|
|
/**
|
|
* Used to detect `data` property values to be HTML-escaped.
|
|
*
|
|
* @memberOf _.templateSettings
|
|
* @type {RegExp}
|
|
*/
|
|
'escape': reEscape,
|
|
|
|
/**
|
|
* Used to detect code to be evaluated.
|
|
*
|
|
* @memberOf _.templateSettings
|
|
* @type {RegExp}
|
|
*/
|
|
'evaluate': reEvaluate,
|
|
|
|
/**
|
|
* Used to detect `data` property values to inject.
|
|
*
|
|
* @memberOf _.templateSettings
|
|
* @type {RegExp}
|
|
*/
|
|
'interpolate': reInterpolate,
|
|
|
|
/**
|
|
* Used to reference the data object in the template text.
|
|
*
|
|
* @memberOf _.templateSettings
|
|
* @type {string}
|
|
*/
|
|
'variable': '',
|
|
|
|
/**
|
|
* Used to import variables into the compiled template.
|
|
*
|
|
* @memberOf _.templateSettings
|
|
* @type {Object}
|
|
*/
|
|
'imports': {
|
|
|
|
/**
|
|
* A reference to the `lodash` function.
|
|
*
|
|
* @memberOf _.templateSettings.imports
|
|
* @type {Function}
|
|
*/
|
|
'_': lodash
|
|
}
|
|
};
|
|
|
|
// Ensure wrappers are instances of `baseLodash`.
|
|
lodash.prototype = baseLodash.prototype;
|
|
lodash.prototype.constructor = lodash;
|
|
|
|
LodashWrapper.prototype = baseCreate(baseLodash.prototype);
|
|
LodashWrapper.prototype.constructor = LodashWrapper;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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__ = [];
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of the lazy wrapper object.
|
|
*
|
|
* @private
|
|
* @name clone
|
|
* @memberOf LazyWrapper
|
|
* @returns {Object} Returns the cloned `LazyWrapper` object.
|
|
*/
|
|
function lazyClone() {
|
|
var result = new LazyWrapper(this.__wrapped__);
|
|
result.__actions__ = copyArray(this.__actions__);
|
|
result.__dir__ = this.__dir__;
|
|
result.__filtered__ = this.__filtered__;
|
|
result.__iteratees__ = copyArray(this.__iteratees__);
|
|
result.__takeCount__ = this.__takeCount__;
|
|
result.__views__ = copyArray(this.__views__);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Reverses the direction of lazy iteration.
|
|
*
|
|
* @private
|
|
* @name reverse
|
|
* @memberOf LazyWrapper
|
|
* @returns {Object} Returns the new reversed `LazyWrapper` object.
|
|
*/
|
|
function lazyReverse() {
|
|
if (this.__filtered__) {
|
|
var result = new LazyWrapper(this);
|
|
result.__dir__ = -1;
|
|
result.__filtered__ = true;
|
|
} else {
|
|
result = this.clone();
|
|
result.__dir__ *= -1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Extracts the unwrapped value from its lazy wrapper.
|
|
*
|
|
* @private
|
|
* @name value
|
|
* @memberOf LazyWrapper
|
|
* @returns {*} Returns the unwrapped value.
|
|
*/
|
|
function lazyValue() {
|
|
var array = this.__wrapped__.value(),
|
|
dir = this.__dir__,
|
|
isArr = isArray(array),
|
|
isRight = dir < 0,
|
|
arrLength = isArr ? array.length : 0,
|
|
view = getView(0, arrLength, this.__views__),
|
|
start = view.start,
|
|
end = view.end,
|
|
length = end - start,
|
|
index = isRight ? end : (start - 1),
|
|
iteratees = this.__iteratees__,
|
|
iterLength = iteratees.length,
|
|
resIndex = 0,
|
|
takeCount = nativeMin(length, this.__takeCount__);
|
|
|
|
if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
|
|
return baseWrapperValue(array, this.__actions__);
|
|
}
|
|
var result = [];
|
|
|
|
outer:
|
|
while (length-- && resIndex < takeCount) {
|
|
index += dir;
|
|
|
|
var iterIndex = -1,
|
|
value = array[index];
|
|
|
|
while (++iterIndex < iterLength) {
|
|
var data = iteratees[iterIndex],
|
|
iteratee = data.iteratee,
|
|
type = data.type,
|
|
computed = iteratee(value);
|
|
|
|
if (type == LAZY_MAP_FLAG) {
|
|
value = computed;
|
|
} else if (!computed) {
|
|
if (type == LAZY_FILTER_FLAG) {
|
|
continue outer;
|
|
} else {
|
|
break outer;
|
|
}
|
|
}
|
|
}
|
|
result[resIndex++] = value;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// Ensure `LazyWrapper` is an instance of `baseLodash`.
|
|
LazyWrapper.prototype = baseCreate(baseLodash.prototype);
|
|
LazyWrapper.prototype.constructor = LazyWrapper;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes all key-value entries from the hash.
|
|
*
|
|
* @private
|
|
* @name clear
|
|
* @memberOf Hash
|
|
*/
|
|
function hashClear() {
|
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|
this.size = 0;
|
|
}
|
|
|
|
/**
|
|
* Removes `key` and its value from the hash.
|
|
*
|
|
* @private
|
|
* @name delete
|
|
* @memberOf Hash
|
|
* @param {Object} hash The hash to modify.
|
|
* @param {string} key The key of the value to remove.
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
*/
|
|
function hashDelete(key) {
|
|
var result = this.has(key) && delete this.__data__[key];
|
|
this.size -= result ? 1 : 0;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Gets the hash value for `key`.
|
|
*
|
|
* @private
|
|
* @name get
|
|
* @memberOf Hash
|
|
* @param {string} key The key of the value to get.
|
|
* @returns {*} Returns the entry value.
|
|
*/
|
|
function hashGet(key) {
|
|
var data = this.__data__;
|
|
if (nativeCreate) {
|
|
var result = data[key];
|
|
return result === HASH_UNDEFINED ? undefined : result;
|
|
}
|
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|
}
|
|
|
|
/**
|
|
* Checks if a hash value for `key` exists.
|
|
*
|
|
* @private
|
|
* @name has
|
|
* @memberOf Hash
|
|
* @param {string} key The key of the entry to check.
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
*/
|
|
function hashHas(key) {
|
|
var data = this.__data__;
|
|
return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
|
|
}
|
|
|
|
/**
|
|
* Sets the hash `key` to `value`.
|
|
*
|
|
* @private
|
|
* @name set
|
|
* @memberOf Hash
|
|
* @param {string} key The key of the value to set.
|
|
* @param {*} value The value to set.
|
|
* @returns {Object} Returns the hash instance.
|
|
*/
|
|
function hashSet(key, value) {
|
|
var data = this.__data__;
|
|
this.size += this.has(key) ? 0 : 1;
|
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|
return this;
|
|
}
|
|
|
|
// Add methods to `Hash`.
|
|
Hash.prototype.clear = hashClear;
|
|
Hash.prototype['delete'] = hashDelete;
|
|
Hash.prototype.get = hashGet;
|
|
Hash.prototype.has = hashHas;
|
|
Hash.prototype.set = hashSet;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes all key-value entries from the list cache.
|
|
*
|
|
* @private
|
|
* @name clear
|
|
* @memberOf ListCache
|
|
*/
|
|
function listCacheClear() {
|
|
this.__data__ = [];
|
|
this.size = 0;
|
|
}
|
|
|
|
/**
|
|
* Removes `key` and its value from the list cache.
|
|
*
|
|
* @private
|
|
* @name delete
|
|
* @memberOf ListCache
|
|
* @param {string} key The key of the value to remove.
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
*/
|
|
function listCacheDelete(key) {
|
|
var data = this.__data__,
|
|
index = assocIndexOf(data, key);
|
|
|
|
if (index < 0) {
|
|
return false;
|
|
}
|
|
var lastIndex = data.length - 1;
|
|
if (index == lastIndex) {
|
|
data.pop();
|
|
} else {
|
|
splice.call(data, index, 1);
|
|
}
|
|
--this.size;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Gets the list cache value for `key`.
|
|
*
|
|
* @private
|
|
* @name get
|
|
* @memberOf ListCache
|
|
* @param {string} key The key of the value to get.
|
|
* @returns {*} Returns the entry value.
|
|
*/
|
|
function listCacheGet(key) {
|
|
var data = this.__data__,
|
|
index = assocIndexOf(data, key);
|
|
|
|
return index < 0 ? undefined : data[index][1];
|
|
}
|
|
|
|
/**
|
|
* Checks if a list cache value for `key` exists.
|
|
*
|
|
* @private
|
|
* @name has
|
|
* @memberOf ListCache
|
|
* @param {string} key The key of the entry to check.
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
*/
|
|
function listCacheHas(key) {
|
|
return assocIndexOf(this.__data__, key) > -1;
|
|
}
|
|
|
|
/**
|
|
* Sets the list cache `key` to `value`.
|
|
*
|
|
* @private
|
|
* @name set
|
|
* @memberOf ListCache
|
|
* @param {string} key The key of the value to set.
|
|
* @param {*} value The value to set.
|
|
* @returns {Object} Returns the list cache instance.
|
|
*/
|
|
function listCacheSet(key, value) {
|
|
var data = this.__data__,
|
|
index = assocIndexOf(data, key);
|
|
|
|
if (index < 0) {
|
|
++this.size;
|
|
data.push([key, value]);
|
|
} else {
|
|
data[index][1] = value;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
// Add methods to `ListCache`.
|
|
ListCache.prototype.clear = listCacheClear;
|
|
ListCache.prototype['delete'] = listCacheDelete;
|
|
ListCache.prototype.get = listCacheGet;
|
|
ListCache.prototype.has = listCacheHas;
|
|
ListCache.prototype.set = listCacheSet;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes all key-value entries from the map.
|
|
*
|
|
* @private
|
|
* @name clear
|
|
* @memberOf MapCache
|
|
*/
|
|
function mapCacheClear() {
|
|
this.size = 0;
|
|
this.__data__ = {
|
|
'hash': new Hash,
|
|
'map': new (Map || ListCache),
|
|
'string': new Hash
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Removes `key` and its value from the map.
|
|
*
|
|
* @private
|
|
* @name delete
|
|
* @memberOf MapCache
|
|
* @param {string} key The key of the value to remove.
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
*/
|
|
function mapCacheDelete(key) {
|
|
var result = getMapData(this, key)['delete'](key);
|
|
this.size -= result ? 1 : 0;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Gets the map value for `key`.
|
|
*
|
|
* @private
|
|
* @name get
|
|
* @memberOf MapCache
|
|
* @param {string} key The key of the value to get.
|
|
* @returns {*} Returns the entry value.
|
|
*/
|
|
function mapCacheGet(key) {
|
|
return getMapData(this, key).get(key);
|
|
}
|
|
|
|
/**
|
|
* Checks if a map value for `key` exists.
|
|
*
|
|
* @private
|
|
* @name has
|
|
* @memberOf MapCache
|
|
* @param {string} key The key of the entry to check.
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
*/
|
|
function mapCacheHas(key) {
|
|
return getMapData(this, key).has(key);
|
|
}
|
|
|
|
/**
|
|
* Sets the map `key` to `value`.
|
|
*
|
|
* @private
|
|
* @name set
|
|
* @memberOf MapCache
|
|
* @param {string} key The key of the value to set.
|
|
* @param {*} value The value to set.
|
|
* @returns {Object} Returns the map cache instance.
|
|
*/
|
|
function mapCacheSet(key, value) {
|
|
var data = getMapData(this, key),
|
|
size = data.size;
|
|
|
|
data.set(key, value);
|
|
this.size += data.size == size ? 0 : 1;
|
|
return this;
|
|
}
|
|
|
|
// Add methods to `MapCache`.
|
|
MapCache.prototype.clear = mapCacheClear;
|
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|
MapCache.prototype.get = mapCacheGet;
|
|
MapCache.prototype.has = mapCacheHas;
|
|
MapCache.prototype.set = mapCacheSet;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
*
|
|
* 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]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds `value` to the array cache.
|
|
*
|
|
* @private
|
|
* @name add
|
|
* @memberOf SetCache
|
|
* @alias push
|
|
* @param {*} value The value to cache.
|
|
* @returns {Object} Returns the cache instance.
|
|
*/
|
|
function setCacheAdd(value) {
|
|
this.__data__.set(value, HASH_UNDEFINED);
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is in the array cache.
|
|
*
|
|
* @private
|
|
* @name has
|
|
* @memberOf SetCache
|
|
* @param {*} value The value to search for.
|
|
* @returns {number} Returns `true` if `value` is found, else `false`.
|
|
*/
|
|
function setCacheHas(value) {
|
|
return this.__data__.has(value);
|
|
}
|
|
|
|
// Add methods to `SetCache`.
|
|
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
|
SetCache.prototype.has = setCacheHas;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* Removes all key-value entries from the stack.
|
|
*
|
|
* @private
|
|
* @name clear
|
|
* @memberOf Stack
|
|
*/
|
|
function stackClear() {
|
|
this.__data__ = new ListCache;
|
|
this.size = 0;
|
|
}
|
|
|
|
/**
|
|
* Removes `key` and its value from the stack.
|
|
*
|
|
* @private
|
|
* @name delete
|
|
* @memberOf Stack
|
|
* @param {string} key The key of the value to remove.
|
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|
*/
|
|
function stackDelete(key) {
|
|
var data = this.__data__,
|
|
result = data['delete'](key);
|
|
|
|
this.size = data.size;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Gets the stack value for `key`.
|
|
*
|
|
* @private
|
|
* @name get
|
|
* @memberOf Stack
|
|
* @param {string} key The key of the value to get.
|
|
* @returns {*} Returns the entry value.
|
|
*/
|
|
function stackGet(key) {
|
|
return this.__data__.get(key);
|
|
}
|
|
|
|
/**
|
|
* Checks if a stack value for `key` exists.
|
|
*
|
|
* @private
|
|
* @name has
|
|
* @memberOf Stack
|
|
* @param {string} key The key of the entry to check.
|
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|
*/
|
|
function stackHas(key) {
|
|
return this.__data__.has(key);
|
|
}
|
|
|
|
/**
|
|
* Sets the stack `key` to `value`.
|
|
*
|
|
* @private
|
|
* @name set
|
|
* @memberOf Stack
|
|
* @param {string} key The key of the value to set.
|
|
* @param {*} value The value to set.
|
|
* @returns {Object} Returns the stack cache instance.
|
|
*/
|
|
function stackSet(key, value) {
|
|
var data = this.__data__;
|
|
if (data instanceof ListCache) {
|
|
var pairs = data.__data__;
|
|
if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
|
|
pairs.push([key, value]);
|
|
this.size = ++data.size;
|
|
return this;
|
|
}
|
|
data = this.__data__ = new MapCache(pairs);
|
|
}
|
|
data.set(key, value);
|
|
this.size = data.size;
|
|
return this;
|
|
}
|
|
|
|
// Add methods to `Stack`.
|
|
Stack.prototype.clear = stackClear;
|
|
Stack.prototype['delete'] = stackDelete;
|
|
Stack.prototype.get = stackGet;
|
|
Stack.prototype.has = stackHas;
|
|
Stack.prototype.set = stackSet;
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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));
|
|
}
|
|
|
|
/**
|
|
* 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));
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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();
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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]);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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));
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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));
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.isTypedArray` without Node.js optimizations.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
|
|
*/
|
|
function baseIsTypedArray(value) {
|
|
return isObjectLike(value) &&
|
|
isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.iteratee`.
|
|
*
|
|
* @private
|
|
* @param {*} [value=_.identity] The value to convert to an iteratee.
|
|
* @returns {Function} Returns the iteratee.
|
|
*/
|
|
function baseIteratee(value) {
|
|
// Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
|
|
// See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
|
|
if (typeof value == 'function') {
|
|
return value;
|
|
}
|
|
if (value == null) {
|
|
return identity;
|
|
}
|
|
if (typeof value == 'object') {
|
|
return isArray(value)
|
|
? baseMatchesProperty(value[0], value[1])
|
|
: baseMatches(value);
|
|
}
|
|
return property(value);
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names.
|
|
*/
|
|
function baseKeys(object) {
|
|
if (!isPrototype(object)) {
|
|
return nativeKeys(object);
|
|
}
|
|
var result = [];
|
|
for (var key in Object(object)) {
|
|
if (hasOwnProperty.call(object, key) && key != 'constructor') {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names.
|
|
*/
|
|
function baseKeysIn(object) {
|
|
if (!isObject(object)) {
|
|
return nativeKeysIn(object);
|
|
}
|
|
var isProto = isPrototype(object),
|
|
result = [];
|
|
|
|
for (var key in object) {
|
|
if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.lt` 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 less than `other`,
|
|
* else `false`.
|
|
*/
|
|
function baseLt(value, other) {
|
|
return value < other;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.map` 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} Returns the new mapped array.
|
|
*/
|
|
function baseMap(collection, iteratee) {
|
|
var index = -1,
|
|
result = isArrayLike(collection) ? Array(collection.length) : [];
|
|
|
|
baseEach(collection, function(value, key, collection) {
|
|
result[++index] = iteratee(value, key, collection);
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.matches` which doesn't clone `source`.
|
|
*
|
|
* @private
|
|
* @param {Object} source The object of property values to match.
|
|
* @returns {Function} Returns the new spec function.
|
|
*/
|
|
function baseMatches(source) {
|
|
var matchData = getMatchData(source);
|
|
if (matchData.length == 1 && matchData[0][2]) {
|
|
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
|
|
}
|
|
return function(object) {
|
|
return object === source || baseIsMatch(object, source, matchData);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
|
|
*
|
|
* @private
|
|
* @param {string} path The path of the property to get.
|
|
* @param {*} srcValue The value to match.
|
|
* @returns {Function} Returns the new spec function.
|
|
*/
|
|
function baseMatchesProperty(path, srcValue) {
|
|
if (isKey(path) && isStrictComparable(srcValue)) {
|
|
return matchesStrictComparable(toKey(path), srcValue);
|
|
}
|
|
return function(object) {
|
|
var objValue = get(object, path);
|
|
return (objValue === undefined && objValue === srcValue)
|
|
? hasIn(object, path)
|
|
: baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.merge` without support for multiple sources.
|
|
*
|
|
* @private
|
|
* @param {Object} object The destination object.
|
|
* @param {Object} source The source object.
|
|
* @param {number} srcIndex The index of `source`.
|
|
* @param {Function} [customizer] The function to customize merged values.
|
|
* @param {Object} [stack] Tracks traversed source values and their merged
|
|
* counterparts.
|
|
*/
|
|
function baseMerge(object, source, srcIndex, customizer, stack) {
|
|
if (object === source) {
|
|
return;
|
|
}
|
|
baseFor(source, function(srcValue, key) {
|
|
stack || (stack = new Stack);
|
|
if (isObject(srcValue)) {
|
|
baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
|
|
}
|
|
else {
|
|
var newValue = customizer
|
|
? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
|
|
: undefined;
|
|
|
|
if (newValue === undefined) {
|
|
newValue = srcValue;
|
|
}
|
|
assignMergeValue(object, key, newValue);
|
|
}
|
|
}, keysIn);
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseMerge` for arrays and objects which performs
|
|
* deep merges and tracks traversed objects enabling objects with circular
|
|
* references to be merged.
|
|
*
|
|
* @private
|
|
* @param {Object} object The destination object.
|
|
* @param {Object} source The source object.
|
|
* @param {string} key The key of the value to merge.
|
|
* @param {number} srcIndex The index of `source`.
|
|
* @param {Function} mergeFunc The function to merge values.
|
|
* @param {Function} [customizer] The function to customize assigned values.
|
|
* @param {Object} [stack] Tracks traversed source values and their merged
|
|
* counterparts.
|
|
*/
|
|
function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
|
|
var objValue = safeGet(object, key),
|
|
srcValue = safeGet(source, key),
|
|
stacked = stack.get(srcValue);
|
|
|
|
if (stacked) {
|
|
assignMergeValue(object, key, stacked);
|
|
return;
|
|
}
|
|
var newValue = customizer
|
|
? customizer(objValue, srcValue, (key + ''), object, source, stack)
|
|
: undefined;
|
|
|
|
var isCommon = newValue === undefined;
|
|
|
|
if (isCommon) {
|
|
var isArr = isArray(srcValue),
|
|
isBuff = !isArr && isBuffer(srcValue),
|
|
isTyped = !isArr && !isBuff && isTypedArray(srcValue);
|
|
|
|
newValue = srcValue;
|
|
if (isArr || isBuff || isTyped) {
|
|
if (isArray(objValue)) {
|
|
newValue = objValue;
|
|
}
|
|
else if (isArrayLikeObject(objValue)) {
|
|
newValue = copyArray(objValue);
|
|
}
|
|
else if (isBuff) {
|
|
isCommon = false;
|
|
newValue = cloneBuffer(srcValue, true);
|
|
}
|
|
else if (isTyped) {
|
|
isCommon = false;
|
|
newValue = cloneTypedArray(srcValue, true);
|
|
}
|
|
else {
|
|
newValue = [];
|
|
}
|
|
}
|
|
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
|
|
newValue = objValue;
|
|
if (isArguments(objValue)) {
|
|
newValue = toPlainObject(objValue);
|
|
}
|
|
else if (!isObject(objValue) || isFunction(objValue)) {
|
|
newValue = initCloneObject(srcValue);
|
|
}
|
|
}
|
|
else {
|
|
isCommon = false;
|
|
}
|
|
}
|
|
if (isCommon) {
|
|
// Recursively merge objects and arrays (susceptible to call stack limits).
|
|
stack.set(srcValue, newValue);
|
|
mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
|
|
stack['delete'](srcValue);
|
|
}
|
|
assignMergeValue(object, key, newValue);
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.nth` which doesn't coerce arguments.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to query.
|
|
* @param {number} n The index of the element to return.
|
|
* @returns {*} Returns the nth element of `array`.
|
|
*/
|
|
function baseNth(array, n) {
|
|
var length = array.length;
|
|
if (!length) {
|
|
return;
|
|
}
|
|
n += n < 0 ? length : 0;
|
|
return isIndex(n, length) ? array[n] : undefined;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.orderBy` without param guards.
|
|
*
|
|
* @private
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
|
|
* @param {string[]} orders The sort orders of `iteratees`.
|
|
* @returns {Array} Returns the new sorted array.
|
|
*/
|
|
function baseOrderBy(collection, iteratees, orders) {
|
|
if (iteratees.length) {
|
|
iteratees = arrayMap(iteratees, function(iteratee) {
|
|
if (isArray(iteratee)) {
|
|
return function(value) {
|
|
return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
|
|
}
|
|
}
|
|
return iteratee;
|
|
});
|
|
} else {
|
|
iteratees = [identity];
|
|
}
|
|
|
|
var index = -1;
|
|
iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
|
|
|
|
var result = baseMap(collection, function(value, key, collection) {
|
|
var criteria = arrayMap(iteratees, function(iteratee) {
|
|
return iteratee(value);
|
|
});
|
|
return { 'criteria': criteria, 'index': ++index, 'value': value };
|
|
});
|
|
|
|
return baseSortBy(result, function(object, other) {
|
|
return compareMultiple(object, other, orders);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.pick` without support for individual
|
|
* property identifiers.
|
|
*
|
|
* @private
|
|
* @param {Object} object The source object.
|
|
* @param {string[]} paths The property paths to pick.
|
|
* @returns {Object} Returns the new object.
|
|
*/
|
|
function basePick(object, paths) {
|
|
return basePickBy(object, paths, function(value, path) {
|
|
return hasIn(object, path);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.pickBy` without support for iteratee shorthands.
|
|
*
|
|
* @private
|
|
* @param {Object} object The source object.
|
|
* @param {string[]} paths The property paths to pick.
|
|
* @param {Function} predicate The function invoked per property.
|
|
* @returns {Object} Returns the new object.
|
|
*/
|
|
function basePickBy(object, paths, predicate) {
|
|
var index = -1,
|
|
length = paths.length,
|
|
result = {};
|
|
|
|
while (++index < length) {
|
|
var path = paths[index],
|
|
value = baseGet(object, path);
|
|
|
|
if (predicate(value, path)) {
|
|
baseSet(result, castPath(path, object), value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseProperty` which supports deep paths.
|
|
*
|
|
* @private
|
|
* @param {Array|string} path The path of the property to get.
|
|
* @returns {Function} Returns the new accessor function.
|
|
*/
|
|
function basePropertyDeep(path) {
|
|
return function(object) {
|
|
return baseGet(object, path);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.pullAllBy` without support for iteratee
|
|
* shorthands.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to modify.
|
|
* @param {Array} values The values to remove.
|
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns `array`.
|
|
*/
|
|
function basePullAll(array, values, iteratee, comparator) {
|
|
var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
|
|
index = -1,
|
|
length = values.length,
|
|
seen = array;
|
|
|
|
if (array === values) {
|
|
values = copyArray(values);
|
|
}
|
|
if (iteratee) {
|
|
seen = arrayMap(array, baseUnary(iteratee));
|
|
}
|
|
while (++index < length) {
|
|
var fromIndex = 0,
|
|
value = values[index],
|
|
computed = iteratee ? iteratee(value) : value;
|
|
|
|
while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
|
|
if (seen !== array) {
|
|
splice.call(seen, fromIndex, 1);
|
|
}
|
|
splice.call(array, fromIndex, 1);
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.pullAt` without support for individual
|
|
* indexes or capturing the removed elements.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to modify.
|
|
* @param {number[]} indexes The indexes of elements to remove.
|
|
* @returns {Array} Returns `array`.
|
|
*/
|
|
function basePullAt(array, indexes) {
|
|
var length = array ? indexes.length : 0,
|
|
lastIndex = length - 1;
|
|
|
|
while (length--) {
|
|
var index = indexes[length];
|
|
if (length == lastIndex || index !== previous) {
|
|
var previous = index;
|
|
if (isIndex(index)) {
|
|
splice.call(array, index, 1);
|
|
} else {
|
|
baseUnset(array, index);
|
|
}
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.random` without support for returning
|
|
* floating-point numbers.
|
|
*
|
|
* @private
|
|
* @param {number} lower The lower bound.
|
|
* @param {number} upper The upper bound.
|
|
* @returns {number} Returns the random number.
|
|
*/
|
|
function baseRandom(lower, upper) {
|
|
return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.range` and `_.rangeRight` which doesn't
|
|
* coerce arguments.
|
|
*
|
|
* @private
|
|
* @param {number} start The start of the range.
|
|
* @param {number} end The end of the range.
|
|
* @param {number} step The value to increment or decrement by.
|
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|
* @returns {Array} Returns the range of numbers.
|
|
*/
|
|
function baseRange(start, end, step, fromRight) {
|
|
var index = -1,
|
|
length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
|
|
result = Array(length);
|
|
|
|
while (length--) {
|
|
result[fromRight ? length : ++index] = start;
|
|
start += step;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.repeat` which doesn't coerce arguments.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to repeat.
|
|
* @param {number} n The number of times to repeat the string.
|
|
* @returns {string} Returns the repeated string.
|
|
*/
|
|
function baseRepeat(string, n) {
|
|
var result = '';
|
|
if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
|
|
return result;
|
|
}
|
|
// Leverage the exponentiation by squaring algorithm for a faster repeat.
|
|
// See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
|
|
do {
|
|
if (n % 2) {
|
|
result += string;
|
|
}
|
|
n = nativeFloor(n / 2);
|
|
if (n) {
|
|
string += string;
|
|
}
|
|
} while (n);
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.rest` which doesn't validate or coerce arguments.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to apply a rest parameter to.
|
|
* @param {number} [start=func.length-1] The start position of the rest parameter.
|
|
* @returns {Function} Returns the new function.
|
|
*/
|
|
function baseRest(func, start) {
|
|
return setToString(overRest(func, start, identity), func + '');
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sample`.
|
|
*
|
|
* @private
|
|
* @param {Array|Object} collection The collection to sample.
|
|
* @returns {*} Returns the random element.
|
|
*/
|
|
function baseSample(collection) {
|
|
return arraySample(values(collection));
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sampleSize` without param guards.
|
|
*
|
|
* @private
|
|
* @param {Array|Object} collection The collection to sample.
|
|
* @param {number} n The number of elements to sample.
|
|
* @returns {Array} Returns the random elements.
|
|
*/
|
|
function baseSampleSize(collection, n) {
|
|
var array = values(collection);
|
|
return shuffleSelf(array, baseClamp(n, 0, array.length));
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.set`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to set.
|
|
* @param {*} value The value to set.
|
|
* @param {Function} [customizer] The function to customize path creation.
|
|
* @returns {Object} Returns `object`.
|
|
*/
|
|
function baseSet(object, path, value, customizer) {
|
|
if (!isObject(object)) {
|
|
return object;
|
|
}
|
|
path = castPath(path, object);
|
|
|
|
var index = -1,
|
|
length = path.length,
|
|
lastIndex = length - 1,
|
|
nested = object;
|
|
|
|
while (nested != null && ++index < length) {
|
|
var key = toKey(path[index]),
|
|
newValue = value;
|
|
|
|
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
|
return object;
|
|
}
|
|
|
|
if (index != lastIndex) {
|
|
var objValue = nested[key];
|
|
newValue = customizer ? customizer(objValue, key, nested) : undefined;
|
|
if (newValue === undefined) {
|
|
newValue = isObject(objValue)
|
|
? objValue
|
|
: (isIndex(path[index + 1]) ? [] : {});
|
|
}
|
|
}
|
|
assignValue(nested, key, newValue);
|
|
nested = nested[key];
|
|
}
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `setData` without support for hot loop shorting.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to associate metadata with.
|
|
* @param {*} data The metadata.
|
|
* @returns {Function} Returns `func`.
|
|
*/
|
|
var baseSetData = !metaMap ? identity : function(func, data) {
|
|
metaMap.set(func, data);
|
|
return func;
|
|
};
|
|
|
|
/**
|
|
* The base implementation of `setToString` without support for hot loop shorting.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to modify.
|
|
* @param {Function} string The `toString` result.
|
|
* @returns {Function} Returns `func`.
|
|
*/
|
|
var baseSetToString = !defineProperty ? identity : function(func, string) {
|
|
return defineProperty(func, 'toString', {
|
|
'configurable': true,
|
|
'enumerable': false,
|
|
'value': constant(string),
|
|
'writable': true
|
|
});
|
|
};
|
|
|
|
/**
|
|
* The base implementation of `_.shuffle`.
|
|
*
|
|
* @private
|
|
* @param {Array|Object} collection The collection to shuffle.
|
|
* @returns {Array} Returns the new shuffled array.
|
|
*/
|
|
function baseShuffle(collection) {
|
|
return shuffleSelf(values(collection));
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.slice` without an iteratee call guard.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to slice.
|
|
* @param {number} [start=0] The start position.
|
|
* @param {number} [end=array.length] The end position.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
*/
|
|
function baseSlice(array, start, end) {
|
|
var index = -1,
|
|
length = array.length;
|
|
|
|
if (start < 0) {
|
|
start = -start > length ? 0 : (length + start);
|
|
}
|
|
end = end > length ? length : end;
|
|
if (end < 0) {
|
|
end += length;
|
|
}
|
|
length = start > end ? 0 : ((end - start) >>> 0);
|
|
start >>>= 0;
|
|
|
|
var result = Array(length);
|
|
while (++index < length) {
|
|
result[index] = array[index + start];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.some` 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 any element passes the predicate check,
|
|
* else `false`.
|
|
*/
|
|
function baseSome(collection, predicate) {
|
|
var result;
|
|
|
|
baseEach(collection, function(value, index, collection) {
|
|
result = predicate(value, index, collection);
|
|
return !result;
|
|
});
|
|
return !!result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
|
|
* performs a binary search of `array` to determine the index at which `value`
|
|
* should be inserted into `array` in order to maintain its sort order.
|
|
*
|
|
* @private
|
|
* @param {Array} array The sorted array to inspect.
|
|
* @param {*} value The value to evaluate.
|
|
* @param {boolean} [retHighest] Specify returning the highest qualified index.
|
|
* @returns {number} Returns the index at which `value` should be inserted
|
|
* into `array`.
|
|
*/
|
|
function baseSortedIndex(array, value, retHighest) {
|
|
var low = 0,
|
|
high = array == null ? low : array.length;
|
|
|
|
if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
|
|
while (low < high) {
|
|
var mid = (low + high) >>> 1,
|
|
computed = array[mid];
|
|
|
|
if (computed !== null && !isSymbol(computed) &&
|
|
(retHighest ? (computed <= value) : (computed < value))) {
|
|
low = mid + 1;
|
|
} else {
|
|
high = mid;
|
|
}
|
|
}
|
|
return high;
|
|
}
|
|
return baseSortedIndexBy(array, value, identity, retHighest);
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
|
|
* which invokes `iteratee` for `value` and each element of `array` to compute
|
|
* their sort ranking. The iteratee is invoked with one argument; (value).
|
|
*
|
|
* @private
|
|
* @param {Array} array The sorted array to inspect.
|
|
* @param {*} value The value to evaluate.
|
|
* @param {Function} iteratee The iteratee invoked per element.
|
|
* @param {boolean} [retHighest] Specify returning the highest qualified index.
|
|
* @returns {number} Returns the index at which `value` should be inserted
|
|
* into `array`.
|
|
*/
|
|
function baseSortedIndexBy(array, value, iteratee, retHighest) {
|
|
var low = 0,
|
|
high = array == null ? 0 : array.length;
|
|
if (high === 0) {
|
|
return 0;
|
|
}
|
|
|
|
value = iteratee(value);
|
|
var valIsNaN = value !== value,
|
|
valIsNull = value === null,
|
|
valIsSymbol = isSymbol(value),
|
|
valIsUndefined = value === undefined;
|
|
|
|
while (low < high) {
|
|
var mid = nativeFloor((low + high) / 2),
|
|
computed = iteratee(array[mid]),
|
|
othIsDefined = computed !== undefined,
|
|
othIsNull = computed === null,
|
|
othIsReflexive = computed === computed,
|
|
othIsSymbol = isSymbol(computed);
|
|
|
|
if (valIsNaN) {
|
|
var setLow = retHighest || othIsReflexive;
|
|
} else if (valIsUndefined) {
|
|
setLow = othIsReflexive && (retHighest || othIsDefined);
|
|
} else if (valIsNull) {
|
|
setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
|
|
} else if (valIsSymbol) {
|
|
setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
|
|
} else if (othIsNull || othIsSymbol) {
|
|
setLow = false;
|
|
} else {
|
|
setLow = retHighest ? (computed <= value) : (computed < value);
|
|
}
|
|
if (setLow) {
|
|
low = mid + 1;
|
|
} else {
|
|
high = mid;
|
|
}
|
|
}
|
|
return nativeMin(high, MAX_ARRAY_INDEX);
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
|
|
* support for iteratee shorthands.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
*/
|
|
function baseSortedUniq(array, iteratee) {
|
|
var index = -1,
|
|
length = array.length,
|
|
resIndex = 0,
|
|
result = [];
|
|
|
|
while (++index < length) {
|
|
var value = array[index],
|
|
computed = iteratee ? iteratee(value) : value;
|
|
|
|
if (!index || !eq(computed, seen)) {
|
|
var seen = computed;
|
|
result[resIndex++] = value === 0 ? 0 : value;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.toNumber` which doesn't ensure correct
|
|
* conversions of binary, hexadecimal, or octal string values.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to process.
|
|
* @returns {number} Returns the number.
|
|
*/
|
|
function baseToNumber(value) {
|
|
if (typeof value == 'number') {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
return +value;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.toString` which doesn't convert nullish
|
|
* values to empty strings.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to process.
|
|
* @returns {string} Returns the string.
|
|
*/
|
|
function baseToString(value) {
|
|
// Exit early for strings to avoid a performance hit in some environments.
|
|
if (typeof value == 'string') {
|
|
return value;
|
|
}
|
|
if (isArray(value)) {
|
|
// Recursively convert values (susceptible to call stack limits).
|
|
return arrayMap(value, baseToString) + '';
|
|
}
|
|
if (isSymbol(value)) {
|
|
return symbolToString ? symbolToString.call(value) : '';
|
|
}
|
|
var result = (value + '');
|
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.uniqBy` without support for iteratee shorthands.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
*/
|
|
function baseUniq(array, iteratee, comparator) {
|
|
var index = -1,
|
|
includes = arrayIncludes,
|
|
length = array.length,
|
|
isCommon = true,
|
|
result = [],
|
|
seen = result;
|
|
|
|
if (comparator) {
|
|
isCommon = false;
|
|
includes = arrayIncludesWith;
|
|
}
|
|
else if (length >= LARGE_ARRAY_SIZE) {
|
|
var set = iteratee ? null : createSet(array);
|
|
if (set) {
|
|
return setToArray(set);
|
|
}
|
|
isCommon = false;
|
|
includes = cacheHas;
|
|
seen = new SetCache;
|
|
}
|
|
else {
|
|
seen = iteratee ? [] : result;
|
|
}
|
|
outer:
|
|
while (++index < length) {
|
|
var value = array[index],
|
|
computed = iteratee ? iteratee(value) : value;
|
|
|
|
value = (comparator || value !== 0) ? value : 0;
|
|
if (isCommon && computed === computed) {
|
|
var seenIndex = seen.length;
|
|
while (seenIndex--) {
|
|
if (seen[seenIndex] === computed) {
|
|
continue outer;
|
|
}
|
|
}
|
|
if (iteratee) {
|
|
seen.push(computed);
|
|
}
|
|
result.push(value);
|
|
}
|
|
else if (!includes(seen, computed, comparator)) {
|
|
if (seen !== result) {
|
|
seen.push(computed);
|
|
}
|
|
result.push(value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.unset`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The property path to unset.
|
|
* @returns {boolean} Returns `true` if the property is deleted, else `false`.
|
|
*/
|
|
function baseUnset(object, path) {
|
|
path = castPath(path, object);
|
|
object = parent(object, path);
|
|
return object == null || delete object[toKey(last(path))];
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `_.update`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to update.
|
|
* @param {Function} updater The function to produce the updated value.
|
|
* @param {Function} [customizer] The function to customize path creation.
|
|
* @returns {Object} Returns `object`.
|
|
*/
|
|
function baseUpdate(object, path, updater, customizer) {
|
|
return baseSet(object, path, updater(baseGet(object, path)), customizer);
|
|
}
|
|
|
|
/**
|
|
* The base implementation of methods like `_.dropWhile` and `_.takeWhile`
|
|
* without support for iteratee shorthands.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to query.
|
|
* @param {Function} predicate The function invoked per iteration.
|
|
* @param {boolean} [isDrop] Specify dropping elements instead of taking them.
|
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
*/
|
|
function baseWhile(array, predicate, isDrop, fromRight) {
|
|
var length = array.length,
|
|
index = fromRight ? length : -1;
|
|
|
|
while ((fromRight ? index-- : ++index < length) &&
|
|
predicate(array[index], index, array)) {}
|
|
|
|
return isDrop
|
|
? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
|
|
: baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
|
|
}
|
|
|
|
/**
|
|
* The base implementation of `wrapperValue` which returns the result of
|
|
* performing a sequence of actions on the unwrapped `value`, where each
|
|
* successive action is supplied the return value of the previous.
|
|
*
|
|
* @private
|
|
* @param {*} value The unwrapped value.
|
|
* @param {Array} actions Actions to perform to resolve the unwrapped value.
|
|
* @returns {*} Returns the resolved value.
|
|
*/
|
|
function baseWrapperValue(value, actions) {
|
|
var result = value;
|
|
if (result instanceof LazyWrapper) {
|
|
result = result.value();
|
|
}
|
|
return arrayReduce(actions, function(result, action) {
|
|
return action.func.apply(action.thisArg, arrayPush([result], action.args));
|
|
}, result);
|
|
}
|
|
|
|
/**
|
|
* The base implementation of methods like `_.xor`, 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 values.
|
|
*/
|
|
function baseXor(arrays, iteratee, comparator) {
|
|
var length = arrays.length;
|
|
if (length < 2) {
|
|
return length ? baseUniq(arrays[0]) : [];
|
|
}
|
|
var index = -1,
|
|
result = Array(length);
|
|
|
|
while (++index < length) {
|
|
var array = arrays[index],
|
|
othIndex = -1;
|
|
|
|
while (++othIndex < length) {
|
|
if (othIndex != index) {
|
|
result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
|
|
}
|
|
}
|
|
}
|
|
return baseUniq(baseFlatten(result, 1), iteratee, comparator);
|
|
}
|
|
|
|
/**
|
|
* This base implementation of `_.zipObject` which assigns values using `assignFunc`.
|
|
*
|
|
* @private
|
|
* @param {Array} props The property identifiers.
|
|
* @param {Array} values The property values.
|
|
* @param {Function} assignFunc The function to assign values.
|
|
* @returns {Object} Returns the new object.
|
|
*/
|
|
function baseZipObject(props, values, assignFunc) {
|
|
var index = -1,
|
|
length = props.length,
|
|
valsLength = values.length,
|
|
result = {};
|
|
|
|
while (++index < length) {
|
|
var value = index < valsLength ? values[index] : undefined;
|
|
assignFunc(result, props[index], value);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Casts `value` to an empty array if it's not an array like object.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to inspect.
|
|
* @returns {Array|Object} Returns the cast array-like object.
|
|
*/
|
|
function castArrayLikeObject(value) {
|
|
return isArrayLikeObject(value) ? value : [];
|
|
}
|
|
|
|
/**
|
|
* Casts `value` to `identity` if it's not a function.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to inspect.
|
|
* @returns {Function} Returns cast function.
|
|
*/
|
|
function castFunction(value) {
|
|
return typeof value == 'function' ? value : identity;
|
|
}
|
|
|
|
/**
|
|
* Casts `value` to a path array if it's not one.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to inspect.
|
|
* @param {Object} [object] The object to query keys on.
|
|
* @returns {Array} Returns the cast property path array.
|
|
*/
|
|
function castPath(value, object) {
|
|
if (isArray(value)) {
|
|
return value;
|
|
}
|
|
return isKey(value, object) ? [value] : stringToPath(toString(value));
|
|
}
|
|
|
|
/**
|
|
* A `baseRest` alias which can be replaced with `identity` by module
|
|
* replacement plugins.
|
|
*
|
|
* @private
|
|
* @type {Function}
|
|
* @param {Function} func The function to apply a rest parameter to.
|
|
* @returns {Function} Returns the new function.
|
|
*/
|
|
var castRest = baseRest;
|
|
|
|
/**
|
|
* Casts `array` to a slice if it's needed.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to inspect.
|
|
* @param {number} start The start position.
|
|
* @param {number} [end=array.length] The end position.
|
|
* @returns {Array} Returns the cast slice.
|
|
*/
|
|
function castSlice(array, start, end) {
|
|
var length = array.length;
|
|
end = end === undefined ? length : end;
|
|
return (!start && end >= length) ? array : baseSlice(array, start, end);
|
|
}
|
|
|
|
/**
|
|
* A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
|
|
*
|
|
* @private
|
|
* @param {number|Object} id The timer id or timeout object of the timer to clear.
|
|
*/
|
|
var clearTimeout = ctxClearTimeout || function(id) {
|
|
return root.clearTimeout(id);
|
|
};
|
|
|
|
/**
|
|
* Creates a clone of `buffer`.
|
|
*
|
|
* @private
|
|
* @param {Buffer} buffer The buffer to clone.
|
|
* @param {boolean} [isDeep] Specify a deep clone.
|
|
* @returns {Buffer} Returns the cloned buffer.
|
|
*/
|
|
function cloneBuffer(buffer, isDeep) {
|
|
if (isDeep) {
|
|
return buffer.slice();
|
|
}
|
|
var length = buffer.length,
|
|
result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
|
|
|
|
buffer.copy(result);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of `arrayBuffer`.
|
|
*
|
|
* @private
|
|
* @param {ArrayBuffer} arrayBuffer The array buffer to clone.
|
|
* @returns {ArrayBuffer} Returns the cloned array buffer.
|
|
*/
|
|
function cloneArrayBuffer(arrayBuffer) {
|
|
var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
|
|
new Uint8Array(result).set(new Uint8Array(arrayBuffer));
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of `dataView`.
|
|
*
|
|
* @private
|
|
* @param {Object} dataView The data view to clone.
|
|
* @param {boolean} [isDeep] Specify a deep clone.
|
|
* @returns {Object} Returns the cloned data view.
|
|
*/
|
|
function cloneDataView(dataView, isDeep) {
|
|
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
|
|
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of `regexp`.
|
|
*
|
|
* @private
|
|
* @param {Object} regexp The regexp to clone.
|
|
* @returns {Object} Returns the cloned regexp.
|
|
*/
|
|
function cloneRegExp(regexp) {
|
|
var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
|
|
result.lastIndex = regexp.lastIndex;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of the `symbol` object.
|
|
*
|
|
* @private
|
|
* @param {Object} symbol The symbol object to clone.
|
|
* @returns {Object} Returns the cloned symbol object.
|
|
*/
|
|
function cloneSymbol(symbol) {
|
|
return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of `typedArray`.
|
|
*
|
|
* @private
|
|
* @param {Object} typedArray The typed array to clone.
|
|
* @param {boolean} [isDeep] Specify a deep clone.
|
|
* @returns {Object} Returns the cloned typed array.
|
|
*/
|
|
function cloneTypedArray(typedArray, isDeep) {
|
|
var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
|
|
return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
|
|
}
|
|
|
|
/**
|
|
* Compares values to sort them in ascending order.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @returns {number} Returns the sort order indicator for `value`.
|
|
*/
|
|
function compareAscending(value, other) {
|
|
if (value !== other) {
|
|
var valIsDefined = value !== undefined,
|
|
valIsNull = value === null,
|
|
valIsReflexive = value === value,
|
|
valIsSymbol = isSymbol(value);
|
|
|
|
var othIsDefined = other !== undefined,
|
|
othIsNull = other === null,
|
|
othIsReflexive = other === other,
|
|
othIsSymbol = isSymbol(other);
|
|
|
|
if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
|
|
(valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
|
|
(valIsNull && othIsDefined && othIsReflexive) ||
|
|
(!valIsDefined && othIsReflexive) ||
|
|
!valIsReflexive) {
|
|
return 1;
|
|
}
|
|
if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
|
|
(othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
|
|
(othIsNull && valIsDefined && valIsReflexive) ||
|
|
(!othIsDefined && valIsReflexive) ||
|
|
!othIsReflexive) {
|
|
return -1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Used by `_.orderBy` to compare multiple properties of a value to another
|
|
* and stable sort them.
|
|
*
|
|
* If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
|
|
* specify an order of "desc" for descending or "asc" for ascending sort order
|
|
* of corresponding values.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to compare.
|
|
* @param {Object} other The other object to compare.
|
|
* @param {boolean[]|string[]} orders The order to sort by for each property.
|
|
* @returns {number} Returns the sort order indicator for `object`.
|
|
*/
|
|
function compareMultiple(object, other, orders) {
|
|
var index = -1,
|
|
objCriteria = object.criteria,
|
|
othCriteria = other.criteria,
|
|
length = objCriteria.length,
|
|
ordersLength = orders.length;
|
|
|
|
while (++index < length) {
|
|
var result = compareAscending(objCriteria[index], othCriteria[index]);
|
|
if (result) {
|
|
if (index >= ordersLength) {
|
|
return result;
|
|
}
|
|
var order = orders[index];
|
|
return result * (order == 'desc' ? -1 : 1);
|
|
}
|
|
}
|
|
// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
|
|
// that causes it, under certain circumstances, to provide the same value for
|
|
// `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
|
|
// for more details.
|
|
//
|
|
// This also ensures a stable sort in V8 and other engines.
|
|
// See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
|
|
return object.index - other.index;
|
|
}
|
|
|
|
/**
|
|
* Creates an array that is the composition of partially applied arguments,
|
|
* placeholders, and provided arguments into a single array of arguments.
|
|
*
|
|
* @private
|
|
* @param {Array} args The provided arguments.
|
|
* @param {Array} partials The arguments to prepend to those provided.
|
|
* @param {Array} holders The `partials` placeholder indexes.
|
|
* @params {boolean} [isCurried] Specify composing for a curried function.
|
|
* @returns {Array} Returns the new array of composed arguments.
|
|
*/
|
|
function composeArgs(args, partials, holders, isCurried) {
|
|
var argsIndex = -1,
|
|
argsLength = args.length,
|
|
holdersLength = holders.length,
|
|
leftIndex = -1,
|
|
leftLength = partials.length,
|
|
rangeLength = nativeMax(argsLength - holdersLength, 0),
|
|
result = Array(leftLength + rangeLength),
|
|
isUncurried = !isCurried;
|
|
|
|
while (++leftIndex < leftLength) {
|
|
result[leftIndex] = partials[leftIndex];
|
|
}
|
|
while (++argsIndex < holdersLength) {
|
|
if (isUncurried || argsIndex < argsLength) {
|
|
result[holders[argsIndex]] = args[argsIndex];
|
|
}
|
|
}
|
|
while (rangeLength--) {
|
|
result[leftIndex++] = args[argsIndex++];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* This function is like `composeArgs` except that the arguments composition
|
|
* is tailored for `_.partialRight`.
|
|
*
|
|
* @private
|
|
* @param {Array} args The provided arguments.
|
|
* @param {Array} partials The arguments to append to those provided.
|
|
* @param {Array} holders The `partials` placeholder indexes.
|
|
* @params {boolean} [isCurried] Specify composing for a curried function.
|
|
* @returns {Array} Returns the new array of composed arguments.
|
|
*/
|
|
function composeArgsRight(args, partials, holders, isCurried) {
|
|
var argsIndex = -1,
|
|
argsLength = args.length,
|
|
holdersIndex = -1,
|
|
holdersLength = holders.length,
|
|
rightIndex = -1,
|
|
rightLength = partials.length,
|
|
rangeLength = nativeMax(argsLength - holdersLength, 0),
|
|
result = Array(rangeLength + rightLength),
|
|
isUncurried = !isCurried;
|
|
|
|
while (++argsIndex < rangeLength) {
|
|
result[argsIndex] = args[argsIndex];
|
|
}
|
|
var offset = argsIndex;
|
|
while (++rightIndex < rightLength) {
|
|
result[offset + rightIndex] = partials[rightIndex];
|
|
}
|
|
while (++holdersIndex < holdersLength) {
|
|
if (isUncurried || argsIndex < argsLength) {
|
|
result[offset + holders[holdersIndex]] = args[argsIndex++];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Copies the values of `source` to `array`.
|
|
*
|
|
* @private
|
|
* @param {Array} source The array to copy values from.
|
|
* @param {Array} [array=[]] The array to copy values to.
|
|
* @returns {Array} Returns `array`.
|
|
*/
|
|
function copyArray(source, array) {
|
|
var index = -1,
|
|
length = source.length;
|
|
|
|
array || (array = Array(length));
|
|
while (++index < length) {
|
|
array[index] = source[index];
|
|
}
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* Copies properties of `source` to `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} source The object to copy properties from.
|
|
* @param {Array} props The property identifiers to copy.
|
|
* @param {Object} [object={}] The object to copy properties to.
|
|
* @param {Function} [customizer] The function to customize copied values.
|
|
* @returns {Object} Returns `object`.
|
|
*/
|
|
function copyObject(source, props, object, customizer) {
|
|
var isNew = !object;
|
|
object || (object = {});
|
|
|
|
var index = -1,
|
|
length = props.length;
|
|
|
|
while (++index < length) {
|
|
var key = props[index];
|
|
|
|
var newValue = customizer
|
|
? customizer(object[key], source[key], key, object, source)
|
|
: undefined;
|
|
|
|
if (newValue === undefined) {
|
|
newValue = source[key];
|
|
}
|
|
if (isNew) {
|
|
baseAssignValue(object, key, newValue);
|
|
} else {
|
|
assignValue(object, key, newValue);
|
|
}
|
|
}
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* Copies own symbols of `source` to `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} source The object to copy symbols from.
|
|
* @param {Object} [object={}] The object to copy symbols to.
|
|
* @returns {Object} Returns `object`.
|
|
*/
|
|
function copySymbols(source, object) {
|
|
return copyObject(source, getSymbols(source), object);
|
|
}
|
|
|
|
/**
|
|
* Copies own and inherited symbols of `source` to `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} source The object to copy symbols from.
|
|
* @param {Object} [object={}] The object to copy symbols to.
|
|
* @returns {Object} Returns `object`.
|
|
*/
|
|
function copySymbolsIn(source, object) {
|
|
return copyObject(source, getSymbolsIn(source), object);
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.groupBy`.
|
|
*
|
|
* @private
|
|
* @param {Function} setter The function to set accumulator values.
|
|
* @param {Function} [initializer] The accumulator object initializer.
|
|
* @returns {Function} Returns the new aggregator function.
|
|
*/
|
|
function createAggregator(setter, initializer) {
|
|
return function(collection, iteratee) {
|
|
var func = isArray(collection) ? arrayAggregator : baseAggregator,
|
|
accumulator = initializer ? initializer() : {};
|
|
|
|
return func(collection, setter, getIteratee(iteratee, 2), accumulator);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.assign`.
|
|
*
|
|
* @private
|
|
* @param {Function} assigner The function to assign values.
|
|
* @returns {Function} Returns the new assigner function.
|
|
*/
|
|
function createAssigner(assigner) {
|
|
return baseRest(function(object, sources) {
|
|
var index = -1,
|
|
length = sources.length,
|
|
customizer = length > 1 ? sources[length - 1] : undefined,
|
|
guard = length > 2 ? sources[2] : undefined;
|
|
|
|
customizer = (assigner.length > 3 && typeof customizer == 'function')
|
|
? (length--, customizer)
|
|
: undefined;
|
|
|
|
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
|
|
customizer = length < 3 ? undefined : customizer;
|
|
length = 1;
|
|
}
|
|
object = Object(object);
|
|
while (++index < length) {
|
|
var source = sources[index];
|
|
if (source) {
|
|
assigner(object, source, index, customizer);
|
|
}
|
|
}
|
|
return object;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates a `baseEach` or `baseEachRight` function.
|
|
*
|
|
* @private
|
|
* @param {Function} eachFunc The function to iterate over a collection.
|
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|
* @returns {Function} Returns the new base function.
|
|
*/
|
|
function createBaseEach(eachFunc, fromRight) {
|
|
return function(collection, iteratee) {
|
|
if (collection == null) {
|
|
return collection;
|
|
}
|
|
if (!isArrayLike(collection)) {
|
|
return eachFunc(collection, iteratee);
|
|
}
|
|
var length = collection.length,
|
|
index = fromRight ? length : -1,
|
|
iterable = Object(collection);
|
|
|
|
while ((fromRight ? index-- : ++index < length)) {
|
|
if (iteratee(iterable[index], index, iterable) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return collection;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a base function for methods like `_.forIn` and `_.forOwn`.
|
|
*
|
|
* @private
|
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|
* @returns {Function} Returns the new base function.
|
|
*/
|
|
function createBaseFor(fromRight) {
|
|
return function(object, iteratee, keysFunc) {
|
|
var index = -1,
|
|
iterable = Object(object),
|
|
props = keysFunc(object),
|
|
length = props.length;
|
|
|
|
while (length--) {
|
|
var key = props[fromRight ? length : ++index];
|
|
if (iteratee(iterable[key], key, iterable) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return object;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that wraps `func` to invoke it with the optional `this`
|
|
* binding of `thisArg`.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to wrap.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @param {*} [thisArg] The `this` binding of `func`.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createBind(func, bitmask, thisArg) {
|
|
var isBind = bitmask & WRAP_BIND_FLAG,
|
|
Ctor = createCtor(func);
|
|
|
|
function wrapper() {
|
|
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
|
|
return fn.apply(isBind ? thisArg : this, arguments);
|
|
}
|
|
return wrapper;
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.lowerFirst`.
|
|
*
|
|
* @private
|
|
* @param {string} methodName The name of the `String` case method to use.
|
|
* @returns {Function} Returns the new case function.
|
|
*/
|
|
function createCaseFirst(methodName) {
|
|
return function(string) {
|
|
string = toString(string);
|
|
|
|
var strSymbols = hasUnicode(string)
|
|
? stringToArray(string)
|
|
: undefined;
|
|
|
|
var chr = strSymbols
|
|
? strSymbols[0]
|
|
: string.charAt(0);
|
|
|
|
var trailing = strSymbols
|
|
? castSlice(strSymbols, 1).join('')
|
|
: string.slice(1);
|
|
|
|
return chr[methodName]() + trailing;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.camelCase`.
|
|
*
|
|
* @private
|
|
* @param {Function} callback The function to combine each word.
|
|
* @returns {Function} Returns the new compounder function.
|
|
*/
|
|
function createCompounder(callback) {
|
|
return function(string) {
|
|
return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that produces an instance of `Ctor` regardless of
|
|
* whether it was invoked as part of a `new` expression or by `call` or `apply`.
|
|
*
|
|
* @private
|
|
* @param {Function} Ctor The constructor to wrap.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createCtor(Ctor) {
|
|
return function() {
|
|
// Use a `switch` statement to work with class constructors. See
|
|
// http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
|
|
// for more details.
|
|
var args = arguments;
|
|
switch (args.length) {
|
|
case 0: return new Ctor;
|
|
case 1: return new Ctor(args[0]);
|
|
case 2: return new Ctor(args[0], args[1]);
|
|
case 3: return new Ctor(args[0], args[1], args[2]);
|
|
case 4: return new Ctor(args[0], args[1], args[2], args[3]);
|
|
case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
|
|
case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
|
|
case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
|
|
}
|
|
var thisBinding = baseCreate(Ctor.prototype),
|
|
result = Ctor.apply(thisBinding, args);
|
|
|
|
// Mimic the constructor's `return` behavior.
|
|
// See https://es5.github.io/#x13.2.2 for more details.
|
|
return isObject(result) ? result : thisBinding;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that wraps `func` to enable currying.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to wrap.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @param {number} arity The arity of `func`.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createCurry(func, bitmask, arity) {
|
|
var Ctor = createCtor(func);
|
|
|
|
function wrapper() {
|
|
var length = arguments.length,
|
|
args = Array(length),
|
|
index = length,
|
|
placeholder = getHolder(wrapper);
|
|
|
|
while (index--) {
|
|
args[index] = arguments[index];
|
|
}
|
|
var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
|
|
? []
|
|
: replaceHolders(args, placeholder);
|
|
|
|
length -= holders.length;
|
|
if (length < arity) {
|
|
return createRecurry(
|
|
func, bitmask, createHybrid, wrapper.placeholder, undefined,
|
|
args, holders, undefined, undefined, arity - length);
|
|
}
|
|
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
|
|
return apply(fn, this, args);
|
|
}
|
|
return wrapper;
|
|
}
|
|
|
|
/**
|
|
* Creates a `_.find` or `_.findLast` function.
|
|
*
|
|
* @private
|
|
* @param {Function} findIndexFunc The function to find the collection index.
|
|
* @returns {Function} Returns the new find function.
|
|
*/
|
|
function createFind(findIndexFunc) {
|
|
return function(collection, predicate, fromIndex) {
|
|
var iterable = Object(collection);
|
|
if (!isArrayLike(collection)) {
|
|
var iteratee = getIteratee(predicate, 3);
|
|
collection = keys(collection);
|
|
predicate = function(key) { return iteratee(iterable[key], key, iterable); };
|
|
}
|
|
var index = findIndexFunc(collection, predicate, fromIndex);
|
|
return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a `_.flow` or `_.flowRight` function.
|
|
*
|
|
* @private
|
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|
* @returns {Function} Returns the new flow function.
|
|
*/
|
|
function createFlow(fromRight) {
|
|
return flatRest(function(funcs) {
|
|
var length = funcs.length,
|
|
index = length,
|
|
prereq = LodashWrapper.prototype.thru;
|
|
|
|
if (fromRight) {
|
|
funcs.reverse();
|
|
}
|
|
while (index--) {
|
|
var func = funcs[index];
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
|
|
var wrapper = new LodashWrapper([], true);
|
|
}
|
|
}
|
|
index = wrapper ? index : length;
|
|
while (++index < length) {
|
|
func = funcs[index];
|
|
|
|
var funcName = getFuncName(func),
|
|
data = funcName == 'wrapper' ? getData(func) : undefined;
|
|
|
|
if (data && isLaziable(data[0]) &&
|
|
data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
|
|
!data[4].length && data[9] == 1
|
|
) {
|
|
wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
|
|
} else {
|
|
wrapper = (func.length == 1 && isLaziable(func))
|
|
? wrapper[funcName]()
|
|
: wrapper.thru(func);
|
|
}
|
|
}
|
|
return function() {
|
|
var args = arguments,
|
|
value = args[0];
|
|
|
|
if (wrapper && args.length == 1 && isArray(value)) {
|
|
return wrapper.plant(value).value();
|
|
}
|
|
var index = 0,
|
|
result = length ? funcs[index].apply(this, args) : value;
|
|
|
|
while (++index < length) {
|
|
result = funcs[index].call(this, result);
|
|
}
|
|
return result;
|
|
};
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates a function that wraps `func` to invoke it with optional `this`
|
|
* binding of `thisArg`, partial application, and currying.
|
|
*
|
|
* @private
|
|
* @param {Function|string} func The function or method name to wrap.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @param {*} [thisArg] The `this` binding of `func`.
|
|
* @param {Array} [partials] The arguments to prepend to those provided to
|
|
* the new function.
|
|
* @param {Array} [holders] The `partials` placeholder indexes.
|
|
* @param {Array} [partialsRight] The arguments to append to those provided
|
|
* to the new function.
|
|
* @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
|
|
* @param {Array} [argPos] The argument positions of the new function.
|
|
* @param {number} [ary] The arity cap of `func`.
|
|
* @param {number} [arity] The arity of `func`.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
|
|
var isAry = bitmask & WRAP_ARY_FLAG,
|
|
isBind = bitmask & WRAP_BIND_FLAG,
|
|
isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
|
|
isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
|
|
isFlip = bitmask & WRAP_FLIP_FLAG,
|
|
Ctor = isBindKey ? undefined : createCtor(func);
|
|
|
|
function wrapper() {
|
|
var length = arguments.length,
|
|
args = Array(length),
|
|
index = length;
|
|
|
|
while (index--) {
|
|
args[index] = arguments[index];
|
|
}
|
|
if (isCurried) {
|
|
var placeholder = getHolder(wrapper),
|
|
holdersCount = countHolders(args, placeholder);
|
|
}
|
|
if (partials) {
|
|
args = composeArgs(args, partials, holders, isCurried);
|
|
}
|
|
if (partialsRight) {
|
|
args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
|
|
}
|
|
length -= holdersCount;
|
|
if (isCurried && length < arity) {
|
|
var newHolders = replaceHolders(args, placeholder);
|
|
return createRecurry(
|
|
func, bitmask, createHybrid, wrapper.placeholder, thisArg,
|
|
args, newHolders, argPos, ary, arity - length
|
|
);
|
|
}
|
|
var thisBinding = isBind ? thisArg : this,
|
|
fn = isBindKey ? thisBinding[func] : func;
|
|
|
|
length = args.length;
|
|
if (argPos) {
|
|
args = reorder(args, argPos);
|
|
} else if (isFlip && length > 1) {
|
|
args.reverse();
|
|
}
|
|
if (isAry && ary < length) {
|
|
args.length = ary;
|
|
}
|
|
if (this && this !== root && this instanceof wrapper) {
|
|
fn = Ctor || createCtor(fn);
|
|
}
|
|
return fn.apply(thisBinding, args);
|
|
}
|
|
return wrapper;
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.invertBy`.
|
|
*
|
|
* @private
|
|
* @param {Function} setter The function to set accumulator values.
|
|
* @param {Function} toIteratee The function to resolve iteratees.
|
|
* @returns {Function} Returns the new inverter function.
|
|
*/
|
|
function createInverter(setter, toIteratee) {
|
|
return function(object, iteratee) {
|
|
return baseInverter(object, setter, toIteratee(iteratee), {});
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that performs a mathematical operation on two values.
|
|
*
|
|
* @private
|
|
* @param {Function} operator The function to perform the operation.
|
|
* @param {number} [defaultValue] The value used for `undefined` arguments.
|
|
* @returns {Function} Returns the new mathematical operation function.
|
|
*/
|
|
function createMathOperation(operator, defaultValue) {
|
|
return function(value, other) {
|
|
var result;
|
|
if (value === undefined && other === undefined) {
|
|
return defaultValue;
|
|
}
|
|
if (value !== undefined) {
|
|
result = value;
|
|
}
|
|
if (other !== undefined) {
|
|
if (result === undefined) {
|
|
return other;
|
|
}
|
|
if (typeof value == 'string' || typeof other == 'string') {
|
|
value = baseToString(value);
|
|
other = baseToString(other);
|
|
} else {
|
|
value = baseToNumber(value);
|
|
other = baseToNumber(other);
|
|
}
|
|
result = operator(value, other);
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.over`.
|
|
*
|
|
* @private
|
|
* @param {Function} arrayFunc The function to iterate over iteratees.
|
|
* @returns {Function} Returns the new over function.
|
|
*/
|
|
function createOver(arrayFunc) {
|
|
return flatRest(function(iteratees) {
|
|
iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
|
|
return baseRest(function(args) {
|
|
var thisArg = this;
|
|
return arrayFunc(iteratees, function(iteratee) {
|
|
return apply(iteratee, thisArg, args);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates the padding for `string` based on `length`. The `chars` string
|
|
* is truncated if the number of characters exceeds `length`.
|
|
*
|
|
* @private
|
|
* @param {number} length The padding length.
|
|
* @param {string} [chars=' '] The string used as padding.
|
|
* @returns {string} Returns the padding for `string`.
|
|
*/
|
|
function createPadding(length, chars) {
|
|
chars = chars === undefined ? ' ' : baseToString(chars);
|
|
|
|
var charsLength = chars.length;
|
|
if (charsLength < 2) {
|
|
return charsLength ? baseRepeat(chars, length) : chars;
|
|
}
|
|
var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
|
|
return hasUnicode(chars)
|
|
? castSlice(stringToArray(result), 0, length).join('')
|
|
: result.slice(0, length);
|
|
}
|
|
|
|
/**
|
|
* Creates a function that wraps `func` to invoke it with the `this` binding
|
|
* of `thisArg` and `partials` prepended to the arguments it receives.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to wrap.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @param {*} thisArg The `this` binding of `func`.
|
|
* @param {Array} partials The arguments to prepend to those provided to
|
|
* the new function.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createPartial(func, bitmask, thisArg, partials) {
|
|
var isBind = bitmask & WRAP_BIND_FLAG,
|
|
Ctor = createCtor(func);
|
|
|
|
function wrapper() {
|
|
var argsIndex = -1,
|
|
argsLength = arguments.length,
|
|
leftIndex = -1,
|
|
leftLength = partials.length,
|
|
args = Array(leftLength + argsLength),
|
|
fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
|
|
|
|
while (++leftIndex < leftLength) {
|
|
args[leftIndex] = partials[leftIndex];
|
|
}
|
|
while (argsLength--) {
|
|
args[leftIndex++] = arguments[++argsIndex];
|
|
}
|
|
return apply(fn, isBind ? thisArg : this, args);
|
|
}
|
|
return wrapper;
|
|
}
|
|
|
|
/**
|
|
* Creates a `_.range` or `_.rangeRight` function.
|
|
*
|
|
* @private
|
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|
* @returns {Function} Returns the new range function.
|
|
*/
|
|
function createRange(fromRight) {
|
|
return function(start, end, step) {
|
|
if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
|
|
end = step = undefined;
|
|
}
|
|
// Ensure the sign of `-0` is preserved.
|
|
start = toFinite(start);
|
|
if (end === undefined) {
|
|
end = start;
|
|
start = 0;
|
|
} else {
|
|
end = toFinite(end);
|
|
}
|
|
step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
|
|
return baseRange(start, end, step, fromRight);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that performs a relational operation on two values.
|
|
*
|
|
* @private
|
|
* @param {Function} operator The function to perform the operation.
|
|
* @returns {Function} Returns the new relational operation function.
|
|
*/
|
|
function createRelationalOperation(operator) {
|
|
return function(value, other) {
|
|
if (!(typeof value == 'string' && typeof other == 'string')) {
|
|
value = toNumber(value);
|
|
other = toNumber(other);
|
|
}
|
|
return operator(value, other);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that wraps `func` to continue currying.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to wrap.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @param {Function} wrapFunc The function to create the `func` wrapper.
|
|
* @param {*} placeholder The placeholder value.
|
|
* @param {*} [thisArg] The `this` binding of `func`.
|
|
* @param {Array} [partials] The arguments to prepend to those provided to
|
|
* the new function.
|
|
* @param {Array} [holders] The `partials` placeholder indexes.
|
|
* @param {Array} [argPos] The argument positions of the new function.
|
|
* @param {number} [ary] The arity cap of `func`.
|
|
* @param {number} [arity] The arity of `func`.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
|
|
var isCurry = bitmask & WRAP_CURRY_FLAG,
|
|
newHolders = isCurry ? holders : undefined,
|
|
newHoldersRight = isCurry ? undefined : holders,
|
|
newPartials = isCurry ? partials : undefined,
|
|
newPartialsRight = isCurry ? undefined : partials;
|
|
|
|
bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
|
|
bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
|
|
|
|
if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
|
|
bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
|
|
}
|
|
var newData = [
|
|
func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
|
|
newHoldersRight, argPos, ary, arity
|
|
];
|
|
|
|
var result = wrapFunc.apply(undefined, newData);
|
|
if (isLaziable(func)) {
|
|
setData(result, newData);
|
|
}
|
|
result.placeholder = placeholder;
|
|
return setWrapToString(result, func, bitmask);
|
|
}
|
|
|
|
/**
|
|
* Creates a function like `_.round`.
|
|
*
|
|
* @private
|
|
* @param {string} methodName The name of the `Math` method to use when rounding.
|
|
* @returns {Function} Returns the new round function.
|
|
*/
|
|
function createRound(methodName) {
|
|
var func = Math[methodName];
|
|
return function(number, precision) {
|
|
number = toNumber(number);
|
|
precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
|
|
if (precision && nativeIsFinite(number)) {
|
|
// Shift with exponential notation to avoid floating-point issues.
|
|
// See [MDN](https://mdn.io/round#Examples) for more details.
|
|
var pair = (toString(number) + 'e').split('e'),
|
|
value = func(pair[0] + 'e' + (+pair[1] + precision));
|
|
|
|
pair = (toString(value) + 'e').split('e');
|
|
return +(pair[0] + 'e' + (+pair[1] - precision));
|
|
}
|
|
return func(number);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a set object of `values`.
|
|
*
|
|
* @private
|
|
* @param {Array} values The values to add to the set.
|
|
* @returns {Object} Returns the new set.
|
|
*/
|
|
var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
|
|
return new Set(values);
|
|
};
|
|
|
|
/**
|
|
* Creates a `_.toPairs` or `_.toPairsIn` function.
|
|
*
|
|
* @private
|
|
* @param {Function} keysFunc The function to get the keys of a given object.
|
|
* @returns {Function} Returns the new pairs function.
|
|
*/
|
|
function createToPairs(keysFunc) {
|
|
return function(object) {
|
|
var tag = getTag(object);
|
|
if (tag == mapTag) {
|
|
return mapToArray(object);
|
|
}
|
|
if (tag == setTag) {
|
|
return setToPairs(object);
|
|
}
|
|
return baseToPairs(object, keysFunc(object));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that either curries or invokes `func` with optional
|
|
* `this` binding and partially applied arguments.
|
|
*
|
|
* @private
|
|
* @param {Function|string} func The function or method name to wrap.
|
|
* @param {number} bitmask The bitmask flags.
|
|
* 1 - `_.bind`
|
|
* 2 - `_.bindKey`
|
|
* 4 - `_.curry` or `_.curryRight` of a bound function
|
|
* 8 - `_.curry`
|
|
* 16 - `_.curryRight`
|
|
* 32 - `_.partial`
|
|
* 64 - `_.partialRight`
|
|
* 128 - `_.rearg`
|
|
* 256 - `_.ary`
|
|
* 512 - `_.flip`
|
|
* @param {*} [thisArg] The `this` binding of `func`.
|
|
* @param {Array} [partials] The arguments to be partially applied.
|
|
* @param {Array} [holders] The `partials` placeholder indexes.
|
|
* @param {Array} [argPos] The argument positions of the new function.
|
|
* @param {number} [ary] The arity cap of `func`.
|
|
* @param {number} [arity] The arity of `func`.
|
|
* @returns {Function} Returns the new wrapped function.
|
|
*/
|
|
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
|
|
var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
|
|
if (!isBindKey && typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
var length = partials ? partials.length : 0;
|
|
if (!length) {
|
|
bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
|
|
partials = holders = undefined;
|
|
}
|
|
ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
|
|
arity = arity === undefined ? arity : toInteger(arity);
|
|
length -= holders ? holders.length : 0;
|
|
|
|
if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
|
|
var partialsRight = partials,
|
|
holdersRight = holders;
|
|
|
|
partials = holders = undefined;
|
|
}
|
|
var data = isBindKey ? undefined : getData(func);
|
|
|
|
var newData = [
|
|
func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
|
|
argPos, ary, arity
|
|
];
|
|
|
|
if (data) {
|
|
mergeData(newData, data);
|
|
}
|
|
func = newData[0];
|
|
bitmask = newData[1];
|
|
thisArg = newData[2];
|
|
partials = newData[3];
|
|
holders = newData[4];
|
|
arity = newData[9] = newData[9] === undefined
|
|
? (isBindKey ? 0 : func.length)
|
|
: nativeMax(newData[9] - length, 0);
|
|
|
|
if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
|
|
bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
|
|
}
|
|
if (!bitmask || bitmask == WRAP_BIND_FLAG) {
|
|
var result = createBind(func, bitmask, thisArg);
|
|
} else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
|
|
result = createCurry(func, bitmask, arity);
|
|
} else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
|
|
result = createPartial(func, bitmask, thisArg, partials);
|
|
} else {
|
|
result = createHybrid.apply(undefined, newData);
|
|
}
|
|
var setter = data ? baseSetData : setData;
|
|
return setWrapToString(setter(result, newData), func, bitmask);
|
|
}
|
|
|
|
/**
|
|
* Used by `_.defaults` to customize its `_.assignIn` use to assign properties
|
|
* of source objects to the destination object for all destination properties
|
|
* that resolve to `undefined`.
|
|
*
|
|
* @private
|
|
* @param {*} objValue The destination value.
|
|
* @param {*} srcValue The source value.
|
|
* @param {string} key The key of the property to assign.
|
|
* @param {Object} object The parent object of `objValue`.
|
|
* @returns {*} Returns the value to assign.
|
|
*/
|
|
function customDefaultsAssignIn(objValue, srcValue, key, object) {
|
|
if (objValue === undefined ||
|
|
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
|
|
return srcValue;
|
|
}
|
|
return objValue;
|
|
}
|
|
|
|
/**
|
|
* Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
|
|
* objects into destination objects that are passed thru.
|
|
*
|
|
* @private
|
|
* @param {*} objValue The destination value.
|
|
* @param {*} srcValue The source value.
|
|
* @param {string} key The key of the property to merge.
|
|
* @param {Object} object The parent object of `objValue`.
|
|
* @param {Object} source The parent object of `srcValue`.
|
|
* @param {Object} [stack] Tracks traversed source values and their merged
|
|
* counterparts.
|
|
* @returns {*} Returns the value to assign.
|
|
*/
|
|
function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
|
|
if (isObject(objValue) && isObject(srcValue)) {
|
|
// Recursively merge objects and arrays (susceptible to call stack limits).
|
|
stack.set(srcValue, objValue);
|
|
baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
|
|
stack['delete'](srcValue);
|
|
}
|
|
return objValue;
|
|
}
|
|
|
|
/**
|
|
* Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
|
|
* objects.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to inspect.
|
|
* @param {string} key The key of the property to inspect.
|
|
* @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
|
|
*/
|
|
function customOmitClone(value) {
|
|
return isPlainObject(value) ? undefined : value;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseIsEqualDeep` for arrays with support for
|
|
* partial deep comparisons.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to compare.
|
|
* @param {Array} other The other array 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 `array` and `other` objects.
|
|
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
|
|
*/
|
|
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
|
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
|
|
arrLength = array.length,
|
|
othLength = other.length;
|
|
|
|
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
|
|
return false;
|
|
}
|
|
// Check that cyclic values are equal.
|
|
var arrStacked = stack.get(array);
|
|
var othStacked = stack.get(other);
|
|
if (arrStacked && othStacked) {
|
|
return arrStacked == other && othStacked == array;
|
|
}
|
|
var index = -1,
|
|
result = true,
|
|
seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
|
|
|
|
stack.set(array, other);
|
|
stack.set(other, array);
|
|
|
|
// Ignore non-index properties.
|
|
while (++index < arrLength) {
|
|
var arrValue = array[index],
|
|
othValue = other[index];
|
|
|
|
if (customizer) {
|
|
var compared = isPartial
|
|
? customizer(othValue, arrValue, index, other, array, stack)
|
|
: customizer(arrValue, othValue, index, array, other, stack);
|
|
}
|
|
if (compared !== undefined) {
|
|
if (compared) {
|
|
continue;
|
|
}
|
|
result = false;
|
|
break;
|
|
}
|
|
// Recursively compare arrays (susceptible to call stack limits).
|
|
if (seen) {
|
|
if (!arraySome(other, function(othValue, othIndex) {
|
|
if (!cacheHas(seen, othIndex) &&
|
|
(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
|
|
return seen.push(othIndex);
|
|
}
|
|
})) {
|
|
result = false;
|
|
break;
|
|
}
|
|
} else if (!(
|
|
arrValue === othValue ||
|
|
equalFunc(arrValue, othValue, bitmask, customizer, stack)
|
|
)) {
|
|
result = false;
|
|
break;
|
|
}
|
|
}
|
|
stack['delete'](array);
|
|
stack['delete'](other);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseIsEqualDeep` for comparing objects of
|
|
* the same `toStringTag`.
|
|
*
|
|
* **Note:** This function only supports comparing values with tags of
|
|
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to compare.
|
|
* @param {Object} other The other object to compare.
|
|
* @param {string} tag The `toStringTag` of the objects 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 equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
|
|
switch (tag) {
|
|
case dataViewTag:
|
|
if ((object.byteLength != other.byteLength) ||
|
|
(object.byteOffset != other.byteOffset)) {
|
|
return false;
|
|
}
|
|
object = object.buffer;
|
|
other = other.buffer;
|
|
|
|
case arrayBufferTag:
|
|
if ((object.byteLength != other.byteLength) ||
|
|
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
|
|
return false;
|
|
}
|
|
return true;
|
|
|
|
case boolTag:
|
|
case dateTag:
|
|
case numberTag:
|
|
// Coerce booleans to `1` or `0` and dates to milliseconds.
|
|
// Invalid dates are coerced to `NaN`.
|
|
return eq(+object, +other);
|
|
|
|
case errorTag:
|
|
return object.name == other.name && object.message == other.message;
|
|
|
|
case regexpTag:
|
|
case stringTag:
|
|
// Coerce regexes to strings and treat strings, primitives and objects,
|
|
// as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
|
|
// for more details.
|
|
return object == (other + '');
|
|
|
|
case mapTag:
|
|
var convert = mapToArray;
|
|
|
|
case setTag:
|
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
|
|
convert || (convert = setToArray);
|
|
|
|
if (object.size != other.size && !isPartial) {
|
|
return false;
|
|
}
|
|
// Assume cyclic values are equal.
|
|
var stacked = stack.get(object);
|
|
if (stacked) {
|
|
return stacked == other;
|
|
}
|
|
bitmask |= COMPARE_UNORDERED_FLAG;
|
|
|
|
// Recursively compare objects (susceptible to call stack limits).
|
|
stack.set(object, other);
|
|
var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
|
|
stack['delete'](object);
|
|
return result;
|
|
|
|
case symbolTag:
|
|
if (symbolValueOf) {
|
|
return symbolValueOf.call(object) == symbolValueOf.call(other);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseIsEqualDeep` for objects with support for
|
|
* partial deep comparisons.
|
|
*
|
|
* @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 equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
|
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
|
|
objProps = getAllKeys(object),
|
|
objLength = objProps.length,
|
|
othProps = getAllKeys(other),
|
|
othLength = othProps.length;
|
|
|
|
if (objLength != othLength && !isPartial) {
|
|
return false;
|
|
}
|
|
var index = objLength;
|
|
while (index--) {
|
|
var key = objProps[index];
|
|
if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
|
|
return false;
|
|
}
|
|
}
|
|
// Check that cyclic values are equal.
|
|
var objStacked = stack.get(object);
|
|
var othStacked = stack.get(other);
|
|
if (objStacked && othStacked) {
|
|
return objStacked == other && othStacked == object;
|
|
}
|
|
var result = true;
|
|
stack.set(object, other);
|
|
stack.set(other, object);
|
|
|
|
var skipCtor = isPartial;
|
|
while (++index < objLength) {
|
|
key = objProps[index];
|
|
var objValue = object[key],
|
|
othValue = other[key];
|
|
|
|
if (customizer) {
|
|
var compared = isPartial
|
|
? customizer(othValue, objValue, key, other, object, stack)
|
|
: customizer(objValue, othValue, key, object, other, stack);
|
|
}
|
|
// Recursively compare objects (susceptible to call stack limits).
|
|
if (!(compared === undefined
|
|
? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
|
|
: compared
|
|
)) {
|
|
result = false;
|
|
break;
|
|
}
|
|
skipCtor || (skipCtor = key == 'constructor');
|
|
}
|
|
if (result && !skipCtor) {
|
|
var objCtor = object.constructor,
|
|
othCtor = other.constructor;
|
|
|
|
// Non `Object` object instances with different constructors are not equal.
|
|
if (objCtor != othCtor &&
|
|
('constructor' in object && 'constructor' in other) &&
|
|
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
|
|
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
|
|
result = false;
|
|
}
|
|
}
|
|
stack['delete'](object);
|
|
stack['delete'](other);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseRest` which flattens the rest array.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to apply a rest parameter to.
|
|
* @returns {Function} Returns the new function.
|
|
*/
|
|
function flatRest(func) {
|
|
return setToString(overRest(func, undefined, flatten), func + '');
|
|
}
|
|
|
|
/**
|
|
* Creates an array of own enumerable property names and symbols of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names and symbols.
|
|
*/
|
|
function getAllKeys(object) {
|
|
return baseGetAllKeys(object, keys, getSymbols);
|
|
}
|
|
|
|
/**
|
|
* Creates an array of own and inherited enumerable property names and
|
|
* symbols of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names and symbols.
|
|
*/
|
|
function getAllKeysIn(object) {
|
|
return baseGetAllKeys(object, keysIn, getSymbolsIn);
|
|
}
|
|
|
|
/**
|
|
* Gets metadata for `func`.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to query.
|
|
* @returns {*} Returns the metadata for `func`.
|
|
*/
|
|
var getData = !metaMap ? noop : function(func) {
|
|
return metaMap.get(func);
|
|
};
|
|
|
|
/**
|
|
* Gets the name of `func`.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to query.
|
|
* @returns {string} Returns the function name.
|
|
*/
|
|
function getFuncName(func) {
|
|
var result = (func.name + ''),
|
|
array = realNames[result],
|
|
length = hasOwnProperty.call(realNames, result) ? array.length : 0;
|
|
|
|
while (length--) {
|
|
var data = array[length],
|
|
otherFunc = data.func;
|
|
if (otherFunc == null || otherFunc == func) {
|
|
return data.name;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Gets the argument placeholder value for `func`.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to inspect.
|
|
* @returns {*} Returns the placeholder value.
|
|
*/
|
|
function getHolder(func) {
|
|
var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
|
|
return object.placeholder;
|
|
}
|
|
|
|
/**
|
|
* Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
|
|
* this function returns the custom method, otherwise it returns `baseIteratee`.
|
|
* If arguments are provided, the chosen function is invoked with them and
|
|
* its result is returned.
|
|
*
|
|
* @private
|
|
* @param {*} [value] The value to convert to an iteratee.
|
|
* @param {number} [arity] The arity of the created iteratee.
|
|
* @returns {Function} Returns the chosen function or its result.
|
|
*/
|
|
function getIteratee() {
|
|
var result = lodash.iteratee || iteratee;
|
|
result = result === iteratee ? baseIteratee : result;
|
|
return arguments.length ? result(arguments[0], arguments[1]) : result;
|
|
}
|
|
|
|
/**
|
|
* Gets the data for `map`.
|
|
*
|
|
* @private
|
|
* @param {Object} map The map to query.
|
|
* @param {string} key The reference key.
|
|
* @returns {*} Returns the map data.
|
|
*/
|
|
function getMapData(map, key) {
|
|
var data = map.__data__;
|
|
return isKeyable(key)
|
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|
: data.map;
|
|
}
|
|
|
|
/**
|
|
* Gets the property names, values, and compare flags of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the match data of `object`.
|
|
*/
|
|
function getMatchData(object) {
|
|
var result = keys(object),
|
|
length = result.length;
|
|
|
|
while (length--) {
|
|
var key = result[length],
|
|
value = object[key];
|
|
|
|
result[length] = [key, value, isStrictComparable(value)];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Gets the native function at `key` of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @param {string} key The key of the method to get.
|
|
* @returns {*} Returns the function if it's native, else `undefined`.
|
|
*/
|
|
function getNative(object, key) {
|
|
var value = getValue(object, key);
|
|
return baseIsNative(value) ? value : undefined;
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to query.
|
|
* @returns {string} Returns the raw `toStringTag`.
|
|
*/
|
|
function getRawTag(value) {
|
|
var isOwn = hasOwnProperty.call(value, symToStringTag),
|
|
tag = value[symToStringTag];
|
|
|
|
try {
|
|
value[symToStringTag] = undefined;
|
|
var unmasked = true;
|
|
} catch (e) {}
|
|
|
|
var result = nativeObjectToString.call(value);
|
|
if (unmasked) {
|
|
if (isOwn) {
|
|
value[symToStringTag] = tag;
|
|
} else {
|
|
delete value[symToStringTag];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates an array of the own enumerable symbols of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of symbols.
|
|
*/
|
|
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
|
|
if (object == null) {
|
|
return [];
|
|
}
|
|
object = Object(object);
|
|
return arrayFilter(nativeGetSymbols(object), function(symbol) {
|
|
return propertyIsEnumerable.call(object, symbol);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Creates an array of the own and inherited enumerable symbols of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of symbols.
|
|
*/
|
|
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
|
|
var result = [];
|
|
while (object) {
|
|
arrayPush(result, getSymbols(object));
|
|
object = getPrototype(object);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
/**
|
|
* Gets the `toStringTag` of `value`.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to query.
|
|
* @returns {string} Returns the `toStringTag`.
|
|
*/
|
|
var getTag = baseGetTag;
|
|
|
|
// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
|
|
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
|
|
(Map && getTag(new Map) != mapTag) ||
|
|
(Promise && getTag(Promise.resolve()) != promiseTag) ||
|
|
(Set && getTag(new Set) != setTag) ||
|
|
(WeakMap && getTag(new WeakMap) != weakMapTag)) {
|
|
getTag = function(value) {
|
|
var result = baseGetTag(value),
|
|
Ctor = result == objectTag ? value.constructor : undefined,
|
|
ctorString = Ctor ? toSource(Ctor) : '';
|
|
|
|
if (ctorString) {
|
|
switch (ctorString) {
|
|
case dataViewCtorString: return dataViewTag;
|
|
case mapCtorString: return mapTag;
|
|
case promiseCtorString: return promiseTag;
|
|
case setCtorString: return setTag;
|
|
case weakMapCtorString: return weakMapTag;
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Gets the view, applying any `transforms` to the `start` and `end` positions.
|
|
*
|
|
* @private
|
|
* @param {number} start The start of the view.
|
|
* @param {number} end The end of the view.
|
|
* @param {Array} transforms The transformations to apply to the view.
|
|
* @returns {Object} Returns an object containing the `start` and `end`
|
|
* positions of the view.
|
|
*/
|
|
function getView(start, end, transforms) {
|
|
var index = -1,
|
|
length = transforms.length;
|
|
|
|
while (++index < length) {
|
|
var data = transforms[index],
|
|
size = data.size;
|
|
|
|
switch (data.type) {
|
|
case 'drop': start += size; break;
|
|
case 'dropRight': end -= size; break;
|
|
case 'take': end = nativeMin(end, start + size); break;
|
|
case 'takeRight': start = nativeMax(start, end - size); break;
|
|
}
|
|
}
|
|
return { 'start': start, 'end': end };
|
|
}
|
|
|
|
/**
|
|
* Extracts wrapper details from the `source` body comment.
|
|
*
|
|
* @private
|
|
* @param {string} source The source to inspect.
|
|
* @returns {Array} Returns the wrapper details.
|
|
*/
|
|
function getWrapDetails(source) {
|
|
var match = source.match(reWrapDetails);
|
|
return match ? match[1].split(reSplitDetails) : [];
|
|
}
|
|
|
|
/**
|
|
* Checks if `path` exists on `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @param {Array|string} path The path to check.
|
|
* @param {Function} hasFunc The function to check properties.
|
|
* @returns {boolean} Returns `true` if `path` exists, else `false`.
|
|
*/
|
|
function hasPath(object, path, hasFunc) {
|
|
path = castPath(path, object);
|
|
|
|
var index = -1,
|
|
length = path.length,
|
|
result = false;
|
|
|
|
while (++index < length) {
|
|
var key = toKey(path[index]);
|
|
if (!(result = object != null && hasFunc(object, key))) {
|
|
break;
|
|
}
|
|
object = object[key];
|
|
}
|
|
if (result || ++index != length) {
|
|
return result;
|
|
}
|
|
length = object == null ? 0 : object.length;
|
|
return !!length && isLength(length) && isIndex(key, length) &&
|
|
(isArray(object) || isArguments(object));
|
|
}
|
|
|
|
/**
|
|
* Initializes an array clone.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to clone.
|
|
* @returns {Array} Returns the initialized clone.
|
|
*/
|
|
function initCloneArray(array) {
|
|
var length = array.length,
|
|
result = new array.constructor(length);
|
|
|
|
// Add properties assigned by `RegExp#exec`.
|
|
if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
|
|
result.index = array.index;
|
|
result.input = array.input;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Initializes an object clone.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to clone.
|
|
* @returns {Object} Returns the initialized clone.
|
|
*/
|
|
function initCloneObject(object) {
|
|
return (typeof object.constructor == 'function' && !isPrototype(object))
|
|
? baseCreate(getPrototype(object))
|
|
: {};
|
|
}
|
|
|
|
/**
|
|
* Initializes an object clone based on its `toStringTag`.
|
|
*
|
|
* **Note:** This function only supports cloning values with tags of
|
|
* `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to clone.
|
|
* @param {string} tag The `toStringTag` of the object to clone.
|
|
* @param {boolean} [isDeep] Specify a deep clone.
|
|
* @returns {Object} Returns the initialized clone.
|
|
*/
|
|
function initCloneByTag(object, tag, isDeep) {
|
|
var Ctor = object.constructor;
|
|
switch (tag) {
|
|
case arrayBufferTag:
|
|
return cloneArrayBuffer(object);
|
|
|
|
case boolTag:
|
|
case dateTag:
|
|
return new Ctor(+object);
|
|
|
|
case dataViewTag:
|
|
return cloneDataView(object, isDeep);
|
|
|
|
case float32Tag: case float64Tag:
|
|
case int8Tag: case int16Tag: case int32Tag:
|
|
case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
|
|
return cloneTypedArray(object, isDeep);
|
|
|
|
case mapTag:
|
|
return new Ctor;
|
|
|
|
case numberTag:
|
|
case stringTag:
|
|
return new Ctor(object);
|
|
|
|
case regexpTag:
|
|
return cloneRegExp(object);
|
|
|
|
case setTag:
|
|
return new Ctor;
|
|
|
|
case symbolTag:
|
|
return cloneSymbol(object);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Inserts wrapper `details` in a comment at the top of the `source` body.
|
|
*
|
|
* @private
|
|
* @param {string} source The source to modify.
|
|
* @returns {Array} details The details to insert.
|
|
* @returns {string} Returns the modified source.
|
|
*/
|
|
function insertWrapDetails(source, details) {
|
|
var length = details.length;
|
|
if (!length) {
|
|
return source;
|
|
}
|
|
var lastIndex = length - 1;
|
|
details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
|
|
details = details.join(length > 2 ? ', ' : ' ');
|
|
return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a flattenable `arguments` object or array.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
|
|
*/
|
|
function isFlattenable(value) {
|
|
return isArray(value) || isArguments(value) ||
|
|
!!(spreadableSymbol && value && value[spreadableSymbol]);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a valid array-like index.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
|
|
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
|
|
*/
|
|
function isIndex(value, length) {
|
|
var type = typeof value;
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
|
|
return !!length &&
|
|
(type == 'number' ||
|
|
(type != 'symbol' && reIsUint.test(value))) &&
|
|
(value > -1 && value % 1 == 0 && value < length);
|
|
}
|
|
|
|
/**
|
|
* Checks if the given arguments are from an iteratee call.
|
|
*
|
|
* @private
|
|
* @param {*} value The potential iteratee value argument.
|
|
* @param {*} index The potential iteratee index or key argument.
|
|
* @param {*} object The potential iteratee object argument.
|
|
* @returns {boolean} Returns `true` if the arguments are from an iteratee call,
|
|
* else `false`.
|
|
*/
|
|
function isIterateeCall(value, index, object) {
|
|
if (!isObject(object)) {
|
|
return false;
|
|
}
|
|
var type = typeof index;
|
|
if (type == 'number'
|
|
? (isArrayLike(object) && isIndex(index, object.length))
|
|
: (type == 'string' && index in object)
|
|
) {
|
|
return eq(object[index], value);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a property name and not a property path.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @param {Object} [object] The object to query keys on.
|
|
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
|
|
*/
|
|
function isKey(value, object) {
|
|
if (isArray(value)) {
|
|
return false;
|
|
}
|
|
var type = typeof value;
|
|
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
|
|
value == null || isSymbol(value)) {
|
|
return true;
|
|
}
|
|
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
|
(object != null && value in Object(object));
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is suitable for use as unique object key.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
|
*/
|
|
function isKeyable(value) {
|
|
var type = typeof value;
|
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|
? (value !== '__proto__')
|
|
: (value === null);
|
|
}
|
|
|
|
/**
|
|
* Checks if `func` has a lazy counterpart.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to check.
|
|
* @returns {boolean} Returns `true` if `func` has a lazy counterpart,
|
|
* else `false`.
|
|
*/
|
|
function isLaziable(func) {
|
|
var funcName = getFuncName(func),
|
|
other = lodash[funcName];
|
|
|
|
if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
|
|
return false;
|
|
}
|
|
if (func === other) {
|
|
return true;
|
|
}
|
|
var data = getData(other);
|
|
return !!data && func === data[0];
|
|
}
|
|
|
|
/**
|
|
* Checks if `func` has its source masked.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to check.
|
|
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
|
*/
|
|
function isMasked(func) {
|
|
return !!maskSrcKey && (maskSrcKey in func);
|
|
}
|
|
|
|
/**
|
|
* Checks if `func` is capable of being masked.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `func` is maskable, else `false`.
|
|
*/
|
|
var isMaskable = coreJsData ? isFunction : stubFalse;
|
|
|
|
/**
|
|
* Checks if `value` is likely a prototype object.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
|
|
*/
|
|
function isPrototype(value) {
|
|
var Ctor = value && value.constructor,
|
|
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
|
|
|
|
return value === proto;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` if suitable for strict
|
|
* equality comparisons, else `false`.
|
|
*/
|
|
function isStrictComparable(value) {
|
|
return value === value && !isObject(value);
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `matchesProperty` for source values suitable
|
|
* for strict equality comparisons, i.e. `===`.
|
|
*
|
|
* @private
|
|
* @param {string} key The key of the property to get.
|
|
* @param {*} srcValue The value to match.
|
|
* @returns {Function} Returns the new spec function.
|
|
*/
|
|
function matchesStrictComparable(key, srcValue) {
|
|
return function(object) {
|
|
if (object == null) {
|
|
return false;
|
|
}
|
|
return object[key] === srcValue &&
|
|
(srcValue !== undefined || (key in Object(object)));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `_.memoize` which clears the memoized function's
|
|
* cache when it exceeds `MAX_MEMOIZE_SIZE`.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to have its output memoized.
|
|
* @returns {Function} Returns the new memoized function.
|
|
*/
|
|
function memoizeCapped(func) {
|
|
var result = memoize(func, function(key) {
|
|
if (cache.size === MAX_MEMOIZE_SIZE) {
|
|
cache.clear();
|
|
}
|
|
return key;
|
|
});
|
|
|
|
var cache = result.cache;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Merges the function metadata of `source` into `data`.
|
|
*
|
|
* Merging metadata reduces the number of wrappers used to invoke a function.
|
|
* This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
|
|
* may be applied regardless of execution order. Methods like `_.ary` and
|
|
* `_.rearg` modify function arguments, making the order in which they are
|
|
* executed important, preventing the merging of metadata. However, we make
|
|
* an exception for a safe combined case where curried functions have `_.ary`
|
|
* and or `_.rearg` applied.
|
|
*
|
|
* @private
|
|
* @param {Array} data The destination metadata.
|
|
* @param {Array} source The source metadata.
|
|
* @returns {Array} Returns `data`.
|
|
*/
|
|
function mergeData(data, source) {
|
|
var bitmask = data[1],
|
|
srcBitmask = source[1],
|
|
newBitmask = bitmask | srcBitmask,
|
|
isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
|
|
|
|
var isCombo =
|
|
((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
|
|
((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
|
|
((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
|
|
|
|
// Exit early if metadata can't be merged.
|
|
if (!(isCommon || isCombo)) {
|
|
return data;
|
|
}
|
|
// Use source `thisArg` if available.
|
|
if (srcBitmask & WRAP_BIND_FLAG) {
|
|
data[2] = source[2];
|
|
// Set when currying a bound function.
|
|
newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
|
|
}
|
|
// Compose partial arguments.
|
|
var value = source[3];
|
|
if (value) {
|
|
var partials = data[3];
|
|
data[3] = partials ? composeArgs(partials, value, source[4]) : value;
|
|
data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
|
|
}
|
|
// Compose partial right arguments.
|
|
value = source[5];
|
|
if (value) {
|
|
partials = data[5];
|
|
data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
|
|
data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
|
|
}
|
|
// Use source `argPos` if available.
|
|
value = source[7];
|
|
if (value) {
|
|
data[7] = value;
|
|
}
|
|
// Use source `ary` if it's smaller.
|
|
if (srcBitmask & WRAP_ARY_FLAG) {
|
|
data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
|
|
}
|
|
// Use source `arity` if one is not provided.
|
|
if (data[9] == null) {
|
|
data[9] = source[9];
|
|
}
|
|
// Use source `func` and merge bitmasks.
|
|
data[0] = source[0];
|
|
data[1] = newBitmask;
|
|
|
|
return data;
|
|
}
|
|
|
|
/**
|
|
* This function is like
|
|
* [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
|
|
* except that it includes inherited enumerable properties.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names.
|
|
*/
|
|
function nativeKeysIn(object) {
|
|
var result = [];
|
|
if (object != null) {
|
|
for (var key in Object(object)) {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a string using `Object.prototype.toString`.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to convert.
|
|
* @returns {string} Returns the converted string.
|
|
*/
|
|
function objectToString(value) {
|
|
return nativeObjectToString.call(value);
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `baseRest` which transforms the rest array.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to apply a rest parameter to.
|
|
* @param {number} [start=func.length-1] The start position of the rest parameter.
|
|
* @param {Function} transform The rest array transform.
|
|
* @returns {Function} Returns the new function.
|
|
*/
|
|
function overRest(func, start, transform) {
|
|
start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
|
|
return function() {
|
|
var args = arguments,
|
|
index = -1,
|
|
length = nativeMax(args.length - start, 0),
|
|
array = Array(length);
|
|
|
|
while (++index < length) {
|
|
array[index] = args[start + index];
|
|
}
|
|
index = -1;
|
|
var otherArgs = Array(start + 1);
|
|
while (++index < start) {
|
|
otherArgs[index] = args[index];
|
|
}
|
|
otherArgs[start] = transform(array);
|
|
return apply(func, this, otherArgs);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Gets the parent value at `path` of `object`.
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @param {Array} path The path to get the parent value of.
|
|
* @returns {*} Returns the parent value.
|
|
*/
|
|
function parent(object, path) {
|
|
return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
|
|
}
|
|
|
|
/**
|
|
* Reorder `array` according to the specified indexes where the element at
|
|
* the first index is assigned as the first element, the element at
|
|
* the second index is assigned as the second element, and so on.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to reorder.
|
|
* @param {Array} indexes The arranged array indexes.
|
|
* @returns {Array} Returns `array`.
|
|
*/
|
|
function reorder(array, indexes) {
|
|
var arrLength = array.length,
|
|
length = nativeMin(indexes.length, arrLength),
|
|
oldArray = copyArray(array);
|
|
|
|
while (length--) {
|
|
var index = indexes[length];
|
|
array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
|
|
}
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* Gets the value at `key`, unless `key` is "__proto__" or "constructor".
|
|
*
|
|
* @private
|
|
* @param {Object} object The object to query.
|
|
* @param {string} key The key of the property to get.
|
|
* @returns {*} Returns the property value.
|
|
*/
|
|
function safeGet(object, key) {
|
|
if (key === 'constructor' && typeof object[key] === 'function') {
|
|
return;
|
|
}
|
|
|
|
if (key == '__proto__') {
|
|
return;
|
|
}
|
|
|
|
return object[key];
|
|
}
|
|
|
|
/**
|
|
* Sets metadata for `func`.
|
|
*
|
|
* **Note:** If this function becomes hot, i.e. is invoked a lot in a short
|
|
* period of time, it will trip its breaker and transition to an identity
|
|
* function to avoid garbage collection pauses in V8. See
|
|
* [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
|
|
* for more details.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to associate metadata with.
|
|
* @param {*} data The metadata.
|
|
* @returns {Function} Returns `func`.
|
|
*/
|
|
var setData = shortOut(baseSetData);
|
|
|
|
/**
|
|
* A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to delay.
|
|
* @param {number} wait The number of milliseconds to delay invocation.
|
|
* @returns {number|Object} Returns the timer id or timeout object.
|
|
*/
|
|
var setTimeout = ctxSetTimeout || function(func, wait) {
|
|
return root.setTimeout(func, wait);
|
|
};
|
|
|
|
/**
|
|
* Sets the `toString` method of `func` to return `string`.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to modify.
|
|
* @param {Function} string The `toString` result.
|
|
* @returns {Function} Returns `func`.
|
|
*/
|
|
var setToString = shortOut(baseSetToString);
|
|
|
|
/**
|
|
* Sets the `toString` method of `wrapper` to mimic the source of `reference`
|
|
* with wrapper details in a comment at the top of the source body.
|
|
*
|
|
* @private
|
|
* @param {Function} wrapper The function to modify.
|
|
* @param {Function} reference The reference function.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @returns {Function} Returns `wrapper`.
|
|
*/
|
|
function setWrapToString(wrapper, reference, bitmask) {
|
|
var source = (reference + '');
|
|
return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
|
|
}
|
|
|
|
/**
|
|
* Creates a function that'll short out and invoke `identity` instead
|
|
* of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
|
|
* milliseconds.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to restrict.
|
|
* @returns {Function} Returns the new shortable function.
|
|
*/
|
|
function shortOut(func) {
|
|
var count = 0,
|
|
lastCalled = 0;
|
|
|
|
return function() {
|
|
var stamp = nativeNow(),
|
|
remaining = HOT_SPAN - (stamp - lastCalled);
|
|
|
|
lastCalled = stamp;
|
|
if (remaining > 0) {
|
|
if (++count >= HOT_COUNT) {
|
|
return arguments[0];
|
|
}
|
|
} else {
|
|
count = 0;
|
|
}
|
|
return func.apply(undefined, arguments);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* A specialized version of `_.shuffle` which mutates and sets the size of `array`.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array to shuffle.
|
|
* @param {number} [size=array.length] The size of `array`.
|
|
* @returns {Array} Returns `array`.
|
|
*/
|
|
function shuffleSelf(array, size) {
|
|
var index = -1,
|
|
length = array.length,
|
|
lastIndex = length - 1;
|
|
|
|
size = size === undefined ? length : size;
|
|
while (++index < size) {
|
|
var rand = baseRandom(index, lastIndex),
|
|
value = array[rand];
|
|
|
|
array[rand] = array[index];
|
|
array[index] = value;
|
|
}
|
|
array.length = size;
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* Converts `string` to a property path array.
|
|
*
|
|
* @private
|
|
* @param {string} string The string to convert.
|
|
* @returns {Array} Returns the property path array.
|
|
*/
|
|
var stringToPath = memoizeCapped(function(string) {
|
|
var result = [];
|
|
if (string.charCodeAt(0) === 46 /* . */) {
|
|
result.push('');
|
|
}
|
|
string.replace(rePropName, function(match, number, quote, subString) {
|
|
result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
|
|
});
|
|
return result;
|
|
});
|
|
|
|
/**
|
|
* Converts `value` to a string key if it's not a string or symbol.
|
|
*
|
|
* @private
|
|
* @param {*} value The value to inspect.
|
|
* @returns {string|symbol} Returns the key.
|
|
*/
|
|
function toKey(value) {
|
|
if (typeof value == 'string' || isSymbol(value)) {
|
|
return value;
|
|
}
|
|
var result = (value + '');
|
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|
}
|
|
|
|
/**
|
|
* Converts `func` to its source code.
|
|
*
|
|
* @private
|
|
* @param {Function} func The function to convert.
|
|
* @returns {string} Returns the source code.
|
|
*/
|
|
function toSource(func) {
|
|
if (func != null) {
|
|
try {
|
|
return funcToString.call(func);
|
|
} catch (e) {}
|
|
try {
|
|
return (func + '');
|
|
} catch (e) {}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Updates wrapper `details` based on `bitmask` flags.
|
|
*
|
|
* @private
|
|
* @returns {Array} details The details to modify.
|
|
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
|
* @returns {Array} Returns `details`.
|
|
*/
|
|
function updateWrapDetails(details, bitmask) {
|
|
arrayEach(wrapFlags, function(pair) {
|
|
var value = '_.' + pair[0];
|
|
if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
|
|
details.push(value);
|
|
}
|
|
});
|
|
return details.sort();
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of `wrapper`.
|
|
*
|
|
* @private
|
|
* @param {Object} wrapper The wrapper to clone.
|
|
* @returns {Object} Returns the cloned wrapper.
|
|
*/
|
|
function wrapperClone(wrapper) {
|
|
if (wrapper instanceof LazyWrapper) {
|
|
return wrapper.clone();
|
|
}
|
|
var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
|
|
result.__actions__ = copyArray(wrapper.__actions__);
|
|
result.__index__ = wrapper.__index__;
|
|
result.__values__ = wrapper.__values__;
|
|
return result;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Creates an array of elements split into groups the length of `size`.
|
|
* If `array` can't be split evenly, the final chunk will be the remaining
|
|
* elements.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to process.
|
|
* @param {number} [size=1] The length of each chunk
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the new array of chunks.
|
|
* @example
|
|
*
|
|
* _.chunk(['a', 'b', 'c', 'd'], 2);
|
|
* // => [['a', 'b'], ['c', 'd']]
|
|
*
|
|
* _.chunk(['a', 'b', 'c', 'd'], 3);
|
|
* // => [['a', 'b', 'c'], ['d']]
|
|
*/
|
|
function chunk(array, size, guard) {
|
|
if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
|
|
size = 1;
|
|
} else {
|
|
size = nativeMax(toInteger(size), 0);
|
|
}
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length || size < 1) {
|
|
return [];
|
|
}
|
|
var index = 0,
|
|
resIndex = 0,
|
|
result = Array(nativeCeil(length / size));
|
|
|
|
while (index < length) {
|
|
result[resIndex++] = baseSlice(array, index, (index += size));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates an array with all falsey values removed. The values `false`, `null`,
|
|
* `0`, `""`, `undefined`, and `NaN` are falsey.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to compact.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @example
|
|
*
|
|
* _.compact([0, 1, false, 2, '', 3]);
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function compact(array) {
|
|
var index = -1,
|
|
length = array == null ? 0 : array.length,
|
|
resIndex = 0,
|
|
result = [];
|
|
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (value) {
|
|
result[resIndex++] = value;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates a new array concatenating `array` with any additional arrays
|
|
* and/or values.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to concatenate.
|
|
* @param {...*} [values] The values to concatenate.
|
|
* @returns {Array} Returns the new concatenated array.
|
|
* @example
|
|
*
|
|
* var array = [1];
|
|
* var other = _.concat(array, 2, [3], [[4]]);
|
|
*
|
|
* console.log(other);
|
|
* // => [1, 2, 3, [4]]
|
|
*
|
|
* console.log(array);
|
|
* // => [1]
|
|
*/
|
|
function concat() {
|
|
var length = arguments.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
var args = Array(length - 1),
|
|
array = arguments[0],
|
|
index = length;
|
|
|
|
while (index--) {
|
|
args[index - 1] = arguments[index];
|
|
}
|
|
return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
|
|
}
|
|
|
|
/**
|
|
* Creates an array of `array` values not included in the other given arrays
|
|
* using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons. The order and references of result values are
|
|
* determined by the first array.
|
|
*
|
|
* **Note:** Unlike `_.pullAll`, this method returns a new array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {...Array} [values] The values to exclude.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @see _.without, _.xor
|
|
* @example
|
|
*
|
|
* _.difference([2, 1], [2, 3]);
|
|
* // => [1]
|
|
*/
|
|
var difference = baseRest(function(array, values) {
|
|
return isArrayLikeObject(array)
|
|
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.difference` except that it accepts `iteratee` which
|
|
* is invoked for each element of `array` and `values` to generate the criterion
|
|
* by which they're compared. The order and references of result values are
|
|
* determined by the first array. The iteratee is invoked with one argument:
|
|
* (value).
|
|
*
|
|
* **Note:** Unlike `_.pullAllBy`, this method returns a new array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {...Array} [values] The values to exclude.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @example
|
|
*
|
|
* _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
|
|
* // => [1.2]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
|
|
* // => [{ 'x': 2 }]
|
|
*/
|
|
var differenceBy = baseRest(function(array, values) {
|
|
var iteratee = last(values);
|
|
if (isArrayLikeObject(iteratee)) {
|
|
iteratee = undefined;
|
|
}
|
|
return isArrayLikeObject(array)
|
|
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.difference` except that it accepts `comparator`
|
|
* which is invoked to compare elements of `array` to `values`. The order and
|
|
* references of result values are determined by the first array. The comparator
|
|
* is invoked with two arguments: (arrVal, othVal).
|
|
*
|
|
* **Note:** Unlike `_.pullAllWith`, this method returns a new array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {...Array} [values] The values to exclude.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
|
*
|
|
* _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
|
|
* // => [{ 'x': 2, 'y': 1 }]
|
|
*/
|
|
var differenceWith = baseRest(function(array, values) {
|
|
var comparator = last(values);
|
|
if (isArrayLikeObject(comparator)) {
|
|
comparator = undefined;
|
|
}
|
|
return isArrayLikeObject(array)
|
|
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* Creates a slice of `array` with `n` elements dropped from the beginning.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.5.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {number} [n=1] The number of elements to drop.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* _.drop([1, 2, 3]);
|
|
* // => [2, 3]
|
|
*
|
|
* _.drop([1, 2, 3], 2);
|
|
* // => [3]
|
|
*
|
|
* _.drop([1, 2, 3], 5);
|
|
* // => []
|
|
*
|
|
* _.drop([1, 2, 3], 0);
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function drop(array, n, guard) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
n = (guard || n === undefined) ? 1 : toInteger(n);
|
|
return baseSlice(array, n < 0 ? 0 : n, length);
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` with `n` elements dropped from the end.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {number} [n=1] The number of elements to drop.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* _.dropRight([1, 2, 3]);
|
|
* // => [1, 2]
|
|
*
|
|
* _.dropRight([1, 2, 3], 2);
|
|
* // => [1]
|
|
*
|
|
* _.dropRight([1, 2, 3], 5);
|
|
* // => []
|
|
*
|
|
* _.dropRight([1, 2, 3], 0);
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function dropRight(array, n, guard) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
n = (guard || n === undefined) ? 1 : toInteger(n);
|
|
n = length - n;
|
|
return baseSlice(array, 0, n < 0 ? 0 : n);
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` excluding elements dropped from the end.
|
|
* Elements are dropped until `predicate` returns falsey. The predicate is
|
|
* invoked with three arguments: (value, index, array).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': true },
|
|
* { 'user': 'fred', 'active': false },
|
|
* { 'user': 'pebbles', 'active': false }
|
|
* ];
|
|
*
|
|
* _.dropRightWhile(users, function(o) { return !o.active; });
|
|
* // => objects for ['barney']
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
|
|
* // => objects for ['barney', 'fred']
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.dropRightWhile(users, ['active', false]);
|
|
* // => objects for ['barney']
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.dropRightWhile(users, 'active');
|
|
* // => objects for ['barney', 'fred', 'pebbles']
|
|
*/
|
|
function dropRightWhile(array, predicate) {
|
|
return (array && array.length)
|
|
? baseWhile(array, getIteratee(predicate, 3), true, true)
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` excluding elements dropped from the beginning.
|
|
* Elements are dropped until `predicate` returns falsey. The predicate is
|
|
* invoked with three arguments: (value, index, array).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': false },
|
|
* { 'user': 'fred', 'active': false },
|
|
* { 'user': 'pebbles', 'active': true }
|
|
* ];
|
|
*
|
|
* _.dropWhile(users, function(o) { return !o.active; });
|
|
* // => objects for ['pebbles']
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.dropWhile(users, { 'user': 'barney', 'active': false });
|
|
* // => objects for ['fred', 'pebbles']
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.dropWhile(users, ['active', false]);
|
|
* // => objects for ['pebbles']
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.dropWhile(users, 'active');
|
|
* // => objects for ['barney', 'fred', 'pebbles']
|
|
*/
|
|
function dropWhile(array, predicate) {
|
|
return (array && array.length)
|
|
? baseWhile(array, getIteratee(predicate, 3), true)
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* Fills elements of `array` with `value` from `start` up to, but not
|
|
* including, `end`.
|
|
*
|
|
* **Note:** This method mutates `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.2.0
|
|
* @category Array
|
|
* @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`.
|
|
* @example
|
|
*
|
|
* var array = [1, 2, 3];
|
|
*
|
|
* _.fill(array, 'a');
|
|
* console.log(array);
|
|
* // => ['a', 'a', 'a']
|
|
*
|
|
* _.fill(Array(3), 2);
|
|
* // => [2, 2, 2]
|
|
*
|
|
* _.fill([4, 6, 8, 10], '*', 1, 3);
|
|
* // => [4, '*', '*', 10]
|
|
*/
|
|
function fill(array, value, start, end) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
|
|
start = 0;
|
|
end = length;
|
|
}
|
|
return baseFill(array, value, start, end);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.find` except that it returns the index of the first
|
|
* element `predicate` returns truthy for instead of the element itself.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @param {number} [fromIndex=0] The index to search from.
|
|
* @returns {number} Returns the index of the found element, else `-1`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': false },
|
|
* { 'user': 'fred', 'active': false },
|
|
* { 'user': 'pebbles', 'active': true }
|
|
* ];
|
|
*
|
|
* _.findIndex(users, function(o) { return o.user == 'barney'; });
|
|
* // => 0
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.findIndex(users, { 'user': 'fred', 'active': false });
|
|
* // => 1
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.findIndex(users, ['active', false]);
|
|
* // => 0
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.findIndex(users, 'active');
|
|
* // => 2
|
|
*/
|
|
function findIndex(array, predicate, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = fromIndex == null ? 0 : toInteger(fromIndex);
|
|
if (index < 0) {
|
|
index = nativeMax(length + index, 0);
|
|
}
|
|
return baseFindIndex(array, getIteratee(predicate, 3), index);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.findIndex` except that it iterates over elements
|
|
* of `collection` from right to left.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @param {number} [fromIndex=array.length-1] The index to search from.
|
|
* @returns {number} Returns the index of the found element, else `-1`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': true },
|
|
* { 'user': 'fred', 'active': false },
|
|
* { 'user': 'pebbles', 'active': false }
|
|
* ];
|
|
*
|
|
* _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
|
|
* // => 2
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.findLastIndex(users, { 'user': 'barney', 'active': true });
|
|
* // => 0
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.findLastIndex(users, ['active', false]);
|
|
* // => 2
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.findLastIndex(users, 'active');
|
|
* // => 0
|
|
*/
|
|
function findLastIndex(array, predicate, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = length - 1;
|
|
if (fromIndex !== undefined) {
|
|
index = toInteger(fromIndex);
|
|
index = fromIndex < 0
|
|
? nativeMax(length + index, 0)
|
|
: nativeMin(index, length - 1);
|
|
}
|
|
return baseFindIndex(array, getIteratee(predicate, 3), index, true);
|
|
}
|
|
|
|
/**
|
|
* Flattens `array` a single level deep.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to flatten.
|
|
* @returns {Array} Returns the new flattened array.
|
|
* @example
|
|
*
|
|
* _.flatten([1, [2, [3, [4]], 5]]);
|
|
* // => [1, 2, [3, [4]], 5]
|
|
*/
|
|
function flatten(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseFlatten(array, 1) : [];
|
|
}
|
|
|
|
/**
|
|
* Recursively flattens `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to flatten.
|
|
* @returns {Array} Returns the new flattened array.
|
|
* @example
|
|
*
|
|
* _.flattenDeep([1, [2, [3, [4]], 5]]);
|
|
* // => [1, 2, 3, 4, 5]
|
|
*/
|
|
function flattenDeep(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseFlatten(array, INFINITY) : [];
|
|
}
|
|
|
|
/**
|
|
* Recursively flatten `array` up to `depth` times.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.4.0
|
|
* @category Array
|
|
* @param {Array} array The array to flatten.
|
|
* @param {number} [depth=1] The maximum recursion depth.
|
|
* @returns {Array} Returns the new flattened array.
|
|
* @example
|
|
*
|
|
* var array = [1, [2, [3, [4]], 5]];
|
|
*
|
|
* _.flattenDepth(array, 1);
|
|
* // => [1, 2, [3, [4]], 5]
|
|
*
|
|
* _.flattenDepth(array, 2);
|
|
* // => [1, 2, 3, [4], 5]
|
|
*/
|
|
function flattenDepth(array, depth) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
depth = depth === undefined ? 1 : toInteger(depth);
|
|
return baseFlatten(array, depth);
|
|
}
|
|
|
|
/**
|
|
* The inverse of `_.toPairs`; this method returns an object composed
|
|
* from key-value `pairs`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} pairs The key-value pairs.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* _.fromPairs([['a', 1], ['b', 2]]);
|
|
* // => { 'a': 1, 'b': 2 }
|
|
*/
|
|
function fromPairs(pairs) {
|
|
var index = -1,
|
|
length = pairs == null ? 0 : pairs.length,
|
|
result = {};
|
|
|
|
while (++index < length) {
|
|
var pair = pairs[index];
|
|
result[pair[0]] = pair[1];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Gets the first element of `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @alias first
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @returns {*} Returns the first element of `array`.
|
|
* @example
|
|
*
|
|
* _.head([1, 2, 3]);
|
|
* // => 1
|
|
*
|
|
* _.head([]);
|
|
* // => undefined
|
|
*/
|
|
function head(array) {
|
|
return (array && array.length) ? array[0] : undefined;
|
|
}
|
|
|
|
/**
|
|
* Gets the index at which the first occurrence of `value` is found in `array`
|
|
* using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons. If `fromIndex` is negative, it's used as the
|
|
* offset from the end of `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {*} value The value to search for.
|
|
* @param {number} [fromIndex=0] The index to search from.
|
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|
* @example
|
|
*
|
|
* _.indexOf([1, 2, 1, 2], 2);
|
|
* // => 1
|
|
*
|
|
* // Search from the `fromIndex`.
|
|
* _.indexOf([1, 2, 1, 2], 2, 2);
|
|
* // => 3
|
|
*/
|
|
function indexOf(array, value, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = fromIndex == null ? 0 : toInteger(fromIndex);
|
|
if (index < 0) {
|
|
index = nativeMax(length + index, 0);
|
|
}
|
|
return baseIndexOf(array, value, index);
|
|
}
|
|
|
|
/**
|
|
* Gets all but the last element of `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* _.initial([1, 2, 3]);
|
|
* // => [1, 2]
|
|
*/
|
|
function initial(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseSlice(array, 0, -1) : [];
|
|
}
|
|
|
|
/**
|
|
* Creates an array of unique values that are included in all given arrays
|
|
* using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons. The order and references of result values are
|
|
* determined by the first array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @returns {Array} Returns the new array of intersecting values.
|
|
* @example
|
|
*
|
|
* _.intersection([2, 1], [2, 3]);
|
|
* // => [2]
|
|
*/
|
|
var intersection = baseRest(function(arrays) {
|
|
var mapped = arrayMap(arrays, castArrayLikeObject);
|
|
return (mapped.length && mapped[0] === arrays[0])
|
|
? baseIntersection(mapped)
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.intersection` except that it accepts `iteratee`
|
|
* which is invoked for each element of each `arrays` to generate the criterion
|
|
* by which they're compared. The order and references of result values are
|
|
* determined by the first array. The iteratee is invoked with one argument:
|
|
* (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new array of intersecting values.
|
|
* @example
|
|
*
|
|
* _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
|
|
* // => [2.1]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
|
|
* // => [{ 'x': 1 }]
|
|
*/
|
|
var intersectionBy = baseRest(function(arrays) {
|
|
var iteratee = last(arrays),
|
|
mapped = arrayMap(arrays, castArrayLikeObject);
|
|
|
|
if (iteratee === last(mapped)) {
|
|
iteratee = undefined;
|
|
} else {
|
|
mapped.pop();
|
|
}
|
|
return (mapped.length && mapped[0] === arrays[0])
|
|
? baseIntersection(mapped, getIteratee(iteratee, 2))
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.intersection` except that it accepts `comparator`
|
|
* which is invoked to compare elements of `arrays`. The order and references
|
|
* of result values are determined by the first array. The comparator is
|
|
* invoked with two arguments: (arrVal, othVal).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns the new array of intersecting values.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
|
* var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
|
*
|
|
* _.intersectionWith(objects, others, _.isEqual);
|
|
* // => [{ 'x': 1, 'y': 2 }]
|
|
*/
|
|
var intersectionWith = baseRest(function(arrays) {
|
|
var comparator = last(arrays),
|
|
mapped = arrayMap(arrays, castArrayLikeObject);
|
|
|
|
comparator = typeof comparator == 'function' ? comparator : undefined;
|
|
if (comparator) {
|
|
mapped.pop();
|
|
}
|
|
return (mapped.length && mapped[0] === arrays[0])
|
|
? baseIntersection(mapped, undefined, comparator)
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* Converts all elements in `array` into a string separated by `separator`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to convert.
|
|
* @param {string} [separator=','] The element separator.
|
|
* @returns {string} Returns the joined string.
|
|
* @example
|
|
*
|
|
* _.join(['a', 'b', 'c'], '~');
|
|
* // => 'a~b~c'
|
|
*/
|
|
function join(array, separator) {
|
|
return array == null ? '' : nativeJoin.call(array, separator);
|
|
}
|
|
|
|
/**
|
|
* Gets the last element of `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @returns {*} Returns the last element of `array`.
|
|
* @example
|
|
*
|
|
* _.last([1, 2, 3]);
|
|
* // => 3
|
|
*/
|
|
function last(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? array[length - 1] : undefined;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.indexOf` except that it iterates over elements of
|
|
* `array` from right to left.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {*} value The value to search for.
|
|
* @param {number} [fromIndex=array.length-1] The index to search from.
|
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|
* @example
|
|
*
|
|
* _.lastIndexOf([1, 2, 1, 2], 2);
|
|
* // => 3
|
|
*
|
|
* // Search from the `fromIndex`.
|
|
* _.lastIndexOf([1, 2, 1, 2], 2, 2);
|
|
* // => 1
|
|
*/
|
|
function lastIndexOf(array, value, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = length;
|
|
if (fromIndex !== undefined) {
|
|
index = toInteger(fromIndex);
|
|
index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
|
|
}
|
|
return value === value
|
|
? strictLastIndexOf(array, value, index)
|
|
: baseFindIndex(array, baseIsNaN, index, true);
|
|
}
|
|
|
|
/**
|
|
* Gets the element at index `n` of `array`. If `n` is negative, the nth
|
|
* element from the end is returned.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.11.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {number} [n=0] The index of the element to return.
|
|
* @returns {*} Returns the nth element of `array`.
|
|
* @example
|
|
*
|
|
* var array = ['a', 'b', 'c', 'd'];
|
|
*
|
|
* _.nth(array, 1);
|
|
* // => 'b'
|
|
*
|
|
* _.nth(array, -2);
|
|
* // => 'c';
|
|
*/
|
|
function nth(array, n) {
|
|
return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
|
|
}
|
|
|
|
/**
|
|
* Removes all given values from `array` using
|
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons.
|
|
*
|
|
* **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
|
|
* to remove elements from an array by predicate.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @param {...*} [values] The values to remove.
|
|
* @returns {Array} Returns `array`.
|
|
* @example
|
|
*
|
|
* var array = ['a', 'b', 'c', 'a', 'b', 'c'];
|
|
*
|
|
* _.pull(array, 'a', 'c');
|
|
* console.log(array);
|
|
* // => ['b', 'b']
|
|
*/
|
|
var pull = baseRest(pullAll);
|
|
|
|
/**
|
|
* This method is like `_.pull` except that it accepts an array of values to remove.
|
|
*
|
|
* **Note:** Unlike `_.difference`, this method mutates `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @param {Array} values The values to remove.
|
|
* @returns {Array} Returns `array`.
|
|
* @example
|
|
*
|
|
* var array = ['a', 'b', 'c', 'a', 'b', 'c'];
|
|
*
|
|
* _.pullAll(array, ['a', 'c']);
|
|
* console.log(array);
|
|
* // => ['b', 'b']
|
|
*/
|
|
function pullAll(array, values) {
|
|
return (array && array.length && values && values.length)
|
|
? basePullAll(array, values)
|
|
: array;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.pullAll` except that it accepts `iteratee` which is
|
|
* invoked for each element of `array` and `values` to generate the criterion
|
|
* by which they're compared. The iteratee is invoked with one argument: (value).
|
|
*
|
|
* **Note:** Unlike `_.differenceBy`, this method mutates `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @param {Array} values The values to remove.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Array} Returns `array`.
|
|
* @example
|
|
*
|
|
* var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
|
|
*
|
|
* _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
|
|
* console.log(array);
|
|
* // => [{ 'x': 2 }]
|
|
*/
|
|
function pullAllBy(array, values, iteratee) {
|
|
return (array && array.length && values && values.length)
|
|
? basePullAll(array, values, getIteratee(iteratee, 2))
|
|
: array;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.pullAll` except that it accepts `comparator` which
|
|
* is invoked to compare elements of `array` to `values`. The comparator is
|
|
* invoked with two arguments: (arrVal, othVal).
|
|
*
|
|
* **Note:** Unlike `_.differenceWith`, this method mutates `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.6.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @param {Array} values The values to remove.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns `array`.
|
|
* @example
|
|
*
|
|
* var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
|
|
*
|
|
* _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
|
|
* console.log(array);
|
|
* // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
|
|
*/
|
|
function pullAllWith(array, values, comparator) {
|
|
return (array && array.length && values && values.length)
|
|
? basePullAll(array, values, undefined, comparator)
|
|
: array;
|
|
}
|
|
|
|
/**
|
|
* Removes elements from `array` corresponding to `indexes` and returns an
|
|
* array of removed elements.
|
|
*
|
|
* **Note:** Unlike `_.at`, this method mutates `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @param {...(number|number[])} [indexes] The indexes of elements to remove.
|
|
* @returns {Array} Returns the new array of removed elements.
|
|
* @example
|
|
*
|
|
* var array = ['a', 'b', 'c', 'd'];
|
|
* var pulled = _.pullAt(array, [1, 3]);
|
|
*
|
|
* console.log(array);
|
|
* // => ['a', 'c']
|
|
*
|
|
* console.log(pulled);
|
|
* // => ['b', 'd']
|
|
*/
|
|
var pullAt = flatRest(function(array, indexes) {
|
|
var length = array == null ? 0 : array.length,
|
|
result = baseAt(array, indexes);
|
|
|
|
basePullAt(array, arrayMap(indexes, function(index) {
|
|
return isIndex(index, length) ? +index : index;
|
|
}).sort(compareAscending));
|
|
|
|
return result;
|
|
});
|
|
|
|
/**
|
|
* Removes all elements from `array` that `predicate` returns truthy for
|
|
* and returns an array of the removed elements. The predicate is invoked
|
|
* with three arguments: (value, index, array).
|
|
*
|
|
* **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
|
|
* to pull elements from an array by value.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the new array of removed elements.
|
|
* @example
|
|
*
|
|
* var array = [1, 2, 3, 4];
|
|
* var evens = _.remove(array, function(n) {
|
|
* return n % 2 == 0;
|
|
* });
|
|
*
|
|
* console.log(array);
|
|
* // => [1, 3]
|
|
*
|
|
* console.log(evens);
|
|
* // => [2, 4]
|
|
*/
|
|
function remove(array, predicate) {
|
|
var result = [];
|
|
if (!(array && array.length)) {
|
|
return result;
|
|
}
|
|
var index = -1,
|
|
indexes = [],
|
|
length = array.length;
|
|
|
|
predicate = getIteratee(predicate, 3);
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (predicate(value, index, array)) {
|
|
result.push(value);
|
|
indexes.push(index);
|
|
}
|
|
}
|
|
basePullAt(array, indexes);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Reverses `array` so that the first element becomes the last, the second
|
|
* element becomes the second to last, and so on.
|
|
*
|
|
* **Note:** This method mutates `array` and is based on
|
|
* [`Array#reverse`](https://mdn.io/Array/reverse).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to modify.
|
|
* @returns {Array} Returns `array`.
|
|
* @example
|
|
*
|
|
* var array = [1, 2, 3];
|
|
*
|
|
* _.reverse(array);
|
|
* // => [3, 2, 1]
|
|
*
|
|
* console.log(array);
|
|
* // => [3, 2, 1]
|
|
*/
|
|
function reverse(array) {
|
|
return array == null ? array : nativeReverse.call(array);
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` from `start` up to, but not including, `end`.
|
|
*
|
|
* **Note:** This method is used instead of
|
|
* [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
|
|
* returned.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to slice.
|
|
* @param {number} [start=0] The start position.
|
|
* @param {number} [end=array.length] The end position.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
*/
|
|
function slice(array, start, end) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
|
|
start = 0;
|
|
end = length;
|
|
}
|
|
else {
|
|
start = start == null ? 0 : toInteger(start);
|
|
end = end === undefined ? length : toInteger(end);
|
|
}
|
|
return baseSlice(array, start, end);
|
|
}
|
|
|
|
/**
|
|
* Uses a binary search to determine the lowest index at which `value`
|
|
* should be inserted into `array` in order to maintain its sort order.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The sorted array to inspect.
|
|
* @param {*} value The value to evaluate.
|
|
* @returns {number} Returns the index at which `value` should be inserted
|
|
* into `array`.
|
|
* @example
|
|
*
|
|
* _.sortedIndex([30, 50], 40);
|
|
* // => 1
|
|
*/
|
|
function sortedIndex(array, value) {
|
|
return baseSortedIndex(array, value);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.sortedIndex` except that it accepts `iteratee`
|
|
* which is invoked for `value` and each element of `array` to compute their
|
|
* sort ranking. The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The sorted array to inspect.
|
|
* @param {*} value The value to evaluate.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {number} Returns the index at which `value` should be inserted
|
|
* into `array`.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 4 }, { 'x': 5 }];
|
|
*
|
|
* _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
|
|
* // => 0
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.sortedIndexBy(objects, { 'x': 4 }, 'x');
|
|
* // => 0
|
|
*/
|
|
function sortedIndexBy(array, value, iteratee) {
|
|
return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.indexOf` except that it performs a binary
|
|
* search on a sorted `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {*} value The value to search for.
|
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|
* @example
|
|
*
|
|
* _.sortedIndexOf([4, 5, 5, 5, 6], 5);
|
|
* // => 1
|
|
*/
|
|
function sortedIndexOf(array, value) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (length) {
|
|
var index = baseSortedIndex(array, value);
|
|
if (index < length && eq(array[index], value)) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.sortedIndex` except that it returns the highest
|
|
* index at which `value` should be inserted into `array` in order to
|
|
* maintain its sort order.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The sorted array to inspect.
|
|
* @param {*} value The value to evaluate.
|
|
* @returns {number} Returns the index at which `value` should be inserted
|
|
* into `array`.
|
|
* @example
|
|
*
|
|
* _.sortedLastIndex([4, 5, 5, 5, 6], 5);
|
|
* // => 4
|
|
*/
|
|
function sortedLastIndex(array, value) {
|
|
return baseSortedIndex(array, value, true);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.sortedLastIndex` except that it accepts `iteratee`
|
|
* which is invoked for `value` and each element of `array` to compute their
|
|
* sort ranking. The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The sorted array to inspect.
|
|
* @param {*} value The value to evaluate.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {number} Returns the index at which `value` should be inserted
|
|
* into `array`.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 4 }, { 'x': 5 }];
|
|
*
|
|
* _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
|
|
* // => 1
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
|
|
* // => 1
|
|
*/
|
|
function sortedLastIndexBy(array, value, iteratee) {
|
|
return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.lastIndexOf` except that it performs a binary
|
|
* search on a sorted `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {*} value The value to search for.
|
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|
* @example
|
|
*
|
|
* _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
|
|
* // => 3
|
|
*/
|
|
function sortedLastIndexOf(array, value) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (length) {
|
|
var index = baseSortedIndex(array, value, true) - 1;
|
|
if (eq(array[index], value)) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.uniq` except that it's designed and optimized
|
|
* for sorted arrays.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
* @example
|
|
*
|
|
* _.sortedUniq([1, 1, 2]);
|
|
* // => [1, 2]
|
|
*/
|
|
function sortedUniq(array) {
|
|
return (array && array.length)
|
|
? baseSortedUniq(array)
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.uniqBy` except that it's designed and optimized
|
|
* for sorted arrays.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
* @example
|
|
*
|
|
* _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
|
|
* // => [1.1, 2.3]
|
|
*/
|
|
function sortedUniqBy(array, iteratee) {
|
|
return (array && array.length)
|
|
? baseSortedUniq(array, getIteratee(iteratee, 2))
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* Gets all but the first element of `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* _.tail([1, 2, 3]);
|
|
* // => [2, 3]
|
|
*/
|
|
function tail(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseSlice(array, 1, length) : [];
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` with `n` elements taken from the beginning.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {number} [n=1] The number of elements to take.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* _.take([1, 2, 3]);
|
|
* // => [1]
|
|
*
|
|
* _.take([1, 2, 3], 2);
|
|
* // => [1, 2]
|
|
*
|
|
* _.take([1, 2, 3], 5);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* _.take([1, 2, 3], 0);
|
|
* // => []
|
|
*/
|
|
function take(array, n, guard) {
|
|
if (!(array && array.length)) {
|
|
return [];
|
|
}
|
|
n = (guard || n === undefined) ? 1 : toInteger(n);
|
|
return baseSlice(array, 0, n < 0 ? 0 : n);
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` with `n` elements taken from the end.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {number} [n=1] The number of elements to take.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* _.takeRight([1, 2, 3]);
|
|
* // => [3]
|
|
*
|
|
* _.takeRight([1, 2, 3], 2);
|
|
* // => [2, 3]
|
|
*
|
|
* _.takeRight([1, 2, 3], 5);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* _.takeRight([1, 2, 3], 0);
|
|
* // => []
|
|
*/
|
|
function takeRight(array, n, guard) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
n = (guard || n === undefined) ? 1 : toInteger(n);
|
|
n = length - n;
|
|
return baseSlice(array, n < 0 ? 0 : n, length);
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` with elements taken from the end. Elements are
|
|
* taken until `predicate` returns falsey. The predicate is invoked with
|
|
* three arguments: (value, index, array).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': true },
|
|
* { 'user': 'fred', 'active': false },
|
|
* { 'user': 'pebbles', 'active': false }
|
|
* ];
|
|
*
|
|
* _.takeRightWhile(users, function(o) { return !o.active; });
|
|
* // => objects for ['fred', 'pebbles']
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
|
|
* // => objects for ['pebbles']
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.takeRightWhile(users, ['active', false]);
|
|
* // => objects for ['fred', 'pebbles']
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.takeRightWhile(users, 'active');
|
|
* // => []
|
|
*/
|
|
function takeRightWhile(array, predicate) {
|
|
return (array && array.length)
|
|
? baseWhile(array, getIteratee(predicate, 3), false, true)
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* Creates a slice of `array` with elements taken from the beginning. Elements
|
|
* are taken until `predicate` returns falsey. The predicate is invoked with
|
|
* three arguments: (value, index, array).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to query.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the slice of `array`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': false },
|
|
* { 'user': 'fred', 'active': false },
|
|
* { 'user': 'pebbles', 'active': true }
|
|
* ];
|
|
*
|
|
* _.takeWhile(users, function(o) { return !o.active; });
|
|
* // => objects for ['barney', 'fred']
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.takeWhile(users, { 'user': 'barney', 'active': false });
|
|
* // => objects for ['barney']
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.takeWhile(users, ['active', false]);
|
|
* // => objects for ['barney', 'fred']
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.takeWhile(users, 'active');
|
|
* // => []
|
|
*/
|
|
function takeWhile(array, predicate) {
|
|
return (array && array.length)
|
|
? baseWhile(array, getIteratee(predicate, 3))
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* Creates an array of unique values, in order, from all given arrays using
|
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @returns {Array} Returns the new array of combined values.
|
|
* @example
|
|
*
|
|
* _.union([2], [1, 2]);
|
|
* // => [2, 1]
|
|
*/
|
|
var union = baseRest(function(arrays) {
|
|
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.union` except that it accepts `iteratee` which is
|
|
* invoked for each element of each `arrays` to generate the criterion by
|
|
* which uniqueness is computed. Result values are chosen from the first
|
|
* array in which the value occurs. The iteratee is invoked with one argument:
|
|
* (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new array of combined values.
|
|
* @example
|
|
*
|
|
* _.unionBy([2.1], [1.2, 2.3], Math.floor);
|
|
* // => [2.1, 1.2]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
|
|
* // => [{ 'x': 1 }, { 'x': 2 }]
|
|
*/
|
|
var unionBy = baseRest(function(arrays) {
|
|
var iteratee = last(arrays);
|
|
if (isArrayLikeObject(iteratee)) {
|
|
iteratee = undefined;
|
|
}
|
|
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.union` except that it accepts `comparator` which
|
|
* is invoked to compare elements of `arrays`. Result values are chosen from
|
|
* the first array in which the value occurs. The comparator is invoked
|
|
* with two arguments: (arrVal, othVal).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns the new array of combined values.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
|
* var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
|
*
|
|
* _.unionWith(objects, others, _.isEqual);
|
|
* // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
|
|
*/
|
|
var unionWith = baseRest(function(arrays) {
|
|
var comparator = last(arrays);
|
|
comparator = typeof comparator == 'function' ? comparator : undefined;
|
|
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
|
|
});
|
|
|
|
/**
|
|
* Creates a duplicate-free version of an array, using
|
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons, in which only the first occurrence of each element
|
|
* is kept. The order of result values is determined by the order they occur
|
|
* in the array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
* @example
|
|
*
|
|
* _.uniq([2, 1, 2]);
|
|
* // => [2, 1]
|
|
*/
|
|
function uniq(array) {
|
|
return (array && array.length) ? baseUniq(array) : [];
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.uniq` except that it accepts `iteratee` which is
|
|
* invoked for each element in `array` to generate the criterion by which
|
|
* uniqueness is computed. The order of result values is determined by the
|
|
* order they occur in the array. The iteratee is invoked with one argument:
|
|
* (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
* @example
|
|
*
|
|
* _.uniqBy([2.1, 1.2, 2.3], Math.floor);
|
|
* // => [2.1, 1.2]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
|
|
* // => [{ 'x': 1 }, { 'x': 2 }]
|
|
*/
|
|
function uniqBy(array, iteratee) {
|
|
return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.uniq` except that it accepts `comparator` which
|
|
* is invoked to compare elements of `array`. The order of result values is
|
|
* determined by the order they occur in the array.The comparator is invoked
|
|
* with two arguments: (arrVal, othVal).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns the new duplicate free array.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
|
*
|
|
* _.uniqWith(objects, _.isEqual);
|
|
* // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
|
|
*/
|
|
function uniqWith(array, comparator) {
|
|
comparator = typeof comparator == 'function' ? comparator : undefined;
|
|
return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.zip` except that it accepts an array of grouped
|
|
* elements and creates an array regrouping the elements to their pre-zip
|
|
* configuration.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.2.0
|
|
* @category Array
|
|
* @param {Array} array The array of grouped elements to process.
|
|
* @returns {Array} Returns the new array of regrouped elements.
|
|
* @example
|
|
*
|
|
* var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
|
|
* // => [['a', 1, true], ['b', 2, false]]
|
|
*
|
|
* _.unzip(zipped);
|
|
* // => [['a', 'b'], [1, 2], [true, false]]
|
|
*/
|
|
function unzip(array) {
|
|
if (!(array && array.length)) {
|
|
return [];
|
|
}
|
|
var length = 0;
|
|
array = arrayFilter(array, function(group) {
|
|
if (isArrayLikeObject(group)) {
|
|
length = nativeMax(group.length, length);
|
|
return true;
|
|
}
|
|
});
|
|
return baseTimes(length, function(index) {
|
|
return arrayMap(array, baseProperty(index));
|
|
});
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.unzip` except that it accepts `iteratee` to specify
|
|
* how regrouped values should be combined. The iteratee is invoked with the
|
|
* elements of each group: (...group).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.8.0
|
|
* @category Array
|
|
* @param {Array} array The array of grouped elements to process.
|
|
* @param {Function} [iteratee=_.identity] The function to combine
|
|
* regrouped values.
|
|
* @returns {Array} Returns the new array of regrouped elements.
|
|
* @example
|
|
*
|
|
* var zipped = _.zip([1, 2], [10, 20], [100, 200]);
|
|
* // => [[1, 10, 100], [2, 20, 200]]
|
|
*
|
|
* _.unzipWith(zipped, _.add);
|
|
* // => [3, 30, 300]
|
|
*/
|
|
function unzipWith(array, iteratee) {
|
|
if (!(array && array.length)) {
|
|
return [];
|
|
}
|
|
var result = unzip(array);
|
|
if (iteratee == null) {
|
|
return result;
|
|
}
|
|
return arrayMap(result, function(group) {
|
|
return apply(iteratee, undefined, group);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates an array excluding all given values using
|
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* for equality comparisons.
|
|
*
|
|
* **Note:** Unlike `_.pull`, this method returns a new array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {Array} array The array to inspect.
|
|
* @param {...*} [values] The values to exclude.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @see _.difference, _.xor
|
|
* @example
|
|
*
|
|
* _.without([2, 1, 2, 3], 1, 2);
|
|
* // => [3]
|
|
*/
|
|
var without = baseRest(function(array, values) {
|
|
return isArrayLikeObject(array)
|
|
? baseDifference(array, values)
|
|
: [];
|
|
});
|
|
|
|
/**
|
|
* Creates an array of unique values that is the
|
|
* [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
|
|
* of the given arrays. The order of result values is determined by the order
|
|
* they occur in the arrays.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.4.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @see _.difference, _.without
|
|
* @example
|
|
*
|
|
* _.xor([2, 1], [2, 3]);
|
|
* // => [1, 3]
|
|
*/
|
|
var xor = baseRest(function(arrays) {
|
|
return baseXor(arrayFilter(arrays, isArrayLikeObject));
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.xor` except that it accepts `iteratee` which is
|
|
* invoked for each element of each `arrays` to generate the criterion by
|
|
* which by which they're compared. The order of result values is determined
|
|
* by the order they occur in the arrays. The iteratee is invoked with one
|
|
* argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @example
|
|
*
|
|
* _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
|
|
* // => [1.2, 3.4]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
|
|
* // => [{ 'x': 2 }]
|
|
*/
|
|
var xorBy = baseRest(function(arrays) {
|
|
var iteratee = last(arrays);
|
|
if (isArrayLikeObject(iteratee)) {
|
|
iteratee = undefined;
|
|
}
|
|
return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.xor` except that it accepts `comparator` which is
|
|
* invoked to compare elements of `arrays`. The order of result values is
|
|
* determined by the order they occur in the arrays. The comparator is invoked
|
|
* with two arguments: (arrVal, othVal).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to inspect.
|
|
* @param {Function} [comparator] The comparator invoked per element.
|
|
* @returns {Array} Returns the new array of filtered values.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
|
* var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
|
*
|
|
* _.xorWith(objects, others, _.isEqual);
|
|
* // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
|
|
*/
|
|
var xorWith = baseRest(function(arrays) {
|
|
var comparator = last(arrays);
|
|
comparator = typeof comparator == 'function' ? comparator : undefined;
|
|
return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
|
|
});
|
|
|
|
/**
|
|
* Creates an array of grouped elements, the first of which contains the
|
|
* first elements of the given arrays, the second of which contains the
|
|
* second elements of the given arrays, and so on.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to process.
|
|
* @returns {Array} Returns the new array of grouped elements.
|
|
* @example
|
|
*
|
|
* _.zip(['a', 'b'], [1, 2], [true, false]);
|
|
* // => [['a', 1, true], ['b', 2, false]]
|
|
*/
|
|
var zip = baseRest(unzip);
|
|
|
|
/**
|
|
* This method is like `_.fromPairs` except that it accepts two arrays,
|
|
* one of property identifiers and one of corresponding values.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.4.0
|
|
* @category Array
|
|
* @param {Array} [props=[]] The property identifiers.
|
|
* @param {Array} [values=[]] The property values.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* _.zipObject(['a', 'b'], [1, 2]);
|
|
* // => { 'a': 1, 'b': 2 }
|
|
*/
|
|
function zipObject(props, values) {
|
|
return baseZipObject(props || [], values || [], assignValue);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.zipObject` except that it supports property paths.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.1.0
|
|
* @category Array
|
|
* @param {Array} [props=[]] The property identifiers.
|
|
* @param {Array} [values=[]] The property values.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
|
|
* // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
|
|
*/
|
|
function zipObjectDeep(props, values) {
|
|
return baseZipObject(props || [], values || [], baseSet);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.zip` except that it accepts `iteratee` to specify
|
|
* how grouped values should be combined. The iteratee is invoked with the
|
|
* elements of each group: (...group).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.8.0
|
|
* @category Array
|
|
* @param {...Array} [arrays] The arrays to process.
|
|
* @param {Function} [iteratee=_.identity] The function to combine
|
|
* grouped values.
|
|
* @returns {Array} Returns the new array of grouped elements.
|
|
* @example
|
|
*
|
|
* _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
|
|
* return a + b + c;
|
|
* });
|
|
* // => [111, 222]
|
|
*/
|
|
var zipWith = baseRest(function(arrays) {
|
|
var length = arrays.length,
|
|
iteratee = length > 1 ? arrays[length - 1] : undefined;
|
|
|
|
iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
|
|
return unzipWith(arrays, iteratee);
|
|
});
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Creates a `lodash` wrapper instance that wraps `value` with explicit method
|
|
* chain sequences enabled. The result of such sequences must be unwrapped
|
|
* with `_#value`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.3.0
|
|
* @category Seq
|
|
* @param {*} value The value to wrap.
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36 },
|
|
* { 'user': 'fred', 'age': 40 },
|
|
* { 'user': 'pebbles', 'age': 1 }
|
|
* ];
|
|
*
|
|
* var youngest = _
|
|
* .chain(users)
|
|
* .sortBy('age')
|
|
* .map(function(o) {
|
|
* return o.user + ' is ' + o.age;
|
|
* })
|
|
* .head()
|
|
* .value();
|
|
* // => 'pebbles is 1'
|
|
*/
|
|
function chain(value) {
|
|
var result = lodash(value);
|
|
result.__chain__ = true;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* This method invokes `interceptor` and returns `value`. The interceptor
|
|
* is invoked with one argument; (value). The purpose of this method is to
|
|
* "tap into" a method chain sequence in order to modify intermediate results.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Seq
|
|
* @param {*} value The value to provide to `interceptor`.
|
|
* @param {Function} interceptor The function to invoke.
|
|
* @returns {*} Returns `value`.
|
|
* @example
|
|
*
|
|
* _([1, 2, 3])
|
|
* .tap(function(array) {
|
|
* // Mutate input array.
|
|
* array.pop();
|
|
* })
|
|
* .reverse()
|
|
* .value();
|
|
* // => [2, 1]
|
|
*/
|
|
function tap(value, interceptor) {
|
|
interceptor(value);
|
|
return value;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.tap` except that it returns the result of `interceptor`.
|
|
* The purpose of this method is to "pass thru" values replacing intermediate
|
|
* results in a method chain sequence.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Seq
|
|
* @param {*} value The value to provide to `interceptor`.
|
|
* @param {Function} interceptor The function to invoke.
|
|
* @returns {*} Returns the result of `interceptor`.
|
|
* @example
|
|
*
|
|
* _(' abc ')
|
|
* .chain()
|
|
* .trim()
|
|
* .thru(function(value) {
|
|
* return [value];
|
|
* })
|
|
* .value();
|
|
* // => ['abc']
|
|
*/
|
|
function thru(value, interceptor) {
|
|
return interceptor(value);
|
|
}
|
|
|
|
/**
|
|
* This method is the wrapper version of `_.at`.
|
|
*
|
|
* @name at
|
|
* @memberOf _
|
|
* @since 1.0.0
|
|
* @category Seq
|
|
* @param {...(string|string[])} [paths] The property paths to pick.
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
|
|
*
|
|
* _(object).at(['a[0].b.c', 'a[1]']).value();
|
|
* // => [3, 4]
|
|
*/
|
|
var wrapperAt = flatRest(function(paths) {
|
|
var length = paths.length,
|
|
start = length ? paths[0] : 0,
|
|
value = this.__wrapped__,
|
|
interceptor = function(object) { return baseAt(object, paths); };
|
|
|
|
if (length > 1 || this.__actions__.length ||
|
|
!(value instanceof LazyWrapper) || !isIndex(start)) {
|
|
return this.thru(interceptor);
|
|
}
|
|
value = value.slice(start, +start + (length ? 1 : 0));
|
|
value.__actions__.push({
|
|
'func': thru,
|
|
'args': [interceptor],
|
|
'thisArg': undefined
|
|
});
|
|
return new LodashWrapper(value, this.__chain__).thru(function(array) {
|
|
if (length && !array.length) {
|
|
array.push(undefined);
|
|
}
|
|
return array;
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
|
|
*
|
|
* @name chain
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Seq
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36 },
|
|
* { 'user': 'fred', 'age': 40 }
|
|
* ];
|
|
*
|
|
* // A sequence without explicit chaining.
|
|
* _(users).head();
|
|
* // => { 'user': 'barney', 'age': 36 }
|
|
*
|
|
* // A sequence with explicit chaining.
|
|
* _(users)
|
|
* .chain()
|
|
* .head()
|
|
* .pick('user')
|
|
* .value();
|
|
* // => { 'user': 'barney' }
|
|
*/
|
|
function wrapperChain() {
|
|
return chain(this);
|
|
}
|
|
|
|
/**
|
|
* Executes the chain sequence and returns the wrapped result.
|
|
*
|
|
* @name commit
|
|
* @memberOf _
|
|
* @since 3.2.0
|
|
* @category Seq
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* var array = [1, 2];
|
|
* var wrapped = _(array).push(3);
|
|
*
|
|
* console.log(array);
|
|
* // => [1, 2]
|
|
*
|
|
* wrapped = wrapped.commit();
|
|
* console.log(array);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* wrapped.last();
|
|
* // => 3
|
|
*
|
|
* console.log(array);
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function wrapperCommit() {
|
|
return new LodashWrapper(this.value(), this.__chain__);
|
|
}
|
|
|
|
/**
|
|
* Gets the next value on a wrapped object following the
|
|
* [iterator protocol](https://mdn.io/iteration_protocols#iterator).
|
|
*
|
|
* @name next
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Seq
|
|
* @returns {Object} Returns the next iterator value.
|
|
* @example
|
|
*
|
|
* var wrapped = _([1, 2]);
|
|
*
|
|
* wrapped.next();
|
|
* // => { 'done': false, 'value': 1 }
|
|
*
|
|
* wrapped.next();
|
|
* // => { 'done': false, 'value': 2 }
|
|
*
|
|
* wrapped.next();
|
|
* // => { 'done': true, 'value': undefined }
|
|
*/
|
|
function wrapperNext() {
|
|
if (this.__values__ === undefined) {
|
|
this.__values__ = toArray(this.value());
|
|
}
|
|
var done = this.__index__ >= this.__values__.length,
|
|
value = done ? undefined : this.__values__[this.__index__++];
|
|
|
|
return { 'done': done, 'value': value };
|
|
}
|
|
|
|
/**
|
|
* Enables the wrapper to be iterable.
|
|
*
|
|
* @name Symbol.iterator
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Seq
|
|
* @returns {Object} Returns the wrapper object.
|
|
* @example
|
|
*
|
|
* var wrapped = _([1, 2]);
|
|
*
|
|
* wrapped[Symbol.iterator]() === wrapped;
|
|
* // => true
|
|
*
|
|
* Array.from(wrapped);
|
|
* // => [1, 2]
|
|
*/
|
|
function wrapperToIterator() {
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Creates a clone of the chain sequence planting `value` as the wrapped value.
|
|
*
|
|
* @name plant
|
|
* @memberOf _
|
|
* @since 3.2.0
|
|
* @category Seq
|
|
* @param {*} value The value to plant.
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* function square(n) {
|
|
* return n * n;
|
|
* }
|
|
*
|
|
* var wrapped = _([1, 2]).map(square);
|
|
* var other = wrapped.plant([3, 4]);
|
|
*
|
|
* other.value();
|
|
* // => [9, 16]
|
|
*
|
|
* wrapped.value();
|
|
* // => [1, 4]
|
|
*/
|
|
function wrapperPlant(value) {
|
|
var result,
|
|
parent = this;
|
|
|
|
while (parent instanceof baseLodash) {
|
|
var clone = wrapperClone(parent);
|
|
clone.__index__ = 0;
|
|
clone.__values__ = undefined;
|
|
if (result) {
|
|
previous.__wrapped__ = clone;
|
|
} else {
|
|
result = clone;
|
|
}
|
|
var previous = clone;
|
|
parent = parent.__wrapped__;
|
|
}
|
|
previous.__wrapped__ = value;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* This method is the wrapper version of `_.reverse`.
|
|
*
|
|
* **Note:** This method mutates the wrapped array.
|
|
*
|
|
* @name reverse
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Seq
|
|
* @returns {Object} Returns the new `lodash` wrapper instance.
|
|
* @example
|
|
*
|
|
* var array = [1, 2, 3];
|
|
*
|
|
* _(array).reverse().value()
|
|
* // => [3, 2, 1]
|
|
*
|
|
* console.log(array);
|
|
* // => [3, 2, 1]
|
|
*/
|
|
function wrapperReverse() {
|
|
var value = this.__wrapped__;
|
|
if (value instanceof LazyWrapper) {
|
|
var wrapped = value;
|
|
if (this.__actions__.length) {
|
|
wrapped = new LazyWrapper(this);
|
|
}
|
|
wrapped = wrapped.reverse();
|
|
wrapped.__actions__.push({
|
|
'func': thru,
|
|
'args': [reverse],
|
|
'thisArg': undefined
|
|
});
|
|
return new LodashWrapper(wrapped, this.__chain__);
|
|
}
|
|
return this.thru(reverse);
|
|
}
|
|
|
|
/**
|
|
* Executes the chain sequence to resolve the unwrapped value.
|
|
*
|
|
* @name value
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @alias toJSON, valueOf
|
|
* @category Seq
|
|
* @returns {*} Returns the resolved unwrapped value.
|
|
* @example
|
|
*
|
|
* _([1, 2, 3]).value();
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function wrapperValue() {
|
|
return baseWrapperValue(this.__wrapped__, this.__actions__);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Creates an object composed of keys generated from the results of running
|
|
* each element of `collection` thru `iteratee`. The corresponding value of
|
|
* each key is the number of times the key was returned by `iteratee`. The
|
|
* iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.5.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee to transform keys.
|
|
* @returns {Object} Returns the composed aggregate object.
|
|
* @example
|
|
*
|
|
* _.countBy([6.1, 4.2, 6.3], Math.floor);
|
|
* // => { '4': 1, '6': 2 }
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.countBy(['one', 'two', 'three'], 'length');
|
|
* // => { '3': 2, '5': 1 }
|
|
*/
|
|
var countBy = createAggregator(function(result, value, key) {
|
|
if (hasOwnProperty.call(result, key)) {
|
|
++result[key];
|
|
} else {
|
|
baseAssignValue(result, key, 1);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Checks if `predicate` returns truthy for **all** elements of `collection`.
|
|
* Iteration is stopped once `predicate` returns falsey. The predicate is
|
|
* invoked with three arguments: (value, index|key, collection).
|
|
*
|
|
* **Note:** This method returns `true` for
|
|
* [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
|
|
* [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
|
|
* elements of empty collections.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.every([true, 1, null, 'yes'], Boolean);
|
|
* // => false
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36, 'active': false },
|
|
* { 'user': 'fred', 'age': 40, 'active': false }
|
|
* ];
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.every(users, { 'user': 'barney', 'active': false });
|
|
* // => false
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.every(users, ['active', false]);
|
|
* // => true
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.every(users, 'active');
|
|
* // => false
|
|
*/
|
|
function every(collection, predicate, guard) {
|
|
var func = isArray(collection) ? arrayEvery : baseEvery;
|
|
if (guard && isIterateeCall(collection, predicate, guard)) {
|
|
predicate = undefined;
|
|
}
|
|
return func(collection, getIteratee(predicate, 3));
|
|
}
|
|
|
|
/**
|
|
* Iterates over elements of `collection`, returning an array of all elements
|
|
* `predicate` returns truthy for. The predicate is invoked with three
|
|
* arguments: (value, index|key, collection).
|
|
*
|
|
* **Note:** Unlike `_.remove`, this method returns a new array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the new filtered array.
|
|
* @see _.reject
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36, 'active': true },
|
|
* { 'user': 'fred', 'age': 40, 'active': false }
|
|
* ];
|
|
*
|
|
* _.filter(users, function(o) { return !o.active; });
|
|
* // => objects for ['fred']
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.filter(users, { 'age': 36, 'active': true });
|
|
* // => objects for ['barney']
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.filter(users, ['active', false]);
|
|
* // => objects for ['fred']
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.filter(users, 'active');
|
|
* // => objects for ['barney']
|
|
*
|
|
* // Combining several predicates using `_.overEvery` or `_.overSome`.
|
|
* _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
|
|
* // => objects for ['fred', 'barney']
|
|
*/
|
|
function filter(collection, predicate) {
|
|
var func = isArray(collection) ? arrayFilter : baseFilter;
|
|
return func(collection, getIteratee(predicate, 3));
|
|
}
|
|
|
|
/**
|
|
* Iterates over elements of `collection`, returning the first element
|
|
* `predicate` returns truthy for. The predicate is invoked with three
|
|
* arguments: (value, index|key, collection).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to inspect.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @param {number} [fromIndex=0] The index to search from.
|
|
* @returns {*} Returns the matched element, else `undefined`.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36, 'active': true },
|
|
* { 'user': 'fred', 'age': 40, 'active': false },
|
|
* { 'user': 'pebbles', 'age': 1, 'active': true }
|
|
* ];
|
|
*
|
|
* _.find(users, function(o) { return o.age < 40; });
|
|
* // => object for 'barney'
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.find(users, { 'age': 1, 'active': true });
|
|
* // => object for 'pebbles'
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.find(users, ['active', false]);
|
|
* // => object for 'fred'
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.find(users, 'active');
|
|
* // => object for 'barney'
|
|
*/
|
|
var find = createFind(findIndex);
|
|
|
|
/**
|
|
* This method is like `_.find` except that it iterates over elements of
|
|
* `collection` from right to left.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to inspect.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @param {number} [fromIndex=collection.length-1] The index to search from.
|
|
* @returns {*} Returns the matched element, else `undefined`.
|
|
* @example
|
|
*
|
|
* _.findLast([1, 2, 3, 4], function(n) {
|
|
* return n % 2 == 1;
|
|
* });
|
|
* // => 3
|
|
*/
|
|
var findLast = createFind(findLastIndex);
|
|
|
|
/**
|
|
* Creates a flattened array of values by running each element in `collection`
|
|
* thru `iteratee` and flattening the mapped results. The iteratee is invoked
|
|
* with three arguments: (value, index|key, collection).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the new flattened array.
|
|
* @example
|
|
*
|
|
* function duplicate(n) {
|
|
* return [n, n];
|
|
* }
|
|
*
|
|
* _.flatMap([1, 2], duplicate);
|
|
* // => [1, 1, 2, 2]
|
|
*/
|
|
function flatMap(collection, iteratee) {
|
|
return baseFlatten(map(collection, iteratee), 1);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.flatMap` except that it recursively flattens the
|
|
* mapped results.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.7.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the new flattened array.
|
|
* @example
|
|
*
|
|
* function duplicate(n) {
|
|
* return [[[n, n]]];
|
|
* }
|
|
*
|
|
* _.flatMapDeep([1, 2], duplicate);
|
|
* // => [1, 1, 2, 2]
|
|
*/
|
|
function flatMapDeep(collection, iteratee) {
|
|
return baseFlatten(map(collection, iteratee), INFINITY);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.flatMap` except that it recursively flattens the
|
|
* mapped results up to `depth` times.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.7.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @param {number} [depth=1] The maximum recursion depth.
|
|
* @returns {Array} Returns the new flattened array.
|
|
* @example
|
|
*
|
|
* function duplicate(n) {
|
|
* return [[[n, n]]];
|
|
* }
|
|
*
|
|
* _.flatMapDepth([1, 2], duplicate, 2);
|
|
* // => [[1, 1], [2, 2]]
|
|
*/
|
|
function flatMapDepth(collection, iteratee, depth) {
|
|
depth = depth === undefined ? 1 : toInteger(depth);
|
|
return baseFlatten(map(collection, iteratee), depth);
|
|
}
|
|
|
|
/**
|
|
* Iterates over elements of `collection` and invokes `iteratee` for each element.
|
|
* The iteratee is invoked with three arguments: (value, index|key, collection).
|
|
* Iteratee functions may exit iteration early by explicitly returning `false`.
|
|
*
|
|
* **Note:** As with other "Collections" methods, objects with a "length"
|
|
* property are iterated like arrays. To avoid this behavior use `_.forIn`
|
|
* or `_.forOwn` for object iteration.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @alias each
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Array|Object} Returns `collection`.
|
|
* @see _.forEachRight
|
|
* @example
|
|
*
|
|
* _.forEach([1, 2], function(value) {
|
|
* console.log(value);
|
|
* });
|
|
* // => Logs `1` then `2`.
|
|
*
|
|
* _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
|
|
* console.log(key);
|
|
* });
|
|
* // => Logs 'a' then 'b' (iteration order is not guaranteed).
|
|
*/
|
|
function forEach(collection, iteratee) {
|
|
var func = isArray(collection) ? arrayEach : baseEach;
|
|
return func(collection, getIteratee(iteratee, 3));
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.forEach` except that it iterates over elements of
|
|
* `collection` from right to left.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @alias eachRight
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Array|Object} Returns `collection`.
|
|
* @see _.forEach
|
|
* @example
|
|
*
|
|
* _.forEachRight([1, 2], function(value) {
|
|
* console.log(value);
|
|
* });
|
|
* // => Logs `2` then `1`.
|
|
*/
|
|
function forEachRight(collection, iteratee) {
|
|
var func = isArray(collection) ? arrayEachRight : baseEachRight;
|
|
return func(collection, getIteratee(iteratee, 3));
|
|
}
|
|
|
|
/**
|
|
* Creates an object composed of keys generated from the results of running
|
|
* each element of `collection` thru `iteratee`. The order of grouped values
|
|
* is determined by the order they occur in `collection`. The corresponding
|
|
* value of each key is an array of elements responsible for generating the
|
|
* key. The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee to transform keys.
|
|
* @returns {Object} Returns the composed aggregate object.
|
|
* @example
|
|
*
|
|
* _.groupBy([6.1, 4.2, 6.3], Math.floor);
|
|
* // => { '4': [4.2], '6': [6.1, 6.3] }
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.groupBy(['one', 'two', 'three'], 'length');
|
|
* // => { '3': ['one', 'two'], '5': ['three'] }
|
|
*/
|
|
var groupBy = createAggregator(function(result, value, key) {
|
|
if (hasOwnProperty.call(result, key)) {
|
|
result[key].push(value);
|
|
} else {
|
|
baseAssignValue(result, key, [value]);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Checks if `value` is in `collection`. If `collection` is a string, it's
|
|
* checked for a substring of `value`, otherwise
|
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* is used for equality comparisons. If `fromIndex` is negative, it's used as
|
|
* the offset from the end of `collection`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object|string} collection The collection to inspect.
|
|
* @param {*} value The value to search for.
|
|
* @param {number} [fromIndex=0] The index to search from.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
|
|
* @returns {boolean} Returns `true` if `value` is found, else `false`.
|
|
* @example
|
|
*
|
|
* _.includes([1, 2, 3], 1);
|
|
* // => true
|
|
*
|
|
* _.includes([1, 2, 3], 1, 2);
|
|
* // => false
|
|
*
|
|
* _.includes({ 'a': 1, 'b': 2 }, 1);
|
|
* // => true
|
|
*
|
|
* _.includes('abcd', 'bc');
|
|
* // => true
|
|
*/
|
|
function includes(collection, value, fromIndex, guard) {
|
|
collection = isArrayLike(collection) ? collection : values(collection);
|
|
fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
|
|
|
|
var length = collection.length;
|
|
if (fromIndex < 0) {
|
|
fromIndex = nativeMax(length + fromIndex, 0);
|
|
}
|
|
return isString(collection)
|
|
? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
|
|
: (!!length && baseIndexOf(collection, value, fromIndex) > -1);
|
|
}
|
|
|
|
/**
|
|
* Invokes the method at `path` of each element in `collection`, returning
|
|
* an array of the results of each invoked method. Any additional arguments
|
|
* are provided to each invoked method. If `path` is a function, it's invoked
|
|
* for, and `this` bound to, each element in `collection`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Array|Function|string} path The path of the method to invoke or
|
|
* the function invoked per iteration.
|
|
* @param {...*} [args] The arguments to invoke each method with.
|
|
* @returns {Array} Returns the array of results.
|
|
* @example
|
|
*
|
|
* _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
|
|
* // => [[1, 5, 7], [1, 2, 3]]
|
|
*
|
|
* _.invokeMap([123, 456], String.prototype.split, '');
|
|
* // => [['1', '2', '3'], ['4', '5', '6']]
|
|
*/
|
|
var invokeMap = baseRest(function(collection, path, args) {
|
|
var index = -1,
|
|
isFunc = typeof path == 'function',
|
|
result = isArrayLike(collection) ? Array(collection.length) : [];
|
|
|
|
baseEach(collection, function(value) {
|
|
result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
|
|
});
|
|
return result;
|
|
});
|
|
|
|
/**
|
|
* Creates an object composed of keys generated from the results of running
|
|
* each element of `collection` thru `iteratee`. The corresponding value of
|
|
* each key is the last element responsible for generating the key. The
|
|
* iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee to transform keys.
|
|
* @returns {Object} Returns the composed aggregate object.
|
|
* @example
|
|
*
|
|
* var array = [
|
|
* { 'dir': 'left', 'code': 97 },
|
|
* { 'dir': 'right', 'code': 100 }
|
|
* ];
|
|
*
|
|
* _.keyBy(array, function(o) {
|
|
* return String.fromCharCode(o.code);
|
|
* });
|
|
* // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
|
|
*
|
|
* _.keyBy(array, 'dir');
|
|
* // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
|
|
*/
|
|
var keyBy = createAggregator(function(result, value, key) {
|
|
baseAssignValue(result, key, value);
|
|
});
|
|
|
|
/**
|
|
* Creates an array of values by running each element in `collection` thru
|
|
* `iteratee`. The iteratee is invoked with three arguments:
|
|
* (value, index|key, collection).
|
|
*
|
|
* Many lodash methods are guarded to work as iteratees for methods like
|
|
* `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
|
|
*
|
|
* The guarded methods are:
|
|
* `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
|
|
* `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
|
|
* `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
|
|
* `template`, `trim`, `trimEnd`, `trimStart`, and `words`
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the new mapped array.
|
|
* @example
|
|
*
|
|
* function square(n) {
|
|
* return n * n;
|
|
* }
|
|
*
|
|
* _.map([4, 8], square);
|
|
* // => [16, 64]
|
|
*
|
|
* _.map({ 'a': 4, 'b': 8 }, square);
|
|
* // => [16, 64] (iteration order is not guaranteed)
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney' },
|
|
* { 'user': 'fred' }
|
|
* ];
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.map(users, 'user');
|
|
* // => ['barney', 'fred']
|
|
*/
|
|
function map(collection, iteratee) {
|
|
var func = isArray(collection) ? arrayMap : baseMap;
|
|
return func(collection, getIteratee(iteratee, 3));
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.sortBy` except that it allows specifying the sort
|
|
* orders of the iteratees to sort by. If `orders` is unspecified, all values
|
|
* are sorted in ascending order. Otherwise, specify an order of "desc" for
|
|
* descending or "asc" for ascending sort order of corresponding values.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
|
|
* The iteratees to sort by.
|
|
* @param {string[]} [orders] The sort orders of `iteratees`.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
|
|
* @returns {Array} Returns the new sorted array.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'fred', 'age': 48 },
|
|
* { 'user': 'barney', 'age': 34 },
|
|
* { 'user': 'fred', 'age': 40 },
|
|
* { 'user': 'barney', 'age': 36 }
|
|
* ];
|
|
*
|
|
* // Sort by `user` in ascending order and by `age` in descending order.
|
|
* _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
|
|
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
|
|
*/
|
|
function orderBy(collection, iteratees, orders, guard) {
|
|
if (collection == null) {
|
|
return [];
|
|
}
|
|
if (!isArray(iteratees)) {
|
|
iteratees = iteratees == null ? [] : [iteratees];
|
|
}
|
|
orders = guard ? undefined : orders;
|
|
if (!isArray(orders)) {
|
|
orders = orders == null ? [] : [orders];
|
|
}
|
|
return baseOrderBy(collection, iteratees, orders);
|
|
}
|
|
|
|
/**
|
|
* Creates an array of elements split into two groups, the first of which
|
|
* contains elements `predicate` returns truthy for, the second of which
|
|
* contains elements `predicate` returns falsey for. The predicate is
|
|
* invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the array of grouped elements.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36, 'active': false },
|
|
* { 'user': 'fred', 'age': 40, 'active': true },
|
|
* { 'user': 'pebbles', 'age': 1, 'active': false }
|
|
* ];
|
|
*
|
|
* _.partition(users, function(o) { return o.active; });
|
|
* // => objects for [['fred'], ['barney', 'pebbles']]
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.partition(users, { 'age': 1, 'active': false });
|
|
* // => objects for [['pebbles'], ['barney', 'fred']]
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.partition(users, ['active', false]);
|
|
* // => objects for [['barney', 'pebbles'], ['fred']]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.partition(users, 'active');
|
|
* // => objects for [['fred'], ['barney', 'pebbles']]
|
|
*/
|
|
var partition = createAggregator(function(result, value, key) {
|
|
result[key ? 0 : 1].push(value);
|
|
}, function() { return [[], []]; });
|
|
|
|
/**
|
|
* Reduces `collection` to a value which is the accumulated result of running
|
|
* each element in `collection` thru `iteratee`, where each successive
|
|
* invocation is supplied the return value of the previous. If `accumulator`
|
|
* is not given, the first element of `collection` is used as the initial
|
|
* value. The iteratee is invoked with four arguments:
|
|
* (accumulator, value, index|key, collection).
|
|
*
|
|
* Many lodash methods are guarded to work as iteratees for methods like
|
|
* `_.reduce`, `_.reduceRight`, and `_.transform`.
|
|
*
|
|
* The guarded methods are:
|
|
* `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
|
|
* and `sortBy`
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @param {*} [accumulator] The initial value.
|
|
* @returns {*} Returns the accumulated value.
|
|
* @see _.reduceRight
|
|
* @example
|
|
*
|
|
* _.reduce([1, 2], function(sum, n) {
|
|
* return sum + n;
|
|
* }, 0);
|
|
* // => 3
|
|
*
|
|
* _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
|
|
* (result[value] || (result[value] = [])).push(key);
|
|
* return result;
|
|
* }, {});
|
|
* // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
|
|
*/
|
|
function reduce(collection, iteratee, accumulator) {
|
|
var func = isArray(collection) ? arrayReduce : baseReduce,
|
|
initAccum = arguments.length < 3;
|
|
|
|
return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.reduce` except that it iterates over elements of
|
|
* `collection` from right to left.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @param {*} [accumulator] The initial value.
|
|
* @returns {*} Returns the accumulated value.
|
|
* @see _.reduce
|
|
* @example
|
|
*
|
|
* var array = [[0, 1], [2, 3], [4, 5]];
|
|
*
|
|
* _.reduceRight(array, function(flattened, other) {
|
|
* return flattened.concat(other);
|
|
* }, []);
|
|
* // => [4, 5, 2, 3, 0, 1]
|
|
*/
|
|
function reduceRight(collection, iteratee, accumulator) {
|
|
var func = isArray(collection) ? arrayReduceRight : baseReduce,
|
|
initAccum = arguments.length < 3;
|
|
|
|
return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
|
|
}
|
|
|
|
/**
|
|
* The opposite of `_.filter`; this method returns the elements of `collection`
|
|
* that `predicate` does **not** return truthy for.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the new filtered array.
|
|
* @see _.filter
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36, 'active': false },
|
|
* { 'user': 'fred', 'age': 40, 'active': true }
|
|
* ];
|
|
*
|
|
* _.reject(users, function(o) { return !o.active; });
|
|
* // => objects for ['fred']
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.reject(users, { 'age': 40, 'active': true });
|
|
* // => objects for ['barney']
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.reject(users, ['active', false]);
|
|
* // => objects for ['fred']
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.reject(users, 'active');
|
|
* // => objects for ['barney']
|
|
*/
|
|
function reject(collection, predicate) {
|
|
var func = isArray(collection) ? arrayFilter : baseFilter;
|
|
return func(collection, negate(getIteratee(predicate, 3)));
|
|
}
|
|
|
|
/**
|
|
* Gets a random element from `collection`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to sample.
|
|
* @returns {*} Returns the random element.
|
|
* @example
|
|
*
|
|
* _.sample([1, 2, 3, 4]);
|
|
* // => 2
|
|
*/
|
|
function sample(collection) {
|
|
var func = isArray(collection) ? arraySample : baseSample;
|
|
return func(collection);
|
|
}
|
|
|
|
/**
|
|
* Gets `n` random elements at unique keys from `collection` up to the
|
|
* size of `collection`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to sample.
|
|
* @param {number} [n=1] The number of elements to sample.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the random elements.
|
|
* @example
|
|
*
|
|
* _.sampleSize([1, 2, 3], 2);
|
|
* // => [3, 1]
|
|
*
|
|
* _.sampleSize([1, 2, 3], 4);
|
|
* // => [2, 3, 1]
|
|
*/
|
|
function sampleSize(collection, n, guard) {
|
|
if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
|
|
n = 1;
|
|
} else {
|
|
n = toInteger(n);
|
|
}
|
|
var func = isArray(collection) ? arraySampleSize : baseSampleSize;
|
|
return func(collection, n);
|
|
}
|
|
|
|
/**
|
|
* Creates an array of shuffled values, using a version of the
|
|
* [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to shuffle.
|
|
* @returns {Array} Returns the new shuffled array.
|
|
* @example
|
|
*
|
|
* _.shuffle([1, 2, 3, 4]);
|
|
* // => [4, 1, 3, 2]
|
|
*/
|
|
function shuffle(collection) {
|
|
var func = isArray(collection) ? arrayShuffle : baseShuffle;
|
|
return func(collection);
|
|
}
|
|
|
|
/**
|
|
* Gets the size of `collection` by returning its length for array-like
|
|
* values or the number of own enumerable string keyed properties for objects.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object|string} collection The collection to inspect.
|
|
* @returns {number} Returns the collection size.
|
|
* @example
|
|
*
|
|
* _.size([1, 2, 3]);
|
|
* // => 3
|
|
*
|
|
* _.size({ 'a': 1, 'b': 2 });
|
|
* // => 2
|
|
*
|
|
* _.size('pebbles');
|
|
* // => 7
|
|
*/
|
|
function size(collection) {
|
|
if (collection == null) {
|
|
return 0;
|
|
}
|
|
if (isArrayLike(collection)) {
|
|
return isString(collection) ? stringSize(collection) : collection.length;
|
|
}
|
|
var tag = getTag(collection);
|
|
if (tag == mapTag || tag == setTag) {
|
|
return collection.size;
|
|
}
|
|
return baseKeys(collection).length;
|
|
}
|
|
|
|
/**
|
|
* Checks if `predicate` returns truthy for **any** element of `collection`.
|
|
* Iteration is stopped once `predicate` returns truthy. The predicate is
|
|
* invoked with three arguments: (value, index|key, collection).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.some([null, 0, 'yes', false], Boolean);
|
|
* // => true
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'active': true },
|
|
* { 'user': 'fred', 'active': false }
|
|
* ];
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.some(users, { 'user': 'barney', 'active': false });
|
|
* // => false
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.some(users, ['active', false]);
|
|
* // => true
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.some(users, 'active');
|
|
* // => true
|
|
*/
|
|
function some(collection, predicate, guard) {
|
|
var func = isArray(collection) ? arraySome : baseSome;
|
|
if (guard && isIterateeCall(collection, predicate, guard)) {
|
|
predicate = undefined;
|
|
}
|
|
return func(collection, getIteratee(predicate, 3));
|
|
}
|
|
|
|
/**
|
|
* Creates an array of elements, sorted in ascending order by the results of
|
|
* running each element in a collection thru each iteratee. This method
|
|
* performs a stable sort, that is, it preserves the original sort order of
|
|
* equal elements. The iteratees are invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Collection
|
|
* @param {Array|Object} collection The collection to iterate over.
|
|
* @param {...(Function|Function[])} [iteratees=[_.identity]]
|
|
* The iteratees to sort by.
|
|
* @returns {Array} Returns the new sorted array.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'fred', 'age': 48 },
|
|
* { 'user': 'barney', 'age': 36 },
|
|
* { 'user': 'fred', 'age': 30 },
|
|
* { 'user': 'barney', 'age': 34 }
|
|
* ];
|
|
*
|
|
* _.sortBy(users, [function(o) { return o.user; }]);
|
|
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
|
|
*
|
|
* _.sortBy(users, ['user', 'age']);
|
|
* // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
|
|
*/
|
|
var sortBy = baseRest(function(collection, iteratees) {
|
|
if (collection == null) {
|
|
return [];
|
|
}
|
|
var length = iteratees.length;
|
|
if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
|
|
iteratees = [];
|
|
} else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
|
|
iteratees = [iteratees[0]];
|
|
}
|
|
return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
|
|
});
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Gets the timestamp of the number of milliseconds that have elapsed since
|
|
* the Unix epoch (1 January 1970 00:00:00 UTC).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.4.0
|
|
* @category Date
|
|
* @returns {number} Returns the timestamp.
|
|
* @example
|
|
*
|
|
* _.defer(function(stamp) {
|
|
* console.log(_.now() - stamp);
|
|
* }, _.now());
|
|
* // => Logs the number of milliseconds it took for the deferred invocation.
|
|
*/
|
|
var now = ctxNow || function() {
|
|
return root.Date.now();
|
|
};
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* The opposite of `_.before`; this method creates a function that invokes
|
|
* `func` once it's called `n` or more times.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {number} n The number of calls before `func` is invoked.
|
|
* @param {Function} func The function to restrict.
|
|
* @returns {Function} Returns the new restricted function.
|
|
* @example
|
|
*
|
|
* var saves = ['profile', 'settings'];
|
|
*
|
|
* var done = _.after(saves.length, function() {
|
|
* console.log('done saving!');
|
|
* });
|
|
*
|
|
* _.forEach(saves, function(type) {
|
|
* asyncSave({ 'type': type, 'complete': done });
|
|
* });
|
|
* // => Logs 'done saving!' after the two async saves have completed.
|
|
*/
|
|
function after(n, func) {
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
n = toInteger(n);
|
|
return function() {
|
|
if (--n < 1) {
|
|
return func.apply(this, arguments);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `func`, with up to `n` arguments,
|
|
* ignoring any additional arguments.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to cap arguments for.
|
|
* @param {number} [n=func.length] The arity cap.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Function} Returns the new capped function.
|
|
* @example
|
|
*
|
|
* _.map(['6', '8', '10'], _.ary(parseInt, 1));
|
|
* // => [6, 8, 10]
|
|
*/
|
|
function ary(func, n, guard) {
|
|
n = guard ? undefined : n;
|
|
n = (func && n == null) ? func.length : n;
|
|
return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `func`, with the `this` binding and arguments
|
|
* of the created function, while it's called less than `n` times. Subsequent
|
|
* calls to the created function return the result of the last `func` invocation.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Function
|
|
* @param {number} n The number of calls at which `func` is no longer invoked.
|
|
* @param {Function} func The function to restrict.
|
|
* @returns {Function} Returns the new restricted function.
|
|
* @example
|
|
*
|
|
* jQuery(element).on('click', _.before(5, addContactToList));
|
|
* // => Allows adding up to 4 contacts to the list.
|
|
*/
|
|
function before(n, func) {
|
|
var result;
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
n = toInteger(n);
|
|
return function() {
|
|
if (--n > 0) {
|
|
result = func.apply(this, arguments);
|
|
}
|
|
if (n <= 1) {
|
|
func = undefined;
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with the `this` binding of `thisArg`
|
|
* and `partials` prepended to the arguments it receives.
|
|
*
|
|
* The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
|
|
* may be used as a placeholder for partially applied arguments.
|
|
*
|
|
* **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
|
|
* property of bound functions.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to bind.
|
|
* @param {*} thisArg The `this` binding of `func`.
|
|
* @param {...*} [partials] The arguments to be partially applied.
|
|
* @returns {Function} Returns the new bound function.
|
|
* @example
|
|
*
|
|
* function greet(greeting, punctuation) {
|
|
* return greeting + ' ' + this.user + punctuation;
|
|
* }
|
|
*
|
|
* var object = { 'user': 'fred' };
|
|
*
|
|
* var bound = _.bind(greet, object, 'hi');
|
|
* bound('!');
|
|
* // => 'hi fred!'
|
|
*
|
|
* // Bound with placeholders.
|
|
* var bound = _.bind(greet, object, _, '!');
|
|
* bound('hi');
|
|
* // => 'hi fred!'
|
|
*/
|
|
var bind = baseRest(function(func, thisArg, partials) {
|
|
var bitmask = WRAP_BIND_FLAG;
|
|
if (partials.length) {
|
|
var holders = replaceHolders(partials, getHolder(bind));
|
|
bitmask |= WRAP_PARTIAL_FLAG;
|
|
}
|
|
return createWrap(func, bitmask, thisArg, partials, holders);
|
|
});
|
|
|
|
/**
|
|
* Creates a function that invokes the method at `object[key]` with `partials`
|
|
* prepended to the arguments it receives.
|
|
*
|
|
* This method differs from `_.bind` by allowing bound functions to reference
|
|
* methods that may be redefined or don't yet exist. See
|
|
* [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
|
|
* for more details.
|
|
*
|
|
* The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
|
|
* builds, may be used as a placeholder for partially applied arguments.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.10.0
|
|
* @category Function
|
|
* @param {Object} object The object to invoke the method on.
|
|
* @param {string} key The key of the method.
|
|
* @param {...*} [partials] The arguments to be partially applied.
|
|
* @returns {Function} Returns the new bound function.
|
|
* @example
|
|
*
|
|
* var object = {
|
|
* 'user': 'fred',
|
|
* 'greet': function(greeting, punctuation) {
|
|
* return greeting + ' ' + this.user + punctuation;
|
|
* }
|
|
* };
|
|
*
|
|
* var bound = _.bindKey(object, 'greet', 'hi');
|
|
* bound('!');
|
|
* // => 'hi fred!'
|
|
*
|
|
* object.greet = function(greeting, punctuation) {
|
|
* return greeting + 'ya ' + this.user + punctuation;
|
|
* };
|
|
*
|
|
* bound('!');
|
|
* // => 'hiya fred!'
|
|
*
|
|
* // Bound with placeholders.
|
|
* var bound = _.bindKey(object, 'greet', _, '!');
|
|
* bound('hi');
|
|
* // => 'hiya fred!'
|
|
*/
|
|
var bindKey = baseRest(function(object, key, partials) {
|
|
var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
|
|
if (partials.length) {
|
|
var holders = replaceHolders(partials, getHolder(bindKey));
|
|
bitmask |= WRAP_PARTIAL_FLAG;
|
|
}
|
|
return createWrap(key, bitmask, object, partials, holders);
|
|
});
|
|
|
|
/**
|
|
* Creates a function that accepts arguments of `func` and either invokes
|
|
* `func` returning its result, if at least `arity` number of arguments have
|
|
* been provided, or returns a function that accepts the remaining `func`
|
|
* arguments, and so on. The arity of `func` may be specified if `func.length`
|
|
* is not sufficient.
|
|
*
|
|
* The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
|
|
* may be used as a placeholder for provided arguments.
|
|
*
|
|
* **Note:** This method doesn't set the "length" property of curried functions.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to curry.
|
|
* @param {number} [arity=func.length] The arity of `func`.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Function} Returns the new curried function.
|
|
* @example
|
|
*
|
|
* var abc = function(a, b, c) {
|
|
* return [a, b, c];
|
|
* };
|
|
*
|
|
* var curried = _.curry(abc);
|
|
*
|
|
* curried(1)(2)(3);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* curried(1, 2)(3);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* curried(1, 2, 3);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* // Curried with placeholders.
|
|
* curried(1)(_, 3)(2);
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function curry(func, arity, guard) {
|
|
arity = guard ? undefined : arity;
|
|
var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
|
|
result.placeholder = curry.placeholder;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.curry` except that arguments are applied to `func`
|
|
* in the manner of `_.partialRight` instead of `_.partial`.
|
|
*
|
|
* The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
|
|
* builds, may be used as a placeholder for provided arguments.
|
|
*
|
|
* **Note:** This method doesn't set the "length" property of curried functions.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to curry.
|
|
* @param {number} [arity=func.length] The arity of `func`.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Function} Returns the new curried function.
|
|
* @example
|
|
*
|
|
* var abc = function(a, b, c) {
|
|
* return [a, b, c];
|
|
* };
|
|
*
|
|
* var curried = _.curryRight(abc);
|
|
*
|
|
* curried(3)(2)(1);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* curried(2, 3)(1);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* curried(1, 2, 3);
|
|
* // => [1, 2, 3]
|
|
*
|
|
* // Curried with placeholders.
|
|
* curried(3)(1, _)(2);
|
|
* // => [1, 2, 3]
|
|
*/
|
|
function curryRight(func, arity, guard) {
|
|
arity = guard ? undefined : arity;
|
|
var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
|
|
result.placeholder = curryRight.placeholder;
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates a debounced function that delays invoking `func` until after `wait`
|
|
* milliseconds have elapsed since the last time the debounced function was
|
|
* invoked. The debounced function comes with a `cancel` method to cancel
|
|
* delayed `func` invocations and a `flush` method to immediately invoke them.
|
|
* Provide `options` to indicate whether `func` should be invoked on the
|
|
* leading and/or trailing edge of the `wait` timeout. The `func` is invoked
|
|
* with the last arguments provided to the debounced function. Subsequent
|
|
* calls to the debounced function return the result of the last `func`
|
|
* invocation.
|
|
*
|
|
* **Note:** If `leading` and `trailing` options are `true`, `func` is
|
|
* invoked on the trailing edge of the timeout only if the debounced function
|
|
* is invoked more than once during the `wait` timeout.
|
|
*
|
|
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
|
|
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
|
|
*
|
|
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
|
|
* for details over the differences between `_.debounce` and `_.throttle`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to debounce.
|
|
* @param {number} [wait=0] The number of milliseconds to delay.
|
|
* @param {Object} [options={}] The options object.
|
|
* @param {boolean} [options.leading=false]
|
|
* Specify invoking on the leading edge of the timeout.
|
|
* @param {number} [options.maxWait]
|
|
* The maximum time `func` is allowed to be delayed before it's invoked.
|
|
* @param {boolean} [options.trailing=true]
|
|
* Specify invoking on the trailing edge of the timeout.
|
|
* @returns {Function} Returns the new debounced function.
|
|
* @example
|
|
*
|
|
* // Avoid costly calculations while the window size is in flux.
|
|
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
|
|
*
|
|
* // Invoke `sendMail` when clicked, debouncing subsequent calls.
|
|
* jQuery(element).on('click', _.debounce(sendMail, 300, {
|
|
* 'leading': true,
|
|
* 'trailing': false
|
|
* }));
|
|
*
|
|
* // Ensure `batchLog` is invoked once after 1 second of debounced calls.
|
|
* var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
|
|
* var source = new EventSource('/stream');
|
|
* jQuery(source).on('message', debounced);
|
|
*
|
|
* // Cancel the trailing debounced invocation.
|
|
* jQuery(window).on('popstate', debounced.cancel);
|
|
*/
|
|
function debounce(func, wait, options) {
|
|
var lastArgs,
|
|
lastThis,
|
|
maxWait,
|
|
result,
|
|
timerId,
|
|
lastCallTime,
|
|
lastInvokeTime = 0,
|
|
leading = false,
|
|
maxing = false,
|
|
trailing = true;
|
|
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
wait = toNumber(wait) || 0;
|
|
if (isObject(options)) {
|
|
leading = !!options.leading;
|
|
maxing = 'maxWait' in options;
|
|
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
|
|
trailing = 'trailing' in options ? !!options.trailing : trailing;
|
|
}
|
|
|
|
function invokeFunc(time) {
|
|
var args = lastArgs,
|
|
thisArg = lastThis;
|
|
|
|
lastArgs = lastThis = undefined;
|
|
lastInvokeTime = time;
|
|
result = func.apply(thisArg, args);
|
|
return result;
|
|
}
|
|
|
|
function leadingEdge(time) {
|
|
// Reset any `maxWait` timer.
|
|
lastInvokeTime = time;
|
|
// Start the timer for the trailing edge.
|
|
timerId = setTimeout(timerExpired, wait);
|
|
// Invoke the leading edge.
|
|
return leading ? invokeFunc(time) : result;
|
|
}
|
|
|
|
function remainingWait(time) {
|
|
var timeSinceLastCall = time - lastCallTime,
|
|
timeSinceLastInvoke = time - lastInvokeTime,
|
|
timeWaiting = wait - timeSinceLastCall;
|
|
|
|
return maxing
|
|
? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
|
|
: timeWaiting;
|
|
}
|
|
|
|
function shouldInvoke(time) {
|
|
var timeSinceLastCall = time - lastCallTime,
|
|
timeSinceLastInvoke = time - lastInvokeTime;
|
|
|
|
// Either this is the first call, activity has stopped and we're at the
|
|
// trailing edge, the system time has gone backwards and we're treating
|
|
// it as the trailing edge, or we've hit the `maxWait` limit.
|
|
return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
|
|
(timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
|
|
}
|
|
|
|
function timerExpired() {
|
|
var time = now();
|
|
if (shouldInvoke(time)) {
|
|
return trailingEdge(time);
|
|
}
|
|
// Restart the timer.
|
|
timerId = setTimeout(timerExpired, remainingWait(time));
|
|
}
|
|
|
|
function trailingEdge(time) {
|
|
timerId = undefined;
|
|
|
|
// Only invoke if we have `lastArgs` which means `func` has been
|
|
// debounced at least once.
|
|
if (trailing && lastArgs) {
|
|
return invokeFunc(time);
|
|
}
|
|
lastArgs = lastThis = undefined;
|
|
return result;
|
|
}
|
|
|
|
function cancel() {
|
|
if (timerId !== undefined) {
|
|
clearTimeout(timerId);
|
|
}
|
|
lastInvokeTime = 0;
|
|
lastArgs = lastCallTime = lastThis = timerId = undefined;
|
|
}
|
|
|
|
function flush() {
|
|
return timerId === undefined ? result : trailingEdge(now());
|
|
}
|
|
|
|
function debounced() {
|
|
var time = now(),
|
|
isInvoking = shouldInvoke(time);
|
|
|
|
lastArgs = arguments;
|
|
lastThis = this;
|
|
lastCallTime = time;
|
|
|
|
if (isInvoking) {
|
|
if (timerId === undefined) {
|
|
return leadingEdge(lastCallTime);
|
|
}
|
|
if (maxing) {
|
|
// Handle invocations in a tight loop.
|
|
clearTimeout(timerId);
|
|
timerId = setTimeout(timerExpired, wait);
|
|
return invokeFunc(lastCallTime);
|
|
}
|
|
}
|
|
if (timerId === undefined) {
|
|
timerId = setTimeout(timerExpired, wait);
|
|
}
|
|
return result;
|
|
}
|
|
debounced.cancel = cancel;
|
|
debounced.flush = flush;
|
|
return debounced;
|
|
}
|
|
|
|
/**
|
|
* Defers invoking the `func` until the current call stack has cleared. Any
|
|
* additional arguments are provided to `func` when it's invoked.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to defer.
|
|
* @param {...*} [args] The arguments to invoke `func` with.
|
|
* @returns {number} Returns the timer id.
|
|
* @example
|
|
*
|
|
* _.defer(function(text) {
|
|
* console.log(text);
|
|
* }, 'deferred');
|
|
* // => Logs 'deferred' after one millisecond.
|
|
*/
|
|
var defer = baseRest(function(func, args) {
|
|
return baseDelay(func, 1, args);
|
|
});
|
|
|
|
/**
|
|
* Invokes `func` after `wait` milliseconds. Any additional arguments are
|
|
* provided to `func` when it's invoked.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to delay.
|
|
* @param {number} wait The number of milliseconds to delay invocation.
|
|
* @param {...*} [args] The arguments to invoke `func` with.
|
|
* @returns {number} Returns the timer id.
|
|
* @example
|
|
*
|
|
* _.delay(function(text) {
|
|
* console.log(text);
|
|
* }, 1000, 'later');
|
|
* // => Logs 'later' after one second.
|
|
*/
|
|
var delay = baseRest(function(func, wait, args) {
|
|
return baseDelay(func, toNumber(wait) || 0, args);
|
|
});
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with arguments reversed.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to flip arguments for.
|
|
* @returns {Function} Returns the new flipped function.
|
|
* @example
|
|
*
|
|
* var flipped = _.flip(function() {
|
|
* return _.toArray(arguments);
|
|
* });
|
|
*
|
|
* flipped('a', 'b', 'c', 'd');
|
|
* // => ['d', 'c', 'b', 'a']
|
|
*/
|
|
function flip(func) {
|
|
return createWrap(func, WRAP_FLIP_FLAG);
|
|
}
|
|
|
|
/**
|
|
* Creates a function that memoizes the result of `func`. If `resolver` is
|
|
* provided, it determines the cache key for storing the result based on the
|
|
* arguments provided to the memoized function. By default, the first argument
|
|
* provided to the memoized function is used as the map cache key. The `func`
|
|
* is invoked with the `this` binding of the memoized function.
|
|
*
|
|
* **Note:** The cache is exposed as the `cache` property on the memoized
|
|
* function. Its creation may be customized by replacing the `_.memoize.Cache`
|
|
* constructor with one whose instances implement the
|
|
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
|
|
* method interface of `clear`, `delete`, `get`, `has`, and `set`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to have its output memoized.
|
|
* @param {Function} [resolver] The function to resolve the cache key.
|
|
* @returns {Function} Returns the new memoized function.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': 2 };
|
|
* var other = { 'c': 3, 'd': 4 };
|
|
*
|
|
* var values = _.memoize(_.values);
|
|
* values(object);
|
|
* // => [1, 2]
|
|
*
|
|
* values(other);
|
|
* // => [3, 4]
|
|
*
|
|
* object.a = 2;
|
|
* values(object);
|
|
* // => [1, 2]
|
|
*
|
|
* // Modify the result cache.
|
|
* values.cache.set(object, ['a', 'b']);
|
|
* values(object);
|
|
* // => ['a', 'b']
|
|
*
|
|
* // Replace `_.memoize.Cache`.
|
|
* _.memoize.Cache = WeakMap;
|
|
*/
|
|
function memoize(func, resolver) {
|
|
if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
var memoized = function() {
|
|
var args = arguments,
|
|
key = resolver ? resolver.apply(this, args) : args[0],
|
|
cache = memoized.cache;
|
|
|
|
if (cache.has(key)) {
|
|
return cache.get(key);
|
|
}
|
|
var result = func.apply(this, args);
|
|
memoized.cache = cache.set(key, result) || cache;
|
|
return result;
|
|
};
|
|
memoized.cache = new (memoize.Cache || MapCache);
|
|
return memoized;
|
|
}
|
|
|
|
// Expose `MapCache`.
|
|
memoize.Cache = MapCache;
|
|
|
|
/**
|
|
* Creates a function that negates the result of the predicate `func`. The
|
|
* `func` predicate is invoked with the `this` binding and arguments of the
|
|
* created function.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Function
|
|
* @param {Function} predicate The predicate to negate.
|
|
* @returns {Function} Returns the new negated function.
|
|
* @example
|
|
*
|
|
* function isEven(n) {
|
|
* return n % 2 == 0;
|
|
* }
|
|
*
|
|
* _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
|
|
* // => [1, 3, 5]
|
|
*/
|
|
function negate(predicate) {
|
|
if (typeof predicate != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
return function() {
|
|
var args = arguments;
|
|
switch (args.length) {
|
|
case 0: return !predicate.call(this);
|
|
case 1: return !predicate.call(this, args[0]);
|
|
case 2: return !predicate.call(this, args[0], args[1]);
|
|
case 3: return !predicate.call(this, args[0], args[1], args[2]);
|
|
}
|
|
return !predicate.apply(this, args);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates a function that is restricted to invoking `func` once. Repeat calls
|
|
* to the function return the value of the first invocation. The `func` is
|
|
* invoked with the `this` binding and arguments of the created function.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to restrict.
|
|
* @returns {Function} Returns the new restricted function.
|
|
* @example
|
|
*
|
|
* var initialize = _.once(createApplication);
|
|
* initialize();
|
|
* initialize();
|
|
* // => `createApplication` is invoked once
|
|
*/
|
|
function once(func) {
|
|
return before(2, func);
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with its arguments transformed.
|
|
*
|
|
* @static
|
|
* @since 4.0.0
|
|
* @memberOf _
|
|
* @category Function
|
|
* @param {Function} func The function to wrap.
|
|
* @param {...(Function|Function[])} [transforms=[_.identity]]
|
|
* The argument transforms.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* function doubled(n) {
|
|
* return n * 2;
|
|
* }
|
|
*
|
|
* function square(n) {
|
|
* return n * n;
|
|
* }
|
|
*
|
|
* var func = _.overArgs(function(x, y) {
|
|
* return [x, y];
|
|
* }, [square, doubled]);
|
|
*
|
|
* func(9, 3);
|
|
* // => [81, 6]
|
|
*
|
|
* func(10, 5);
|
|
* // => [100, 10]
|
|
*/
|
|
var overArgs = castRest(function(func, transforms) {
|
|
transforms = (transforms.length == 1 && isArray(transforms[0]))
|
|
? arrayMap(transforms[0], baseUnary(getIteratee()))
|
|
: arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
|
|
|
|
var funcsLength = transforms.length;
|
|
return baseRest(function(args) {
|
|
var index = -1,
|
|
length = nativeMin(args.length, funcsLength);
|
|
|
|
while (++index < length) {
|
|
args[index] = transforms[index].call(this, args[index]);
|
|
}
|
|
return apply(func, this, args);
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with `partials` prepended to the
|
|
* arguments it receives. This method is like `_.bind` except it does **not**
|
|
* alter the `this` binding.
|
|
*
|
|
* The `_.partial.placeholder` value, which defaults to `_` in monolithic
|
|
* builds, may be used as a placeholder for partially applied arguments.
|
|
*
|
|
* **Note:** This method doesn't set the "length" property of partially
|
|
* applied functions.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.2.0
|
|
* @category Function
|
|
* @param {Function} func The function to partially apply arguments to.
|
|
* @param {...*} [partials] The arguments to be partially applied.
|
|
* @returns {Function} Returns the new partially applied function.
|
|
* @example
|
|
*
|
|
* function greet(greeting, name) {
|
|
* return greeting + ' ' + name;
|
|
* }
|
|
*
|
|
* var sayHelloTo = _.partial(greet, 'hello');
|
|
* sayHelloTo('fred');
|
|
* // => 'hello fred'
|
|
*
|
|
* // Partially applied with placeholders.
|
|
* var greetFred = _.partial(greet, _, 'fred');
|
|
* greetFred('hi');
|
|
* // => 'hi fred'
|
|
*/
|
|
var partial = baseRest(function(func, partials) {
|
|
var holders = replaceHolders(partials, getHolder(partial));
|
|
return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.partial` except that partially applied arguments
|
|
* are appended to the arguments it receives.
|
|
*
|
|
* The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
|
|
* builds, may be used as a placeholder for partially applied arguments.
|
|
*
|
|
* **Note:** This method doesn't set the "length" property of partially
|
|
* applied functions.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to partially apply arguments to.
|
|
* @param {...*} [partials] The arguments to be partially applied.
|
|
* @returns {Function} Returns the new partially applied function.
|
|
* @example
|
|
*
|
|
* function greet(greeting, name) {
|
|
* return greeting + ' ' + name;
|
|
* }
|
|
*
|
|
* var greetFred = _.partialRight(greet, 'fred');
|
|
* greetFred('hi');
|
|
* // => 'hi fred'
|
|
*
|
|
* // Partially applied with placeholders.
|
|
* var sayHelloTo = _.partialRight(greet, 'hello', _);
|
|
* sayHelloTo('fred');
|
|
* // => 'hello fred'
|
|
*/
|
|
var partialRight = baseRest(function(func, partials) {
|
|
var holders = replaceHolders(partials, getHolder(partialRight));
|
|
return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
|
|
});
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with arguments arranged according
|
|
* to the specified `indexes` where the argument value at the first index is
|
|
* provided as the first argument, the argument value at the second index is
|
|
* provided as the second argument, and so on.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to rearrange arguments for.
|
|
* @param {...(number|number[])} indexes The arranged argument indexes.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var rearged = _.rearg(function(a, b, c) {
|
|
* return [a, b, c];
|
|
* }, [2, 0, 1]);
|
|
*
|
|
* rearged('b', 'c', 'a')
|
|
* // => ['a', 'b', 'c']
|
|
*/
|
|
var rearg = flatRest(function(func, indexes) {
|
|
return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
|
|
});
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with the `this` binding of the
|
|
* created function and arguments from `start` and beyond provided as
|
|
* an array.
|
|
*
|
|
* **Note:** This method is based on the
|
|
* [rest parameter](https://mdn.io/rest_parameters).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to apply a rest parameter to.
|
|
* @param {number} [start=func.length-1] The start position of the rest parameter.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var say = _.rest(function(what, names) {
|
|
* return what + ' ' + _.initial(names).join(', ') +
|
|
* (_.size(names) > 1 ? ', & ' : '') + _.last(names);
|
|
* });
|
|
*
|
|
* say('hello', 'fred', 'barney', 'pebbles');
|
|
* // => 'hello fred, barney, & pebbles'
|
|
*/
|
|
function rest(func, start) {
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
start = start === undefined ? start : toInteger(start);
|
|
return baseRest(func, start);
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with the `this` binding of the
|
|
* create function and an array of arguments much like
|
|
* [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
|
|
*
|
|
* **Note:** This method is based on the
|
|
* [spread operator](https://mdn.io/spread_operator).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.2.0
|
|
* @category Function
|
|
* @param {Function} func The function to spread arguments over.
|
|
* @param {number} [start=0] The start position of the spread.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var say = _.spread(function(who, what) {
|
|
* return who + ' says ' + what;
|
|
* });
|
|
*
|
|
* say(['fred', 'hello']);
|
|
* // => 'fred says hello'
|
|
*
|
|
* var numbers = Promise.all([
|
|
* Promise.resolve(40),
|
|
* Promise.resolve(36)
|
|
* ]);
|
|
*
|
|
* numbers.then(_.spread(function(x, y) {
|
|
* return x + y;
|
|
* }));
|
|
* // => a Promise of 76
|
|
*/
|
|
function spread(func, start) {
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
start = start == null ? 0 : nativeMax(toInteger(start), 0);
|
|
return baseRest(function(args) {
|
|
var array = args[start],
|
|
otherArgs = castSlice(args, 0, start);
|
|
|
|
if (array) {
|
|
arrayPush(otherArgs, array);
|
|
}
|
|
return apply(func, this, otherArgs);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates a throttled function that only invokes `func` at most once per
|
|
* every `wait` milliseconds. The throttled function comes with a `cancel`
|
|
* method to cancel delayed `func` invocations and a `flush` method to
|
|
* immediately invoke them. Provide `options` to indicate whether `func`
|
|
* should be invoked on the leading and/or trailing edge of the `wait`
|
|
* timeout. The `func` is invoked with the last arguments provided to the
|
|
* throttled function. Subsequent calls to the throttled function return the
|
|
* result of the last `func` invocation.
|
|
*
|
|
* **Note:** If `leading` and `trailing` options are `true`, `func` is
|
|
* invoked on the trailing edge of the timeout only if the throttled function
|
|
* is invoked more than once during the `wait` timeout.
|
|
*
|
|
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
|
|
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
|
|
*
|
|
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
|
|
* for details over the differences between `_.throttle` and `_.debounce`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {Function} func The function to throttle.
|
|
* @param {number} [wait=0] The number of milliseconds to throttle invocations to.
|
|
* @param {Object} [options={}] The options object.
|
|
* @param {boolean} [options.leading=true]
|
|
* Specify invoking on the leading edge of the timeout.
|
|
* @param {boolean} [options.trailing=true]
|
|
* Specify invoking on the trailing edge of the timeout.
|
|
* @returns {Function} Returns the new throttled function.
|
|
* @example
|
|
*
|
|
* // Avoid excessively updating the position while scrolling.
|
|
* jQuery(window).on('scroll', _.throttle(updatePosition, 100));
|
|
*
|
|
* // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
|
|
* var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
|
|
* jQuery(element).on('click', throttled);
|
|
*
|
|
* // Cancel the trailing throttled invocation.
|
|
* jQuery(window).on('popstate', throttled.cancel);
|
|
*/
|
|
function throttle(func, wait, options) {
|
|
var leading = true,
|
|
trailing = true;
|
|
|
|
if (typeof func != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
if (isObject(options)) {
|
|
leading = 'leading' in options ? !!options.leading : leading;
|
|
trailing = 'trailing' in options ? !!options.trailing : trailing;
|
|
}
|
|
return debounce(func, wait, {
|
|
'leading': leading,
|
|
'maxWait': wait,
|
|
'trailing': trailing
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates a function that accepts up to one argument, ignoring any
|
|
* additional arguments.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Function
|
|
* @param {Function} func The function to cap arguments for.
|
|
* @returns {Function} Returns the new capped function.
|
|
* @example
|
|
*
|
|
* _.map(['6', '8', '10'], _.unary(parseInt));
|
|
* // => [6, 8, 10]
|
|
*/
|
|
function unary(func) {
|
|
return ary(func, 1);
|
|
}
|
|
|
|
/**
|
|
* Creates a function that provides `value` to `wrapper` as its first
|
|
* argument. Any additional arguments provided to the function are appended
|
|
* to those provided to the `wrapper`. The wrapper is invoked with the `this`
|
|
* binding of the created function.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Function
|
|
* @param {*} value The value to wrap.
|
|
* @param {Function} [wrapper=identity] The wrapper function.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var p = _.wrap(_.escape, function(func, text) {
|
|
* return '<p>' + func(text) + '</p>';
|
|
* });
|
|
*
|
|
* p('fred, barney, & pebbles');
|
|
* // => '<p>fred, barney, & pebbles</p>'
|
|
*/
|
|
function wrap(value, wrapper) {
|
|
return partial(castFunction(wrapper), value);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Casts `value` as an array if it's not one.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.4.0
|
|
* @category Lang
|
|
* @param {*} value The value to inspect.
|
|
* @returns {Array} Returns the cast array.
|
|
* @example
|
|
*
|
|
* _.castArray(1);
|
|
* // => [1]
|
|
*
|
|
* _.castArray({ 'a': 1 });
|
|
* // => [{ 'a': 1 }]
|
|
*
|
|
* _.castArray('abc');
|
|
* // => ['abc']
|
|
*
|
|
* _.castArray(null);
|
|
* // => [null]
|
|
*
|
|
* _.castArray(undefined);
|
|
* // => [undefined]
|
|
*
|
|
* _.castArray();
|
|
* // => []
|
|
*
|
|
* var array = [1, 2, 3];
|
|
* console.log(_.castArray(array) === array);
|
|
* // => true
|
|
*/
|
|
function castArray() {
|
|
if (!arguments.length) {
|
|
return [];
|
|
}
|
|
var value = arguments[0];
|
|
return isArray(value) ? value : [value];
|
|
}
|
|
|
|
/**
|
|
* Creates a shallow clone of `value`.
|
|
*
|
|
* **Note:** This method is loosely based on the
|
|
* [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
|
|
* and supports cloning arrays, array buffers, booleans, date objects, maps,
|
|
* numbers, `Object` objects, regexes, sets, strings, symbols, and typed
|
|
* arrays. The own enumerable properties of `arguments` objects are cloned
|
|
* as plain objects. An empty object is returned for uncloneable values such
|
|
* as error objects, functions, DOM nodes, and WeakMaps.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to clone.
|
|
* @returns {*} Returns the cloned value.
|
|
* @see _.cloneDeep
|
|
* @example
|
|
*
|
|
* var objects = [{ 'a': 1 }, { 'b': 2 }];
|
|
*
|
|
* var shallow = _.clone(objects);
|
|
* console.log(shallow[0] === objects[0]);
|
|
* // => true
|
|
*/
|
|
function clone(value) {
|
|
return baseClone(value, CLONE_SYMBOLS_FLAG);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.clone` except that it accepts `customizer` which
|
|
* is invoked to produce the cloned value. If `customizer` returns `undefined`,
|
|
* cloning is handled by the method instead. The `customizer` is invoked with
|
|
* up to four arguments; (value [, index|key, object, stack]).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to clone.
|
|
* @param {Function} [customizer] The function to customize cloning.
|
|
* @returns {*} Returns the cloned value.
|
|
* @see _.cloneDeepWith
|
|
* @example
|
|
*
|
|
* function customizer(value) {
|
|
* if (_.isElement(value)) {
|
|
* return value.cloneNode(false);
|
|
* }
|
|
* }
|
|
*
|
|
* var el = _.cloneWith(document.body, customizer);
|
|
*
|
|
* console.log(el === document.body);
|
|
* // => false
|
|
* console.log(el.nodeName);
|
|
* // => 'BODY'
|
|
* console.log(el.childNodes.length);
|
|
* // => 0
|
|
*/
|
|
function cloneWith(value, customizer) {
|
|
customizer = typeof customizer == 'function' ? customizer : undefined;
|
|
return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.clone` except that it recursively clones `value`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to recursively clone.
|
|
* @returns {*} Returns the deep cloned value.
|
|
* @see _.clone
|
|
* @example
|
|
*
|
|
* var objects = [{ 'a': 1 }, { 'b': 2 }];
|
|
*
|
|
* var deep = _.cloneDeep(objects);
|
|
* console.log(deep[0] === objects[0]);
|
|
* // => false
|
|
*/
|
|
function cloneDeep(value) {
|
|
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.cloneWith` except that it recursively clones `value`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to recursively clone.
|
|
* @param {Function} [customizer] The function to customize cloning.
|
|
* @returns {*} Returns the deep cloned value.
|
|
* @see _.cloneWith
|
|
* @example
|
|
*
|
|
* function customizer(value) {
|
|
* if (_.isElement(value)) {
|
|
* return value.cloneNode(true);
|
|
* }
|
|
* }
|
|
*
|
|
* var el = _.cloneDeepWith(document.body, customizer);
|
|
*
|
|
* console.log(el === document.body);
|
|
* // => false
|
|
* console.log(el.nodeName);
|
|
* // => 'BODY'
|
|
* console.log(el.childNodes.length);
|
|
* // => 20
|
|
*/
|
|
function cloneDeepWith(value, customizer) {
|
|
customizer = typeof customizer == 'function' ? customizer : undefined;
|
|
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
|
|
}
|
|
|
|
/**
|
|
* Checks if `object` conforms to `source` by invoking the predicate
|
|
* properties of `source` with the corresponding property values of `object`.
|
|
*
|
|
* **Note:** This method is equivalent to `_.conforms` when `source` is
|
|
* partially applied.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.14.0
|
|
* @category Lang
|
|
* @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`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': 2 };
|
|
*
|
|
* _.conformsTo(object, { 'b': function(n) { return n > 1; } });
|
|
* // => true
|
|
*
|
|
* _.conformsTo(object, { 'b': function(n) { return n > 2; } });
|
|
* // => false
|
|
*/
|
|
function conformsTo(object, source) {
|
|
return source == null || baseConformsTo(object, source, keys(source));
|
|
}
|
|
|
|
/**
|
|
* Performs a
|
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|
* comparison between two values to determine if they are equivalent.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1 };
|
|
* var other = { 'a': 1 };
|
|
*
|
|
* _.eq(object, object);
|
|
* // => true
|
|
*
|
|
* _.eq(object, other);
|
|
* // => false
|
|
*
|
|
* _.eq('a', 'a');
|
|
* // => true
|
|
*
|
|
* _.eq('a', Object('a'));
|
|
* // => false
|
|
*
|
|
* _.eq(NaN, NaN);
|
|
* // => true
|
|
*/
|
|
function eq(value, other) {
|
|
return value === other || (value !== value && other !== other);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is greater than `other`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.9.0
|
|
* @category Lang
|
|
* @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`.
|
|
* @see _.lt
|
|
* @example
|
|
*
|
|
* _.gt(3, 1);
|
|
* // => true
|
|
*
|
|
* _.gt(3, 3);
|
|
* // => false
|
|
*
|
|
* _.gt(1, 3);
|
|
* // => false
|
|
*/
|
|
var gt = createRelationalOperation(baseGt);
|
|
|
|
/**
|
|
* Checks if `value` is greater than or equal to `other`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.9.0
|
|
* @category Lang
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @returns {boolean} Returns `true` if `value` is greater than or equal to
|
|
* `other`, else `false`.
|
|
* @see _.lte
|
|
* @example
|
|
*
|
|
* _.gte(3, 1);
|
|
* // => true
|
|
*
|
|
* _.gte(3, 3);
|
|
* // => true
|
|
*
|
|
* _.gte(1, 3);
|
|
* // => false
|
|
*/
|
|
var gte = createRelationalOperation(function(value, other) {
|
|
return value >= other;
|
|
});
|
|
|
|
/**
|
|
* Checks if `value` is likely an `arguments` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.isArguments(function() { return arguments; }());
|
|
* // => true
|
|
*
|
|
* _.isArguments([1, 2, 3]);
|
|
* // => false
|
|
*/
|
|
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
|
|
return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
|
|
!propertyIsEnumerable.call(value, 'callee');
|
|
};
|
|
|
|
/**
|
|
* Checks if `value` is classified as an `Array` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
|
|
* @example
|
|
*
|
|
* _.isArray([1, 2, 3]);
|
|
* // => true
|
|
*
|
|
* _.isArray(document.body.children);
|
|
* // => false
|
|
*
|
|
* _.isArray('abc');
|
|
* // => false
|
|
*
|
|
* _.isArray(_.noop);
|
|
* // => false
|
|
*/
|
|
var isArray = Array.isArray;
|
|
|
|
/**
|
|
* Checks if `value` is classified as an `ArrayBuffer` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.3.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
|
|
* @example
|
|
*
|
|
* _.isArrayBuffer(new ArrayBuffer(2));
|
|
* // => true
|
|
*
|
|
* _.isArrayBuffer(new Array(2));
|
|
* // => false
|
|
*/
|
|
var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
|
|
|
|
/**
|
|
* Checks if `value` is array-like. A value is considered array-like if it's
|
|
* not a function and has a `value.length` that's an integer greater than or
|
|
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
|
|
* @example
|
|
*
|
|
* _.isArrayLike([1, 2, 3]);
|
|
* // => true
|
|
*
|
|
* _.isArrayLike(document.body.children);
|
|
* // => true
|
|
*
|
|
* _.isArrayLike('abc');
|
|
* // => true
|
|
*
|
|
* _.isArrayLike(_.noop);
|
|
* // => false
|
|
*/
|
|
function isArrayLike(value) {
|
|
return value != null && isLength(value.length) && !isFunction(value);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.isArrayLike` except that it also checks if `value`
|
|
* is an object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an array-like object,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.isArrayLikeObject([1, 2, 3]);
|
|
* // => true
|
|
*
|
|
* _.isArrayLikeObject(document.body.children);
|
|
* // => true
|
|
*
|
|
* _.isArrayLikeObject('abc');
|
|
* // => false
|
|
*
|
|
* _.isArrayLikeObject(_.noop);
|
|
* // => false
|
|
*/
|
|
function isArrayLikeObject(value) {
|
|
return isObjectLike(value) && isArrayLike(value);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a boolean primitive or object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
|
|
* @example
|
|
*
|
|
* _.isBoolean(false);
|
|
* // => true
|
|
*
|
|
* _.isBoolean(null);
|
|
* // => false
|
|
*/
|
|
function isBoolean(value) {
|
|
return value === true || value === false ||
|
|
(isObjectLike(value) && baseGetTag(value) == boolTag);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a buffer.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.3.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
|
|
* @example
|
|
*
|
|
* _.isBuffer(new Buffer(2));
|
|
* // => true
|
|
*
|
|
* _.isBuffer(new Uint8Array(2));
|
|
* // => false
|
|
*/
|
|
var isBuffer = nativeIsBuffer || stubFalse;
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `Date` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a date object, else `false`.
|
|
* @example
|
|
*
|
|
* _.isDate(new Date);
|
|
* // => true
|
|
*
|
|
* _.isDate('Mon April 23 2012');
|
|
* // => false
|
|
*/
|
|
var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
|
|
|
|
/**
|
|
* Checks if `value` is likely a DOM element.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
|
|
* @example
|
|
*
|
|
* _.isElement(document.body);
|
|
* // => true
|
|
*
|
|
* _.isElement('<body>');
|
|
* // => false
|
|
*/
|
|
function isElement(value) {
|
|
return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is an empty object, collection, map, or set.
|
|
*
|
|
* Objects are considered empty if they have no own enumerable string keyed
|
|
* properties.
|
|
*
|
|
* Array-like values such as `arguments` objects, arrays, buffers, strings, or
|
|
* jQuery-like collections are considered empty if they have a `length` of `0`.
|
|
* Similarly, maps and sets are considered empty if they have a `size` of `0`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is empty, else `false`.
|
|
* @example
|
|
*
|
|
* _.isEmpty(null);
|
|
* // => true
|
|
*
|
|
* _.isEmpty(true);
|
|
* // => true
|
|
*
|
|
* _.isEmpty(1);
|
|
* // => true
|
|
*
|
|
* _.isEmpty([1, 2, 3]);
|
|
* // => false
|
|
*
|
|
* _.isEmpty({ 'a': 1 });
|
|
* // => false
|
|
*/
|
|
function isEmpty(value) {
|
|
if (value == null) {
|
|
return true;
|
|
}
|
|
if (isArrayLike(value) &&
|
|
(isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
|
|
isBuffer(value) || isTypedArray(value) || isArguments(value))) {
|
|
return !value.length;
|
|
}
|
|
var tag = getTag(value);
|
|
if (tag == mapTag || tag == setTag) {
|
|
return !value.size;
|
|
}
|
|
if (isPrototype(value)) {
|
|
return !baseKeys(value).length;
|
|
}
|
|
for (var key in value) {
|
|
if (hasOwnProperty.call(value, key)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Performs a deep comparison between two values to determine if they are
|
|
* equivalent.
|
|
*
|
|
* **Note:** This method supports comparing arrays, array buffers, booleans,
|
|
* date objects, error objects, maps, numbers, `Object` objects, regexes,
|
|
* sets, strings, symbols, and typed arrays. `Object` objects are compared
|
|
* by their own, not inherited, enumerable properties. Functions and DOM
|
|
* nodes are compared by strict equality, i.e. `===`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1 };
|
|
* var other = { 'a': 1 };
|
|
*
|
|
* _.isEqual(object, other);
|
|
* // => true
|
|
*
|
|
* object === other;
|
|
* // => false
|
|
*/
|
|
function isEqual(value, other) {
|
|
return baseIsEqual(value, other);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.isEqual` except that it accepts `customizer` which
|
|
* is invoked to compare values. If `customizer` returns `undefined`, comparisons
|
|
* are handled by the method instead. The `customizer` is invoked with up to
|
|
* six arguments: (objValue, othValue [, index|key, object, other, stack]).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @param {Function} [customizer] The function to customize comparisons.
|
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|
* @example
|
|
*
|
|
* function isGreeting(value) {
|
|
* return /^h(?:i|ello)$/.test(value);
|
|
* }
|
|
*
|
|
* function customizer(objValue, othValue) {
|
|
* if (isGreeting(objValue) && isGreeting(othValue)) {
|
|
* return true;
|
|
* }
|
|
* }
|
|
*
|
|
* var array = ['hello', 'goodbye'];
|
|
* var other = ['hi', 'goodbye'];
|
|
*
|
|
* _.isEqualWith(array, other, customizer);
|
|
* // => true
|
|
*/
|
|
function isEqualWith(value, other, customizer) {
|
|
customizer = typeof customizer == 'function' ? customizer : undefined;
|
|
var result = customizer ? customizer(value, other) : undefined;
|
|
return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
|
|
* `SyntaxError`, `TypeError`, or `URIError` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an error object, else `false`.
|
|
* @example
|
|
*
|
|
* _.isError(new Error);
|
|
* // => true
|
|
*
|
|
* _.isError(Error);
|
|
* // => false
|
|
*/
|
|
function isError(value) {
|
|
if (!isObjectLike(value)) {
|
|
return false;
|
|
}
|
|
var tag = baseGetTag(value);
|
|
return tag == errorTag || tag == domExcTag ||
|
|
(typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a finite primitive number.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`Number.isFinite`](https://mdn.io/Number/isFinite).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
|
|
* @example
|
|
*
|
|
* _.isFinite(3);
|
|
* // => true
|
|
*
|
|
* _.isFinite(Number.MIN_VALUE);
|
|
* // => true
|
|
*
|
|
* _.isFinite(Infinity);
|
|
* // => false
|
|
*
|
|
* _.isFinite('3');
|
|
* // => false
|
|
*/
|
|
function isFinite(value) {
|
|
return typeof value == 'number' && nativeIsFinite(value);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `Function` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
|
* @example
|
|
*
|
|
* _.isFunction(_);
|
|
* // => true
|
|
*
|
|
* _.isFunction(/abc/);
|
|
* // => false
|
|
*/
|
|
function isFunction(value) {
|
|
if (!isObject(value)) {
|
|
return false;
|
|
}
|
|
// The use of `Object#toString` avoids issues with the `typeof` operator
|
|
// in Safari 9 which returns 'object' for typed arrays and other constructors.
|
|
var tag = baseGetTag(value);
|
|
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is an integer.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`Number.isInteger`](https://mdn.io/Number/isInteger).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an integer, else `false`.
|
|
* @example
|
|
*
|
|
* _.isInteger(3);
|
|
* // => true
|
|
*
|
|
* _.isInteger(Number.MIN_VALUE);
|
|
* // => false
|
|
*
|
|
* _.isInteger(Infinity);
|
|
* // => false
|
|
*
|
|
* _.isInteger('3');
|
|
* // => false
|
|
*/
|
|
function isInteger(value) {
|
|
return typeof value == 'number' && value == toInteger(value);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a valid array-like length.
|
|
*
|
|
* **Note:** This method is loosely based on
|
|
* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
|
|
* @example
|
|
*
|
|
* _.isLength(3);
|
|
* // => true
|
|
*
|
|
* _.isLength(Number.MIN_VALUE);
|
|
* // => false
|
|
*
|
|
* _.isLength(Infinity);
|
|
* // => false
|
|
*
|
|
* _.isLength('3');
|
|
* // => false
|
|
*/
|
|
function isLength(value) {
|
|
return typeof value == 'number' &&
|
|
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is the
|
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
|
* @example
|
|
*
|
|
* _.isObject({});
|
|
* // => true
|
|
*
|
|
* _.isObject([1, 2, 3]);
|
|
* // => true
|
|
*
|
|
* _.isObject(_.noop);
|
|
* // => true
|
|
*
|
|
* _.isObject(null);
|
|
* // => false
|
|
*/
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return value != null && (type == 'object' || type == 'function');
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
|
* and has a `typeof` result of "object".
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
|
* @example
|
|
*
|
|
* _.isObjectLike({});
|
|
* // => true
|
|
*
|
|
* _.isObjectLike([1, 2, 3]);
|
|
* // => true
|
|
*
|
|
* _.isObjectLike(_.noop);
|
|
* // => false
|
|
*
|
|
* _.isObjectLike(null);
|
|
* // => false
|
|
*/
|
|
function isObjectLike(value) {
|
|
return value != null && typeof value == 'object';
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `Map` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.3.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a map, else `false`.
|
|
* @example
|
|
*
|
|
* _.isMap(new Map);
|
|
* // => true
|
|
*
|
|
* _.isMap(new WeakMap);
|
|
* // => false
|
|
*/
|
|
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
|
|
|
|
/**
|
|
* Performs a partial deep comparison between `object` and `source` to
|
|
* determine if `object` contains equivalent property values.
|
|
*
|
|
* **Note:** This method is equivalent to `_.matches` when `source` is
|
|
* partially applied.
|
|
*
|
|
* Partial comparisons will match empty array and empty object `source`
|
|
* values against any array or object value, respectively. See `_.isEqual`
|
|
* for a list of supported value comparisons.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Lang
|
|
* @param {Object} object The object to inspect.
|
|
* @param {Object} source The object of property values to match.
|
|
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': 2 };
|
|
*
|
|
* _.isMatch(object, { 'b': 2 });
|
|
* // => true
|
|
*
|
|
* _.isMatch(object, { 'b': 1 });
|
|
* // => false
|
|
*/
|
|
function isMatch(object, source) {
|
|
return object === source || baseIsMatch(object, source, getMatchData(source));
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.isMatch` except that it accepts `customizer` which
|
|
* is invoked to compare values. If `customizer` returns `undefined`, comparisons
|
|
* are handled by the method instead. The `customizer` is invoked with five
|
|
* arguments: (objValue, srcValue, index|key, object, source).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {Object} object The object to inspect.
|
|
* @param {Object} source The object of property values to match.
|
|
* @param {Function} [customizer] The function to customize comparisons.
|
|
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
|
* @example
|
|
*
|
|
* function isGreeting(value) {
|
|
* return /^h(?:i|ello)$/.test(value);
|
|
* }
|
|
*
|
|
* function customizer(objValue, srcValue) {
|
|
* if (isGreeting(objValue) && isGreeting(srcValue)) {
|
|
* return true;
|
|
* }
|
|
* }
|
|
*
|
|
* var object = { 'greeting': 'hello' };
|
|
* var source = { 'greeting': 'hi' };
|
|
*
|
|
* _.isMatchWith(object, source, customizer);
|
|
* // => true
|
|
*/
|
|
function isMatchWith(object, source, customizer) {
|
|
customizer = typeof customizer == 'function' ? customizer : undefined;
|
|
return baseIsMatch(object, source, getMatchData(source), customizer);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is `NaN`.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
|
|
* global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
|
|
* `undefined` and other non-number values.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
|
|
* @example
|
|
*
|
|
* _.isNaN(NaN);
|
|
* // => true
|
|
*
|
|
* _.isNaN(new Number(NaN));
|
|
* // => true
|
|
*
|
|
* isNaN(undefined);
|
|
* // => true
|
|
*
|
|
* _.isNaN(undefined);
|
|
* // => false
|
|
*/
|
|
function isNaN(value) {
|
|
// An `NaN` primitive is the only value that is not equal to itself.
|
|
// Perform the `toStringTag` check first to avoid errors with some
|
|
// ActiveX objects in IE.
|
|
return isNumber(value) && value != +value;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a pristine native function.
|
|
*
|
|
* **Note:** This method can't reliably detect native functions in the presence
|
|
* of the core-js package because core-js circumvents this kind of detection.
|
|
* Despite multiple requests, the core-js maintainer has made it clear: any
|
|
* attempt to fix the detection will be obstructed. As a result, we're left
|
|
* with little choice but to throw an error. Unfortunately, this also affects
|
|
* packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
|
|
* which rely on core-js.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.isNative(Array.prototype.push);
|
|
* // => true
|
|
*
|
|
* _.isNative(_);
|
|
* // => false
|
|
*/
|
|
function isNative(value) {
|
|
if (isMaskable(value)) {
|
|
throw new Error(CORE_ERROR_TEXT);
|
|
}
|
|
return baseIsNative(value);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is `null`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is `null`, else `false`.
|
|
* @example
|
|
*
|
|
* _.isNull(null);
|
|
* // => true
|
|
*
|
|
* _.isNull(void 0);
|
|
* // => false
|
|
*/
|
|
function isNull(value) {
|
|
return value === null;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is `null` or `undefined`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is nullish, else `false`.
|
|
* @example
|
|
*
|
|
* _.isNil(null);
|
|
* // => true
|
|
*
|
|
* _.isNil(void 0);
|
|
* // => true
|
|
*
|
|
* _.isNil(NaN);
|
|
* // => false
|
|
*/
|
|
function isNil(value) {
|
|
return value == null;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `Number` primitive or object.
|
|
*
|
|
* **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
|
|
* classified as numbers, use the `_.isFinite` method.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a number, else `false`.
|
|
* @example
|
|
*
|
|
* _.isNumber(3);
|
|
* // => true
|
|
*
|
|
* _.isNumber(Number.MIN_VALUE);
|
|
* // => true
|
|
*
|
|
* _.isNumber(Infinity);
|
|
* // => true
|
|
*
|
|
* _.isNumber('3');
|
|
* // => false
|
|
*/
|
|
function isNumber(value) {
|
|
return typeof value == 'number' ||
|
|
(isObjectLike(value) && baseGetTag(value) == numberTag);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is a plain object, that is, an object created by the
|
|
* `Object` constructor or one with a `[[Prototype]]` of `null`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.8.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* }
|
|
*
|
|
* _.isPlainObject(new Foo);
|
|
* // => false
|
|
*
|
|
* _.isPlainObject([1, 2, 3]);
|
|
* // => false
|
|
*
|
|
* _.isPlainObject({ 'x': 0, 'y': 0 });
|
|
* // => true
|
|
*
|
|
* _.isPlainObject(Object.create(null));
|
|
* // => true
|
|
*/
|
|
function isPlainObject(value) {
|
|
if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
|
|
return false;
|
|
}
|
|
var proto = getPrototype(value);
|
|
if (proto === null) {
|
|
return true;
|
|
}
|
|
var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
|
|
return typeof Ctor == 'function' && Ctor instanceof Ctor &&
|
|
funcToString.call(Ctor) == objectCtorString;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `RegExp` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.1.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
|
|
* @example
|
|
*
|
|
* _.isRegExp(/abc/);
|
|
* // => true
|
|
*
|
|
* _.isRegExp('/abc/');
|
|
* // => false
|
|
*/
|
|
var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
|
|
|
|
/**
|
|
* Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
|
|
* double precision number which isn't the result of a rounded unsafe integer.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
|
|
* @example
|
|
*
|
|
* _.isSafeInteger(3);
|
|
* // => true
|
|
*
|
|
* _.isSafeInteger(Number.MIN_VALUE);
|
|
* // => false
|
|
*
|
|
* _.isSafeInteger(Infinity);
|
|
* // => false
|
|
*
|
|
* _.isSafeInteger('3');
|
|
* // => false
|
|
*/
|
|
function isSafeInteger(value) {
|
|
return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `Set` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.3.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a set, else `false`.
|
|
* @example
|
|
*
|
|
* _.isSet(new Set);
|
|
* // => true
|
|
*
|
|
* _.isSet(new WeakSet);
|
|
* // => false
|
|
*/
|
|
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `String` primitive or object.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a string, else `false`.
|
|
* @example
|
|
*
|
|
* _.isString('abc');
|
|
* // => true
|
|
*
|
|
* _.isString(1);
|
|
* // => false
|
|
*/
|
|
function isString(value) {
|
|
return typeof value == 'string' ||
|
|
(!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `Symbol` primitive or object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
|
|
* @example
|
|
*
|
|
* _.isSymbol(Symbol.iterator);
|
|
* // => true
|
|
*
|
|
* _.isSymbol('abc');
|
|
* // => false
|
|
*/
|
|
function isSymbol(value) {
|
|
return typeof value == 'symbol' ||
|
|
(isObjectLike(value) && baseGetTag(value) == symbolTag);
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a typed array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
|
|
* @example
|
|
*
|
|
* _.isTypedArray(new Uint8Array);
|
|
* // => true
|
|
*
|
|
* _.isTypedArray([]);
|
|
* // => false
|
|
*/
|
|
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
|
|
|
|
/**
|
|
* Checks if `value` is `undefined`.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
|
|
* @example
|
|
*
|
|
* _.isUndefined(void 0);
|
|
* // => true
|
|
*
|
|
* _.isUndefined(null);
|
|
* // => false
|
|
*/
|
|
function isUndefined(value) {
|
|
return value === undefined;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `WeakMap` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.3.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
|
|
* @example
|
|
*
|
|
* _.isWeakMap(new WeakMap);
|
|
* // => true
|
|
*
|
|
* _.isWeakMap(new Map);
|
|
* // => false
|
|
*/
|
|
function isWeakMap(value) {
|
|
return isObjectLike(value) && getTag(value) == weakMapTag;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is classified as a `WeakSet` object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.3.0
|
|
* @category Lang
|
|
* @param {*} value The value to check.
|
|
* @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
|
|
* @example
|
|
*
|
|
* _.isWeakSet(new WeakSet);
|
|
* // => true
|
|
*
|
|
* _.isWeakSet(new Set);
|
|
* // => false
|
|
*/
|
|
function isWeakSet(value) {
|
|
return isObjectLike(value) && baseGetTag(value) == weakSetTag;
|
|
}
|
|
|
|
/**
|
|
* Checks if `value` is less than `other`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.9.0
|
|
* @category Lang
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @returns {boolean} Returns `true` if `value` is less than `other`,
|
|
* else `false`.
|
|
* @see _.gt
|
|
* @example
|
|
*
|
|
* _.lt(1, 3);
|
|
* // => true
|
|
*
|
|
* _.lt(3, 3);
|
|
* // => false
|
|
*
|
|
* _.lt(3, 1);
|
|
* // => false
|
|
*/
|
|
var lt = createRelationalOperation(baseLt);
|
|
|
|
/**
|
|
* Checks if `value` is less than or equal to `other`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.9.0
|
|
* @category Lang
|
|
* @param {*} value The value to compare.
|
|
* @param {*} other The other value to compare.
|
|
* @returns {boolean} Returns `true` if `value` is less than or equal to
|
|
* `other`, else `false`.
|
|
* @see _.gte
|
|
* @example
|
|
*
|
|
* _.lte(1, 3);
|
|
* // => true
|
|
*
|
|
* _.lte(3, 3);
|
|
* // => true
|
|
*
|
|
* _.lte(3, 1);
|
|
* // => false
|
|
*/
|
|
var lte = createRelationalOperation(function(value, other) {
|
|
return value <= other;
|
|
});
|
|
|
|
/**
|
|
* Converts `value` to an array.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {Array} Returns the converted array.
|
|
* @example
|
|
*
|
|
* _.toArray({ 'a': 1, 'b': 2 });
|
|
* // => [1, 2]
|
|
*
|
|
* _.toArray('abc');
|
|
* // => ['a', 'b', 'c']
|
|
*
|
|
* _.toArray(1);
|
|
* // => []
|
|
*
|
|
* _.toArray(null);
|
|
* // => []
|
|
*/
|
|
function toArray(value) {
|
|
if (!value) {
|
|
return [];
|
|
}
|
|
if (isArrayLike(value)) {
|
|
return isString(value) ? stringToArray(value) : copyArray(value);
|
|
}
|
|
if (symIterator && value[symIterator]) {
|
|
return iteratorToArray(value[symIterator]());
|
|
}
|
|
var tag = getTag(value),
|
|
func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
|
|
|
|
return func(value);
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a finite number.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.12.0
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {number} Returns the converted number.
|
|
* @example
|
|
*
|
|
* _.toFinite(3.2);
|
|
* // => 3.2
|
|
*
|
|
* _.toFinite(Number.MIN_VALUE);
|
|
* // => 5e-324
|
|
*
|
|
* _.toFinite(Infinity);
|
|
* // => 1.7976931348623157e+308
|
|
*
|
|
* _.toFinite('3.2');
|
|
* // => 3.2
|
|
*/
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = (value < 0 ? -1 : 1);
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to an integer.
|
|
*
|
|
* **Note:** This method is loosely based on
|
|
* [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {number} Returns the converted integer.
|
|
* @example
|
|
*
|
|
* _.toInteger(3.2);
|
|
* // => 3
|
|
*
|
|
* _.toInteger(Number.MIN_VALUE);
|
|
* // => 0
|
|
*
|
|
* _.toInteger(Infinity);
|
|
* // => 1.7976931348623157e+308
|
|
*
|
|
* _.toInteger('3.2');
|
|
* // => 3
|
|
*/
|
|
function toInteger(value) {
|
|
var result = toFinite(value),
|
|
remainder = result % 1;
|
|
|
|
return result === result ? (remainder ? result - remainder : result) : 0;
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to an integer suitable for use as the length of an
|
|
* array-like object.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {number} Returns the converted integer.
|
|
* @example
|
|
*
|
|
* _.toLength(3.2);
|
|
* // => 3
|
|
*
|
|
* _.toLength(Number.MIN_VALUE);
|
|
* // => 0
|
|
*
|
|
* _.toLength(Infinity);
|
|
* // => 4294967295
|
|
*
|
|
* _.toLength('3.2');
|
|
* // => 3
|
|
*/
|
|
function toLength(value) {
|
|
return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a number.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to process.
|
|
* @returns {number} Returns the number.
|
|
* @example
|
|
*
|
|
* _.toNumber(3.2);
|
|
* // => 3.2
|
|
*
|
|
* _.toNumber(Number.MIN_VALUE);
|
|
* // => 5e-324
|
|
*
|
|
* _.toNumber(Infinity);
|
|
* // => Infinity
|
|
*
|
|
* _.toNumber('3.2');
|
|
* // => 3.2
|
|
*/
|
|
function toNumber(value) {
|
|
if (typeof value == 'number') {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
|
|
value = isObject(other) ? (other + '') : other;
|
|
}
|
|
if (typeof value != 'string') {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = baseTrim(value);
|
|
var isBinary = reIsBinary.test(value);
|
|
return (isBinary || reIsOctal.test(value))
|
|
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
|
|
: (reIsBadHex.test(value) ? NAN : +value);
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a plain object flattening inherited enumerable string
|
|
* keyed properties of `value` to own properties of the plain object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {Object} Returns the converted plain object.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.assign({ 'a': 1 }, new Foo);
|
|
* // => { 'a': 1, 'b': 2 }
|
|
*
|
|
* _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
|
|
* // => { 'a': 1, 'b': 2, 'c': 3 }
|
|
*/
|
|
function toPlainObject(value) {
|
|
return copyObject(value, keysIn(value));
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a safe integer. A safe integer can be compared and
|
|
* represented correctly.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {number} Returns the converted integer.
|
|
* @example
|
|
*
|
|
* _.toSafeInteger(3.2);
|
|
* // => 3
|
|
*
|
|
* _.toSafeInteger(Number.MIN_VALUE);
|
|
* // => 0
|
|
*
|
|
* _.toSafeInteger(Infinity);
|
|
* // => 9007199254740991
|
|
*
|
|
* _.toSafeInteger('3.2');
|
|
* // => 3
|
|
*/
|
|
function toSafeInteger(value) {
|
|
return value
|
|
? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
|
|
: (value === 0 ? value : 0);
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a string. An empty string is returned for `null`
|
|
* and `undefined` values. The sign of `-0` is preserved.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Lang
|
|
* @param {*} value The value to convert.
|
|
* @returns {string} Returns the converted string.
|
|
* @example
|
|
*
|
|
* _.toString(null);
|
|
* // => ''
|
|
*
|
|
* _.toString(-0);
|
|
* // => '-0'
|
|
*
|
|
* _.toString([1, 2, 3]);
|
|
* // => '1,2,3'
|
|
*/
|
|
function toString(value) {
|
|
return value == null ? '' : baseToString(value);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Assigns own enumerable string keyed properties of source objects to the
|
|
* destination object. Source objects are applied from left to right.
|
|
* Subsequent sources overwrite property assignments of previous sources.
|
|
*
|
|
* **Note:** This method mutates `object` and is loosely based on
|
|
* [`Object.assign`](https://mdn.io/Object/assign).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.10.0
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} [sources] The source objects.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.assignIn
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* }
|
|
*
|
|
* function Bar() {
|
|
* this.c = 3;
|
|
* }
|
|
*
|
|
* Foo.prototype.b = 2;
|
|
* Bar.prototype.d = 4;
|
|
*
|
|
* _.assign({ 'a': 0 }, new Foo, new Bar);
|
|
* // => { 'a': 1, 'c': 3 }
|
|
*/
|
|
var assign = createAssigner(function(object, source) {
|
|
if (isPrototype(source) || isArrayLike(source)) {
|
|
copyObject(source, keys(source), object);
|
|
return;
|
|
}
|
|
for (var key in source) {
|
|
if (hasOwnProperty.call(source, key)) {
|
|
assignValue(object, key, source[key]);
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.assign` except that it iterates over own and
|
|
* inherited source properties.
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @alias extend
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} [sources] The source objects.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.assign
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* }
|
|
*
|
|
* function Bar() {
|
|
* this.c = 3;
|
|
* }
|
|
*
|
|
* Foo.prototype.b = 2;
|
|
* Bar.prototype.d = 4;
|
|
*
|
|
* _.assignIn({ 'a': 0 }, new Foo, new Bar);
|
|
* // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
|
|
*/
|
|
var assignIn = createAssigner(function(object, source) {
|
|
copyObject(source, keysIn(source), object);
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.assignIn` except that it accepts `customizer`
|
|
* which is invoked to produce the assigned values. If `customizer` returns
|
|
* `undefined`, assignment is handled by the method instead. The `customizer`
|
|
* is invoked with five arguments: (objValue, srcValue, key, object, source).
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @alias extendWith
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} sources The source objects.
|
|
* @param {Function} [customizer] The function to customize assigned values.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.assignWith
|
|
* @example
|
|
*
|
|
* function customizer(objValue, srcValue) {
|
|
* return _.isUndefined(objValue) ? srcValue : objValue;
|
|
* }
|
|
*
|
|
* var defaults = _.partialRight(_.assignInWith, customizer);
|
|
*
|
|
* defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
|
|
* // => { 'a': 1, 'b': 2 }
|
|
*/
|
|
var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
|
|
copyObject(source, keysIn(source), object, customizer);
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.assign` except that it accepts `customizer`
|
|
* which is invoked to produce the assigned values. If `customizer` returns
|
|
* `undefined`, assignment is handled by the method instead. The `customizer`
|
|
* is invoked with five arguments: (objValue, srcValue, key, object, source).
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} sources The source objects.
|
|
* @param {Function} [customizer] The function to customize assigned values.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.assignInWith
|
|
* @example
|
|
*
|
|
* function customizer(objValue, srcValue) {
|
|
* return _.isUndefined(objValue) ? srcValue : objValue;
|
|
* }
|
|
*
|
|
* var defaults = _.partialRight(_.assignWith, customizer);
|
|
*
|
|
* defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
|
|
* // => { 'a': 1, 'b': 2 }
|
|
*/
|
|
var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
|
|
copyObject(source, keys(source), object, customizer);
|
|
});
|
|
|
|
/**
|
|
* Creates an array of values corresponding to `paths` of `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {...(string|string[])} [paths] The property paths to pick.
|
|
* @returns {Array} Returns the picked values.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
|
|
*
|
|
* _.at(object, ['a[0].b.c', 'a[1]']);
|
|
* // => [3, 4]
|
|
*/
|
|
var at = flatRest(baseAt);
|
|
|
|
/**
|
|
* Creates an object that inherits from the `prototype` object. If a
|
|
* `properties` object is given, its own enumerable string keyed properties
|
|
* are assigned to the created object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.3.0
|
|
* @category Object
|
|
* @param {Object} prototype The object to inherit from.
|
|
* @param {Object} [properties] The properties to assign to the object.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* function Shape() {
|
|
* this.x = 0;
|
|
* this.y = 0;
|
|
* }
|
|
*
|
|
* function Circle() {
|
|
* Shape.call(this);
|
|
* }
|
|
*
|
|
* Circle.prototype = _.create(Shape.prototype, {
|
|
* 'constructor': Circle
|
|
* });
|
|
*
|
|
* var circle = new Circle;
|
|
* circle instanceof Circle;
|
|
* // => true
|
|
*
|
|
* circle instanceof Shape;
|
|
* // => true
|
|
*/
|
|
function create(prototype, properties) {
|
|
var result = baseCreate(prototype);
|
|
return properties == null ? result : baseAssign(result, properties);
|
|
}
|
|
|
|
/**
|
|
* Assigns own and inherited enumerable string keyed properties of source
|
|
* objects to the destination object for all destination properties that
|
|
* resolve to `undefined`. Source objects are applied from left to right.
|
|
* Once a property is set, additional values of the same property are ignored.
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} [sources] The source objects.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.defaultsDeep
|
|
* @example
|
|
*
|
|
* _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
|
|
* // => { 'a': 1, 'b': 2 }
|
|
*/
|
|
var defaults = baseRest(function(object, sources) {
|
|
object = Object(object);
|
|
|
|
var index = -1;
|
|
var length = sources.length;
|
|
var guard = length > 2 ? sources[2] : undefined;
|
|
|
|
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
|
|
length = 1;
|
|
}
|
|
|
|
while (++index < length) {
|
|
var source = sources[index];
|
|
var props = keysIn(source);
|
|
var propsIndex = -1;
|
|
var propsLength = props.length;
|
|
|
|
while (++propsIndex < propsLength) {
|
|
var key = props[propsIndex];
|
|
var value = object[key];
|
|
|
|
if (value === undefined ||
|
|
(eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
|
|
object[key] = source[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return object;
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.defaults` except that it recursively assigns
|
|
* default properties.
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.10.0
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} [sources] The source objects.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.defaults
|
|
* @example
|
|
*
|
|
* _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
|
|
* // => { 'a': { 'b': 2, 'c': 3 } }
|
|
*/
|
|
var defaultsDeep = baseRest(function(args) {
|
|
args.push(undefined, customDefaultsMerge);
|
|
return apply(mergeWith, undefined, args);
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.find` except that it returns the key of the first
|
|
* element `predicate` returns truthy for instead of the element itself.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.1.0
|
|
* @category Object
|
|
* @param {Object} object The object to inspect.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {string|undefined} Returns the key of the matched element,
|
|
* else `undefined`.
|
|
* @example
|
|
*
|
|
* var users = {
|
|
* 'barney': { 'age': 36, 'active': true },
|
|
* 'fred': { 'age': 40, 'active': false },
|
|
* 'pebbles': { 'age': 1, 'active': true }
|
|
* };
|
|
*
|
|
* _.findKey(users, function(o) { return o.age < 40; });
|
|
* // => 'barney' (iteration order is not guaranteed)
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.findKey(users, { 'age': 1, 'active': true });
|
|
* // => 'pebbles'
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.findKey(users, ['active', false]);
|
|
* // => 'fred'
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.findKey(users, 'active');
|
|
* // => 'barney'
|
|
*/
|
|
function findKey(object, predicate) {
|
|
return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.findKey` except that it iterates over elements of
|
|
* a collection in the opposite order.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to inspect.
|
|
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
|
* @returns {string|undefined} Returns the key of the matched element,
|
|
* else `undefined`.
|
|
* @example
|
|
*
|
|
* var users = {
|
|
* 'barney': { 'age': 36, 'active': true },
|
|
* 'fred': { 'age': 40, 'active': false },
|
|
* 'pebbles': { 'age': 1, 'active': true }
|
|
* };
|
|
*
|
|
* _.findLastKey(users, function(o) { return o.age < 40; });
|
|
* // => returns 'pebbles' assuming `_.findKey` returns 'barney'
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.findLastKey(users, { 'age': 36, 'active': true });
|
|
* // => 'barney'
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.findLastKey(users, ['active', false]);
|
|
* // => 'fred'
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.findLastKey(users, 'active');
|
|
* // => 'pebbles'
|
|
*/
|
|
function findLastKey(object, predicate) {
|
|
return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
|
|
}
|
|
|
|
/**
|
|
* Iterates over own and inherited enumerable string keyed properties of an
|
|
* object and invokes `iteratee` for each property. The iteratee is invoked
|
|
* with three arguments: (value, key, object). Iteratee functions may exit
|
|
* iteration early by explicitly returning `false`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.3.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.forInRight
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.forIn(new Foo, function(value, key) {
|
|
* console.log(key);
|
|
* });
|
|
* // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
|
|
*/
|
|
function forIn(object, iteratee) {
|
|
return object == null
|
|
? object
|
|
: baseFor(object, getIteratee(iteratee, 3), keysIn);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.forIn` except that it iterates over properties of
|
|
* `object` in the opposite order.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.forIn
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.forInRight(new Foo, function(value, key) {
|
|
* console.log(key);
|
|
* });
|
|
* // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
|
|
*/
|
|
function forInRight(object, iteratee) {
|
|
return object == null
|
|
? object
|
|
: baseForRight(object, getIteratee(iteratee, 3), keysIn);
|
|
}
|
|
|
|
/**
|
|
* Iterates over own enumerable string keyed properties of an object and
|
|
* invokes `iteratee` for each property. The iteratee is invoked with three
|
|
* arguments: (value, key, object). Iteratee functions may exit iteration
|
|
* early by explicitly returning `false`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.3.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.forOwnRight
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.forOwn(new Foo, function(value, key) {
|
|
* console.log(key);
|
|
* });
|
|
* // => Logs 'a' then 'b' (iteration order is not guaranteed).
|
|
*/
|
|
function forOwn(object, iteratee) {
|
|
return object && baseForOwn(object, getIteratee(iteratee, 3));
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.forOwn` except that it iterates over properties of
|
|
* `object` in the opposite order.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Object} Returns `object`.
|
|
* @see _.forOwn
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.forOwnRight(new Foo, function(value, key) {
|
|
* console.log(key);
|
|
* });
|
|
* // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
|
|
*/
|
|
function forOwnRight(object, iteratee) {
|
|
return object && baseForOwnRight(object, getIteratee(iteratee, 3));
|
|
}
|
|
|
|
/**
|
|
* Creates an array of function property names from own enumerable properties
|
|
* of `object`.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The object to inspect.
|
|
* @returns {Array} Returns the function names.
|
|
* @see _.functionsIn
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = _.constant('a');
|
|
* this.b = _.constant('b');
|
|
* }
|
|
*
|
|
* Foo.prototype.c = _.constant('c');
|
|
*
|
|
* _.functions(new Foo);
|
|
* // => ['a', 'b']
|
|
*/
|
|
function functions(object) {
|
|
return object == null ? [] : baseFunctions(object, keys(object));
|
|
}
|
|
|
|
/**
|
|
* Creates an array of function property names from own and inherited
|
|
* enumerable properties of `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to inspect.
|
|
* @returns {Array} Returns the function names.
|
|
* @see _.functions
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = _.constant('a');
|
|
* this.b = _.constant('b');
|
|
* }
|
|
*
|
|
* Foo.prototype.c = _.constant('c');
|
|
*
|
|
* _.functionsIn(new Foo);
|
|
* // => ['a', 'b', 'c']
|
|
*/
|
|
function functionsIn(object) {
|
|
return object == null ? [] : baseFunctions(object, keysIn(object));
|
|
}
|
|
|
|
/**
|
|
* Gets the value at `path` of `object`. If the resolved value is
|
|
* `undefined`, the `defaultValue` is returned in its place.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.7.0
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @param {Array|string} path The path of the property to get.
|
|
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
|
|
* @returns {*} Returns the resolved value.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
|
*
|
|
* _.get(object, 'a[0].b.c');
|
|
* // => 3
|
|
*
|
|
* _.get(object, ['a', '0', 'b', 'c']);
|
|
* // => 3
|
|
*
|
|
* _.get(object, 'a.b.c', 'default');
|
|
* // => 'default'
|
|
*/
|
|
function get(object, path, defaultValue) {
|
|
var result = object == null ? undefined : baseGet(object, path);
|
|
return result === undefined ? defaultValue : result;
|
|
}
|
|
|
|
/**
|
|
* Checks if `path` is a direct property of `object`.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @param {Array|string} path The path to check.
|
|
* @returns {boolean} Returns `true` if `path` exists, else `false`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': { 'b': 2 } };
|
|
* var other = _.create({ 'a': _.create({ 'b': 2 }) });
|
|
*
|
|
* _.has(object, 'a');
|
|
* // => true
|
|
*
|
|
* _.has(object, 'a.b');
|
|
* // => true
|
|
*
|
|
* _.has(object, ['a', 'b']);
|
|
* // => true
|
|
*
|
|
* _.has(other, 'a');
|
|
* // => false
|
|
*/
|
|
function has(object, path) {
|
|
return object != null && hasPath(object, path, baseHas);
|
|
}
|
|
|
|
/**
|
|
* Checks if `path` is a direct or inherited property of `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @param {Array|string} path The path to check.
|
|
* @returns {boolean} Returns `true` if `path` exists, else `false`.
|
|
* @example
|
|
*
|
|
* var object = _.create({ 'a': _.create({ 'b': 2 }) });
|
|
*
|
|
* _.hasIn(object, 'a');
|
|
* // => true
|
|
*
|
|
* _.hasIn(object, 'a.b');
|
|
* // => true
|
|
*
|
|
* _.hasIn(object, ['a', 'b']);
|
|
* // => true
|
|
*
|
|
* _.hasIn(object, 'b');
|
|
* // => false
|
|
*/
|
|
function hasIn(object, path) {
|
|
return object != null && hasPath(object, path, baseHasIn);
|
|
}
|
|
|
|
/**
|
|
* Creates an object composed of the inverted keys and values of `object`.
|
|
* If `object` contains duplicate values, subsequent values overwrite
|
|
* property assignments of previous values.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.7.0
|
|
* @category Object
|
|
* @param {Object} object The object to invert.
|
|
* @returns {Object} Returns the new inverted object.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': 2, 'c': 1 };
|
|
*
|
|
* _.invert(object);
|
|
* // => { '1': 'c', '2': 'b' }
|
|
*/
|
|
var invert = createInverter(function(result, value, key) {
|
|
if (value != null &&
|
|
typeof value.toString != 'function') {
|
|
value = nativeObjectToString.call(value);
|
|
}
|
|
|
|
result[value] = key;
|
|
}, constant(identity));
|
|
|
|
/**
|
|
* This method is like `_.invert` except that the inverted object is generated
|
|
* from the results of running each element of `object` thru `iteratee`. The
|
|
* corresponding inverted value of each inverted key is an array of keys
|
|
* responsible for generating the inverted value. The iteratee is invoked
|
|
* with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.1.0
|
|
* @category Object
|
|
* @param {Object} object The object to invert.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {Object} Returns the new inverted object.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': 2, 'c': 1 };
|
|
*
|
|
* _.invertBy(object);
|
|
* // => { '1': ['a', 'c'], '2': ['b'] }
|
|
*
|
|
* _.invertBy(object, function(value) {
|
|
* return 'group' + value;
|
|
* });
|
|
* // => { 'group1': ['a', 'c'], 'group2': ['b'] }
|
|
*/
|
|
var invertBy = createInverter(function(result, value, key) {
|
|
if (value != null &&
|
|
typeof value.toString != 'function') {
|
|
value = nativeObjectToString.call(value);
|
|
}
|
|
|
|
if (hasOwnProperty.call(result, value)) {
|
|
result[value].push(key);
|
|
} else {
|
|
result[value] = [key];
|
|
}
|
|
}, getIteratee);
|
|
|
|
/**
|
|
* Invokes the method at `path` of `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @param {Array|string} path The path of the method to invoke.
|
|
* @param {...*} [args] The arguments to invoke the method with.
|
|
* @returns {*} Returns the result of the invoked method.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
|
|
*
|
|
* _.invoke(object, 'a[0].b.c.slice', 1, 3);
|
|
* // => [2, 3]
|
|
*/
|
|
var invoke = baseRest(baseInvoke);
|
|
|
|
/**
|
|
* Creates an array of the own enumerable property names of `object`.
|
|
*
|
|
* **Note:** Non-object values are coerced to objects. See the
|
|
* [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
|
|
* for more details.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.keys(new Foo);
|
|
* // => ['a', 'b'] (iteration order is not guaranteed)
|
|
*
|
|
* _.keys('hi');
|
|
* // => ['0', '1']
|
|
*/
|
|
function keys(object) {
|
|
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
|
|
}
|
|
|
|
/**
|
|
* Creates an array of the own and inherited enumerable property names of `object`.
|
|
*
|
|
* **Note:** Non-object values are coerced to objects.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property names.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.keysIn(new Foo);
|
|
* // => ['a', 'b', 'c'] (iteration order is not guaranteed)
|
|
*/
|
|
function keysIn(object) {
|
|
return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
|
|
}
|
|
|
|
/**
|
|
* The opposite of `_.mapValues`; this method creates an object with the
|
|
* same values as `object` and keys generated by running each own enumerable
|
|
* string keyed property of `object` thru `iteratee`. The iteratee is invoked
|
|
* with three arguments: (value, key, object).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.8.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Object} Returns the new mapped object.
|
|
* @see _.mapValues
|
|
* @example
|
|
*
|
|
* _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
|
|
* return key + value;
|
|
* });
|
|
* // => { 'a1': 1, 'b2': 2 }
|
|
*/
|
|
function mapKeys(object, iteratee) {
|
|
var result = {};
|
|
iteratee = getIteratee(iteratee, 3);
|
|
|
|
baseForOwn(object, function(value, key, object) {
|
|
baseAssignValue(result, iteratee(value, key, object), value);
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Creates an object with the same keys as `object` and values generated
|
|
* by running each own enumerable string keyed property of `object` thru
|
|
* `iteratee`. The iteratee is invoked with three arguments:
|
|
* (value, key, object).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.4.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Object} Returns the new mapped object.
|
|
* @see _.mapKeys
|
|
* @example
|
|
*
|
|
* var users = {
|
|
* 'fred': { 'user': 'fred', 'age': 40 },
|
|
* 'pebbles': { 'user': 'pebbles', 'age': 1 }
|
|
* };
|
|
*
|
|
* _.mapValues(users, function(o) { return o.age; });
|
|
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.mapValues(users, 'age');
|
|
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
|
|
*/
|
|
function mapValues(object, iteratee) {
|
|
var result = {};
|
|
iteratee = getIteratee(iteratee, 3);
|
|
|
|
baseForOwn(object, function(value, key, object) {
|
|
baseAssignValue(result, key, iteratee(value, key, object));
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.assign` except that it recursively merges own and
|
|
* inherited enumerable string keyed properties of source objects into the
|
|
* destination object. Source properties that resolve to `undefined` are
|
|
* skipped if a destination value exists. Array and plain object properties
|
|
* are merged recursively. Other objects and value types are overridden by
|
|
* assignment. Source objects are applied from left to right. Subsequent
|
|
* sources overwrite property assignments of previous sources.
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.5.0
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} [sources] The source objects.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* var object = {
|
|
* 'a': [{ 'b': 2 }, { 'd': 4 }]
|
|
* };
|
|
*
|
|
* var other = {
|
|
* 'a': [{ 'c': 3 }, { 'e': 5 }]
|
|
* };
|
|
*
|
|
* _.merge(object, other);
|
|
* // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
|
|
*/
|
|
var merge = createAssigner(function(object, source, srcIndex) {
|
|
baseMerge(object, source, srcIndex);
|
|
});
|
|
|
|
/**
|
|
* This method is like `_.merge` except that it accepts `customizer` which
|
|
* is invoked to produce the merged values of the destination and source
|
|
* properties. If `customizer` returns `undefined`, merging is handled by the
|
|
* method instead. The `customizer` is invoked with six arguments:
|
|
* (objValue, srcValue, key, object, source, stack).
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The destination object.
|
|
* @param {...Object} sources The source objects.
|
|
* @param {Function} customizer The function to customize assigned values.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* function customizer(objValue, srcValue) {
|
|
* if (_.isArray(objValue)) {
|
|
* return objValue.concat(srcValue);
|
|
* }
|
|
* }
|
|
*
|
|
* var object = { 'a': [1], 'b': [2] };
|
|
* var other = { 'a': [3], 'b': [4] };
|
|
*
|
|
* _.mergeWith(object, other, customizer);
|
|
* // => { 'a': [1, 3], 'b': [2, 4] }
|
|
*/
|
|
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
|
|
baseMerge(object, source, srcIndex, customizer);
|
|
});
|
|
|
|
/**
|
|
* The opposite of `_.pick`; this method creates an object composed of the
|
|
* own and inherited enumerable property paths of `object` that are not omitted.
|
|
*
|
|
* **Note:** This method is considerably slower than `_.pick`.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The source object.
|
|
* @param {...(string|string[])} [paths] The property paths to omit.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
|
*
|
|
* _.omit(object, ['a', 'c']);
|
|
* // => { 'b': '2' }
|
|
*/
|
|
var omit = flatRest(function(object, paths) {
|
|
var result = {};
|
|
if (object == null) {
|
|
return result;
|
|
}
|
|
var isDeep = false;
|
|
paths = arrayMap(paths, function(path) {
|
|
path = castPath(path, object);
|
|
isDeep || (isDeep = path.length > 1);
|
|
return path;
|
|
});
|
|
copyObject(object, getAllKeysIn(object), result);
|
|
if (isDeep) {
|
|
result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
|
|
}
|
|
var length = paths.length;
|
|
while (length--) {
|
|
baseUnset(result, paths[length]);
|
|
}
|
|
return result;
|
|
});
|
|
|
|
/**
|
|
* The opposite of `_.pickBy`; this method creates an object composed of
|
|
* the own and inherited enumerable string keyed properties of `object` that
|
|
* `predicate` doesn't return truthy for. The predicate is invoked with two
|
|
* arguments: (value, key).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The source object.
|
|
* @param {Function} [predicate=_.identity] The function invoked per property.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
|
*
|
|
* _.omitBy(object, _.isNumber);
|
|
* // => { 'b': '2' }
|
|
*/
|
|
function omitBy(object, predicate) {
|
|
return pickBy(object, negate(getIteratee(predicate)));
|
|
}
|
|
|
|
/**
|
|
* Creates an object composed of the picked `object` properties.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The source object.
|
|
* @param {...(string|string[])} [paths] The property paths to pick.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
|
*
|
|
* _.pick(object, ['a', 'c']);
|
|
* // => { 'a': 1, 'c': 3 }
|
|
*/
|
|
var pick = flatRest(function(object, paths) {
|
|
return object == null ? {} : basePick(object, paths);
|
|
});
|
|
|
|
/**
|
|
* Creates an object composed of the `object` properties `predicate` returns
|
|
* truthy for. The predicate is invoked with two arguments: (value, key).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The source object.
|
|
* @param {Function} [predicate=_.identity] The function invoked per property.
|
|
* @returns {Object} Returns the new object.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
|
*
|
|
* _.pickBy(object, _.isNumber);
|
|
* // => { 'a': 1, 'c': 3 }
|
|
*/
|
|
function pickBy(object, predicate) {
|
|
if (object == null) {
|
|
return {};
|
|
}
|
|
var props = arrayMap(getAllKeysIn(object), function(prop) {
|
|
return [prop];
|
|
});
|
|
predicate = getIteratee(predicate);
|
|
return basePickBy(object, props, function(value, path) {
|
|
return predicate(value, path[0]);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.get` except that if the resolved value is a
|
|
* function it's invoked with the `this` binding of its parent object and
|
|
* its result is returned.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @param {Array|string} path The path of the property to resolve.
|
|
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
|
|
* @returns {*} Returns the resolved value.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
|
|
*
|
|
* _.result(object, 'a[0].b.c1');
|
|
* // => 3
|
|
*
|
|
* _.result(object, 'a[0].b.c2');
|
|
* // => 4
|
|
*
|
|
* _.result(object, 'a[0].b.c3', 'default');
|
|
* // => 'default'
|
|
*
|
|
* _.result(object, 'a[0].b.c3', _.constant('default'));
|
|
* // => 'default'
|
|
*/
|
|
function result(object, path, defaultValue) {
|
|
path = castPath(path, object);
|
|
|
|
var index = -1,
|
|
length = path.length;
|
|
|
|
// Ensure the loop is entered when path is empty.
|
|
if (!length) {
|
|
length = 1;
|
|
object = undefined;
|
|
}
|
|
while (++index < length) {
|
|
var value = object == null ? undefined : object[toKey(path[index])];
|
|
if (value === undefined) {
|
|
index = length;
|
|
value = defaultValue;
|
|
}
|
|
object = isFunction(value) ? value.call(object) : value;
|
|
}
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
|
|
* it's created. Arrays are created for missing index properties while objects
|
|
* are created for all other missing properties. Use `_.setWith` to customize
|
|
* `path` creation.
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.7.0
|
|
* @category Object
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to set.
|
|
* @param {*} value The value to set.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
|
*
|
|
* _.set(object, 'a[0].b.c', 4);
|
|
* console.log(object.a[0].b.c);
|
|
* // => 4
|
|
*
|
|
* _.set(object, ['x', '0', 'y', 'z'], 5);
|
|
* console.log(object.x[0].y.z);
|
|
* // => 5
|
|
*/
|
|
function set(object, path, value) {
|
|
return object == null ? object : baseSet(object, path, value);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.set` except that it accepts `customizer` which is
|
|
* invoked to produce the objects of `path`. If `customizer` returns `undefined`
|
|
* path creation is handled by the method instead. The `customizer` is invoked
|
|
* with three arguments: (nsValue, key, nsObject).
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to set.
|
|
* @param {*} value The value to set.
|
|
* @param {Function} [customizer] The function to customize assigned values.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* var object = {};
|
|
*
|
|
* _.setWith(object, '[0][1]', 'a', Object);
|
|
* // => { '0': { '1': 'a' } }
|
|
*/
|
|
function setWith(object, path, value, customizer) {
|
|
customizer = typeof customizer == 'function' ? customizer : undefined;
|
|
return object == null ? object : baseSet(object, path, value, customizer);
|
|
}
|
|
|
|
/**
|
|
* Creates an array of own enumerable string keyed-value pairs for `object`
|
|
* which can be consumed by `_.fromPairs`. If `object` is a map or set, its
|
|
* entries are returned.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @alias entries
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the key-value pairs.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.toPairs(new Foo);
|
|
* // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
|
|
*/
|
|
var toPairs = createToPairs(keys);
|
|
|
|
/**
|
|
* Creates an array of own and inherited enumerable string keyed-value pairs
|
|
* for `object` which can be consumed by `_.fromPairs`. If `object` is a map
|
|
* or set, its entries are returned.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @alias entriesIn
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the key-value pairs.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.toPairsIn(new Foo);
|
|
* // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
|
|
*/
|
|
var toPairsIn = createToPairs(keysIn);
|
|
|
|
/**
|
|
* An alternative to `_.reduce`; this method transforms `object` to a new
|
|
* `accumulator` object which is the result of running each of its own
|
|
* enumerable string keyed properties thru `iteratee`, with each invocation
|
|
* potentially mutating the `accumulator` object. If `accumulator` is not
|
|
* provided, a new object with the same `[[Prototype]]` will be used. The
|
|
* iteratee is invoked with four arguments: (accumulator, value, key, object).
|
|
* Iteratee functions may exit iteration early by explicitly returning `false`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.3.0
|
|
* @category Object
|
|
* @param {Object} object The object to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @param {*} [accumulator] The custom accumulator value.
|
|
* @returns {*} Returns the accumulated value.
|
|
* @example
|
|
*
|
|
* _.transform([2, 3, 4], function(result, n) {
|
|
* result.push(n *= n);
|
|
* return n % 2 == 0;
|
|
* }, []);
|
|
* // => [4, 9]
|
|
*
|
|
* _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
|
|
* (result[value] || (result[value] = [])).push(key);
|
|
* }, {});
|
|
* // => { '1': ['a', 'c'], '2': ['b'] }
|
|
*/
|
|
function transform(object, iteratee, accumulator) {
|
|
var isArr = isArray(object),
|
|
isArrLike = isArr || isBuffer(object) || isTypedArray(object);
|
|
|
|
iteratee = getIteratee(iteratee, 4);
|
|
if (accumulator == null) {
|
|
var Ctor = object && object.constructor;
|
|
if (isArrLike) {
|
|
accumulator = isArr ? new Ctor : [];
|
|
}
|
|
else if (isObject(object)) {
|
|
accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
|
|
}
|
|
else {
|
|
accumulator = {};
|
|
}
|
|
}
|
|
(isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
|
|
return iteratee(accumulator, value, index, object);
|
|
});
|
|
return accumulator;
|
|
}
|
|
|
|
/**
|
|
* Removes the property at `path` of `object`.
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to unset.
|
|
* @returns {boolean} Returns `true` if the property is deleted, else `false`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': 7 } }] };
|
|
* _.unset(object, 'a[0].b.c');
|
|
* // => true
|
|
*
|
|
* console.log(object);
|
|
* // => { 'a': [{ 'b': {} }] };
|
|
*
|
|
* _.unset(object, ['a', '0', 'b', 'c']);
|
|
* // => true
|
|
*
|
|
* console.log(object);
|
|
* // => { 'a': [{ 'b': {} }] };
|
|
*/
|
|
function unset(object, path) {
|
|
return object == null ? true : baseUnset(object, path);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.set` except that accepts `updater` to produce the
|
|
* value to set. Use `_.updateWith` to customize `path` creation. The `updater`
|
|
* is invoked with one argument: (value).
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.6.0
|
|
* @category Object
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to set.
|
|
* @param {Function} updater The function to produce the updated value.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
|
*
|
|
* _.update(object, 'a[0].b.c', function(n) { return n * n; });
|
|
* console.log(object.a[0].b.c);
|
|
* // => 9
|
|
*
|
|
* _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
|
|
* console.log(object.x[0].y.z);
|
|
* // => 0
|
|
*/
|
|
function update(object, path, updater) {
|
|
return object == null ? object : baseUpdate(object, path, castFunction(updater));
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.update` except that it accepts `customizer` which is
|
|
* invoked to produce the objects of `path`. If `customizer` returns `undefined`
|
|
* path creation is handled by the method instead. The `customizer` is invoked
|
|
* with three arguments: (nsValue, key, nsObject).
|
|
*
|
|
* **Note:** This method mutates `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.6.0
|
|
* @category Object
|
|
* @param {Object} object The object to modify.
|
|
* @param {Array|string} path The path of the property to set.
|
|
* @param {Function} updater The function to produce the updated value.
|
|
* @param {Function} [customizer] The function to customize assigned values.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* var object = {};
|
|
*
|
|
* _.updateWith(object, '[0][1]', _.constant('a'), Object);
|
|
* // => { '0': { '1': 'a' } }
|
|
*/
|
|
function updateWith(object, path, updater, customizer) {
|
|
customizer = typeof customizer == 'function' ? customizer : undefined;
|
|
return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
|
|
}
|
|
|
|
/**
|
|
* Creates an array of the own enumerable string keyed property values of `object`.
|
|
*
|
|
* **Note:** Non-object values are coerced to objects.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property values.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.values(new Foo);
|
|
* // => [1, 2] (iteration order is not guaranteed)
|
|
*
|
|
* _.values('hi');
|
|
* // => ['h', 'i']
|
|
*/
|
|
function values(object) {
|
|
return object == null ? [] : baseValues(object, keys(object));
|
|
}
|
|
|
|
/**
|
|
* Creates an array of the own and inherited enumerable string keyed property
|
|
* values of `object`.
|
|
*
|
|
* **Note:** Non-object values are coerced to objects.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Object
|
|
* @param {Object} object The object to query.
|
|
* @returns {Array} Returns the array of property values.
|
|
* @example
|
|
*
|
|
* function Foo() {
|
|
* this.a = 1;
|
|
* this.b = 2;
|
|
* }
|
|
*
|
|
* Foo.prototype.c = 3;
|
|
*
|
|
* _.valuesIn(new Foo);
|
|
* // => [1, 2, 3] (iteration order is not guaranteed)
|
|
*/
|
|
function valuesIn(object) {
|
|
return object == null ? [] : baseValues(object, keysIn(object));
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Clamps `number` within the inclusive `lower` and `upper` bounds.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Number
|
|
* @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.
|
|
* @example
|
|
*
|
|
* _.clamp(-10, -5, 5);
|
|
* // => -5
|
|
*
|
|
* _.clamp(10, -5, 5);
|
|
* // => 5
|
|
*/
|
|
function clamp(number, lower, upper) {
|
|
if (upper === undefined) {
|
|
upper = lower;
|
|
lower = undefined;
|
|
}
|
|
if (upper !== undefined) {
|
|
upper = toNumber(upper);
|
|
upper = upper === upper ? upper : 0;
|
|
}
|
|
if (lower !== undefined) {
|
|
lower = toNumber(lower);
|
|
lower = lower === lower ? lower : 0;
|
|
}
|
|
return baseClamp(toNumber(number), lower, upper);
|
|
}
|
|
|
|
/**
|
|
* Checks if `n` is between `start` and up to, but not including, `end`. If
|
|
* `end` is not specified, it's set to `start` with `start` then set to `0`.
|
|
* If `start` is greater than `end` the params are swapped to support
|
|
* negative ranges.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.3.0
|
|
* @category Number
|
|
* @param {number} number The number to check.
|
|
* @param {number} [start=0] 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`.
|
|
* @see _.range, _.rangeRight
|
|
* @example
|
|
*
|
|
* _.inRange(3, 2, 4);
|
|
* // => true
|
|
*
|
|
* _.inRange(4, 8);
|
|
* // => true
|
|
*
|
|
* _.inRange(4, 2);
|
|
* // => false
|
|
*
|
|
* _.inRange(2, 2);
|
|
* // => false
|
|
*
|
|
* _.inRange(1.2, 2);
|
|
* // => true
|
|
*
|
|
* _.inRange(5.2, 4);
|
|
* // => false
|
|
*
|
|
* _.inRange(-3, -2, -6);
|
|
* // => true
|
|
*/
|
|
function inRange(number, start, end) {
|
|
start = toFinite(start);
|
|
if (end === undefined) {
|
|
end = start;
|
|
start = 0;
|
|
} else {
|
|
end = toFinite(end);
|
|
}
|
|
number = toNumber(number);
|
|
return baseInRange(number, start, end);
|
|
}
|
|
|
|
/**
|
|
* Produces a random number between the inclusive `lower` and `upper` bounds.
|
|
* If only one argument is provided a number between `0` and the given number
|
|
* is returned. If `floating` is `true`, or either `lower` or `upper` are
|
|
* floats, a floating-point number is returned instead of an integer.
|
|
*
|
|
* **Note:** JavaScript follows the IEEE-754 standard for resolving
|
|
* floating-point values which can produce unexpected results.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.7.0
|
|
* @category Number
|
|
* @param {number} [lower=0] The lower bound.
|
|
* @param {number} [upper=1] The upper bound.
|
|
* @param {boolean} [floating] Specify returning a floating-point number.
|
|
* @returns {number} Returns the random number.
|
|
* @example
|
|
*
|
|
* _.random(0, 5);
|
|
* // => an integer between 0 and 5
|
|
*
|
|
* _.random(5);
|
|
* // => also an integer between 0 and 5
|
|
*
|
|
* _.random(5, true);
|
|
* // => a floating-point number between 0 and 5
|
|
*
|
|
* _.random(1.2, 5.2);
|
|
* // => a floating-point number between 1.2 and 5.2
|
|
*/
|
|
function random(lower, upper, floating) {
|
|
if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
|
|
upper = floating = undefined;
|
|
}
|
|
if (floating === undefined) {
|
|
if (typeof upper == 'boolean') {
|
|
floating = upper;
|
|
upper = undefined;
|
|
}
|
|
else if (typeof lower == 'boolean') {
|
|
floating = lower;
|
|
lower = undefined;
|
|
}
|
|
}
|
|
if (lower === undefined && upper === undefined) {
|
|
lower = 0;
|
|
upper = 1;
|
|
}
|
|
else {
|
|
lower = toFinite(lower);
|
|
if (upper === undefined) {
|
|
upper = lower;
|
|
lower = 0;
|
|
} else {
|
|
upper = toFinite(upper);
|
|
}
|
|
}
|
|
if (lower > upper) {
|
|
var temp = lower;
|
|
lower = upper;
|
|
upper = temp;
|
|
}
|
|
if (floating || lower % 1 || upper % 1) {
|
|
var rand = nativeRandom();
|
|
return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
|
|
}
|
|
return baseRandom(lower, upper);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the camel cased string.
|
|
* @example
|
|
*
|
|
* _.camelCase('Foo Bar');
|
|
* // => 'fooBar'
|
|
*
|
|
* _.camelCase('--foo-bar--');
|
|
* // => 'fooBar'
|
|
*
|
|
* _.camelCase('__FOO_BAR__');
|
|
* // => 'fooBar'
|
|
*/
|
|
var camelCase = createCompounder(function(result, word, index) {
|
|
word = word.toLowerCase();
|
|
return result + (index ? capitalize(word) : word);
|
|
});
|
|
|
|
/**
|
|
* Converts the first character of `string` to upper case and the remaining
|
|
* to lower case.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to capitalize.
|
|
* @returns {string} Returns the capitalized string.
|
|
* @example
|
|
*
|
|
* _.capitalize('FRED');
|
|
* // => 'Fred'
|
|
*/
|
|
function capitalize(string) {
|
|
return upperFirst(toString(string).toLowerCase());
|
|
}
|
|
|
|
/**
|
|
* Deburrs `string` by converting
|
|
* [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
|
|
* and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
|
|
* letters to basic Latin letters and removing
|
|
* [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to deburr.
|
|
* @returns {string} Returns the deburred string.
|
|
* @example
|
|
*
|
|
* _.deburr('déjà vu');
|
|
* // => 'deja vu'
|
|
*/
|
|
function deburr(string) {
|
|
string = toString(string);
|
|
return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
|
|
}
|
|
|
|
/**
|
|
* Checks if `string` ends with the given target string.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to inspect.
|
|
* @param {string} [target] The string to search for.
|
|
* @param {number} [position=string.length] The position to search up to.
|
|
* @returns {boolean} Returns `true` if `string` ends with `target`,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.endsWith('abc', 'c');
|
|
* // => true
|
|
*
|
|
* _.endsWith('abc', 'b');
|
|
* // => false
|
|
*
|
|
* _.endsWith('abc', 'b', 2);
|
|
* // => true
|
|
*/
|
|
function endsWith(string, target, position) {
|
|
string = toString(string);
|
|
target = baseToString(target);
|
|
|
|
var length = string.length;
|
|
position = position === undefined
|
|
? length
|
|
: baseClamp(toInteger(position), 0, length);
|
|
|
|
var end = position;
|
|
position -= target.length;
|
|
return position >= 0 && string.slice(position, end) == target;
|
|
}
|
|
|
|
/**
|
|
* Converts the characters "&", "<", ">", '"', and "'" in `string` to their
|
|
* corresponding HTML entities.
|
|
*
|
|
* **Note:** No other characters are escaped. To escape additional
|
|
* characters use a third-party library like [_he_](https://mths.be/he).
|
|
*
|
|
* Though the ">" character is escaped for symmetry, characters like
|
|
* ">" and "/" don't need escaping in HTML and have no special meaning
|
|
* unless they're part of a tag or unquoted attribute value. See
|
|
* [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
|
|
* (under "semi-related fun fact") for more details.
|
|
*
|
|
* When working with HTML you should always
|
|
* [quote attribute values](http://wonko.com/post/html-escaping) to reduce
|
|
* XSS vectors.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category String
|
|
* @param {string} [string=''] The string to escape.
|
|
* @returns {string} Returns the escaped string.
|
|
* @example
|
|
*
|
|
* _.escape('fred, barney, & pebbles');
|
|
* // => 'fred, barney, & pebbles'
|
|
*/
|
|
function escape(string) {
|
|
string = toString(string);
|
|
return (string && reHasUnescapedHtml.test(string))
|
|
? string.replace(reUnescapedHtml, escapeHtmlChar)
|
|
: string;
|
|
}
|
|
|
|
/**
|
|
* Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
|
|
* "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to escape.
|
|
* @returns {string} Returns the escaped string.
|
|
* @example
|
|
*
|
|
* _.escapeRegExp('[lodash](https://lodash.com/)');
|
|
* // => '\[lodash\]\(https://lodash\.com/\)'
|
|
*/
|
|
function escapeRegExp(string) {
|
|
string = toString(string);
|
|
return (string && reHasRegExpChar.test(string))
|
|
? string.replace(reRegExpChar, '\\$&')
|
|
: string;
|
|
}
|
|
|
|
/**
|
|
* Converts `string` to
|
|
* [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the kebab cased string.
|
|
* @example
|
|
*
|
|
* _.kebabCase('Foo Bar');
|
|
* // => 'foo-bar'
|
|
*
|
|
* _.kebabCase('fooBar');
|
|
* // => 'foo-bar'
|
|
*
|
|
* _.kebabCase('__FOO_BAR__');
|
|
* // => 'foo-bar'
|
|
*/
|
|
var kebabCase = createCompounder(function(result, word, index) {
|
|
return result + (index ? '-' : '') + word.toLowerCase();
|
|
});
|
|
|
|
/**
|
|
* Converts `string`, as space separated words, to lower case.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the lower cased string.
|
|
* @example
|
|
*
|
|
* _.lowerCase('--Foo-Bar--');
|
|
* // => 'foo bar'
|
|
*
|
|
* _.lowerCase('fooBar');
|
|
* // => 'foo bar'
|
|
*
|
|
* _.lowerCase('__FOO_BAR__');
|
|
* // => 'foo bar'
|
|
*/
|
|
var lowerCase = createCompounder(function(result, word, index) {
|
|
return result + (index ? ' ' : '') + word.toLowerCase();
|
|
});
|
|
|
|
/**
|
|
* Converts the first character of `string` to lower case.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the converted string.
|
|
* @example
|
|
*
|
|
* _.lowerFirst('Fred');
|
|
* // => 'fred'
|
|
*
|
|
* _.lowerFirst('FRED');
|
|
* // => 'fRED'
|
|
*/
|
|
var lowerFirst = createCaseFirst('toLowerCase');
|
|
|
|
/**
|
|
* Pads `string` on the left and right sides if it's shorter than `length`.
|
|
* Padding characters are truncated if they can't be evenly divided by `length`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to pad.
|
|
* @param {number} [length=0] The padding length.
|
|
* @param {string} [chars=' '] The string used as padding.
|
|
* @returns {string} Returns the padded string.
|
|
* @example
|
|
*
|
|
* _.pad('abc', 8);
|
|
* // => ' abc '
|
|
*
|
|
* _.pad('abc', 8, '_-');
|
|
* // => '_-abc_-_'
|
|
*
|
|
* _.pad('abc', 3);
|
|
* // => 'abc'
|
|
*/
|
|
function pad(string, length, chars) {
|
|
string = toString(string);
|
|
length = toInteger(length);
|
|
|
|
var strLength = length ? stringSize(string) : 0;
|
|
if (!length || strLength >= length) {
|
|
return string;
|
|
}
|
|
var mid = (length - strLength) / 2;
|
|
return (
|
|
createPadding(nativeFloor(mid), chars) +
|
|
string +
|
|
createPadding(nativeCeil(mid), chars)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Pads `string` on the right side if it's shorter than `length`. Padding
|
|
* characters are truncated if they exceed `length`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to pad.
|
|
* @param {number} [length=0] The padding length.
|
|
* @param {string} [chars=' '] The string used as padding.
|
|
* @returns {string} Returns the padded string.
|
|
* @example
|
|
*
|
|
* _.padEnd('abc', 6);
|
|
* // => 'abc '
|
|
*
|
|
* _.padEnd('abc', 6, '_-');
|
|
* // => 'abc_-_'
|
|
*
|
|
* _.padEnd('abc', 3);
|
|
* // => 'abc'
|
|
*/
|
|
function padEnd(string, length, chars) {
|
|
string = toString(string);
|
|
length = toInteger(length);
|
|
|
|
var strLength = length ? stringSize(string) : 0;
|
|
return (length && strLength < length)
|
|
? (string + createPadding(length - strLength, chars))
|
|
: string;
|
|
}
|
|
|
|
/**
|
|
* Pads `string` on the left side if it's shorter than `length`. Padding
|
|
* characters are truncated if they exceed `length`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to pad.
|
|
* @param {number} [length=0] The padding length.
|
|
* @param {string} [chars=' '] The string used as padding.
|
|
* @returns {string} Returns the padded string.
|
|
* @example
|
|
*
|
|
* _.padStart('abc', 6);
|
|
* // => ' abc'
|
|
*
|
|
* _.padStart('abc', 6, '_-');
|
|
* // => '_-_abc'
|
|
*
|
|
* _.padStart('abc', 3);
|
|
* // => 'abc'
|
|
*/
|
|
function padStart(string, length, chars) {
|
|
string = toString(string);
|
|
length = toInteger(length);
|
|
|
|
var strLength = length ? stringSize(string) : 0;
|
|
return (length && strLength < length)
|
|
? (createPadding(length - strLength, chars) + string)
|
|
: string;
|
|
}
|
|
|
|
/**
|
|
* Converts `string` to an integer of the specified radix. If `radix` is
|
|
* `undefined` or `0`, a `radix` of `10` is used unless `value` is a
|
|
* hexadecimal, in which case a `radix` of `16` is used.
|
|
*
|
|
* **Note:** This method aligns with the
|
|
* [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 1.1.0
|
|
* @category String
|
|
* @param {string} string The string to convert.
|
|
* @param {number} [radix=10] The radix to interpret `value` by.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {number} Returns the converted integer.
|
|
* @example
|
|
*
|
|
* _.parseInt('08');
|
|
* // => 8
|
|
*
|
|
* _.map(['6', '08', '10'], _.parseInt);
|
|
* // => [6, 8, 10]
|
|
*/
|
|
function parseInt(string, radix, guard) {
|
|
if (guard || radix == null) {
|
|
radix = 0;
|
|
} else if (radix) {
|
|
radix = +radix;
|
|
}
|
|
return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
|
|
}
|
|
|
|
/**
|
|
* Repeats the given string `n` times.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to repeat.
|
|
* @param {number} [n=1] The number of times to repeat the string.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {string} Returns the repeated string.
|
|
* @example
|
|
*
|
|
* _.repeat('*', 3);
|
|
* // => '***'
|
|
*
|
|
* _.repeat('abc', 2);
|
|
* // => 'abcabc'
|
|
*
|
|
* _.repeat('abc', 0);
|
|
* // => ''
|
|
*/
|
|
function repeat(string, n, guard) {
|
|
if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
|
|
n = 1;
|
|
} else {
|
|
n = toInteger(n);
|
|
}
|
|
return baseRepeat(toString(string), n);
|
|
}
|
|
|
|
/**
|
|
* Replaces matches for `pattern` in `string` with `replacement`.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`String#replace`](https://mdn.io/String/replace).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to modify.
|
|
* @param {RegExp|string} pattern The pattern to replace.
|
|
* @param {Function|string} replacement The match replacement.
|
|
* @returns {string} Returns the modified string.
|
|
* @example
|
|
*
|
|
* _.replace('Hi Fred', 'Fred', 'Barney');
|
|
* // => 'Hi Barney'
|
|
*/
|
|
function replace() {
|
|
var args = arguments,
|
|
string = toString(args[0]);
|
|
|
|
return args.length < 3 ? string : string.replace(args[1], args[2]);
|
|
}
|
|
|
|
/**
|
|
* Converts `string` to
|
|
* [snake case](https://en.wikipedia.org/wiki/Snake_case).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the snake cased string.
|
|
* @example
|
|
*
|
|
* _.snakeCase('Foo Bar');
|
|
* // => 'foo_bar'
|
|
*
|
|
* _.snakeCase('fooBar');
|
|
* // => 'foo_bar'
|
|
*
|
|
* _.snakeCase('--FOO-BAR--');
|
|
* // => 'foo_bar'
|
|
*/
|
|
var snakeCase = createCompounder(function(result, word, index) {
|
|
return result + (index ? '_' : '') + word.toLowerCase();
|
|
});
|
|
|
|
/**
|
|
* Splits `string` by `separator`.
|
|
*
|
|
* **Note:** This method is based on
|
|
* [`String#split`](https://mdn.io/String/split).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to split.
|
|
* @param {RegExp|string} separator The separator pattern to split by.
|
|
* @param {number} [limit] The length to truncate results to.
|
|
* @returns {Array} Returns the string segments.
|
|
* @example
|
|
*
|
|
* _.split('a-b-c', '-', 2);
|
|
* // => ['a', 'b']
|
|
*/
|
|
function split(string, separator, limit) {
|
|
if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
|
|
separator = limit = undefined;
|
|
}
|
|
limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
|
|
if (!limit) {
|
|
return [];
|
|
}
|
|
string = toString(string);
|
|
if (string && (
|
|
typeof separator == 'string' ||
|
|
(separator != null && !isRegExp(separator))
|
|
)) {
|
|
separator = baseToString(separator);
|
|
if (!separator && hasUnicode(string)) {
|
|
return castSlice(stringToArray(string), 0, limit);
|
|
}
|
|
}
|
|
return string.split(separator, limit);
|
|
}
|
|
|
|
/**
|
|
* Converts `string` to
|
|
* [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.1.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the start cased string.
|
|
* @example
|
|
*
|
|
* _.startCase('--foo-bar--');
|
|
* // => 'Foo Bar'
|
|
*
|
|
* _.startCase('fooBar');
|
|
* // => 'Foo Bar'
|
|
*
|
|
* _.startCase('__FOO_BAR__');
|
|
* // => 'FOO BAR'
|
|
*/
|
|
var startCase = createCompounder(function(result, word, index) {
|
|
return result + (index ? ' ' : '') + upperFirst(word);
|
|
});
|
|
|
|
/**
|
|
* Checks if `string` starts with the given target string.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to inspect.
|
|
* @param {string} [target] The string to search for.
|
|
* @param {number} [position=0] The position to search from.
|
|
* @returns {boolean} Returns `true` if `string` starts with `target`,
|
|
* else `false`.
|
|
* @example
|
|
*
|
|
* _.startsWith('abc', 'a');
|
|
* // => true
|
|
*
|
|
* _.startsWith('abc', 'b');
|
|
* // => false
|
|
*
|
|
* _.startsWith('abc', 'b', 1);
|
|
* // => true
|
|
*/
|
|
function startsWith(string, target, position) {
|
|
string = toString(string);
|
|
position = position == null
|
|
? 0
|
|
: baseClamp(toInteger(position), 0, string.length);
|
|
|
|
target = baseToString(target);
|
|
return string.slice(position, position + target.length) == target;
|
|
}
|
|
|
|
/**
|
|
* Creates a compiled template function that can interpolate data properties
|
|
* in "interpolate" delimiters, HTML-escape interpolated data properties in
|
|
* "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
|
|
* properties may be accessed as free variables in the template. If a setting
|
|
* object is given, it takes precedence over `_.templateSettings` values.
|
|
*
|
|
* **Note:** In the development build `_.template` utilizes
|
|
* [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
|
|
* for easier debugging.
|
|
*
|
|
* For more information on precompiling templates see
|
|
* [lodash's custom builds documentation](https://lodash.com/custom-builds).
|
|
*
|
|
* For more information on Chrome extension sandboxes see
|
|
* [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category String
|
|
* @param {string} [string=''] The template string.
|
|
* @param {Object} [options={}] The options object.
|
|
* @param {RegExp} [options.escape=_.templateSettings.escape]
|
|
* The HTML "escape" delimiter.
|
|
* @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
|
|
* The "evaluate" delimiter.
|
|
* @param {Object} [options.imports=_.templateSettings.imports]
|
|
* An object to import into the template as free variables.
|
|
* @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
|
|
* The "interpolate" delimiter.
|
|
* @param {string} [options.sourceURL='lodash.templateSources[n]']
|
|
* The sourceURL of the compiled template.
|
|
* @param {string} [options.variable='obj']
|
|
* The data object variable name.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Function} Returns the compiled template function.
|
|
* @example
|
|
*
|
|
* // Use the "interpolate" delimiter to create a compiled template.
|
|
* var compiled = _.template('hello <%= user %>!');
|
|
* compiled({ 'user': 'fred' });
|
|
* // => 'hello fred!'
|
|
*
|
|
* // Use the HTML "escape" delimiter to escape data property values.
|
|
* var compiled = _.template('<b><%- value %></b>');
|
|
* compiled({ 'value': '<script>' });
|
|
* // => '<b><script></b>'
|
|
*
|
|
* // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
|
|
* var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
|
|
* compiled({ 'users': ['fred', 'barney'] });
|
|
* // => '<li>fred</li><li>barney</li>'
|
|
*
|
|
* // Use the internal `print` function in "evaluate" delimiters.
|
|
* var compiled = _.template('<% print("hello " + user); %>!');
|
|
* compiled({ 'user': 'barney' });
|
|
* // => 'hello barney!'
|
|
*
|
|
* // Use the ES template literal delimiter as an "interpolate" delimiter.
|
|
* // Disable support by replacing the "interpolate" delimiter.
|
|
* var compiled = _.template('hello ${ user }!');
|
|
* compiled({ 'user': 'pebbles' });
|
|
* // => 'hello pebbles!'
|
|
*
|
|
* // Use backslashes to treat delimiters as plain text.
|
|
* var compiled = _.template('<%= "\\<%- value %\\>" %>');
|
|
* compiled({ 'value': 'ignored' });
|
|
* // => '<%- value %>'
|
|
*
|
|
* // Use the `imports` option to import `jQuery` as `jq`.
|
|
* var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
|
|
* var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
|
|
* compiled({ 'users': ['fred', 'barney'] });
|
|
* // => '<li>fred</li><li>barney</li>'
|
|
*
|
|
* // Use the `sourceURL` option to specify a custom sourceURL for the template.
|
|
* var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
|
|
* compiled(data);
|
|
* // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
|
|
*
|
|
* // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
|
|
* var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
|
|
* compiled.source;
|
|
* // => function(data) {
|
|
* // var __t, __p = '';
|
|
* // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
|
|
* // return __p;
|
|
* // }
|
|
*
|
|
* // Use custom template delimiters.
|
|
* _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
|
|
* var compiled = _.template('hello {{ user }}!');
|
|
* compiled({ 'user': 'mustache' });
|
|
* // => 'hello mustache!'
|
|
*
|
|
* // Use the `source` property to inline compiled templates for meaningful
|
|
* // line numbers in error messages and stack traces.
|
|
* fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
|
|
* var JST = {\
|
|
* "main": ' + _.template(mainText).source + '\
|
|
* };\
|
|
* ');
|
|
*/
|
|
function template(string, options, guard) {
|
|
// Based on John Resig's `tmpl` implementation
|
|
// (http://ejohn.org/blog/javascript-micro-templating/)
|
|
// and Laura Doktorova's doT.js (https://github.com/olado/doT).
|
|
var settings = lodash.templateSettings;
|
|
|
|
if (guard && isIterateeCall(string, options, guard)) {
|
|
options = undefined;
|
|
}
|
|
string = toString(string);
|
|
options = assignInWith({}, options, settings, customDefaultsAssignIn);
|
|
|
|
var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
|
|
importsKeys = keys(imports),
|
|
importsValues = baseValues(imports, importsKeys);
|
|
|
|
var isEscaping,
|
|
isEvaluating,
|
|
index = 0,
|
|
interpolate = options.interpolate || reNoMatch,
|
|
source = "__p += '";
|
|
|
|
// Compile the regexp to match each delimiter.
|
|
var reDelimiters = RegExp(
|
|
(options.escape || reNoMatch).source + '|' +
|
|
interpolate.source + '|' +
|
|
(interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
|
|
(options.evaluate || reNoMatch).source + '|$'
|
|
, 'g');
|
|
|
|
// Use a sourceURL for easier debugging.
|
|
// The sourceURL gets injected into the source that's eval-ed, so be careful
|
|
// to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
|
|
// and escape the comment, thus injecting code that gets evaled.
|
|
var sourceURL = '//# sourceURL=' +
|
|
(hasOwnProperty.call(options, 'sourceURL')
|
|
? (options.sourceURL + '').replace(/\s/g, ' ')
|
|
: ('lodash.templateSources[' + (++templateCounter) + ']')
|
|
) + '\n';
|
|
|
|
string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
|
|
interpolateValue || (interpolateValue = esTemplateValue);
|
|
|
|
// Escape characters that can't be included in string literals.
|
|
source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
|
|
|
|
// Replace delimiters with snippets.
|
|
if (escapeValue) {
|
|
isEscaping = true;
|
|
source += "' +\n__e(" + escapeValue + ") +\n'";
|
|
}
|
|
if (evaluateValue) {
|
|
isEvaluating = true;
|
|
source += "';\n" + evaluateValue + ";\n__p += '";
|
|
}
|
|
if (interpolateValue) {
|
|
source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
|
|
}
|
|
index = offset + match.length;
|
|
|
|
// The JS engine embedded in Adobe products needs `match` returned in
|
|
// order to produce the correct `offset` value.
|
|
return match;
|
|
});
|
|
|
|
source += "';\n";
|
|
|
|
// If `variable` is not specified wrap a with-statement around the generated
|
|
// code to add the data object to the top of the scope chain.
|
|
var variable = hasOwnProperty.call(options, 'variable') && options.variable;
|
|
if (!variable) {
|
|
source = 'with (obj) {\n' + source + '\n}\n';
|
|
}
|
|
// Throw an error if a forbidden character was found in `variable`, to prevent
|
|
// potential command injection attacks.
|
|
else if (reForbiddenIdentifierChars.test(variable)) {
|
|
throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
|
|
}
|
|
|
|
// Cleanup code by stripping empty strings.
|
|
source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
|
|
.replace(reEmptyStringMiddle, '$1')
|
|
.replace(reEmptyStringTrailing, '$1;');
|
|
|
|
// Frame code as the function body.
|
|
source = 'function(' + (variable || 'obj') + ') {\n' +
|
|
(variable
|
|
? ''
|
|
: 'obj || (obj = {});\n'
|
|
) +
|
|
"var __t, __p = ''" +
|
|
(isEscaping
|
|
? ', __e = _.escape'
|
|
: ''
|
|
) +
|
|
(isEvaluating
|
|
? ', __j = Array.prototype.join;\n' +
|
|
"function print() { __p += __j.call(arguments, '') }\n"
|
|
: ';\n'
|
|
) +
|
|
source +
|
|
'return __p\n}';
|
|
|
|
var result = attempt(function() {
|
|
return Function(importsKeys, sourceURL + 'return ' + source)
|
|
.apply(undefined, importsValues);
|
|
});
|
|
|
|
// Provide the compiled function's source by its `toString` method or
|
|
// the `source` property as a convenience for inlining compiled templates.
|
|
result.source = source;
|
|
if (isError(result)) {
|
|
throw result;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts `string`, as a whole, to lower case just like
|
|
* [String#toLowerCase](https://mdn.io/toLowerCase).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the lower cased string.
|
|
* @example
|
|
*
|
|
* _.toLower('--Foo-Bar--');
|
|
* // => '--foo-bar--'
|
|
*
|
|
* _.toLower('fooBar');
|
|
* // => 'foobar'
|
|
*
|
|
* _.toLower('__FOO_BAR__');
|
|
* // => '__foo_bar__'
|
|
*/
|
|
function toLower(value) {
|
|
return toString(value).toLowerCase();
|
|
}
|
|
|
|
/**
|
|
* Converts `string`, as a whole, to upper case just like
|
|
* [String#toUpperCase](https://mdn.io/toUpperCase).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the upper cased string.
|
|
* @example
|
|
*
|
|
* _.toUpper('--foo-bar--');
|
|
* // => '--FOO-BAR--'
|
|
*
|
|
* _.toUpper('fooBar');
|
|
* // => 'FOOBAR'
|
|
*
|
|
* _.toUpper('__foo_bar__');
|
|
* // => '__FOO_BAR__'
|
|
*/
|
|
function toUpper(value) {
|
|
return toString(value).toUpperCase();
|
|
}
|
|
|
|
/**
|
|
* Removes leading and trailing whitespace or specified characters from `string`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to trim.
|
|
* @param {string} [chars=whitespace] The characters to trim.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {string} Returns the trimmed string.
|
|
* @example
|
|
*
|
|
* _.trim(' abc ');
|
|
* // => 'abc'
|
|
*
|
|
* _.trim('-_-abc-_-', '_-');
|
|
* // => 'abc'
|
|
*
|
|
* _.map([' foo ', ' bar '], _.trim);
|
|
* // => ['foo', 'bar']
|
|
*/
|
|
function trim(string, chars, guard) {
|
|
string = toString(string);
|
|
if (string && (guard || chars === undefined)) {
|
|
return baseTrim(string);
|
|
}
|
|
if (!string || !(chars = baseToString(chars))) {
|
|
return string;
|
|
}
|
|
var strSymbols = stringToArray(string),
|
|
chrSymbols = stringToArray(chars),
|
|
start = charsStartIndex(strSymbols, chrSymbols),
|
|
end = charsEndIndex(strSymbols, chrSymbols) + 1;
|
|
|
|
return castSlice(strSymbols, start, end).join('');
|
|
}
|
|
|
|
/**
|
|
* Removes trailing whitespace or specified characters from `string`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to trim.
|
|
* @param {string} [chars=whitespace] The characters to trim.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {string} Returns the trimmed string.
|
|
* @example
|
|
*
|
|
* _.trimEnd(' abc ');
|
|
* // => ' abc'
|
|
*
|
|
* _.trimEnd('-_-abc-_-', '_-');
|
|
* // => '-_-abc'
|
|
*/
|
|
function trimEnd(string, chars, guard) {
|
|
string = toString(string);
|
|
if (string && (guard || chars === undefined)) {
|
|
return string.slice(0, trimmedEndIndex(string) + 1);
|
|
}
|
|
if (!string || !(chars = baseToString(chars))) {
|
|
return string;
|
|
}
|
|
var strSymbols = stringToArray(string),
|
|
end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
|
|
|
|
return castSlice(strSymbols, 0, end).join('');
|
|
}
|
|
|
|
/**
|
|
* Removes leading whitespace or specified characters from `string`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to trim.
|
|
* @param {string} [chars=whitespace] The characters to trim.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {string} Returns the trimmed string.
|
|
* @example
|
|
*
|
|
* _.trimStart(' abc ');
|
|
* // => 'abc '
|
|
*
|
|
* _.trimStart('-_-abc-_-', '_-');
|
|
* // => 'abc-_-'
|
|
*/
|
|
function trimStart(string, chars, guard) {
|
|
string = toString(string);
|
|
if (string && (guard || chars === undefined)) {
|
|
return string.replace(reTrimStart, '');
|
|
}
|
|
if (!string || !(chars = baseToString(chars))) {
|
|
return string;
|
|
}
|
|
var strSymbols = stringToArray(string),
|
|
start = charsStartIndex(strSymbols, stringToArray(chars));
|
|
|
|
return castSlice(strSymbols, start).join('');
|
|
}
|
|
|
|
/**
|
|
* Truncates `string` if it's longer than the given maximum string length.
|
|
* The last characters of the truncated string are replaced with the omission
|
|
* string which defaults to "...".
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to truncate.
|
|
* @param {Object} [options={}] The options object.
|
|
* @param {number} [options.length=30] The maximum string length.
|
|
* @param {string} [options.omission='...'] The string to indicate text is omitted.
|
|
* @param {RegExp|string} [options.separator] The separator pattern to truncate to.
|
|
* @returns {string} Returns the truncated string.
|
|
* @example
|
|
*
|
|
* _.truncate('hi-diddly-ho there, neighborino');
|
|
* // => 'hi-diddly-ho there, neighbo...'
|
|
*
|
|
* _.truncate('hi-diddly-ho there, neighborino', {
|
|
* 'length': 24,
|
|
* 'separator': ' '
|
|
* });
|
|
* // => 'hi-diddly-ho there,...'
|
|
*
|
|
* _.truncate('hi-diddly-ho there, neighborino', {
|
|
* 'length': 24,
|
|
* 'separator': /,? +/
|
|
* });
|
|
* // => 'hi-diddly-ho there...'
|
|
*
|
|
* _.truncate('hi-diddly-ho there, neighborino', {
|
|
* 'omission': ' [...]'
|
|
* });
|
|
* // => 'hi-diddly-ho there, neig [...]'
|
|
*/
|
|
function truncate(string, options) {
|
|
var length = DEFAULT_TRUNC_LENGTH,
|
|
omission = DEFAULT_TRUNC_OMISSION;
|
|
|
|
if (isObject(options)) {
|
|
var separator = 'separator' in options ? options.separator : separator;
|
|
length = 'length' in options ? toInteger(options.length) : length;
|
|
omission = 'omission' in options ? baseToString(options.omission) : omission;
|
|
}
|
|
string = toString(string);
|
|
|
|
var strLength = string.length;
|
|
if (hasUnicode(string)) {
|
|
var strSymbols = stringToArray(string);
|
|
strLength = strSymbols.length;
|
|
}
|
|
if (length >= strLength) {
|
|
return string;
|
|
}
|
|
var end = length - stringSize(omission);
|
|
if (end < 1) {
|
|
return omission;
|
|
}
|
|
var result = strSymbols
|
|
? castSlice(strSymbols, 0, end).join('')
|
|
: string.slice(0, end);
|
|
|
|
if (separator === undefined) {
|
|
return result + omission;
|
|
}
|
|
if (strSymbols) {
|
|
end += (result.length - end);
|
|
}
|
|
if (isRegExp(separator)) {
|
|
if (string.slice(end).search(separator)) {
|
|
var match,
|
|
substring = result;
|
|
|
|
if (!separator.global) {
|
|
separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
|
|
}
|
|
separator.lastIndex = 0;
|
|
while ((match = separator.exec(substring))) {
|
|
var newEnd = match.index;
|
|
}
|
|
result = result.slice(0, newEnd === undefined ? end : newEnd);
|
|
}
|
|
} else if (string.indexOf(baseToString(separator), end) != end) {
|
|
var index = result.lastIndexOf(separator);
|
|
if (index > -1) {
|
|
result = result.slice(0, index);
|
|
}
|
|
}
|
|
return result + omission;
|
|
}
|
|
|
|
/**
|
|
* The inverse of `_.escape`; this method converts the HTML entities
|
|
* `&`, `<`, `>`, `"`, and `'` in `string` to
|
|
* their corresponding characters.
|
|
*
|
|
* **Note:** No other HTML entities are unescaped. To unescape additional
|
|
* HTML entities use a third-party library like [_he_](https://mths.be/he).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 0.6.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to unescape.
|
|
* @returns {string} Returns the unescaped string.
|
|
* @example
|
|
*
|
|
* _.unescape('fred, barney, & pebbles');
|
|
* // => 'fred, barney, & pebbles'
|
|
*/
|
|
function unescape(string) {
|
|
string = toString(string);
|
|
return (string && reHasEscapedHtml.test(string))
|
|
? string.replace(reEscapedHtml, unescapeHtmlChar)
|
|
: string;
|
|
}
|
|
|
|
/**
|
|
* Converts `string`, as space separated words, to upper case.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the upper cased string.
|
|
* @example
|
|
*
|
|
* _.upperCase('--foo-bar');
|
|
* // => 'FOO BAR'
|
|
*
|
|
* _.upperCase('fooBar');
|
|
* // => 'FOO BAR'
|
|
*
|
|
* _.upperCase('__foo_bar__');
|
|
* // => 'FOO BAR'
|
|
*/
|
|
var upperCase = createCompounder(function(result, word, index) {
|
|
return result + (index ? ' ' : '') + word.toUpperCase();
|
|
});
|
|
|
|
/**
|
|
* Converts the first character of `string` to upper case.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to convert.
|
|
* @returns {string} Returns the converted string.
|
|
* @example
|
|
*
|
|
* _.upperFirst('fred');
|
|
* // => 'Fred'
|
|
*
|
|
* _.upperFirst('FRED');
|
|
* // => 'FRED'
|
|
*/
|
|
var upperFirst = createCaseFirst('toUpperCase');
|
|
|
|
/**
|
|
* Splits `string` into an array of its words.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category String
|
|
* @param {string} [string=''] The string to inspect.
|
|
* @param {RegExp|string} [pattern] The pattern to match words.
|
|
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
|
* @returns {Array} Returns the words of `string`.
|
|
* @example
|
|
*
|
|
* _.words('fred, barney, & pebbles');
|
|
* // => ['fred', 'barney', 'pebbles']
|
|
*
|
|
* _.words('fred, barney, & pebbles', /[^, ]+/g);
|
|
* // => ['fred', 'barney', '&', 'pebbles']
|
|
*/
|
|
function words(string, pattern, guard) {
|
|
string = toString(string);
|
|
pattern = guard ? undefined : pattern;
|
|
|
|
if (pattern === undefined) {
|
|
return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
|
|
}
|
|
return string.match(pattern) || [];
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Attempts to invoke `func`, returning either the result or the caught error
|
|
* object. Any additional arguments are provided to `func` when it's invoked.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Util
|
|
* @param {Function} func The function to attempt.
|
|
* @param {...*} [args] The arguments to invoke `func` with.
|
|
* @returns {*} Returns the `func` result or error object.
|
|
* @example
|
|
*
|
|
* // Avoid throwing errors for invalid selectors.
|
|
* var elements = _.attempt(function(selector) {
|
|
* return document.querySelectorAll(selector);
|
|
* }, '>_>');
|
|
*
|
|
* if (_.isError(elements)) {
|
|
* elements = [];
|
|
* }
|
|
*/
|
|
var attempt = baseRest(function(func, args) {
|
|
try {
|
|
return apply(func, undefined, args);
|
|
} catch (e) {
|
|
return isError(e) ? e : new Error(e);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Binds methods of an object to the object itself, overwriting the existing
|
|
* method.
|
|
*
|
|
* **Note:** This method doesn't set the "length" property of bound functions.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {Object} object The object to bind and assign the bound methods to.
|
|
* @param {...(string|string[])} methodNames The object method names to bind.
|
|
* @returns {Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* var view = {
|
|
* 'label': 'docs',
|
|
* 'click': function() {
|
|
* console.log('clicked ' + this.label);
|
|
* }
|
|
* };
|
|
*
|
|
* _.bindAll(view, ['click']);
|
|
* jQuery(element).on('click', view.click);
|
|
* // => Logs 'clicked docs' when clicked.
|
|
*/
|
|
var bindAll = flatRest(function(object, methodNames) {
|
|
arrayEach(methodNames, function(key) {
|
|
key = toKey(key);
|
|
baseAssignValue(object, key, bind(object[key], object));
|
|
});
|
|
return object;
|
|
});
|
|
|
|
/**
|
|
* Creates a function that iterates over `pairs` and invokes the corresponding
|
|
* function of the first predicate to return truthy. The predicate-function
|
|
* pairs are invoked with the `this` binding and arguments of the created
|
|
* function.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {Array} pairs The predicate-function pairs.
|
|
* @returns {Function} Returns the new composite function.
|
|
* @example
|
|
*
|
|
* var func = _.cond([
|
|
* [_.matches({ 'a': 1 }), _.constant('matches A')],
|
|
* [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
|
|
* [_.stubTrue, _.constant('no match')]
|
|
* ]);
|
|
*
|
|
* func({ 'a': 1, 'b': 2 });
|
|
* // => 'matches A'
|
|
*
|
|
* func({ 'a': 0, 'b': 1 });
|
|
* // => 'matches B'
|
|
*
|
|
* func({ 'a': '1', 'b': '2' });
|
|
* // => 'no match'
|
|
*/
|
|
function cond(pairs) {
|
|
var length = pairs == null ? 0 : pairs.length,
|
|
toIteratee = getIteratee();
|
|
|
|
pairs = !length ? [] : arrayMap(pairs, function(pair) {
|
|
if (typeof pair[1] != 'function') {
|
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|
}
|
|
return [toIteratee(pair[0]), pair[1]];
|
|
});
|
|
|
|
return baseRest(function(args) {
|
|
var index = -1;
|
|
while (++index < length) {
|
|
var pair = pairs[index];
|
|
if (apply(pair[0], this, args)) {
|
|
return apply(pair[1], this, args);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes the predicate properties of `source` with
|
|
* the corresponding property values of a given object, returning `true` if
|
|
* all predicates return truthy, else `false`.
|
|
*
|
|
* **Note:** The created function is equivalent to `_.conformsTo` with
|
|
* `source` partially applied.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {Object} source The object of property predicates to conform to.
|
|
* @returns {Function} Returns the new spec function.
|
|
* @example
|
|
*
|
|
* var objects = [
|
|
* { 'a': 2, 'b': 1 },
|
|
* { 'a': 1, 'b': 2 }
|
|
* ];
|
|
*
|
|
* _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
|
|
* // => [{ 'a': 1, 'b': 2 }]
|
|
*/
|
|
function conforms(source) {
|
|
return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
|
|
}
|
|
|
|
/**
|
|
* Creates a function that returns `value`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.4.0
|
|
* @category Util
|
|
* @param {*} value The value to return from the new function.
|
|
* @returns {Function} Returns the new constant function.
|
|
* @example
|
|
*
|
|
* var objects = _.times(2, _.constant({ 'a': 1 }));
|
|
*
|
|
* console.log(objects);
|
|
* // => [{ 'a': 1 }, { 'a': 1 }]
|
|
*
|
|
* console.log(objects[0] === objects[1]);
|
|
* // => true
|
|
*/
|
|
function constant(value) {
|
|
return function() {
|
|
return value;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Checks `value` to determine whether a default value should be returned in
|
|
* its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
|
|
* or `undefined`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.14.0
|
|
* @category Util
|
|
* @param {*} value The value to check.
|
|
* @param {*} defaultValue The default value.
|
|
* @returns {*} Returns the resolved value.
|
|
* @example
|
|
*
|
|
* _.defaultTo(1, 10);
|
|
* // => 1
|
|
*
|
|
* _.defaultTo(undefined, 10);
|
|
* // => 10
|
|
*/
|
|
function defaultTo(value, defaultValue) {
|
|
return (value == null || value !== value) ? defaultValue : value;
|
|
}
|
|
|
|
/**
|
|
* Creates a function that returns the result of invoking the given functions
|
|
* with the `this` binding of the created function, where each successive
|
|
* invocation is supplied the return value of the previous.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Util
|
|
* @param {...(Function|Function[])} [funcs] The functions to invoke.
|
|
* @returns {Function} Returns the new composite function.
|
|
* @see _.flowRight
|
|
* @example
|
|
*
|
|
* function square(n) {
|
|
* return n * n;
|
|
* }
|
|
*
|
|
* var addSquare = _.flow([_.add, square]);
|
|
* addSquare(1, 2);
|
|
* // => 9
|
|
*/
|
|
var flow = createFlow();
|
|
|
|
/**
|
|
* This method is like `_.flow` except that it creates a function that
|
|
* invokes the given functions from right to left.
|
|
*
|
|
* @static
|
|
* @since 3.0.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {...(Function|Function[])} [funcs] The functions to invoke.
|
|
* @returns {Function} Returns the new composite function.
|
|
* @see _.flow
|
|
* @example
|
|
*
|
|
* function square(n) {
|
|
* return n * n;
|
|
* }
|
|
*
|
|
* var addSquare = _.flowRight([square, _.add]);
|
|
* addSquare(1, 2);
|
|
* // => 9
|
|
*/
|
|
var flowRight = createFlow(true);
|
|
|
|
/**
|
|
* This method returns the first argument it receives.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {*} value Any value.
|
|
* @returns {*} Returns `value`.
|
|
* @example
|
|
*
|
|
* var object = { 'a': 1 };
|
|
*
|
|
* console.log(_.identity(object) === object);
|
|
* // => true
|
|
*/
|
|
function identity(value) {
|
|
return value;
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `func` with the arguments of the created
|
|
* function. If `func` is a property name, the created function returns the
|
|
* property value for a given element. If `func` is an array or object, the
|
|
* created function returns `true` for elements that contain the equivalent
|
|
* source properties, otherwise it returns `false`.
|
|
*
|
|
* @static
|
|
* @since 4.0.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {*} [func=_.identity] The value to convert to a callback.
|
|
* @returns {Function} Returns the callback.
|
|
* @example
|
|
*
|
|
* var users = [
|
|
* { 'user': 'barney', 'age': 36, 'active': true },
|
|
* { 'user': 'fred', 'age': 40, 'active': false }
|
|
* ];
|
|
*
|
|
* // The `_.matches` iteratee shorthand.
|
|
* _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
|
|
* // => [{ 'user': 'barney', 'age': 36, 'active': true }]
|
|
*
|
|
* // The `_.matchesProperty` iteratee shorthand.
|
|
* _.filter(users, _.iteratee(['user', 'fred']));
|
|
* // => [{ 'user': 'fred', 'age': 40 }]
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.map(users, _.iteratee('user'));
|
|
* // => ['barney', 'fred']
|
|
*
|
|
* // Create custom iteratee shorthands.
|
|
* _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
|
|
* return !_.isRegExp(func) ? iteratee(func) : function(string) {
|
|
* return func.test(string);
|
|
* };
|
|
* });
|
|
*
|
|
* _.filter(['abc', 'def'], /ef/);
|
|
* // => ['def']
|
|
*/
|
|
function iteratee(func) {
|
|
return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
|
|
}
|
|
|
|
/**
|
|
* Creates a function that performs a partial deep comparison between a given
|
|
* object and `source`, returning `true` if the given object has equivalent
|
|
* property values, else `false`.
|
|
*
|
|
* **Note:** The created function is equivalent to `_.isMatch` with `source`
|
|
* partially applied.
|
|
*
|
|
* Partial comparisons will match empty array and empty object `source`
|
|
* values against any array or object value, respectively. See `_.isEqual`
|
|
* for a list of supported value comparisons.
|
|
*
|
|
* **Note:** Multiple values can be checked by combining several matchers
|
|
* using `_.overSome`
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Util
|
|
* @param {Object} source The object of property values to match.
|
|
* @returns {Function} Returns the new spec function.
|
|
* @example
|
|
*
|
|
* var objects = [
|
|
* { 'a': 1, 'b': 2, 'c': 3 },
|
|
* { 'a': 4, 'b': 5, 'c': 6 }
|
|
* ];
|
|
*
|
|
* _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
|
|
* // => [{ 'a': 4, 'b': 5, 'c': 6 }]
|
|
*
|
|
* // Checking for several possible values
|
|
* _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
|
|
* // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
|
|
*/
|
|
function matches(source) {
|
|
return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
|
|
}
|
|
|
|
/**
|
|
* Creates a function that performs a partial deep comparison between the
|
|
* value at `path` of a given object to `srcValue`, returning `true` if the
|
|
* object value is equivalent, else `false`.
|
|
*
|
|
* **Note:** Partial comparisons will match empty array and empty object
|
|
* `srcValue` values against any array or object value, respectively. See
|
|
* `_.isEqual` for a list of supported value comparisons.
|
|
*
|
|
* **Note:** Multiple values can be checked by combining several matchers
|
|
* using `_.overSome`
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.2.0
|
|
* @category Util
|
|
* @param {Array|string} path The path of the property to get.
|
|
* @param {*} srcValue The value to match.
|
|
* @returns {Function} Returns the new spec function.
|
|
* @example
|
|
*
|
|
* var objects = [
|
|
* { 'a': 1, 'b': 2, 'c': 3 },
|
|
* { 'a': 4, 'b': 5, 'c': 6 }
|
|
* ];
|
|
*
|
|
* _.find(objects, _.matchesProperty('a', 4));
|
|
* // => { 'a': 4, 'b': 5, 'c': 6 }
|
|
*
|
|
* // Checking for several possible values
|
|
* _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
|
|
* // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
|
|
*/
|
|
function matchesProperty(path, srcValue) {
|
|
return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes the method at `path` of a given object.
|
|
* Any additional arguments are provided to the invoked method.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.7.0
|
|
* @category Util
|
|
* @param {Array|string} path The path of the method to invoke.
|
|
* @param {...*} [args] The arguments to invoke the method with.
|
|
* @returns {Function} Returns the new invoker function.
|
|
* @example
|
|
*
|
|
* var objects = [
|
|
* { 'a': { 'b': _.constant(2) } },
|
|
* { 'a': { 'b': _.constant(1) } }
|
|
* ];
|
|
*
|
|
* _.map(objects, _.method('a.b'));
|
|
* // => [2, 1]
|
|
*
|
|
* _.map(objects, _.method(['a', 'b']));
|
|
* // => [2, 1]
|
|
*/
|
|
var method = baseRest(function(path, args) {
|
|
return function(object) {
|
|
return baseInvoke(object, path, args);
|
|
};
|
|
});
|
|
|
|
/**
|
|
* The opposite of `_.method`; this method creates a function that invokes
|
|
* the method at a given path of `object`. Any additional arguments are
|
|
* provided to the invoked method.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.7.0
|
|
* @category Util
|
|
* @param {Object} object The object to query.
|
|
* @param {...*} [args] The arguments to invoke the method with.
|
|
* @returns {Function} Returns the new invoker function.
|
|
* @example
|
|
*
|
|
* var array = _.times(3, _.constant),
|
|
* object = { 'a': array, 'b': array, 'c': array };
|
|
*
|
|
* _.map(['a[2]', 'c[0]'], _.methodOf(object));
|
|
* // => [2, 0]
|
|
*
|
|
* _.map([['a', '2'], ['c', '0']], _.methodOf(object));
|
|
* // => [2, 0]
|
|
*/
|
|
var methodOf = baseRest(function(object, args) {
|
|
return function(path) {
|
|
return baseInvoke(object, path, args);
|
|
};
|
|
});
|
|
|
|
/**
|
|
* Adds all own enumerable string keyed function properties of a source
|
|
* object to the destination object. If `object` is a function, then methods
|
|
* are added to its prototype as well.
|
|
*
|
|
* **Note:** Use `_.runInContext` to create a pristine `lodash` function to
|
|
* avoid conflicts caused by modifying the original.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {Function|Object} [object=lodash] The destination object.
|
|
* @param {Object} source The object of functions to add.
|
|
* @param {Object} [options={}] The options object.
|
|
* @param {boolean} [options.chain=true] Specify whether mixins are chainable.
|
|
* @returns {Function|Object} Returns `object`.
|
|
* @example
|
|
*
|
|
* function vowels(string) {
|
|
* return _.filter(string, function(v) {
|
|
* return /[aeiou]/i.test(v);
|
|
* });
|
|
* }
|
|
*
|
|
* _.mixin({ 'vowels': vowels });
|
|
* _.vowels('fred');
|
|
* // => ['e']
|
|
*
|
|
* _('fred').vowels().value();
|
|
* // => ['e']
|
|
*
|
|
* _.mixin({ 'vowels': vowels }, { 'chain': false });
|
|
* _('fred').vowels();
|
|
* // => ['e']
|
|
*/
|
|
function mixin(object, source, options) {
|
|
var props = keys(source),
|
|
methodNames = baseFunctions(source, props);
|
|
|
|
if (options == null &&
|
|
!(isObject(source) && (methodNames.length || !props.length))) {
|
|
options = source;
|
|
source = object;
|
|
object = this;
|
|
methodNames = baseFunctions(source, keys(source));
|
|
}
|
|
var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
|
|
isFunc = isFunction(object);
|
|
|
|
arrayEach(methodNames, function(methodName) {
|
|
var func = source[methodName];
|
|
object[methodName] = func;
|
|
if (isFunc) {
|
|
object.prototype[methodName] = function() {
|
|
var chainAll = this.__chain__;
|
|
if (chain || chainAll) {
|
|
var result = object(this.__wrapped__),
|
|
actions = result.__actions__ = copyArray(this.__actions__);
|
|
|
|
actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
|
|
result.__chain__ = chainAll;
|
|
return result;
|
|
}
|
|
return func.apply(object, arrayPush([this.value()], arguments));
|
|
};
|
|
}
|
|
});
|
|
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* Reverts the `_` variable to its previous value and returns a reference to
|
|
* the `lodash` function.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @returns {Function} Returns the `lodash` function.
|
|
* @example
|
|
*
|
|
* var lodash = _.noConflict();
|
|
*/
|
|
function noConflict() {
|
|
if (root._ === this) {
|
|
root._ = oldDash;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* This method returns `undefined`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.3.0
|
|
* @category Util
|
|
* @example
|
|
*
|
|
* _.times(2, _.noop);
|
|
* // => [undefined, undefined]
|
|
*/
|
|
function noop() {
|
|
// No operation performed.
|
|
}
|
|
|
|
/**
|
|
* Creates a function that gets the argument at index `n`. If `n` is negative,
|
|
* the nth argument from the end is returned.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {number} [n=0] The index of the argument to return.
|
|
* @returns {Function} Returns the new pass-thru function.
|
|
* @example
|
|
*
|
|
* var func = _.nthArg(1);
|
|
* func('a', 'b', 'c', 'd');
|
|
* // => 'b'
|
|
*
|
|
* var func = _.nthArg(-2);
|
|
* func('a', 'b', 'c', 'd');
|
|
* // => 'c'
|
|
*/
|
|
function nthArg(n) {
|
|
n = toInteger(n);
|
|
return baseRest(function(args) {
|
|
return baseNth(args, n);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Creates a function that invokes `iteratees` with the arguments it receives
|
|
* and returns their results.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {...(Function|Function[])} [iteratees=[_.identity]]
|
|
* The iteratees to invoke.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var func = _.over([Math.max, Math.min]);
|
|
*
|
|
* func(1, 2, 3, 4);
|
|
* // => [4, 1]
|
|
*/
|
|
var over = createOver(arrayMap);
|
|
|
|
/**
|
|
* Creates a function that checks if **all** of the `predicates` return
|
|
* truthy when invoked with the arguments it receives.
|
|
*
|
|
* Following shorthands are possible for providing predicates.
|
|
* Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
|
|
* Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {...(Function|Function[])} [predicates=[_.identity]]
|
|
* The predicates to check.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var func = _.overEvery([Boolean, isFinite]);
|
|
*
|
|
* func('1');
|
|
* // => true
|
|
*
|
|
* func(null);
|
|
* // => false
|
|
*
|
|
* func(NaN);
|
|
* // => false
|
|
*/
|
|
var overEvery = createOver(arrayEvery);
|
|
|
|
/**
|
|
* Creates a function that checks if **any** of the `predicates` return
|
|
* truthy when invoked with the arguments it receives.
|
|
*
|
|
* Following shorthands are possible for providing predicates.
|
|
* Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
|
|
* Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {...(Function|Function[])} [predicates=[_.identity]]
|
|
* The predicates to check.
|
|
* @returns {Function} Returns the new function.
|
|
* @example
|
|
*
|
|
* var func = _.overSome([Boolean, isFinite]);
|
|
*
|
|
* func('1');
|
|
* // => true
|
|
*
|
|
* func(null);
|
|
* // => true
|
|
*
|
|
* func(NaN);
|
|
* // => false
|
|
*
|
|
* var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
|
|
* var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
|
|
*/
|
|
var overSome = createOver(arraySome);
|
|
|
|
/**
|
|
* Creates a function that returns the value at `path` of a given object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 2.4.0
|
|
* @category Util
|
|
* @param {Array|string} path The path of the property to get.
|
|
* @returns {Function} Returns the new accessor function.
|
|
* @example
|
|
*
|
|
* var objects = [
|
|
* { 'a': { 'b': 2 } },
|
|
* { 'a': { 'b': 1 } }
|
|
* ];
|
|
*
|
|
* _.map(objects, _.property('a.b'));
|
|
* // => [2, 1]
|
|
*
|
|
* _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
|
|
* // => [1, 2]
|
|
*/
|
|
function property(path) {
|
|
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
|
|
}
|
|
|
|
/**
|
|
* The opposite of `_.property`; this method creates a function that returns
|
|
* the value at a given path of `object`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.0.0
|
|
* @category Util
|
|
* @param {Object} object The object to query.
|
|
* @returns {Function} Returns the new accessor function.
|
|
* @example
|
|
*
|
|
* var array = [0, 1, 2],
|
|
* object = { 'a': array, 'b': array, 'c': array };
|
|
*
|
|
* _.map(['a[2]', 'c[0]'], _.propertyOf(object));
|
|
* // => [2, 0]
|
|
*
|
|
* _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
|
|
* // => [2, 0]
|
|
*/
|
|
function propertyOf(object) {
|
|
return function(path) {
|
|
return object == null ? undefined : baseGet(object, path);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Creates an array of numbers (positive and/or negative) progressing from
|
|
* `start` up to, but not including, `end`. A step of `-1` is used if a negative
|
|
* `start` is specified without an `end` or `step`. If `end` is not specified,
|
|
* it's set to `start` with `start` then set to `0`.
|
|
*
|
|
* **Note:** JavaScript follows the IEEE-754 standard for resolving
|
|
* floating-point values which can produce unexpected results.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {number} [start=0] The start of the range.
|
|
* @param {number} end The end of the range.
|
|
* @param {number} [step=1] The value to increment or decrement by.
|
|
* @returns {Array} Returns the range of numbers.
|
|
* @see _.inRange, _.rangeRight
|
|
* @example
|
|
*
|
|
* _.range(4);
|
|
* // => [0, 1, 2, 3]
|
|
*
|
|
* _.range(-4);
|
|
* // => [0, -1, -2, -3]
|
|
*
|
|
* _.range(1, 5);
|
|
* // => [1, 2, 3, 4]
|
|
*
|
|
* _.range(0, 20, 5);
|
|
* // => [0, 5, 10, 15]
|
|
*
|
|
* _.range(0, -4, -1);
|
|
* // => [0, -1, -2, -3]
|
|
*
|
|
* _.range(1, 4, 0);
|
|
* // => [1, 1, 1]
|
|
*
|
|
* _.range(0);
|
|
* // => []
|
|
*/
|
|
var range = createRange();
|
|
|
|
/**
|
|
* This method is like `_.range` except that it populates values in
|
|
* descending order.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {number} [start=0] The start of the range.
|
|
* @param {number} end The end of the range.
|
|
* @param {number} [step=1] The value to increment or decrement by.
|
|
* @returns {Array} Returns the range of numbers.
|
|
* @see _.inRange, _.range
|
|
* @example
|
|
*
|
|
* _.rangeRight(4);
|
|
* // => [3, 2, 1, 0]
|
|
*
|
|
* _.rangeRight(-4);
|
|
* // => [-3, -2, -1, 0]
|
|
*
|
|
* _.rangeRight(1, 5);
|
|
* // => [4, 3, 2, 1]
|
|
*
|
|
* _.rangeRight(0, 20, 5);
|
|
* // => [15, 10, 5, 0]
|
|
*
|
|
* _.rangeRight(0, -4, -1);
|
|
* // => [-3, -2, -1, 0]
|
|
*
|
|
* _.rangeRight(1, 4, 0);
|
|
* // => [1, 1, 1]
|
|
*
|
|
* _.rangeRight(0);
|
|
* // => []
|
|
*/
|
|
var rangeRight = createRange(true);
|
|
|
|
/**
|
|
* This method returns a new empty array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.13.0
|
|
* @category Util
|
|
* @returns {Array} Returns the new empty array.
|
|
* @example
|
|
*
|
|
* var arrays = _.times(2, _.stubArray);
|
|
*
|
|
* console.log(arrays);
|
|
* // => [[], []]
|
|
*
|
|
* console.log(arrays[0] === arrays[1]);
|
|
* // => false
|
|
*/
|
|
function stubArray() {
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* This method returns `false`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.13.0
|
|
* @category Util
|
|
* @returns {boolean} Returns `false`.
|
|
* @example
|
|
*
|
|
* _.times(2, _.stubFalse);
|
|
* // => [false, false]
|
|
*/
|
|
function stubFalse() {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* This method returns a new empty object.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.13.0
|
|
* @category Util
|
|
* @returns {Object} Returns the new empty object.
|
|
* @example
|
|
*
|
|
* var objects = _.times(2, _.stubObject);
|
|
*
|
|
* console.log(objects);
|
|
* // => [{}, {}]
|
|
*
|
|
* console.log(objects[0] === objects[1]);
|
|
* // => false
|
|
*/
|
|
function stubObject() {
|
|
return {};
|
|
}
|
|
|
|
/**
|
|
* This method returns an empty string.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.13.0
|
|
* @category Util
|
|
* @returns {string} Returns the empty string.
|
|
* @example
|
|
*
|
|
* _.times(2, _.stubString);
|
|
* // => ['', '']
|
|
*/
|
|
function stubString() {
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* This method returns `true`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.13.0
|
|
* @category Util
|
|
* @returns {boolean} Returns `true`.
|
|
* @example
|
|
*
|
|
* _.times(2, _.stubTrue);
|
|
* // => [true, true]
|
|
*/
|
|
function stubTrue() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Invokes the iteratee `n` times, returning an array of the results of
|
|
* each invocation. The iteratee is invoked with one argument; (index).
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {number} n The number of times to invoke `iteratee`.
|
|
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
|
* @returns {Array} Returns the array of results.
|
|
* @example
|
|
*
|
|
* _.times(3, String);
|
|
* // => ['0', '1', '2']
|
|
*
|
|
* _.times(4, _.constant(0));
|
|
* // => [0, 0, 0, 0]
|
|
*/
|
|
function times(n, iteratee) {
|
|
n = toInteger(n);
|
|
if (n < 1 || n > MAX_SAFE_INTEGER) {
|
|
return [];
|
|
}
|
|
var index = MAX_ARRAY_LENGTH,
|
|
length = nativeMin(n, MAX_ARRAY_LENGTH);
|
|
|
|
iteratee = getIteratee(iteratee);
|
|
n -= MAX_ARRAY_LENGTH;
|
|
|
|
var result = baseTimes(length, iteratee);
|
|
while (++index < n) {
|
|
iteratee(index);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Converts `value` to a property path array.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Util
|
|
* @param {*} value The value to convert.
|
|
* @returns {Array} Returns the new property path array.
|
|
* @example
|
|
*
|
|
* _.toPath('a.b.c');
|
|
* // => ['a', 'b', 'c']
|
|
*
|
|
* _.toPath('a[0].b.c');
|
|
* // => ['a', '0', 'b', 'c']
|
|
*/
|
|
function toPath(value) {
|
|
if (isArray(value)) {
|
|
return arrayMap(value, toKey);
|
|
}
|
|
return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
|
|
}
|
|
|
|
/**
|
|
* Generates a unique ID. If `prefix` is given, the ID is appended to it.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Util
|
|
* @param {string} [prefix=''] The value to prefix the ID with.
|
|
* @returns {string} Returns the unique ID.
|
|
* @example
|
|
*
|
|
* _.uniqueId('contact_');
|
|
* // => 'contact_104'
|
|
*
|
|
* _.uniqueId();
|
|
* // => '105'
|
|
*/
|
|
function uniqueId(prefix) {
|
|
var id = ++idCounter;
|
|
return toString(prefix) + id;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Adds two numbers.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.4.0
|
|
* @category Math
|
|
* @param {number} augend The first number in an addition.
|
|
* @param {number} addend The second number in an addition.
|
|
* @returns {number} Returns the total.
|
|
* @example
|
|
*
|
|
* _.add(6, 4);
|
|
* // => 10
|
|
*/
|
|
var add = createMathOperation(function(augend, addend) {
|
|
return augend + addend;
|
|
}, 0);
|
|
|
|
/**
|
|
* Computes `number` rounded up to `precision`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.10.0
|
|
* @category Math
|
|
* @param {number} number The number to round up.
|
|
* @param {number} [precision=0] The precision to round up to.
|
|
* @returns {number} Returns the rounded up number.
|
|
* @example
|
|
*
|
|
* _.ceil(4.006);
|
|
* // => 5
|
|
*
|
|
* _.ceil(6.004, 2);
|
|
* // => 6.01
|
|
*
|
|
* _.ceil(6040, -2);
|
|
* // => 6100
|
|
*/
|
|
var ceil = createRound('ceil');
|
|
|
|
/**
|
|
* Divide two numbers.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.7.0
|
|
* @category Math
|
|
* @param {number} dividend The first number in a division.
|
|
* @param {number} divisor The second number in a division.
|
|
* @returns {number} Returns the quotient.
|
|
* @example
|
|
*
|
|
* _.divide(6, 4);
|
|
* // => 1.5
|
|
*/
|
|
var divide = createMathOperation(function(dividend, divisor) {
|
|
return dividend / divisor;
|
|
}, 1);
|
|
|
|
/**
|
|
* Computes `number` rounded down to `precision`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.10.0
|
|
* @category Math
|
|
* @param {number} number The number to round down.
|
|
* @param {number} [precision=0] The precision to round down to.
|
|
* @returns {number} Returns the rounded down number.
|
|
* @example
|
|
*
|
|
* _.floor(4.006);
|
|
* // => 4
|
|
*
|
|
* _.floor(0.046, 2);
|
|
* // => 0.04
|
|
*
|
|
* _.floor(4060, -2);
|
|
* // => 4000
|
|
*/
|
|
var floor = createRound('floor');
|
|
|
|
/**
|
|
* Computes the maximum value of `array`. If `array` is empty or falsey,
|
|
* `undefined` is returned.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @returns {*} Returns the maximum value.
|
|
* @example
|
|
*
|
|
* _.max([4, 2, 8, 6]);
|
|
* // => 8
|
|
*
|
|
* _.max([]);
|
|
* // => undefined
|
|
*/
|
|
function max(array) {
|
|
return (array && array.length)
|
|
? baseExtremum(array, identity, baseGt)
|
|
: undefined;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.max` except that it accepts `iteratee` which is
|
|
* invoked for each element in `array` to generate the criterion by which
|
|
* the value is ranked. The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {*} Returns the maximum value.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'n': 1 }, { 'n': 2 }];
|
|
*
|
|
* _.maxBy(objects, function(o) { return o.n; });
|
|
* // => { 'n': 2 }
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.maxBy(objects, 'n');
|
|
* // => { 'n': 2 }
|
|
*/
|
|
function maxBy(array, iteratee) {
|
|
return (array && array.length)
|
|
? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
|
|
: undefined;
|
|
}
|
|
|
|
/**
|
|
* Computes the mean of the values in `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @returns {number} Returns the mean.
|
|
* @example
|
|
*
|
|
* _.mean([4, 2, 8, 6]);
|
|
* // => 5
|
|
*/
|
|
function mean(array) {
|
|
return baseMean(array, identity);
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.mean` except that it accepts `iteratee` which is
|
|
* invoked for each element in `array` to generate the value to be averaged.
|
|
* The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.7.0
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {number} Returns the mean.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
|
|
*
|
|
* _.meanBy(objects, function(o) { return o.n; });
|
|
* // => 5
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.meanBy(objects, 'n');
|
|
* // => 5
|
|
*/
|
|
function meanBy(array, iteratee) {
|
|
return baseMean(array, getIteratee(iteratee, 2));
|
|
}
|
|
|
|
/**
|
|
* Computes the minimum value of `array`. If `array` is empty or falsey,
|
|
* `undefined` is returned.
|
|
*
|
|
* @static
|
|
* @since 0.1.0
|
|
* @memberOf _
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @returns {*} Returns the minimum value.
|
|
* @example
|
|
*
|
|
* _.min([4, 2, 8, 6]);
|
|
* // => 2
|
|
*
|
|
* _.min([]);
|
|
* // => undefined
|
|
*/
|
|
function min(array) {
|
|
return (array && array.length)
|
|
? baseExtremum(array, identity, baseLt)
|
|
: undefined;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.min` except that it accepts `iteratee` which is
|
|
* invoked for each element in `array` to generate the criterion by which
|
|
* the value is ranked. The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {*} Returns the minimum value.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'n': 1 }, { 'n': 2 }];
|
|
*
|
|
* _.minBy(objects, function(o) { return o.n; });
|
|
* // => { 'n': 1 }
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.minBy(objects, 'n');
|
|
* // => { 'n': 1 }
|
|
*/
|
|
function minBy(array, iteratee) {
|
|
return (array && array.length)
|
|
? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
|
|
: undefined;
|
|
}
|
|
|
|
/**
|
|
* Multiply two numbers.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.7.0
|
|
* @category Math
|
|
* @param {number} multiplier The first number in a multiplication.
|
|
* @param {number} multiplicand The second number in a multiplication.
|
|
* @returns {number} Returns the product.
|
|
* @example
|
|
*
|
|
* _.multiply(6, 4);
|
|
* // => 24
|
|
*/
|
|
var multiply = createMathOperation(function(multiplier, multiplicand) {
|
|
return multiplier * multiplicand;
|
|
}, 1);
|
|
|
|
/**
|
|
* Computes `number` rounded to `precision`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.10.0
|
|
* @category Math
|
|
* @param {number} number The number to round.
|
|
* @param {number} [precision=0] The precision to round to.
|
|
* @returns {number} Returns the rounded number.
|
|
* @example
|
|
*
|
|
* _.round(4.006);
|
|
* // => 4
|
|
*
|
|
* _.round(4.006, 2);
|
|
* // => 4.01
|
|
*
|
|
* _.round(4060, -2);
|
|
* // => 4100
|
|
*/
|
|
var round = createRound('round');
|
|
|
|
/**
|
|
* Subtract two numbers.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Math
|
|
* @param {number} minuend The first number in a subtraction.
|
|
* @param {number} subtrahend The second number in a subtraction.
|
|
* @returns {number} Returns the difference.
|
|
* @example
|
|
*
|
|
* _.subtract(6, 4);
|
|
* // => 2
|
|
*/
|
|
var subtract = createMathOperation(function(minuend, subtrahend) {
|
|
return minuend - subtrahend;
|
|
}, 0);
|
|
|
|
/**
|
|
* Computes the sum of the values in `array`.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 3.4.0
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @returns {number} Returns the sum.
|
|
* @example
|
|
*
|
|
* _.sum([4, 2, 8, 6]);
|
|
* // => 20
|
|
*/
|
|
function sum(array) {
|
|
return (array && array.length)
|
|
? baseSum(array, identity)
|
|
: 0;
|
|
}
|
|
|
|
/**
|
|
* This method is like `_.sum` except that it accepts `iteratee` which is
|
|
* invoked for each element in `array` to generate the value to be summed.
|
|
* The iteratee is invoked with one argument: (value).
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @since 4.0.0
|
|
* @category Math
|
|
* @param {Array} array The array to iterate over.
|
|
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
|
* @returns {number} Returns the sum.
|
|
* @example
|
|
*
|
|
* var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
|
|
*
|
|
* _.sumBy(objects, function(o) { return o.n; });
|
|
* // => 20
|
|
*
|
|
* // The `_.property` iteratee shorthand.
|
|
* _.sumBy(objects, 'n');
|
|
* // => 20
|
|
*/
|
|
function sumBy(array, iteratee) {
|
|
return (array && array.length)
|
|
? baseSum(array, getIteratee(iteratee, 2))
|
|
: 0;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
// Add methods that return wrapped values in chain sequences.
|
|
lodash.after = after;
|
|
lodash.ary = ary;
|
|
lodash.assign = assign;
|
|
lodash.assignIn = assignIn;
|
|
lodash.assignInWith = assignInWith;
|
|
lodash.assignWith = assignWith;
|
|
lodash.at = at;
|
|
lodash.before = before;
|
|
lodash.bind = bind;
|
|
lodash.bindAll = bindAll;
|
|
lodash.bindKey = bindKey;
|
|
lodash.castArray = castArray;
|
|
lodash.chain = chain;
|
|
lodash.chunk = chunk;
|
|
lodash.compact = compact;
|
|
lodash.concat = concat;
|
|
lodash.cond = cond;
|
|
lodash.conforms = conforms;
|
|
lodash.constant = constant;
|
|
lodash.countBy = countBy;
|
|
lodash.create = create;
|
|
lodash.curry = curry;
|
|
lodash.curryRight = curryRight;
|
|
lodash.debounce = debounce;
|
|
lodash.defaults = defaults;
|
|
lodash.defaultsDeep = defaultsDeep;
|
|
lodash.defer = defer;
|
|
lodash.delay = delay;
|
|
lodash.difference = difference;
|
|
lodash.differenceBy = differenceBy;
|
|
lodash.differenceWith = differenceWith;
|
|
lodash.drop = drop;
|
|
lodash.dropRight = dropRight;
|
|
lodash.dropRightWhile = dropRightWhile;
|
|
lodash.dropWhile = dropWhile;
|
|
lodash.fill = fill;
|
|
lodash.filter = filter;
|
|
lodash.flatMap = flatMap;
|
|
lodash.flatMapDeep = flatMapDeep;
|
|
lodash.flatMapDepth = flatMapDepth;
|
|
lodash.flatten = flatten;
|
|
lodash.flattenDeep = flattenDeep;
|
|
lodash.flattenDepth = flattenDepth;
|
|
lodash.flip = flip;
|
|
lodash.flow = flow;
|
|
lodash.flowRight = flowRight;
|
|
lodash.fromPairs = fromPairs;
|
|
lodash.functions = functions;
|
|
lodash.functionsIn = functionsIn;
|
|
lodash.groupBy = groupBy;
|
|
lodash.initial = initial;
|
|
lodash.intersection = intersection;
|
|
lodash.intersectionBy = intersectionBy;
|
|
lodash.intersectionWith = intersectionWith;
|
|
lodash.invert = invert;
|
|
lodash.invertBy = invertBy;
|
|
lodash.invokeMap = invokeMap;
|
|
lodash.iteratee = iteratee;
|
|
lodash.keyBy = keyBy;
|
|
lodash.keys = keys;
|
|
lodash.keysIn = keysIn;
|
|
lodash.map = map;
|
|
lodash.mapKeys = mapKeys;
|
|
lodash.mapValues = mapValues;
|
|
lodash.matches = matches;
|
|
lodash.matchesProperty = matchesProperty;
|
|
lodash.memoize = memoize;
|
|
lodash.merge = merge;
|
|
lodash.mergeWith = mergeWith;
|
|
lodash.method = method;
|
|
lodash.methodOf = methodOf;
|
|
lodash.mixin = mixin;
|
|
lodash.negate = negate;
|
|
lodash.nthArg = nthArg;
|
|
lodash.omit = omit;
|
|
lodash.omitBy = omitBy;
|
|
lodash.once = once;
|
|
lodash.orderBy = orderBy;
|
|
lodash.over = over;
|
|
lodash.overArgs = overArgs;
|
|
lodash.overEvery = overEvery;
|
|
lodash.overSome = overSome;
|
|
lodash.partial = partial;
|
|
lodash.partialRight = partialRight;
|
|
lodash.partition = partition;
|
|
lodash.pick = pick;
|
|
lodash.pickBy = pickBy;
|
|
lodash.property = property;
|
|
lodash.propertyOf = propertyOf;
|
|
lodash.pull = pull;
|
|
lodash.pullAll = pullAll;
|
|
lodash.pullAllBy = pullAllBy;
|
|
lodash.pullAllWith = pullAllWith;
|
|
lodash.pullAt = pullAt;
|
|
lodash.range = range;
|
|
lodash.rangeRight = rangeRight;
|
|
lodash.rearg = rearg;
|
|
lodash.reject = reject;
|
|
lodash.remove = remove;
|
|
lodash.rest = rest;
|
|
lodash.reverse = reverse;
|
|
lodash.sampleSize = sampleSize;
|
|
lodash.set = set;
|
|
lodash.setWith = setWith;
|
|
lodash.shuffle = shuffle;
|
|
lodash.slice = slice;
|
|
lodash.sortBy = sortBy;
|
|
lodash.sortedUniq = sortedUniq;
|
|
lodash.sortedUniqBy = sortedUniqBy;
|
|
lodash.split = split;
|
|
lodash.spread = spread;
|
|
lodash.tail = tail;
|
|
lodash.take = take;
|
|
lodash.takeRight = takeRight;
|
|
lodash.takeRightWhile = takeRightWhile;
|
|
lodash.takeWhile = takeWhile;
|
|
lodash.tap = tap;
|
|
lodash.throttle = throttle;
|
|
lodash.thru = thru;
|
|
lodash.toArray = toArray;
|
|
lodash.toPairs = toPairs;
|
|
lodash.toPairsIn = toPairsIn;
|
|
lodash.toPath = toPath;
|
|
lodash.toPlainObject = toPlainObject;
|
|
lodash.transform = transform;
|
|
lodash.unary = unary;
|
|
lodash.union = union;
|
|
lodash.unionBy = unionBy;
|
|
lodash.unionWith = unionWith;
|
|
lodash.uniq = uniq;
|
|
lodash.uniqBy = uniqBy;
|
|
lodash.uniqWith = uniqWith;
|
|
lodash.unset = unset;
|
|
lodash.unzip = unzip;
|
|
lodash.unzipWith = unzipWith;
|
|
lodash.update = update;
|
|
lodash.updateWith = updateWith;
|
|
lodash.values = values;
|
|
lodash.valuesIn = valuesIn;
|
|
lodash.without = without;
|
|
lodash.words = words;
|
|
lodash.wrap = wrap;
|
|
lodash.xor = xor;
|
|
lodash.xorBy = xorBy;
|
|
lodash.xorWith = xorWith;
|
|
lodash.zip = zip;
|
|
lodash.zipObject = zipObject;
|
|
lodash.zipObjectDeep = zipObjectDeep;
|
|
lodash.zipWith = zipWith;
|
|
|
|
// Add aliases.
|
|
lodash.entries = toPairs;
|
|
lodash.entriesIn = toPairsIn;
|
|
lodash.extend = assignIn;
|
|
lodash.extendWith = assignInWith;
|
|
|
|
// Add methods to `lodash.prototype`.
|
|
mixin(lodash, lodash);
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
// Add methods that return unwrapped values in chain sequences.
|
|
lodash.add = add;
|
|
lodash.attempt = attempt;
|
|
lodash.camelCase = camelCase;
|
|
lodash.capitalize = capitalize;
|
|
lodash.ceil = ceil;
|
|
lodash.clamp = clamp;
|
|
lodash.clone = clone;
|
|
lodash.cloneDeep = cloneDeep;
|
|
lodash.cloneDeepWith = cloneDeepWith;
|
|
lodash.cloneWith = cloneWith;
|
|
lodash.conformsTo = conformsTo;
|
|
lodash.deburr = deburr;
|
|
lodash.defaultTo = defaultTo;
|
|
lodash.divide = divide;
|
|
lodash.endsWith = endsWith;
|
|
lodash.eq = eq;
|
|
lodash.escape = escape;
|
|
lodash.escapeRegExp = escapeRegExp;
|
|
lodash.every = every;
|
|
lodash.find = find;
|
|
lodash.findIndex = findIndex;
|
|
lodash.findKey = findKey;
|
|
lodash.findLast = findLast;
|
|
lodash.findLastIndex = findLastIndex;
|
|
lodash.findLastKey = findLastKey;
|
|
lodash.floor = floor;
|
|
lodash.forEach = forEach;
|
|
lodash.forEachRight = forEachRight;
|
|
lodash.forIn = forIn;
|
|
lodash.forInRight = forInRight;
|
|
lodash.forOwn = forOwn;
|
|
lodash.forOwnRight = forOwnRight;
|
|
lodash.get = get;
|
|
lodash.gt = gt;
|
|
lodash.gte = gte;
|
|
lodash.has = has;
|
|
lodash.hasIn = hasIn;
|
|
lodash.head = head;
|
|
lodash.identity = identity;
|
|
lodash.includes = includes;
|
|
lodash.indexOf = indexOf;
|
|
lodash.inRange = inRange;
|
|
lodash.invoke = invoke;
|
|
lodash.isArguments = isArguments;
|
|
lodash.isArray = isArray;
|
|
lodash.isArrayBuffer = isArrayBuffer;
|
|
lodash.isArrayLike = isArrayLike;
|
|
lodash.isArrayLikeObject = isArrayLikeObject;
|
|
lodash.isBoolean = isBoolean;
|
|
lodash.isBuffer = isBuffer;
|
|
lodash.isDate = isDate;
|
|
lodash.isElement = isElement;
|
|
lodash.isEmpty = isEmpty;
|
|
lodash.isEqual = isEqual;
|
|
lodash.isEqualWith = isEqualWith;
|
|
lodash.isError = isError;
|
|
lodash.isFinite = isFinite;
|
|
lodash.isFunction = isFunction;
|
|
lodash.isInteger = isInteger;
|
|
lodash.isLength = isLength;
|
|
lodash.isMap = isMap;
|
|
lodash.isMatch = isMatch;
|
|
lodash.isMatchWith = isMatchWith;
|
|
lodash.isNaN = isNaN;
|
|
lodash.isNative = isNative;
|
|
lodash.isNil = isNil;
|
|
lodash.isNull = isNull;
|
|
lodash.isNumber = isNumber;
|
|
lodash.isObject = isObject;
|
|
lodash.isObjectLike = isObjectLike;
|
|
lodash.isPlainObject = isPlainObject;
|
|
lodash.isRegExp = isRegExp;
|
|
lodash.isSafeInteger = isSafeInteger;
|
|
lodash.isSet = isSet;
|
|
lodash.isString = isString;
|
|
lodash.isSymbol = isSymbol;
|
|
lodash.isTypedArray = isTypedArray;
|
|
lodash.isUndefined = isUndefined;
|
|
lodash.isWeakMap = isWeakMap;
|
|
lodash.isWeakSet = isWeakSet;
|
|
lodash.join = join;
|
|
lodash.kebabCase = kebabCase;
|
|
lodash.last = last;
|
|
lodash.lastIndexOf = lastIndexOf;
|
|
lodash.lowerCase = lowerCase;
|
|
lodash.lowerFirst = lowerFirst;
|
|
lodash.lt = lt;
|
|
lodash.lte = lte;
|
|
lodash.max = max;
|
|
lodash.maxBy = maxBy;
|
|
lodash.mean = mean;
|
|
lodash.meanBy = meanBy;
|
|
lodash.min = min;
|
|
lodash.minBy = minBy;
|
|
lodash.stubArray = stubArray;
|
|
lodash.stubFalse = stubFalse;
|
|
lodash.stubObject = stubObject;
|
|
lodash.stubString = stubString;
|
|
lodash.stubTrue = stubTrue;
|
|
lodash.multiply = multiply;
|
|
lodash.nth = nth;
|
|
lodash.noConflict = noConflict;
|
|
lodash.noop = noop;
|
|
lodash.now = now;
|
|
lodash.pad = pad;
|
|
lodash.padEnd = padEnd;
|
|
lodash.padStart = padStart;
|
|
lodash.parseInt = parseInt;
|
|
lodash.random = random;
|
|
lodash.reduce = reduce;
|
|
lodash.reduceRight = reduceRight;
|
|
lodash.repeat = repeat;
|
|
lodash.replace = replace;
|
|
lodash.result = result;
|
|
lodash.round = round;
|
|
lodash.runInContext = runInContext;
|
|
lodash.sample = sample;
|
|
lodash.size = size;
|
|
lodash.snakeCase = snakeCase;
|
|
lodash.some = some;
|
|
lodash.sortedIndex = sortedIndex;
|
|
lodash.sortedIndexBy = sortedIndexBy;
|
|
lodash.sortedIndexOf = sortedIndexOf;
|
|
lodash.sortedLastIndex = sortedLastIndex;
|
|
lodash.sortedLastIndexBy = sortedLastIndexBy;
|
|
lodash.sortedLastIndexOf = sortedLastIndexOf;
|
|
lodash.startCase = startCase;
|
|
lodash.startsWith = startsWith;
|
|
lodash.subtract = subtract;
|
|
lodash.sum = sum;
|
|
lodash.sumBy = sumBy;
|
|
lodash.template = template;
|
|
lodash.times = times;
|
|
lodash.toFinite = toFinite;
|
|
lodash.toInteger = toInteger;
|
|
lodash.toLength = toLength;
|
|
lodash.toLower = toLower;
|
|
lodash.toNumber = toNumber;
|
|
lodash.toSafeInteger = toSafeInteger;
|
|
lodash.toString = toString;
|
|
lodash.toUpper = toUpper;
|
|
lodash.trim = trim;
|
|
lodash.trimEnd = trimEnd;
|
|
lodash.trimStart = trimStart;
|
|
lodash.truncate = truncate;
|
|
lodash.unescape = unescape;
|
|
lodash.uniqueId = uniqueId;
|
|
lodash.upperCase = upperCase;
|
|
lodash.upperFirst = upperFirst;
|
|
|
|
// Add aliases.
|
|
lodash.each = forEach;
|
|
lodash.eachRight = forEachRight;
|
|
lodash.first = head;
|
|
|
|
mixin(lodash, (function() {
|
|
var source = {};
|
|
baseForOwn(lodash, function(func, methodName) {
|
|
if (!hasOwnProperty.call(lodash.prototype, methodName)) {
|
|
source[methodName] = func;
|
|
}
|
|
});
|
|
return source;
|
|
}()), { 'chain': false });
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* The semantic version number.
|
|
*
|
|
* @static
|
|
* @memberOf _
|
|
* @type {string}
|
|
*/
|
|
lodash.VERSION = VERSION;
|
|
|
|
// Assign default placeholders.
|
|
arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
|
|
lodash[methodName].placeholder = lodash;
|
|
});
|
|
|
|
// Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
|
|
arrayEach(['drop', 'take'], function(methodName, index) {
|
|
LazyWrapper.prototype[methodName] = function(n) {
|
|
n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
|
|
|
|
var result = (this.__filtered__ && !index)
|
|
? new LazyWrapper(this)
|
|
: this.clone();
|
|
|
|
if (result.__filtered__) {
|
|
result.__takeCount__ = nativeMin(n, result.__takeCount__);
|
|
} else {
|
|
result.__views__.push({
|
|
'size': nativeMin(n, MAX_ARRAY_LENGTH),
|
|
'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
|
|
});
|
|
}
|
|
return result;
|
|
};
|
|
|
|
LazyWrapper.prototype[methodName + 'Right'] = function(n) {
|
|
return this.reverse()[methodName](n).reverse();
|
|
};
|
|
});
|
|
|
|
// Add `LazyWrapper` methods that accept an `iteratee` value.
|
|
arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
|
|
var type = index + 1,
|
|
isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
|
|
|
|
LazyWrapper.prototype[methodName] = function(iteratee) {
|
|
var result = this.clone();
|
|
result.__iteratees__.push({
|
|
'iteratee': getIteratee(iteratee, 3),
|
|
'type': type
|
|
});
|
|
result.__filtered__ = result.__filtered__ || isFilter;
|
|
return result;
|
|
};
|
|
});
|
|
|
|
// Add `LazyWrapper` methods for `_.head` and `_.last`.
|
|
arrayEach(['head', 'last'], function(methodName, index) {
|
|
var takeName = 'take' + (index ? 'Right' : '');
|
|
|
|
LazyWrapper.prototype[methodName] = function() {
|
|
return this[takeName](1).value()[0];
|
|
};
|
|
});
|
|
|
|
// Add `LazyWrapper` methods for `_.initial` and `_.tail`.
|
|
arrayEach(['initial', 'tail'], function(methodName, index) {
|
|
var dropName = 'drop' + (index ? '' : 'Right');
|
|
|
|
LazyWrapper.prototype[methodName] = function() {
|
|
return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
|
|
};
|
|
});
|
|
|
|
LazyWrapper.prototype.compact = function() {
|
|
return this.filter(identity);
|
|
};
|
|
|
|
LazyWrapper.prototype.find = function(predicate) {
|
|
return this.filter(predicate).head();
|
|
};
|
|
|
|
LazyWrapper.prototype.findLast = function(predicate) {
|
|
return this.reverse().find(predicate);
|
|
};
|
|
|
|
LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
|
|
if (typeof path == 'function') {
|
|
return new LazyWrapper(this);
|
|
}
|
|
return this.map(function(value) {
|
|
return baseInvoke(value, path, args);
|
|
});
|
|
});
|
|
|
|
LazyWrapper.prototype.reject = function(predicate) {
|
|
return this.filter(negate(getIteratee(predicate)));
|
|
};
|
|
|
|
LazyWrapper.prototype.slice = function(start, end) {
|
|
start = toInteger(start);
|
|
|
|
var result = this;
|
|
if (result.__filtered__ && (start > 0 || end < 0)) {
|
|
return new LazyWrapper(result);
|
|
}
|
|
if (start < 0) {
|
|
result = result.takeRight(-start);
|
|
} else if (start) {
|
|
result = result.drop(start);
|
|
}
|
|
if (end !== undefined) {
|
|
end = toInteger(end);
|
|
result = end < 0 ? result.dropRight(-end) : result.take(end - start);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
LazyWrapper.prototype.takeRightWhile = function(predicate) {
|
|
return this.reverse().takeWhile(predicate).reverse();
|
|
};
|
|
|
|
LazyWrapper.prototype.toArray = function() {
|
|
return this.take(MAX_ARRAY_LENGTH);
|
|
};
|
|
|
|
// Add `LazyWrapper` methods to `lodash.prototype`.
|
|
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
|
|
var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
|
|
isTaker = /^(?:head|last)$/.test(methodName),
|
|
lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
|
|
retUnwrapped = isTaker || /^find/.test(methodName);
|
|
|
|
if (!lodashFunc) {
|
|
return;
|
|
}
|
|
lodash.prototype[methodName] = function() {
|
|
var value = this.__wrapped__,
|
|
args = isTaker ? [1] : arguments,
|
|
isLazy = value instanceof LazyWrapper,
|
|
iteratee = args[0],
|
|
useLazy = isLazy || isArray(value);
|
|
|
|
var interceptor = function(value) {
|
|
var result = lodashFunc.apply(lodash, arrayPush([value], args));
|
|
return (isTaker && chainAll) ? result[0] : result;
|
|
};
|
|
|
|
if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
|
|
// Avoid lazy use if the iteratee has a "length" value other than `1`.
|
|
isLazy = useLazy = false;
|
|
}
|
|
var chainAll = this.__chain__,
|
|
isHybrid = !!this.__actions__.length,
|
|
isUnwrapped = retUnwrapped && !chainAll,
|
|
onlyLazy = isLazy && !isHybrid;
|
|
|
|
if (!retUnwrapped && useLazy) {
|
|
value = onlyLazy ? value : new LazyWrapper(this);
|
|
var result = func.apply(value, args);
|
|
result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
|
|
return new LodashWrapper(result, chainAll);
|
|
}
|
|
if (isUnwrapped && onlyLazy) {
|
|
return func.apply(this, args);
|
|
}
|
|
result = this.thru(interceptor);
|
|
return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
|
|
};
|
|
});
|
|
|
|
// Add `Array` methods to `lodash.prototype`.
|
|
arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
|
|
var func = arrayProto[methodName],
|
|
chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
|
|
retUnwrapped = /^(?:pop|shift)$/.test(methodName);
|
|
|
|
lodash.prototype[methodName] = function() {
|
|
var args = arguments;
|
|
if (retUnwrapped && !this.__chain__) {
|
|
var value = this.value();
|
|
return func.apply(isArray(value) ? value : [], args);
|
|
}
|
|
return this[chainName](function(value) {
|
|
return func.apply(isArray(value) ? value : [], args);
|
|
});
|
|
};
|
|
});
|
|
|
|
// Map minified method names to their real names.
|
|
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
|
|
var lodashFunc = lodash[methodName];
|
|
if (lodashFunc) {
|
|
var key = lodashFunc.name + '';
|
|
if (!hasOwnProperty.call(realNames, key)) {
|
|
realNames[key] = [];
|
|
}
|
|
realNames[key].push({ 'name': methodName, 'func': lodashFunc });
|
|
}
|
|
});
|
|
|
|
realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
|
|
'name': 'wrapper',
|
|
'func': undefined
|
|
}];
|
|
|
|
// Add methods to `LazyWrapper`.
|
|
LazyWrapper.prototype.clone = lazyClone;
|
|
LazyWrapper.prototype.reverse = lazyReverse;
|
|
LazyWrapper.prototype.value = lazyValue;
|
|
|
|
// Add chain sequence methods to the `lodash` wrapper.
|
|
lodash.prototype.at = wrapperAt;
|
|
lodash.prototype.chain = wrapperChain;
|
|
lodash.prototype.commit = wrapperCommit;
|
|
lodash.prototype.next = wrapperNext;
|
|
lodash.prototype.plant = wrapperPlant;
|
|
lodash.prototype.reverse = wrapperReverse;
|
|
lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
|
|
|
|
// Add lazy aliases.
|
|
lodash.prototype.first = lodash.prototype.head;
|
|
|
|
if (symIterator) {
|
|
lodash.prototype[symIterator] = wrapperToIterator;
|
|
}
|
|
return lodash;
|
|
});
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
// Export lodash.
|
|
var _ = runInContext();
|
|
|
|
// Some AMD build optimizers, like r.js, check for condition patterns like:
|
|
if (true) {
|
|
// Expose Lodash on the global object to prevent errors when Lodash is
|
|
// loaded by a script tag in the presence of an AMD loader.
|
|
// See http://requirejs.org/docs/errors.html#mismatch for more details.
|
|
// Use `_.noConflict` to remove Lodash from the global object.
|
|
root._ = _;
|
|
|
|
// Define as an anonymous module so, through path mapping, it can be
|
|
// referenced as the "underscore" module.
|
|
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
|
|
return _;
|
|
}).call(exports, __webpack_require__, exports, module),
|
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
|
}
|
|
// Check for `exports` after `define` in case a build optimizer adds it.
|
|
else {}
|
|
}.call(this));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/process/browser.js":
|
|
/*!*****************************************!*\
|
|
!*** ./node_modules/process/browser.js ***!
|
|
\*****************************************/
|
|
/***/ ((module) => {
|
|
|
|
// shim for using process in browser
|
|
var process = module.exports = {};
|
|
|
|
// cached from whatever global is present so that test runners that stub it
|
|
// don't break things. But we need to wrap it in a try catch in case it is
|
|
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
|
// function because try/catches deoptimize in certain engines.
|
|
|
|
var cachedSetTimeout;
|
|
var cachedClearTimeout;
|
|
|
|
function defaultSetTimout() {
|
|
throw new Error('setTimeout has not been defined');
|
|
}
|
|
function defaultClearTimeout () {
|
|
throw new Error('clearTimeout has not been defined');
|
|
}
|
|
(function () {
|
|
try {
|
|
if (typeof setTimeout === 'function') {
|
|
cachedSetTimeout = setTimeout;
|
|
} else {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
} catch (e) {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
try {
|
|
if (typeof clearTimeout === 'function') {
|
|
cachedClearTimeout = clearTimeout;
|
|
} else {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} catch (e) {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} ())
|
|
function runTimeout(fun) {
|
|
if (cachedSetTimeout === setTimeout) {
|
|
//normal enviroments in sane situations
|
|
return setTimeout(fun, 0);
|
|
}
|
|
// if setTimeout wasn't available but was latter defined
|
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
cachedSetTimeout = setTimeout;
|
|
return setTimeout(fun, 0);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedSetTimeout(fun, 0);
|
|
} catch(e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedSetTimeout.call(null, fun, 0);
|
|
} catch(e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
return cachedSetTimeout.call(this, fun, 0);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
function runClearTimeout(marker) {
|
|
if (cachedClearTimeout === clearTimeout) {
|
|
//normal enviroments in sane situations
|
|
return clearTimeout(marker);
|
|
}
|
|
// if clearTimeout wasn't available but was latter defined
|
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
cachedClearTimeout = clearTimeout;
|
|
return clearTimeout(marker);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedClearTimeout(marker);
|
|
} catch (e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedClearTimeout.call(null, marker);
|
|
} catch (e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
return cachedClearTimeout.call(this, marker);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
var queue = [];
|
|
var draining = false;
|
|
var currentQueue;
|
|
var queueIndex = -1;
|
|
|
|
function cleanUpNextTick() {
|
|
if (!draining || !currentQueue) {
|
|
return;
|
|
}
|
|
draining = false;
|
|
if (currentQueue.length) {
|
|
queue = currentQueue.concat(queue);
|
|
} else {
|
|
queueIndex = -1;
|
|
}
|
|
if (queue.length) {
|
|
drainQueue();
|
|
}
|
|
}
|
|
|
|
function drainQueue() {
|
|
if (draining) {
|
|
return;
|
|
}
|
|
var timeout = runTimeout(cleanUpNextTick);
|
|
draining = true;
|
|
|
|
var len = queue.length;
|
|
while(len) {
|
|
currentQueue = queue;
|
|
queue = [];
|
|
while (++queueIndex < len) {
|
|
if (currentQueue) {
|
|
currentQueue[queueIndex].run();
|
|
}
|
|
}
|
|
queueIndex = -1;
|
|
len = queue.length;
|
|
}
|
|
currentQueue = null;
|
|
draining = false;
|
|
runClearTimeout(timeout);
|
|
}
|
|
|
|
process.nextTick = function (fun) {
|
|
var args = new Array(arguments.length - 1);
|
|
if (arguments.length > 1) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
args[i - 1] = arguments[i];
|
|
}
|
|
}
|
|
queue.push(new Item(fun, args));
|
|
if (queue.length === 1 && !draining) {
|
|
runTimeout(drainQueue);
|
|
}
|
|
};
|
|
|
|
// v8 likes predictible objects
|
|
function Item(fun, array) {
|
|
this.fun = fun;
|
|
this.array = array;
|
|
}
|
|
Item.prototype.run = function () {
|
|
this.fun.apply(null, this.array);
|
|
};
|
|
process.title = 'browser';
|
|
process.browser = true;
|
|
process.env = {};
|
|
process.argv = [];
|
|
process.version = ''; // empty string to avoid regexp issues
|
|
process.versions = {};
|
|
|
|
function noop() {}
|
|
|
|
process.on = noop;
|
|
process.addListener = noop;
|
|
process.once = noop;
|
|
process.off = noop;
|
|
process.removeListener = noop;
|
|
process.removeAllListeners = noop;
|
|
process.emit = noop;
|
|
process.prependListener = noop;
|
|
process.prependOnceListener = noop;
|
|
|
|
process.listeners = function (name) { return [] }
|
|
|
|
process.binding = function (name) {
|
|
throw new Error('process.binding is not supported');
|
|
};
|
|
|
|
process.cwd = function () { return '/' };
|
|
process.chdir = function (dir) {
|
|
throw new Error('process.chdir is not supported');
|
|
};
|
|
process.umask = function() { return 0; };
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/sortablejs/modular/sortable.esm.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/sortablejs/modular/sortable.esm.js ***!
|
|
\*********************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
|
|
/* harmony export */ "MultiDrag": () => (/* binding */ MultiDragPlugin),
|
|
/* harmony export */ "Sortable": () => (/* binding */ Sortable),
|
|
/* harmony export */ "Swap": () => (/* binding */ SwapPlugin)
|
|
/* harmony export */ });
|
|
/**!
|
|
* Sortable 1.10.2
|
|
* @author RubaXa <trash@rubaxa.org>
|
|
* @author owenm <owen23355@gmail.com>
|
|
* @license MIT
|
|
*/
|
|
function _typeof(obj) {
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof = function (obj) {
|
|
return typeof obj;
|
|
};
|
|
} else {
|
|
_typeof = function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
};
|
|
}
|
|
|
|
return _typeof(obj);
|
|
}
|
|
|
|
function _defineProperty(obj, key, value) {
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
function _extends() {
|
|
_extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];
|
|
|
|
for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return target;
|
|
};
|
|
|
|
return _extends.apply(this, arguments);
|
|
}
|
|
|
|
function _objectSpread(target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
var ownKeys = Object.keys(source);
|
|
|
|
if (typeof Object.getOwnPropertySymbols === 'function') {
|
|
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
|
|
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
}));
|
|
}
|
|
|
|
ownKeys.forEach(function (key) {
|
|
_defineProperty(target, key, source[key]);
|
|
});
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
if (source == null) return {};
|
|
var target = {};
|
|
var sourceKeys = Object.keys(source);
|
|
var key, i;
|
|
|
|
for (i = 0; i < sourceKeys.length; i++) {
|
|
key = sourceKeys[i];
|
|
if (excluded.indexOf(key) >= 0) continue;
|
|
target[key] = source[key];
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function _objectWithoutProperties(source, excluded) {
|
|
if (source == null) return {};
|
|
|
|
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
|
|
var key, i;
|
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
|
|
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
key = sourceSymbolKeys[i];
|
|
if (excluded.indexOf(key) >= 0) continue;
|
|
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function _toConsumableArray(arr) {
|
|
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
|
|
}
|
|
|
|
function _arrayWithoutHoles(arr) {
|
|
if (Array.isArray(arr)) {
|
|
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
|
|
|
|
return arr2;
|
|
}
|
|
}
|
|
|
|
function _iterableToArray(iter) {
|
|
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
|
|
}
|
|
|
|
function _nonIterableSpread() {
|
|
throw new TypeError("Invalid attempt to spread non-iterable instance");
|
|
}
|
|
|
|
var version = "1.10.2";
|
|
|
|
function userAgent(pattern) {
|
|
if (typeof window !== 'undefined' && window.navigator) {
|
|
return !!
|
|
/*@__PURE__*/
|
|
navigator.userAgent.match(pattern);
|
|
}
|
|
}
|
|
|
|
var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
|
|
var Edge = userAgent(/Edge/i);
|
|
var FireFox = userAgent(/firefox/i);
|
|
var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
|
|
var IOS = userAgent(/iP(ad|od|hone)/i);
|
|
var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
|
|
|
|
var captureMode = {
|
|
capture: false,
|
|
passive: false
|
|
};
|
|
|
|
function on(el, event, fn) {
|
|
el.addEventListener(event, fn, !IE11OrLess && captureMode);
|
|
}
|
|
|
|
function off(el, event, fn) {
|
|
el.removeEventListener(event, fn, !IE11OrLess && captureMode);
|
|
}
|
|
|
|
function matches(
|
|
/**HTMLElement*/
|
|
el,
|
|
/**String*/
|
|
selector) {
|
|
if (!selector) return;
|
|
selector[0] === '>' && (selector = selector.substring(1));
|
|
|
|
if (el) {
|
|
try {
|
|
if (el.matches) {
|
|
return el.matches(selector);
|
|
} else if (el.msMatchesSelector) {
|
|
return el.msMatchesSelector(selector);
|
|
} else if (el.webkitMatchesSelector) {
|
|
return el.webkitMatchesSelector(selector);
|
|
}
|
|
} catch (_) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function getParentOrHost(el) {
|
|
return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;
|
|
}
|
|
|
|
function closest(
|
|
/**HTMLElement*/
|
|
el,
|
|
/**String*/
|
|
selector,
|
|
/**HTMLElement*/
|
|
ctx, includeCTX) {
|
|
if (el) {
|
|
ctx = ctx || document;
|
|
|
|
do {
|
|
if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {
|
|
return el;
|
|
}
|
|
|
|
if (el === ctx) break;
|
|
/* jshint boss:true */
|
|
} while (el = getParentOrHost(el));
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
var R_SPACE = /\s+/g;
|
|
|
|
function toggleClass(el, name, state) {
|
|
if (el && name) {
|
|
if (el.classList) {
|
|
el.classList[state ? 'add' : 'remove'](name);
|
|
} else {
|
|
var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
|
|
el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
|
|
}
|
|
}
|
|
}
|
|
|
|
function css(el, prop, val) {
|
|
var style = el && el.style;
|
|
|
|
if (style) {
|
|
if (val === void 0) {
|
|
if (document.defaultView && document.defaultView.getComputedStyle) {
|
|
val = document.defaultView.getComputedStyle(el, '');
|
|
} else if (el.currentStyle) {
|
|
val = el.currentStyle;
|
|
}
|
|
|
|
return prop === void 0 ? val : val[prop];
|
|
} else {
|
|
if (!(prop in style) && prop.indexOf('webkit') === -1) {
|
|
prop = '-webkit-' + prop;
|
|
}
|
|
|
|
style[prop] = val + (typeof val === 'string' ? '' : 'px');
|
|
}
|
|
}
|
|
}
|
|
|
|
function matrix(el, selfOnly) {
|
|
var appliedTransforms = '';
|
|
|
|
if (typeof el === 'string') {
|
|
appliedTransforms = el;
|
|
} else {
|
|
do {
|
|
var transform = css(el, 'transform');
|
|
|
|
if (transform && transform !== 'none') {
|
|
appliedTransforms = transform + ' ' + appliedTransforms;
|
|
}
|
|
/* jshint boss:true */
|
|
|
|
} while (!selfOnly && (el = el.parentNode));
|
|
}
|
|
|
|
var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
|
|
/*jshint -W056 */
|
|
|
|
return matrixFn && new matrixFn(appliedTransforms);
|
|
}
|
|
|
|
function find(ctx, tagName, iterator) {
|
|
if (ctx) {
|
|
var list = ctx.getElementsByTagName(tagName),
|
|
i = 0,
|
|
n = list.length;
|
|
|
|
if (iterator) {
|
|
for (; i < n; i++) {
|
|
iterator(list[i], i);
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
function getWindowScrollingElement() {
|
|
var scrollingElement = document.scrollingElement;
|
|
|
|
if (scrollingElement) {
|
|
return scrollingElement;
|
|
} else {
|
|
return document.documentElement;
|
|
}
|
|
}
|
|
/**
|
|
* Returns the "bounding client rect" of given element
|
|
* @param {HTMLElement} el The element whose boundingClientRect is wanted
|
|
* @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container
|
|
* @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr
|
|
* @param {[Boolean]} undoScale Whether the container's scale() should be undone
|
|
* @param {[HTMLElement]} container The parent the element will be placed in
|
|
* @return {Object} The boundingClientRect of el, with specified adjustments
|
|
*/
|
|
|
|
|
|
function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
|
|
if (!el.getBoundingClientRect && el !== window) return;
|
|
var elRect, top, left, bottom, right, height, width;
|
|
|
|
if (el !== window && el !== getWindowScrollingElement()) {
|
|
elRect = el.getBoundingClientRect();
|
|
top = elRect.top;
|
|
left = elRect.left;
|
|
bottom = elRect.bottom;
|
|
right = elRect.right;
|
|
height = elRect.height;
|
|
width = elRect.width;
|
|
} else {
|
|
top = 0;
|
|
left = 0;
|
|
bottom = window.innerHeight;
|
|
right = window.innerWidth;
|
|
height = window.innerHeight;
|
|
width = window.innerWidth;
|
|
}
|
|
|
|
if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
|
|
// Adjust for translate()
|
|
container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
|
|
// Not needed on <= IE11
|
|
|
|
if (!IE11OrLess) {
|
|
do {
|
|
if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {
|
|
var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container
|
|
|
|
top -= containerRect.top + parseInt(css(container, 'border-top-width'));
|
|
left -= containerRect.left + parseInt(css(container, 'border-left-width'));
|
|
bottom = top + elRect.height;
|
|
right = left + elRect.width;
|
|
break;
|
|
}
|
|
/* jshint boss:true */
|
|
|
|
} while (container = container.parentNode);
|
|
}
|
|
}
|
|
|
|
if (undoScale && el !== window) {
|
|
// Adjust for scale()
|
|
var elMatrix = matrix(container || el),
|
|
scaleX = elMatrix && elMatrix.a,
|
|
scaleY = elMatrix && elMatrix.d;
|
|
|
|
if (elMatrix) {
|
|
top /= scaleY;
|
|
left /= scaleX;
|
|
width /= scaleX;
|
|
height /= scaleY;
|
|
bottom = top + height;
|
|
right = left + width;
|
|
}
|
|
}
|
|
|
|
return {
|
|
top: top,
|
|
left: left,
|
|
bottom: bottom,
|
|
right: right,
|
|
width: width,
|
|
height: height
|
|
};
|
|
}
|
|
/**
|
|
* Checks if a side of an element is scrolled past a side of its parents
|
|
* @param {HTMLElement} el The element who's side being scrolled out of view is in question
|
|
* @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')
|
|
* @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')
|
|
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
|
|
*/
|
|
|
|
|
|
function isScrolledPast(el, elSide, parentSide) {
|
|
var parent = getParentAutoScrollElement(el, true),
|
|
elSideVal = getRect(el)[elSide];
|
|
/* jshint boss:true */
|
|
|
|
while (parent) {
|
|
var parentSideVal = getRect(parent)[parentSide],
|
|
visible = void 0;
|
|
|
|
if (parentSide === 'top' || parentSide === 'left') {
|
|
visible = elSideVal >= parentSideVal;
|
|
} else {
|
|
visible = elSideVal <= parentSideVal;
|
|
}
|
|
|
|
if (!visible) return parent;
|
|
if (parent === getWindowScrollingElement()) break;
|
|
parent = getParentAutoScrollElement(parent, false);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
/**
|
|
* Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
|
|
* and non-draggable elements
|
|
* @param {HTMLElement} el The parent element
|
|
* @param {Number} childNum The index of the child
|
|
* @param {Object} options Parent Sortable's options
|
|
* @return {HTMLElement} The child at index childNum, or null if not found
|
|
*/
|
|
|
|
|
|
function getChild(el, childNum, options) {
|
|
var currentChild = 0,
|
|
i = 0,
|
|
children = el.children;
|
|
|
|
while (i < children.length) {
|
|
if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {
|
|
if (currentChild === childNum) {
|
|
return children[i];
|
|
}
|
|
|
|
currentChild++;
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
/**
|
|
* Gets the last child in the el, ignoring ghostEl or invisible elements (clones)
|
|
* @param {HTMLElement} el Parent element
|
|
* @param {selector} selector Any other elements that should be ignored
|
|
* @return {HTMLElement} The last child, ignoring ghostEl
|
|
*/
|
|
|
|
|
|
function lastChild(el, selector) {
|
|
var last = el.lastElementChild;
|
|
|
|
while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {
|
|
last = last.previousElementSibling;
|
|
}
|
|
|
|
return last || null;
|
|
}
|
|
/**
|
|
* Returns the index of an element within its parent for a selected set of
|
|
* elements
|
|
* @param {HTMLElement} el
|
|
* @param {selector} selector
|
|
* @return {number}
|
|
*/
|
|
|
|
|
|
function index(el, selector) {
|
|
var index = 0;
|
|
|
|
if (!el || !el.parentNode) {
|
|
return -1;
|
|
}
|
|
/* jshint boss:true */
|
|
|
|
|
|
while (el = el.previousElementSibling) {
|
|
if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {
|
|
index++;
|
|
}
|
|
}
|
|
|
|
return index;
|
|
}
|
|
/**
|
|
* Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.
|
|
* The value is returned in real pixels.
|
|
* @param {HTMLElement} el
|
|
* @return {Array} Offsets in the format of [left, top]
|
|
*/
|
|
|
|
|
|
function getRelativeScrollOffset(el) {
|
|
var offsetLeft = 0,
|
|
offsetTop = 0,
|
|
winScroller = getWindowScrollingElement();
|
|
|
|
if (el) {
|
|
do {
|
|
var elMatrix = matrix(el),
|
|
scaleX = elMatrix.a,
|
|
scaleY = elMatrix.d;
|
|
offsetLeft += el.scrollLeft * scaleX;
|
|
offsetTop += el.scrollTop * scaleY;
|
|
} while (el !== winScroller && (el = el.parentNode));
|
|
}
|
|
|
|
return [offsetLeft, offsetTop];
|
|
}
|
|
/**
|
|
* Returns the index of the object within the given array
|
|
* @param {Array} arr Array that may or may not hold the object
|
|
* @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find
|
|
* @return {Number} The index of the object in the array, or -1
|
|
*/
|
|
|
|
|
|
function indexOfObject(arr, obj) {
|
|
for (var i in arr) {
|
|
if (!arr.hasOwnProperty(i)) continue;
|
|
|
|
for (var key in obj) {
|
|
if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
function getParentAutoScrollElement(el, includeSelf) {
|
|
// skip to window
|
|
if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
|
|
var elem = el;
|
|
var gotSelf = false;
|
|
|
|
do {
|
|
// we don't need to get elem css if it isn't even overflowing in the first place (performance)
|
|
if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
|
|
var elemCSS = css(elem);
|
|
|
|
if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {
|
|
if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
|
|
if (gotSelf || includeSelf) return elem;
|
|
gotSelf = true;
|
|
}
|
|
}
|
|
/* jshint boss:true */
|
|
|
|
} while (elem = elem.parentNode);
|
|
|
|
return getWindowScrollingElement();
|
|
}
|
|
|
|
function extend(dst, src) {
|
|
if (dst && src) {
|
|
for (var key in src) {
|
|
if (src.hasOwnProperty(key)) {
|
|
dst[key] = src[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return dst;
|
|
}
|
|
|
|
function isRectEqual(rect1, rect2) {
|
|
return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);
|
|
}
|
|
|
|
var _throttleTimeout;
|
|
|
|
function throttle(callback, ms) {
|
|
return function () {
|
|
if (!_throttleTimeout) {
|
|
var args = arguments,
|
|
_this = this;
|
|
|
|
if (args.length === 1) {
|
|
callback.call(_this, args[0]);
|
|
} else {
|
|
callback.apply(_this, args);
|
|
}
|
|
|
|
_throttleTimeout = setTimeout(function () {
|
|
_throttleTimeout = void 0;
|
|
}, ms);
|
|
}
|
|
};
|
|
}
|
|
|
|
function cancelThrottle() {
|
|
clearTimeout(_throttleTimeout);
|
|
_throttleTimeout = void 0;
|
|
}
|
|
|
|
function scrollBy(el, x, y) {
|
|
el.scrollLeft += x;
|
|
el.scrollTop += y;
|
|
}
|
|
|
|
function clone(el) {
|
|
var Polymer = window.Polymer;
|
|
var $ = window.jQuery || window.Zepto;
|
|
|
|
if (Polymer && Polymer.dom) {
|
|
return Polymer.dom(el).cloneNode(true);
|
|
} else if ($) {
|
|
return $(el).clone(true)[0];
|
|
} else {
|
|
return el.cloneNode(true);
|
|
}
|
|
}
|
|
|
|
function setRect(el, rect) {
|
|
css(el, 'position', 'absolute');
|
|
css(el, 'top', rect.top);
|
|
css(el, 'left', rect.left);
|
|
css(el, 'width', rect.width);
|
|
css(el, 'height', rect.height);
|
|
}
|
|
|
|
function unsetRect(el) {
|
|
css(el, 'position', '');
|
|
css(el, 'top', '');
|
|
css(el, 'left', '');
|
|
css(el, 'width', '');
|
|
css(el, 'height', '');
|
|
}
|
|
|
|
var expando = 'Sortable' + new Date().getTime();
|
|
|
|
function AnimationStateManager() {
|
|
var animationStates = [],
|
|
animationCallbackId;
|
|
return {
|
|
captureAnimationState: function captureAnimationState() {
|
|
animationStates = [];
|
|
if (!this.options.animation) return;
|
|
var children = [].slice.call(this.el.children);
|
|
children.forEach(function (child) {
|
|
if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
|
|
animationStates.push({
|
|
target: child,
|
|
rect: getRect(child)
|
|
});
|
|
|
|
var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
|
|
|
|
|
|
if (child.thisAnimationDuration) {
|
|
var childMatrix = matrix(child, true);
|
|
|
|
if (childMatrix) {
|
|
fromRect.top -= childMatrix.f;
|
|
fromRect.left -= childMatrix.e;
|
|
}
|
|
}
|
|
|
|
child.fromRect = fromRect;
|
|
});
|
|
},
|
|
addAnimationState: function addAnimationState(state) {
|
|
animationStates.push(state);
|
|
},
|
|
removeAnimationState: function removeAnimationState(target) {
|
|
animationStates.splice(indexOfObject(animationStates, {
|
|
target: target
|
|
}), 1);
|
|
},
|
|
animateAll: function animateAll(callback) {
|
|
var _this = this;
|
|
|
|
if (!this.options.animation) {
|
|
clearTimeout(animationCallbackId);
|
|
if (typeof callback === 'function') callback();
|
|
return;
|
|
}
|
|
|
|
var animating = false,
|
|
animationTime = 0;
|
|
animationStates.forEach(function (state) {
|
|
var time = 0,
|
|
target = state.target,
|
|
fromRect = target.fromRect,
|
|
toRect = getRect(target),
|
|
prevFromRect = target.prevFromRect,
|
|
prevToRect = target.prevToRect,
|
|
animatingRect = state.rect,
|
|
targetMatrix = matrix(target, true);
|
|
|
|
if (targetMatrix) {
|
|
// Compensate for current animation
|
|
toRect.top -= targetMatrix.f;
|
|
toRect.left -= targetMatrix.e;
|
|
}
|
|
|
|
target.toRect = toRect;
|
|
|
|
if (target.thisAnimationDuration) {
|
|
// Could also check if animatingRect is between fromRect and toRect
|
|
if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect
|
|
(animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {
|
|
// If returning to same place as started from animation and on same axis
|
|
time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);
|
|
}
|
|
} // if fromRect != toRect: animate
|
|
|
|
|
|
if (!isRectEqual(toRect, fromRect)) {
|
|
target.prevFromRect = fromRect;
|
|
target.prevToRect = toRect;
|
|
|
|
if (!time) {
|
|
time = _this.options.animation;
|
|
}
|
|
|
|
_this.animate(target, animatingRect, toRect, time);
|
|
}
|
|
|
|
if (time) {
|
|
animating = true;
|
|
animationTime = Math.max(animationTime, time);
|
|
clearTimeout(target.animationResetTimer);
|
|
target.animationResetTimer = setTimeout(function () {
|
|
target.animationTime = 0;
|
|
target.prevFromRect = null;
|
|
target.fromRect = null;
|
|
target.prevToRect = null;
|
|
target.thisAnimationDuration = null;
|
|
}, time);
|
|
target.thisAnimationDuration = time;
|
|
}
|
|
});
|
|
clearTimeout(animationCallbackId);
|
|
|
|
if (!animating) {
|
|
if (typeof callback === 'function') callback();
|
|
} else {
|
|
animationCallbackId = setTimeout(function () {
|
|
if (typeof callback === 'function') callback();
|
|
}, animationTime);
|
|
}
|
|
|
|
animationStates = [];
|
|
},
|
|
animate: function animate(target, currentRect, toRect, duration) {
|
|
if (duration) {
|
|
css(target, 'transition', '');
|
|
css(target, 'transform', '');
|
|
var elMatrix = matrix(this.el),
|
|
scaleX = elMatrix && elMatrix.a,
|
|
scaleY = elMatrix && elMatrix.d,
|
|
translateX = (currentRect.left - toRect.left) / (scaleX || 1),
|
|
translateY = (currentRect.top - toRect.top) / (scaleY || 1);
|
|
target.animatingX = !!translateX;
|
|
target.animatingY = !!translateY;
|
|
css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
|
|
repaint(target); // repaint
|
|
|
|
css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
|
|
css(target, 'transform', 'translate3d(0,0,0)');
|
|
typeof target.animated === 'number' && clearTimeout(target.animated);
|
|
target.animated = setTimeout(function () {
|
|
css(target, 'transition', '');
|
|
css(target, 'transform', '');
|
|
target.animated = false;
|
|
target.animatingX = false;
|
|
target.animatingY = false;
|
|
}, duration);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
function repaint(target) {
|
|
return target.offsetWidth;
|
|
}
|
|
|
|
function calculateRealTime(animatingRect, fromRect, toRect, options) {
|
|
return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;
|
|
}
|
|
|
|
var plugins = [];
|
|
var defaults = {
|
|
initializeByDefault: true
|
|
};
|
|
var PluginManager = {
|
|
mount: function mount(plugin) {
|
|
// Set default static properties
|
|
for (var option in defaults) {
|
|
if (defaults.hasOwnProperty(option) && !(option in plugin)) {
|
|
plugin[option] = defaults[option];
|
|
}
|
|
}
|
|
|
|
plugins.push(plugin);
|
|
},
|
|
pluginEvent: function pluginEvent(eventName, sortable, evt) {
|
|
var _this = this;
|
|
|
|
this.eventCanceled = false;
|
|
|
|
evt.cancel = function () {
|
|
_this.eventCanceled = true;
|
|
};
|
|
|
|
var eventNameGlobal = eventName + 'Global';
|
|
plugins.forEach(function (plugin) {
|
|
if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable
|
|
|
|
if (sortable[plugin.pluginName][eventNameGlobal]) {
|
|
sortable[plugin.pluginName][eventNameGlobal](_objectSpread({
|
|
sortable: sortable
|
|
}, evt));
|
|
} // Only fire plugin event if plugin is enabled in this sortable,
|
|
// and plugin has event defined
|
|
|
|
|
|
if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {
|
|
sortable[plugin.pluginName][eventName](_objectSpread({
|
|
sortable: sortable
|
|
}, evt));
|
|
}
|
|
});
|
|
},
|
|
initializePlugins: function initializePlugins(sortable, el, defaults, options) {
|
|
plugins.forEach(function (plugin) {
|
|
var pluginName = plugin.pluginName;
|
|
if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
|
|
var initialized = new plugin(sortable, el, sortable.options);
|
|
initialized.sortable = sortable;
|
|
initialized.options = sortable.options;
|
|
sortable[pluginName] = initialized; // Add default options from plugin
|
|
|
|
_extends(defaults, initialized.defaults);
|
|
});
|
|
|
|
for (var option in sortable.options) {
|
|
if (!sortable.options.hasOwnProperty(option)) continue;
|
|
var modified = this.modifyOption(sortable, option, sortable.options[option]);
|
|
|
|
if (typeof modified !== 'undefined') {
|
|
sortable.options[option] = modified;
|
|
}
|
|
}
|
|
},
|
|
getEventProperties: function getEventProperties(name, sortable) {
|
|
var eventProperties = {};
|
|
plugins.forEach(function (plugin) {
|
|
if (typeof plugin.eventProperties !== 'function') return;
|
|
|
|
_extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
|
|
});
|
|
return eventProperties;
|
|
},
|
|
modifyOption: function modifyOption(sortable, name, value) {
|
|
var modifiedValue;
|
|
plugins.forEach(function (plugin) {
|
|
// Plugin must exist on the Sortable
|
|
if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
|
|
|
|
if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {
|
|
modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
|
|
}
|
|
});
|
|
return modifiedValue;
|
|
}
|
|
};
|
|
|
|
function dispatchEvent(_ref) {
|
|
var sortable = _ref.sortable,
|
|
rootEl = _ref.rootEl,
|
|
name = _ref.name,
|
|
targetEl = _ref.targetEl,
|
|
cloneEl = _ref.cloneEl,
|
|
toEl = _ref.toEl,
|
|
fromEl = _ref.fromEl,
|
|
oldIndex = _ref.oldIndex,
|
|
newIndex = _ref.newIndex,
|
|
oldDraggableIndex = _ref.oldDraggableIndex,
|
|
newDraggableIndex = _ref.newDraggableIndex,
|
|
originalEvent = _ref.originalEvent,
|
|
putSortable = _ref.putSortable,
|
|
extraEventProperties = _ref.extraEventProperties;
|
|
sortable = sortable || rootEl && rootEl[expando];
|
|
if (!sortable) return;
|
|
var evt,
|
|
options = sortable.options,
|
|
onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature
|
|
|
|
if (window.CustomEvent && !IE11OrLess && !Edge) {
|
|
evt = new CustomEvent(name, {
|
|
bubbles: true,
|
|
cancelable: true
|
|
});
|
|
} else {
|
|
evt = document.createEvent('Event');
|
|
evt.initEvent(name, true, true);
|
|
}
|
|
|
|
evt.to = toEl || rootEl;
|
|
evt.from = fromEl || rootEl;
|
|
evt.item = targetEl || rootEl;
|
|
evt.clone = cloneEl;
|
|
evt.oldIndex = oldIndex;
|
|
evt.newIndex = newIndex;
|
|
evt.oldDraggableIndex = oldDraggableIndex;
|
|
evt.newDraggableIndex = newDraggableIndex;
|
|
evt.originalEvent = originalEvent;
|
|
evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
|
|
|
|
var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable));
|
|
|
|
for (var option in allEventProperties) {
|
|
evt[option] = allEventProperties[option];
|
|
}
|
|
|
|
if (rootEl) {
|
|
rootEl.dispatchEvent(evt);
|
|
}
|
|
|
|
if (options[onName]) {
|
|
options[onName].call(sortable, evt);
|
|
}
|
|
}
|
|
|
|
var pluginEvent = function pluginEvent(eventName, sortable) {
|
|
var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
|
|
originalEvent = _ref.evt,
|
|
data = _objectWithoutProperties(_ref, ["evt"]);
|
|
|
|
PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({
|
|
dragEl: dragEl,
|
|
parentEl: parentEl,
|
|
ghostEl: ghostEl,
|
|
rootEl: rootEl,
|
|
nextEl: nextEl,
|
|
lastDownEl: lastDownEl,
|
|
cloneEl: cloneEl,
|
|
cloneHidden: cloneHidden,
|
|
dragStarted: moved,
|
|
putSortable: putSortable,
|
|
activeSortable: Sortable.active,
|
|
originalEvent: originalEvent,
|
|
oldIndex: oldIndex,
|
|
oldDraggableIndex: oldDraggableIndex,
|
|
newIndex: newIndex,
|
|
newDraggableIndex: newDraggableIndex,
|
|
hideGhostForTarget: _hideGhostForTarget,
|
|
unhideGhostForTarget: _unhideGhostForTarget,
|
|
cloneNowHidden: function cloneNowHidden() {
|
|
cloneHidden = true;
|
|
},
|
|
cloneNowShown: function cloneNowShown() {
|
|
cloneHidden = false;
|
|
},
|
|
dispatchSortableEvent: function dispatchSortableEvent(name) {
|
|
_dispatchEvent({
|
|
sortable: sortable,
|
|
name: name,
|
|
originalEvent: originalEvent
|
|
});
|
|
}
|
|
}, data));
|
|
};
|
|
|
|
function _dispatchEvent(info) {
|
|
dispatchEvent(_objectSpread({
|
|
putSortable: putSortable,
|
|
cloneEl: cloneEl,
|
|
targetEl: dragEl,
|
|
rootEl: rootEl,
|
|
oldIndex: oldIndex,
|
|
oldDraggableIndex: oldDraggableIndex,
|
|
newIndex: newIndex,
|
|
newDraggableIndex: newDraggableIndex
|
|
}, info));
|
|
}
|
|
|
|
var dragEl,
|
|
parentEl,
|
|
ghostEl,
|
|
rootEl,
|
|
nextEl,
|
|
lastDownEl,
|
|
cloneEl,
|
|
cloneHidden,
|
|
oldIndex,
|
|
newIndex,
|
|
oldDraggableIndex,
|
|
newDraggableIndex,
|
|
activeGroup,
|
|
putSortable,
|
|
awaitingDragStarted = false,
|
|
ignoreNextClick = false,
|
|
sortables = [],
|
|
tapEvt,
|
|
touchEvt,
|
|
lastDx,
|
|
lastDy,
|
|
tapDistanceLeft,
|
|
tapDistanceTop,
|
|
moved,
|
|
lastTarget,
|
|
lastDirection,
|
|
pastFirstInvertThresh = false,
|
|
isCircumstantialInvert = false,
|
|
targetMoveDistance,
|
|
// For positioning ghost absolutely
|
|
ghostRelativeParent,
|
|
ghostRelativeParentInitialScroll = [],
|
|
// (left, top)
|
|
_silent = false,
|
|
savedInputChecked = [];
|
|
/** @const */
|
|
|
|
var documentExists = typeof document !== 'undefined',
|
|
PositionGhostAbsolutely = IOS,
|
|
CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',
|
|
// This will not pass for IE9, because IE9 DnD only works on anchors
|
|
supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),
|
|
supportCssPointerEvents = function () {
|
|
if (!documentExists) return; // false when <= IE11
|
|
|
|
if (IE11OrLess) {
|
|
return false;
|
|
}
|
|
|
|
var el = document.createElement('x');
|
|
el.style.cssText = 'pointer-events:auto';
|
|
return el.style.pointerEvents === 'auto';
|
|
}(),
|
|
_detectDirection = function _detectDirection(el, options) {
|
|
var elCSS = css(el),
|
|
elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),
|
|
child1 = getChild(el, 0, options),
|
|
child2 = getChild(el, 1, options),
|
|
firstChildCSS = child1 && css(child1),
|
|
secondChildCSS = child2 && css(child2),
|
|
firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,
|
|
secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;
|
|
|
|
if (elCSS.display === 'flex') {
|
|
return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';
|
|
}
|
|
|
|
if (elCSS.display === 'grid') {
|
|
return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';
|
|
}
|
|
|
|
if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') {
|
|
var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right';
|
|
return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';
|
|
}
|
|
|
|
return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';
|
|
},
|
|
_dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {
|
|
var dragElS1Opp = vertical ? dragRect.left : dragRect.top,
|
|
dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,
|
|
dragElOppLength = vertical ? dragRect.width : dragRect.height,
|
|
targetS1Opp = vertical ? targetRect.left : targetRect.top,
|
|
targetS2Opp = vertical ? targetRect.right : targetRect.bottom,
|
|
targetOppLength = vertical ? targetRect.width : targetRect.height;
|
|
return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;
|
|
},
|
|
|
|
/**
|
|
* Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
|
|
* @param {Number} x X position
|
|
* @param {Number} y Y position
|
|
* @return {HTMLElement} Element of the first found nearest Sortable
|
|
*/
|
|
_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
|
|
var ret;
|
|
sortables.some(function (sortable) {
|
|
if (lastChild(sortable)) return;
|
|
var rect = getRect(sortable),
|
|
threshold = sortable[expando].options.emptyInsertThreshold,
|
|
insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,
|
|
insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;
|
|
|
|
if (threshold && insideHorizontally && insideVertically) {
|
|
return ret = sortable;
|
|
}
|
|
});
|
|
return ret;
|
|
},
|
|
_prepareGroup = function _prepareGroup(options) {
|
|
function toFn(value, pull) {
|
|
return function (to, from, dragEl, evt) {
|
|
var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;
|
|
|
|
if (value == null && (pull || sameGroup)) {
|
|
// Default pull value
|
|
// Default pull and put value if same group
|
|
return true;
|
|
} else if (value == null || value === false) {
|
|
return false;
|
|
} else if (pull && value === 'clone') {
|
|
return value;
|
|
} else if (typeof value === 'function') {
|
|
return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);
|
|
} else {
|
|
var otherGroup = (pull ? to : from).options.group.name;
|
|
return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;
|
|
}
|
|
};
|
|
}
|
|
|
|
var group = {};
|
|
var originalGroup = options.group;
|
|
|
|
if (!originalGroup || _typeof(originalGroup) != 'object') {
|
|
originalGroup = {
|
|
name: originalGroup
|
|
};
|
|
}
|
|
|
|
group.name = originalGroup.name;
|
|
group.checkPull = toFn(originalGroup.pull, true);
|
|
group.checkPut = toFn(originalGroup.put);
|
|
group.revertClone = originalGroup.revertClone;
|
|
options.group = group;
|
|
},
|
|
_hideGhostForTarget = function _hideGhostForTarget() {
|
|
if (!supportCssPointerEvents && ghostEl) {
|
|
css(ghostEl, 'display', 'none');
|
|
}
|
|
},
|
|
_unhideGhostForTarget = function _unhideGhostForTarget() {
|
|
if (!supportCssPointerEvents && ghostEl) {
|
|
css(ghostEl, 'display', '');
|
|
}
|
|
}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position
|
|
|
|
|
|
if (documentExists) {
|
|
document.addEventListener('click', function (evt) {
|
|
if (ignoreNextClick) {
|
|
evt.preventDefault();
|
|
evt.stopPropagation && evt.stopPropagation();
|
|
evt.stopImmediatePropagation && evt.stopImmediatePropagation();
|
|
ignoreNextClick = false;
|
|
return false;
|
|
}
|
|
}, true);
|
|
}
|
|
|
|
var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {
|
|
if (dragEl) {
|
|
evt = evt.touches ? evt.touches[0] : evt;
|
|
|
|
var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);
|
|
|
|
if (nearest) {
|
|
// Create imitation event
|
|
var event = {};
|
|
|
|
for (var i in evt) {
|
|
if (evt.hasOwnProperty(i)) {
|
|
event[i] = evt[i];
|
|
}
|
|
}
|
|
|
|
event.target = event.rootEl = nearest;
|
|
event.preventDefault = void 0;
|
|
event.stopPropagation = void 0;
|
|
|
|
nearest[expando]._onDragOver(event);
|
|
}
|
|
}
|
|
};
|
|
|
|
var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {
|
|
if (dragEl) {
|
|
dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
|
|
}
|
|
};
|
|
/**
|
|
* @class Sortable
|
|
* @param {HTMLElement} el
|
|
* @param {Object} [options]
|
|
*/
|
|
|
|
|
|
function Sortable(el, options) {
|
|
if (!(el && el.nodeType && el.nodeType === 1)) {
|
|
throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el));
|
|
}
|
|
|
|
this.el = el; // root element
|
|
|
|
this.options = options = _extends({}, options); // Export instance
|
|
|
|
el[expando] = this;
|
|
var defaults = {
|
|
group: null,
|
|
sort: true,
|
|
disabled: false,
|
|
store: null,
|
|
handle: null,
|
|
draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',
|
|
swapThreshold: 1,
|
|
// percentage; 0 <= x <= 1
|
|
invertSwap: false,
|
|
// invert always
|
|
invertedSwapThreshold: null,
|
|
// will be set to same as swapThreshold if default
|
|
removeCloneOnHide: true,
|
|
direction: function direction() {
|
|
return _detectDirection(el, this.options);
|
|
},
|
|
ghostClass: 'sortable-ghost',
|
|
chosenClass: 'sortable-chosen',
|
|
dragClass: 'sortable-drag',
|
|
ignore: 'a, img',
|
|
filter: null,
|
|
preventOnFilter: true,
|
|
animation: 0,
|
|
easing: null,
|
|
setData: function setData(dataTransfer, dragEl) {
|
|
dataTransfer.setData('Text', dragEl.textContent);
|
|
},
|
|
dropBubble: false,
|
|
dragoverBubble: false,
|
|
dataIdAttr: 'data-id',
|
|
delay: 0,
|
|
delayOnTouchOnly: false,
|
|
touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,
|
|
forceFallback: false,
|
|
fallbackClass: 'sortable-fallback',
|
|
fallbackOnBody: false,
|
|
fallbackTolerance: 0,
|
|
fallbackOffset: {
|
|
x: 0,
|
|
y: 0
|
|
},
|
|
supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window,
|
|
emptyInsertThreshold: 5
|
|
};
|
|
PluginManager.initializePlugins(this, el, defaults); // Set default options
|
|
|
|
for (var name in defaults) {
|
|
!(name in options) && (options[name] = defaults[name]);
|
|
}
|
|
|
|
_prepareGroup(options); // Bind all private methods
|
|
|
|
|
|
for (var fn in this) {
|
|
if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
|
|
this[fn] = this[fn].bind(this);
|
|
}
|
|
} // Setup drag mode
|
|
|
|
|
|
this.nativeDraggable = options.forceFallback ? false : supportDraggable;
|
|
|
|
if (this.nativeDraggable) {
|
|
// Touch start threshold cannot be greater than the native dragstart threshold
|
|
this.options.touchStartThreshold = 1;
|
|
} // Bind events
|
|
|
|
|
|
if (options.supportPointer) {
|
|
on(el, 'pointerdown', this._onTapStart);
|
|
} else {
|
|
on(el, 'mousedown', this._onTapStart);
|
|
on(el, 'touchstart', this._onTapStart);
|
|
}
|
|
|
|
if (this.nativeDraggable) {
|
|
on(el, 'dragover', this);
|
|
on(el, 'dragenter', this);
|
|
}
|
|
|
|
sortables.push(this.el); // Restore sorting
|
|
|
|
options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager
|
|
|
|
_extends(this, AnimationStateManager());
|
|
}
|
|
|
|
Sortable.prototype =
|
|
/** @lends Sortable.prototype */
|
|
{
|
|
constructor: Sortable,
|
|
_isOutsideThisEl: function _isOutsideThisEl(target) {
|
|
if (!this.el.contains(target) && target !== this.el) {
|
|
lastTarget = null;
|
|
}
|
|
},
|
|
_getDirection: function _getDirection(evt, target) {
|
|
return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;
|
|
},
|
|
_onTapStart: function _onTapStart(
|
|
/** Event|TouchEvent */
|
|
evt) {
|
|
if (!evt.cancelable) return;
|
|
|
|
var _this = this,
|
|
el = this.el,
|
|
options = this.options,
|
|
preventOnFilter = options.preventOnFilter,
|
|
type = evt.type,
|
|
touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,
|
|
target = (touch || evt).target,
|
|
originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,
|
|
filter = options.filter;
|
|
|
|
_saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.
|
|
|
|
|
|
if (dragEl) {
|
|
return;
|
|
}
|
|
|
|
if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {
|
|
return; // only left button and enabled
|
|
} // cancel dnd if original target is content editable
|
|
|
|
|
|
if (originalTarget.isContentEditable) {
|
|
return;
|
|
}
|
|
|
|
target = closest(target, options.draggable, el, false);
|
|
|
|
if (target && target.animated) {
|
|
return;
|
|
}
|
|
|
|
if (lastDownEl === target) {
|
|
// Ignoring duplicate `down`
|
|
return;
|
|
} // Get the index of the dragged element within its parent
|
|
|
|
|
|
oldIndex = index(target);
|
|
oldDraggableIndex = index(target, options.draggable); // Check filter
|
|
|
|
if (typeof filter === 'function') {
|
|
if (filter.call(this, evt, target, this)) {
|
|
_dispatchEvent({
|
|
sortable: _this,
|
|
rootEl: originalTarget,
|
|
name: 'filter',
|
|
targetEl: target,
|
|
toEl: el,
|
|
fromEl: el
|
|
});
|
|
|
|
pluginEvent('filter', _this, {
|
|
evt: evt
|
|
});
|
|
preventOnFilter && evt.cancelable && evt.preventDefault();
|
|
return; // cancel dnd
|
|
}
|
|
} else if (filter) {
|
|
filter = filter.split(',').some(function (criteria) {
|
|
criteria = closest(originalTarget, criteria.trim(), el, false);
|
|
|
|
if (criteria) {
|
|
_dispatchEvent({
|
|
sortable: _this,
|
|
rootEl: criteria,
|
|
name: 'filter',
|
|
targetEl: target,
|
|
fromEl: el,
|
|
toEl: el
|
|
});
|
|
|
|
pluginEvent('filter', _this, {
|
|
evt: evt
|
|
});
|
|
return true;
|
|
}
|
|
});
|
|
|
|
if (filter) {
|
|
preventOnFilter && evt.cancelable && evt.preventDefault();
|
|
return; // cancel dnd
|
|
}
|
|
}
|
|
|
|
if (options.handle && !closest(originalTarget, options.handle, el, false)) {
|
|
return;
|
|
} // Prepare `dragstart`
|
|
|
|
|
|
this._prepareDragStart(evt, touch, target);
|
|
},
|
|
_prepareDragStart: function _prepareDragStart(
|
|
/** Event */
|
|
evt,
|
|
/** Touch */
|
|
touch,
|
|
/** HTMLElement */
|
|
target) {
|
|
var _this = this,
|
|
el = _this.el,
|
|
options = _this.options,
|
|
ownerDocument = el.ownerDocument,
|
|
dragStartFn;
|
|
|
|
if (target && !dragEl && target.parentNode === el) {
|
|
var dragRect = getRect(target);
|
|
rootEl = el;
|
|
dragEl = target;
|
|
parentEl = dragEl.parentNode;
|
|
nextEl = dragEl.nextSibling;
|
|
lastDownEl = target;
|
|
activeGroup = options.group;
|
|
Sortable.dragged = dragEl;
|
|
tapEvt = {
|
|
target: dragEl,
|
|
clientX: (touch || evt).clientX,
|
|
clientY: (touch || evt).clientY
|
|
};
|
|
tapDistanceLeft = tapEvt.clientX - dragRect.left;
|
|
tapDistanceTop = tapEvt.clientY - dragRect.top;
|
|
this._lastX = (touch || evt).clientX;
|
|
this._lastY = (touch || evt).clientY;
|
|
dragEl.style['will-change'] = 'all';
|
|
|
|
dragStartFn = function dragStartFn() {
|
|
pluginEvent('delayEnded', _this, {
|
|
evt: evt
|
|
});
|
|
|
|
if (Sortable.eventCanceled) {
|
|
_this._onDrop();
|
|
|
|
return;
|
|
} // Delayed drag has been triggered
|
|
// we can re-enable the events: touchmove/mousemove
|
|
|
|
|
|
_this._disableDelayedDragEvents();
|
|
|
|
if (!FireFox && _this.nativeDraggable) {
|
|
dragEl.draggable = true;
|
|
} // Bind the events: dragstart/dragend
|
|
|
|
|
|
_this._triggerDragStart(evt, touch); // Drag start event
|
|
|
|
|
|
_dispatchEvent({
|
|
sortable: _this,
|
|
name: 'choose',
|
|
originalEvent: evt
|
|
}); // Chosen item
|
|
|
|
|
|
toggleClass(dragEl, options.chosenClass, true);
|
|
}; // Disable "draggable"
|
|
|
|
|
|
options.ignore.split(',').forEach(function (criteria) {
|
|
find(dragEl, criteria.trim(), _disableDraggable);
|
|
});
|
|
on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);
|
|
on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);
|
|
on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);
|
|
on(ownerDocument, 'mouseup', _this._onDrop);
|
|
on(ownerDocument, 'touchend', _this._onDrop);
|
|
on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)
|
|
|
|
if (FireFox && this.nativeDraggable) {
|
|
this.options.touchStartThreshold = 4;
|
|
dragEl.draggable = true;
|
|
}
|
|
|
|
pluginEvent('delayStart', this, {
|
|
evt: evt
|
|
}); // Delay is impossible for native DnD in Edge or IE
|
|
|
|
if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {
|
|
if (Sortable.eventCanceled) {
|
|
this._onDrop();
|
|
|
|
return;
|
|
} // If the user moves the pointer or let go the click or touch
|
|
// before the delay has been reached:
|
|
// disable the delayed drag
|
|
|
|
|
|
on(ownerDocument, 'mouseup', _this._disableDelayedDrag);
|
|
on(ownerDocument, 'touchend', _this._disableDelayedDrag);
|
|
on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);
|
|
on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);
|
|
on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);
|
|
options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);
|
|
_this._dragStartTimer = setTimeout(dragStartFn, options.delay);
|
|
} else {
|
|
dragStartFn();
|
|
}
|
|
}
|
|
},
|
|
_delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(
|
|
/** TouchEvent|PointerEvent **/
|
|
e) {
|
|
var touch = e.touches ? e.touches[0] : e;
|
|
|
|
if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {
|
|
this._disableDelayedDrag();
|
|
}
|
|
},
|
|
_disableDelayedDrag: function _disableDelayedDrag() {
|
|
dragEl && _disableDraggable(dragEl);
|
|
clearTimeout(this._dragStartTimer);
|
|
|
|
this._disableDelayedDragEvents();
|
|
},
|
|
_disableDelayedDragEvents: function _disableDelayedDragEvents() {
|
|
var ownerDocument = this.el.ownerDocument;
|
|
off(ownerDocument, 'mouseup', this._disableDelayedDrag);
|
|
off(ownerDocument, 'touchend', this._disableDelayedDrag);
|
|
off(ownerDocument, 'touchcancel', this._disableDelayedDrag);
|
|
off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);
|
|
off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);
|
|
off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);
|
|
},
|
|
_triggerDragStart: function _triggerDragStart(
|
|
/** Event */
|
|
evt,
|
|
/** Touch */
|
|
touch) {
|
|
touch = touch || evt.pointerType == 'touch' && evt;
|
|
|
|
if (!this.nativeDraggable || touch) {
|
|
if (this.options.supportPointer) {
|
|
on(document, 'pointermove', this._onTouchMove);
|
|
} else if (touch) {
|
|
on(document, 'touchmove', this._onTouchMove);
|
|
} else {
|
|
on(document, 'mousemove', this._onTouchMove);
|
|
}
|
|
} else {
|
|
on(dragEl, 'dragend', this);
|
|
on(rootEl, 'dragstart', this._onDragStart);
|
|
}
|
|
|
|
try {
|
|
if (document.selection) {
|
|
// Timeout neccessary for IE9
|
|
_nextTick(function () {
|
|
document.selection.empty();
|
|
});
|
|
} else {
|
|
window.getSelection().removeAllRanges();
|
|
}
|
|
} catch (err) {}
|
|
},
|
|
_dragStarted: function _dragStarted(fallback, evt) {
|
|
|
|
awaitingDragStarted = false;
|
|
|
|
if (rootEl && dragEl) {
|
|
pluginEvent('dragStarted', this, {
|
|
evt: evt
|
|
});
|
|
|
|
if (this.nativeDraggable) {
|
|
on(document, 'dragover', _checkOutsideTargetEl);
|
|
}
|
|
|
|
var options = this.options; // Apply effect
|
|
|
|
!fallback && toggleClass(dragEl, options.dragClass, false);
|
|
toggleClass(dragEl, options.ghostClass, true);
|
|
Sortable.active = this;
|
|
fallback && this._appendGhost(); // Drag start event
|
|
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'start',
|
|
originalEvent: evt
|
|
});
|
|
} else {
|
|
this._nulling();
|
|
}
|
|
},
|
|
_emulateDragOver: function _emulateDragOver() {
|
|
if (touchEvt) {
|
|
this._lastX = touchEvt.clientX;
|
|
this._lastY = touchEvt.clientY;
|
|
|
|
_hideGhostForTarget();
|
|
|
|
var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
|
|
var parent = target;
|
|
|
|
while (target && target.shadowRoot) {
|
|
target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
|
|
if (target === parent) break;
|
|
parent = target;
|
|
}
|
|
|
|
dragEl.parentNode[expando]._isOutsideThisEl(target);
|
|
|
|
if (parent) {
|
|
do {
|
|
if (parent[expando]) {
|
|
var inserted = void 0;
|
|
inserted = parent[expando]._onDragOver({
|
|
clientX: touchEvt.clientX,
|
|
clientY: touchEvt.clientY,
|
|
target: target,
|
|
rootEl: parent
|
|
});
|
|
|
|
if (inserted && !this.options.dragoverBubble) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
target = parent; // store last element
|
|
}
|
|
/* jshint boss:true */
|
|
while (parent = parent.parentNode);
|
|
}
|
|
|
|
_unhideGhostForTarget();
|
|
}
|
|
},
|
|
_onTouchMove: function _onTouchMove(
|
|
/**TouchEvent*/
|
|
evt) {
|
|
if (tapEvt) {
|
|
var options = this.options,
|
|
fallbackTolerance = options.fallbackTolerance,
|
|
fallbackOffset = options.fallbackOffset,
|
|
touch = evt.touches ? evt.touches[0] : evt,
|
|
ghostMatrix = ghostEl && matrix(ghostEl, true),
|
|
scaleX = ghostEl && ghostMatrix && ghostMatrix.a,
|
|
scaleY = ghostEl && ghostMatrix && ghostMatrix.d,
|
|
relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),
|
|
dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),
|
|
dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging
|
|
|
|
if (!Sortable.active && !awaitingDragStarted) {
|
|
if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {
|
|
return;
|
|
}
|
|
|
|
this._onDragStart(evt, true);
|
|
}
|
|
|
|
if (ghostEl) {
|
|
if (ghostMatrix) {
|
|
ghostMatrix.e += dx - (lastDx || 0);
|
|
ghostMatrix.f += dy - (lastDy || 0);
|
|
} else {
|
|
ghostMatrix = {
|
|
a: 1,
|
|
b: 0,
|
|
c: 0,
|
|
d: 1,
|
|
e: dx,
|
|
f: dy
|
|
};
|
|
}
|
|
|
|
var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")");
|
|
css(ghostEl, 'webkitTransform', cssMatrix);
|
|
css(ghostEl, 'mozTransform', cssMatrix);
|
|
css(ghostEl, 'msTransform', cssMatrix);
|
|
css(ghostEl, 'transform', cssMatrix);
|
|
lastDx = dx;
|
|
lastDy = dy;
|
|
touchEvt = touch;
|
|
}
|
|
|
|
evt.cancelable && evt.preventDefault();
|
|
}
|
|
},
|
|
_appendGhost: function _appendGhost() {
|
|
// Bug if using scale(): https://stackoverflow.com/questions/2637058
|
|
// Not being adjusted for
|
|
if (!ghostEl) {
|
|
var container = this.options.fallbackOnBody ? document.body : rootEl,
|
|
rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),
|
|
options = this.options; // Position absolutely
|
|
|
|
if (PositionGhostAbsolutely) {
|
|
// Get relatively positioned parent
|
|
ghostRelativeParent = container;
|
|
|
|
while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {
|
|
ghostRelativeParent = ghostRelativeParent.parentNode;
|
|
}
|
|
|
|
if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {
|
|
if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();
|
|
rect.top += ghostRelativeParent.scrollTop;
|
|
rect.left += ghostRelativeParent.scrollLeft;
|
|
} else {
|
|
ghostRelativeParent = getWindowScrollingElement();
|
|
}
|
|
|
|
ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);
|
|
}
|
|
|
|
ghostEl = dragEl.cloneNode(true);
|
|
toggleClass(ghostEl, options.ghostClass, false);
|
|
toggleClass(ghostEl, options.fallbackClass, true);
|
|
toggleClass(ghostEl, options.dragClass, true);
|
|
css(ghostEl, 'transition', '');
|
|
css(ghostEl, 'transform', '');
|
|
css(ghostEl, 'box-sizing', 'border-box');
|
|
css(ghostEl, 'margin', 0);
|
|
css(ghostEl, 'top', rect.top);
|
|
css(ghostEl, 'left', rect.left);
|
|
css(ghostEl, 'width', rect.width);
|
|
css(ghostEl, 'height', rect.height);
|
|
css(ghostEl, 'opacity', '0.8');
|
|
css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');
|
|
css(ghostEl, 'zIndex', '100000');
|
|
css(ghostEl, 'pointerEvents', 'none');
|
|
Sortable.ghost = ghostEl;
|
|
container.appendChild(ghostEl); // Set transform-origin
|
|
|
|
css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');
|
|
}
|
|
},
|
|
_onDragStart: function _onDragStart(
|
|
/**Event*/
|
|
evt,
|
|
/**boolean*/
|
|
fallback) {
|
|
var _this = this;
|
|
|
|
var dataTransfer = evt.dataTransfer;
|
|
var options = _this.options;
|
|
pluginEvent('dragStart', this, {
|
|
evt: evt
|
|
});
|
|
|
|
if (Sortable.eventCanceled) {
|
|
this._onDrop();
|
|
|
|
return;
|
|
}
|
|
|
|
pluginEvent('setupClone', this);
|
|
|
|
if (!Sortable.eventCanceled) {
|
|
cloneEl = clone(dragEl);
|
|
cloneEl.draggable = false;
|
|
cloneEl.style['will-change'] = '';
|
|
|
|
this._hideClone();
|
|
|
|
toggleClass(cloneEl, this.options.chosenClass, false);
|
|
Sortable.clone = cloneEl;
|
|
} // #1143: IFrame support workaround
|
|
|
|
|
|
_this.cloneId = _nextTick(function () {
|
|
pluginEvent('clone', _this);
|
|
if (Sortable.eventCanceled) return;
|
|
|
|
if (!_this.options.removeCloneOnHide) {
|
|
rootEl.insertBefore(cloneEl, dragEl);
|
|
}
|
|
|
|
_this._hideClone();
|
|
|
|
_dispatchEvent({
|
|
sortable: _this,
|
|
name: 'clone'
|
|
});
|
|
});
|
|
!fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events
|
|
|
|
if (fallback) {
|
|
ignoreNextClick = true;
|
|
_this._loopId = setInterval(_this._emulateDragOver, 50);
|
|
} else {
|
|
// Undo what was set in _prepareDragStart before drag started
|
|
off(document, 'mouseup', _this._onDrop);
|
|
off(document, 'touchend', _this._onDrop);
|
|
off(document, 'touchcancel', _this._onDrop);
|
|
|
|
if (dataTransfer) {
|
|
dataTransfer.effectAllowed = 'move';
|
|
options.setData && options.setData.call(_this, dataTransfer, dragEl);
|
|
}
|
|
|
|
on(document, 'drop', _this); // #1276 fix:
|
|
|
|
css(dragEl, 'transform', 'translateZ(0)');
|
|
}
|
|
|
|
awaitingDragStarted = true;
|
|
_this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));
|
|
on(document, 'selectstart', _this);
|
|
moved = true;
|
|
|
|
if (Safari) {
|
|
css(document.body, 'user-select', 'none');
|
|
}
|
|
},
|
|
// Returns true - if no further action is needed (either inserted or another condition)
|
|
_onDragOver: function _onDragOver(
|
|
/**Event*/
|
|
evt) {
|
|
var el = this.el,
|
|
target = evt.target,
|
|
dragRect,
|
|
targetRect,
|
|
revert,
|
|
options = this.options,
|
|
group = options.group,
|
|
activeSortable = Sortable.active,
|
|
isOwner = activeGroup === group,
|
|
canSort = options.sort,
|
|
fromSortable = putSortable || activeSortable,
|
|
vertical,
|
|
_this = this,
|
|
completedFired = false;
|
|
|
|
if (_silent) return;
|
|
|
|
function dragOverEvent(name, extra) {
|
|
pluginEvent(name, _this, _objectSpread({
|
|
evt: evt,
|
|
isOwner: isOwner,
|
|
axis: vertical ? 'vertical' : 'horizontal',
|
|
revert: revert,
|
|
dragRect: dragRect,
|
|
targetRect: targetRect,
|
|
canSort: canSort,
|
|
fromSortable: fromSortable,
|
|
target: target,
|
|
completed: completed,
|
|
onMove: function onMove(target, after) {
|
|
return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);
|
|
},
|
|
changed: changed
|
|
}, extra));
|
|
} // Capture animation state
|
|
|
|
|
|
function capture() {
|
|
dragOverEvent('dragOverAnimationCapture');
|
|
|
|
_this.captureAnimationState();
|
|
|
|
if (_this !== fromSortable) {
|
|
fromSortable.captureAnimationState();
|
|
}
|
|
} // Return invocation when dragEl is inserted (or completed)
|
|
|
|
|
|
function completed(insertion) {
|
|
dragOverEvent('dragOverCompleted', {
|
|
insertion: insertion
|
|
});
|
|
|
|
if (insertion) {
|
|
// Clones must be hidden before folding animation to capture dragRectAbsolute properly
|
|
if (isOwner) {
|
|
activeSortable._hideClone();
|
|
} else {
|
|
activeSortable._showClone(_this);
|
|
}
|
|
|
|
if (_this !== fromSortable) {
|
|
// Set ghost class to new sortable's ghost class
|
|
toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);
|
|
toggleClass(dragEl, options.ghostClass, true);
|
|
}
|
|
|
|
if (putSortable !== _this && _this !== Sortable.active) {
|
|
putSortable = _this;
|
|
} else if (_this === Sortable.active && putSortable) {
|
|
putSortable = null;
|
|
} // Animation
|
|
|
|
|
|
if (fromSortable === _this) {
|
|
_this._ignoreWhileAnimating = target;
|
|
}
|
|
|
|
_this.animateAll(function () {
|
|
dragOverEvent('dragOverAnimationComplete');
|
|
_this._ignoreWhileAnimating = null;
|
|
});
|
|
|
|
if (_this !== fromSortable) {
|
|
fromSortable.animateAll();
|
|
fromSortable._ignoreWhileAnimating = null;
|
|
}
|
|
} // Null lastTarget if it is not inside a previously swapped element
|
|
|
|
|
|
if (target === dragEl && !dragEl.animated || target === el && !target.animated) {
|
|
lastTarget = null;
|
|
} // no bubbling and not fallback
|
|
|
|
|
|
if (!options.dragoverBubble && !evt.rootEl && target !== document) {
|
|
dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted
|
|
|
|
|
|
!insertion && nearestEmptyInsertDetectEvent(evt);
|
|
}
|
|
|
|
!options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();
|
|
return completedFired = true;
|
|
} // Call when dragEl has been inserted
|
|
|
|
|
|
function changed() {
|
|
newIndex = index(dragEl);
|
|
newDraggableIndex = index(dragEl, options.draggable);
|
|
|
|
_dispatchEvent({
|
|
sortable: _this,
|
|
name: 'change',
|
|
toEl: el,
|
|
newIndex: newIndex,
|
|
newDraggableIndex: newDraggableIndex,
|
|
originalEvent: evt
|
|
});
|
|
}
|
|
|
|
if (evt.preventDefault !== void 0) {
|
|
evt.cancelable && evt.preventDefault();
|
|
}
|
|
|
|
target = closest(target, options.draggable, el, true);
|
|
dragOverEvent('dragOver');
|
|
if (Sortable.eventCanceled) return completedFired;
|
|
|
|
if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {
|
|
return completed(false);
|
|
}
|
|
|
|
ignoreNextClick = false;
|
|
|
|
if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list
|
|
: putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {
|
|
vertical = this._getDirection(evt, target) === 'vertical';
|
|
dragRect = getRect(dragEl);
|
|
dragOverEvent('dragOverValid');
|
|
if (Sortable.eventCanceled) return completedFired;
|
|
|
|
if (revert) {
|
|
parentEl = rootEl; // actualization
|
|
|
|
capture();
|
|
|
|
this._hideClone();
|
|
|
|
dragOverEvent('revert');
|
|
|
|
if (!Sortable.eventCanceled) {
|
|
if (nextEl) {
|
|
rootEl.insertBefore(dragEl, nextEl);
|
|
} else {
|
|
rootEl.appendChild(dragEl);
|
|
}
|
|
}
|
|
|
|
return completed(true);
|
|
}
|
|
|
|
var elLastChild = lastChild(el, options.draggable);
|
|
|
|
if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {
|
|
// If already at end of list: Do not insert
|
|
if (elLastChild === dragEl) {
|
|
return completed(false);
|
|
} // assign target only if condition is true
|
|
|
|
|
|
if (elLastChild && el === evt.target) {
|
|
target = elLastChild;
|
|
}
|
|
|
|
if (target) {
|
|
targetRect = getRect(target);
|
|
}
|
|
|
|
if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
|
|
capture();
|
|
el.appendChild(dragEl);
|
|
parentEl = el; // actualization
|
|
|
|
changed();
|
|
return completed(true);
|
|
}
|
|
} else if (target.parentNode === el) {
|
|
targetRect = getRect(target);
|
|
var direction = 0,
|
|
targetBeforeFirstSwap,
|
|
differentLevel = dragEl.parentNode !== el,
|
|
differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),
|
|
side1 = vertical ? 'top' : 'left',
|
|
scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),
|
|
scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;
|
|
|
|
if (lastTarget !== target) {
|
|
targetBeforeFirstSwap = targetRect[side1];
|
|
pastFirstInvertThresh = false;
|
|
isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;
|
|
}
|
|
|
|
direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);
|
|
var sibling;
|
|
|
|
if (direction !== 0) {
|
|
// Check if target is beside dragEl in respective direction (ignoring hidden elements)
|
|
var dragIndex = index(dragEl);
|
|
|
|
do {
|
|
dragIndex -= direction;
|
|
sibling = parentEl.children[dragIndex];
|
|
} while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));
|
|
} // If dragEl is already beside target: Do not insert
|
|
|
|
|
|
if (direction === 0 || sibling === target) {
|
|
return completed(false);
|
|
}
|
|
|
|
lastTarget = target;
|
|
lastDirection = direction;
|
|
var nextSibling = target.nextElementSibling,
|
|
after = false;
|
|
after = direction === 1;
|
|
|
|
var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);
|
|
|
|
if (moveVector !== false) {
|
|
if (moveVector === 1 || moveVector === -1) {
|
|
after = moveVector === 1;
|
|
}
|
|
|
|
_silent = true;
|
|
setTimeout(_unsilent, 30);
|
|
capture();
|
|
|
|
if (after && !nextSibling) {
|
|
el.appendChild(dragEl);
|
|
} else {
|
|
target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
|
|
} // Undo chrome's scroll adjustment (has no effect on other browsers)
|
|
|
|
|
|
if (scrolledPastTop) {
|
|
scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);
|
|
}
|
|
|
|
parentEl = dragEl.parentNode; // actualization
|
|
// must be done before animation
|
|
|
|
if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {
|
|
targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);
|
|
}
|
|
|
|
changed();
|
|
return completed(true);
|
|
}
|
|
}
|
|
|
|
if (el.contains(dragEl)) {
|
|
return completed(false);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
},
|
|
_ignoreWhileAnimating: null,
|
|
_offMoveEvents: function _offMoveEvents() {
|
|
off(document, 'mousemove', this._onTouchMove);
|
|
off(document, 'touchmove', this._onTouchMove);
|
|
off(document, 'pointermove', this._onTouchMove);
|
|
off(document, 'dragover', nearestEmptyInsertDetectEvent);
|
|
off(document, 'mousemove', nearestEmptyInsertDetectEvent);
|
|
off(document, 'touchmove', nearestEmptyInsertDetectEvent);
|
|
},
|
|
_offUpEvents: function _offUpEvents() {
|
|
var ownerDocument = this.el.ownerDocument;
|
|
off(ownerDocument, 'mouseup', this._onDrop);
|
|
off(ownerDocument, 'touchend', this._onDrop);
|
|
off(ownerDocument, 'pointerup', this._onDrop);
|
|
off(ownerDocument, 'touchcancel', this._onDrop);
|
|
off(document, 'selectstart', this);
|
|
},
|
|
_onDrop: function _onDrop(
|
|
/**Event*/
|
|
evt) {
|
|
var el = this.el,
|
|
options = this.options; // Get the index of the dragged element within its parent
|
|
|
|
newIndex = index(dragEl);
|
|
newDraggableIndex = index(dragEl, options.draggable);
|
|
pluginEvent('drop', this, {
|
|
evt: evt
|
|
});
|
|
parentEl = dragEl && dragEl.parentNode; // Get again after plugin event
|
|
|
|
newIndex = index(dragEl);
|
|
newDraggableIndex = index(dragEl, options.draggable);
|
|
|
|
if (Sortable.eventCanceled) {
|
|
this._nulling();
|
|
|
|
return;
|
|
}
|
|
|
|
awaitingDragStarted = false;
|
|
isCircumstantialInvert = false;
|
|
pastFirstInvertThresh = false;
|
|
clearInterval(this._loopId);
|
|
clearTimeout(this._dragStartTimer);
|
|
|
|
_cancelNextTick(this.cloneId);
|
|
|
|
_cancelNextTick(this._dragStartId); // Unbind events
|
|
|
|
|
|
if (this.nativeDraggable) {
|
|
off(document, 'drop', this);
|
|
off(el, 'dragstart', this._onDragStart);
|
|
}
|
|
|
|
this._offMoveEvents();
|
|
|
|
this._offUpEvents();
|
|
|
|
if (Safari) {
|
|
css(document.body, 'user-select', '');
|
|
}
|
|
|
|
css(dragEl, 'transform', '');
|
|
|
|
if (evt) {
|
|
if (moved) {
|
|
evt.cancelable && evt.preventDefault();
|
|
!options.dropBubble && evt.stopPropagation();
|
|
}
|
|
|
|
ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);
|
|
|
|
if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {
|
|
// Remove clone(s)
|
|
cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);
|
|
}
|
|
|
|
if (dragEl) {
|
|
if (this.nativeDraggable) {
|
|
off(dragEl, 'dragend', this);
|
|
}
|
|
|
|
_disableDraggable(dragEl);
|
|
|
|
dragEl.style['will-change'] = ''; // Remove classes
|
|
// ghostClass is added in dragStarted
|
|
|
|
if (moved && !awaitingDragStarted) {
|
|
toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);
|
|
}
|
|
|
|
toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event
|
|
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'unchoose',
|
|
toEl: parentEl,
|
|
newIndex: null,
|
|
newDraggableIndex: null,
|
|
originalEvent: evt
|
|
});
|
|
|
|
if (rootEl !== parentEl) {
|
|
if (newIndex >= 0) {
|
|
// Add event
|
|
_dispatchEvent({
|
|
rootEl: parentEl,
|
|
name: 'add',
|
|
toEl: parentEl,
|
|
fromEl: rootEl,
|
|
originalEvent: evt
|
|
}); // Remove event
|
|
|
|
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'remove',
|
|
toEl: parentEl,
|
|
originalEvent: evt
|
|
}); // drag from one list and drop into another
|
|
|
|
|
|
_dispatchEvent({
|
|
rootEl: parentEl,
|
|
name: 'sort',
|
|
toEl: parentEl,
|
|
fromEl: rootEl,
|
|
originalEvent: evt
|
|
});
|
|
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'sort',
|
|
toEl: parentEl,
|
|
originalEvent: evt
|
|
});
|
|
}
|
|
|
|
putSortable && putSortable.save();
|
|
} else {
|
|
if (newIndex !== oldIndex) {
|
|
if (newIndex >= 0) {
|
|
// drag & drop within the same list
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'update',
|
|
toEl: parentEl,
|
|
originalEvent: evt
|
|
});
|
|
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'sort',
|
|
toEl: parentEl,
|
|
originalEvent: evt
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
if (Sortable.active) {
|
|
/* jshint eqnull:true */
|
|
if (newIndex == null || newIndex === -1) {
|
|
newIndex = oldIndex;
|
|
newDraggableIndex = oldDraggableIndex;
|
|
}
|
|
|
|
_dispatchEvent({
|
|
sortable: this,
|
|
name: 'end',
|
|
toEl: parentEl,
|
|
originalEvent: evt
|
|
}); // Save sorting
|
|
|
|
|
|
this.save();
|
|
}
|
|
}
|
|
}
|
|
|
|
this._nulling();
|
|
},
|
|
_nulling: function _nulling() {
|
|
pluginEvent('nulling', this);
|
|
rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;
|
|
savedInputChecked.forEach(function (el) {
|
|
el.checked = true;
|
|
});
|
|
savedInputChecked.length = lastDx = lastDy = 0;
|
|
},
|
|
handleEvent: function handleEvent(
|
|
/**Event*/
|
|
evt) {
|
|
switch (evt.type) {
|
|
case 'drop':
|
|
case 'dragend':
|
|
this._onDrop(evt);
|
|
|
|
break;
|
|
|
|
case 'dragenter':
|
|
case 'dragover':
|
|
if (dragEl) {
|
|
this._onDragOver(evt);
|
|
|
|
_globalDragOver(evt);
|
|
}
|
|
|
|
break;
|
|
|
|
case 'selectstart':
|
|
evt.preventDefault();
|
|
break;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Serializes the item into an array of string.
|
|
* @returns {String[]}
|
|
*/
|
|
toArray: function toArray() {
|
|
var order = [],
|
|
el,
|
|
children = this.el.children,
|
|
i = 0,
|
|
n = children.length,
|
|
options = this.options;
|
|
|
|
for (; i < n; i++) {
|
|
el = children[i];
|
|
|
|
if (closest(el, options.draggable, this.el, false)) {
|
|
order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));
|
|
}
|
|
}
|
|
|
|
return order;
|
|
},
|
|
|
|
/**
|
|
* Sorts the elements according to the array.
|
|
* @param {String[]} order order of the items
|
|
*/
|
|
sort: function sort(order) {
|
|
var items = {},
|
|
rootEl = this.el;
|
|
this.toArray().forEach(function (id, i) {
|
|
var el = rootEl.children[i];
|
|
|
|
if (closest(el, this.options.draggable, rootEl, false)) {
|
|
items[id] = el;
|
|
}
|
|
}, this);
|
|
order.forEach(function (id) {
|
|
if (items[id]) {
|
|
rootEl.removeChild(items[id]);
|
|
rootEl.appendChild(items[id]);
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Save the current sorting
|
|
*/
|
|
save: function save() {
|
|
var store = this.options.store;
|
|
store && store.set && store.set(this);
|
|
},
|
|
|
|
/**
|
|
* For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
|
|
* @param {HTMLElement} el
|
|
* @param {String} [selector] default: `options.draggable`
|
|
* @returns {HTMLElement|null}
|
|
*/
|
|
closest: function closest$1(el, selector) {
|
|
return closest(el, selector || this.options.draggable, this.el, false);
|
|
},
|
|
|
|
/**
|
|
* Set/get option
|
|
* @param {string} name
|
|
* @param {*} [value]
|
|
* @returns {*}
|
|
*/
|
|
option: function option(name, value) {
|
|
var options = this.options;
|
|
|
|
if (value === void 0) {
|
|
return options[name];
|
|
} else {
|
|
var modifiedValue = PluginManager.modifyOption(this, name, value);
|
|
|
|
if (typeof modifiedValue !== 'undefined') {
|
|
options[name] = modifiedValue;
|
|
} else {
|
|
options[name] = value;
|
|
}
|
|
|
|
if (name === 'group') {
|
|
_prepareGroup(options);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Destroy
|
|
*/
|
|
destroy: function destroy() {
|
|
pluginEvent('destroy', this);
|
|
var el = this.el;
|
|
el[expando] = null;
|
|
off(el, 'mousedown', this._onTapStart);
|
|
off(el, 'touchstart', this._onTapStart);
|
|
off(el, 'pointerdown', this._onTapStart);
|
|
|
|
if (this.nativeDraggable) {
|
|
off(el, 'dragover', this);
|
|
off(el, 'dragenter', this);
|
|
} // Remove draggable attributes
|
|
|
|
|
|
Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {
|
|
el.removeAttribute('draggable');
|
|
});
|
|
|
|
this._onDrop();
|
|
|
|
this._disableDelayedDragEvents();
|
|
|
|
sortables.splice(sortables.indexOf(this.el), 1);
|
|
this.el = el = null;
|
|
},
|
|
_hideClone: function _hideClone() {
|
|
if (!cloneHidden) {
|
|
pluginEvent('hideClone', this);
|
|
if (Sortable.eventCanceled) return;
|
|
css(cloneEl, 'display', 'none');
|
|
|
|
if (this.options.removeCloneOnHide && cloneEl.parentNode) {
|
|
cloneEl.parentNode.removeChild(cloneEl);
|
|
}
|
|
|
|
cloneHidden = true;
|
|
}
|
|
},
|
|
_showClone: function _showClone(putSortable) {
|
|
if (putSortable.lastPutMode !== 'clone') {
|
|
this._hideClone();
|
|
|
|
return;
|
|
}
|
|
|
|
if (cloneHidden) {
|
|
pluginEvent('showClone', this);
|
|
if (Sortable.eventCanceled) return; // show clone at dragEl or original position
|
|
|
|
if (rootEl.contains(dragEl) && !this.options.group.revertClone) {
|
|
rootEl.insertBefore(cloneEl, dragEl);
|
|
} else if (nextEl) {
|
|
rootEl.insertBefore(cloneEl, nextEl);
|
|
} else {
|
|
rootEl.appendChild(cloneEl);
|
|
}
|
|
|
|
if (this.options.group.revertClone) {
|
|
this.animate(dragEl, cloneEl);
|
|
}
|
|
|
|
css(cloneEl, 'display', '');
|
|
cloneHidden = false;
|
|
}
|
|
}
|
|
};
|
|
|
|
function _globalDragOver(
|
|
/**Event*/
|
|
evt) {
|
|
if (evt.dataTransfer) {
|
|
evt.dataTransfer.dropEffect = 'move';
|
|
}
|
|
|
|
evt.cancelable && evt.preventDefault();
|
|
}
|
|
|
|
function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {
|
|
var evt,
|
|
sortable = fromEl[expando],
|
|
onMoveFn = sortable.options.onMove,
|
|
retVal; // Support for new CustomEvent feature
|
|
|
|
if (window.CustomEvent && !IE11OrLess && !Edge) {
|
|
evt = new CustomEvent('move', {
|
|
bubbles: true,
|
|
cancelable: true
|
|
});
|
|
} else {
|
|
evt = document.createEvent('Event');
|
|
evt.initEvent('move', true, true);
|
|
}
|
|
|
|
evt.to = toEl;
|
|
evt.from = fromEl;
|
|
evt.dragged = dragEl;
|
|
evt.draggedRect = dragRect;
|
|
evt.related = targetEl || toEl;
|
|
evt.relatedRect = targetRect || getRect(toEl);
|
|
evt.willInsertAfter = willInsertAfter;
|
|
evt.originalEvent = originalEvent;
|
|
fromEl.dispatchEvent(evt);
|
|
|
|
if (onMoveFn) {
|
|
retVal = onMoveFn.call(sortable, evt, originalEvent);
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
function _disableDraggable(el) {
|
|
el.draggable = false;
|
|
}
|
|
|
|
function _unsilent() {
|
|
_silent = false;
|
|
}
|
|
|
|
function _ghostIsLast(evt, vertical, sortable) {
|
|
var rect = getRect(lastChild(sortable.el, sortable.options.draggable));
|
|
var spacer = 10;
|
|
return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;
|
|
}
|
|
|
|
function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {
|
|
var mouseOnAxis = vertical ? evt.clientY : evt.clientX,
|
|
targetLength = vertical ? targetRect.height : targetRect.width,
|
|
targetS1 = vertical ? targetRect.top : targetRect.left,
|
|
targetS2 = vertical ? targetRect.bottom : targetRect.right,
|
|
invert = false;
|
|
|
|
if (!invertSwap) {
|
|
// Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold
|
|
if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {
|
|
// multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2
|
|
// check if past first invert threshold on side opposite of lastDirection
|
|
if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {
|
|
// past first invert threshold, do not restrict inverted threshold to dragEl shadow
|
|
pastFirstInvertThresh = true;
|
|
}
|
|
|
|
if (!pastFirstInvertThresh) {
|
|
// dragEl shadow (target move distance shadow)
|
|
if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow
|
|
: mouseOnAxis > targetS2 - targetMoveDistance) {
|
|
return -lastDirection;
|
|
}
|
|
} else {
|
|
invert = true;
|
|
}
|
|
} else {
|
|
// Regular
|
|
if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {
|
|
return _getInsertDirection(target);
|
|
}
|
|
}
|
|
}
|
|
|
|
invert = invert || invertSwap;
|
|
|
|
if (invert) {
|
|
// Invert of regular
|
|
if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {
|
|
return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
/**
|
|
* Gets the direction dragEl must be swapped relative to target in order to make it
|
|
* seem that dragEl has been "inserted" into that element's position
|
|
* @param {HTMLElement} target The target whose position dragEl is being inserted at
|
|
* @return {Number} Direction dragEl must be swapped
|
|
*/
|
|
|
|
|
|
function _getInsertDirection(target) {
|
|
if (index(dragEl) < index(target)) {
|
|
return 1;
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
/**
|
|
* Generate id
|
|
* @param {HTMLElement} el
|
|
* @returns {String}
|
|
* @private
|
|
*/
|
|
|
|
|
|
function _generateId(el) {
|
|
var str = el.tagName + el.className + el.src + el.href + el.textContent,
|
|
i = str.length,
|
|
sum = 0;
|
|
|
|
while (i--) {
|
|
sum += str.charCodeAt(i);
|
|
}
|
|
|
|
return sum.toString(36);
|
|
}
|
|
|
|
function _saveInputCheckedState(root) {
|
|
savedInputChecked.length = 0;
|
|
var inputs = root.getElementsByTagName('input');
|
|
var idx = inputs.length;
|
|
|
|
while (idx--) {
|
|
var el = inputs[idx];
|
|
el.checked && savedInputChecked.push(el);
|
|
}
|
|
}
|
|
|
|
function _nextTick(fn) {
|
|
return setTimeout(fn, 0);
|
|
}
|
|
|
|
function _cancelNextTick(id) {
|
|
return clearTimeout(id);
|
|
} // Fixed #973:
|
|
|
|
|
|
if (documentExists) {
|
|
on(document, 'touchmove', function (evt) {
|
|
if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {
|
|
evt.preventDefault();
|
|
}
|
|
});
|
|
} // Export utils
|
|
|
|
|
|
Sortable.utils = {
|
|
on: on,
|
|
off: off,
|
|
css: css,
|
|
find: find,
|
|
is: function is(el, selector) {
|
|
return !!closest(el, selector, el, false);
|
|
},
|
|
extend: extend,
|
|
throttle: throttle,
|
|
closest: closest,
|
|
toggleClass: toggleClass,
|
|
clone: clone,
|
|
index: index,
|
|
nextTick: _nextTick,
|
|
cancelNextTick: _cancelNextTick,
|
|
detectDirection: _detectDirection,
|
|
getChild: getChild
|
|
};
|
|
/**
|
|
* Get the Sortable instance of an element
|
|
* @param {HTMLElement} element The element
|
|
* @return {Sortable|undefined} The instance of Sortable
|
|
*/
|
|
|
|
Sortable.get = function (element) {
|
|
return element[expando];
|
|
};
|
|
/**
|
|
* Mount a plugin to Sortable
|
|
* @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
|
|
*/
|
|
|
|
|
|
Sortable.mount = function () {
|
|
for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
plugins[_key] = arguments[_key];
|
|
}
|
|
|
|
if (plugins[0].constructor === Array) plugins = plugins[0];
|
|
plugins.forEach(function (plugin) {
|
|
if (!plugin.prototype || !plugin.prototype.constructor) {
|
|
throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin));
|
|
}
|
|
|
|
if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils);
|
|
PluginManager.mount(plugin);
|
|
});
|
|
};
|
|
/**
|
|
* Create sortable instance
|
|
* @param {HTMLElement} el
|
|
* @param {Object} [options]
|
|
*/
|
|
|
|
|
|
Sortable.create = function (el, options) {
|
|
return new Sortable(el, options);
|
|
}; // Export
|
|
|
|
|
|
Sortable.version = version;
|
|
|
|
var autoScrolls = [],
|
|
scrollEl,
|
|
scrollRootEl,
|
|
scrolling = false,
|
|
lastAutoScrollX,
|
|
lastAutoScrollY,
|
|
touchEvt$1,
|
|
pointerElemChangedInterval;
|
|
|
|
function AutoScrollPlugin() {
|
|
function AutoScroll() {
|
|
this.defaults = {
|
|
scroll: true,
|
|
scrollSensitivity: 30,
|
|
scrollSpeed: 10,
|
|
bubbleScroll: true
|
|
}; // Bind all private methods
|
|
|
|
for (var fn in this) {
|
|
if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
|
|
this[fn] = this[fn].bind(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
AutoScroll.prototype = {
|
|
dragStarted: function dragStarted(_ref) {
|
|
var originalEvent = _ref.originalEvent;
|
|
|
|
if (this.sortable.nativeDraggable) {
|
|
on(document, 'dragover', this._handleAutoScroll);
|
|
} else {
|
|
if (this.options.supportPointer) {
|
|
on(document, 'pointermove', this._handleFallbackAutoScroll);
|
|
} else if (originalEvent.touches) {
|
|
on(document, 'touchmove', this._handleFallbackAutoScroll);
|
|
} else {
|
|
on(document, 'mousemove', this._handleFallbackAutoScroll);
|
|
}
|
|
}
|
|
},
|
|
dragOverCompleted: function dragOverCompleted(_ref2) {
|
|
var originalEvent = _ref2.originalEvent;
|
|
|
|
// For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
|
|
if (!this.options.dragOverBubble && !originalEvent.rootEl) {
|
|
this._handleAutoScroll(originalEvent);
|
|
}
|
|
},
|
|
drop: function drop() {
|
|
if (this.sortable.nativeDraggable) {
|
|
off(document, 'dragover', this._handleAutoScroll);
|
|
} else {
|
|
off(document, 'pointermove', this._handleFallbackAutoScroll);
|
|
off(document, 'touchmove', this._handleFallbackAutoScroll);
|
|
off(document, 'mousemove', this._handleFallbackAutoScroll);
|
|
}
|
|
|
|
clearPointerElemChangedInterval();
|
|
clearAutoScrolls();
|
|
cancelThrottle();
|
|
},
|
|
nulling: function nulling() {
|
|
touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
|
|
autoScrolls.length = 0;
|
|
},
|
|
_handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {
|
|
this._handleAutoScroll(evt, true);
|
|
},
|
|
_handleAutoScroll: function _handleAutoScroll(evt, fallback) {
|
|
var _this = this;
|
|
|
|
var x = (evt.touches ? evt.touches[0] : evt).clientX,
|
|
y = (evt.touches ? evt.touches[0] : evt).clientY,
|
|
elem = document.elementFromPoint(x, y);
|
|
touchEvt$1 = evt; // IE does not seem to have native autoscroll,
|
|
// Edge's autoscroll seems too conditional,
|
|
// MACOS Safari does not have autoscroll,
|
|
// Firefox and Chrome are good
|
|
|
|
if (fallback || Edge || IE11OrLess || Safari) {
|
|
autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change
|
|
|
|
var ogElemScroller = getParentAutoScrollElement(elem, true);
|
|
|
|
if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {
|
|
pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour
|
|
|
|
pointerElemChangedInterval = setInterval(function () {
|
|
var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
|
|
|
|
if (newElem !== ogElemScroller) {
|
|
ogElemScroller = newElem;
|
|
clearAutoScrolls();
|
|
}
|
|
|
|
autoScroll(evt, _this.options, newElem, fallback);
|
|
}, 10);
|
|
lastAutoScrollX = x;
|
|
lastAutoScrollY = y;
|
|
}
|
|
} else {
|
|
// if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
|
|
if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
|
|
clearAutoScrolls();
|
|
return;
|
|
}
|
|
|
|
autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
|
|
}
|
|
}
|
|
};
|
|
return _extends(AutoScroll, {
|
|
pluginName: 'scroll',
|
|
initializeByDefault: true
|
|
});
|
|
}
|
|
|
|
function clearAutoScrolls() {
|
|
autoScrolls.forEach(function (autoScroll) {
|
|
clearInterval(autoScroll.pid);
|
|
});
|
|
autoScrolls = [];
|
|
}
|
|
|
|
function clearPointerElemChangedInterval() {
|
|
clearInterval(pointerElemChangedInterval);
|
|
}
|
|
|
|
var autoScroll = throttle(function (evt, options, rootEl, isFallback) {
|
|
// Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
|
|
if (!options.scroll) return;
|
|
var x = (evt.touches ? evt.touches[0] : evt).clientX,
|
|
y = (evt.touches ? evt.touches[0] : evt).clientY,
|
|
sens = options.scrollSensitivity,
|
|
speed = options.scrollSpeed,
|
|
winScroller = getWindowScrollingElement();
|
|
var scrollThisInstance = false,
|
|
scrollCustomFn; // New scroll root, set scrollEl
|
|
|
|
if (scrollRootEl !== rootEl) {
|
|
scrollRootEl = rootEl;
|
|
clearAutoScrolls();
|
|
scrollEl = options.scroll;
|
|
scrollCustomFn = options.scrollFn;
|
|
|
|
if (scrollEl === true) {
|
|
scrollEl = getParentAutoScrollElement(rootEl, true);
|
|
}
|
|
}
|
|
|
|
var layersOut = 0;
|
|
var currentParent = scrollEl;
|
|
|
|
do {
|
|
var el = currentParent,
|
|
rect = getRect(el),
|
|
top = rect.top,
|
|
bottom = rect.bottom,
|
|
left = rect.left,
|
|
right = rect.right,
|
|
width = rect.width,
|
|
height = rect.height,
|
|
canScrollX = void 0,
|
|
canScrollY = void 0,
|
|
scrollWidth = el.scrollWidth,
|
|
scrollHeight = el.scrollHeight,
|
|
elCSS = css(el),
|
|
scrollPosX = el.scrollLeft,
|
|
scrollPosY = el.scrollTop;
|
|
|
|
if (el === winScroller) {
|
|
canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
|
|
canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
|
|
} else {
|
|
canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
|
|
canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
|
|
}
|
|
|
|
var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
|
|
var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
|
|
|
|
if (!autoScrolls[layersOut]) {
|
|
for (var i = 0; i <= layersOut; i++) {
|
|
if (!autoScrolls[i]) {
|
|
autoScrolls[i] = {};
|
|
}
|
|
}
|
|
}
|
|
|
|
if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
|
|
autoScrolls[layersOut].el = el;
|
|
autoScrolls[layersOut].vx = vx;
|
|
autoScrolls[layersOut].vy = vy;
|
|
clearInterval(autoScrolls[layersOut].pid);
|
|
|
|
if (vx != 0 || vy != 0) {
|
|
scrollThisInstance = true;
|
|
/* jshint loopfunc:true */
|
|
|
|
autoScrolls[layersOut].pid = setInterval(function () {
|
|
// emulate drag over during autoscroll (fallback), emulating native DnD behaviour
|
|
if (isFallback && this.layer === 0) {
|
|
Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
|
|
|
|
}
|
|
|
|
var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
|
|
var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
|
|
|
|
if (typeof scrollCustomFn === 'function') {
|
|
if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {
|
|
return;
|
|
}
|
|
}
|
|
|
|
scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
|
|
}.bind({
|
|
layer: layersOut
|
|
}), 24);
|
|
}
|
|
}
|
|
|
|
layersOut++;
|
|
} while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
|
|
|
|
scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
|
|
}, 30);
|
|
|
|
var drop = function drop(_ref) {
|
|
var originalEvent = _ref.originalEvent,
|
|
putSortable = _ref.putSortable,
|
|
dragEl = _ref.dragEl,
|
|
activeSortable = _ref.activeSortable,
|
|
dispatchSortableEvent = _ref.dispatchSortableEvent,
|
|
hideGhostForTarget = _ref.hideGhostForTarget,
|
|
unhideGhostForTarget = _ref.unhideGhostForTarget;
|
|
if (!originalEvent) return;
|
|
var toSortable = putSortable || activeSortable;
|
|
hideGhostForTarget();
|
|
var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
|
|
var target = document.elementFromPoint(touch.clientX, touch.clientY);
|
|
unhideGhostForTarget();
|
|
|
|
if (toSortable && !toSortable.el.contains(target)) {
|
|
dispatchSortableEvent('spill');
|
|
this.onSpill({
|
|
dragEl: dragEl,
|
|
putSortable: putSortable
|
|
});
|
|
}
|
|
};
|
|
|
|
function Revert() {}
|
|
|
|
Revert.prototype = {
|
|
startIndex: null,
|
|
dragStart: function dragStart(_ref2) {
|
|
var oldDraggableIndex = _ref2.oldDraggableIndex;
|
|
this.startIndex = oldDraggableIndex;
|
|
},
|
|
onSpill: function onSpill(_ref3) {
|
|
var dragEl = _ref3.dragEl,
|
|
putSortable = _ref3.putSortable;
|
|
this.sortable.captureAnimationState();
|
|
|
|
if (putSortable) {
|
|
putSortable.captureAnimationState();
|
|
}
|
|
|
|
var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
|
|
|
|
if (nextSibling) {
|
|
this.sortable.el.insertBefore(dragEl, nextSibling);
|
|
} else {
|
|
this.sortable.el.appendChild(dragEl);
|
|
}
|
|
|
|
this.sortable.animateAll();
|
|
|
|
if (putSortable) {
|
|
putSortable.animateAll();
|
|
}
|
|
},
|
|
drop: drop
|
|
};
|
|
|
|
_extends(Revert, {
|
|
pluginName: 'revertOnSpill'
|
|
});
|
|
|
|
function Remove() {}
|
|
|
|
Remove.prototype = {
|
|
onSpill: function onSpill(_ref4) {
|
|
var dragEl = _ref4.dragEl,
|
|
putSortable = _ref4.putSortable;
|
|
var parentSortable = putSortable || this.sortable;
|
|
parentSortable.captureAnimationState();
|
|
dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
|
|
parentSortable.animateAll();
|
|
},
|
|
drop: drop
|
|
};
|
|
|
|
_extends(Remove, {
|
|
pluginName: 'removeOnSpill'
|
|
});
|
|
|
|
var lastSwapEl;
|
|
|
|
function SwapPlugin() {
|
|
function Swap() {
|
|
this.defaults = {
|
|
swapClass: 'sortable-swap-highlight'
|
|
};
|
|
}
|
|
|
|
Swap.prototype = {
|
|
dragStart: function dragStart(_ref) {
|
|
var dragEl = _ref.dragEl;
|
|
lastSwapEl = dragEl;
|
|
},
|
|
dragOverValid: function dragOverValid(_ref2) {
|
|
var completed = _ref2.completed,
|
|
target = _ref2.target,
|
|
onMove = _ref2.onMove,
|
|
activeSortable = _ref2.activeSortable,
|
|
changed = _ref2.changed,
|
|
cancel = _ref2.cancel;
|
|
if (!activeSortable.options.swap) return;
|
|
var el = this.sortable.el,
|
|
options = this.options;
|
|
|
|
if (target && target !== el) {
|
|
var prevSwapEl = lastSwapEl;
|
|
|
|
if (onMove(target) !== false) {
|
|
toggleClass(target, options.swapClass, true);
|
|
lastSwapEl = target;
|
|
} else {
|
|
lastSwapEl = null;
|
|
}
|
|
|
|
if (prevSwapEl && prevSwapEl !== lastSwapEl) {
|
|
toggleClass(prevSwapEl, options.swapClass, false);
|
|
}
|
|
}
|
|
|
|
changed();
|
|
completed(true);
|
|
cancel();
|
|
},
|
|
drop: function drop(_ref3) {
|
|
var activeSortable = _ref3.activeSortable,
|
|
putSortable = _ref3.putSortable,
|
|
dragEl = _ref3.dragEl;
|
|
var toSortable = putSortable || this.sortable;
|
|
var options = this.options;
|
|
lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);
|
|
|
|
if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {
|
|
if (dragEl !== lastSwapEl) {
|
|
toSortable.captureAnimationState();
|
|
if (toSortable !== activeSortable) activeSortable.captureAnimationState();
|
|
swapNodes(dragEl, lastSwapEl);
|
|
toSortable.animateAll();
|
|
if (toSortable !== activeSortable) activeSortable.animateAll();
|
|
}
|
|
}
|
|
},
|
|
nulling: function nulling() {
|
|
lastSwapEl = null;
|
|
}
|
|
};
|
|
return _extends(Swap, {
|
|
pluginName: 'swap',
|
|
eventProperties: function eventProperties() {
|
|
return {
|
|
swapItem: lastSwapEl
|
|
};
|
|
}
|
|
});
|
|
}
|
|
|
|
function swapNodes(n1, n2) {
|
|
var p1 = n1.parentNode,
|
|
p2 = n2.parentNode,
|
|
i1,
|
|
i2;
|
|
if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;
|
|
i1 = index(n1);
|
|
i2 = index(n2);
|
|
|
|
if (p1.isEqualNode(p2) && i1 < i2) {
|
|
i2++;
|
|
}
|
|
|
|
p1.insertBefore(n2, p1.children[i1]);
|
|
p2.insertBefore(n1, p2.children[i2]);
|
|
}
|
|
|
|
var multiDragElements = [],
|
|
multiDragClones = [],
|
|
lastMultiDragSelect,
|
|
// for selection with modifier key down (SHIFT)
|
|
multiDragSortable,
|
|
initialFolding = false,
|
|
// Initial multi-drag fold when drag started
|
|
folding = false,
|
|
// Folding any other time
|
|
dragStarted = false,
|
|
dragEl$1,
|
|
clonesFromRect,
|
|
clonesHidden;
|
|
|
|
function MultiDragPlugin() {
|
|
function MultiDrag(sortable) {
|
|
// Bind all private methods
|
|
for (var fn in this) {
|
|
if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
|
|
this[fn] = this[fn].bind(this);
|
|
}
|
|
}
|
|
|
|
if (sortable.options.supportPointer) {
|
|
on(document, 'pointerup', this._deselectMultiDrag);
|
|
} else {
|
|
on(document, 'mouseup', this._deselectMultiDrag);
|
|
on(document, 'touchend', this._deselectMultiDrag);
|
|
}
|
|
|
|
on(document, 'keydown', this._checkKeyDown);
|
|
on(document, 'keyup', this._checkKeyUp);
|
|
this.defaults = {
|
|
selectedClass: 'sortable-selected',
|
|
multiDragKey: null,
|
|
setData: function setData(dataTransfer, dragEl) {
|
|
var data = '';
|
|
|
|
if (multiDragElements.length && multiDragSortable === sortable) {
|
|
multiDragElements.forEach(function (multiDragElement, i) {
|
|
data += (!i ? '' : ', ') + multiDragElement.textContent;
|
|
});
|
|
} else {
|
|
data = dragEl.textContent;
|
|
}
|
|
|
|
dataTransfer.setData('Text', data);
|
|
}
|
|
};
|
|
}
|
|
|
|
MultiDrag.prototype = {
|
|
multiDragKeyDown: false,
|
|
isMultiDrag: false,
|
|
delayStartGlobal: function delayStartGlobal(_ref) {
|
|
var dragged = _ref.dragEl;
|
|
dragEl$1 = dragged;
|
|
},
|
|
delayEnded: function delayEnded() {
|
|
this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);
|
|
},
|
|
setupClone: function setupClone(_ref2) {
|
|
var sortable = _ref2.sortable,
|
|
cancel = _ref2.cancel;
|
|
if (!this.isMultiDrag) return;
|
|
|
|
for (var i = 0; i < multiDragElements.length; i++) {
|
|
multiDragClones.push(clone(multiDragElements[i]));
|
|
multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;
|
|
multiDragClones[i].draggable = false;
|
|
multiDragClones[i].style['will-change'] = '';
|
|
toggleClass(multiDragClones[i], this.options.selectedClass, false);
|
|
multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);
|
|
}
|
|
|
|
sortable._hideClone();
|
|
|
|
cancel();
|
|
},
|
|
clone: function clone(_ref3) {
|
|
var sortable = _ref3.sortable,
|
|
rootEl = _ref3.rootEl,
|
|
dispatchSortableEvent = _ref3.dispatchSortableEvent,
|
|
cancel = _ref3.cancel;
|
|
if (!this.isMultiDrag) return;
|
|
|
|
if (!this.options.removeCloneOnHide) {
|
|
if (multiDragElements.length && multiDragSortable === sortable) {
|
|
insertMultiDragClones(true, rootEl);
|
|
dispatchSortableEvent('clone');
|
|
cancel();
|
|
}
|
|
}
|
|
},
|
|
showClone: function showClone(_ref4) {
|
|
var cloneNowShown = _ref4.cloneNowShown,
|
|
rootEl = _ref4.rootEl,
|
|
cancel = _ref4.cancel;
|
|
if (!this.isMultiDrag) return;
|
|
insertMultiDragClones(false, rootEl);
|
|
multiDragClones.forEach(function (clone) {
|
|
css(clone, 'display', '');
|
|
});
|
|
cloneNowShown();
|
|
clonesHidden = false;
|
|
cancel();
|
|
},
|
|
hideClone: function hideClone(_ref5) {
|
|
var _this = this;
|
|
|
|
var sortable = _ref5.sortable,
|
|
cloneNowHidden = _ref5.cloneNowHidden,
|
|
cancel = _ref5.cancel;
|
|
if (!this.isMultiDrag) return;
|
|
multiDragClones.forEach(function (clone) {
|
|
css(clone, 'display', 'none');
|
|
|
|
if (_this.options.removeCloneOnHide && clone.parentNode) {
|
|
clone.parentNode.removeChild(clone);
|
|
}
|
|
});
|
|
cloneNowHidden();
|
|
clonesHidden = true;
|
|
cancel();
|
|
},
|
|
dragStartGlobal: function dragStartGlobal(_ref6) {
|
|
var sortable = _ref6.sortable;
|
|
|
|
if (!this.isMultiDrag && multiDragSortable) {
|
|
multiDragSortable.multiDrag._deselectMultiDrag();
|
|
}
|
|
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
multiDragElement.sortableIndex = index(multiDragElement);
|
|
}); // Sort multi-drag elements
|
|
|
|
multiDragElements = multiDragElements.sort(function (a, b) {
|
|
return a.sortableIndex - b.sortableIndex;
|
|
});
|
|
dragStarted = true;
|
|
},
|
|
dragStarted: function dragStarted(_ref7) {
|
|
var _this2 = this;
|
|
|
|
var sortable = _ref7.sortable;
|
|
if (!this.isMultiDrag) return;
|
|
|
|
if (this.options.sort) {
|
|
// Capture rects,
|
|
// hide multi drag elements (by positioning them absolute),
|
|
// set multi drag elements rects to dragRect,
|
|
// show multi drag elements,
|
|
// animate to rects,
|
|
// unset rects & remove from DOM
|
|
sortable.captureAnimationState();
|
|
|
|
if (this.options.animation) {
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
if (multiDragElement === dragEl$1) return;
|
|
css(multiDragElement, 'position', 'absolute');
|
|
});
|
|
var dragRect = getRect(dragEl$1, false, true, true);
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
if (multiDragElement === dragEl$1) return;
|
|
setRect(multiDragElement, dragRect);
|
|
});
|
|
folding = true;
|
|
initialFolding = true;
|
|
}
|
|
}
|
|
|
|
sortable.animateAll(function () {
|
|
folding = false;
|
|
initialFolding = false;
|
|
|
|
if (_this2.options.animation) {
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
unsetRect(multiDragElement);
|
|
});
|
|
} // Remove all auxiliary multidrag items from el, if sorting enabled
|
|
|
|
|
|
if (_this2.options.sort) {
|
|
removeMultiDragElements();
|
|
}
|
|
});
|
|
},
|
|
dragOver: function dragOver(_ref8) {
|
|
var target = _ref8.target,
|
|
completed = _ref8.completed,
|
|
cancel = _ref8.cancel;
|
|
|
|
if (folding && ~multiDragElements.indexOf(target)) {
|
|
completed(false);
|
|
cancel();
|
|
}
|
|
},
|
|
revert: function revert(_ref9) {
|
|
var fromSortable = _ref9.fromSortable,
|
|
rootEl = _ref9.rootEl,
|
|
sortable = _ref9.sortable,
|
|
dragRect = _ref9.dragRect;
|
|
|
|
if (multiDragElements.length > 1) {
|
|
// Setup unfold animation
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
sortable.addAnimationState({
|
|
target: multiDragElement,
|
|
rect: folding ? getRect(multiDragElement) : dragRect
|
|
});
|
|
unsetRect(multiDragElement);
|
|
multiDragElement.fromRect = dragRect;
|
|
fromSortable.removeAnimationState(multiDragElement);
|
|
});
|
|
folding = false;
|
|
insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);
|
|
}
|
|
},
|
|
dragOverCompleted: function dragOverCompleted(_ref10) {
|
|
var sortable = _ref10.sortable,
|
|
isOwner = _ref10.isOwner,
|
|
insertion = _ref10.insertion,
|
|
activeSortable = _ref10.activeSortable,
|
|
parentEl = _ref10.parentEl,
|
|
putSortable = _ref10.putSortable;
|
|
var options = this.options;
|
|
|
|
if (insertion) {
|
|
// Clones must be hidden before folding animation to capture dragRectAbsolute properly
|
|
if (isOwner) {
|
|
activeSortable._hideClone();
|
|
}
|
|
|
|
initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location
|
|
|
|
if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {
|
|
// Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible
|
|
var dragRectAbsolute = getRect(dragEl$1, false, true, true);
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
if (multiDragElement === dragEl$1) return;
|
|
setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted
|
|
// while folding, and so that we can capture them again because old sortable will no longer be fromSortable
|
|
|
|
parentEl.appendChild(multiDragElement);
|
|
});
|
|
folding = true;
|
|
} // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out
|
|
|
|
|
|
if (!isOwner) {
|
|
// Only remove if not folding (folding will remove them anyways)
|
|
if (!folding) {
|
|
removeMultiDragElements();
|
|
}
|
|
|
|
if (multiDragElements.length > 1) {
|
|
var clonesHiddenBefore = clonesHidden;
|
|
|
|
activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden
|
|
|
|
|
|
if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {
|
|
multiDragClones.forEach(function (clone) {
|
|
activeSortable.addAnimationState({
|
|
target: clone,
|
|
rect: clonesFromRect
|
|
});
|
|
clone.fromRect = clonesFromRect;
|
|
clone.thisAnimationDuration = null;
|
|
});
|
|
}
|
|
} else {
|
|
activeSortable._showClone(sortable);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {
|
|
var dragRect = _ref11.dragRect,
|
|
isOwner = _ref11.isOwner,
|
|
activeSortable = _ref11.activeSortable;
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
multiDragElement.thisAnimationDuration = null;
|
|
});
|
|
|
|
if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {
|
|
clonesFromRect = _extends({}, dragRect);
|
|
var dragMatrix = matrix(dragEl$1, true);
|
|
clonesFromRect.top -= dragMatrix.f;
|
|
clonesFromRect.left -= dragMatrix.e;
|
|
}
|
|
},
|
|
dragOverAnimationComplete: function dragOverAnimationComplete() {
|
|
if (folding) {
|
|
folding = false;
|
|
removeMultiDragElements();
|
|
}
|
|
},
|
|
drop: function drop(_ref12) {
|
|
var evt = _ref12.originalEvent,
|
|
rootEl = _ref12.rootEl,
|
|
parentEl = _ref12.parentEl,
|
|
sortable = _ref12.sortable,
|
|
dispatchSortableEvent = _ref12.dispatchSortableEvent,
|
|
oldIndex = _ref12.oldIndex,
|
|
putSortable = _ref12.putSortable;
|
|
var toSortable = putSortable || this.sortable;
|
|
if (!evt) return;
|
|
var options = this.options,
|
|
children = parentEl.children; // Multi-drag selection
|
|
|
|
if (!dragStarted) {
|
|
if (options.multiDragKey && !this.multiDragKeyDown) {
|
|
this._deselectMultiDrag();
|
|
}
|
|
|
|
toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));
|
|
|
|
if (!~multiDragElements.indexOf(dragEl$1)) {
|
|
multiDragElements.push(dragEl$1);
|
|
dispatchEvent({
|
|
sortable: sortable,
|
|
rootEl: rootEl,
|
|
name: 'select',
|
|
targetEl: dragEl$1,
|
|
originalEvt: evt
|
|
}); // Modifier activated, select from last to dragEl
|
|
|
|
if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
|
|
var lastIndex = index(lastMultiDragSelect),
|
|
currentIndex = index(dragEl$1);
|
|
|
|
if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {
|
|
// Must include lastMultiDragSelect (select it), in case modified selection from no selection
|
|
// (but previous selection existed)
|
|
var n, i;
|
|
|
|
if (currentIndex > lastIndex) {
|
|
i = lastIndex;
|
|
n = currentIndex;
|
|
} else {
|
|
i = currentIndex;
|
|
n = lastIndex + 1;
|
|
}
|
|
|
|
for (; i < n; i++) {
|
|
if (~multiDragElements.indexOf(children[i])) continue;
|
|
toggleClass(children[i], options.selectedClass, true);
|
|
multiDragElements.push(children[i]);
|
|
dispatchEvent({
|
|
sortable: sortable,
|
|
rootEl: rootEl,
|
|
name: 'select',
|
|
targetEl: children[i],
|
|
originalEvt: evt
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
lastMultiDragSelect = dragEl$1;
|
|
}
|
|
|
|
multiDragSortable = toSortable;
|
|
} else {
|
|
multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);
|
|
lastMultiDragSelect = null;
|
|
dispatchEvent({
|
|
sortable: sortable,
|
|
rootEl: rootEl,
|
|
name: 'deselect',
|
|
targetEl: dragEl$1,
|
|
originalEvt: evt
|
|
});
|
|
}
|
|
} // Multi-drag drop
|
|
|
|
|
|
if (dragStarted && this.isMultiDrag) {
|
|
// Do not "unfold" after around dragEl if reverted
|
|
if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
|
|
var dragRect = getRect(dragEl$1),
|
|
multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
|
|
if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;
|
|
toSortable.captureAnimationState();
|
|
|
|
if (!initialFolding) {
|
|
if (options.animation) {
|
|
dragEl$1.fromRect = dragRect;
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
multiDragElement.thisAnimationDuration = null;
|
|
|
|
if (multiDragElement !== dragEl$1) {
|
|
var rect = folding ? getRect(multiDragElement) : dragRect;
|
|
multiDragElement.fromRect = rect; // Prepare unfold animation
|
|
|
|
toSortable.addAnimationState({
|
|
target: multiDragElement,
|
|
rect: rect
|
|
});
|
|
}
|
|
});
|
|
} // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert
|
|
// properly they must all be removed
|
|
|
|
|
|
removeMultiDragElements();
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
if (children[multiDragIndex]) {
|
|
parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
|
|
} else {
|
|
parentEl.appendChild(multiDragElement);
|
|
}
|
|
|
|
multiDragIndex++;
|
|
}); // If initial folding is done, the elements may have changed position because they are now
|
|
// unfolding around dragEl, even though dragEl may not have his index changed, so update event
|
|
// must be fired here as Sortable will not.
|
|
|
|
if (oldIndex === index(dragEl$1)) {
|
|
var update = false;
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
if (multiDragElement.sortableIndex !== index(multiDragElement)) {
|
|
update = true;
|
|
return;
|
|
}
|
|
});
|
|
|
|
if (update) {
|
|
dispatchSortableEvent('update');
|
|
}
|
|
}
|
|
} // Must be done after capturing individual rects (scroll bar)
|
|
|
|
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
unsetRect(multiDragElement);
|
|
});
|
|
toSortable.animateAll();
|
|
}
|
|
|
|
multiDragSortable = toSortable;
|
|
} // Remove clones if necessary
|
|
|
|
|
|
if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {
|
|
multiDragClones.forEach(function (clone) {
|
|
clone.parentNode && clone.parentNode.removeChild(clone);
|
|
});
|
|
}
|
|
},
|
|
nullingGlobal: function nullingGlobal() {
|
|
this.isMultiDrag = dragStarted = false;
|
|
multiDragClones.length = 0;
|
|
},
|
|
destroyGlobal: function destroyGlobal() {
|
|
this._deselectMultiDrag();
|
|
|
|
off(document, 'pointerup', this._deselectMultiDrag);
|
|
off(document, 'mouseup', this._deselectMultiDrag);
|
|
off(document, 'touchend', this._deselectMultiDrag);
|
|
off(document, 'keydown', this._checkKeyDown);
|
|
off(document, 'keyup', this._checkKeyUp);
|
|
},
|
|
_deselectMultiDrag: function _deselectMultiDrag(evt) {
|
|
if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable
|
|
|
|
if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable
|
|
|
|
if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click
|
|
|
|
if (evt && evt.button !== 0) return;
|
|
|
|
while (multiDragElements.length) {
|
|
var el = multiDragElements[0];
|
|
toggleClass(el, this.options.selectedClass, false);
|
|
multiDragElements.shift();
|
|
dispatchEvent({
|
|
sortable: this.sortable,
|
|
rootEl: this.sortable.el,
|
|
name: 'deselect',
|
|
targetEl: el,
|
|
originalEvt: evt
|
|
});
|
|
}
|
|
},
|
|
_checkKeyDown: function _checkKeyDown(evt) {
|
|
if (evt.key === this.options.multiDragKey) {
|
|
this.multiDragKeyDown = true;
|
|
}
|
|
},
|
|
_checkKeyUp: function _checkKeyUp(evt) {
|
|
if (evt.key === this.options.multiDragKey) {
|
|
this.multiDragKeyDown = false;
|
|
}
|
|
}
|
|
};
|
|
return _extends(MultiDrag, {
|
|
// Static methods & properties
|
|
pluginName: 'multiDrag',
|
|
utils: {
|
|
/**
|
|
* Selects the provided multi-drag item
|
|
* @param {HTMLElement} el The element to be selected
|
|
*/
|
|
select: function select(el) {
|
|
var sortable = el.parentNode[expando];
|
|
if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
|
|
|
|
if (multiDragSortable && multiDragSortable !== sortable) {
|
|
multiDragSortable.multiDrag._deselectMultiDrag();
|
|
|
|
multiDragSortable = sortable;
|
|
}
|
|
|
|
toggleClass(el, sortable.options.selectedClass, true);
|
|
multiDragElements.push(el);
|
|
},
|
|
|
|
/**
|
|
* Deselects the provided multi-drag item
|
|
* @param {HTMLElement} el The element to be deselected
|
|
*/
|
|
deselect: function deselect(el) {
|
|
var sortable = el.parentNode[expando],
|
|
index = multiDragElements.indexOf(el);
|
|
if (!sortable || !sortable.options.multiDrag || !~index) return;
|
|
toggleClass(el, sortable.options.selectedClass, false);
|
|
multiDragElements.splice(index, 1);
|
|
}
|
|
},
|
|
eventProperties: function eventProperties() {
|
|
var _this3 = this;
|
|
|
|
var oldIndicies = [],
|
|
newIndicies = [];
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
oldIndicies.push({
|
|
multiDragElement: multiDragElement,
|
|
index: multiDragElement.sortableIndex
|
|
}); // multiDragElements will already be sorted if folding
|
|
|
|
var newIndex;
|
|
|
|
if (folding && multiDragElement !== dragEl$1) {
|
|
newIndex = -1;
|
|
} else if (folding) {
|
|
newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');
|
|
} else {
|
|
newIndex = index(multiDragElement);
|
|
}
|
|
|
|
newIndicies.push({
|
|
multiDragElement: multiDragElement,
|
|
index: newIndex
|
|
});
|
|
});
|
|
return {
|
|
items: _toConsumableArray(multiDragElements),
|
|
clones: [].concat(multiDragClones),
|
|
oldIndicies: oldIndicies,
|
|
newIndicies: newIndicies
|
|
};
|
|
},
|
|
optionListeners: {
|
|
multiDragKey: function multiDragKey(key) {
|
|
key = key.toLowerCase();
|
|
|
|
if (key === 'ctrl') {
|
|
key = 'Control';
|
|
} else if (key.length > 1) {
|
|
key = key.charAt(0).toUpperCase() + key.substr(1);
|
|
}
|
|
|
|
return key;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function insertMultiDragElements(clonesInserted, rootEl) {
|
|
multiDragElements.forEach(function (multiDragElement, i) {
|
|
var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
|
|
|
|
if (target) {
|
|
rootEl.insertBefore(multiDragElement, target);
|
|
} else {
|
|
rootEl.appendChild(multiDragElement);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Insert multi-drag clones
|
|
* @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted
|
|
* @param {HTMLElement} rootEl
|
|
*/
|
|
|
|
|
|
function insertMultiDragClones(elementsInserted, rootEl) {
|
|
multiDragClones.forEach(function (clone, i) {
|
|
var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
|
|
|
|
if (target) {
|
|
rootEl.insertBefore(clone, target);
|
|
} else {
|
|
rootEl.appendChild(clone);
|
|
}
|
|
});
|
|
}
|
|
|
|
function removeMultiDragElements() {
|
|
multiDragElements.forEach(function (multiDragElement) {
|
|
if (multiDragElement === dragEl$1) return;
|
|
multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);
|
|
});
|
|
}
|
|
|
|
Sortable.mount(new AutoScrollPlugin());
|
|
Sortable.mount(Remove, Revert);
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Sortable);
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/vue2-datepicker/index.css":
|
|
/*!************************************************!*\
|
|
!*** ./node_modules/vue2-datepicker/index.css ***!
|
|
\************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
|
|
/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _css_loader_dist_cjs_js_clonedRuleSet_8_use_1_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!../postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./index.css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue2-datepicker/index.css");
|
|
|
|
|
|
|
|
var options = {};
|
|
|
|
options.insert = "head";
|
|
options.singleton = false;
|
|
|
|
var update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_index_css__WEBPACK_IMPORTED_MODULE_1__.default, options);
|
|
|
|
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_index_css__WEBPACK_IMPORTED_MODULE_1__.default.locals || {});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css":
|
|
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css ***!
|
|
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
|
|
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_style_index_0_id_493ea437_lang_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css");
|
|
|
|
|
|
|
|
var options = {};
|
|
|
|
options.insert = "head";
|
|
options.singleton = false;
|
|
|
|
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_style_index_0_id_493ea437_lang_css__WEBPACK_IMPORTED_MODULE_1__.default, options);
|
|
|
|
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_style_index_0_id_493ea437_lang_css__WEBPACK_IMPORTED_MODULE_1__.default.locals || {});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css":
|
|
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css ***!
|
|
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
|
|
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_style_index_0_id_2f0acfdb_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css");
|
|
|
|
|
|
|
|
var options = {};
|
|
|
|
options.insert = "head";
|
|
options.singleton = false;
|
|
|
|
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_style_index_0_id_2f0acfdb_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__.default, options);
|
|
|
|
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_style_index_0_id_2f0acfdb_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_1__.default.locals || {});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
|
|
/*!****************************************************************************!*\
|
|
!*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
|
|
\****************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
|
|
|
|
var isOldIE = function isOldIE() {
|
|
var memo;
|
|
return function memorize() {
|
|
if (typeof memo === 'undefined') {
|
|
// Test for IE <= 9 as proposed by Browserhacks
|
|
// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
|
|
// Tests for existence of standard globals is to allow style-loader
|
|
// to operate correctly into non-standard environments
|
|
// @see https://github.com/webpack-contrib/style-loader/issues/177
|
|
memo = Boolean(window && document && document.all && !window.atob);
|
|
}
|
|
|
|
return memo;
|
|
};
|
|
}();
|
|
|
|
var getTarget = function getTarget() {
|
|
var memo = {};
|
|
return function memorize(target) {
|
|
if (typeof memo[target] === 'undefined') {
|
|
var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
|
|
|
|
if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
|
|
try {
|
|
// This will throw an exception if access to iframe is blocked
|
|
// due to cross-origin restrictions
|
|
styleTarget = styleTarget.contentDocument.head;
|
|
} catch (e) {
|
|
// istanbul ignore next
|
|
styleTarget = null;
|
|
}
|
|
}
|
|
|
|
memo[target] = styleTarget;
|
|
}
|
|
|
|
return memo[target];
|
|
};
|
|
}();
|
|
|
|
var stylesInDom = [];
|
|
|
|
function getIndexByIdentifier(identifier) {
|
|
var result = -1;
|
|
|
|
for (var i = 0; i < stylesInDom.length; i++) {
|
|
if (stylesInDom[i].identifier === identifier) {
|
|
result = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function modulesToDom(list, options) {
|
|
var idCountMap = {};
|
|
var identifiers = [];
|
|
|
|
for (var i = 0; i < list.length; i++) {
|
|
var item = list[i];
|
|
var id = options.base ? item[0] + options.base : item[0];
|
|
var count = idCountMap[id] || 0;
|
|
var identifier = "".concat(id, " ").concat(count);
|
|
idCountMap[id] = count + 1;
|
|
var index = getIndexByIdentifier(identifier);
|
|
var obj = {
|
|
css: item[1],
|
|
media: item[2],
|
|
sourceMap: item[3]
|
|
};
|
|
|
|
if (index !== -1) {
|
|
stylesInDom[index].references++;
|
|
stylesInDom[index].updater(obj);
|
|
} else {
|
|
stylesInDom.push({
|
|
identifier: identifier,
|
|
updater: addStyle(obj, options),
|
|
references: 1
|
|
});
|
|
}
|
|
|
|
identifiers.push(identifier);
|
|
}
|
|
|
|
return identifiers;
|
|
}
|
|
|
|
function insertStyleElement(options) {
|
|
var style = document.createElement('style');
|
|
var attributes = options.attributes || {};
|
|
|
|
if (typeof attributes.nonce === 'undefined') {
|
|
var nonce = true ? __webpack_require__.nc : 0;
|
|
|
|
if (nonce) {
|
|
attributes.nonce = nonce;
|
|
}
|
|
}
|
|
|
|
Object.keys(attributes).forEach(function (key) {
|
|
style.setAttribute(key, attributes[key]);
|
|
});
|
|
|
|
if (typeof options.insert === 'function') {
|
|
options.insert(style);
|
|
} else {
|
|
var target = getTarget(options.insert || 'head');
|
|
|
|
if (!target) {
|
|
throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
|
|
}
|
|
|
|
target.appendChild(style);
|
|
}
|
|
|
|
return style;
|
|
}
|
|
|
|
function removeStyleElement(style) {
|
|
// istanbul ignore if
|
|
if (style.parentNode === null) {
|
|
return false;
|
|
}
|
|
|
|
style.parentNode.removeChild(style);
|
|
}
|
|
/* istanbul ignore next */
|
|
|
|
|
|
var replaceText = function replaceText() {
|
|
var textStore = [];
|
|
return function replace(index, replacement) {
|
|
textStore[index] = replacement;
|
|
return textStore.filter(Boolean).join('\n');
|
|
};
|
|
}();
|
|
|
|
function applyToSingletonTag(style, index, remove, obj) {
|
|
var css = remove ? '' : obj.media ? "@media ".concat(obj.media, " {").concat(obj.css, "}") : obj.css; // For old IE
|
|
|
|
/* istanbul ignore if */
|
|
|
|
if (style.styleSheet) {
|
|
style.styleSheet.cssText = replaceText(index, css);
|
|
} else {
|
|
var cssNode = document.createTextNode(css);
|
|
var childNodes = style.childNodes;
|
|
|
|
if (childNodes[index]) {
|
|
style.removeChild(childNodes[index]);
|
|
}
|
|
|
|
if (childNodes.length) {
|
|
style.insertBefore(cssNode, childNodes[index]);
|
|
} else {
|
|
style.appendChild(cssNode);
|
|
}
|
|
}
|
|
}
|
|
|
|
function applyToTag(style, options, obj) {
|
|
var css = obj.css;
|
|
var media = obj.media;
|
|
var sourceMap = obj.sourceMap;
|
|
|
|
if (media) {
|
|
style.setAttribute('media', media);
|
|
} else {
|
|
style.removeAttribute('media');
|
|
}
|
|
|
|
if (sourceMap && typeof btoa !== 'undefined') {
|
|
css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
|
|
} // For old IE
|
|
|
|
/* istanbul ignore if */
|
|
|
|
|
|
if (style.styleSheet) {
|
|
style.styleSheet.cssText = css;
|
|
} else {
|
|
while (style.firstChild) {
|
|
style.removeChild(style.firstChild);
|
|
}
|
|
|
|
style.appendChild(document.createTextNode(css));
|
|
}
|
|
}
|
|
|
|
var singleton = null;
|
|
var singletonCounter = 0;
|
|
|
|
function addStyle(obj, options) {
|
|
var style;
|
|
var update;
|
|
var remove;
|
|
|
|
if (options.singleton) {
|
|
var styleIndex = singletonCounter++;
|
|
style = singleton || (singleton = insertStyleElement(options));
|
|
update = applyToSingletonTag.bind(null, style, styleIndex, false);
|
|
remove = applyToSingletonTag.bind(null, style, styleIndex, true);
|
|
} else {
|
|
style = insertStyleElement(options);
|
|
update = applyToTag.bind(null, style, options);
|
|
|
|
remove = function remove() {
|
|
removeStyleElement(style);
|
|
};
|
|
}
|
|
|
|
update(obj);
|
|
return function updateStyle(newObj) {
|
|
if (newObj) {
|
|
if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {
|
|
return;
|
|
}
|
|
|
|
update(obj = newObj);
|
|
} else {
|
|
remove();
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = function (list, options) {
|
|
options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
|
|
// tags it will allow on a page
|
|
|
|
if (!options.singleton && typeof options.singleton !== 'boolean') {
|
|
options.singleton = isOldIE();
|
|
}
|
|
|
|
list = list || [];
|
|
var lastIdentifiers = modulesToDom(list, options);
|
|
return function update(newList) {
|
|
newList = newList || [];
|
|
|
|
if (Object.prototype.toString.call(newList) !== '[object Array]') {
|
|
return;
|
|
}
|
|
|
|
for (var i = 0; i < lastIdentifiers.length; i++) {
|
|
var identifier = lastIdentifiers[i];
|
|
var index = getIndexByIdentifier(identifier);
|
|
stylesInDom[index].references--;
|
|
}
|
|
|
|
var newLastIdentifiers = modulesToDom(newList, options);
|
|
|
|
for (var _i = 0; _i < lastIdentifiers.length; _i++) {
|
|
var _identifier = lastIdentifiers[_i];
|
|
|
|
var _index = getIndexByIdentifier(_identifier);
|
|
|
|
if (stylesInDom[_index].references === 0) {
|
|
stylesInDom[_index].updater();
|
|
|
|
stylesInDom.splice(_index, 1);
|
|
}
|
|
}
|
|
|
|
lastIdentifiers = newLastIdentifiers;
|
|
};
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFormDesigner.vue":
|
|
/*!******************************************************!*\
|
|
!*** ./resources/js/components/gdooFormDesigner.vue ***!
|
|
\******************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _gdooFormDesigner_vue_vue_type_template_id_493ea437__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gdooFormDesigner.vue?vue&type=template&id=493ea437 */ "./resources/js/components/gdooFormDesigner.vue?vue&type=template&id=493ea437");
|
|
/* harmony import */ var _gdooFormDesigner_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gdooFormDesigner.vue?vue&type=script&lang=js */ "./resources/js/components/gdooFormDesigner.vue?vue&type=script&lang=js");
|
|
/* harmony import */ var _gdooFormDesigner_vue_vue_type_style_index_0_id_493ea437_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css */ "./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css");
|
|
|
|
|
|
|
|
|
|
;
|
|
_gdooFormDesigner_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.render = _gdooFormDesigner_vue_vue_type_template_id_493ea437__WEBPACK_IMPORTED_MODULE_0__.render
|
|
/* hot reload */
|
|
if (false) {}
|
|
|
|
_gdooFormDesigner_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.__file = "resources/js/components/gdooFormDesigner.vue"
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_gdooFormDesigner_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFrameHeader.vue":
|
|
/*!*****************************************************!*\
|
|
!*** ./resources/js/components/gdooFrameHeader.vue ***!
|
|
\*****************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _gdooFrameHeader_vue_vue_type_template_id_2d2750a2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gdooFrameHeader.vue?vue&type=template&id=2d2750a2 */ "./resources/js/components/gdooFrameHeader.vue?vue&type=template&id=2d2750a2");
|
|
/* harmony import */ var _gdooFrameHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gdooFrameHeader.vue?vue&type=script&lang=js */ "./resources/js/components/gdooFrameHeader.vue?vue&type=script&lang=js");
|
|
|
|
|
|
|
|
_gdooFrameHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.render = _gdooFrameHeader_vue_vue_type_template_id_2d2750a2__WEBPACK_IMPORTED_MODULE_0__.render
|
|
/* hot reload */
|
|
if (false) {}
|
|
|
|
_gdooFrameHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.__file = "resources/js/components/gdooFrameHeader.vue"
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_gdooFrameHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooGridHeader.vue":
|
|
/*!****************************************************!*\
|
|
!*** ./resources/js/components/gdooGridHeader.vue ***!
|
|
\****************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _gdooGridHeader_vue_vue_type_template_id_2f0acfdb_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true */ "./resources/js/components/gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true");
|
|
/* harmony import */ var _gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gdooGridHeader.vue?vue&type=script&lang=js */ "./resources/js/components/gdooGridHeader.vue?vue&type=script&lang=js");
|
|
/* harmony import */ var _gdooGridHeader_vue_vue_type_style_index_0_id_2f0acfdb_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css */ "./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css");
|
|
|
|
|
|
|
|
|
|
;
|
|
_gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.render = _gdooGridHeader_vue_vue_type_template_id_2f0acfdb_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render
|
|
_gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.__scopeId = "data-v-2f0acfdb"
|
|
/* hot reload */
|
|
if (false) {}
|
|
|
|
_gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default.__file = "resources/js/components/gdooGridHeader.vue"
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__.default);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFormDesigner.vue?vue&type=script&lang=js":
|
|
/*!******************************************************************************!*\
|
|
!*** ./resources/js/components/gdooFormDesigner.vue?vue&type=script&lang=js ***!
|
|
\******************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__.default)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooFormDesigner.vue?vue&type=script&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=script&lang=js");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFrameHeader.vue?vue&type=script&lang=js":
|
|
/*!*****************************************************************************!*\
|
|
!*** ./resources/js/components/gdooFrameHeader.vue?vue&type=script&lang=js ***!
|
|
\*****************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFrameHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__.default)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFrameHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooFrameHeader.vue?vue&type=script&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFrameHeader.vue?vue&type=script&lang=js");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooGridHeader.vue?vue&type=script&lang=js":
|
|
/*!****************************************************************************!*\
|
|
!*** ./resources/js/components/gdooGridHeader.vue?vue&type=script&lang=js ***!
|
|
\****************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__.default)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooGridHeader.vue?vue&type=script&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=script&lang=js");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFormDesigner.vue?vue&type=template&id=493ea437":
|
|
/*!************************************************************************************!*\
|
|
!*** ./resources/js/components/gdooFormDesigner.vue?vue&type=template&id=493ea437 ***!
|
|
\************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_template_id_493ea437__WEBPACK_IMPORTED_MODULE_0__.render)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_template_id_493ea437__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooFormDesigner.vue?vue&type=template&id=493ea437 */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=template&id=493ea437");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFrameHeader.vue?vue&type=template&id=2d2750a2":
|
|
/*!***********************************************************************************!*\
|
|
!*** ./resources/js/components/gdooFrameHeader.vue?vue&type=template&id=2d2750a2 ***!
|
|
\***********************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFrameHeader_vue_vue_type_template_id_2d2750a2__WEBPACK_IMPORTED_MODULE_0__.render)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFrameHeader_vue_vue_type_template_id_2d2750a2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooFrameHeader.vue?vue&type=template&id=2d2750a2 */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFrameHeader.vue?vue&type=template&id=2d2750a2");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true":
|
|
/*!**********************************************************************************************!*\
|
|
!*** ./resources/js/components/gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true ***!
|
|
\**********************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_template_id_2f0acfdb_scoped_true__WEBPACK_IMPORTED_MODULE_0__.render)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_template_id_2f0acfdb_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=template&id=2f0acfdb&scoped=true");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css":
|
|
/*!**************************************************************************************************!*\
|
|
!*** ./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css ***!
|
|
\**************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooFormDesigner_vue_vue_type_style_index_0_id_493ea437_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/style-loader/dist/cjs.js!../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooFormDesigner.vue?vue&type=style&index=0&id=493ea437&lang=css");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css":
|
|
/*!************************************************************************************************************!*\
|
|
!*** ./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css ***!
|
|
\************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_clonedRuleSet_8_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_8_use_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_gdooGridHeader_vue_vue_type_style_index_0_id_2f0acfdb_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/style-loader/dist/cjs.js!../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-8.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-8.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/gdooGridHeader.vue?vue&type=style&index=0&id=2f0acfdb&scoped=true&lang=css");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/vue2-datepicker/index.esm.js":
|
|
/*!***************************************************!*\
|
|
!*** ./node_modules/vue2-datepicker/index.esm.js ***!
|
|
\***************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
/* harmony export */ });
|
|
/* harmony import */ var date_format_parse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! date-format-parse */ "./node_modules/date-format-parse/es/index.js");
|
|
|
|
|
|
function _typeof(obj) {
|
|
"@babel/helpers - typeof";
|
|
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof = function (obj) {
|
|
return typeof obj;
|
|
};
|
|
} else {
|
|
_typeof = function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
};
|
|
}
|
|
|
|
return _typeof(obj);
|
|
}
|
|
|
|
function _defineProperty(obj, key, value) {
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
function _extends() {
|
|
_extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];
|
|
|
|
for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return target;
|
|
};
|
|
|
|
return _extends.apply(this, arguments);
|
|
}
|
|
|
|
function ownKeys(object, enumerableOnly) {
|
|
var keys = Object.keys(object);
|
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
if (enumerableOnly) symbols = symbols.filter(function (sym) {
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
});
|
|
keys.push.apply(keys, symbols);
|
|
}
|
|
|
|
return keys;
|
|
}
|
|
|
|
function _objectSpread2(target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
|
if (i % 2) {
|
|
ownKeys(Object(source), true).forEach(function (key) {
|
|
_defineProperty(target, key, source[key]);
|
|
});
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
} else {
|
|
ownKeys(Object(source)).forEach(function (key) {
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
});
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
if (source == null) return {};
|
|
var target = {};
|
|
var sourceKeys = Object.keys(source);
|
|
var key, i;
|
|
|
|
for (i = 0; i < sourceKeys.length; i++) {
|
|
key = sourceKeys[i];
|
|
if (excluded.indexOf(key) >= 0) continue;
|
|
target[key] = source[key];
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function _objectWithoutProperties(source, excluded) {
|
|
if (source == null) return {};
|
|
|
|
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
|
|
var key, i;
|
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
|
|
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
key = sourceSymbolKeys[i];
|
|
if (excluded.indexOf(key) >= 0) continue;
|
|
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function _slicedToArray(arr, i) {
|
|
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
|
}
|
|
|
|
function _arrayWithHoles(arr) {
|
|
if (Array.isArray(arr)) return arr;
|
|
}
|
|
|
|
function _iterableToArrayLimit(arr, i) {
|
|
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
|
|
var _arr = [];
|
|
var _n = true;
|
|
var _d = false;
|
|
var _e = undefined;
|
|
|
|
try {
|
|
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
|
|
_arr.push(_s.value);
|
|
|
|
if (i && _arr.length === i) break;
|
|
}
|
|
} catch (err) {
|
|
_d = true;
|
|
_e = err;
|
|
} finally {
|
|
try {
|
|
if (!_n && _i["return"] != null) _i["return"]();
|
|
} finally {
|
|
if (_d) throw _e;
|
|
}
|
|
}
|
|
|
|
return _arr;
|
|
}
|
|
|
|
function _unsupportedIterableToArray(o, minLen) {
|
|
if (!o) return;
|
|
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
if (n === "Map" || n === "Set") return Array.from(n);
|
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
}
|
|
|
|
function _arrayLikeToArray(arr, len) {
|
|
if (len == null || len > arr.length) len = arr.length;
|
|
|
|
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
|
|
return arr2;
|
|
}
|
|
|
|
function _nonIterableRest() {
|
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
}
|
|
|
|
function _extends$1() {
|
|
return _extends$1 = Object.assign || function (a) {
|
|
for (var b, c = 1; c < arguments.length; c++) {
|
|
for (var d in b = arguments[c], b) {
|
|
Object.prototype.hasOwnProperty.call(b, d) && (a[d] = b[d]);
|
|
}
|
|
}
|
|
|
|
return a;
|
|
}, _extends$1.apply(this, arguments);
|
|
}
|
|
|
|
var normalMerge = ["attrs", "props", "domProps"],
|
|
toArrayMerge = ["class", "style", "directives"],
|
|
functionalMerge = ["on", "nativeOn"],
|
|
mergeJsxProps = function mergeJsxProps(a) {
|
|
return a.reduce(function (c, a) {
|
|
for (var b in a) {
|
|
if (!c[b]) c[b] = a[b];else if (-1 !== normalMerge.indexOf(b)) c[b] = _extends$1({}, c[b], a[b]);else if (-1 !== toArrayMerge.indexOf(b)) {
|
|
var d = c[b] instanceof Array ? c[b] : [c[b]],
|
|
e = a[b] instanceof Array ? a[b] : [a[b]];
|
|
c[b] = d.concat(e);
|
|
} else if (-1 !== functionalMerge.indexOf(b)) {
|
|
for (var f in a[b]) {
|
|
if (c[b][f]) {
|
|
var g = c[b][f] instanceof Array ? c[b][f] : [c[b][f]],
|
|
h = a[b][f] instanceof Array ? a[b][f] : [a[b][f]];
|
|
c[b][f] = g.concat(h);
|
|
} else c[b][f] = a[b][f];
|
|
}
|
|
} else if ("hook" == b) for (var i in a[b]) {
|
|
c[b][i] = c[b][i] ? mergeFn(c[b][i], a[b][i]) : a[b][i];
|
|
} else c[b] = a[b];
|
|
}
|
|
|
|
return c;
|
|
}, {});
|
|
},
|
|
mergeFn = function mergeFn(a, b) {
|
|
return function () {
|
|
a && a.apply(this, arguments), b && b.apply(this, arguments);
|
|
};
|
|
};
|
|
|
|
var helper = mergeJsxProps;
|
|
|
|
// new Date(10, 0, 1) The year from 0 to 99 will be incremented by 1900 automatically.
|
|
function createDate(y) {
|
|
var M = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
var d = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
|
|
var h = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
|
|
var m = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
|
|
var s = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
|
|
var ms = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
|
|
var date = new Date(y, M, d, h, m, s, ms);
|
|
|
|
if (y < 100 && y >= 0) {
|
|
date.setFullYear(y);
|
|
}
|
|
|
|
return date;
|
|
}
|
|
function isValidDate(date) {
|
|
return date instanceof Date && !isNaN(date);
|
|
}
|
|
function isValidRangeDate(date) {
|
|
return Array.isArray(date) && date.length === 2 && date.every(isValidDate) && date[0] <= date[1];
|
|
}
|
|
function isValidDates(dates) {
|
|
return Array.isArray(dates) && dates.every(isValidDate);
|
|
}
|
|
function getValidDate(value) {
|
|
var date = new Date(value);
|
|
|
|
if (isValidDate(date)) {
|
|
return date;
|
|
}
|
|
|
|
for (var _len = arguments.length, backup = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
backup[_key - 1] = arguments[_key];
|
|
}
|
|
|
|
if (backup.length) {
|
|
return getValidDate.apply(void 0, backup);
|
|
}
|
|
|
|
return new Date();
|
|
}
|
|
function startOfYear(value) {
|
|
var date = new Date(value);
|
|
date.setMonth(0, 1);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
function startOfMonth(value) {
|
|
var date = new Date(value);
|
|
date.setDate(1);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
function startOfDay(value) {
|
|
var date = new Date(value);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
function getCalendar(_ref) {
|
|
var firstDayOfWeek = _ref.firstDayOfWeek,
|
|
year = _ref.year,
|
|
month = _ref.month;
|
|
var arr = []; // change to the last day of the last month
|
|
|
|
var calendar = createDate(year, month, 0);
|
|
var lastDayInLastMonth = calendar.getDate(); // getDay() 0 is Sunday, 1 is Monday
|
|
|
|
var firstDayInLastMonth = lastDayInLastMonth - (calendar.getDay() + 7 - firstDayOfWeek) % 7;
|
|
|
|
for (var i = firstDayInLastMonth; i <= lastDayInLastMonth; i++) {
|
|
arr.push(createDate(year, month, i - lastDayInLastMonth));
|
|
} // change to the last day of the current month
|
|
|
|
|
|
calendar.setMonth(month + 1, 0);
|
|
var lastDayInCurrentMonth = calendar.getDate();
|
|
|
|
for (var _i = 1; _i <= lastDayInCurrentMonth; _i++) {
|
|
arr.push(createDate(year, month, _i));
|
|
}
|
|
|
|
var lastMonthLength = lastDayInLastMonth - firstDayInLastMonth + 1;
|
|
var nextMonthLength = 6 * 7 - lastMonthLength - lastDayInCurrentMonth;
|
|
|
|
for (var _i2 = 1; _i2 <= nextMonthLength; _i2++) {
|
|
arr.push(createDate(year, month, lastDayInCurrentMonth + _i2));
|
|
}
|
|
|
|
return arr;
|
|
}
|
|
function setMonth(dirtyDate, dirtyMonth) {
|
|
var date = new Date(dirtyDate);
|
|
var month = typeof dirtyMonth === 'function' ? dirtyMonth(date.getMonth()) : Number(dirtyMonth);
|
|
var year = date.getFullYear();
|
|
var daysInMonth = createDate(year, month + 1, 0).getDate();
|
|
var day = date.getDate();
|
|
date.setMonth(month, Math.min(day, daysInMonth));
|
|
return date;
|
|
}
|
|
function setYear(dirtyDate, dirtyYear) {
|
|
var date = new Date(dirtyDate);
|
|
var year = typeof dirtyYear === 'function' ? dirtyYear(date.getFullYear()) : dirtyYear;
|
|
date.setFullYear(year);
|
|
return date;
|
|
}
|
|
function assignTime(target, source) {
|
|
var date = new Date(target);
|
|
var time = new Date(source);
|
|
date.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
|
|
return date;
|
|
}
|
|
|
|
/**
|
|
* chunk the array
|
|
* @param {Array} arr
|
|
* @param {Number} size
|
|
*/
|
|
function chunk(arr, size) {
|
|
if (!Array.isArray(arr)) {
|
|
return [];
|
|
}
|
|
|
|
var result = [];
|
|
var len = arr.length;
|
|
var i = 0;
|
|
size = size || len;
|
|
|
|
while (i < len) {
|
|
result.push(arr.slice(i, i += size));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
/**
|
|
* isObject
|
|
* @param {*} obj
|
|
* @returns {Boolean}
|
|
*/
|
|
|
|
function isObject(obj) {
|
|
return Object.prototype.toString.call(obj) === '[object Object]';
|
|
}
|
|
/**
|
|
* pick object
|
|
* @param {Object} obj
|
|
* @param {Array|String} props
|
|
*/
|
|
|
|
function pick(obj, props) {
|
|
if (!isObject(obj)) return {};
|
|
|
|
if (!Array.isArray(props)) {
|
|
props = [props];
|
|
}
|
|
|
|
var res = {};
|
|
props.forEach(function (prop) {
|
|
if (prop in obj) {
|
|
res[prop] = obj[prop];
|
|
}
|
|
});
|
|
return res;
|
|
}
|
|
/**
|
|
* deep merge two object without merging array
|
|
* @param {object} target
|
|
* @param {object} source
|
|
*/
|
|
|
|
function mergeDeep(target, source) {
|
|
if (!isObject(target)) {
|
|
return {};
|
|
}
|
|
|
|
var result = target;
|
|
|
|
if (isObject(source)) {
|
|
Object.keys(source).forEach(function (key) {
|
|
var value = source[key];
|
|
|
|
if (isObject(value) && isObject(target[key])) {
|
|
value = mergeDeep(target[key], value);
|
|
}
|
|
|
|
result = _objectSpread2({}, result, _defineProperty({}, key, value));
|
|
});
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function unwrapExports (x) {
|
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
}
|
|
|
|
function createCommonjsModule(fn, module) {
|
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
|
}
|
|
|
|
var en = createCommonjsModule(function (module, exports) {
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports["default"] = void 0;
|
|
var locale = {
|
|
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
|
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
|
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
|
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
|
weekdaysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
|
firstDayOfWeek: 0,
|
|
firstWeekContainsDate: 1
|
|
};
|
|
var _default = locale;
|
|
exports["default"] = _default;
|
|
module.exports = exports.default;
|
|
});
|
|
|
|
var en$1 = unwrapExports(en);
|
|
|
|
var lang = {
|
|
formatLocale: en$1,
|
|
yearFormat: 'YYYY',
|
|
monthFormat: 'MMM',
|
|
monthBeforeYear: true
|
|
};
|
|
|
|
var defaultLocale = 'en';
|
|
var locales = {};
|
|
locales[defaultLocale] = lang;
|
|
function locale(name, object, isLocal) {
|
|
if (typeof name !== 'string') return locales[defaultLocale];
|
|
var l = defaultLocale;
|
|
|
|
if (locales[name]) {
|
|
l = name;
|
|
}
|
|
|
|
if (object) {
|
|
locales[name] = object;
|
|
l = name;
|
|
}
|
|
|
|
if (!isLocal) {
|
|
defaultLocale = l;
|
|
}
|
|
|
|
return locales[name] || locales[defaultLocale];
|
|
}
|
|
/**
|
|
* get locale object
|
|
* @param {string} name lang
|
|
*/
|
|
|
|
function getLocale(name) {
|
|
return locale(name, null, true);
|
|
}
|
|
|
|
/* istanbul ignore file */
|
|
function rafThrottle(fn) {
|
|
var isRunning = false;
|
|
return function fnBinfRaf() {
|
|
var _this = this;
|
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
if (isRunning) return;
|
|
isRunning = true;
|
|
requestAnimationFrame(function () {
|
|
isRunning = false;
|
|
fn.apply(_this, args);
|
|
});
|
|
};
|
|
}
|
|
|
|
/**
|
|
* get the hidden element width, height
|
|
* @param {HTMLElement} element dom
|
|
*/
|
|
function getPopupElementSize(element) {
|
|
var originalDisplay = element.style.display;
|
|
var originalVisibility = element.style.visibility;
|
|
element.style.display = 'block';
|
|
element.style.visibility = 'hidden';
|
|
var styles = window.getComputedStyle(element);
|
|
var width = element.offsetWidth + parseInt(styles.marginLeft, 10) + parseInt(styles.marginRight, 10);
|
|
var height = element.offsetHeight + parseInt(styles.marginTop, 10) + parseInt(styles.marginBottom, 10);
|
|
element.style.display = originalDisplay;
|
|
element.style.visibility = originalVisibility;
|
|
return {
|
|
width: width,
|
|
height: height
|
|
};
|
|
}
|
|
/**
|
|
* get the popup position
|
|
* @param {HTMLElement} el relative element
|
|
* @param {Number} targetWidth target element's width
|
|
* @param {Number} targetHeight target element's height
|
|
* @param {Boolean} fixed
|
|
*/
|
|
|
|
function getRelativePosition(el, targetWidth, targetHeight, fixed) {
|
|
var left = 0;
|
|
var top = 0;
|
|
var offsetX = 0;
|
|
var offsetY = 0;
|
|
var relativeRect = el.getBoundingClientRect();
|
|
var dw = document.documentElement.clientWidth;
|
|
var dh = document.documentElement.clientHeight;
|
|
|
|
if (fixed) {
|
|
offsetX = window.pageXOffset + relativeRect.left;
|
|
offsetY = window.pageYOffset + relativeRect.top;
|
|
}
|
|
|
|
if (dw - relativeRect.left < targetWidth && relativeRect.right < targetWidth) {
|
|
left = offsetX - relativeRect.left + 1;
|
|
} else if (relativeRect.left + relativeRect.width / 2 <= dw / 2) {
|
|
left = offsetX;
|
|
} else {
|
|
left = offsetX + relativeRect.width - targetWidth;
|
|
}
|
|
|
|
if (relativeRect.top <= targetHeight && dh - relativeRect.bottom <= targetHeight) {
|
|
top = offsetY + dh - relativeRect.top - targetHeight;
|
|
} else if (relativeRect.top + relativeRect.height / 2 <= dh / 2) {
|
|
top = offsetY + relativeRect.height;
|
|
} else {
|
|
top = offsetY - targetHeight;
|
|
}
|
|
|
|
return {
|
|
left: "".concat(left, "px"),
|
|
top: "".concat(top, "px")
|
|
};
|
|
}
|
|
function getScrollParent(node) {
|
|
var until = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.body;
|
|
|
|
if (!node || node === until) {
|
|
return null;
|
|
}
|
|
|
|
var style = function style(value, prop) {
|
|
return getComputedStyle(value, null).getPropertyValue(prop);
|
|
};
|
|
|
|
var regex = /(auto|scroll)/;
|
|
var scroll = regex.test(style(node, 'overflow') + style(node, 'overflow-y') + style(node, 'overflow-x'));
|
|
return scroll ? node : getScrollParent(node.parentNode, until);
|
|
}
|
|
|
|
//
|
|
var script = {
|
|
name: 'Popup',
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: {
|
|
visible: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
appendToBody: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
},
|
|
data: function data() {
|
|
return {
|
|
top: '',
|
|
left: ''
|
|
};
|
|
},
|
|
watch: {
|
|
visible: {
|
|
immediate: true,
|
|
handler: function handler(val) {
|
|
var _this = this;
|
|
|
|
this.$nextTick(function () {
|
|
if (val) {
|
|
_this.displayPopup();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
},
|
|
mounted: function mounted() {
|
|
var _this2 = this;
|
|
|
|
if (this.appendToBody) {
|
|
document.body.appendChild(this.$el);
|
|
}
|
|
|
|
this._clickoutEvent = 'ontouchend' in document ? 'touchstart' : 'mousedown';
|
|
document.addEventListener(this._clickoutEvent, this.handleClickOutside); // change the popup position when resize or scroll
|
|
|
|
var relativeElement = this.$parent.$el;
|
|
this._displayPopup = rafThrottle(function () {
|
|
return _this2.displayPopup();
|
|
});
|
|
this._scrollParent = getScrollParent(relativeElement) || window;
|
|
|
|
this._scrollParent.addEventListener('scroll', this._displayPopup);
|
|
|
|
window.addEventListener('resize', this._displayPopup);
|
|
},
|
|
beforeDestroy: function beforeDestroy() {
|
|
if (this.appendToBody && this.$el.parentNode) {
|
|
this.$el.parentNode.removeChild(this.$el);
|
|
}
|
|
|
|
document.removeEventListener(this._clickoutEvent, this.handleClickOutside);
|
|
|
|
this._scrollParent.removeEventListener('scroll', this._displayPopup);
|
|
|
|
window.removeEventListener('resize', this._displayPopup);
|
|
},
|
|
methods: {
|
|
handleClickOutside: function handleClickOutside(evt) {
|
|
if (!this.visible) return;
|
|
var target = evt.target;
|
|
var el = this.$el;
|
|
|
|
if (el && !el.contains(target)) {
|
|
this.$emit('clickoutside', evt);
|
|
}
|
|
},
|
|
displayPopup: function displayPopup() {
|
|
if (!this.visible) return;
|
|
var popup = this.$el;
|
|
var relativeElement = this.$parent.$el;
|
|
var appendToBody = this.appendToBody;
|
|
|
|
if (!this._popupRect) {
|
|
this._popupRect = getPopupElementSize(popup);
|
|
}
|
|
|
|
var _this$_popupRect = this._popupRect,
|
|
width = _this$_popupRect.width,
|
|
height = _this$_popupRect.height;
|
|
|
|
var _getRelativePosition = getRelativePosition(relativeElement, width, height, appendToBody),
|
|
left = _getRelativePosition.left,
|
|
top = _getRelativePosition.top;
|
|
|
|
this.left = left;
|
|
this.top = top;
|
|
}
|
|
}
|
|
};
|
|
|
|
function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier
|
|
/* server only */
|
|
, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {
|
|
if (typeof shadowMode !== 'boolean') {
|
|
createInjectorSSR = createInjector;
|
|
createInjector = shadowMode;
|
|
shadowMode = false;
|
|
} // Vue.extend constructor export interop.
|
|
|
|
|
|
var options = typeof script === 'function' ? script.options : script; // render functions
|
|
|
|
if (template && template.render) {
|
|
options.render = template.render;
|
|
options.staticRenderFns = template.staticRenderFns;
|
|
options._compiled = true; // functional template
|
|
|
|
if (isFunctionalTemplate) {
|
|
options.functional = true;
|
|
}
|
|
} // scopedId
|
|
|
|
|
|
if (scopeId) {
|
|
options._scopeId = scopeId;
|
|
}
|
|
|
|
var hook;
|
|
|
|
if (moduleIdentifier) {
|
|
// server build
|
|
hook = function hook(context) {
|
|
// 2.3 injection
|
|
context = context || // cached call
|
|
this.$vnode && this.$vnode.ssrContext || // stateful
|
|
this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext; // functional
|
|
// 2.2 with runInNewContext: true
|
|
|
|
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
|
|
context = __VUE_SSR_CONTEXT__;
|
|
} // inject component styles
|
|
|
|
|
|
if (style) {
|
|
style.call(this, createInjectorSSR(context));
|
|
} // register component module identifier for async chunk inference
|
|
|
|
|
|
if (context && context._registeredComponents) {
|
|
context._registeredComponents.add(moduleIdentifier);
|
|
}
|
|
}; // used by ssr in case component is cached and beforeCreate
|
|
// never gets called
|
|
|
|
|
|
options._ssrRegister = hook;
|
|
} else if (style) {
|
|
hook = shadowMode ? function (context) {
|
|
style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));
|
|
} : function (context) {
|
|
style.call(this, createInjector(context));
|
|
};
|
|
}
|
|
|
|
if (hook) {
|
|
if (options.functional) {
|
|
// register for functional component in vue file
|
|
var originalRender = options.render;
|
|
|
|
options.render = function renderWithStyleInjection(h, context) {
|
|
hook.call(context);
|
|
return originalRender(h, context);
|
|
};
|
|
} else {
|
|
// inject component registration as beforeCreate hook
|
|
var existing = options.beforeCreate;
|
|
options.beforeCreate = existing ? [].concat(existing, hook) : [hook];
|
|
}
|
|
}
|
|
|
|
return script;
|
|
}
|
|
|
|
/* script */
|
|
var __vue_script__ = script;
|
|
/* template */
|
|
|
|
var __vue_render__ = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('transition', {
|
|
attrs: {
|
|
"name": _vm.prefixClass + "-zoom-in-down"
|
|
}
|
|
}, [_vm.visible ? _c('div', {
|
|
class: _vm.prefixClass + "-datepicker-main " + _vm.prefixClass + "-datepicker-popup",
|
|
style: {
|
|
top: _vm.top,
|
|
left: _vm.left,
|
|
position: 'absolute'
|
|
}
|
|
}, [_vm._t("default")], 2) : _vm._e()]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__ = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__ = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__ = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__ = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__ = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__ = normalizeComponent({
|
|
render: __vue_render__,
|
|
staticRenderFns: __vue_staticRenderFns__
|
|
}, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, undefined, undefined, undefined);
|
|
|
|
/* script */
|
|
|
|
/* template */
|
|
var __vue_render__$1 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('svg', {
|
|
attrs: {
|
|
"xmlns": "http://www.w3.org/2000/svg",
|
|
"viewBox": "0 0 1024 1024",
|
|
"width": "1em",
|
|
"height": "1em"
|
|
}
|
|
}, [_c('path', {
|
|
attrs: {
|
|
"d": "M940.218182 107.054545h-209.454546V46.545455h-65.163636v60.50909H363.054545V46.545455H297.890909v60.50909H83.781818c-18.618182 0-32.581818 13.963636-32.581818 32.581819v805.236363c0 18.618182 13.963636 32.581818 32.581818 32.581818h861.090909c18.618182 0 32.581818-13.963636 32.581818-32.581818V139.636364c-4.654545-18.618182-18.618182-32.581818-37.236363-32.581819zM297.890909 172.218182V232.727273h65.163636V172.218182h307.2V232.727273h65.163637V172.218182h176.872727v204.8H116.363636V172.218182h181.527273zM116.363636 912.290909V442.181818h795.927273v470.109091H116.363636z"
|
|
}
|
|
})]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$1 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$1 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$1 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$1 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$1 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$1 = normalizeComponent({
|
|
render: __vue_render__$1,
|
|
staticRenderFns: __vue_staticRenderFns__$1
|
|
}, __vue_inject_styles__$1, {}, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, undefined, undefined, undefined);
|
|
|
|
/* script */
|
|
|
|
/* template */
|
|
var __vue_render__$2 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('svg', {
|
|
attrs: {
|
|
"xmlns": "http://www.w3.org/2000/svg",
|
|
"viewBox": "0 0 24 24",
|
|
"width": "1em",
|
|
"height": "1em"
|
|
}
|
|
}, [_c('path', {
|
|
attrs: {
|
|
"d": "M0 0h24v24H0z",
|
|
"fill": "none"
|
|
}
|
|
}), _vm._v(" "), _c('path', {
|
|
attrs: {
|
|
"d": "M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"
|
|
}
|
|
}), _vm._v(" "), _c('path', {
|
|
attrs: {
|
|
"d": "M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"
|
|
}
|
|
})]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$2 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$2 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$2 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$2 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$2 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$2 = normalizeComponent({
|
|
render: __vue_render__$2,
|
|
staticRenderFns: __vue_staticRenderFns__$2
|
|
}, __vue_inject_styles__$2, {}, __vue_scope_id__$2, __vue_is_functional_template__$2, __vue_module_identifier__$2, false, undefined, undefined, undefined);
|
|
|
|
/* script */
|
|
|
|
/* template */
|
|
var __vue_render__$3 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('svg', {
|
|
attrs: {
|
|
"xmlns": "http://www.w3.org/2000/svg",
|
|
"viewBox": "0 0 1024 1024",
|
|
"width": "1em",
|
|
"height": "1em"
|
|
}
|
|
}, [_c('path', {
|
|
attrs: {
|
|
"d": "M810.005333 274.005333l-237.994667 237.994667 237.994667 237.994667-60.010667 60.010667-237.994667-237.994667-237.994667 237.994667-60.010667-60.010667 237.994667-237.994667-237.994667-237.994667 60.010667-60.010667 237.994667 237.994667 237.994667-237.994667z"
|
|
}
|
|
})]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$3 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$3 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$3 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$3 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$3 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$3 = normalizeComponent({
|
|
render: __vue_render__$3,
|
|
staticRenderFns: __vue_staticRenderFns__$3
|
|
}, __vue_inject_styles__$3, {}, __vue_scope_id__$3, __vue_is_functional_template__$3, __vue_module_identifier__$3, false, undefined, undefined, undefined);
|
|
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
var script$1 = {
|
|
props: {
|
|
type: String
|
|
},
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$1 = script$1;
|
|
/* template */
|
|
|
|
var __vue_render__$4 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('button', _vm._g({
|
|
class: _vm.prefixClass + "-btn " + _vm.prefixClass + "-btn-text " + _vm.prefixClass + "-btn-icon-" + _vm.type,
|
|
attrs: {
|
|
"type": "button"
|
|
}
|
|
}, _vm.$listeners), [_c('i', {
|
|
class: _vm.prefixClass + "-icon-" + _vm.type
|
|
})]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$4 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$4 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$4 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$4 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$4 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$4 = normalizeComponent({
|
|
render: __vue_render__$4,
|
|
staticRenderFns: __vue_staticRenderFns__$4
|
|
}, __vue_inject_styles__$4, __vue_script__$1, __vue_scope_id__$4, __vue_is_functional_template__$4, __vue_module_identifier__$4, false, undefined, undefined, undefined);
|
|
|
|
var script$2 = {
|
|
name: 'TableDate',
|
|
components: {
|
|
IconButton: __vue_component__$4
|
|
},
|
|
inject: {
|
|
getLocale: {
|
|
default: function _default() {
|
|
return getLocale;
|
|
}
|
|
},
|
|
getWeek: {
|
|
default: function _default() {
|
|
return date_format_parse__WEBPACK_IMPORTED_MODULE_0__.getWeek;
|
|
}
|
|
},
|
|
prefixClass: {
|
|
default: 'mx'
|
|
},
|
|
onDateMouseEnter: {
|
|
default: undefined
|
|
},
|
|
onDateMouseLeave: {
|
|
default: undefined
|
|
}
|
|
},
|
|
props: {
|
|
calendar: {
|
|
type: Date,
|
|
default: function _default() {
|
|
return new Date();
|
|
}
|
|
},
|
|
showWeekNumber: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
titleFormat: {
|
|
type: String,
|
|
default: 'YYYY-MM-DD'
|
|
},
|
|
getRowClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
getCellClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
firstDayOfWeek: function firstDayOfWeek() {
|
|
return this.getLocale().formatLocale.firstDayOfWeek || 0;
|
|
},
|
|
yearMonth: function yearMonth() {
|
|
var _this$getLocale = this.getLocale(),
|
|
yearFormat = _this$getLocale.yearFormat,
|
|
monthBeforeYear = _this$getLocale.monthBeforeYear,
|
|
_this$getLocale$month = _this$getLocale.monthFormat,
|
|
monthFormat = _this$getLocale$month === void 0 ? 'MMM' : _this$getLocale$month;
|
|
|
|
var yearLabel = {
|
|
panel: 'year',
|
|
label: this.formatDate(this.calendar, yearFormat)
|
|
};
|
|
var monthLabel = {
|
|
panel: 'month',
|
|
label: this.formatDate(this.calendar, monthFormat)
|
|
};
|
|
return monthBeforeYear ? [monthLabel, yearLabel] : [yearLabel, monthLabel];
|
|
},
|
|
days: function days() {
|
|
var locale = this.getLocale();
|
|
var days = locale.days || locale.formatLocale.weekdaysMin;
|
|
return days.concat(days).slice(this.firstDayOfWeek, this.firstDayOfWeek + 7);
|
|
},
|
|
dates: function dates() {
|
|
var year = this.calendar.getFullYear();
|
|
var month = this.calendar.getMonth();
|
|
var arr = getCalendar({
|
|
firstDayOfWeek: this.firstDayOfWeek,
|
|
year: year,
|
|
month: month
|
|
});
|
|
return chunk(arr, 7);
|
|
}
|
|
},
|
|
methods: {
|
|
handleIconLeftClick: function handleIconLeftClick() {
|
|
this.$emit('changecalendar', setMonth(this.calendar, function (v) {
|
|
return v - 1;
|
|
}), 'last-month');
|
|
},
|
|
handleIconRightClick: function handleIconRightClick() {
|
|
this.$emit('changecalendar', setMonth(this.calendar, function (v) {
|
|
return v + 1;
|
|
}), 'next-month');
|
|
},
|
|
handleIconDoubleLeftClick: function handleIconDoubleLeftClick() {
|
|
this.$emit('changecalendar', setYear(this.calendar, function (v) {
|
|
return v - 1;
|
|
}), 'last-year');
|
|
},
|
|
handleIconDoubleRightClick: function handleIconDoubleRightClick() {
|
|
this.$emit('changecalendar', setYear(this.calendar, function (v) {
|
|
return v + 1;
|
|
}), 'next-year');
|
|
},
|
|
handlePanelChange: function handlePanelChange(panel) {
|
|
this.$emit('changepanel', panel);
|
|
},
|
|
handleMouseEnter: function handleMouseEnter(cell) {
|
|
if (typeof this.onDateMouseEnter === 'function') {
|
|
this.onDateMouseEnter(cell);
|
|
}
|
|
},
|
|
handleMouseLeave: function handleMouseLeave(cell) {
|
|
if (typeof this.onDateMouseLeave === 'function') {
|
|
this.onDateMouseLeave(cell);
|
|
}
|
|
},
|
|
handleCellClick: function handleCellClick(evt) {
|
|
var target = evt.target;
|
|
|
|
if (target.tagName.toUpperCase() === 'DIV') {
|
|
target = target.parentNode;
|
|
}
|
|
|
|
var index = target.getAttribute('data-row-col');
|
|
|
|
if (index) {
|
|
var _index$split$map = index.split(',').map(function (v) {
|
|
return parseInt(v, 10);
|
|
}),
|
|
_index$split$map2 = _slicedToArray(_index$split$map, 2),
|
|
row = _index$split$map2[0],
|
|
col = _index$split$map2[1];
|
|
|
|
var date = this.dates[row][col];
|
|
this.$emit('select', new Date(date));
|
|
}
|
|
},
|
|
formatDate: function formatDate(date, fmt) {
|
|
return (0,date_format_parse__WEBPACK_IMPORTED_MODULE_0__.format)(date, fmt, {
|
|
locale: this.getLocale().formatLocale
|
|
});
|
|
},
|
|
getCellTitle: function getCellTitle(date) {
|
|
var fmt = this.titleFormat;
|
|
return this.formatDate(date, fmt);
|
|
},
|
|
getWeekNumber: function getWeekNumber(date) {
|
|
return this.getWeek(date, this.getLocale().formatLocale);
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$2 = script$2;
|
|
/* template */
|
|
|
|
var __vue_render__$5 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('div', {
|
|
class: _vm.prefixClass + "-calendar " + _vm.prefixClass + "-calendar-panel-date"
|
|
}, [_c('div', {
|
|
class: _vm.prefixClass + "-calendar-header"
|
|
}, [_c('icon-button', {
|
|
attrs: {
|
|
"type": "double-left"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconDoubleLeftClick
|
|
}
|
|
}), _vm._v(" "), _c('icon-button', {
|
|
attrs: {
|
|
"type": "left"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconLeftClick
|
|
}
|
|
}), _vm._v(" "), _c('icon-button', {
|
|
attrs: {
|
|
"type": "double-right"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconDoubleRightClick
|
|
}
|
|
}), _vm._v(" "), _c('icon-button', {
|
|
attrs: {
|
|
"type": "right"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconRightClick
|
|
}
|
|
}), _vm._v(" "), _c('span', {
|
|
class: _vm.prefixClass + "-calendar-header-label"
|
|
}, _vm._l(_vm.yearMonth, function (item) {
|
|
return _c('button', {
|
|
key: item.panel,
|
|
class: _vm.prefixClass + "-btn " + _vm.prefixClass + "-btn-text " + _vm.prefixClass + "-btn-current-" + item.panel,
|
|
attrs: {
|
|
"type": "button"
|
|
},
|
|
on: {
|
|
"click": function click($event) {
|
|
return _vm.handlePanelChange(item.panel);
|
|
}
|
|
}
|
|
}, [_vm._v("\n " + _vm._s(item.label) + "\n ")]);
|
|
}), 0)], 1), _vm._v(" "), _c('div', {
|
|
class: _vm.prefixClass + "-calendar-content"
|
|
}, [_c('table', {
|
|
class: _vm.prefixClass + "-table " + _vm.prefixClass + "-table-date"
|
|
}, [_c('thead', [_c('tr', [_vm.showWeekNumber ? _c('th', {
|
|
class: _vm.prefixClass + "-week-number-header"
|
|
}) : _vm._e(), _vm._v(" "), _vm._l(_vm.days, function (day) {
|
|
return _c('th', {
|
|
key: day
|
|
}, [_vm._v(_vm._s(day))]);
|
|
})], 2)]), _vm._v(" "), _c('tbody', {
|
|
on: {
|
|
"click": _vm.handleCellClick
|
|
}
|
|
}, _vm._l(_vm.dates, function (row, i) {
|
|
return _c('tr', {
|
|
key: i,
|
|
class: [_vm.prefixClass + "-date-row", _vm.getRowClasses(row)]
|
|
}, [_vm.showWeekNumber ? _c('td', {
|
|
class: _vm.prefixClass + "-week-number",
|
|
attrs: {
|
|
"data-row-col": i + ",0"
|
|
}
|
|
}, [_vm._v("\n " + _vm._s(_vm.getWeekNumber(row[0])) + "\n ")]) : _vm._e(), _vm._v(" "), _vm._l(row, function (cell, j) {
|
|
return _c('td', {
|
|
key: j,
|
|
staticClass: "cell",
|
|
class: _vm.getCellClasses(cell),
|
|
attrs: {
|
|
"data-row-col": i + "," + j,
|
|
"title": _vm.getCellTitle(cell)
|
|
},
|
|
on: {
|
|
"mouseenter": function mouseenter($event) {
|
|
return _vm.handleMouseEnter(cell);
|
|
},
|
|
"mouseleave": function mouseleave($event) {
|
|
return _vm.handleMouseLeave(cell);
|
|
}
|
|
}
|
|
}, [_c('div', [_vm._v(_vm._s(cell.getDate()))])]);
|
|
})], 2);
|
|
}), 0)])])]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$5 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$5 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$5 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$5 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$5 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$5 = normalizeComponent({
|
|
render: __vue_render__$5,
|
|
staticRenderFns: __vue_staticRenderFns__$5
|
|
}, __vue_inject_styles__$5, __vue_script__$2, __vue_scope_id__$5, __vue_is_functional_template__$5, __vue_module_identifier__$5, false, undefined, undefined, undefined);
|
|
|
|
//
|
|
var script$3 = {
|
|
name: 'TableMonth',
|
|
components: {
|
|
IconButton: __vue_component__$4
|
|
},
|
|
inject: {
|
|
getLocale: {
|
|
default: function _default() {
|
|
return getLocale;
|
|
}
|
|
},
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: {
|
|
calendar: {
|
|
type: Date,
|
|
default: function _default() {
|
|
return new Date();
|
|
}
|
|
},
|
|
getCellClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
calendarYear: function calendarYear() {
|
|
return this.calendar.getFullYear();
|
|
},
|
|
months: function months() {
|
|
var locale = this.getLocale();
|
|
var monthsLocale = locale.months || locale.formatLocale.monthsShort;
|
|
var months = monthsLocale.map(function (text, month) {
|
|
return {
|
|
text: text,
|
|
month: month
|
|
};
|
|
});
|
|
return chunk(months, 3);
|
|
}
|
|
},
|
|
methods: {
|
|
handleIconDoubleLeftClick: function handleIconDoubleLeftClick() {
|
|
this.$emit('changecalendar', setYear(this.calendar, function (v) {
|
|
return v - 1;
|
|
}), 'last-year');
|
|
},
|
|
handleIconDoubleRightClick: function handleIconDoubleRightClick() {
|
|
this.$emit('changecalendar', setYear(this.calendar, function (v) {
|
|
return v + 1;
|
|
}), 'next-year');
|
|
},
|
|
handlePanelChange: function handlePanelChange() {
|
|
this.$emit('changepanel', 'year');
|
|
},
|
|
handleClick: function handleClick(evt) {
|
|
var target = evt.target;
|
|
|
|
if (target.tagName.toUpperCase() === 'DIV') {
|
|
target = target.parentNode;
|
|
}
|
|
|
|
var month = target.getAttribute('data-month');
|
|
|
|
if (month) {
|
|
this.$emit('select', parseInt(month, 10));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$3 = script$3;
|
|
/* template */
|
|
|
|
var __vue_render__$6 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('div', {
|
|
class: _vm.prefixClass + "-calendar " + _vm.prefixClass + "-calendar-panel-month"
|
|
}, [_c('div', {
|
|
class: _vm.prefixClass + "-calendar-header"
|
|
}, [_c('icon-button', {
|
|
attrs: {
|
|
"type": "double-left"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconDoubleLeftClick
|
|
}
|
|
}), _vm._v(" "), _c('icon-button', {
|
|
attrs: {
|
|
"type": "double-right"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconDoubleRightClick
|
|
}
|
|
}), _vm._v(" "), _c('span', {
|
|
class: _vm.prefixClass + "-calendar-header-label"
|
|
}, [_c('button', {
|
|
class: _vm.prefixClass + "-btn " + _vm.prefixClass + "-btn-text",
|
|
attrs: {
|
|
"type": "button"
|
|
},
|
|
on: {
|
|
"click": _vm.handlePanelChange
|
|
}
|
|
}, [_vm._v("\n " + _vm._s(_vm.calendarYear) + "\n ")])])], 1), _vm._v(" "), _c('div', {
|
|
class: _vm.prefixClass + "-calendar-content"
|
|
}, [_c('table', {
|
|
class: _vm.prefixClass + "-table " + _vm.prefixClass + "-table-month",
|
|
on: {
|
|
"click": _vm.handleClick
|
|
}
|
|
}, _vm._l(_vm.months, function (row, i) {
|
|
return _c('tr', {
|
|
key: i
|
|
}, _vm._l(row, function (cell, j) {
|
|
return _c('td', {
|
|
key: j,
|
|
staticClass: "cell",
|
|
class: _vm.getCellClasses(cell.month),
|
|
attrs: {
|
|
"data-month": cell.month
|
|
}
|
|
}, [_c('div', [_vm._v(_vm._s(cell.text))])]);
|
|
}), 0);
|
|
}), 0)])]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$6 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$6 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$6 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$6 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$6 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$6 = normalizeComponent({
|
|
render: __vue_render__$6,
|
|
staticRenderFns: __vue_staticRenderFns__$6
|
|
}, __vue_inject_styles__$6, __vue_script__$3, __vue_scope_id__$6, __vue_is_functional_template__$6, __vue_module_identifier__$6, false, undefined, undefined, undefined);
|
|
|
|
//
|
|
var script$4 = {
|
|
name: 'TableYear',
|
|
components: {
|
|
IconButton: __vue_component__$4
|
|
},
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: {
|
|
calendar: {
|
|
type: Date,
|
|
default: function _default() {
|
|
return new Date();
|
|
}
|
|
},
|
|
getCellClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
getYearPanel: {
|
|
type: Function
|
|
}
|
|
},
|
|
computed: {
|
|
years: function years() {
|
|
var calendar = new Date(this.calendar);
|
|
|
|
if (typeof this.getYearPanel === 'function') {
|
|
return this.getYearPanel(calendar);
|
|
}
|
|
|
|
return this.getYears(calendar);
|
|
},
|
|
firstYear: function firstYear() {
|
|
return this.years[0][0];
|
|
},
|
|
lastYear: function lastYear() {
|
|
var last = function last(arr) {
|
|
return arr[arr.length - 1];
|
|
};
|
|
|
|
return last(last(this.years));
|
|
}
|
|
},
|
|
methods: {
|
|
getYears: function getYears(calendar) {
|
|
var firstYear = Math.floor(calendar.getFullYear() / 10) * 10;
|
|
var years = [];
|
|
|
|
for (var i = 0; i < 10; i++) {
|
|
years.push(firstYear + i);
|
|
}
|
|
|
|
return chunk(years, 2);
|
|
},
|
|
handleIconDoubleLeftClick: function handleIconDoubleLeftClick() {
|
|
this.$emit('changecalendar', setYear(this.calendar, function (v) {
|
|
return v - 10;
|
|
}), 'last-decade');
|
|
},
|
|
handleIconDoubleRightClick: function handleIconDoubleRightClick() {
|
|
this.$emit('changecalendar', setYear(this.calendar, function (v) {
|
|
return v + 10;
|
|
}), 'next-decade');
|
|
},
|
|
handleClick: function handleClick(evt) {
|
|
var target = evt.target;
|
|
|
|
if (target.tagName.toUpperCase() === 'DIV') {
|
|
target = target.parentNode;
|
|
}
|
|
|
|
var year = target.getAttribute('data-year');
|
|
|
|
if (year) {
|
|
this.$emit('select', parseInt(year, 10));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$4 = script$4;
|
|
/* template */
|
|
|
|
var __vue_render__$7 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('div', {
|
|
class: _vm.prefixClass + "-calendar " + _vm.prefixClass + "-calendar-panel-year"
|
|
}, [_c('div', {
|
|
class: _vm.prefixClass + "-calendar-header"
|
|
}, [_c('icon-button', {
|
|
attrs: {
|
|
"type": "double-left"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconDoubleLeftClick
|
|
}
|
|
}), _vm._v(" "), _c('icon-button', {
|
|
attrs: {
|
|
"type": "double-right"
|
|
},
|
|
on: {
|
|
"click": _vm.handleIconDoubleRightClick
|
|
}
|
|
}), _vm._v(" "), _c('span', {
|
|
class: _vm.prefixClass + "-calendar-header-label"
|
|
}, [_c('span', [_vm._v(_vm._s(_vm.firstYear))]), _vm._v(" "), _c('span', {
|
|
class: _vm.prefixClass + "-calendar-decade-separator"
|
|
}), _vm._v(" "), _c('span', [_vm._v(_vm._s(_vm.lastYear))])])], 1), _vm._v(" "), _c('div', {
|
|
class: _vm.prefixClass + "-calendar-content"
|
|
}, [_c('table', {
|
|
class: _vm.prefixClass + "-table " + _vm.prefixClass + "-table-year",
|
|
on: {
|
|
"click": _vm.handleClick
|
|
}
|
|
}, _vm._l(_vm.years, function (row, i) {
|
|
return _c('tr', {
|
|
key: i
|
|
}, _vm._l(row, function (cell, j) {
|
|
return _c('td', {
|
|
key: j,
|
|
staticClass: "cell",
|
|
class: _vm.getCellClasses(cell),
|
|
attrs: {
|
|
"data-year": cell
|
|
}
|
|
}, [_c('div', [_vm._v(_vm._s(cell))])]);
|
|
}), 0);
|
|
}), 0)])]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$7 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$7 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$7 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$7 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$7 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$7 = normalizeComponent({
|
|
render: __vue_render__$7,
|
|
staticRenderFns: __vue_staticRenderFns__$7
|
|
}, __vue_inject_styles__$7, __vue_script__$4, __vue_scope_id__$7, __vue_is_functional_template__$7, __vue_module_identifier__$7, false, undefined, undefined, undefined);
|
|
|
|
var CalendarPanel = {
|
|
name: 'CalendarPanel',
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
},
|
|
dispatchDatePicker: {
|
|
default: function _default() {
|
|
return function () {};
|
|
}
|
|
}
|
|
},
|
|
props: {
|
|
value: {},
|
|
defaultValue: {
|
|
default: function _default() {
|
|
var date = new Date();
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
},
|
|
defaultPanel: {
|
|
type: String
|
|
},
|
|
disabledDate: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return false;
|
|
}
|
|
},
|
|
type: {
|
|
type: String,
|
|
default: 'date'
|
|
},
|
|
getClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
showWeekNumber: {
|
|
type: Boolean,
|
|
default: undefined
|
|
},
|
|
getYearPanel: {
|
|
type: Function
|
|
},
|
|
titleFormat: {
|
|
type: String,
|
|
default: 'YYYY-MM-DD'
|
|
},
|
|
calendar: Date,
|
|
// update date when select year or month
|
|
partialUpdate: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
data: function data() {
|
|
var panels = ['date', 'month', 'year'];
|
|
var index = Math.max(panels.indexOf(this.type), panels.indexOf(this.defaultPanel));
|
|
var panel = index !== -1 ? panels[index] : 'date';
|
|
return {
|
|
panel: panel,
|
|
innerCalendar: new Date()
|
|
};
|
|
},
|
|
computed: {
|
|
innerValue: function innerValue() {
|
|
var value = Array.isArray(this.value) ? this.value : [this.value];
|
|
var map = {
|
|
year: startOfYear,
|
|
month: startOfMonth,
|
|
date: startOfDay
|
|
};
|
|
var start = map[this.type] || map.date;
|
|
return value.filter(isValidDate).map(function (v) {
|
|
return start(v);
|
|
});
|
|
},
|
|
calendarYear: function calendarYear() {
|
|
return this.innerCalendar.getFullYear();
|
|
},
|
|
calendarMonth: function calendarMonth() {
|
|
return this.innerCalendar.getMonth();
|
|
}
|
|
},
|
|
watch: {
|
|
value: {
|
|
immediate: true,
|
|
handler: 'initCalendar'
|
|
},
|
|
calendar: {
|
|
handler: 'initCalendar'
|
|
},
|
|
defaultValue: {
|
|
handler: 'initCalendar'
|
|
}
|
|
},
|
|
methods: {
|
|
initCalendar: function initCalendar() {
|
|
var calendarDate = this.calendar;
|
|
|
|
if (!isValidDate(calendarDate)) {
|
|
var length = this.innerValue.length;
|
|
calendarDate = getValidDate(length > 0 ? this.innerValue[length - 1] : this.defaultValue);
|
|
}
|
|
|
|
this.innerCalendar = startOfMonth(calendarDate);
|
|
},
|
|
isDisabled: function isDisabled(date) {
|
|
return this.disabledDate(new Date(date), this.innerValue);
|
|
},
|
|
emitDate: function emitDate(date, type) {
|
|
if (!this.isDisabled(date)) {
|
|
this.$emit('select', date, type, this.innerValue); // someone need get the first selected date to set range value. (#429)
|
|
|
|
this.dispatchDatePicker('pick', date, type);
|
|
}
|
|
},
|
|
handleCalendarChange: function handleCalendarChange(calendar, type) {
|
|
var oldCalendar = new Date(this.innerCalendar);
|
|
this.innerCalendar = calendar;
|
|
this.$emit('update:calendar', calendar);
|
|
this.dispatchDatePicker('calendar-change', calendar, oldCalendar, type);
|
|
},
|
|
handelPanelChange: function handelPanelChange(panel) {
|
|
var oldPanel = this.panel;
|
|
this.panel = panel;
|
|
this.dispatchDatePicker('panel-change', panel, oldPanel);
|
|
},
|
|
handleSelectYear: function handleSelectYear(year) {
|
|
if (this.type === 'year') {
|
|
var date = this.getYearCellDate(year);
|
|
this.emitDate(date, 'year');
|
|
} else {
|
|
this.handleCalendarChange(createDate(year, this.calendarMonth), 'year');
|
|
this.handelPanelChange('month');
|
|
|
|
if (this.partialUpdate && this.innerValue.length === 1) {
|
|
var _date = new Date(this.innerValue[0]);
|
|
|
|
_date.setFullYear(year);
|
|
|
|
this.emitDate(_date, 'year');
|
|
}
|
|
}
|
|
},
|
|
handleSelectMonth: function handleSelectMonth(month) {
|
|
if (this.type === 'month') {
|
|
var date = this.getMonthCellDate(month);
|
|
this.emitDate(date, 'month');
|
|
} else {
|
|
this.handleCalendarChange(createDate(this.calendarYear, month), 'month');
|
|
this.handelPanelChange('date');
|
|
|
|
if (this.partialUpdate && this.innerValue.length === 1) {
|
|
var _date2 = new Date(this.innerValue[0]);
|
|
|
|
_date2.setFullYear(this.calendarYear);
|
|
|
|
this.emitDate(setMonth(_date2, month), 'month');
|
|
}
|
|
}
|
|
},
|
|
handleSelectDate: function handleSelectDate(date) {
|
|
this.emitDate(date, this.type === 'week' ? 'week' : 'date');
|
|
},
|
|
getMonthCellDate: function getMonthCellDate(month) {
|
|
return createDate(this.calendarYear, month);
|
|
},
|
|
getYearCellDate: function getYearCellDate(year) {
|
|
return createDate(year, 0);
|
|
},
|
|
getDateClasses: function getDateClasses(cellDate) {
|
|
var notCurrentMonth = cellDate.getMonth() !== this.calendarMonth;
|
|
var classes = [];
|
|
|
|
if (cellDate.getTime() === new Date().setHours(0, 0, 0, 0)) {
|
|
classes.push('today');
|
|
}
|
|
|
|
if (notCurrentMonth) {
|
|
classes.push('not-current-month');
|
|
}
|
|
|
|
var state = this.getStateClass(cellDate);
|
|
|
|
if (!(state === 'active' && notCurrentMonth)) {
|
|
classes.push(state);
|
|
}
|
|
|
|
return classes.concat(this.getClasses(cellDate, this.innerValue, classes.join(' ')));
|
|
},
|
|
getMonthClasses: function getMonthClasses(month) {
|
|
if (this.type !== 'month') {
|
|
return this.calendarMonth === month ? 'active' : '';
|
|
}
|
|
|
|
var classes = [];
|
|
var cellDate = this.getMonthCellDate(month);
|
|
classes.push(this.getStateClass(cellDate));
|
|
return classes.concat(this.getClasses(cellDate, this.innerValue, classes.join(' ')));
|
|
},
|
|
getYearClasses: function getYearClasses(year) {
|
|
if (this.type !== 'year') {
|
|
return this.calendarYear === year ? 'active' : '';
|
|
}
|
|
|
|
var classes = [];
|
|
var cellDate = this.getYearCellDate(year);
|
|
classes.push(this.getStateClass(cellDate));
|
|
return classes.concat(this.getClasses(cellDate, this.innerValue, classes.join(' ')));
|
|
},
|
|
getStateClass: function getStateClass(cellDate) {
|
|
if (this.isDisabled(cellDate)) {
|
|
return 'disabled';
|
|
}
|
|
|
|
if (this.innerValue.some(function (v) {
|
|
return v.getTime() === cellDate.getTime();
|
|
})) {
|
|
return 'active';
|
|
}
|
|
|
|
return '';
|
|
},
|
|
getWeekState: function getWeekState(row) {
|
|
if (this.type !== 'week') return '';
|
|
var start = row[0].getTime();
|
|
var end = row[6].getTime();
|
|
var active = this.innerValue.some(function (v) {
|
|
var time = v.getTime();
|
|
return time >= start && time <= end;
|
|
});
|
|
return active ? "".concat(this.prefixClass, "-active-week") : '';
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
var panel = this.panel,
|
|
innerCalendar = this.innerCalendar;
|
|
|
|
if (panel === 'year') {
|
|
return h(__vue_component__$7, {
|
|
"attrs": {
|
|
"calendar": innerCalendar,
|
|
"getCellClasses": this.getYearClasses,
|
|
"getYearPanel": this.getYearPanel
|
|
},
|
|
"on": {
|
|
"select": this.handleSelectYear,
|
|
"changecalendar": this.handleCalendarChange
|
|
}
|
|
});
|
|
}
|
|
|
|
if (panel === 'month') {
|
|
return h(__vue_component__$6, {
|
|
"attrs": {
|
|
"calendar": innerCalendar,
|
|
"getCellClasses": this.getMonthClasses
|
|
},
|
|
"on": {
|
|
"select": this.handleSelectMonth,
|
|
"changepanel": this.handelPanelChange,
|
|
"changecalendar": this.handleCalendarChange
|
|
}
|
|
});
|
|
}
|
|
|
|
return h(__vue_component__$5, {
|
|
"class": _defineProperty({}, "".concat(this.prefixClass, "-calendar-week-mode"), this.type === 'week'),
|
|
"attrs": {
|
|
"calendar": innerCalendar,
|
|
"getCellClasses": this.getDateClasses,
|
|
"getRowClasses": this.getWeekState,
|
|
"titleFormat": this.titleFormat,
|
|
"showWeekNumber": typeof this.showWeekNumber === 'boolean' ? this.showWeekNumber : this.type === 'week'
|
|
},
|
|
"on": {
|
|
"select": this.handleSelectDate,
|
|
"changepanel": this.handelPanelChange,
|
|
"changecalendar": this.handleCalendarChange
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
var CalendarRange = {
|
|
name: 'CalendarRange',
|
|
components: {
|
|
CalendarPanel: CalendarPanel
|
|
},
|
|
provide: function provide() {
|
|
return {
|
|
onDateMouseEnter: this.onDateMouseEnter,
|
|
onDateMouseLeave: this.onDateMouseLeave
|
|
};
|
|
},
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: _objectSpread2({}, CalendarPanel.props),
|
|
data: function data() {
|
|
return {
|
|
innerValue: [],
|
|
calendars: [],
|
|
hoveredValue: null
|
|
};
|
|
},
|
|
computed: {
|
|
// Minimum difference between start and end calendars
|
|
calendarMinDiff: function calendarMinDiff() {
|
|
var map = {
|
|
date: 1,
|
|
// type:date min 1 month
|
|
month: 1 * 12,
|
|
// type:month min 1 year
|
|
year: 10 * 12 // type:year min 10 year
|
|
|
|
};
|
|
return map[this.type] || map.date;
|
|
},
|
|
calendarMaxDiff: function calendarMaxDiff() {
|
|
return Infinity;
|
|
},
|
|
defaultValues: function defaultValues() {
|
|
return Array.isArray(this.defaultValue) ? this.defaultValue : [this.defaultValue, this.defaultValue];
|
|
}
|
|
},
|
|
watch: {
|
|
value: {
|
|
immediate: true,
|
|
handler: function handler() {
|
|
var _this = this;
|
|
|
|
this.innerValue = isValidRangeDate(this.value) ? this.value : [new Date(NaN), new Date(NaN)];
|
|
var calendars = this.innerValue.map(function (v, i) {
|
|
return startOfMonth(getValidDate(v, _this.defaultValues[i]));
|
|
});
|
|
this.updateCalendars(calendars);
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
handleSelect: function handleSelect(date, type) {
|
|
var _this$innerValue = _slicedToArray(this.innerValue, 2),
|
|
startValue = _this$innerValue[0],
|
|
endValue = _this$innerValue[1];
|
|
|
|
if (isValidDate(startValue) && !isValidDate(endValue)) {
|
|
if (startValue.getTime() > date.getTime()) {
|
|
this.innerValue = [date, startValue];
|
|
} else {
|
|
this.innerValue = [startValue, date];
|
|
}
|
|
|
|
this.emitDate(this.innerValue, type);
|
|
} else {
|
|
this.innerValue = [date, new Date(NaN)];
|
|
}
|
|
},
|
|
onDateMouseEnter: function onDateMouseEnter(cell) {
|
|
this.hoveredValue = cell;
|
|
},
|
|
onDateMouseLeave: function onDateMouseLeave() {
|
|
this.hoveredValue = null;
|
|
},
|
|
emitDate: function emitDate(dates, type) {
|
|
this.$emit('select', dates, type);
|
|
},
|
|
updateStartCalendar: function updateStartCalendar(value) {
|
|
this.updateCalendars([value, this.calendars[1]], 1);
|
|
},
|
|
updateEndCalendar: function updateEndCalendar(value) {
|
|
this.updateCalendars([this.calendars[0], value], 0);
|
|
},
|
|
updateCalendars: function updateCalendars(calendars) {
|
|
var adjustIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
var gap = this.getCalendarGap(calendars);
|
|
|
|
if (gap) {
|
|
var calendar = new Date(calendars[adjustIndex]);
|
|
calendar.setMonth(calendar.getMonth() + (adjustIndex === 0 ? -gap : gap));
|
|
calendars[adjustIndex] = calendar;
|
|
}
|
|
|
|
this.calendars = calendars;
|
|
},
|
|
getCalendarGap: function getCalendarGap(calendars) {
|
|
var _calendars = _slicedToArray(calendars, 2),
|
|
calendarLeft = _calendars[0],
|
|
calendarRight = _calendars[1];
|
|
|
|
var yearDiff = calendarRight.getFullYear() - calendarLeft.getFullYear();
|
|
var monthDiff = calendarRight.getMonth() - calendarLeft.getMonth();
|
|
var diff = yearDiff * 12 + monthDiff;
|
|
var min = this.calendarMinDiff;
|
|
var max = this.calendarMaxDiff;
|
|
|
|
if (diff < min) {
|
|
return min - diff;
|
|
}
|
|
|
|
if (diff > max) {
|
|
return max - diff;
|
|
}
|
|
|
|
return 0;
|
|
},
|
|
getRangeClasses: function getRangeClasses(cellDate, currentDates, classnames) {
|
|
var classes = [].concat(this.getClasses(cellDate, currentDates, classnames));
|
|
if (/disabled|active/.test(classnames)) return classes;
|
|
|
|
var inRange = function inRange(data, range) {
|
|
var fn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (v) {
|
|
return v.getTime();
|
|
};
|
|
var value = fn(data);
|
|
|
|
var _range$map = range.map(fn),
|
|
_range$map2 = _slicedToArray(_range$map, 2),
|
|
min = _range$map2[0],
|
|
max = _range$map2[1];
|
|
|
|
if (min > max) {
|
|
var _ref = [max, min];
|
|
min = _ref[0];
|
|
max = _ref[1];
|
|
}
|
|
|
|
return value > min && value < max;
|
|
};
|
|
|
|
if (currentDates.length === 2 && inRange(cellDate, currentDates)) {
|
|
return classes.concat('in-range');
|
|
}
|
|
|
|
if (currentDates.length === 1 && this.hoveredValue && inRange(cellDate, [currentDates[0], this.hoveredValue])) {
|
|
return classes.concat('hover-in-range');
|
|
}
|
|
|
|
return classes;
|
|
}
|
|
},
|
|
render: function render() {
|
|
var _this2 = this;
|
|
|
|
var h = arguments[0];
|
|
var calendarRange = this.calendars.map(function (calendar, index) {
|
|
var props = _objectSpread2({}, _this2.$props, {
|
|
calendar: calendar,
|
|
value: _this2.innerValue,
|
|
defaultValue: _this2.defaultValues[index],
|
|
getClasses: _this2.getRangeClasses,
|
|
// don't update when range is true
|
|
partialUpdate: false
|
|
});
|
|
|
|
var on = {
|
|
select: _this2.handleSelect,
|
|
'update:calendar': index === 0 ? _this2.updateStartCalendar : _this2.updateEndCalendar
|
|
};
|
|
return h("calendar-panel", {
|
|
"props": _objectSpread2({}, props),
|
|
"on": _objectSpread2({}, on)
|
|
});
|
|
});
|
|
var prefixClass = this.prefixClass;
|
|
return h("div", {
|
|
"class": "".concat(prefixClass, "-range-wrapper")
|
|
}, [calendarRange]);
|
|
}
|
|
};
|
|
|
|
var scrollBarWidth;
|
|
function getScrollbarWidth () {
|
|
if (typeof window === 'undefined') return 0;
|
|
if (scrollBarWidth !== undefined) return scrollBarWidth;
|
|
var outer = document.createElement('div');
|
|
outer.style.visibility = 'hidden';
|
|
outer.style.overflow = 'scroll';
|
|
outer.style.width = '100px';
|
|
outer.style.position = 'absolute';
|
|
outer.style.top = '-9999px';
|
|
document.body.appendChild(outer);
|
|
var inner = document.createElement('div');
|
|
inner.style.width = '100%';
|
|
outer.appendChild(inner);
|
|
scrollBarWidth = outer.offsetWidth - inner.offsetWidth;
|
|
outer.parentNode.removeChild(outer);
|
|
return scrollBarWidth;
|
|
}
|
|
|
|
//
|
|
var script$5 = {
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
data: function data() {
|
|
return {
|
|
scrollbarWidth: 0,
|
|
thumbTop: '',
|
|
thumbHeight: ''
|
|
};
|
|
},
|
|
created: function created() {
|
|
this.scrollbarWidth = getScrollbarWidth();
|
|
document.addEventListener('mouseup', this.handleDragend);
|
|
},
|
|
beforeDestroy: function beforeDestroy() {
|
|
document.addEventListener('mouseup', this.handleDragend);
|
|
},
|
|
mounted: function mounted() {
|
|
this.$nextTick(this.getThumbSize);
|
|
},
|
|
methods: {
|
|
getThumbSize: function getThumbSize() {
|
|
var wrap = this.$refs.wrap;
|
|
if (!wrap) return;
|
|
var heightPercentage = wrap.clientHeight * 100 / wrap.scrollHeight;
|
|
this.thumbHeight = heightPercentage < 100 ? "".concat(heightPercentage, "%") : '';
|
|
},
|
|
handleScroll: function handleScroll(evt) {
|
|
var el = evt.currentTarget;
|
|
var scrollHeight = el.scrollHeight,
|
|
scrollTop = el.scrollTop;
|
|
this.thumbTop = "".concat(scrollTop * 100 / scrollHeight, "%");
|
|
},
|
|
handleDragstart: function handleDragstart(evt) {
|
|
evt.stopImmediatePropagation();
|
|
this._draggable = true;
|
|
var offsetTop = this.$refs.thumb.offsetTop;
|
|
this._prevY = evt.clientY - offsetTop;
|
|
document.addEventListener('mousemove', this.handleDraging);
|
|
},
|
|
handleDraging: function handleDraging(evt) {
|
|
if (!this._draggable) return;
|
|
var clientY = evt.clientY;
|
|
var wrap = this.$refs.wrap;
|
|
var scrollHeight = wrap.scrollHeight,
|
|
clientHeight = wrap.clientHeight;
|
|
var offsetY = clientY - this._prevY;
|
|
var top = offsetY * scrollHeight / clientHeight;
|
|
wrap.scrollTop = top;
|
|
},
|
|
handleDragend: function handleDragend() {
|
|
if (this._draggable) {
|
|
this._draggable = false;
|
|
document.removeEventListener('mousemove', this.handleDraging);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$5 = script$5;
|
|
/* template */
|
|
|
|
var __vue_render__$8 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('div', {
|
|
class: _vm.prefixClass + "-scrollbar",
|
|
style: {
|
|
position: 'relative',
|
|
overflow: 'hidden'
|
|
}
|
|
}, [_c('div', {
|
|
ref: "wrap",
|
|
class: _vm.prefixClass + "-scrollbar-wrap",
|
|
style: {
|
|
marginRight: "-" + _vm.scrollbarWidth + "px"
|
|
},
|
|
on: {
|
|
"scroll": _vm.handleScroll
|
|
}
|
|
}, [_vm._t("default")], 2), _vm._v(" "), _c('div', {
|
|
class: _vm.prefixClass + "-scrollbar-track"
|
|
}, [_c('div', {
|
|
ref: "thumb",
|
|
class: _vm.prefixClass + "-scrollbar-thumb",
|
|
style: {
|
|
height: _vm.thumbHeight,
|
|
top: _vm.thumbTop
|
|
},
|
|
on: {
|
|
"mousedown": _vm.handleDragstart
|
|
}
|
|
})])]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$8 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$8 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$8 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$8 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$8 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$8 = normalizeComponent({
|
|
render: __vue_render__$8,
|
|
staticRenderFns: __vue_staticRenderFns__$8
|
|
}, __vue_inject_styles__$8, __vue_script__$5, __vue_scope_id__$8, __vue_is_functional_template__$8, __vue_module_identifier__$8, false, undefined, undefined, undefined);
|
|
|
|
//
|
|
|
|
var padNumber = function padNumber(value) {
|
|
value = parseInt(value, 10);
|
|
return value < 10 ? "0".concat(value) : "".concat(value);
|
|
};
|
|
|
|
var generateOptions = function generateOptions(length, step, options) {
|
|
if (Array.isArray(options)) {
|
|
return options.filter(function (v) {
|
|
return v >= 0 && v < length;
|
|
});
|
|
}
|
|
|
|
if (step <= 0) {
|
|
step = 1;
|
|
}
|
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < length; i += step) {
|
|
arr.push(i);
|
|
}
|
|
|
|
return arr;
|
|
};
|
|
|
|
var scrollTo = function scrollTo(element, to) {
|
|
var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
|
|
// jump to target if duration zero
|
|
if (duration <= 0) {
|
|
requestAnimationFrame(function () {
|
|
element.scrollTop = to;
|
|
});
|
|
return;
|
|
}
|
|
|
|
var difference = to - element.scrollTop;
|
|
var tick = difference / duration * 10;
|
|
requestAnimationFrame(function () {
|
|
var scrollTop = element.scrollTop + tick;
|
|
|
|
if (scrollTop >= to) {
|
|
element.scrollTop = to;
|
|
return;
|
|
}
|
|
|
|
element.scrollTop = scrollTop;
|
|
scrollTo(element, to, duration - 10);
|
|
});
|
|
};
|
|
|
|
var script$6 = {
|
|
name: 'ListColumns',
|
|
components: {
|
|
ScrollbarVertical: __vue_component__$8
|
|
},
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: {
|
|
date: Date,
|
|
scrollDuration: {
|
|
type: Number,
|
|
default: 100
|
|
},
|
|
getClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
hourOptions: Array,
|
|
minuteOptions: Array,
|
|
secondOptions: Array,
|
|
showHour: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
showMinute: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
showSecond: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
hourStep: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
minuteStep: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
secondStep: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
use12h: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
computed: {
|
|
columns: function columns() {
|
|
var cols = [];
|
|
if (this.showHour) cols.push({
|
|
type: 'hour',
|
|
list: this.getHoursList()
|
|
});
|
|
if (this.showMinute) cols.push({
|
|
type: 'minute',
|
|
list: this.getMinutesList()
|
|
});
|
|
if (this.showSecond) cols.push({
|
|
type: 'second',
|
|
list: this.getSecondsList()
|
|
});
|
|
if (this.use12h) cols.push({
|
|
type: 'ampm',
|
|
list: this.getAMPMList()
|
|
});
|
|
return cols.filter(function (v) {
|
|
return v.list.length > 0;
|
|
});
|
|
}
|
|
},
|
|
watch: {
|
|
date: {
|
|
handler: function handler() {
|
|
var _this = this;
|
|
|
|
this.$nextTick(function () {
|
|
_this.scrollToSelected(_this.scrollDuration);
|
|
});
|
|
}
|
|
}
|
|
},
|
|
mounted: function mounted() {
|
|
this.scrollToSelected(0);
|
|
},
|
|
methods: {
|
|
getHoursList: function getHoursList() {
|
|
var _this2 = this;
|
|
|
|
return generateOptions(this.use12h ? 12 : 24, this.hourStep, this.hourOptions).map(function (num) {
|
|
var date = new Date(_this2.date);
|
|
var text = padNumber(num);
|
|
|
|
if (_this2.use12h) {
|
|
if (num === 0) {
|
|
text = '12';
|
|
}
|
|
|
|
if (date.getHours() >= 12) {
|
|
num += 12;
|
|
}
|
|
}
|
|
|
|
var value = date.setHours(num);
|
|
return {
|
|
value: value,
|
|
text: text
|
|
};
|
|
});
|
|
},
|
|
getMinutesList: function getMinutesList() {
|
|
var _this3 = this;
|
|
|
|
return generateOptions(60, this.minuteStep, this.minuteOptions).map(function (num) {
|
|
var value = new Date(_this3.date).setMinutes(num);
|
|
return {
|
|
value: value,
|
|
text: padNumber(num)
|
|
};
|
|
});
|
|
},
|
|
getSecondsList: function getSecondsList() {
|
|
var _this4 = this;
|
|
|
|
return generateOptions(60, this.secondStep, this.secondOptions).map(function (num) {
|
|
var value = new Date(_this4.date).setSeconds(num);
|
|
return {
|
|
value: value,
|
|
text: padNumber(num)
|
|
};
|
|
});
|
|
},
|
|
getAMPMList: function getAMPMList() {
|
|
var _this5 = this;
|
|
|
|
return ['AM', 'PM'].map(function (text, i) {
|
|
var date = new Date(_this5.date);
|
|
var value = date.setHours(date.getHours() % 12 + i * 12);
|
|
return {
|
|
text: text,
|
|
value: value
|
|
};
|
|
});
|
|
},
|
|
scrollToSelected: function scrollToSelected(duration) {
|
|
var elements = this.$el.querySelectorAll('.active');
|
|
|
|
for (var i = 0; i < elements.length; i++) {
|
|
var element = elements[i];
|
|
var scrollElement = getScrollParent(element, this.$el);
|
|
|
|
if (scrollElement) {
|
|
var to = element.offsetTop;
|
|
scrollTo(scrollElement, to, duration);
|
|
}
|
|
}
|
|
},
|
|
handleSelect: function handleSelect(evt) {
|
|
var target = evt.target,
|
|
currentTarget = evt.currentTarget;
|
|
if (target.tagName.toUpperCase() !== 'LI') return;
|
|
var type = currentTarget.getAttribute('data-type');
|
|
var colIndex = parseInt(currentTarget.getAttribute('data-index'), 10);
|
|
var cellIndex = parseInt(target.getAttribute('data-index'), 10);
|
|
var value = this.columns[colIndex].list[cellIndex].value;
|
|
this.$emit('select', value, type);
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$6 = script$6;
|
|
/* template */
|
|
|
|
var __vue_render__$9 = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('div', {
|
|
class: _vm.prefixClass + "-time-columns"
|
|
}, _vm._l(_vm.columns, function (col, i) {
|
|
return _c('scrollbar-vertical', {
|
|
key: i,
|
|
class: _vm.prefixClass + "-time-column"
|
|
}, [_c('ul', {
|
|
class: _vm.prefixClass + "-time-list",
|
|
attrs: {
|
|
"data-type": col.type,
|
|
"data-index": i
|
|
},
|
|
on: {
|
|
"click": _vm.handleSelect
|
|
}
|
|
}, _vm._l(col.list, function (item, j) {
|
|
return _c('li', {
|
|
key: item.value,
|
|
class: [_vm.prefixClass + "-time-item", _vm.getClasses(item.value, col.type)],
|
|
attrs: {
|
|
"data-index": j
|
|
}
|
|
}, [_vm._v("\n " + _vm._s(item.text) + "\n ")]);
|
|
}), 0)]);
|
|
}), 1);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$9 = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$9 = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$9 = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$9 = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$9 = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$9 = normalizeComponent({
|
|
render: __vue_render__$9,
|
|
staticRenderFns: __vue_staticRenderFns__$9
|
|
}, __vue_inject_styles__$9, __vue_script__$6, __vue_scope_id__$9, __vue_is_functional_template__$9, __vue_module_identifier__$9, false, undefined, undefined, undefined);
|
|
|
|
//
|
|
|
|
function parseOption() {
|
|
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
var values = time.split(':');
|
|
|
|
if (values.length >= 2) {
|
|
var hours = parseInt(values[0], 10);
|
|
var minutes = parseInt(values[1], 10);
|
|
return {
|
|
hours: hours,
|
|
minutes: minutes
|
|
};
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
var scrollTo$1 = function scrollTo(element, to) {
|
|
if (element) {
|
|
element.scrollTop = to;
|
|
}
|
|
};
|
|
|
|
var script$7 = {
|
|
name: 'ListOptions',
|
|
components: {
|
|
ScrollbarVertical: __vue_component__$8
|
|
},
|
|
inject: {
|
|
getLocale: {
|
|
default: function _default() {
|
|
return getLocale;
|
|
}
|
|
},
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: {
|
|
date: Date,
|
|
options: {
|
|
type: [Object, Function],
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
format: {
|
|
type: String,
|
|
default: 'HH:mm:ss'
|
|
},
|
|
getClasses: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
list: function list() {
|
|
var result = [];
|
|
var options = this.options;
|
|
|
|
if (typeof options === 'function') {
|
|
return options() || [];
|
|
}
|
|
|
|
var start = parseOption(options.start);
|
|
var end = parseOption(options.end);
|
|
var step = parseOption(options.step);
|
|
var fmt = options.format || this.format;
|
|
|
|
if (start && end && step) {
|
|
var startMinutes = start.minutes + start.hours * 60;
|
|
var endMinutes = end.minutes + end.hours * 60;
|
|
var stepMinutes = step.minutes + step.hours * 60;
|
|
var len = Math.floor((endMinutes - startMinutes) / stepMinutes);
|
|
|
|
for (var i = 0; i <= len; i++) {
|
|
var timeMinutes = startMinutes + i * stepMinutes;
|
|
var hours = Math.floor(timeMinutes / 60);
|
|
var minutes = timeMinutes % 60;
|
|
var value = new Date(this.date).setHours(hours, minutes, 0);
|
|
result.push({
|
|
value: value,
|
|
text: this.formatDate(value, fmt)
|
|
});
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
},
|
|
mounted: function mounted() {
|
|
this.scrollToSelected();
|
|
},
|
|
methods: {
|
|
formatDate: function formatDate(date, fmt) {
|
|
return (0,date_format_parse__WEBPACK_IMPORTED_MODULE_0__.format)(date, fmt, {
|
|
locale: this.getLocale().formatLocale
|
|
});
|
|
},
|
|
scrollToSelected: function scrollToSelected() {
|
|
var element = this.$el.querySelector('.active');
|
|
if (!element) return;
|
|
var scrollElement = getScrollParent(element, this.$el);
|
|
if (!scrollElement) return;
|
|
var to = element.offsetTop;
|
|
scrollTo$1(scrollElement, to);
|
|
},
|
|
handleSelect: function handleSelect(value) {
|
|
this.$emit('select', value, 'time');
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$7 = script$7;
|
|
/* template */
|
|
|
|
var __vue_render__$a = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('scrollbar-vertical', _vm._l(_vm.list, function (item) {
|
|
return _c('div', {
|
|
key: item.value,
|
|
class: [_vm.prefixClass + "-time-option", _vm.getClasses(item.value)],
|
|
on: {
|
|
"click": function click($event) {
|
|
return _vm.handleSelect(item.value);
|
|
}
|
|
}
|
|
}, [_vm._v("\n " + _vm._s(item.text) + "\n ")]);
|
|
}), 0);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$a = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$a = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$a = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$a = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$a = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$a = normalizeComponent({
|
|
render: __vue_render__$a,
|
|
staticRenderFns: __vue_staticRenderFns__$a
|
|
}, __vue_inject_styles__$a, __vue_script__$7, __vue_scope_id__$a, __vue_is_functional_template__$a, __vue_module_identifier__$a, false, undefined, undefined, undefined);
|
|
|
|
//
|
|
var script$8 = {
|
|
name: 'TimePanel',
|
|
components: {
|
|
ListColumns: __vue_component__$9,
|
|
ListOptions: __vue_component__$a
|
|
},
|
|
inject: {
|
|
getLocale: {
|
|
default: function _default() {
|
|
return getLocale;
|
|
}
|
|
},
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: {
|
|
value: {},
|
|
defaultValue: {
|
|
default: function _default() {
|
|
var date = new Date();
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
},
|
|
format: {
|
|
default: 'HH:mm:ss'
|
|
},
|
|
timeTitleFormat: {
|
|
type: String,
|
|
default: 'YYYY-MM-DD'
|
|
},
|
|
showTimeHeader: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
disabledTime: {
|
|
type: Function,
|
|
default: function _default() {
|
|
return false;
|
|
}
|
|
},
|
|
timePickerOptions: {
|
|
type: [Object, Function],
|
|
default: function _default() {
|
|
return null;
|
|
}
|
|
},
|
|
hourOptions: Array,
|
|
minuteOptions: Array,
|
|
secondOptions: Array,
|
|
hourStep: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
minuteStep: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
secondStep: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
showHour: {
|
|
type: Boolean,
|
|
default: undefined
|
|
},
|
|
showMinute: {
|
|
type: Boolean,
|
|
default: undefined
|
|
},
|
|
showSecond: {
|
|
type: Boolean,
|
|
default: undefined
|
|
},
|
|
use12h: {
|
|
type: Boolean,
|
|
default: undefined
|
|
},
|
|
scrollDuration: {
|
|
type: Number,
|
|
default: 100
|
|
}
|
|
},
|
|
data: function data() {
|
|
return {
|
|
innerValue: getValidDate(this.value, this.defaultValue)
|
|
};
|
|
},
|
|
computed: {
|
|
title: function title() {
|
|
var titleFormat = this.timeTitleFormat;
|
|
var date = new Date(this.innerValue);
|
|
return this.formatDate(date, titleFormat);
|
|
},
|
|
innerForamt: function innerForamt() {
|
|
return typeof this.format === 'string' ? this.format : 'HH:mm:ss';
|
|
},
|
|
ShowHourMinuteSecondAMPM: function ShowHourMinuteSecondAMPM() {
|
|
var _this = this;
|
|
|
|
var fmt = this.innerForamt;
|
|
var defaultProps = {
|
|
showHour: /[HhKk]/.test(fmt),
|
|
showMinute: /m/.test(fmt),
|
|
showSecond: /s/.test(fmt),
|
|
use12h: /a/i.test(fmt)
|
|
};
|
|
var obj = {};
|
|
Object.keys(defaultProps).forEach(function (key) {
|
|
obj[key] = typeof _this[key] === 'boolean' ? _this[key] : defaultProps[key];
|
|
});
|
|
return obj;
|
|
}
|
|
},
|
|
watch: {
|
|
value: {
|
|
immediate: true,
|
|
handler: function handler() {
|
|
this.innerValue = getValidDate(this.value, this.defaultValue);
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
formatDate: function formatDate(date, fmt) {
|
|
return (0,date_format_parse__WEBPACK_IMPORTED_MODULE_0__.format)(date, fmt, {
|
|
locale: this.getLocale().formatLocale
|
|
});
|
|
},
|
|
isDisabledTime: function isDisabledTime(value) {
|
|
return this.disabledTime(new Date(value));
|
|
},
|
|
isDisabledHour: function isDisabledHour(date) {
|
|
var value = new Date(date);
|
|
return this.isDisabledTime(value) && this.isDisabledTime(value.setMinutes(0, 0, 0)) && this.isDisabledTime(value.setMinutes(59, 59, 999));
|
|
},
|
|
isDisabledMinute: function isDisabledMinute(date) {
|
|
var value = new Date(date);
|
|
return this.isDisabledTime(value) && this.isDisabledTime(value.setSeconds(0, 0)) && this.isDisabledTime(value.setSeconds(59, 999));
|
|
},
|
|
isDisabled: function isDisabled(date, type) {
|
|
if (type === 'hour') {
|
|
return this.isDisabledHour(date);
|
|
}
|
|
|
|
if (type === 'minute') {
|
|
return this.isDisabledMinute(date);
|
|
}
|
|
|
|
return this.isDisabledTime(date);
|
|
},
|
|
handleSelect: function handleSelect(value, type) {
|
|
var date = new Date(value);
|
|
|
|
if (!this.isDisabled(value, type)) {
|
|
this.innerValue = date;
|
|
|
|
if (!this.isDisabledTime(date)) {
|
|
this.$emit('select', date, type);
|
|
}
|
|
}
|
|
},
|
|
handleClickTitle: function handleClickTitle() {
|
|
this.$emit('clicktitle');
|
|
},
|
|
getClasses: function getClasses(value, type) {
|
|
var cellDate = new Date(value);
|
|
|
|
if (this.isDisabled(value, type)) {
|
|
return 'disabled';
|
|
}
|
|
|
|
if (cellDate.getTime() === this.innerValue.getTime()) {
|
|
return 'active';
|
|
}
|
|
|
|
return '';
|
|
}
|
|
}
|
|
};
|
|
|
|
/* script */
|
|
var __vue_script__$8 = script$8;
|
|
/* template */
|
|
|
|
var __vue_render__$b = function __vue_render__() {
|
|
var _vm = this;
|
|
|
|
var _h = _vm.$createElement;
|
|
|
|
var _c = _vm._self._c || _h;
|
|
|
|
return _c('div', {
|
|
class: _vm.prefixClass + "-time"
|
|
}, [_vm.showTimeHeader ? _c('div', {
|
|
class: _vm.prefixClass + "-time-header"
|
|
}, [_c('button', {
|
|
class: _vm.prefixClass + "-btn " + _vm.prefixClass + "-btn-text " + _vm.prefixClass + "-time-header-title",
|
|
attrs: {
|
|
"type": "button"
|
|
},
|
|
on: {
|
|
"click": _vm.handleClickTitle
|
|
}
|
|
}, [_vm._v("\n " + _vm._s(_vm.title) + "\n ")])]) : _vm._e(), _vm._v(" "), _c('div', {
|
|
class: _vm.prefixClass + "-time-content"
|
|
}, [_vm.timePickerOptions ? _c('list-options', {
|
|
attrs: {
|
|
"date": _vm.innerValue,
|
|
"get-classes": _vm.getClasses,
|
|
"options": _vm.timePickerOptions,
|
|
"format": _vm.innerForamt
|
|
},
|
|
on: {
|
|
"select": _vm.handleSelect
|
|
}
|
|
}) : _c('list-columns', _vm._b({
|
|
attrs: {
|
|
"date": _vm.innerValue,
|
|
"get-classes": _vm.getClasses,
|
|
"hour-options": _vm.hourOptions,
|
|
"minute-options": _vm.minuteOptions,
|
|
"second-options": _vm.secondOptions,
|
|
"hour-step": _vm.hourStep,
|
|
"minute-step": _vm.minuteStep,
|
|
"second-step": _vm.secondStep,
|
|
"scroll-duration": _vm.scrollDuration
|
|
},
|
|
on: {
|
|
"select": _vm.handleSelect
|
|
}
|
|
}, 'list-columns', _vm.ShowHourMinuteSecondAMPM, false))], 1)]);
|
|
};
|
|
|
|
var __vue_staticRenderFns__$b = [];
|
|
/* style */
|
|
|
|
var __vue_inject_styles__$b = undefined;
|
|
/* scoped */
|
|
|
|
var __vue_scope_id__$b = undefined;
|
|
/* module identifier */
|
|
|
|
var __vue_module_identifier__$b = undefined;
|
|
/* functional template */
|
|
|
|
var __vue_is_functional_template__$b = false;
|
|
/* style inject */
|
|
|
|
/* style inject SSR */
|
|
|
|
/* style inject shadow dom */
|
|
|
|
var __vue_component__$b = normalizeComponent({
|
|
render: __vue_render__$b,
|
|
staticRenderFns: __vue_staticRenderFns__$b
|
|
}, __vue_inject_styles__$b, __vue_script__$8, __vue_scope_id__$b, __vue_is_functional_template__$b, __vue_module_identifier__$b, false, undefined, undefined, undefined);
|
|
|
|
var TimeRange = {
|
|
name: 'TimeRange',
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
props: _objectSpread2({}, __vue_component__$b.props),
|
|
data: function data() {
|
|
return {
|
|
startValue: new Date(NaN),
|
|
endValue: new Date(NaN)
|
|
};
|
|
},
|
|
watch: {
|
|
value: {
|
|
immediate: true,
|
|
handler: function handler() {
|
|
if (isValidRangeDate(this.value)) {
|
|
var _this$value = _slicedToArray(this.value, 2),
|
|
startValue = _this$value[0],
|
|
endValue = _this$value[1];
|
|
|
|
this.startValue = startValue;
|
|
this.endValue = endValue;
|
|
} else {
|
|
this.startValue = new Date(NaN);
|
|
this.endValue = new Date(NaN);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
emitChange: function emitChange(type, index) {
|
|
var date = [this.startValue, this.endValue];
|
|
this.$emit('select', date, type === 'time' ? 'time-range' : type, index);
|
|
},
|
|
handleSelectStart: function handleSelectStart(date, type) {
|
|
this.startValue = date; // check the NaN
|
|
|
|
if (!(this.endValue.getTime() >= date.getTime())) {
|
|
this.endValue = date;
|
|
}
|
|
|
|
this.emitChange(type, 0);
|
|
},
|
|
handleSelectEnd: function handleSelectEnd(date, type) {
|
|
// check the NaN
|
|
this.endValue = date;
|
|
|
|
if (!(this.startValue.getTime() <= date.getTime())) {
|
|
this.startValue = date;
|
|
}
|
|
|
|
this.emitChange(type, 1);
|
|
},
|
|
disabledStartTime: function disabledStartTime(date) {
|
|
return this.disabledTime(date, 0);
|
|
},
|
|
disabledEndTime: function disabledEndTime(date) {
|
|
return date.getTime() < this.startValue.getTime() || this.disabledTime(date, 1);
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
var defaultValues = Array.isArray(this.defaultValue) ? this.defaultValue : [this.defaultValue, this.defaultValue];
|
|
var prefixClass = this.prefixClass;
|
|
return h("div", {
|
|
"class": "".concat(prefixClass, "-range-wrapper")
|
|
}, [h(__vue_component__$b, {
|
|
"props": _objectSpread2({}, _objectSpread2({}, this.$props, {
|
|
value: this.startValue,
|
|
defaultValue: defaultValues[0],
|
|
disabledTime: this.disabledStartTime
|
|
})),
|
|
"on": _objectSpread2({}, _objectSpread2({}, this.$listeners, {
|
|
select: this.handleSelectStart
|
|
}))
|
|
}), h(__vue_component__$b, {
|
|
"props": _objectSpread2({}, _objectSpread2({}, this.$props, {
|
|
value: this.endValue,
|
|
defaultValue: defaultValues[1],
|
|
disabledTime: this.disabledEndTime
|
|
})),
|
|
"on": _objectSpread2({}, _objectSpread2({}, this.$listeners, {
|
|
select: this.handleSelectEnd
|
|
}))
|
|
})]);
|
|
}
|
|
};
|
|
|
|
var DatetimePanel = {
|
|
name: 'DatetimePanel',
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
emits: ['select', 'update:show-time-panel'],
|
|
props: _objectSpread2({}, CalendarPanel.props, {}, __vue_component__$b.props, {
|
|
showTimePanel: {
|
|
type: Boolean,
|
|
default: undefined
|
|
}
|
|
}),
|
|
data: function data() {
|
|
return {
|
|
defaultTimeVisible: false,
|
|
currentValue: this.value
|
|
};
|
|
},
|
|
computed: {
|
|
timeVisible: function timeVisible() {
|
|
return typeof this.showTimePanel === 'boolean' ? this.showTimePanel : this.defaultTimeVisible;
|
|
}
|
|
},
|
|
watch: {
|
|
value: function value(val) {
|
|
this.currentValue = val;
|
|
}
|
|
},
|
|
methods: {
|
|
closeTimePanel: function closeTimePanel() {
|
|
this.defaultTimeVisible = false;
|
|
this.$emit('update:show-time-panel', false);
|
|
},
|
|
openTimePanel: function openTimePanel() {
|
|
this.defaultTimeVisible = true;
|
|
this.$emit('update:show-time-panel', true);
|
|
},
|
|
emitDate: function emitDate(date, type) {
|
|
this.$emit('select', date, type);
|
|
},
|
|
handleSelect: function handleSelect(date, type) {
|
|
if (type === 'date') {
|
|
this.openTimePanel();
|
|
}
|
|
|
|
var datetime = assignTime(date, getValidDate(this.value, this.defaultValue));
|
|
|
|
if (this.disabledTime(new Date(datetime))) {
|
|
// set the time of defalutValue;
|
|
datetime = assignTime(date, this.defaultValue);
|
|
|
|
if (this.disabledTime(new Date(datetime))) {
|
|
// if disabled don't emit date
|
|
this.currentValue = datetime;
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.emitDate(datetime, type);
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
var calendarProps = {
|
|
props: _objectSpread2({}, pick(this.$props, Object.keys(CalendarPanel.props)), {
|
|
type: 'date',
|
|
value: this.currentValue
|
|
}),
|
|
on: {
|
|
select: this.handleSelect
|
|
}
|
|
};
|
|
var timeProps = {
|
|
props: _objectSpread2({}, pick(this.$props, Object.keys(__vue_component__$b.props)), {
|
|
showTimeHeader: true,
|
|
value: this.currentValue
|
|
}),
|
|
on: {
|
|
select: this.emitDate,
|
|
clicktitle: this.closeTimePanel
|
|
}
|
|
};
|
|
var prefixClass = this.prefixClass;
|
|
return h("div", [h(CalendarPanel, helper([{}, calendarProps])), this.timeVisible && h(__vue_component__$b, helper([{
|
|
"class": "".concat(prefixClass, "-calendar-time")
|
|
}, timeProps]))]);
|
|
}
|
|
};
|
|
|
|
var DatetimeRange = {
|
|
name: 'DatetimeRange',
|
|
inject: {
|
|
prefixClass: {
|
|
default: 'mx'
|
|
}
|
|
},
|
|
emits: ['select', 'update:show-time-panel'],
|
|
props: _objectSpread2({}, CalendarRange.props, {}, TimeRange.props, {
|
|
showTimePanel: {
|
|
type: Boolean,
|
|
default: undefined
|
|
}
|
|
}),
|
|
data: function data() {
|
|
return {
|
|
defaultTimeVisible: false,
|
|
currentValue: this.value
|
|
};
|
|
},
|
|
computed: {
|
|
timeVisible: function timeVisible() {
|
|
return typeof this.showTimePanel === 'boolean' ? this.showTimePanel : this.defaultTimeVisible;
|
|
}
|
|
},
|
|
watch: {
|
|
value: function value(val) {
|
|
this.currentValue = val;
|
|
}
|
|
},
|
|
methods: {
|
|
closeTimePanel: function closeTimePanel() {
|
|
this.defaultTimeVisible = false;
|
|
this.$emit('update:show-time-panel', false);
|
|
},
|
|
openTimePanel: function openTimePanel() {
|
|
this.defaultTimeVisible = true;
|
|
this.$emit('update:show-time-panel', true);
|
|
},
|
|
emitDate: function emitDate(dates, type) {
|
|
this.$emit('select', dates, type);
|
|
},
|
|
handleSelect: function handleSelect(dates, type) {
|
|
var _this = this;
|
|
|
|
if (type === 'date') {
|
|
this.openTimePanel();
|
|
}
|
|
|
|
var defaultValues = Array.isArray(this.defaultValue) ? this.defaultValue : [this.defaultValue, this.defaultValue];
|
|
var datetimes = dates.map(function (date, i) {
|
|
var time = isValidRangeDate(_this.value) ? _this.value[i] : defaultValues[i];
|
|
return assignTime(date, time);
|
|
});
|
|
|
|
if (datetimes[1].getTime() < datetimes[0].getTime()) {
|
|
datetimes = [datetimes[0], datetimes[0]];
|
|
}
|
|
|
|
if (datetimes.some(this.disabledTime)) {
|
|
datetimes = dates.map(function (date, i) {
|
|
return assignTime(date, defaultValues[i]);
|
|
});
|
|
|
|
if (datetimes.some(this.disabledTime)) {
|
|
this.currentValue = datetimes;
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.emitDate(datetimes, type);
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
var calendarProps = {
|
|
props: _objectSpread2({}, pick(this.$props, Object.keys(CalendarRange.props)), {
|
|
type: 'date',
|
|
value: this.currentValue
|
|
}),
|
|
on: {
|
|
select: this.handleSelect
|
|
}
|
|
};
|
|
var timeProps = {
|
|
props: _objectSpread2({}, pick(this.$props, Object.keys(TimeRange.props)), {
|
|
value: this.currentValue,
|
|
showTimeHeader: true
|
|
}),
|
|
on: {
|
|
select: this.emitDate,
|
|
clicktitle: this.closeTimePanel
|
|
}
|
|
};
|
|
var prefixClass = this.prefixClass;
|
|
return h("div", [h(CalendarRange, helper([{}, calendarProps])), this.timeVisible && h(TimeRange, helper([{
|
|
"class": "".concat(prefixClass, "-calendar-time")
|
|
}, timeProps]))]);
|
|
}
|
|
};
|
|
|
|
var componentMap = {
|
|
default: CalendarPanel,
|
|
time: __vue_component__$b,
|
|
datetime: DatetimePanel
|
|
};
|
|
var componentRangeMap = {
|
|
default: CalendarRange,
|
|
time: TimeRange,
|
|
datetime: DatetimeRange
|
|
};
|
|
var DatePicker = {
|
|
name: 'DatePicker',
|
|
provide: function provide() {
|
|
var _this = this;
|
|
|
|
return {
|
|
// make locale reactive
|
|
getLocale: function getLocale() {
|
|
return _this.locale;
|
|
},
|
|
getWeek: this.getWeek,
|
|
prefixClass: this.prefixClass,
|
|
dispatchDatePicker: this.$emit.bind(this)
|
|
};
|
|
},
|
|
props: _objectSpread2({}, DatetimePanel.props, {
|
|
value: {},
|
|
valueType: {
|
|
type: String,
|
|
default: 'date' // date, format, timestamp, or token like 'YYYY-MM-DD'
|
|
|
|
},
|
|
type: {
|
|
type: String,
|
|
// ['date', 'datetime', 'time', 'year', 'month', 'week']
|
|
default: 'date'
|
|
},
|
|
format: {
|
|
type: String
|
|
},
|
|
formatter: {
|
|
type: Object
|
|
},
|
|
range: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
multiple: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
rangeSeparator: {
|
|
type: String
|
|
},
|
|
lang: {
|
|
type: [String, Object]
|
|
},
|
|
placeholder: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
editable: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
disabled: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
clearable: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
prefixClass: {
|
|
type: String,
|
|
default: 'mx'
|
|
},
|
|
inputClass: {},
|
|
inputAttr: {
|
|
type: Object,
|
|
default: function _default() {
|
|
return {};
|
|
}
|
|
},
|
|
appendToBody: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
open: {
|
|
type: Boolean,
|
|
default: undefined
|
|
},
|
|
popupClass: {},
|
|
popupStyle: {
|
|
type: Object,
|
|
default: function _default() {
|
|
return {};
|
|
}
|
|
},
|
|
inline: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
confirm: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
confirmText: {
|
|
type: String,
|
|
default: 'OK'
|
|
},
|
|
renderInputText: {
|
|
type: Function
|
|
},
|
|
shortcuts: {
|
|
type: Array,
|
|
validator: function validator(value) {
|
|
return Array.isArray(value) && value.every(function (v) {
|
|
return isObject(v) && typeof v.text === 'string' && typeof v.onClick === 'function';
|
|
});
|
|
},
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
}
|
|
}),
|
|
data: function data() {
|
|
return {
|
|
// cache the innervalue, wait to confirm
|
|
currentValue: null,
|
|
userInput: null,
|
|
defaultOpen: false
|
|
};
|
|
},
|
|
computed: {
|
|
popupVisible: function popupVisible() {
|
|
return !this.disabled && (typeof this.open === 'boolean' ? this.open : this.defaultOpen);
|
|
},
|
|
innerRangeSeparator: function innerRangeSeparator() {
|
|
return this.rangeSeparator || (this.multiple ? ',' : ' ~ ');
|
|
},
|
|
innerFormat: function innerFormat() {
|
|
var map = {
|
|
date: 'YYYY-MM-DD',
|
|
datetime: 'YYYY-MM-DD HH:mm:ss',
|
|
year: 'YYYY',
|
|
month: 'YYYY-MM',
|
|
time: 'HH:mm:ss',
|
|
week: 'w'
|
|
};
|
|
return this.format || map[this.type] || map.date;
|
|
},
|
|
innerValue: function innerValue() {
|
|
var value = this.value;
|
|
|
|
if (this.validMultipleType) {
|
|
value = Array.isArray(value) ? value : [];
|
|
return value.map(this.value2date);
|
|
}
|
|
|
|
if (this.range) {
|
|
value = Array.isArray(value) ? value.slice(0, 2) : [null, null];
|
|
return value.map(this.value2date);
|
|
}
|
|
|
|
return this.value2date(value);
|
|
},
|
|
text: function text() {
|
|
var _this2 = this;
|
|
|
|
if (this.userInput !== null) {
|
|
return this.userInput;
|
|
}
|
|
|
|
if (typeof this.renderInputText === 'function') {
|
|
return this.renderInputText(this.innerValue);
|
|
}
|
|
|
|
if (!this.isValidValue(this.innerValue)) {
|
|
return '';
|
|
}
|
|
|
|
if (Array.isArray(this.innerValue)) {
|
|
return this.innerValue.map(function (v) {
|
|
return _this2.formatDate(v);
|
|
}).join(this.innerRangeSeparator);
|
|
}
|
|
|
|
return this.formatDate(this.innerValue);
|
|
},
|
|
showClearIcon: function showClearIcon() {
|
|
return !this.disabled && this.clearable && this.text;
|
|
},
|
|
locale: function locale() {
|
|
if (isObject(this.lang)) {
|
|
return mergeDeep(getLocale(), this.lang);
|
|
}
|
|
|
|
return getLocale(this.lang);
|
|
},
|
|
validMultipleType: function validMultipleType() {
|
|
var types = ['date', 'month', 'year'];
|
|
return this.multiple && !this.range && types.indexOf(this.type) !== -1;
|
|
}
|
|
},
|
|
watch: {
|
|
innerValue: {
|
|
immediate: true,
|
|
handler: function handler(val) {
|
|
this.currentValue = val;
|
|
}
|
|
},
|
|
popupVisible: {
|
|
handler: function handler(val) {
|
|
if (val) {
|
|
this.currentValue = this.innerValue;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
created: function created() {
|
|
if (_typeof(this.format) === 'object') {
|
|
console.warn("[vue2-datepicker]: The prop `format` don't support Object any more. You can use the new prop `formatter` to replace it");
|
|
}
|
|
},
|
|
methods: {
|
|
handleClickOutSide: function handleClickOutSide(evt) {
|
|
var target = evt.target;
|
|
|
|
if (!this.$el.contains(target)) {
|
|
this.closePopup();
|
|
}
|
|
},
|
|
getFormatter: function getFormatter(key) {
|
|
return isObject(this.formatter) && this.formatter[key] || isObject(this.format) && this.format[key];
|
|
},
|
|
getWeek: function getWeek$1(date, options) {
|
|
if (typeof this.getFormatter('getWeek') === 'function') {
|
|
return this.getFormatter('getWeek')(date, options);
|
|
}
|
|
|
|
return (0,date_format_parse__WEBPACK_IMPORTED_MODULE_0__.getWeek)(date, options);
|
|
},
|
|
parseDate: function parseDate(value, fmt) {
|
|
fmt = fmt || this.innerFormat;
|
|
|
|
if (typeof this.getFormatter('parse') === 'function') {
|
|
return this.getFormatter('parse')(value, fmt);
|
|
}
|
|
|
|
var backupDate = new Date();
|
|
return (0,date_format_parse__WEBPACK_IMPORTED_MODULE_0__.parse)(value, fmt, {
|
|
locale: this.locale.formatLocale,
|
|
backupDate: backupDate
|
|
});
|
|
},
|
|
formatDate: function formatDate(date, fmt) {
|
|
fmt = fmt || this.innerFormat;
|
|
|
|
if (typeof this.getFormatter('stringify') === 'function') {
|
|
return this.getFormatter('stringify')(date, fmt);
|
|
}
|
|
|
|
return (0,date_format_parse__WEBPACK_IMPORTED_MODULE_0__.format)(date, fmt, {
|
|
locale: this.locale.formatLocale
|
|
});
|
|
},
|
|
// transform the outer value to inner date
|
|
value2date: function value2date(value) {
|
|
switch (this.valueType) {
|
|
case 'date':
|
|
return value instanceof Date ? new Date(value.getTime()) : new Date(NaN);
|
|
|
|
case 'timestamp':
|
|
return typeof value === 'number' ? new Date(value) : new Date(NaN);
|
|
|
|
case 'format':
|
|
return typeof value === 'string' ? this.parseDate(value) : new Date(NaN);
|
|
|
|
default:
|
|
return typeof value === 'string' ? this.parseDate(value, this.valueType) : new Date(NaN);
|
|
}
|
|
},
|
|
// transform the inner date to outer value
|
|
date2value: function date2value(date) {
|
|
if (!isValidDate(date)) return null;
|
|
|
|
switch (this.valueType) {
|
|
case 'date':
|
|
return date;
|
|
|
|
case 'timestamp':
|
|
return date.getTime();
|
|
|
|
case 'format':
|
|
return this.formatDate(date);
|
|
|
|
default:
|
|
return this.formatDate(date, this.valueType);
|
|
}
|
|
},
|
|
emitValue: function emitValue(date, type) {
|
|
var close = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
// fix IE11/10 trigger input event when input is focused. (placeholder !== '')
|
|
this.userInput = null;
|
|
var value = Array.isArray(date) ? date.map(this.date2value) : this.date2value(date);
|
|
this.$emit('input', value);
|
|
this.$emit('change', value, type);
|
|
|
|
if (close) {
|
|
this.closePopup();
|
|
}
|
|
|
|
return value;
|
|
},
|
|
isValidValue: function isValidValue(value) {
|
|
if (this.validMultipleType) {
|
|
return isValidDates(value);
|
|
}
|
|
|
|
if (this.range) {
|
|
return isValidRangeDate(value);
|
|
}
|
|
|
|
return isValidDate(value);
|
|
},
|
|
isValidValueAndNotDisabled: function isValidValueAndNotDisabled(value) {
|
|
if (!this.isValidValue(value)) {
|
|
return false;
|
|
}
|
|
|
|
var disabledDate = typeof this.disabledDate === 'function' ? this.disabledDate : function () {
|
|
return false;
|
|
};
|
|
var disabledTime = typeof this.disabledTime === 'function' ? this.disabledTime : function () {
|
|
return false;
|
|
};
|
|
|
|
if (!Array.isArray(value)) {
|
|
value = [value];
|
|
}
|
|
|
|
return value.every(function (v) {
|
|
return !disabledDate(v) && !disabledTime(v);
|
|
});
|
|
},
|
|
handleMultipleDates: function handleMultipleDates(date, dates) {
|
|
if (this.validMultipleType && dates) {
|
|
var nextDates = dates.filter(function (v) {
|
|
return v.getTime() !== date.getTime();
|
|
});
|
|
|
|
if (nextDates.length === dates.length) {
|
|
nextDates.push(date);
|
|
}
|
|
|
|
return nextDates;
|
|
}
|
|
|
|
return date;
|
|
},
|
|
handleSelectDate: function handleSelectDate(val, type, dates) {
|
|
val = this.handleMultipleDates(val, dates);
|
|
|
|
if (this.confirm) {
|
|
this.currentValue = val;
|
|
} else {
|
|
this.emitValue(val, type, // this.type === 'datetime', click the time should close popup
|
|
!this.validMultipleType && (type === this.type || type === 'time'));
|
|
}
|
|
},
|
|
clear: function clear() {
|
|
this.emitValue(this.range ? [null, null] : null);
|
|
this.$emit('clear');
|
|
},
|
|
handleClear: function handleClear(evt) {
|
|
evt.stopPropagation();
|
|
this.clear();
|
|
},
|
|
handleConfirmDate: function handleConfirmDate() {
|
|
var value = this.emitValue(this.currentValue);
|
|
this.$emit('confirm', value);
|
|
},
|
|
handleSelectShortcut: function handleSelectShortcut(evt) {
|
|
var index = evt.currentTarget.getAttribute('data-index');
|
|
var item = this.shortcuts[parseInt(index, 10)];
|
|
|
|
if (isObject(item) && typeof item.onClick === 'function') {
|
|
var date = item.onClick(this);
|
|
|
|
if (date) {
|
|
this.emitValue(date);
|
|
}
|
|
}
|
|
},
|
|
openPopup: function openPopup(evt) {
|
|
if (this.popupVisible || this.disabled) return;
|
|
this.defaultOpen = true;
|
|
this.$emit('open', evt);
|
|
this.$emit('update:open', true);
|
|
},
|
|
closePopup: function closePopup() {
|
|
if (!this.popupVisible) return;
|
|
this.defaultOpen = false;
|
|
this.$emit('close');
|
|
this.$emit('update:open', false);
|
|
},
|
|
blur: function blur() {
|
|
// when use slot input
|
|
if (this.$refs.input) {
|
|
this.$refs.input.blur();
|
|
}
|
|
},
|
|
focus: function focus() {
|
|
if (this.$refs.input) {
|
|
this.$refs.input.focus();
|
|
}
|
|
},
|
|
handleInputChange: function handleInputChange() {
|
|
var _this3 = this;
|
|
|
|
if (!this.editable || this.userInput === null) return;
|
|
var text = this.userInput.trim();
|
|
this.userInput = null;
|
|
|
|
if (text === '') {
|
|
this.clear();
|
|
return;
|
|
}
|
|
|
|
var date;
|
|
|
|
if (this.validMultipleType) {
|
|
date = text.split(this.innerRangeSeparator).map(function (v) {
|
|
return _this3.parseDate(v.trim());
|
|
});
|
|
} else if (this.range) {
|
|
var arr = text.split(this.innerRangeSeparator);
|
|
|
|
if (arr.length !== 2) {
|
|
// Maybe the separator during the day is the same as the separator for the date
|
|
// eg: 2019-10-09-2020-01-02
|
|
arr = text.split(this.innerRangeSeparator.trim());
|
|
}
|
|
|
|
date = arr.map(function (v) {
|
|
return _this3.parseDate(v.trim());
|
|
});
|
|
} else {
|
|
date = this.parseDate(text);
|
|
}
|
|
|
|
if (this.isValidValueAndNotDisabled(date)) {
|
|
this.emitValue(date);
|
|
this.blur();
|
|
} else {
|
|
this.$emit('input-error', text);
|
|
}
|
|
},
|
|
handleInputInput: function handleInputInput(evt) {
|
|
// slot input v-model
|
|
this.userInput = typeof evt === 'string' ? evt : evt.target.value;
|
|
},
|
|
handleInputKeydown: function handleInputKeydown(evt) {
|
|
var keyCode = evt.keyCode; // Tab 9 or Enter 13
|
|
|
|
if (keyCode === 9) {
|
|
this.closePopup();
|
|
} else if (keyCode === 13) {
|
|
this.handleInputChange();
|
|
}
|
|
},
|
|
handleInputBlur: function handleInputBlur(evt) {
|
|
// tab close
|
|
this.$emit('blur', evt);
|
|
},
|
|
handleInputFocus: function handleInputFocus(evt) {
|
|
this.openPopup(evt);
|
|
this.$emit('focus', evt);
|
|
},
|
|
hasSlot: function hasSlot(name) {
|
|
return !!(this.$slots[name] || this.$scopedSlots[name]);
|
|
},
|
|
renderSlot: function renderSlot(name, fallback, props) {
|
|
var slotFn = this.$scopedSlots[name];
|
|
|
|
if (slotFn) {
|
|
return slotFn(props) || fallback;
|
|
}
|
|
|
|
return this.$slots[name] || fallback;
|
|
},
|
|
renderInput: function renderInput() {
|
|
var h = this.$createElement;
|
|
var prefixClass = this.prefixClass;
|
|
|
|
var props = _objectSpread2({
|
|
name: 'date',
|
|
type: 'text',
|
|
autocomplete: 'off',
|
|
value: this.text,
|
|
class: this.inputClass || "".concat(this.prefixClass, "-input"),
|
|
readonly: !this.editable,
|
|
disabled: this.disabled,
|
|
placeholder: this.placeholder
|
|
}, this.inputAttr);
|
|
|
|
var value = props.value,
|
|
className = props.class,
|
|
attrs = _objectWithoutProperties(props, ["value", "class"]);
|
|
|
|
var events = {
|
|
keydown: this.handleInputKeydown,
|
|
focus: this.handleInputFocus,
|
|
blur: this.handleInputBlur,
|
|
input: this.handleInputInput,
|
|
change: this.handleInputChange
|
|
};
|
|
var input = this.renderSlot('input', h("input", {
|
|
"domProps": {
|
|
"value": value
|
|
},
|
|
"class": className,
|
|
"attrs": _objectSpread2({}, attrs),
|
|
"on": _objectSpread2({}, events),
|
|
"ref": "input"
|
|
}), {
|
|
props: props,
|
|
events: events
|
|
});
|
|
var calendarIcon = this.type === 'time' ? h(__vue_component__$2) : h(__vue_component__$1);
|
|
return h("div", {
|
|
"class": "".concat(prefixClass, "-input-wrapper"),
|
|
"on": {
|
|
"mousedown": this.openPopup,
|
|
"touchstart": this.openPopup
|
|
}
|
|
}, [input, this.showClearIcon ? h("i", {
|
|
"class": "".concat(prefixClass, "-icon-clear"),
|
|
"on": {
|
|
"mousedown": this.handleClear,
|
|
"touchstart": this.handleClear
|
|
}
|
|
}, [this.renderSlot('icon-clear', h(__vue_component__$3))]) : null, h("i", {
|
|
"class": "".concat(prefixClass, "-icon-calendar")
|
|
}, [this.renderSlot('icon-calendar', calendarIcon)])]);
|
|
},
|
|
renderContent: function renderContent() {
|
|
var h = this.$createElement;
|
|
var map = this.range ? componentRangeMap : componentMap;
|
|
var Component = map[this.type] || map.default;
|
|
|
|
var props = _objectSpread2({}, pick(this.$props, Object.keys(Component.props)), {
|
|
value: this.currentValue
|
|
});
|
|
|
|
var on = _objectSpread2({}, pick(this.$listeners, Component.emits || []), {
|
|
select: this.handleSelectDate
|
|
});
|
|
|
|
var content = h(Component, helper([{}, {
|
|
props: props,
|
|
on: on,
|
|
ref: 'picker'
|
|
}]));
|
|
return h("div", {
|
|
"class": "".concat(this.prefixClass, "-datepicker-body")
|
|
}, [this.renderSlot('content', content, {
|
|
value: this.currentValue,
|
|
emit: this.handleSelectDate
|
|
})]);
|
|
},
|
|
renderSidebar: function renderSidebar() {
|
|
var _this4 = this;
|
|
|
|
var h = this.$createElement;
|
|
var prefixClass = this.prefixClass;
|
|
return h("div", {
|
|
"class": "".concat(prefixClass, "-datepicker-sidebar")
|
|
}, [this.renderSlot('sidebar', null, {
|
|
value: this.currentValue,
|
|
emit: this.handleSelectDate
|
|
}), this.shortcuts.map(function (v, i) {
|
|
return h("button", {
|
|
"key": i,
|
|
"attrs": {
|
|
"data-index": i,
|
|
"type": "button"
|
|
},
|
|
"class": "".concat(prefixClass, "-btn ").concat(prefixClass, "-btn-text ").concat(prefixClass, "-btn-shortcut"),
|
|
"on": {
|
|
"click": _this4.handleSelectShortcut
|
|
}
|
|
}, [v.text]);
|
|
})]);
|
|
},
|
|
renderHeader: function renderHeader() {
|
|
var h = this.$createElement;
|
|
return h("div", {
|
|
"class": "".concat(this.prefixClass, "-datepicker-header")
|
|
}, [this.renderSlot('header', null, {
|
|
value: this.currentValue,
|
|
emit: this.handleSelectDate
|
|
})]);
|
|
},
|
|
renderFooter: function renderFooter() {
|
|
var h = this.$createElement;
|
|
var prefixClass = this.prefixClass;
|
|
return h("div", {
|
|
"class": "".concat(prefixClass, "-datepicker-footer")
|
|
}, [this.renderSlot('footer', null, {
|
|
value: this.currentValue,
|
|
emit: this.handleSelectDate
|
|
}), this.confirm ? h("button", {
|
|
"attrs": {
|
|
"type": "button"
|
|
},
|
|
"class": "".concat(prefixClass, "-btn ").concat(prefixClass, "-datepicker-btn-confirm"),
|
|
"on": {
|
|
"click": this.handleConfirmDate
|
|
}
|
|
}, [this.confirmText]) : null]);
|
|
}
|
|
},
|
|
render: function render() {
|
|
var _class;
|
|
|
|
var h = arguments[0];
|
|
var prefixClass = this.prefixClass,
|
|
inline = this.inline,
|
|
disabled = this.disabled;
|
|
var sidedar = this.hasSlot('sidebar') || this.shortcuts.length ? this.renderSidebar() : null;
|
|
var content = h("div", {
|
|
"class": "".concat(prefixClass, "-datepicker-content")
|
|
}, [this.hasSlot('header') ? this.renderHeader() : null, this.renderContent(), this.hasSlot('footer') || this.confirm ? this.renderFooter() : null]);
|
|
return h("div", {
|
|
"class": (_class = {}, _defineProperty(_class, "".concat(prefixClass, "-datepicker"), true), _defineProperty(_class, "".concat(prefixClass, "-datepicker-range"), this.range), _defineProperty(_class, "".concat(prefixClass, "-datepicker-inline"), inline), _defineProperty(_class, "disabled", disabled), _class)
|
|
}, [!inline ? this.renderInput() : null, !inline ? h(__vue_component__, {
|
|
"ref": "popup",
|
|
"class": this.popupClass,
|
|
"style": this.popupStyle,
|
|
"attrs": {
|
|
"visible": this.popupVisible,
|
|
"appendToBody": this.appendToBody
|
|
},
|
|
"on": {
|
|
"clickoutside": this.handleClickOutSide
|
|
}
|
|
}, [sidedar, content]) : h("div", {
|
|
"class": "".concat(prefixClass, "-datepicker-main")
|
|
}, [sidedar, content])]);
|
|
}
|
|
};
|
|
|
|
DatePicker.locale = locale;
|
|
|
|
DatePicker.install = function install(Vue) {
|
|
Vue.component(DatePicker.name, DatePicker);
|
|
};
|
|
|
|
if (typeof window !== 'undefined' && window.Vue) {
|
|
DatePicker.install(window.Vue);
|
|
}
|
|
|
|
_extends(DatePicker, {
|
|
CalendarPanel: CalendarPanel,
|
|
CalendarRange: CalendarRange,
|
|
TimePanel: __vue_component__$b,
|
|
TimeRange: TimeRange,
|
|
DatetimePanel: DatetimePanel,
|
|
DatetimeRange: DatetimeRange
|
|
});
|
|
|
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DatePicker);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/vue/dist/vue.esm-bundler.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/vue/dist/vue.esm-bundler.js ***!
|
|
\**************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "BaseTransition": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.BaseTransition),
|
|
/* harmony export */ "Comment": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Comment),
|
|
/* harmony export */ "Fragment": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Fragment),
|
|
/* harmony export */ "KeepAlive": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.KeepAlive),
|
|
/* harmony export */ "Static": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Static),
|
|
/* harmony export */ "Suspense": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Suspense),
|
|
/* harmony export */ "Teleport": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Teleport),
|
|
/* harmony export */ "Text": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Text),
|
|
/* harmony export */ "Transition": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Transition),
|
|
/* harmony export */ "TransitionGroup": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TransitionGroup),
|
|
/* harmony export */ "callWithAsyncErrorHandling": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling),
|
|
/* harmony export */ "callWithErrorHandling": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling),
|
|
/* harmony export */ "camelize": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.camelize),
|
|
/* harmony export */ "capitalize": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.capitalize),
|
|
/* harmony export */ "cloneVNode": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.cloneVNode),
|
|
/* harmony export */ "computed": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.computed),
|
|
/* harmony export */ "createApp": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createApp),
|
|
/* harmony export */ "createBlock": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createBlock),
|
|
/* harmony export */ "createCommentVNode": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode),
|
|
/* harmony export */ "createHydrationRenderer": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer),
|
|
/* harmony export */ "createRenderer": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createRenderer),
|
|
/* harmony export */ "createSSRApp": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSSRApp),
|
|
/* harmony export */ "createSlots": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSlots),
|
|
/* harmony export */ "createStaticVNode": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode),
|
|
/* harmony export */ "createTextVNode": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createTextVNode),
|
|
/* harmony export */ "createVNode": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createVNode),
|
|
/* harmony export */ "customRef": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.customRef),
|
|
/* harmony export */ "defineAsyncComponent": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent),
|
|
/* harmony export */ "defineComponent": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineComponent),
|
|
/* harmony export */ "defineEmit": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineEmit),
|
|
/* harmony export */ "defineProps": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineProps),
|
|
/* harmony export */ "devtools": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.devtools),
|
|
/* harmony export */ "getCurrentInstance": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance),
|
|
/* harmony export */ "getTransitionRawChildren": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren),
|
|
/* harmony export */ "h": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.h),
|
|
/* harmony export */ "handleError": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.handleError),
|
|
/* harmony export */ "hydrate": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.hydrate),
|
|
/* harmony export */ "initCustomFormatter": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter),
|
|
/* harmony export */ "inject": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.inject),
|
|
/* harmony export */ "isProxy": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isProxy),
|
|
/* harmony export */ "isReactive": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReactive),
|
|
/* harmony export */ "isReadonly": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReadonly),
|
|
/* harmony export */ "isRef": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRef),
|
|
/* harmony export */ "isRuntimeOnly": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly),
|
|
/* harmony export */ "isVNode": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isVNode),
|
|
/* harmony export */ "markRaw": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.markRaw),
|
|
/* harmony export */ "mergeProps": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeProps),
|
|
/* harmony export */ "nextTick": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.nextTick),
|
|
/* harmony export */ "onActivated": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onActivated),
|
|
/* harmony export */ "onBeforeMount": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount),
|
|
/* harmony export */ "onBeforeUnmount": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount),
|
|
/* harmony export */ "onBeforeUpdate": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate),
|
|
/* harmony export */ "onDeactivated": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onDeactivated),
|
|
/* harmony export */ "onErrorCaptured": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured),
|
|
/* harmony export */ "onMounted": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onMounted),
|
|
/* harmony export */ "onRenderTracked": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked),
|
|
/* harmony export */ "onRenderTriggered": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered),
|
|
/* harmony export */ "onUnmounted": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUnmounted),
|
|
/* harmony export */ "onUpdated": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUpdated),
|
|
/* harmony export */ "openBlock": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.openBlock),
|
|
/* harmony export */ "popScopeId": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.popScopeId),
|
|
/* harmony export */ "provide": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.provide),
|
|
/* harmony export */ "proxyRefs": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.proxyRefs),
|
|
/* harmony export */ "pushScopeId": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.pushScopeId),
|
|
/* harmony export */ "queuePostFlushCb": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb),
|
|
/* harmony export */ "reactive": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.reactive),
|
|
/* harmony export */ "readonly": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.readonly),
|
|
/* harmony export */ "ref": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ref),
|
|
/* harmony export */ "registerRuntimeCompiler": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler),
|
|
/* harmony export */ "render": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.render),
|
|
/* harmony export */ "renderList": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderList),
|
|
/* harmony export */ "renderSlot": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderSlot),
|
|
/* harmony export */ "resolveComponent": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveComponent),
|
|
/* harmony export */ "resolveDirective": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDirective),
|
|
/* harmony export */ "resolveDynamicComponent": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent),
|
|
/* harmony export */ "resolveTransitionHooks": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks),
|
|
/* harmony export */ "setBlockTracking": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking),
|
|
/* harmony export */ "setDevtoolsHook": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook),
|
|
/* harmony export */ "setTransitionHooks": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks),
|
|
/* harmony export */ "shallowReactive": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReactive),
|
|
/* harmony export */ "shallowReadonly": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly),
|
|
/* harmony export */ "shallowRef": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowRef),
|
|
/* harmony export */ "ssrContextKey": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey),
|
|
/* harmony export */ "ssrUtils": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrUtils),
|
|
/* harmony export */ "toDisplayString": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toDisplayString),
|
|
/* harmony export */ "toHandlerKey": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey),
|
|
/* harmony export */ "toHandlers": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlers),
|
|
/* harmony export */ "toRaw": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRaw),
|
|
/* harmony export */ "toRef": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRef),
|
|
/* harmony export */ "toRefs": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRefs),
|
|
/* harmony export */ "transformVNodeArgs": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs),
|
|
/* harmony export */ "triggerRef": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.triggerRef),
|
|
/* harmony export */ "unref": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.unref),
|
|
/* harmony export */ "useContext": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useContext),
|
|
/* harmony export */ "useCssModule": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssModule),
|
|
/* harmony export */ "useCssVars": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssVars),
|
|
/* harmony export */ "useSSRContext": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSSRContext),
|
|
/* harmony export */ "useTransitionState": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useTransitionState),
|
|
/* harmony export */ "vModelCheckbox": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelCheckbox),
|
|
/* harmony export */ "vModelDynamic": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelDynamic),
|
|
/* harmony export */ "vModelRadio": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelRadio),
|
|
/* harmony export */ "vModelSelect": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelSelect),
|
|
/* harmony export */ "vModelText": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelText),
|
|
/* harmony export */ "vShow": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vShow),
|
|
/* harmony export */ "version": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.version),
|
|
/* harmony export */ "warn": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.warn),
|
|
/* harmony export */ "watch": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watch),
|
|
/* harmony export */ "watchEffect": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchEffect),
|
|
/* harmony export */ "withCtx": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withCtx),
|
|
/* harmony export */ "withDirectives": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDirectives),
|
|
/* harmony export */ "withKeys": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withKeys),
|
|
/* harmony export */ "withModifiers": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withModifiers),
|
|
/* harmony export */ "withScopeId": () => (/* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withScopeId),
|
|
/* harmony export */ "compile": () => (/* binding */ compileToFunction)
|
|
/* harmony export */ });
|
|
/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-dom */ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js");
|
|
/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/runtime-dom */ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js");
|
|
/* harmony import */ var _vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @vue/compiler-dom */ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js");
|
|
/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function initDev() {
|
|
{
|
|
(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_2__.initCustomFormatter)();
|
|
}
|
|
}
|
|
|
|
// This entry is the "full-build" that includes both the runtime
|
|
if ((true)) {
|
|
initDev();
|
|
}
|
|
const compileCache = Object.create(null);
|
|
function compileToFunction(template, options) {
|
|
if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(template)) {
|
|
if (template.nodeType) {
|
|
template = template.innerHTML;
|
|
}
|
|
else {
|
|
( true) && (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_2__.warn)(`invalid template option: `, template);
|
|
return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP;
|
|
}
|
|
}
|
|
const key = template;
|
|
const cached = compileCache[key];
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
if (template[0] === '#') {
|
|
const el = document.querySelector(template);
|
|
if (( true) && !el) {
|
|
(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_2__.warn)(`Template element not found or is empty: ${template}`);
|
|
}
|
|
// __UNSAFE__
|
|
// Reason: potential execution of JS expressions in in-DOM template.
|
|
// The user must make sure the in-DOM template is trusted. If it's rendered
|
|
// by the server, the template should not contain any user data.
|
|
template = el ? el.innerHTML : ``;
|
|
}
|
|
const { code } = (0,_vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__.compile)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({
|
|
hoistStatic: true,
|
|
onError(err) {
|
|
if ((true)) {
|
|
const message = `Template compilation error: ${err.message}`;
|
|
const codeFrame = err.loc &&
|
|
(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.generateCodeFrame)(template, err.loc.start.offset, err.loc.end.offset);
|
|
(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_2__.warn)(codeFrame ? `${message}\n${codeFrame}` : message);
|
|
}
|
|
else {}
|
|
}
|
|
}, options));
|
|
// The wildcard import results in a huge object with every export
|
|
// with keys that cannot be mangled, and can be quite heavy size-wise.
|
|
// In the global build we know `Vue` is available globally so we can avoid
|
|
// the wildcard object.
|
|
const render = (new Function('Vue', code)(_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__));
|
|
render._rc = true;
|
|
return (compileCache[key] = render);
|
|
}
|
|
(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_2__.registerRuntimeCompiler)(compileToFunction);
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/vuedraggable/dist/vuedraggable.umd.js":
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/vuedraggable/dist/vuedraggable.umd.js ***!
|
|
\************************************************************/
|
|
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
|
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
if(true)
|
|
module.exports = factory(__webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js"), __webpack_require__(/*! sortablejs */ "./node_modules/sortablejs/modular/sortable.esm.js"));
|
|
else {}
|
|
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__8bbf__, __WEBPACK_EXTERNAL_MODULE_a352__) {
|
|
return /******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __nested_webpack_require_770__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId]) {
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ i: moduleId,
|
|
/******/ l: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_770__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.l = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __nested_webpack_require_770__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __nested_webpack_require_770__.c = installedModules;
|
|
/******/
|
|
/******/ // define getter function for harmony exports
|
|
/******/ __nested_webpack_require_770__.d = function(exports, name, getter) {
|
|
/******/ if(!__nested_webpack_require_770__.o(exports, name)) {
|
|
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // define __esModule on exports
|
|
/******/ __nested_webpack_require_770__.r = function(exports) {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/
|
|
/******/ // create a fake namespace object
|
|
/******/ // mode & 1: value is a module id, require it
|
|
/******/ // mode & 2: merge all properties of value into the ns
|
|
/******/ // mode & 4: return value when already ns object
|
|
/******/ // mode & 8|1: behave like require
|
|
/******/ __nested_webpack_require_770__.t = function(value, mode) {
|
|
/******/ if(mode & 1) value = __nested_webpack_require_770__(value);
|
|
/******/ if(mode & 8) return value;
|
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
|
/******/ var ns = Object.create(null);
|
|
/******/ __nested_webpack_require_770__.r(ns);
|
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_770__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
|
/******/ return ns;
|
|
/******/ };
|
|
/******/
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __nested_webpack_require_770__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function getDefault() { return module['default']; } :
|
|
/******/ function getModuleExports() { return module; };
|
|
/******/ __nested_webpack_require_770__.d(getter, 'a', getter);
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/
|
|
/******/ // Object.prototype.hasOwnProperty.call
|
|
/******/ __nested_webpack_require_770__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __nested_webpack_require_770__.p = "";
|
|
/******/
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __nested_webpack_require_770__(__nested_webpack_require_770__.s = "fb15");
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ({
|
|
|
|
/***/ "00ee":
|
|
/***/ (function(module, exports, __nested_webpack_require_4246__) {
|
|
|
|
var wellKnownSymbol = __nested_webpack_require_4246__("b622");
|
|
|
|
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
|
var test = {};
|
|
|
|
test[TO_STRING_TAG] = 'z';
|
|
|
|
module.exports = String(test) === '[object z]';
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "0366":
|
|
/***/ (function(module, exports, __nested_webpack_require_4526__) {
|
|
|
|
var aFunction = __nested_webpack_require_4526__("1c0b");
|
|
|
|
// optional / simple context binding
|
|
module.exports = function (fn, that, length) {
|
|
aFunction(fn);
|
|
if (that === undefined) return fn;
|
|
switch (length) {
|
|
case 0: return function () {
|
|
return fn.call(that);
|
|
};
|
|
case 1: return function (a) {
|
|
return fn.call(that, a);
|
|
};
|
|
case 2: return function (a, b) {
|
|
return fn.call(that, a, b);
|
|
};
|
|
case 3: return function (a, b, c) {
|
|
return fn.call(that, a, b, c);
|
|
};
|
|
}
|
|
return function (/* ...args */) {
|
|
return fn.apply(that, arguments);
|
|
};
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "057f":
|
|
/***/ (function(module, exports, __nested_webpack_require_5202__) {
|
|
|
|
var toIndexedObject = __nested_webpack_require_5202__("fc6a");
|
|
var nativeGetOwnPropertyNames = __nested_webpack_require_5202__("241c").f;
|
|
|
|
var toString = {}.toString;
|
|
|
|
var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
|
|
? Object.getOwnPropertyNames(window) : [];
|
|
|
|
var getWindowNames = function (it) {
|
|
try {
|
|
return nativeGetOwnPropertyNames(it);
|
|
} catch (error) {
|
|
return windowNames.slice();
|
|
}
|
|
};
|
|
|
|
// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
|
|
module.exports.f = function getOwnPropertyNames(it) {
|
|
return windowNames && toString.call(it) == '[object Window]'
|
|
? getWindowNames(it)
|
|
: nativeGetOwnPropertyNames(toIndexedObject(it));
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "06cf":
|
|
/***/ (function(module, exports, __nested_webpack_require_5983__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_5983__("83ab");
|
|
var propertyIsEnumerableModule = __nested_webpack_require_5983__("d1e7");
|
|
var createPropertyDescriptor = __nested_webpack_require_5983__("5c6c");
|
|
var toIndexedObject = __nested_webpack_require_5983__("fc6a");
|
|
var toPrimitive = __nested_webpack_require_5983__("c04e");
|
|
var has = __nested_webpack_require_5983__("5135");
|
|
var IE8_DOM_DEFINE = __nested_webpack_require_5983__("0cfb");
|
|
|
|
var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
|
|
// `Object.getOwnPropertyDescriptor` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor
|
|
exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
|
|
O = toIndexedObject(O);
|
|
P = toPrimitive(P, true);
|
|
if (IE8_DOM_DEFINE) try {
|
|
return nativeGetOwnPropertyDescriptor(O, P);
|
|
} catch (error) { /* empty */ }
|
|
if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "0cfb":
|
|
/***/ (function(module, exports, __nested_webpack_require_6977__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_6977__("83ab");
|
|
var fails = __nested_webpack_require_6977__("d039");
|
|
var createElement = __nested_webpack_require_6977__("cc12");
|
|
|
|
// Thank's IE8 for his funny defineProperty
|
|
module.exports = !DESCRIPTORS && !fails(function () {
|
|
return Object.defineProperty(createElement('div'), 'a', {
|
|
get: function () { return 7; }
|
|
}).a != 7;
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "13d5":
|
|
/***/ (function(module, exports, __nested_webpack_require_7409__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_7409__("23e7");
|
|
var $reduce = __nested_webpack_require_7409__("d58f").left;
|
|
var arrayMethodIsStrict = __nested_webpack_require_7409__("a640");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_7409__("ae40");
|
|
|
|
var STRICT_METHOD = arrayMethodIsStrict('reduce');
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
|
|
|
|
// `Array.prototype.reduce` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
|
|
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
|
|
reduce: function reduce(callbackfn /* , initialValue */) {
|
|
return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "14c3":
|
|
/***/ (function(module, exports, __nested_webpack_require_8178__) {
|
|
|
|
var classof = __nested_webpack_require_8178__("c6b6");
|
|
var regexpExec = __nested_webpack_require_8178__("9263");
|
|
|
|
// `RegExpExec` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-regexpexec
|
|
module.exports = function (R, S) {
|
|
var exec = R.exec;
|
|
if (typeof exec === 'function') {
|
|
var result = exec.call(R, S);
|
|
if (typeof result !== 'object') {
|
|
throw TypeError('RegExp exec method returned something other than an Object or null');
|
|
}
|
|
return result;
|
|
}
|
|
|
|
if (classof(R) !== 'RegExp') {
|
|
throw TypeError('RegExp#exec called on incompatible receiver');
|
|
}
|
|
|
|
return regexpExec.call(R, S);
|
|
};
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "159b":
|
|
/***/ (function(module, exports, __nested_webpack_require_8866__) {
|
|
|
|
var global = __nested_webpack_require_8866__("da84");
|
|
var DOMIterables = __nested_webpack_require_8866__("fdbc");
|
|
var forEach = __nested_webpack_require_8866__("17c2");
|
|
var createNonEnumerableProperty = __nested_webpack_require_8866__("9112");
|
|
|
|
for (var COLLECTION_NAME in DOMIterables) {
|
|
var Collection = global[COLLECTION_NAME];
|
|
var CollectionPrototype = Collection && Collection.prototype;
|
|
// some Chrome versions have non-configurable methods on DOMTokenList
|
|
if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {
|
|
createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);
|
|
} catch (error) {
|
|
CollectionPrototype.forEach = forEach;
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "17c2":
|
|
/***/ (function(module, exports, __nested_webpack_require_9590__) {
|
|
|
|
"use strict";
|
|
|
|
var $forEach = __nested_webpack_require_9590__("b727").forEach;
|
|
var arrayMethodIsStrict = __nested_webpack_require_9590__("a640");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_9590__("ae40");
|
|
|
|
var STRICT_METHOD = arrayMethodIsStrict('forEach');
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('forEach');
|
|
|
|
// `Array.prototype.forEach` method implementation
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
|
|
module.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {
|
|
return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
|
|
} : [].forEach;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "1be4":
|
|
/***/ (function(module, exports, __nested_webpack_require_10284__) {
|
|
|
|
var getBuiltIn = __nested_webpack_require_10284__("d066");
|
|
|
|
module.exports = getBuiltIn('document', 'documentElement');
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "1c0b":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = function (it) {
|
|
if (typeof it != 'function') {
|
|
throw TypeError(String(it) + ' is not a function');
|
|
} return it;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "1c7e":
|
|
/***/ (function(module, exports, __nested_webpack_require_10678__) {
|
|
|
|
var wellKnownSymbol = __nested_webpack_require_10678__("b622");
|
|
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
var SAFE_CLOSING = false;
|
|
|
|
try {
|
|
var called = 0;
|
|
var iteratorWithReturn = {
|
|
next: function () {
|
|
return { done: !!called++ };
|
|
},
|
|
'return': function () {
|
|
SAFE_CLOSING = true;
|
|
}
|
|
};
|
|
iteratorWithReturn[ITERATOR] = function () {
|
|
return this;
|
|
};
|
|
// eslint-disable-next-line no-throw-literal
|
|
Array.from(iteratorWithReturn, function () { throw 2; });
|
|
} catch (error) { /* empty */ }
|
|
|
|
module.exports = function (exec, SKIP_CLOSING) {
|
|
if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
|
|
var ITERATION_SUPPORT = false;
|
|
try {
|
|
var object = {};
|
|
object[ITERATOR] = function () {
|
|
return {
|
|
next: function () {
|
|
return { done: ITERATION_SUPPORT = true };
|
|
}
|
|
};
|
|
};
|
|
exec(object);
|
|
} catch (error) { /* empty */ }
|
|
return ITERATION_SUPPORT;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "1d80":
|
|
/***/ (function(module, exports) {
|
|
|
|
// `RequireObjectCoercible` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-requireobjectcoercible
|
|
module.exports = function (it) {
|
|
if (it == undefined) throw TypeError("Can't call method on " + it);
|
|
return it;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "1dde":
|
|
/***/ (function(module, exports, __nested_webpack_require_11975__) {
|
|
|
|
var fails = __nested_webpack_require_11975__("d039");
|
|
var wellKnownSymbol = __nested_webpack_require_11975__("b622");
|
|
var V8_VERSION = __nested_webpack_require_11975__("2d00");
|
|
|
|
var SPECIES = wellKnownSymbol('species');
|
|
|
|
module.exports = function (METHOD_NAME) {
|
|
// We can't use this feature detection in V8 since it causes
|
|
// deoptimization and serious performance degradation
|
|
// https://github.com/zloirock/core-js/issues/677
|
|
return V8_VERSION >= 51 || !fails(function () {
|
|
var array = [];
|
|
var constructor = array.constructor = {};
|
|
constructor[SPECIES] = function () {
|
|
return { foo: 1 };
|
|
};
|
|
return array[METHOD_NAME](Boolean).foo !== 1;
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "23cb":
|
|
/***/ (function(module, exports, __nested_webpack_require_12702__) {
|
|
|
|
var toInteger = __nested_webpack_require_12702__("a691");
|
|
|
|
var max = Math.max;
|
|
var min = Math.min;
|
|
|
|
// Helper for a popular repeating case of the spec:
|
|
// Let integer be ? ToInteger(index).
|
|
// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
|
|
module.exports = function (index, length) {
|
|
var integer = toInteger(index);
|
|
return integer < 0 ? max(integer + length, 0) : min(integer, length);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "23e7":
|
|
/***/ (function(module, exports, __nested_webpack_require_13218__) {
|
|
|
|
var global = __nested_webpack_require_13218__("da84");
|
|
var getOwnPropertyDescriptor = __nested_webpack_require_13218__("06cf").f;
|
|
var createNonEnumerableProperty = __nested_webpack_require_13218__("9112");
|
|
var redefine = __nested_webpack_require_13218__("6eeb");
|
|
var setGlobal = __nested_webpack_require_13218__("ce4e");
|
|
var copyConstructorProperties = __nested_webpack_require_13218__("e893");
|
|
var isForced = __nested_webpack_require_13218__("94ca");
|
|
|
|
/*
|
|
options.target - name of the target object
|
|
options.global - target is the global object
|
|
options.stat - export as static methods of target
|
|
options.proto - export as prototype methods of target
|
|
options.real - real prototype method for the `pure` version
|
|
options.forced - export even if the native feature is available
|
|
options.bind - bind methods to the target, required for the `pure` version
|
|
options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
|
|
options.unsafe - use the simple assignment of property instead of delete + defineProperty
|
|
options.sham - add a flag to not completely full polyfills
|
|
options.enumerable - export as enumerable property
|
|
options.noTargetGet - prevent calling a getter on target
|
|
*/
|
|
module.exports = function (options, source) {
|
|
var TARGET = options.target;
|
|
var GLOBAL = options.global;
|
|
var STATIC = options.stat;
|
|
var FORCED, target, key, targetProperty, sourceProperty, descriptor;
|
|
if (GLOBAL) {
|
|
target = global;
|
|
} else if (STATIC) {
|
|
target = global[TARGET] || setGlobal(TARGET, {});
|
|
} else {
|
|
target = (global[TARGET] || {}).prototype;
|
|
}
|
|
if (target) for (key in source) {
|
|
sourceProperty = source[key];
|
|
if (options.noTargetGet) {
|
|
descriptor = getOwnPropertyDescriptor(target, key);
|
|
targetProperty = descriptor && descriptor.value;
|
|
} else targetProperty = target[key];
|
|
FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
|
|
// contained in target
|
|
if (!FORCED && targetProperty !== undefined) {
|
|
if (typeof sourceProperty === typeof targetProperty) continue;
|
|
copyConstructorProperties(sourceProperty, targetProperty);
|
|
}
|
|
// add a flag to not completely full polyfills
|
|
if (options.sham || (targetProperty && targetProperty.sham)) {
|
|
createNonEnumerableProperty(sourceProperty, 'sham', true);
|
|
}
|
|
// extend global
|
|
redefine(target, key, sourceProperty, options);
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "241c":
|
|
/***/ (function(module, exports, __nested_webpack_require_15718__) {
|
|
|
|
var internalObjectKeys = __nested_webpack_require_15718__("ca84");
|
|
var enumBugKeys = __nested_webpack_require_15718__("7839");
|
|
|
|
var hiddenKeys = enumBugKeys.concat('length', 'prototype');
|
|
|
|
// `Object.getOwnPropertyNames` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertynames
|
|
exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
|
|
return internalObjectKeys(O, hiddenKeys);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "25f0":
|
|
/***/ (function(module, exports, __nested_webpack_require_16193__) {
|
|
|
|
"use strict";
|
|
|
|
var redefine = __nested_webpack_require_16193__("6eeb");
|
|
var anObject = __nested_webpack_require_16193__("825a");
|
|
var fails = __nested_webpack_require_16193__("d039");
|
|
var flags = __nested_webpack_require_16193__("ad6d");
|
|
|
|
var TO_STRING = 'toString';
|
|
var RegExpPrototype = RegExp.prototype;
|
|
var nativeToString = RegExpPrototype[TO_STRING];
|
|
|
|
var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
|
|
// FF44- RegExp#toString has a wrong name
|
|
var INCORRECT_NAME = nativeToString.name != TO_STRING;
|
|
|
|
// `RegExp.prototype.toString` method
|
|
// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring
|
|
if (NOT_GENERIC || INCORRECT_NAME) {
|
|
redefine(RegExp.prototype, TO_STRING, function toString() {
|
|
var R = anObject(this);
|
|
var p = String(R.source);
|
|
var rf = R.flags;
|
|
var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);
|
|
return '/' + p + '/' + f;
|
|
}, { unsafe: true });
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "2ca0":
|
|
/***/ (function(module, exports, __nested_webpack_require_17241__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_17241__("23e7");
|
|
var getOwnPropertyDescriptor = __nested_webpack_require_17241__("06cf").f;
|
|
var toLength = __nested_webpack_require_17241__("50c4");
|
|
var notARegExp = __nested_webpack_require_17241__("5a34");
|
|
var requireObjectCoercible = __nested_webpack_require_17241__("1d80");
|
|
var correctIsRegExpLogic = __nested_webpack_require_17241__("ab13");
|
|
var IS_PURE = __nested_webpack_require_17241__("c430");
|
|
|
|
var nativeStartsWith = ''.startsWith;
|
|
var min = Math.min;
|
|
|
|
var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
|
|
// https://github.com/zloirock/core-js/pull/702
|
|
var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
|
|
var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
|
|
return descriptor && !descriptor.writable;
|
|
}();
|
|
|
|
// `String.prototype.startsWith` method
|
|
// https://tc39.github.io/ecma262/#sec-string.prototype.startswith
|
|
$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
|
|
startsWith: function startsWith(searchString /* , position = 0 */) {
|
|
var that = String(requireObjectCoercible(this));
|
|
notARegExp(searchString);
|
|
var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
|
|
var search = String(searchString);
|
|
return nativeStartsWith
|
|
? nativeStartsWith.call(that, search, index)
|
|
: that.slice(index, index + search.length) === search;
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "2d00":
|
|
/***/ (function(module, exports, __nested_webpack_require_18702__) {
|
|
|
|
var global = __nested_webpack_require_18702__("da84");
|
|
var userAgent = __nested_webpack_require_18702__("342f");
|
|
|
|
var process = global.process;
|
|
var versions = process && process.versions;
|
|
var v8 = versions && versions.v8;
|
|
var match, version;
|
|
|
|
if (v8) {
|
|
match = v8.split('.');
|
|
version = match[0] + match[1];
|
|
} else if (userAgent) {
|
|
match = userAgent.match(/Edge\/(\d+)/);
|
|
if (!match || match[1] >= 74) {
|
|
match = userAgent.match(/Chrome\/(\d+)/);
|
|
if (match) version = match[1];
|
|
}
|
|
}
|
|
|
|
module.exports = version && +version;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "342f":
|
|
/***/ (function(module, exports, __nested_webpack_require_19297__) {
|
|
|
|
var getBuiltIn = __nested_webpack_require_19297__("d066");
|
|
|
|
module.exports = getBuiltIn('navigator', 'userAgent') || '';
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "35a1":
|
|
/***/ (function(module, exports, __nested_webpack_require_19489__) {
|
|
|
|
var classof = __nested_webpack_require_19489__("f5df");
|
|
var Iterators = __nested_webpack_require_19489__("3f8c");
|
|
var wellKnownSymbol = __nested_webpack_require_19489__("b622");
|
|
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
|
|
module.exports = function (it) {
|
|
if (it != undefined) return it[ITERATOR]
|
|
|| it['@@iterator']
|
|
|| Iterators[classof(it)];
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "37e8":
|
|
/***/ (function(module, exports, __nested_webpack_require_19892__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_19892__("83ab");
|
|
var definePropertyModule = __nested_webpack_require_19892__("9bf2");
|
|
var anObject = __nested_webpack_require_19892__("825a");
|
|
var objectKeys = __nested_webpack_require_19892__("df75");
|
|
|
|
// `Object.defineProperties` method
|
|
// https://tc39.github.io/ecma262/#sec-object.defineproperties
|
|
module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {
|
|
anObject(O);
|
|
var keys = objectKeys(Properties);
|
|
var length = keys.length;
|
|
var index = 0;
|
|
var key;
|
|
while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);
|
|
return O;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "3bbe":
|
|
/***/ (function(module, exports, __nested_webpack_require_20582__) {
|
|
|
|
var isObject = __nested_webpack_require_20582__("861d");
|
|
|
|
module.exports = function (it) {
|
|
if (!isObject(it) && it !== null) {
|
|
throw TypeError("Can't set " + String(it) + ' as a prototype');
|
|
} return it;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "3ca3":
|
|
/***/ (function(module, exports, __nested_webpack_require_20868__) {
|
|
|
|
"use strict";
|
|
|
|
var charAt = __nested_webpack_require_20868__("6547").charAt;
|
|
var InternalStateModule = __nested_webpack_require_20868__("69f3");
|
|
var defineIterator = __nested_webpack_require_20868__("7dd0");
|
|
|
|
var STRING_ITERATOR = 'String Iterator';
|
|
var setInternalState = InternalStateModule.set;
|
|
var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
|
|
|
|
// `String.prototype[@@iterator]` method
|
|
// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator
|
|
defineIterator(String, 'String', function (iterated) {
|
|
setInternalState(this, {
|
|
type: STRING_ITERATOR,
|
|
string: String(iterated),
|
|
index: 0
|
|
});
|
|
// `%StringIteratorPrototype%.next` method
|
|
// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next
|
|
}, function next() {
|
|
var state = getInternalState(this);
|
|
var string = state.string;
|
|
var index = state.index;
|
|
var point;
|
|
if (index >= string.length) return { value: undefined, done: true };
|
|
point = charAt(string, index);
|
|
state.index += point.length;
|
|
return { value: point, done: false };
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "3f8c":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = {};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "4160":
|
|
/***/ (function(module, exports, __nested_webpack_require_22053__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_22053__("23e7");
|
|
var forEach = __nested_webpack_require_22053__("17c2");
|
|
|
|
// `Array.prototype.forEach` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
|
|
$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {
|
|
forEach: forEach
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "428f":
|
|
/***/ (function(module, exports, __nested_webpack_require_22424__) {
|
|
|
|
var global = __nested_webpack_require_22424__("da84");
|
|
|
|
module.exports = global;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "44ad":
|
|
/***/ (function(module, exports, __nested_webpack_require_22576__) {
|
|
|
|
var fails = __nested_webpack_require_22576__("d039");
|
|
var classof = __nested_webpack_require_22576__("c6b6");
|
|
|
|
var split = ''.split;
|
|
|
|
// fallback for non-array-like ES3 and non-enumerable old V8 strings
|
|
module.exports = fails(function () {
|
|
// throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
|
|
// eslint-disable-next-line no-prototype-builtins
|
|
return !Object('z').propertyIsEnumerable(0);
|
|
}) ? function (it) {
|
|
return classof(it) == 'String' ? split.call(it, '') : Object(it);
|
|
} : Object;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "44d2":
|
|
/***/ (function(module, exports, __nested_webpack_require_23153__) {
|
|
|
|
var wellKnownSymbol = __nested_webpack_require_23153__("b622");
|
|
var create = __nested_webpack_require_23153__("7c73");
|
|
var definePropertyModule = __nested_webpack_require_23153__("9bf2");
|
|
|
|
var UNSCOPABLES = wellKnownSymbol('unscopables');
|
|
var ArrayPrototype = Array.prototype;
|
|
|
|
// Array.prototype[@@unscopables]
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
|
|
if (ArrayPrototype[UNSCOPABLES] == undefined) {
|
|
definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {
|
|
configurable: true,
|
|
value: create(null)
|
|
});
|
|
}
|
|
|
|
// add a key to Array.prototype[@@unscopables]
|
|
module.exports = function (key) {
|
|
ArrayPrototype[UNSCOPABLES][key] = true;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "44e7":
|
|
/***/ (function(module, exports, __nested_webpack_require_23867__) {
|
|
|
|
var isObject = __nested_webpack_require_23867__("861d");
|
|
var classof = __nested_webpack_require_23867__("c6b6");
|
|
var wellKnownSymbol = __nested_webpack_require_23867__("b622");
|
|
|
|
var MATCH = wellKnownSymbol('match');
|
|
|
|
// `IsRegExp` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-isregexp
|
|
module.exports = function (it) {
|
|
var isRegExp;
|
|
return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "4930":
|
|
/***/ (function(module, exports, __nested_webpack_require_24366__) {
|
|
|
|
var fails = __nested_webpack_require_24366__("d039");
|
|
|
|
module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
|
|
// Chrome 38 Symbol has incorrect toString conversion
|
|
// eslint-disable-next-line no-undef
|
|
return !String(Symbol());
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "4d64":
|
|
/***/ (function(module, exports, __nested_webpack_require_24691__) {
|
|
|
|
var toIndexedObject = __nested_webpack_require_24691__("fc6a");
|
|
var toLength = __nested_webpack_require_24691__("50c4");
|
|
var toAbsoluteIndex = __nested_webpack_require_24691__("23cb");
|
|
|
|
// `Array.prototype.{ indexOf, includes }` methods implementation
|
|
var createMethod = function (IS_INCLUDES) {
|
|
return function ($this, el, fromIndex) {
|
|
var O = toIndexedObject($this);
|
|
var length = toLength(O.length);
|
|
var index = toAbsoluteIndex(fromIndex, length);
|
|
var value;
|
|
// Array#includes uses SameValueZero equality algorithm
|
|
// eslint-disable-next-line no-self-compare
|
|
if (IS_INCLUDES && el != el) while (length > index) {
|
|
value = O[index++];
|
|
// eslint-disable-next-line no-self-compare
|
|
if (value != value) return true;
|
|
// Array#indexOf ignores holes, Array#includes - not
|
|
} else for (;length > index; index++) {
|
|
if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
|
|
} return !IS_INCLUDES && -1;
|
|
};
|
|
};
|
|
|
|
module.exports = {
|
|
// `Array.prototype.includes` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
|
includes: createMethod(true),
|
|
// `Array.prototype.indexOf` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.indexof
|
|
indexOf: createMethod(false)
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "4de4":
|
|
/***/ (function(module, exports, __nested_webpack_require_26024__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_26024__("23e7");
|
|
var $filter = __nested_webpack_require_26024__("b727").filter;
|
|
var arrayMethodHasSpeciesSupport = __nested_webpack_require_26024__("1dde");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_26024__("ae40");
|
|
|
|
var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');
|
|
// Edge 14- issue
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('filter');
|
|
|
|
// `Array.prototype.filter` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.filter
|
|
// with adding support of @@species
|
|
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
|
|
filter: function filter(callbackfn /* , thisArg */) {
|
|
return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "4df4":
|
|
/***/ (function(module, exports, __nested_webpack_require_26846__) {
|
|
|
|
"use strict";
|
|
|
|
var bind = __nested_webpack_require_26846__("0366");
|
|
var toObject = __nested_webpack_require_26846__("7b0b");
|
|
var callWithSafeIterationClosing = __nested_webpack_require_26846__("9bdd");
|
|
var isArrayIteratorMethod = __nested_webpack_require_26846__("e95a");
|
|
var toLength = __nested_webpack_require_26846__("50c4");
|
|
var createProperty = __nested_webpack_require_26846__("8418");
|
|
var getIteratorMethod = __nested_webpack_require_26846__("35a1");
|
|
|
|
// `Array.from` method implementation
|
|
// https://tc39.github.io/ecma262/#sec-array.from
|
|
module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
|
|
var O = toObject(arrayLike);
|
|
var C = typeof this == 'function' ? this : Array;
|
|
var argumentsLength = arguments.length;
|
|
var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
|
|
var mapping = mapfn !== undefined;
|
|
var iteratorMethod = getIteratorMethod(O);
|
|
var index = 0;
|
|
var length, result, step, iterator, next, value;
|
|
if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);
|
|
// if the target is not iterable or it's an array with the default iterator - use a simple case
|
|
if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {
|
|
iterator = iteratorMethod.call(O);
|
|
next = iterator.next;
|
|
result = new C();
|
|
for (;!(step = next.call(iterator)).done; index++) {
|
|
value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
|
|
createProperty(result, index, value);
|
|
}
|
|
} else {
|
|
length = toLength(O.length);
|
|
result = new C(length);
|
|
for (;length > index; index++) {
|
|
value = mapping ? mapfn(O[index], index) : O[index];
|
|
createProperty(result, index, value);
|
|
}
|
|
}
|
|
result.length = index;
|
|
return result;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "4fad":
|
|
/***/ (function(module, exports, __nested_webpack_require_28666__) {
|
|
|
|
var $ = __nested_webpack_require_28666__("23e7");
|
|
var $entries = __nested_webpack_require_28666__("6f53").entries;
|
|
|
|
// `Object.entries` method
|
|
// https://tc39.github.io/ecma262/#sec-object.entries
|
|
$({ target: 'Object', stat: true }, {
|
|
entries: function entries(O) {
|
|
return $entries(O);
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "50c4":
|
|
/***/ (function(module, exports, __nested_webpack_require_29024__) {
|
|
|
|
var toInteger = __nested_webpack_require_29024__("a691");
|
|
|
|
var min = Math.min;
|
|
|
|
// `ToLength` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-tolength
|
|
module.exports = function (argument) {
|
|
return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "5135":
|
|
/***/ (function(module, exports) {
|
|
|
|
var hasOwnProperty = {}.hasOwnProperty;
|
|
|
|
module.exports = function (it, key) {
|
|
return hasOwnProperty.call(it, key);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "5319":
|
|
/***/ (function(module, exports, __nested_webpack_require_29589__) {
|
|
|
|
"use strict";
|
|
|
|
var fixRegExpWellKnownSymbolLogic = __nested_webpack_require_29589__("d784");
|
|
var anObject = __nested_webpack_require_29589__("825a");
|
|
var toObject = __nested_webpack_require_29589__("7b0b");
|
|
var toLength = __nested_webpack_require_29589__("50c4");
|
|
var toInteger = __nested_webpack_require_29589__("a691");
|
|
var requireObjectCoercible = __nested_webpack_require_29589__("1d80");
|
|
var advanceStringIndex = __nested_webpack_require_29589__("8aa5");
|
|
var regExpExec = __nested_webpack_require_29589__("14c3");
|
|
|
|
var max = Math.max;
|
|
var min = Math.min;
|
|
var floor = Math.floor;
|
|
var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d\d?|<[^>]*>)/g;
|
|
var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d\d?)/g;
|
|
|
|
var maybeToString = function (it) {
|
|
return it === undefined ? it : String(it);
|
|
};
|
|
|
|
// @@replace logic
|
|
fixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {
|
|
var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;
|
|
var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;
|
|
var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';
|
|
|
|
return [
|
|
// `String.prototype.replace` method
|
|
// https://tc39.github.io/ecma262/#sec-string.prototype.replace
|
|
function replace(searchValue, replaceValue) {
|
|
var O = requireObjectCoercible(this);
|
|
var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];
|
|
return replacer !== undefined
|
|
? replacer.call(searchValue, O, replaceValue)
|
|
: nativeReplace.call(String(O), searchValue, replaceValue);
|
|
},
|
|
// `RegExp.prototype[@@replace]` method
|
|
// https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace
|
|
function (regexp, replaceValue) {
|
|
if (
|
|
(!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||
|
|
(typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)
|
|
) {
|
|
var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);
|
|
if (res.done) return res.value;
|
|
}
|
|
|
|
var rx = anObject(regexp);
|
|
var S = String(this);
|
|
|
|
var functionalReplace = typeof replaceValue === 'function';
|
|
if (!functionalReplace) replaceValue = String(replaceValue);
|
|
|
|
var global = rx.global;
|
|
if (global) {
|
|
var fullUnicode = rx.unicode;
|
|
rx.lastIndex = 0;
|
|
}
|
|
var results = [];
|
|
while (true) {
|
|
var result = regExpExec(rx, S);
|
|
if (result === null) break;
|
|
|
|
results.push(result);
|
|
if (!global) break;
|
|
|
|
var matchStr = String(result[0]);
|
|
if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
|
|
}
|
|
|
|
var accumulatedResult = '';
|
|
var nextSourcePosition = 0;
|
|
for (var i = 0; i < results.length; i++) {
|
|
result = results[i];
|
|
|
|
var matched = String(result[0]);
|
|
var position = max(min(toInteger(result.index), S.length), 0);
|
|
var captures = [];
|
|
// NOTE: This is equivalent to
|
|
// captures = result.slice(1).map(maybeToString)
|
|
// but for some reason `nativeSlice.call(result, 1, result.length)` (called in
|
|
// the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
|
|
// causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
|
|
for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));
|
|
var namedCaptures = result.groups;
|
|
if (functionalReplace) {
|
|
var replacerArgs = [matched].concat(captures, position, S);
|
|
if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
|
|
var replacement = String(replaceValue.apply(undefined, replacerArgs));
|
|
} else {
|
|
replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
|
|
}
|
|
if (position >= nextSourcePosition) {
|
|
accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
|
|
nextSourcePosition = position + matched.length;
|
|
}
|
|
}
|
|
return accumulatedResult + S.slice(nextSourcePosition);
|
|
}
|
|
];
|
|
|
|
// https://tc39.github.io/ecma262/#sec-getsubstitution
|
|
function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {
|
|
var tailPos = position + matched.length;
|
|
var m = captures.length;
|
|
var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
|
|
if (namedCaptures !== undefined) {
|
|
namedCaptures = toObject(namedCaptures);
|
|
symbols = SUBSTITUTION_SYMBOLS;
|
|
}
|
|
return nativeReplace.call(replacement, symbols, function (match, ch) {
|
|
var capture;
|
|
switch (ch.charAt(0)) {
|
|
case '$': return '$';
|
|
case '&': return matched;
|
|
case '`': return str.slice(0, position);
|
|
case "'": return str.slice(tailPos);
|
|
case '<':
|
|
capture = namedCaptures[ch.slice(1, -1)];
|
|
break;
|
|
default: // \d\d?
|
|
var n = +ch;
|
|
if (n === 0) return match;
|
|
if (n > m) {
|
|
var f = floor(n / 10);
|
|
if (f === 0) return match;
|
|
if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
|
|
return match;
|
|
}
|
|
capture = captures[n - 1];
|
|
}
|
|
return capture === undefined ? '' : capture;
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "5692":
|
|
/***/ (function(module, exports, __nested_webpack_require_34963__) {
|
|
|
|
var IS_PURE = __nested_webpack_require_34963__("c430");
|
|
var store = __nested_webpack_require_34963__("c6cd");
|
|
|
|
(module.exports = function (key, value) {
|
|
return store[key] || (store[key] = value !== undefined ? value : {});
|
|
})('versions', []).push({
|
|
version: '3.6.5',
|
|
mode: IS_PURE ? 'pure' : 'global',
|
|
copyright: '© 2020 Denis Pushkarev (zloirock.ru)'
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "56ef":
|
|
/***/ (function(module, exports, __nested_webpack_require_35385__) {
|
|
|
|
var getBuiltIn = __nested_webpack_require_35385__("d066");
|
|
var getOwnPropertyNamesModule = __nested_webpack_require_35385__("241c");
|
|
var getOwnPropertySymbolsModule = __nested_webpack_require_35385__("7418");
|
|
var anObject = __nested_webpack_require_35385__("825a");
|
|
|
|
// all object keys, includes non-enumerable and symbols
|
|
module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
|
|
var keys = getOwnPropertyNamesModule.f(anObject(it));
|
|
var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
|
|
return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "5a34":
|
|
/***/ (function(module, exports, __nested_webpack_require_36016__) {
|
|
|
|
var isRegExp = __nested_webpack_require_36016__("44e7");
|
|
|
|
module.exports = function (it) {
|
|
if (isRegExp(it)) {
|
|
throw TypeError("The method doesn't accept regular expressions");
|
|
} return it;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "5c6c":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = function (bitmap, value) {
|
|
return {
|
|
enumerable: !(bitmap & 1),
|
|
configurable: !(bitmap & 2),
|
|
writable: !(bitmap & 4),
|
|
value: value
|
|
};
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "5db7":
|
|
/***/ (function(module, exports, __nested_webpack_require_36524__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_36524__("23e7");
|
|
var flattenIntoArray = __nested_webpack_require_36524__("a2bf");
|
|
var toObject = __nested_webpack_require_36524__("7b0b");
|
|
var toLength = __nested_webpack_require_36524__("50c4");
|
|
var aFunction = __nested_webpack_require_36524__("1c0b");
|
|
var arraySpeciesCreate = __nested_webpack_require_36524__("65f0");
|
|
|
|
// `Array.prototype.flatMap` method
|
|
// https://github.com/tc39/proposal-flatMap
|
|
$({ target: 'Array', proto: true }, {
|
|
flatMap: function flatMap(callbackfn /* , thisArg */) {
|
|
var O = toObject(this);
|
|
var sourceLen = toLength(O.length);
|
|
var A;
|
|
aFunction(callbackfn);
|
|
A = arraySpeciesCreate(O, 0);
|
|
A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
|
|
return A;
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "6547":
|
|
/***/ (function(module, exports, __nested_webpack_require_37358__) {
|
|
|
|
var toInteger = __nested_webpack_require_37358__("a691");
|
|
var requireObjectCoercible = __nested_webpack_require_37358__("1d80");
|
|
|
|
// `String.prototype.{ codePointAt, at }` methods implementation
|
|
var createMethod = function (CONVERT_TO_STRING) {
|
|
return function ($this, pos) {
|
|
var S = String(requireObjectCoercible($this));
|
|
var position = toInteger(pos);
|
|
var size = S.length;
|
|
var first, second;
|
|
if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
|
|
first = S.charCodeAt(position);
|
|
return first < 0xD800 || first > 0xDBFF || position + 1 === size
|
|
|| (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
|
|
? CONVERT_TO_STRING ? S.charAt(position) : first
|
|
: CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
|
|
};
|
|
};
|
|
|
|
module.exports = {
|
|
// `String.prototype.codePointAt` method
|
|
// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat
|
|
codeAt: createMethod(false),
|
|
// `String.prototype.at` method
|
|
// https://github.com/mathiasbynens/String.prototype.at
|
|
charAt: createMethod(true)
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "65f0":
|
|
/***/ (function(module, exports, __nested_webpack_require_38564__) {
|
|
|
|
var isObject = __nested_webpack_require_38564__("861d");
|
|
var isArray = __nested_webpack_require_38564__("e8b5");
|
|
var wellKnownSymbol = __nested_webpack_require_38564__("b622");
|
|
|
|
var SPECIES = wellKnownSymbol('species');
|
|
|
|
// `ArraySpeciesCreate` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-arrayspeciescreate
|
|
module.exports = function (originalArray, length) {
|
|
var C;
|
|
if (isArray(originalArray)) {
|
|
C = originalArray.constructor;
|
|
// cross-realm fallback
|
|
if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
|
|
else if (isObject(C)) {
|
|
C = C[SPECIES];
|
|
if (C === null) C = undefined;
|
|
}
|
|
} return new (C === undefined ? Array : C)(length === 0 ? 0 : length);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "69f3":
|
|
/***/ (function(module, exports, __nested_webpack_require_39344__) {
|
|
|
|
var NATIVE_WEAK_MAP = __nested_webpack_require_39344__("7f9a");
|
|
var global = __nested_webpack_require_39344__("da84");
|
|
var isObject = __nested_webpack_require_39344__("861d");
|
|
var createNonEnumerableProperty = __nested_webpack_require_39344__("9112");
|
|
var objectHas = __nested_webpack_require_39344__("5135");
|
|
var sharedKey = __nested_webpack_require_39344__("f772");
|
|
var hiddenKeys = __nested_webpack_require_39344__("d012");
|
|
|
|
var WeakMap = global.WeakMap;
|
|
var set, get, has;
|
|
|
|
var enforce = function (it) {
|
|
return has(it) ? get(it) : set(it, {});
|
|
};
|
|
|
|
var getterFor = function (TYPE) {
|
|
return function (it) {
|
|
var state;
|
|
if (!isObject(it) || (state = get(it)).type !== TYPE) {
|
|
throw TypeError('Incompatible receiver, ' + TYPE + ' required');
|
|
} return state;
|
|
};
|
|
};
|
|
|
|
if (NATIVE_WEAK_MAP) {
|
|
var store = new WeakMap();
|
|
var wmget = store.get;
|
|
var wmhas = store.has;
|
|
var wmset = store.set;
|
|
set = function (it, metadata) {
|
|
wmset.call(store, it, metadata);
|
|
return metadata;
|
|
};
|
|
get = function (it) {
|
|
return wmget.call(store, it) || {};
|
|
};
|
|
has = function (it) {
|
|
return wmhas.call(store, it);
|
|
};
|
|
} else {
|
|
var STATE = sharedKey('state');
|
|
hiddenKeys[STATE] = true;
|
|
set = function (it, metadata) {
|
|
createNonEnumerableProperty(it, STATE, metadata);
|
|
return metadata;
|
|
};
|
|
get = function (it) {
|
|
return objectHas(it, STATE) ? it[STATE] : {};
|
|
};
|
|
has = function (it) {
|
|
return objectHas(it, STATE);
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
set: set,
|
|
get: get,
|
|
has: has,
|
|
enforce: enforce,
|
|
getterFor: getterFor
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "6eeb":
|
|
/***/ (function(module, exports, __nested_webpack_require_40911__) {
|
|
|
|
var global = __nested_webpack_require_40911__("da84");
|
|
var createNonEnumerableProperty = __nested_webpack_require_40911__("9112");
|
|
var has = __nested_webpack_require_40911__("5135");
|
|
var setGlobal = __nested_webpack_require_40911__("ce4e");
|
|
var inspectSource = __nested_webpack_require_40911__("8925");
|
|
var InternalStateModule = __nested_webpack_require_40911__("69f3");
|
|
|
|
var getInternalState = InternalStateModule.get;
|
|
var enforceInternalState = InternalStateModule.enforce;
|
|
var TEMPLATE = String(String).split('String');
|
|
|
|
(module.exports = function (O, key, value, options) {
|
|
var unsafe = options ? !!options.unsafe : false;
|
|
var simple = options ? !!options.enumerable : false;
|
|
var noTargetGet = options ? !!options.noTargetGet : false;
|
|
if (typeof value == 'function') {
|
|
if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);
|
|
enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');
|
|
}
|
|
if (O === global) {
|
|
if (simple) O[key] = value;
|
|
else setGlobal(key, value);
|
|
return;
|
|
} else if (!unsafe) {
|
|
delete O[key];
|
|
} else if (!noTargetGet && O[key]) {
|
|
simple = true;
|
|
}
|
|
if (simple) O[key] = value;
|
|
else createNonEnumerableProperty(O, key, value);
|
|
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
|
|
})(Function.prototype, 'toString', function toString() {
|
|
return typeof this == 'function' && getInternalState(this).source || inspectSource(this);
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "6f53":
|
|
/***/ (function(module, exports, __nested_webpack_require_42446__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_42446__("83ab");
|
|
var objectKeys = __nested_webpack_require_42446__("df75");
|
|
var toIndexedObject = __nested_webpack_require_42446__("fc6a");
|
|
var propertyIsEnumerable = __nested_webpack_require_42446__("d1e7").f;
|
|
|
|
// `Object.{ entries, values }` methods implementation
|
|
var createMethod = function (TO_ENTRIES) {
|
|
return function (it) {
|
|
var O = toIndexedObject(it);
|
|
var keys = objectKeys(O);
|
|
var length = keys.length;
|
|
var i = 0;
|
|
var result = [];
|
|
var key;
|
|
while (length > i) {
|
|
key = keys[i++];
|
|
if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {
|
|
result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
};
|
|
|
|
module.exports = {
|
|
// `Object.entries` method
|
|
// https://tc39.github.io/ecma262/#sec-object.entries
|
|
entries: createMethod(true),
|
|
// `Object.values` method
|
|
// https://tc39.github.io/ecma262/#sec-object.values
|
|
values: createMethod(false)
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "73d9":
|
|
/***/ (function(module, exports, __nested_webpack_require_43460__) {
|
|
|
|
// this method was added to unscopables after implementation
|
|
// in popular engines, so it's moved to a separate module
|
|
var addToUnscopables = __nested_webpack_require_43460__("44d2");
|
|
|
|
addToUnscopables('flatMap');
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "7418":
|
|
/***/ (function(module, exports) {
|
|
|
|
exports.f = Object.getOwnPropertySymbols;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "746f":
|
|
/***/ (function(module, exports, __nested_webpack_require_43850__) {
|
|
|
|
var path = __nested_webpack_require_43850__("428f");
|
|
var has = __nested_webpack_require_43850__("5135");
|
|
var wrappedWellKnownSymbolModule = __nested_webpack_require_43850__("e538");
|
|
var defineProperty = __nested_webpack_require_43850__("9bf2").f;
|
|
|
|
module.exports = function (NAME) {
|
|
var Symbol = path.Symbol || (path.Symbol = {});
|
|
if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {
|
|
value: wrappedWellKnownSymbolModule.f(NAME)
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "7839":
|
|
/***/ (function(module, exports) {
|
|
|
|
// IE8- don't enum bug keys
|
|
module.exports = [
|
|
'constructor',
|
|
'hasOwnProperty',
|
|
'isPrototypeOf',
|
|
'propertyIsEnumerable',
|
|
'toLocaleString',
|
|
'toString',
|
|
'valueOf'
|
|
];
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "7b0b":
|
|
/***/ (function(module, exports, __nested_webpack_require_44570__) {
|
|
|
|
var requireObjectCoercible = __nested_webpack_require_44570__("1d80");
|
|
|
|
// `ToObject` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-toobject
|
|
module.exports = function (argument) {
|
|
return Object(requireObjectCoercible(argument));
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "7c73":
|
|
/***/ (function(module, exports, __nested_webpack_require_44887__) {
|
|
|
|
var anObject = __nested_webpack_require_44887__("825a");
|
|
var defineProperties = __nested_webpack_require_44887__("37e8");
|
|
var enumBugKeys = __nested_webpack_require_44887__("7839");
|
|
var hiddenKeys = __nested_webpack_require_44887__("d012");
|
|
var html = __nested_webpack_require_44887__("1be4");
|
|
var documentCreateElement = __nested_webpack_require_44887__("cc12");
|
|
var sharedKey = __nested_webpack_require_44887__("f772");
|
|
|
|
var GT = '>';
|
|
var LT = '<';
|
|
var PROTOTYPE = 'prototype';
|
|
var SCRIPT = 'script';
|
|
var IE_PROTO = sharedKey('IE_PROTO');
|
|
|
|
var EmptyConstructor = function () { /* empty */ };
|
|
|
|
var scriptTag = function (content) {
|
|
return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
|
|
};
|
|
|
|
// Create object with fake `null` prototype: use ActiveX Object with cleared prototype
|
|
var NullProtoObjectViaActiveX = function (activeXDocument) {
|
|
activeXDocument.write(scriptTag(''));
|
|
activeXDocument.close();
|
|
var temp = activeXDocument.parentWindow.Object;
|
|
activeXDocument = null; // avoid memory leak
|
|
return temp;
|
|
};
|
|
|
|
// Create object with fake `null` prototype: use iframe Object with cleared prototype
|
|
var NullProtoObjectViaIFrame = function () {
|
|
// Thrash, waste and sodomy: IE GC bug
|
|
var iframe = documentCreateElement('iframe');
|
|
var JS = 'java' + SCRIPT + ':';
|
|
var iframeDocument;
|
|
iframe.style.display = 'none';
|
|
html.appendChild(iframe);
|
|
// https://github.com/zloirock/core-js/issues/475
|
|
iframe.src = String(JS);
|
|
iframeDocument = iframe.contentWindow.document;
|
|
iframeDocument.open();
|
|
iframeDocument.write(scriptTag('document.F=Object'));
|
|
iframeDocument.close();
|
|
return iframeDocument.F;
|
|
};
|
|
|
|
// Check for document.domain and active x support
|
|
// No need to use active x approach when document.domain is not set
|
|
// see https://github.com/es-shims/es5-shim/issues/150
|
|
// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
|
|
// avoid IE GC bug
|
|
var activeXDocument;
|
|
var NullProtoObject = function () {
|
|
try {
|
|
/* global ActiveXObject */
|
|
activeXDocument = document.domain && new ActiveXObject('htmlfile');
|
|
} catch (error) { /* ignore */ }
|
|
NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();
|
|
var length = enumBugKeys.length;
|
|
while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
|
|
return NullProtoObject();
|
|
};
|
|
|
|
hiddenKeys[IE_PROTO] = true;
|
|
|
|
// `Object.create` method
|
|
// https://tc39.github.io/ecma262/#sec-object.create
|
|
module.exports = Object.create || function create(O, Properties) {
|
|
var result;
|
|
if (O !== null) {
|
|
EmptyConstructor[PROTOTYPE] = anObject(O);
|
|
result = new EmptyConstructor();
|
|
EmptyConstructor[PROTOTYPE] = null;
|
|
// add "__proto__" for Object.getPrototypeOf polyfill
|
|
result[IE_PROTO] = O;
|
|
} else result = NullProtoObject();
|
|
return Properties === undefined ? result : defineProperties(result, Properties);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "7dd0":
|
|
/***/ (function(module, exports, __nested_webpack_require_47780__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_47780__("23e7");
|
|
var createIteratorConstructor = __nested_webpack_require_47780__("9ed3");
|
|
var getPrototypeOf = __nested_webpack_require_47780__("e163");
|
|
var setPrototypeOf = __nested_webpack_require_47780__("d2bb");
|
|
var setToStringTag = __nested_webpack_require_47780__("d44e");
|
|
var createNonEnumerableProperty = __nested_webpack_require_47780__("9112");
|
|
var redefine = __nested_webpack_require_47780__("6eeb");
|
|
var wellKnownSymbol = __nested_webpack_require_47780__("b622");
|
|
var IS_PURE = __nested_webpack_require_47780__("c430");
|
|
var Iterators = __nested_webpack_require_47780__("3f8c");
|
|
var IteratorsCore = __nested_webpack_require_47780__("ae93");
|
|
|
|
var IteratorPrototype = IteratorsCore.IteratorPrototype;
|
|
var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
var KEYS = 'keys';
|
|
var VALUES = 'values';
|
|
var ENTRIES = 'entries';
|
|
|
|
var returnThis = function () { return this; };
|
|
|
|
module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
|
|
createIteratorConstructor(IteratorConstructor, NAME, next);
|
|
|
|
var getIterationMethod = function (KIND) {
|
|
if (KIND === DEFAULT && defaultIterator) return defaultIterator;
|
|
if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
|
|
switch (KIND) {
|
|
case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
|
|
case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
|
|
case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
|
|
} return function () { return new IteratorConstructor(this); };
|
|
};
|
|
|
|
var TO_STRING_TAG = NAME + ' Iterator';
|
|
var INCORRECT_VALUES_NAME = false;
|
|
var IterablePrototype = Iterable.prototype;
|
|
var nativeIterator = IterablePrototype[ITERATOR]
|
|
|| IterablePrototype['@@iterator']
|
|
|| DEFAULT && IterablePrototype[DEFAULT];
|
|
var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
|
|
var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
|
|
var CurrentIteratorPrototype, methods, KEY;
|
|
|
|
// fix native
|
|
if (anyNativeIterator) {
|
|
CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
|
|
if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
|
|
if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
|
|
if (setPrototypeOf) {
|
|
setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
|
|
} else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {
|
|
createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);
|
|
}
|
|
}
|
|
// Set @@toStringTag to native iterators
|
|
setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
|
|
if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;
|
|
}
|
|
}
|
|
|
|
// fix Array#{values, @@iterator}.name in V8 / FF
|
|
if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
|
|
INCORRECT_VALUES_NAME = true;
|
|
defaultIterator = function values() { return nativeIterator.call(this); };
|
|
}
|
|
|
|
// define iterator
|
|
if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
|
|
createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);
|
|
}
|
|
Iterators[NAME] = defaultIterator;
|
|
|
|
// export additional methods
|
|
if (DEFAULT) {
|
|
methods = {
|
|
values: getIterationMethod(VALUES),
|
|
keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
|
|
entries: getIterationMethod(ENTRIES)
|
|
};
|
|
if (FORCED) for (KEY in methods) {
|
|
if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
|
|
redefine(IterablePrototype, KEY, methods[KEY]);
|
|
}
|
|
} else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
|
|
}
|
|
|
|
return methods;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "7f9a":
|
|
/***/ (function(module, exports, __nested_webpack_require_51759__) {
|
|
|
|
var global = __nested_webpack_require_51759__("da84");
|
|
var inspectSource = __nested_webpack_require_51759__("8925");
|
|
|
|
var WeakMap = global.WeakMap;
|
|
|
|
module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "825a":
|
|
/***/ (function(module, exports, __nested_webpack_require_52060__) {
|
|
|
|
var isObject = __nested_webpack_require_52060__("861d");
|
|
|
|
module.exports = function (it) {
|
|
if (!isObject(it)) {
|
|
throw TypeError(String(it) + ' is not an object');
|
|
} return it;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "83ab":
|
|
/***/ (function(module, exports, __nested_webpack_require_52318__) {
|
|
|
|
var fails = __nested_webpack_require_52318__("d039");
|
|
|
|
// Thank's IE8 for his funny defineProperty
|
|
module.exports = !fails(function () {
|
|
return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "8418":
|
|
/***/ (function(module, exports, __nested_webpack_require_52613__) {
|
|
|
|
"use strict";
|
|
|
|
var toPrimitive = __nested_webpack_require_52613__("c04e");
|
|
var definePropertyModule = __nested_webpack_require_52613__("9bf2");
|
|
var createPropertyDescriptor = __nested_webpack_require_52613__("5c6c");
|
|
|
|
module.exports = function (object, key, value) {
|
|
var propertyKey = toPrimitive(key);
|
|
if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
|
|
else object[propertyKey] = value;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "861d":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = function (it) {
|
|
return typeof it === 'object' ? it !== null : typeof it === 'function';
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "8875":
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// addapted from the document.currentScript polyfill by Adam Miller
|
|
// MIT license
|
|
// source: https://github.com/amiller-gh/currentScript-polyfill
|
|
|
|
// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505
|
|
|
|
(function (root, factory) {
|
|
if (true) {
|
|
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
|
|
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
|
|
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
|
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
|
} else {}
|
|
}(typeof self !== 'undefined' ? self : this, function () {
|
|
function getCurrentScript () {
|
|
var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')
|
|
// for chrome
|
|
if (!descriptor && 'currentScript' in document && document.currentScript) {
|
|
return document.currentScript
|
|
}
|
|
|
|
// for other browsers with native support for currentScript
|
|
if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {
|
|
return document.currentScript
|
|
}
|
|
|
|
// IE 8-10 support script readyState
|
|
// IE 11+ & Firefox support stack trace
|
|
try {
|
|
throw new Error();
|
|
}
|
|
catch (err) {
|
|
// Find the second match for the "at" string to get file src url from stack.
|
|
var ieStackRegExp = /.*at [^(]*\((.*):(.+):(.+)\)$/ig,
|
|
ffStackRegExp = /@([^@]*):(\d+):(\d+)\s*$/ig,
|
|
stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),
|
|
scriptLocation = (stackDetails && stackDetails[1]) || false,
|
|
line = (stackDetails && stackDetails[2]) || false,
|
|
currentLocation = document.location.href.replace(document.location.hash, ''),
|
|
pageSource,
|
|
inlineScriptSourceRegExp,
|
|
inlineScriptSource,
|
|
scripts = document.getElementsByTagName('script'); // Live NodeList collection
|
|
|
|
if (scriptLocation === currentLocation) {
|
|
pageSource = document.documentElement.outerHTML;
|
|
inlineScriptSourceRegExp = new RegExp('(?:[^\\n]+?\\n){0,' + (line - 2) + '}[^<]*<script>([\\d\\D]*?)<\\/script>[\\d\\D]*', 'i');
|
|
inlineScriptSource = pageSource.replace(inlineScriptSourceRegExp, '$1').trim();
|
|
}
|
|
|
|
for (var i = 0; i < scripts.length; i++) {
|
|
// If ready state is interactive, return the script tag
|
|
if (scripts[i].readyState === 'interactive') {
|
|
return scripts[i];
|
|
}
|
|
|
|
// If src matches, return the script tag
|
|
if (scripts[i].src === scriptLocation) {
|
|
return scripts[i];
|
|
}
|
|
|
|
// If inline source matches, return the script tag
|
|
if (
|
|
scriptLocation === currentLocation &&
|
|
scripts[i].innerHTML &&
|
|
scripts[i].innerHTML.trim() === inlineScriptSource
|
|
) {
|
|
return scripts[i];
|
|
}
|
|
}
|
|
|
|
// If no match, return null
|
|
return null;
|
|
}
|
|
};
|
|
|
|
return getCurrentScript
|
|
}));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "8925":
|
|
/***/ (function(module, exports, __nested_webpack_require_56535__) {
|
|
|
|
var store = __nested_webpack_require_56535__("c6cd");
|
|
|
|
var functionToString = Function.toString;
|
|
|
|
// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper
|
|
if (typeof store.inspectSource != 'function') {
|
|
store.inspectSource = function (it) {
|
|
return functionToString.call(it);
|
|
};
|
|
}
|
|
|
|
module.exports = store.inspectSource;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "8aa5":
|
|
/***/ (function(module, exports, __nested_webpack_require_56948__) {
|
|
|
|
"use strict";
|
|
|
|
var charAt = __nested_webpack_require_56948__("6547").charAt;
|
|
|
|
// `AdvanceStringIndex` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-advancestringindex
|
|
module.exports = function (S, index, unicode) {
|
|
return index + (unicode ? charAt(S, index).length : 1);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "8bbf":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = __WEBPACK_EXTERNAL_MODULE__8bbf__;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "90e3":
|
|
/***/ (function(module, exports) {
|
|
|
|
var id = 0;
|
|
var postfix = Math.random();
|
|
|
|
module.exports = function (key) {
|
|
return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "9112":
|
|
/***/ (function(module, exports, __nested_webpack_require_57661__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_57661__("83ab");
|
|
var definePropertyModule = __nested_webpack_require_57661__("9bf2");
|
|
var createPropertyDescriptor = __nested_webpack_require_57661__("5c6c");
|
|
|
|
module.exports = DESCRIPTORS ? function (object, key, value) {
|
|
return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
|
|
} : function (object, key, value) {
|
|
object[key] = value;
|
|
return object;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "9263":
|
|
/***/ (function(module, exports, __nested_webpack_require_58133__) {
|
|
|
|
"use strict";
|
|
|
|
var regexpFlags = __nested_webpack_require_58133__("ad6d");
|
|
var stickyHelpers = __nested_webpack_require_58133__("9f7f");
|
|
|
|
var nativeExec = RegExp.prototype.exec;
|
|
// This always refers to the native implementation, because the
|
|
// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
|
|
// which loads this file before patching the method.
|
|
var nativeReplace = String.prototype.replace;
|
|
|
|
var patchedExec = nativeExec;
|
|
|
|
var UPDATES_LAST_INDEX_WRONG = (function () {
|
|
var re1 = /a/;
|
|
var re2 = /b*/g;
|
|
nativeExec.call(re1, 'a');
|
|
nativeExec.call(re2, 'a');
|
|
return re1.lastIndex !== 0 || re2.lastIndex !== 0;
|
|
})();
|
|
|
|
var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;
|
|
|
|
// nonparticipating capturing group, copied from es5-shim's String#split patch.
|
|
var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
|
|
|
|
var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;
|
|
|
|
if (PATCH) {
|
|
patchedExec = function exec(str) {
|
|
var re = this;
|
|
var lastIndex, reCopy, match, i;
|
|
var sticky = UNSUPPORTED_Y && re.sticky;
|
|
var flags = regexpFlags.call(re);
|
|
var source = re.source;
|
|
var charsAdded = 0;
|
|
var strCopy = str;
|
|
|
|
if (sticky) {
|
|
flags = flags.replace('y', '');
|
|
if (flags.indexOf('g') === -1) {
|
|
flags += 'g';
|
|
}
|
|
|
|
strCopy = String(str).slice(re.lastIndex);
|
|
// Support anchored sticky behavior.
|
|
if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) {
|
|
source = '(?: ' + source + ')';
|
|
strCopy = ' ' + strCopy;
|
|
charsAdded++;
|
|
}
|
|
// ^(? + rx + ) is needed, in combination with some str slicing, to
|
|
// simulate the 'y' flag.
|
|
reCopy = new RegExp('^(?:' + source + ')', flags);
|
|
}
|
|
|
|
if (NPCG_INCLUDED) {
|
|
reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
|
|
}
|
|
if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
|
|
|
|
match = nativeExec.call(sticky ? reCopy : re, strCopy);
|
|
|
|
if (sticky) {
|
|
if (match) {
|
|
match.input = match.input.slice(charsAdded);
|
|
match[0] = match[0].slice(charsAdded);
|
|
match.index = re.lastIndex;
|
|
re.lastIndex += match[0].length;
|
|
} else re.lastIndex = 0;
|
|
} else if (UPDATES_LAST_INDEX_WRONG && match) {
|
|
re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
|
|
}
|
|
if (NPCG_INCLUDED && match && match.length > 1) {
|
|
// Fix browsers whose `exec` methods don't consistently return `undefined`
|
|
// for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
|
|
nativeReplace.call(match[0], reCopy, function () {
|
|
for (i = 1; i < arguments.length - 2; i++) {
|
|
if (arguments[i] === undefined) match[i] = undefined;
|
|
}
|
|
});
|
|
}
|
|
|
|
return match;
|
|
};
|
|
}
|
|
|
|
module.exports = patchedExec;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "94ca":
|
|
/***/ (function(module, exports, __nested_webpack_require_61029__) {
|
|
|
|
var fails = __nested_webpack_require_61029__("d039");
|
|
|
|
var replacement = /#|\.prototype\./;
|
|
|
|
var isForced = function (feature, detection) {
|
|
var value = data[normalize(feature)];
|
|
return value == POLYFILL ? true
|
|
: value == NATIVE ? false
|
|
: typeof detection == 'function' ? fails(detection)
|
|
: !!detection;
|
|
};
|
|
|
|
var normalize = isForced.normalize = function (string) {
|
|
return String(string).replace(replacement, '.').toLowerCase();
|
|
};
|
|
|
|
var data = isForced.data = {};
|
|
var NATIVE = isForced.NATIVE = 'N';
|
|
var POLYFILL = isForced.POLYFILL = 'P';
|
|
|
|
module.exports = isForced;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "99af":
|
|
/***/ (function(module, exports, __nested_webpack_require_61684__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_61684__("23e7");
|
|
var fails = __nested_webpack_require_61684__("d039");
|
|
var isArray = __nested_webpack_require_61684__("e8b5");
|
|
var isObject = __nested_webpack_require_61684__("861d");
|
|
var toObject = __nested_webpack_require_61684__("7b0b");
|
|
var toLength = __nested_webpack_require_61684__("50c4");
|
|
var createProperty = __nested_webpack_require_61684__("8418");
|
|
var arraySpeciesCreate = __nested_webpack_require_61684__("65f0");
|
|
var arrayMethodHasSpeciesSupport = __nested_webpack_require_61684__("1dde");
|
|
var wellKnownSymbol = __nested_webpack_require_61684__("b622");
|
|
var V8_VERSION = __nested_webpack_require_61684__("2d00");
|
|
|
|
var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
|
|
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
|
|
var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
|
|
|
|
// We can't use this feature detection in V8 since it causes
|
|
// deoptimization and serious performance degradation
|
|
// https://github.com/zloirock/core-js/issues/679
|
|
var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {
|
|
var array = [];
|
|
array[IS_CONCAT_SPREADABLE] = false;
|
|
return array.concat()[0] !== array;
|
|
});
|
|
|
|
var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
|
|
|
|
var isConcatSpreadable = function (O) {
|
|
if (!isObject(O)) return false;
|
|
var spreadable = O[IS_CONCAT_SPREADABLE];
|
|
return spreadable !== undefined ? !!spreadable : isArray(O);
|
|
};
|
|
|
|
var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
|
|
|
|
// `Array.prototype.concat` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.concat
|
|
// with adding support of @@isConcatSpreadable and @@species
|
|
$({ target: 'Array', proto: true, forced: FORCED }, {
|
|
concat: function concat(arg) { // eslint-disable-line no-unused-vars
|
|
var O = toObject(this);
|
|
var A = arraySpeciesCreate(O, 0);
|
|
var n = 0;
|
|
var i, k, length, len, E;
|
|
for (i = -1, length = arguments.length; i < length; i++) {
|
|
E = i === -1 ? O : arguments[i];
|
|
if (isConcatSpreadable(E)) {
|
|
len = toLength(E.length);
|
|
if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
|
|
for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
|
|
} else {
|
|
if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
|
|
createProperty(A, n++, E);
|
|
}
|
|
}
|
|
A.length = n;
|
|
return A;
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "9bdd":
|
|
/***/ (function(module, exports, __nested_webpack_require_64056__) {
|
|
|
|
var anObject = __nested_webpack_require_64056__("825a");
|
|
|
|
// call something on iterator step with safe closing on error
|
|
module.exports = function (iterator, fn, value, ENTRIES) {
|
|
try {
|
|
return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
|
|
// 7.4.6 IteratorClose(iterator, completion)
|
|
} catch (error) {
|
|
var returnMethod = iterator['return'];
|
|
if (returnMethod !== undefined) anObject(returnMethod.call(iterator));
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "9bf2":
|
|
/***/ (function(module, exports, __nested_webpack_require_64590__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_64590__("83ab");
|
|
var IE8_DOM_DEFINE = __nested_webpack_require_64590__("0cfb");
|
|
var anObject = __nested_webpack_require_64590__("825a");
|
|
var toPrimitive = __nested_webpack_require_64590__("c04e");
|
|
|
|
var nativeDefineProperty = Object.defineProperty;
|
|
|
|
// `Object.defineProperty` method
|
|
// https://tc39.github.io/ecma262/#sec-object.defineproperty
|
|
exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {
|
|
anObject(O);
|
|
P = toPrimitive(P, true);
|
|
anObject(Attributes);
|
|
if (IE8_DOM_DEFINE) try {
|
|
return nativeDefineProperty(O, P, Attributes);
|
|
} catch (error) { /* empty */ }
|
|
if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
|
|
if ('value' in Attributes) O[P] = Attributes.value;
|
|
return O;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "9ed3":
|
|
/***/ (function(module, exports, __nested_webpack_require_65445__) {
|
|
|
|
"use strict";
|
|
|
|
var IteratorPrototype = __nested_webpack_require_65445__("ae93").IteratorPrototype;
|
|
var create = __nested_webpack_require_65445__("7c73");
|
|
var createPropertyDescriptor = __nested_webpack_require_65445__("5c6c");
|
|
var setToStringTag = __nested_webpack_require_65445__("d44e");
|
|
var Iterators = __nested_webpack_require_65445__("3f8c");
|
|
|
|
var returnThis = function () { return this; };
|
|
|
|
module.exports = function (IteratorConstructor, NAME, next) {
|
|
var TO_STRING_TAG = NAME + ' Iterator';
|
|
IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });
|
|
setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
|
|
Iterators[TO_STRING_TAG] = returnThis;
|
|
return IteratorConstructor;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "9f7f":
|
|
/***/ (function(module, exports, __nested_webpack_require_66212__) {
|
|
|
|
"use strict";
|
|
|
|
|
|
var fails = __nested_webpack_require_66212__("d039");
|
|
|
|
// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,
|
|
// so we use an intermediate function.
|
|
function RE(s, f) {
|
|
return RegExp(s, f);
|
|
}
|
|
|
|
exports.UNSUPPORTED_Y = fails(function () {
|
|
// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
|
|
var re = RE('a', 'y');
|
|
re.lastIndex = 2;
|
|
return re.exec('abcd') != null;
|
|
});
|
|
|
|
exports.BROKEN_CARET = fails(function () {
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=773687
|
|
var re = RE('^r', 'gy');
|
|
re.lastIndex = 2;
|
|
return re.exec('str') != null;
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a2bf":
|
|
/***/ (function(module, exports, __nested_webpack_require_66910__) {
|
|
|
|
"use strict";
|
|
|
|
var isArray = __nested_webpack_require_66910__("e8b5");
|
|
var toLength = __nested_webpack_require_66910__("50c4");
|
|
var bind = __nested_webpack_require_66910__("0366");
|
|
|
|
// `FlattenIntoArray` abstract operation
|
|
// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
|
|
var flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
|
|
var targetIndex = start;
|
|
var sourceIndex = 0;
|
|
var mapFn = mapper ? bind(mapper, thisArg, 3) : false;
|
|
var element;
|
|
|
|
while (sourceIndex < sourceLen) {
|
|
if (sourceIndex in source) {
|
|
element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
|
|
|
|
if (depth > 0 && isArray(element)) {
|
|
targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;
|
|
} else {
|
|
if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');
|
|
target[targetIndex] = element;
|
|
}
|
|
|
|
targetIndex++;
|
|
}
|
|
sourceIndex++;
|
|
}
|
|
return targetIndex;
|
|
};
|
|
|
|
module.exports = flattenIntoArray;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a352":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = __WEBPACK_EXTERNAL_MODULE_a352__;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a434":
|
|
/***/ (function(module, exports, __nested_webpack_require_68187__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_68187__("23e7");
|
|
var toAbsoluteIndex = __nested_webpack_require_68187__("23cb");
|
|
var toInteger = __nested_webpack_require_68187__("a691");
|
|
var toLength = __nested_webpack_require_68187__("50c4");
|
|
var toObject = __nested_webpack_require_68187__("7b0b");
|
|
var arraySpeciesCreate = __nested_webpack_require_68187__("65f0");
|
|
var createProperty = __nested_webpack_require_68187__("8418");
|
|
var arrayMethodHasSpeciesSupport = __nested_webpack_require_68187__("1dde");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_68187__("ae40");
|
|
|
|
var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });
|
|
|
|
var max = Math.max;
|
|
var min = Math.min;
|
|
var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
|
|
var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
|
|
|
|
// `Array.prototype.splice` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.splice
|
|
// with adding support of @@species
|
|
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
|
|
splice: function splice(start, deleteCount /* , ...items */) {
|
|
var O = toObject(this);
|
|
var len = toLength(O.length);
|
|
var actualStart = toAbsoluteIndex(start, len);
|
|
var argumentsLength = arguments.length;
|
|
var insertCount, actualDeleteCount, A, k, from, to;
|
|
if (argumentsLength === 0) {
|
|
insertCount = actualDeleteCount = 0;
|
|
} else if (argumentsLength === 1) {
|
|
insertCount = 0;
|
|
actualDeleteCount = len - actualStart;
|
|
} else {
|
|
insertCount = argumentsLength - 2;
|
|
actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);
|
|
}
|
|
if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {
|
|
throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
|
|
}
|
|
A = arraySpeciesCreate(O, actualDeleteCount);
|
|
for (k = 0; k < actualDeleteCount; k++) {
|
|
from = actualStart + k;
|
|
if (from in O) createProperty(A, k, O[from]);
|
|
}
|
|
A.length = actualDeleteCount;
|
|
if (insertCount < actualDeleteCount) {
|
|
for (k = actualStart; k < len - actualDeleteCount; k++) {
|
|
from = k + actualDeleteCount;
|
|
to = k + insertCount;
|
|
if (from in O) O[to] = O[from];
|
|
else delete O[to];
|
|
}
|
|
for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
|
|
} else if (insertCount > actualDeleteCount) {
|
|
for (k = len - actualDeleteCount; k > actualStart; k--) {
|
|
from = k + actualDeleteCount - 1;
|
|
to = k + insertCount - 1;
|
|
if (from in O) O[to] = O[from];
|
|
else delete O[to];
|
|
}
|
|
}
|
|
for (k = 0; k < insertCount; k++) {
|
|
O[k + actualStart] = arguments[k + 2];
|
|
}
|
|
O.length = len - actualDeleteCount + insertCount;
|
|
return A;
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a4d3":
|
|
/***/ (function(module, exports, __nested_webpack_require_70991__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_70991__("23e7");
|
|
var global = __nested_webpack_require_70991__("da84");
|
|
var getBuiltIn = __nested_webpack_require_70991__("d066");
|
|
var IS_PURE = __nested_webpack_require_70991__("c430");
|
|
var DESCRIPTORS = __nested_webpack_require_70991__("83ab");
|
|
var NATIVE_SYMBOL = __nested_webpack_require_70991__("4930");
|
|
var USE_SYMBOL_AS_UID = __nested_webpack_require_70991__("fdbf");
|
|
var fails = __nested_webpack_require_70991__("d039");
|
|
var has = __nested_webpack_require_70991__("5135");
|
|
var isArray = __nested_webpack_require_70991__("e8b5");
|
|
var isObject = __nested_webpack_require_70991__("861d");
|
|
var anObject = __nested_webpack_require_70991__("825a");
|
|
var toObject = __nested_webpack_require_70991__("7b0b");
|
|
var toIndexedObject = __nested_webpack_require_70991__("fc6a");
|
|
var toPrimitive = __nested_webpack_require_70991__("c04e");
|
|
var createPropertyDescriptor = __nested_webpack_require_70991__("5c6c");
|
|
var nativeObjectCreate = __nested_webpack_require_70991__("7c73");
|
|
var objectKeys = __nested_webpack_require_70991__("df75");
|
|
var getOwnPropertyNamesModule = __nested_webpack_require_70991__("241c");
|
|
var getOwnPropertyNamesExternal = __nested_webpack_require_70991__("057f");
|
|
var getOwnPropertySymbolsModule = __nested_webpack_require_70991__("7418");
|
|
var getOwnPropertyDescriptorModule = __nested_webpack_require_70991__("06cf");
|
|
var definePropertyModule = __nested_webpack_require_70991__("9bf2");
|
|
var propertyIsEnumerableModule = __nested_webpack_require_70991__("d1e7");
|
|
var createNonEnumerableProperty = __nested_webpack_require_70991__("9112");
|
|
var redefine = __nested_webpack_require_70991__("6eeb");
|
|
var shared = __nested_webpack_require_70991__("5692");
|
|
var sharedKey = __nested_webpack_require_70991__("f772");
|
|
var hiddenKeys = __nested_webpack_require_70991__("d012");
|
|
var uid = __nested_webpack_require_70991__("90e3");
|
|
var wellKnownSymbol = __nested_webpack_require_70991__("b622");
|
|
var wrappedWellKnownSymbolModule = __nested_webpack_require_70991__("e538");
|
|
var defineWellKnownSymbol = __nested_webpack_require_70991__("746f");
|
|
var setToStringTag = __nested_webpack_require_70991__("d44e");
|
|
var InternalStateModule = __nested_webpack_require_70991__("69f3");
|
|
var $forEach = __nested_webpack_require_70991__("b727").forEach;
|
|
|
|
var HIDDEN = sharedKey('hidden');
|
|
var SYMBOL = 'Symbol';
|
|
var PROTOTYPE = 'prototype';
|
|
var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
|
|
var setInternalState = InternalStateModule.set;
|
|
var getInternalState = InternalStateModule.getterFor(SYMBOL);
|
|
var ObjectPrototype = Object[PROTOTYPE];
|
|
var $Symbol = global.Symbol;
|
|
var $stringify = getBuiltIn('JSON', 'stringify');
|
|
var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
|
|
var nativeDefineProperty = definePropertyModule.f;
|
|
var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
|
|
var nativePropertyIsEnumerable = propertyIsEnumerableModule.f;
|
|
var AllSymbols = shared('symbols');
|
|
var ObjectPrototypeSymbols = shared('op-symbols');
|
|
var StringToSymbolRegistry = shared('string-to-symbol-registry');
|
|
var SymbolToStringRegistry = shared('symbol-to-string-registry');
|
|
var WellKnownSymbolsStore = shared('wks');
|
|
var QObject = global.QObject;
|
|
// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
|
|
var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
|
|
|
|
// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
|
|
var setSymbolDescriptor = DESCRIPTORS && fails(function () {
|
|
return nativeObjectCreate(nativeDefineProperty({}, 'a', {
|
|
get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
|
|
})).a != 7;
|
|
}) ? function (O, P, Attributes) {
|
|
var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
|
|
if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
|
|
nativeDefineProperty(O, P, Attributes);
|
|
if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
|
|
nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
|
|
}
|
|
} : nativeDefineProperty;
|
|
|
|
var wrap = function (tag, description) {
|
|
var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);
|
|
setInternalState(symbol, {
|
|
type: SYMBOL,
|
|
tag: tag,
|
|
description: description
|
|
});
|
|
if (!DESCRIPTORS) symbol.description = description;
|
|
return symbol;
|
|
};
|
|
|
|
var isSymbol = USE_SYMBOL_AS_UID ? function (it) {
|
|
return typeof it == 'symbol';
|
|
} : function (it) {
|
|
return Object(it) instanceof $Symbol;
|
|
};
|
|
|
|
var $defineProperty = function defineProperty(O, P, Attributes) {
|
|
if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
|
|
anObject(O);
|
|
var key = toPrimitive(P, true);
|
|
anObject(Attributes);
|
|
if (has(AllSymbols, key)) {
|
|
if (!Attributes.enumerable) {
|
|
if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
|
|
O[HIDDEN][key] = true;
|
|
} else {
|
|
if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
|
|
Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
|
|
} return setSymbolDescriptor(O, key, Attributes);
|
|
} return nativeDefineProperty(O, key, Attributes);
|
|
};
|
|
|
|
var $defineProperties = function defineProperties(O, Properties) {
|
|
anObject(O);
|
|
var properties = toIndexedObject(Properties);
|
|
var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
|
|
$forEach(keys, function (key) {
|
|
if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
|
|
});
|
|
return O;
|
|
};
|
|
|
|
var $create = function create(O, Properties) {
|
|
return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
|
|
};
|
|
|
|
var $propertyIsEnumerable = function propertyIsEnumerable(V) {
|
|
var P = toPrimitive(V, true);
|
|
var enumerable = nativePropertyIsEnumerable.call(this, P);
|
|
if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;
|
|
return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
|
|
};
|
|
|
|
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
|
|
var it = toIndexedObject(O);
|
|
var key = toPrimitive(P, true);
|
|
if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;
|
|
var descriptor = nativeGetOwnPropertyDescriptor(it, key);
|
|
if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {
|
|
descriptor.enumerable = true;
|
|
}
|
|
return descriptor;
|
|
};
|
|
|
|
var $getOwnPropertyNames = function getOwnPropertyNames(O) {
|
|
var names = nativeGetOwnPropertyNames(toIndexedObject(O));
|
|
var result = [];
|
|
$forEach(names, function (key) {
|
|
if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);
|
|
});
|
|
return result;
|
|
};
|
|
|
|
var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
|
|
var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
|
|
var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
|
|
var result = [];
|
|
$forEach(names, function (key) {
|
|
if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {
|
|
result.push(AllSymbols[key]);
|
|
}
|
|
});
|
|
return result;
|
|
};
|
|
|
|
// `Symbol` constructor
|
|
// https://tc39.github.io/ecma262/#sec-symbol-constructor
|
|
if (!NATIVE_SYMBOL) {
|
|
$Symbol = function Symbol() {
|
|
if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
|
|
var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);
|
|
var tag = uid(description);
|
|
var setter = function (value) {
|
|
if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);
|
|
if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
|
|
setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
|
|
};
|
|
if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
|
|
return wrap(tag, description);
|
|
};
|
|
|
|
redefine($Symbol[PROTOTYPE], 'toString', function toString() {
|
|
return getInternalState(this).tag;
|
|
});
|
|
|
|
redefine($Symbol, 'withoutSetter', function (description) {
|
|
return wrap(uid(description), description);
|
|
});
|
|
|
|
propertyIsEnumerableModule.f = $propertyIsEnumerable;
|
|
definePropertyModule.f = $defineProperty;
|
|
getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;
|
|
getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
|
|
getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;
|
|
|
|
wrappedWellKnownSymbolModule.f = function (name) {
|
|
return wrap(wellKnownSymbol(name), name);
|
|
};
|
|
|
|
if (DESCRIPTORS) {
|
|
// https://github.com/tc39/proposal-Symbol-description
|
|
nativeDefineProperty($Symbol[PROTOTYPE], 'description', {
|
|
configurable: true,
|
|
get: function description() {
|
|
return getInternalState(this).description;
|
|
}
|
|
});
|
|
if (!IS_PURE) {
|
|
redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
|
|
}
|
|
}
|
|
}
|
|
|
|
$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {
|
|
Symbol: $Symbol
|
|
});
|
|
|
|
$forEach(objectKeys(WellKnownSymbolsStore), function (name) {
|
|
defineWellKnownSymbol(name);
|
|
});
|
|
|
|
$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {
|
|
// `Symbol.for` method
|
|
// https://tc39.github.io/ecma262/#sec-symbol.for
|
|
'for': function (key) {
|
|
var string = String(key);
|
|
if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
|
|
var symbol = $Symbol(string);
|
|
StringToSymbolRegistry[string] = symbol;
|
|
SymbolToStringRegistry[symbol] = string;
|
|
return symbol;
|
|
},
|
|
// `Symbol.keyFor` method
|
|
// https://tc39.github.io/ecma262/#sec-symbol.keyfor
|
|
keyFor: function keyFor(sym) {
|
|
if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');
|
|
if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
|
|
},
|
|
useSetter: function () { USE_SETTER = true; },
|
|
useSimple: function () { USE_SETTER = false; }
|
|
});
|
|
|
|
$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {
|
|
// `Object.create` method
|
|
// https://tc39.github.io/ecma262/#sec-object.create
|
|
create: $create,
|
|
// `Object.defineProperty` method
|
|
// https://tc39.github.io/ecma262/#sec-object.defineproperty
|
|
defineProperty: $defineProperty,
|
|
// `Object.defineProperties` method
|
|
// https://tc39.github.io/ecma262/#sec-object.defineproperties
|
|
defineProperties: $defineProperties,
|
|
// `Object.getOwnPropertyDescriptor` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors
|
|
getOwnPropertyDescriptor: $getOwnPropertyDescriptor
|
|
});
|
|
|
|
$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {
|
|
// `Object.getOwnPropertyNames` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertynames
|
|
getOwnPropertyNames: $getOwnPropertyNames,
|
|
// `Object.getOwnPropertySymbols` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols
|
|
getOwnPropertySymbols: $getOwnPropertySymbols
|
|
});
|
|
|
|
// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
|
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3443
|
|
$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {
|
|
getOwnPropertySymbols: function getOwnPropertySymbols(it) {
|
|
return getOwnPropertySymbolsModule.f(toObject(it));
|
|
}
|
|
});
|
|
|
|
// `JSON.stringify` method behavior with symbols
|
|
// https://tc39.github.io/ecma262/#sec-json.stringify
|
|
if ($stringify) {
|
|
var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {
|
|
var symbol = $Symbol();
|
|
// MS Edge converts symbol values to JSON as {}
|
|
return $stringify([symbol]) != '[null]'
|
|
// WebKit converts symbol values to JSON as null
|
|
|| $stringify({ a: symbol }) != '{}'
|
|
// V8 throws on boxed symbols
|
|
|| $stringify(Object(symbol)) != '{}';
|
|
});
|
|
|
|
$({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
|
|
// eslint-disable-next-line no-unused-vars
|
|
stringify: function stringify(it, replacer, space) {
|
|
var args = [it];
|
|
var index = 1;
|
|
var $replacer;
|
|
while (arguments.length > index) args.push(arguments[index++]);
|
|
$replacer = replacer;
|
|
if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
|
|
if (!isArray(replacer)) replacer = function (key, value) {
|
|
if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
|
|
if (!isSymbol(value)) return value;
|
|
};
|
|
args[1] = replacer;
|
|
return $stringify.apply(null, args);
|
|
}
|
|
});
|
|
}
|
|
|
|
// `Symbol.prototype[@@toPrimitive]` method
|
|
// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive
|
|
if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {
|
|
createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
|
|
}
|
|
// `Symbol.prototype[@@toStringTag]` property
|
|
// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag
|
|
setToStringTag($Symbol, SYMBOL);
|
|
|
|
hiddenKeys[HIDDEN] = true;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a630":
|
|
/***/ (function(module, exports, __nested_webpack_require_83743__) {
|
|
|
|
var $ = __nested_webpack_require_83743__("23e7");
|
|
var from = __nested_webpack_require_83743__("4df4");
|
|
var checkCorrectnessOfIteration = __nested_webpack_require_83743__("1c7e");
|
|
|
|
var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
|
|
Array.from(iterable);
|
|
});
|
|
|
|
// `Array.from` method
|
|
// https://tc39.github.io/ecma262/#sec-array.from
|
|
$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
|
|
from: from
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a640":
|
|
/***/ (function(module, exports, __nested_webpack_require_84230__) {
|
|
|
|
"use strict";
|
|
|
|
var fails = __nested_webpack_require_84230__("d039");
|
|
|
|
module.exports = function (METHOD_NAME, argument) {
|
|
var method = [][METHOD_NAME];
|
|
return !!method && fails(function () {
|
|
// eslint-disable-next-line no-useless-call,no-throw-literal
|
|
method.call(null, argument || function () { throw 1; }, 1);
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "a691":
|
|
/***/ (function(module, exports) {
|
|
|
|
var ceil = Math.ceil;
|
|
var floor = Math.floor;
|
|
|
|
// `ToInteger` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-tointeger
|
|
module.exports = function (argument) {
|
|
return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ab13":
|
|
/***/ (function(module, exports, __nested_webpack_require_84953__) {
|
|
|
|
var wellKnownSymbol = __nested_webpack_require_84953__("b622");
|
|
|
|
var MATCH = wellKnownSymbol('match');
|
|
|
|
module.exports = function (METHOD_NAME) {
|
|
var regexp = /./;
|
|
try {
|
|
'/./'[METHOD_NAME](regexp);
|
|
} catch (e) {
|
|
try {
|
|
regexp[MATCH] = false;
|
|
return '/./'[METHOD_NAME](regexp);
|
|
} catch (f) { /* empty */ }
|
|
} return false;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ac1f":
|
|
/***/ (function(module, exports, __nested_webpack_require_85379__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_85379__("23e7");
|
|
var exec = __nested_webpack_require_85379__("9263");
|
|
|
|
$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {
|
|
exec: exec
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ad6d":
|
|
/***/ (function(module, exports, __nested_webpack_require_85639__) {
|
|
|
|
"use strict";
|
|
|
|
var anObject = __nested_webpack_require_85639__("825a");
|
|
|
|
// `RegExp.prototype.flags` getter implementation
|
|
// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags
|
|
module.exports = function () {
|
|
var that = anObject(this);
|
|
var result = '';
|
|
if (that.global) result += 'g';
|
|
if (that.ignoreCase) result += 'i';
|
|
if (that.multiline) result += 'm';
|
|
if (that.dotAll) result += 's';
|
|
if (that.unicode) result += 'u';
|
|
if (that.sticky) result += 'y';
|
|
return result;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ae40":
|
|
/***/ (function(module, exports, __nested_webpack_require_86210__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_86210__("83ab");
|
|
var fails = __nested_webpack_require_86210__("d039");
|
|
var has = __nested_webpack_require_86210__("5135");
|
|
|
|
var defineProperty = Object.defineProperty;
|
|
var cache = {};
|
|
|
|
var thrower = function (it) { throw it; };
|
|
|
|
module.exports = function (METHOD_NAME, options) {
|
|
if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];
|
|
if (!options) options = {};
|
|
var method = [][METHOD_NAME];
|
|
var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;
|
|
var argument0 = has(options, 0) ? options[0] : thrower;
|
|
var argument1 = has(options, 1) ? options[1] : undefined;
|
|
|
|
return cache[METHOD_NAME] = !!method && !fails(function () {
|
|
if (ACCESSORS && !DESCRIPTORS) return true;
|
|
var O = { length: -1 };
|
|
|
|
if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });
|
|
else O[1] = 1;
|
|
|
|
method.call(O, argument0, argument1);
|
|
});
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ae93":
|
|
/***/ (function(module, exports, __nested_webpack_require_87178__) {
|
|
|
|
"use strict";
|
|
|
|
var getPrototypeOf = __nested_webpack_require_87178__("e163");
|
|
var createNonEnumerableProperty = __nested_webpack_require_87178__("9112");
|
|
var has = __nested_webpack_require_87178__("5135");
|
|
var wellKnownSymbol = __nested_webpack_require_87178__("b622");
|
|
var IS_PURE = __nested_webpack_require_87178__("c430");
|
|
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
var BUGGY_SAFARI_ITERATORS = false;
|
|
|
|
var returnThis = function () { return this; };
|
|
|
|
// `%IteratorPrototype%` object
|
|
// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object
|
|
var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
|
|
|
|
if ([].keys) {
|
|
arrayIterator = [].keys();
|
|
// Safari 8 has buggy iterators w/o `next`
|
|
if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
|
|
else {
|
|
PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
|
|
if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
|
|
}
|
|
}
|
|
|
|
if (IteratorPrototype == undefined) IteratorPrototype = {};
|
|
|
|
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
|
|
if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {
|
|
createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
|
|
}
|
|
|
|
module.exports = {
|
|
IteratorPrototype: IteratorPrototype,
|
|
BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "b041":
|
|
/***/ (function(module, exports, __nested_webpack_require_88549__) {
|
|
|
|
"use strict";
|
|
|
|
var TO_STRING_TAG_SUPPORT = __nested_webpack_require_88549__("00ee");
|
|
var classof = __nested_webpack_require_88549__("f5df");
|
|
|
|
// `Object.prototype.toString` method implementation
|
|
// https://tc39.github.io/ecma262/#sec-object.prototype.tostring
|
|
module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {
|
|
return '[object ' + classof(this) + ']';
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "b0c0":
|
|
/***/ (function(module, exports, __nested_webpack_require_88990__) {
|
|
|
|
var DESCRIPTORS = __nested_webpack_require_88990__("83ab");
|
|
var defineProperty = __nested_webpack_require_88990__("9bf2").f;
|
|
|
|
var FunctionPrototype = Function.prototype;
|
|
var FunctionPrototypeToString = FunctionPrototype.toString;
|
|
var nameRE = /^\s*function ([^ (]*)/;
|
|
var NAME = 'name';
|
|
|
|
// Function instances `.name` property
|
|
// https://tc39.github.io/ecma262/#sec-function-instances-name
|
|
if (DESCRIPTORS && !(NAME in FunctionPrototype)) {
|
|
defineProperty(FunctionPrototype, NAME, {
|
|
configurable: true,
|
|
get: function () {
|
|
try {
|
|
return FunctionPrototypeToString.call(this).match(nameRE)[1];
|
|
} catch (error) {
|
|
return '';
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "b622":
|
|
/***/ (function(module, exports, __nested_webpack_require_89727__) {
|
|
|
|
var global = __nested_webpack_require_89727__("da84");
|
|
var shared = __nested_webpack_require_89727__("5692");
|
|
var has = __nested_webpack_require_89727__("5135");
|
|
var uid = __nested_webpack_require_89727__("90e3");
|
|
var NATIVE_SYMBOL = __nested_webpack_require_89727__("4930");
|
|
var USE_SYMBOL_AS_UID = __nested_webpack_require_89727__("fdbf");
|
|
|
|
var WellKnownSymbolsStore = shared('wks');
|
|
var Symbol = global.Symbol;
|
|
var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;
|
|
|
|
module.exports = function (name) {
|
|
if (!has(WellKnownSymbolsStore, name)) {
|
|
if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];
|
|
else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);
|
|
} return WellKnownSymbolsStore[name];
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "b64b":
|
|
/***/ (function(module, exports, __nested_webpack_require_90533__) {
|
|
|
|
var $ = __nested_webpack_require_90533__("23e7");
|
|
var toObject = __nested_webpack_require_90533__("7b0b");
|
|
var nativeKeys = __nested_webpack_require_90533__("df75");
|
|
var fails = __nested_webpack_require_90533__("d039");
|
|
|
|
var FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });
|
|
|
|
// `Object.keys` method
|
|
// https://tc39.github.io/ecma262/#sec-object.keys
|
|
$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
|
|
keys: function keys(it) {
|
|
return nativeKeys(toObject(it));
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "b727":
|
|
/***/ (function(module, exports, __nested_webpack_require_91067__) {
|
|
|
|
var bind = __nested_webpack_require_91067__("0366");
|
|
var IndexedObject = __nested_webpack_require_91067__("44ad");
|
|
var toObject = __nested_webpack_require_91067__("7b0b");
|
|
var toLength = __nested_webpack_require_91067__("50c4");
|
|
var arraySpeciesCreate = __nested_webpack_require_91067__("65f0");
|
|
|
|
var push = [].push;
|
|
|
|
// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation
|
|
var createMethod = function (TYPE) {
|
|
var IS_MAP = TYPE == 1;
|
|
var IS_FILTER = TYPE == 2;
|
|
var IS_SOME = TYPE == 3;
|
|
var IS_EVERY = TYPE == 4;
|
|
var IS_FIND_INDEX = TYPE == 6;
|
|
var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
|
|
return function ($this, callbackfn, that, specificCreate) {
|
|
var O = toObject($this);
|
|
var self = IndexedObject(O);
|
|
var boundFunction = bind(callbackfn, that, 3);
|
|
var length = toLength(self.length);
|
|
var index = 0;
|
|
var create = specificCreate || arraySpeciesCreate;
|
|
var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
|
|
var value, result;
|
|
for (;length > index; index++) if (NO_HOLES || index in self) {
|
|
value = self[index];
|
|
result = boundFunction(value, index, O);
|
|
if (TYPE) {
|
|
if (IS_MAP) target[index] = result; // map
|
|
else if (result) switch (TYPE) {
|
|
case 3: return true; // some
|
|
case 5: return value; // find
|
|
case 6: return index; // findIndex
|
|
case 2: push.call(target, value); // filter
|
|
} else if (IS_EVERY) return false; // every
|
|
}
|
|
}
|
|
return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
|
|
};
|
|
};
|
|
|
|
module.exports = {
|
|
// `Array.prototype.forEach` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
|
|
forEach: createMethod(0),
|
|
// `Array.prototype.map` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.map
|
|
map: createMethod(1),
|
|
// `Array.prototype.filter` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.filter
|
|
filter: createMethod(2),
|
|
// `Array.prototype.some` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.some
|
|
some: createMethod(3),
|
|
// `Array.prototype.every` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.every
|
|
every: createMethod(4),
|
|
// `Array.prototype.find` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.find
|
|
find: createMethod(5),
|
|
// `Array.prototype.findIndex` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
|
|
findIndex: createMethod(6)
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c04e":
|
|
/***/ (function(module, exports, __nested_webpack_require_93653__) {
|
|
|
|
var isObject = __nested_webpack_require_93653__("861d");
|
|
|
|
// `ToPrimitive` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-toprimitive
|
|
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
|
|
// and the second argument - flag - preferred type is a string
|
|
module.exports = function (input, PREFERRED_STRING) {
|
|
if (!isObject(input)) return input;
|
|
var fn, val;
|
|
if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
|
|
if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;
|
|
if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
|
|
throw TypeError("Can't convert object to primitive value");
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c430":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = false;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c6b6":
|
|
/***/ (function(module, exports) {
|
|
|
|
var toString = {}.toString;
|
|
|
|
module.exports = function (it) {
|
|
return toString.call(it).slice(8, -1);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c6cd":
|
|
/***/ (function(module, exports, __nested_webpack_require_94766__) {
|
|
|
|
var global = __nested_webpack_require_94766__("da84");
|
|
var setGlobal = __nested_webpack_require_94766__("ce4e");
|
|
|
|
var SHARED = '__core-js_shared__';
|
|
var store = global[SHARED] || setGlobal(SHARED, {});
|
|
|
|
module.exports = store;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c740":
|
|
/***/ (function(module, exports, __nested_webpack_require_95051__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_95051__("23e7");
|
|
var $findIndex = __nested_webpack_require_95051__("b727").findIndex;
|
|
var addToUnscopables = __nested_webpack_require_95051__("44d2");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_95051__("ae40");
|
|
|
|
var FIND_INDEX = 'findIndex';
|
|
var SKIPS_HOLES = true;
|
|
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);
|
|
|
|
// Shouldn't skip holes
|
|
if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });
|
|
|
|
// `Array.prototype.findIndex` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
|
|
$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {
|
|
findIndex: function findIndex(callbackfn /* , that = undefined */) {
|
|
return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
|
|
}
|
|
});
|
|
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
|
|
addToUnscopables(FIND_INDEX);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c8ba":
|
|
/***/ (function(module, exports) {
|
|
|
|
var g;
|
|
|
|
// This works in non-strict mode
|
|
g = (function() {
|
|
return this;
|
|
})();
|
|
|
|
try {
|
|
// This works if eval is allowed (see CSP)
|
|
g = g || new Function("return this")();
|
|
} catch (e) {
|
|
// This works if the window reference is available
|
|
if (typeof window === "object") g = window;
|
|
}
|
|
|
|
// g can still be undefined, but nothing to do about it...
|
|
// We return undefined, instead of nothing here, so it's
|
|
// easier to handle this case. if(!global) { ...}
|
|
|
|
module.exports = g;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "c975":
|
|
/***/ (function(module, exports, __nested_webpack_require_96561__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_96561__("23e7");
|
|
var $indexOf = __nested_webpack_require_96561__("4d64").indexOf;
|
|
var arrayMethodIsStrict = __nested_webpack_require_96561__("a640");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_96561__("ae40");
|
|
|
|
var nativeIndexOf = [].indexOf;
|
|
|
|
var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;
|
|
var STRICT_METHOD = arrayMethodIsStrict('indexOf');
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
|
|
|
|
// `Array.prototype.indexOf` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.indexof
|
|
$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {
|
|
indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
|
|
return NEGATIVE_ZERO
|
|
// convert -0 to +0
|
|
? nativeIndexOf.apply(this, arguments) || 0
|
|
: $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ca84":
|
|
/***/ (function(module, exports, __nested_webpack_require_97562__) {
|
|
|
|
var has = __nested_webpack_require_97562__("5135");
|
|
var toIndexedObject = __nested_webpack_require_97562__("fc6a");
|
|
var indexOf = __nested_webpack_require_97562__("4d64").indexOf;
|
|
var hiddenKeys = __nested_webpack_require_97562__("d012");
|
|
|
|
module.exports = function (object, names) {
|
|
var O = toIndexedObject(object);
|
|
var i = 0;
|
|
var result = [];
|
|
var key;
|
|
for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);
|
|
// Don't enum bug & hidden keys
|
|
while (names.length > i) if (has(O, key = names[i++])) {
|
|
~indexOf(result, key) || result.push(key);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "caad":
|
|
/***/ (function(module, exports, __nested_webpack_require_98195__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_98195__("23e7");
|
|
var $includes = __nested_webpack_require_98195__("4d64").includes;
|
|
var addToUnscopables = __nested_webpack_require_98195__("44d2");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_98195__("ae40");
|
|
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
|
|
|
|
// `Array.prototype.includes` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
|
$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {
|
|
includes: function includes(el /* , fromIndex = 0 */) {
|
|
return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
|
|
}
|
|
});
|
|
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
|
|
addToUnscopables('includes');
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "cc12":
|
|
/***/ (function(module, exports, __nested_webpack_require_98993__) {
|
|
|
|
var global = __nested_webpack_require_98993__("da84");
|
|
var isObject = __nested_webpack_require_98993__("861d");
|
|
|
|
var document = global.document;
|
|
// typeof document.createElement is 'object' in old IE
|
|
var EXISTS = isObject(document) && isObject(document.createElement);
|
|
|
|
module.exports = function (it) {
|
|
return EXISTS ? document.createElement(it) : {};
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ce4e":
|
|
/***/ (function(module, exports, __nested_webpack_require_99408__) {
|
|
|
|
var global = __nested_webpack_require_99408__("da84");
|
|
var createNonEnumerableProperty = __nested_webpack_require_99408__("9112");
|
|
|
|
module.exports = function (key, value) {
|
|
try {
|
|
createNonEnumerableProperty(global, key, value);
|
|
} catch (error) {
|
|
global[key] = value;
|
|
} return value;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d012":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = {};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d039":
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = function (exec) {
|
|
try {
|
|
return !!exec();
|
|
} catch (error) {
|
|
return true;
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d066":
|
|
/***/ (function(module, exports, __nested_webpack_require_100021__) {
|
|
|
|
var path = __nested_webpack_require_100021__("428f");
|
|
var global = __nested_webpack_require_100021__("da84");
|
|
|
|
var aFunction = function (variable) {
|
|
return typeof variable == 'function' ? variable : undefined;
|
|
};
|
|
|
|
module.exports = function (namespace, method) {
|
|
return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])
|
|
: path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d1e7":
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
|
|
var nativePropertyIsEnumerable = {}.propertyIsEnumerable;
|
|
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
|
|
// Nashorn ~ JDK8 bug
|
|
var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);
|
|
|
|
// `Object.prototype.propertyIsEnumerable` method implementation
|
|
// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable
|
|
exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
|
|
var descriptor = getOwnPropertyDescriptor(this, V);
|
|
return !!descriptor && descriptor.enumerable;
|
|
} : nativePropertyIsEnumerable;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d28b":
|
|
/***/ (function(module, exports, __nested_webpack_require_101210__) {
|
|
|
|
var defineWellKnownSymbol = __nested_webpack_require_101210__("746f");
|
|
|
|
// `Symbol.iterator` well-known symbol
|
|
// https://tc39.github.io/ecma262/#sec-symbol.iterator
|
|
defineWellKnownSymbol('iterator');
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d2bb":
|
|
/***/ (function(module, exports, __nested_webpack_require_101481__) {
|
|
|
|
var anObject = __nested_webpack_require_101481__("825a");
|
|
var aPossiblePrototype = __nested_webpack_require_101481__("3bbe");
|
|
|
|
// `Object.setPrototypeOf` method
|
|
// https://tc39.github.io/ecma262/#sec-object.setprototypeof
|
|
// Works with __proto__ only. Old v8 can't work with null proto objects.
|
|
/* eslint-disable no-proto */
|
|
module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
|
|
var CORRECT_SETTER = false;
|
|
var test = {};
|
|
var setter;
|
|
try {
|
|
setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
|
|
setter.call(test, []);
|
|
CORRECT_SETTER = test instanceof Array;
|
|
} catch (error) { /* empty */ }
|
|
return function setPrototypeOf(O, proto) {
|
|
anObject(O);
|
|
aPossiblePrototype(proto);
|
|
if (CORRECT_SETTER) setter.call(O, proto);
|
|
else O.__proto__ = proto;
|
|
return O;
|
|
};
|
|
}() : undefined);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d3b7":
|
|
/***/ (function(module, exports, __nested_webpack_require_102401__) {
|
|
|
|
var TO_STRING_TAG_SUPPORT = __nested_webpack_require_102401__("00ee");
|
|
var redefine = __nested_webpack_require_102401__("6eeb");
|
|
var toString = __nested_webpack_require_102401__("b041");
|
|
|
|
// `Object.prototype.toString` method
|
|
// https://tc39.github.io/ecma262/#sec-object.prototype.tostring
|
|
if (!TO_STRING_TAG_SUPPORT) {
|
|
redefine(Object.prototype, 'toString', toString, { unsafe: true });
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d44e":
|
|
/***/ (function(module, exports, __nested_webpack_require_102836__) {
|
|
|
|
var defineProperty = __nested_webpack_require_102836__("9bf2").f;
|
|
var has = __nested_webpack_require_102836__("5135");
|
|
var wellKnownSymbol = __nested_webpack_require_102836__("b622");
|
|
|
|
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
|
|
|
module.exports = function (it, TAG, STATIC) {
|
|
if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {
|
|
defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d58f":
|
|
/***/ (function(module, exports, __nested_webpack_require_103312__) {
|
|
|
|
var aFunction = __nested_webpack_require_103312__("1c0b");
|
|
var toObject = __nested_webpack_require_103312__("7b0b");
|
|
var IndexedObject = __nested_webpack_require_103312__("44ad");
|
|
var toLength = __nested_webpack_require_103312__("50c4");
|
|
|
|
// `Array.prototype.{ reduce, reduceRight }` methods implementation
|
|
var createMethod = function (IS_RIGHT) {
|
|
return function (that, callbackfn, argumentsLength, memo) {
|
|
aFunction(callbackfn);
|
|
var O = toObject(that);
|
|
var self = IndexedObject(O);
|
|
var length = toLength(O.length);
|
|
var index = IS_RIGHT ? length - 1 : 0;
|
|
var i = IS_RIGHT ? -1 : 1;
|
|
if (argumentsLength < 2) while (true) {
|
|
if (index in self) {
|
|
memo = self[index];
|
|
index += i;
|
|
break;
|
|
}
|
|
index += i;
|
|
if (IS_RIGHT ? index < 0 : length <= index) {
|
|
throw TypeError('Reduce of empty array with no initial value');
|
|
}
|
|
}
|
|
for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
|
|
memo = callbackfn(memo, self[index], index, O);
|
|
}
|
|
return memo;
|
|
};
|
|
};
|
|
|
|
module.exports = {
|
|
// `Array.prototype.reduce` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
|
|
left: createMethod(false),
|
|
// `Array.prototype.reduceRight` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright
|
|
right: createMethod(true)
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d784":
|
|
/***/ (function(module, exports, __nested_webpack_require_104707__) {
|
|
|
|
"use strict";
|
|
|
|
// TODO: Remove from `core-js@4` since it's moved to entry points
|
|
__nested_webpack_require_104707__("ac1f");
|
|
var redefine = __nested_webpack_require_104707__("6eeb");
|
|
var fails = __nested_webpack_require_104707__("d039");
|
|
var wellKnownSymbol = __nested_webpack_require_104707__("b622");
|
|
var regexpExec = __nested_webpack_require_104707__("9263");
|
|
var createNonEnumerableProperty = __nested_webpack_require_104707__("9112");
|
|
|
|
var SPECIES = wellKnownSymbol('species');
|
|
|
|
var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
|
|
// #replace needs built-in support for named groups.
|
|
// #match works fine because it just return the exec results, even if it has
|
|
// a "grops" property.
|
|
var re = /./;
|
|
re.exec = function () {
|
|
var result = [];
|
|
result.groups = { a: '7' };
|
|
return result;
|
|
};
|
|
return ''.replace(re, '$<a>') !== '7';
|
|
});
|
|
|
|
// IE <= 11 replaces $0 with the whole match, as if it was $&
|
|
// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
|
|
var REPLACE_KEEPS_$0 = (function () {
|
|
return 'a'.replace(/./, '$0') === '$0';
|
|
})();
|
|
|
|
var REPLACE = wellKnownSymbol('replace');
|
|
// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
|
|
var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
|
|
if (/./[REPLACE]) {
|
|
return /./[REPLACE]('a', '$0') === '';
|
|
}
|
|
return false;
|
|
})();
|
|
|
|
// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
|
|
// Weex JS has frozen built-in prototypes, so use try / catch wrapper
|
|
var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {
|
|
var re = /(?:)/;
|
|
var originalExec = re.exec;
|
|
re.exec = function () { return originalExec.apply(this, arguments); };
|
|
var result = 'ab'.split(re);
|
|
return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
|
|
});
|
|
|
|
module.exports = function (KEY, length, exec, sham) {
|
|
var SYMBOL = wellKnownSymbol(KEY);
|
|
|
|
var DELEGATES_TO_SYMBOL = !fails(function () {
|
|
// String methods call symbol-named RegEp methods
|
|
var O = {};
|
|
O[SYMBOL] = function () { return 7; };
|
|
return ''[KEY](O) != 7;
|
|
});
|
|
|
|
var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
|
|
// Symbol-named RegExp methods call .exec
|
|
var execCalled = false;
|
|
var re = /a/;
|
|
|
|
if (KEY === 'split') {
|
|
// We can't use real regex here since it causes deoptimization
|
|
// and serious performance degradation in V8
|
|
// https://github.com/zloirock/core-js/issues/306
|
|
re = {};
|
|
// RegExp[@@split] doesn't call the regex's exec method, but first creates
|
|
// a new one. We need to return the patched regex when creating the new one.
|
|
re.constructor = {};
|
|
re.constructor[SPECIES] = function () { return re; };
|
|
re.flags = '';
|
|
re[SYMBOL] = /./[SYMBOL];
|
|
}
|
|
|
|
re.exec = function () { execCalled = true; return null; };
|
|
|
|
re[SYMBOL]('');
|
|
return !execCalled;
|
|
});
|
|
|
|
if (
|
|
!DELEGATES_TO_SYMBOL ||
|
|
!DELEGATES_TO_EXEC ||
|
|
(KEY === 'replace' && !(
|
|
REPLACE_SUPPORTS_NAMED_GROUPS &&
|
|
REPLACE_KEEPS_$0 &&
|
|
!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE
|
|
)) ||
|
|
(KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)
|
|
) {
|
|
var nativeRegExpMethod = /./[SYMBOL];
|
|
var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
|
|
if (regexp.exec === regexpExec) {
|
|
if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
|
|
// The native String method already delegates to @@method (this
|
|
// polyfilled function), leasing to infinite recursion.
|
|
// We avoid it by directly calling the native @@method method.
|
|
return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };
|
|
}
|
|
return { done: true, value: nativeMethod.call(str, regexp, arg2) };
|
|
}
|
|
return { done: false };
|
|
}, {
|
|
REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,
|
|
REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE
|
|
});
|
|
var stringMethod = methods[0];
|
|
var regexMethod = methods[1];
|
|
|
|
redefine(String.prototype, KEY, stringMethod);
|
|
redefine(RegExp.prototype, SYMBOL, length == 2
|
|
// 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
|
|
// 21.2.5.11 RegExp.prototype[@@split](string, limit)
|
|
? function (string, arg) { return regexMethod.call(string, this, arg); }
|
|
// 21.2.5.6 RegExp.prototype[@@match](string)
|
|
// 21.2.5.9 RegExp.prototype[@@search](string)
|
|
: function (string) { return regexMethod.call(string, this); }
|
|
);
|
|
}
|
|
|
|
if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "d81d":
|
|
/***/ (function(module, exports, __nested_webpack_require_109390__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_109390__("23e7");
|
|
var $map = __nested_webpack_require_109390__("b727").map;
|
|
var arrayMethodHasSpeciesSupport = __nested_webpack_require_109390__("1dde");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_109390__("ae40");
|
|
|
|
var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
|
|
// FF49- issue
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('map');
|
|
|
|
// `Array.prototype.map` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.map
|
|
// with adding support of @@species
|
|
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
|
|
map: function map(callbackfn /* , thisArg */) {
|
|
return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "da84":
|
|
/***/ (function(module, exports, __nested_webpack_require_110182__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(global) {var check = function (it) {
|
|
return it && it.Math == Math && it;
|
|
};
|
|
|
|
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
|
|
module.exports =
|
|
// eslint-disable-next-line no-undef
|
|
check(typeof globalThis == 'object' && globalThis) ||
|
|
check(typeof window == 'object' && window) ||
|
|
check(typeof self == 'object' && self) ||
|
|
check(typeof global == 'object' && global) ||
|
|
// eslint-disable-next-line no-new-func
|
|
Function('return this')();
|
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_110182__("c8ba")))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dbb4":
|
|
/***/ (function(module, exports, __nested_webpack_require_110847__) {
|
|
|
|
var $ = __nested_webpack_require_110847__("23e7");
|
|
var DESCRIPTORS = __nested_webpack_require_110847__("83ab");
|
|
var ownKeys = __nested_webpack_require_110847__("56ef");
|
|
var toIndexedObject = __nested_webpack_require_110847__("fc6a");
|
|
var getOwnPropertyDescriptorModule = __nested_webpack_require_110847__("06cf");
|
|
var createProperty = __nested_webpack_require_110847__("8418");
|
|
|
|
// `Object.getOwnPropertyDescriptors` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors
|
|
$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
|
|
getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
|
|
var O = toIndexedObject(object);
|
|
var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
|
|
var keys = ownKeys(O);
|
|
var result = {};
|
|
var index = 0;
|
|
var key, descriptor;
|
|
while (keys.length > index) {
|
|
descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);
|
|
if (descriptor !== undefined) createProperty(result, key, descriptor);
|
|
}
|
|
return result;
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dbf1":
|
|
/***/ (function(module, __webpack_exports__, __nested_webpack_require_111898__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __nested_webpack_require_111898__.d(__webpack_exports__, "a", function() { return console; });
|
|
function getConsole() {
|
|
if (typeof window !== "undefined") {
|
|
return window.console;
|
|
}
|
|
|
|
return global.console;
|
|
}
|
|
|
|
var console = getConsole();
|
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __nested_webpack_require_111898__("c8ba")))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "ddb0":
|
|
/***/ (function(module, exports, __nested_webpack_require_112375__) {
|
|
|
|
var global = __nested_webpack_require_112375__("da84");
|
|
var DOMIterables = __nested_webpack_require_112375__("fdbc");
|
|
var ArrayIteratorMethods = __nested_webpack_require_112375__("e260");
|
|
var createNonEnumerableProperty = __nested_webpack_require_112375__("9112");
|
|
var wellKnownSymbol = __nested_webpack_require_112375__("b622");
|
|
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
|
var ArrayValues = ArrayIteratorMethods.values;
|
|
|
|
for (var COLLECTION_NAME in DOMIterables) {
|
|
var Collection = global[COLLECTION_NAME];
|
|
var CollectionPrototype = Collection && Collection.prototype;
|
|
if (CollectionPrototype) {
|
|
// some Chrome versions have non-configurable methods on DOMTokenList
|
|
if (CollectionPrototype[ITERATOR] !== ArrayValues) try {
|
|
createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);
|
|
} catch (error) {
|
|
CollectionPrototype[ITERATOR] = ArrayValues;
|
|
}
|
|
if (!CollectionPrototype[TO_STRING_TAG]) {
|
|
createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
|
|
}
|
|
if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {
|
|
// some Chrome versions have non-configurable methods on DOMTokenList
|
|
if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {
|
|
createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);
|
|
} catch (error) {
|
|
CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "df75":
|
|
/***/ (function(module, exports, __nested_webpack_require_113958__) {
|
|
|
|
var internalObjectKeys = __nested_webpack_require_113958__("ca84");
|
|
var enumBugKeys = __nested_webpack_require_113958__("7839");
|
|
|
|
// `Object.keys` method
|
|
// https://tc39.github.io/ecma262/#sec-object.keys
|
|
module.exports = Object.keys || function keys(O) {
|
|
return internalObjectKeys(O, enumBugKeys);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e01a":
|
|
/***/ (function(module, exports, __nested_webpack_require_114318__) {
|
|
|
|
"use strict";
|
|
// `Symbol.prototype.description` getter
|
|
// https://tc39.github.io/ecma262/#sec-symbol.prototype.description
|
|
|
|
var $ = __nested_webpack_require_114318__("23e7");
|
|
var DESCRIPTORS = __nested_webpack_require_114318__("83ab");
|
|
var global = __nested_webpack_require_114318__("da84");
|
|
var has = __nested_webpack_require_114318__("5135");
|
|
var isObject = __nested_webpack_require_114318__("861d");
|
|
var defineProperty = __nested_webpack_require_114318__("9bf2").f;
|
|
var copyConstructorProperties = __nested_webpack_require_114318__("e893");
|
|
|
|
var NativeSymbol = global.Symbol;
|
|
|
|
if (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||
|
|
// Safari 12 bug
|
|
NativeSymbol().description !== undefined
|
|
)) {
|
|
var EmptyStringDescriptionStore = {};
|
|
// wrap Symbol constructor for correct work with undefined description
|
|
var SymbolWrapper = function Symbol() {
|
|
var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);
|
|
var result = this instanceof SymbolWrapper
|
|
? new NativeSymbol(description)
|
|
// in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
|
|
: description === undefined ? NativeSymbol() : NativeSymbol(description);
|
|
if (description === '') EmptyStringDescriptionStore[result] = true;
|
|
return result;
|
|
};
|
|
copyConstructorProperties(SymbolWrapper, NativeSymbol);
|
|
var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;
|
|
symbolPrototype.constructor = SymbolWrapper;
|
|
|
|
var symbolToString = symbolPrototype.toString;
|
|
var native = String(NativeSymbol('test')) == 'Symbol(test)';
|
|
var regexp = /^Symbol\((.*)\)[^)]+$/;
|
|
defineProperty(symbolPrototype, 'description', {
|
|
configurable: true,
|
|
get: function description() {
|
|
var symbol = isObject(this) ? this.valueOf() : this;
|
|
var string = symbolToString.call(symbol);
|
|
if (has(EmptyStringDescriptionStore, symbol)) return '';
|
|
var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');
|
|
return desc === '' ? undefined : desc;
|
|
}
|
|
});
|
|
|
|
$({ global: true, forced: true }, {
|
|
Symbol: SymbolWrapper
|
|
});
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e163":
|
|
/***/ (function(module, exports, __nested_webpack_require_116469__) {
|
|
|
|
var has = __nested_webpack_require_116469__("5135");
|
|
var toObject = __nested_webpack_require_116469__("7b0b");
|
|
var sharedKey = __nested_webpack_require_116469__("f772");
|
|
var CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_116469__("e177");
|
|
|
|
var IE_PROTO = sharedKey('IE_PROTO');
|
|
var ObjectPrototype = Object.prototype;
|
|
|
|
// `Object.getPrototypeOf` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getprototypeof
|
|
module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {
|
|
O = toObject(O);
|
|
if (has(O, IE_PROTO)) return O[IE_PROTO];
|
|
if (typeof O.constructor == 'function' && O instanceof O.constructor) {
|
|
return O.constructor.prototype;
|
|
} return O instanceof Object ? ObjectPrototype : null;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e177":
|
|
/***/ (function(module, exports, __nested_webpack_require_117232__) {
|
|
|
|
var fails = __nested_webpack_require_117232__("d039");
|
|
|
|
module.exports = !fails(function () {
|
|
function F() { /* empty */ }
|
|
F.prototype.constructor = null;
|
|
return Object.getPrototypeOf(new F()) !== F.prototype;
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e260":
|
|
/***/ (function(module, exports, __nested_webpack_require_117522__) {
|
|
|
|
"use strict";
|
|
|
|
var toIndexedObject = __nested_webpack_require_117522__("fc6a");
|
|
var addToUnscopables = __nested_webpack_require_117522__("44d2");
|
|
var Iterators = __nested_webpack_require_117522__("3f8c");
|
|
var InternalStateModule = __nested_webpack_require_117522__("69f3");
|
|
var defineIterator = __nested_webpack_require_117522__("7dd0");
|
|
|
|
var ARRAY_ITERATOR = 'Array Iterator';
|
|
var setInternalState = InternalStateModule.set;
|
|
var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
|
|
|
|
// `Array.prototype.entries` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.entries
|
|
// `Array.prototype.keys` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.keys
|
|
// `Array.prototype.values` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.values
|
|
// `Array.prototype[@@iterator]` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator
|
|
// `CreateArrayIterator` internal method
|
|
// https://tc39.github.io/ecma262/#sec-createarrayiterator
|
|
module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
|
|
setInternalState(this, {
|
|
type: ARRAY_ITERATOR,
|
|
target: toIndexedObject(iterated), // target
|
|
index: 0, // next index
|
|
kind: kind // kind
|
|
});
|
|
// `%ArrayIteratorPrototype%.next` method
|
|
// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next
|
|
}, function () {
|
|
var state = getInternalState(this);
|
|
var target = state.target;
|
|
var kind = state.kind;
|
|
var index = state.index++;
|
|
if (!target || index >= target.length) {
|
|
state.target = undefined;
|
|
return { value: undefined, done: true };
|
|
}
|
|
if (kind == 'keys') return { value: index, done: false };
|
|
if (kind == 'values') return { value: target[index], done: false };
|
|
return { value: [index, target[index]], done: false };
|
|
}, 'values');
|
|
|
|
// argumentsList[@@iterator] is %ArrayProto_values%
|
|
// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject
|
|
// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject
|
|
Iterators.Arguments = Iterators.Array;
|
|
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
|
|
addToUnscopables('keys');
|
|
addToUnscopables('values');
|
|
addToUnscopables('entries');
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e439":
|
|
/***/ (function(module, exports, __nested_webpack_require_119765__) {
|
|
|
|
var $ = __nested_webpack_require_119765__("23e7");
|
|
var fails = __nested_webpack_require_119765__("d039");
|
|
var toIndexedObject = __nested_webpack_require_119765__("fc6a");
|
|
var nativeGetOwnPropertyDescriptor = __nested_webpack_require_119765__("06cf").f;
|
|
var DESCRIPTORS = __nested_webpack_require_119765__("83ab");
|
|
|
|
var FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });
|
|
var FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;
|
|
|
|
// `Object.getOwnPropertyDescriptor` method
|
|
// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor
|
|
$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {
|
|
getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
|
|
return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e538":
|
|
/***/ (function(module, exports, __nested_webpack_require_120569__) {
|
|
|
|
var wellKnownSymbol = __nested_webpack_require_120569__("b622");
|
|
|
|
exports.f = wellKnownSymbol;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e893":
|
|
/***/ (function(module, exports, __nested_webpack_require_120734__) {
|
|
|
|
var has = __nested_webpack_require_120734__("5135");
|
|
var ownKeys = __nested_webpack_require_120734__("56ef");
|
|
var getOwnPropertyDescriptorModule = __nested_webpack_require_120734__("06cf");
|
|
var definePropertyModule = __nested_webpack_require_120734__("9bf2");
|
|
|
|
module.exports = function (target, source) {
|
|
var keys = ownKeys(source);
|
|
var defineProperty = definePropertyModule.f;
|
|
var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var key = keys[i];
|
|
if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e8b5":
|
|
/***/ (function(module, exports, __nested_webpack_require_121379__) {
|
|
|
|
var classof = __nested_webpack_require_121379__("c6b6");
|
|
|
|
// `IsArray` abstract operation
|
|
// https://tc39.github.io/ecma262/#sec-isarray
|
|
module.exports = Array.isArray || function isArray(arg) {
|
|
return classof(arg) == 'Array';
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "e95a":
|
|
/***/ (function(module, exports, __nested_webpack_require_121681__) {
|
|
|
|
var wellKnownSymbol = __nested_webpack_require_121681__("b622");
|
|
var Iterators = __nested_webpack_require_121681__("3f8c");
|
|
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
var ArrayPrototype = Array.prototype;
|
|
|
|
// check on default Array iterator
|
|
module.exports = function (it) {
|
|
return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "f5df":
|
|
/***/ (function(module, exports, __nested_webpack_require_122106__) {
|
|
|
|
var TO_STRING_TAG_SUPPORT = __nested_webpack_require_122106__("00ee");
|
|
var classofRaw = __nested_webpack_require_122106__("c6b6");
|
|
var wellKnownSymbol = __nested_webpack_require_122106__("b622");
|
|
|
|
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
|
// ES3 wrong here
|
|
var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
|
|
|
|
// fallback for IE11 Script Access Denied error
|
|
var tryGet = function (it, key) {
|
|
try {
|
|
return it[key];
|
|
} catch (error) { /* empty */ }
|
|
};
|
|
|
|
// getting tag from ES6+ `Object.prototype.toString`
|
|
module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
|
|
var O, tag, result;
|
|
return it === undefined ? 'Undefined' : it === null ? 'Null'
|
|
// @@toStringTag case
|
|
: typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag
|
|
// builtinTag case
|
|
: CORRECT_ARGUMENTS ? classofRaw(O)
|
|
// ES3 arguments fallback
|
|
: (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "f772":
|
|
/***/ (function(module, exports, __nested_webpack_require_123159__) {
|
|
|
|
var shared = __nested_webpack_require_123159__("5692");
|
|
var uid = __nested_webpack_require_123159__("90e3");
|
|
|
|
var keys = shared('keys');
|
|
|
|
module.exports = function (key) {
|
|
return keys[key] || (keys[key] = uid(key));
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fb15":
|
|
/***/ (function(module, __webpack_exports__, __nested_webpack_require_123448__) {
|
|
|
|
"use strict";
|
|
// ESM COMPAT FLAG
|
|
__nested_webpack_require_123448__.r(__webpack_exports__);
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
|
|
// This file is imported into lib/wc client bundles.
|
|
|
|
if (typeof window !== 'undefined') {
|
|
var currentScript = window.document.currentScript
|
|
if (true) {
|
|
var getCurrentScript = __nested_webpack_require_123448__("8875")
|
|
currentScript = getCurrentScript()
|
|
|
|
// for backward compatibility, because previously we directly included the polyfill
|
|
if (!('currentScript' in document)) {
|
|
Object.defineProperty(document, 'currentScript', { get: getCurrentScript })
|
|
}
|
|
}
|
|
|
|
var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/)
|
|
if (src) {
|
|
__nested_webpack_require_123448__.p = src[1] // eslint-disable-line
|
|
}
|
|
}
|
|
|
|
// Indicate to webpack that this file can be concatenated
|
|
/* harmony default export */ var setPublicPath = (null);
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.concat.js
|
|
var es_array_concat = __nested_webpack_require_123448__("99af");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.filter.js
|
|
var es_array_filter = __nested_webpack_require_123448__("4de4");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.for-each.js
|
|
var es_array_for_each = __nested_webpack_require_123448__("4160");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.index-of.js
|
|
var es_array_index_of = __nested_webpack_require_123448__("c975");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.map.js
|
|
var es_array_map = __nested_webpack_require_123448__("d81d");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.splice.js
|
|
var es_array_splice = __nested_webpack_require_123448__("a434");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.for-each.js
|
|
var web_dom_collections_for_each = __nested_webpack_require_123448__("159b");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.symbol.js
|
|
var es_symbol = __nested_webpack_require_123448__("a4d3");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.get-own-property-descriptor.js
|
|
var es_object_get_own_property_descriptor = __nested_webpack_require_123448__("e439");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.get-own-property-descriptors.js
|
|
var es_object_get_own_property_descriptors = __nested_webpack_require_123448__("dbb4");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.keys.js
|
|
var es_object_keys = __nested_webpack_require_123448__("b64b");
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js
|
|
function _defineProperty(obj, key, value) {
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function ownKeys(object, enumerableOnly) {
|
|
var keys = Object.keys(object);
|
|
|
|
if (Object.getOwnPropertySymbols) {
|
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
if (enumerableOnly) symbols = symbols.filter(function (sym) {
|
|
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
});
|
|
keys.push.apply(keys, symbols);
|
|
}
|
|
|
|
return keys;
|
|
}
|
|
|
|
function _objectSpread2(target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
|
if (i % 2) {
|
|
ownKeys(Object(source), true).forEach(function (key) {
|
|
_defineProperty(target, key, source[key]);
|
|
});
|
|
} else if (Object.getOwnPropertyDescriptors) {
|
|
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
} else {
|
|
ownKeys(Object(source)).forEach(function (key) {
|
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
});
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
|
|
function _arrayWithHoles(arr) {
|
|
if (Array.isArray(arr)) return arr;
|
|
}
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.symbol.description.js
|
|
var es_symbol_description = __nested_webpack_require_123448__("e01a");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.symbol.iterator.js
|
|
var es_symbol_iterator = __nested_webpack_require_123448__("d28b");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.iterator.js
|
|
var es_array_iterator = __nested_webpack_require_123448__("e260");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.to-string.js
|
|
var es_object_to_string = __nested_webpack_require_123448__("d3b7");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.iterator.js
|
|
var es_string_iterator = __nested_webpack_require_123448__("3ca3");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.iterator.js
|
|
var web_dom_collections_iterator = __nested_webpack_require_123448__("ddb0");
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function _iterableToArrayLimit(arr, i) {
|
|
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
|
|
var _arr = [];
|
|
var _n = true;
|
|
var _d = false;
|
|
var _e = undefined;
|
|
|
|
try {
|
|
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
|
|
_arr.push(_s.value);
|
|
|
|
if (i && _arr.length === i) break;
|
|
}
|
|
} catch (err) {
|
|
_d = true;
|
|
_e = err;
|
|
} finally {
|
|
try {
|
|
if (!_n && _i["return"] != null) _i["return"]();
|
|
} finally {
|
|
if (_d) throw _e;
|
|
}
|
|
}
|
|
|
|
return _arr;
|
|
}
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.from.js
|
|
var es_array_from = __nested_webpack_require_123448__("a630");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.slice.js
|
|
var es_array_slice = __nested_webpack_require_123448__("fb6a");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.function.name.js
|
|
var es_function_name = __nested_webpack_require_123448__("b0c0");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.to-string.js
|
|
var es_regexp_to_string = __nested_webpack_require_123448__("25f0");
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
|
|
function _arrayLikeToArray(arr, len) {
|
|
if (len == null || len > arr.length) len = arr.length;
|
|
|
|
for (var i = 0, arr2 = new Array(len); i < len; i++) {
|
|
arr2[i] = arr[i];
|
|
}
|
|
|
|
return arr2;
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function _unsupportedIterableToArray(o, minLen) {
|
|
if (!o) return;
|
|
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
if (n === "Map" || n === "Set") return Array.from(o);
|
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
|
|
function _nonIterableRest() {
|
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js
|
|
|
|
|
|
|
|
|
|
function _slicedToArray(arr, i) {
|
|
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
|
|
|
|
function _arrayWithoutHoles(arr) {
|
|
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function _iterableToArray(iter) {
|
|
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
|
|
function _nonIterableSpread() {
|
|
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
|
|
|
|
|
|
|
|
|
|
function _toConsumableArray(arr) {
|
|
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
}
|
|
// EXTERNAL MODULE: external {"commonjs":"sortablejs","commonjs2":"sortablejs","amd":"sortablejs","root":"Sortable"}
|
|
var external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_ = __nested_webpack_require_123448__("a352");
|
|
var external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_default = /*#__PURE__*/__nested_webpack_require_123448__.n(external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_);
|
|
|
|
// CONCATENATED MODULE: ./src/util/htmlHelper.js
|
|
function removeNode(node) {
|
|
if (node.parentElement !== null) {
|
|
node.parentElement.removeChild(node);
|
|
}
|
|
}
|
|
|
|
function insertNodeAt(fatherNode, node, position) {
|
|
var refNode = position === 0 ? fatherNode.children[0] : fatherNode.children[position - 1].nextSibling;
|
|
fatherNode.insertBefore(node, refNode);
|
|
}
|
|
|
|
|
|
// EXTERNAL MODULE: ./src/util/console.js
|
|
var console = __nested_webpack_require_123448__("dbf1");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.reduce.js
|
|
var es_array_reduce = __nested_webpack_require_123448__("13d5");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.entries.js
|
|
var es_object_entries = __nested_webpack_require_123448__("4fad");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.exec.js
|
|
var es_regexp_exec = __nested_webpack_require_123448__("ac1f");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.replace.js
|
|
var es_string_replace = __nested_webpack_require_123448__("5319");
|
|
|
|
// CONCATENATED MODULE: ./src/util/string.js
|
|
|
|
|
|
|
|
function cached(fn) {
|
|
var cache = Object.create(null);
|
|
return function cachedFn(str) {
|
|
var hit = cache[str];
|
|
return hit || (cache[str] = fn(str));
|
|
};
|
|
}
|
|
|
|
var regex = /-(\w)/g;
|
|
var camelize = cached(function (str) {
|
|
return str.replace(regex, function (_, c) {
|
|
return c.toUpperCase();
|
|
});
|
|
});
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.flat-map.js
|
|
var es_array_flat_map = __nested_webpack_require_123448__("5db7");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.unscopables.flat-map.js
|
|
var es_array_unscopables_flat_map = __nested_webpack_require_123448__("73d9");
|
|
|
|
// CONCATENATED MODULE: ./src/core/sortableEvents.js
|
|
|
|
|
|
|
|
|
|
var manageAndEmit = ["Start", "Add", "Remove", "Update", "End"];
|
|
var emit = ["Choose", "Unchoose", "Sort", "Filter", "Clone"];
|
|
var manage = ["Move"];
|
|
var eventHandlerNames = [manage, manageAndEmit, emit].flatMap(function (events) {
|
|
return events;
|
|
}).map(function (evt) {
|
|
return "on".concat(evt);
|
|
});
|
|
var events = {
|
|
manage: manage,
|
|
manageAndEmit: manageAndEmit,
|
|
emit: emit
|
|
};
|
|
|
|
function isReadOnly(eventName) {
|
|
return eventHandlerNames.indexOf(eventName) !== -1;
|
|
}
|
|
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.includes.js
|
|
var es_array_includes = __nested_webpack_require_123448__("caad");
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.starts-with.js
|
|
var es_string_starts_with = __nested_webpack_require_123448__("2ca0");
|
|
|
|
// CONCATENATED MODULE: ./src/util/tags.js
|
|
|
|
|
|
var tags = ["a", "abbr", "address", "area", "article", "aside", "audio", "b", "base", "bdi", "bdo", "blockquote", "body", "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "data", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "iframe", "img", "input", "ins", "kbd", "label", "legend", "li", "link", "main", "map", "mark", "math", "menu", "menuitem", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup", "option", "output", "p", "param", "picture", "pre", "progress", "q", "rb", "rp", "rt", "rtc", "ruby", "s", "samp", "script", "section", "select", "slot", "small", "source", "span", "strong", "style", "sub", "summary", "sup", "svg", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track", "u", "ul", "var", "video", "wbr"];
|
|
|
|
function isHtmlTag(name) {
|
|
return tags.includes(name);
|
|
}
|
|
|
|
function isTransition(name) {
|
|
return ["transition-group", "TransitionGroup"].includes(name);
|
|
}
|
|
|
|
function isHtmlAttribute(value) {
|
|
return ["id", "class"].includes(value) || value.startsWith("data-");
|
|
}
|
|
|
|
|
|
// CONCATENATED MODULE: ./src/core/componentBuilderHelper.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function project(entries) {
|
|
return entries.reduce(function (res, _ref) {
|
|
var _ref2 = _slicedToArray(_ref, 2),
|
|
key = _ref2[0],
|
|
value = _ref2[1];
|
|
|
|
res[key] = value;
|
|
return res;
|
|
}, {});
|
|
}
|
|
|
|
function getComponentAttributes(_ref3) {
|
|
var $attrs = _ref3.$attrs,
|
|
_ref3$componentData = _ref3.componentData,
|
|
componentData = _ref3$componentData === void 0 ? {} : _ref3$componentData;
|
|
var attributes = project(Object.entries($attrs).filter(function (_ref4) {
|
|
var _ref5 = _slicedToArray(_ref4, 2),
|
|
key = _ref5[0],
|
|
_ = _ref5[1];
|
|
|
|
return isHtmlAttribute(key);
|
|
}));
|
|
return _objectSpread2(_objectSpread2({}, attributes), componentData);
|
|
}
|
|
|
|
function createSortableOption(_ref6) {
|
|
var $attrs = _ref6.$attrs,
|
|
callBackBuilder = _ref6.callBackBuilder;
|
|
var options = project(getValidSortableEntries($attrs));
|
|
Object.entries(callBackBuilder).forEach(function (_ref7) {
|
|
var _ref8 = _slicedToArray(_ref7, 2),
|
|
eventType = _ref8[0],
|
|
eventBuilder = _ref8[1];
|
|
|
|
events[eventType].forEach(function (event) {
|
|
options["on".concat(event)] = eventBuilder(event);
|
|
});
|
|
});
|
|
var draggable = "[data-draggable]".concat(options.draggable || "");
|
|
return _objectSpread2(_objectSpread2({}, options), {}, {
|
|
draggable: draggable
|
|
});
|
|
}
|
|
|
|
function getValidSortableEntries(value) {
|
|
return Object.entries(value).filter(function (_ref9) {
|
|
var _ref10 = _slicedToArray(_ref9, 2),
|
|
key = _ref10[0],
|
|
_ = _ref10[1];
|
|
|
|
return !isHtmlAttribute(key);
|
|
}).map(function (_ref11) {
|
|
var _ref12 = _slicedToArray(_ref11, 2),
|
|
key = _ref12[0],
|
|
value = _ref12[1];
|
|
|
|
return [camelize(key), value];
|
|
}).filter(function (_ref13) {
|
|
var _ref14 = _slicedToArray(_ref13, 2),
|
|
key = _ref14[0],
|
|
_ = _ref14[1];
|
|
|
|
return !isReadOnly(key);
|
|
});
|
|
}
|
|
|
|
|
|
// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.find-index.js
|
|
var es_array_find_index = __nested_webpack_require_123448__("c740");
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js
|
|
function _defineProperties(target, props) {
|
|
for (var i = 0; i < props.length; i++) {
|
|
var descriptor = props[i];
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
descriptor.configurable = true;
|
|
if ("value" in descriptor) descriptor.writable = true;
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
}
|
|
}
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
return Constructor;
|
|
}
|
|
// CONCATENATED MODULE: ./src/core/componentStructure.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var getHtmlElementFromNode = function getHtmlElementFromNode(_ref) {
|
|
var el = _ref.el;
|
|
return el;
|
|
};
|
|
|
|
var addContext = function addContext(domElement, context) {
|
|
return domElement.__draggable_context = context;
|
|
};
|
|
|
|
var getContext = function getContext(domElement) {
|
|
return domElement.__draggable_context;
|
|
};
|
|
|
|
var componentStructure_ComponentStructure = /*#__PURE__*/function () {
|
|
function ComponentStructure(_ref2) {
|
|
var _ref2$nodes = _ref2.nodes,
|
|
header = _ref2$nodes.header,
|
|
defaultNodes = _ref2$nodes.default,
|
|
footer = _ref2$nodes.footer,
|
|
root = _ref2.root,
|
|
realList = _ref2.realList;
|
|
|
|
_classCallCheck(this, ComponentStructure);
|
|
|
|
this.defaultNodes = defaultNodes;
|
|
this.children = [].concat(_toConsumableArray(header), _toConsumableArray(defaultNodes), _toConsumableArray(footer));
|
|
this.externalComponent = root.externalComponent;
|
|
this.rootTransition = root.transition;
|
|
this.tag = root.tag;
|
|
this.realList = realList;
|
|
}
|
|
|
|
_createClass(ComponentStructure, [{
|
|
key: "render",
|
|
value: function render(h, attributes) {
|
|
var tag = this.tag,
|
|
children = this.children,
|
|
_isRootComponent = this._isRootComponent;
|
|
var option = !_isRootComponent ? children : {
|
|
default: function _default() {
|
|
return children;
|
|
}
|
|
};
|
|
return h(tag, attributes, option);
|
|
}
|
|
}, {
|
|
key: "updated",
|
|
value: function updated() {
|
|
var defaultNodes = this.defaultNodes,
|
|
realList = this.realList;
|
|
defaultNodes.forEach(function (node, index) {
|
|
addContext(getHtmlElementFromNode(node), {
|
|
element: realList[index],
|
|
index: index
|
|
});
|
|
});
|
|
}
|
|
}, {
|
|
key: "getUnderlyingVm",
|
|
value: function getUnderlyingVm(domElement) {
|
|
return getContext(domElement);
|
|
}
|
|
}, {
|
|
key: "getVmIndexFromDomIndex",
|
|
value: function getVmIndexFromDomIndex(domIndex, element) {
|
|
var defaultNodes = this.defaultNodes;
|
|
var length = defaultNodes.length;
|
|
var domChildren = element.children;
|
|
var domElement = domChildren.item(domIndex);
|
|
|
|
if (domElement === null) {
|
|
return length;
|
|
}
|
|
|
|
var context = getContext(domElement);
|
|
|
|
if (context) {
|
|
return context.index;
|
|
}
|
|
|
|
if (length === 0) {
|
|
return 0;
|
|
}
|
|
|
|
var firstDomListElement = getHtmlElementFromNode(defaultNodes[0]);
|
|
|
|
var indexFirstDomListElement = _toConsumableArray(domChildren).findIndex(function (element) {
|
|
return element === firstDomListElement;
|
|
});
|
|
|
|
return domIndex < indexFirstDomListElement ? 0 : length;
|
|
}
|
|
}, {
|
|
key: "_isRootComponent",
|
|
get: function get() {
|
|
return this.externalComponent || this.rootTransition;
|
|
}
|
|
}]);
|
|
|
|
return ComponentStructure;
|
|
}();
|
|
|
|
|
|
// EXTERNAL MODULE: external {"commonjs":"vue","commonjs2":"vue","root":"Vue"}
|
|
var external_commonjs_vue_commonjs2_vue_root_Vue_ = __nested_webpack_require_123448__("8bbf");
|
|
|
|
// CONCATENATED MODULE: ./src/core/renderHelper.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getSlot(slots, key) {
|
|
var slotValue = slots[key];
|
|
return slotValue ? slotValue() : [];
|
|
}
|
|
|
|
function computeNodes(_ref) {
|
|
var $slots = _ref.$slots,
|
|
realList = _ref.realList,
|
|
getKey = _ref.getKey;
|
|
var normalizedList = realList || [];
|
|
|
|
var _map = ["header", "footer"].map(function (name) {
|
|
return getSlot($slots, name);
|
|
}),
|
|
_map2 = _slicedToArray(_map, 2),
|
|
header = _map2[0],
|
|
footer = _map2[1];
|
|
|
|
var item = $slots.item;
|
|
|
|
if (!item) {
|
|
throw new Error("draggable element must have an item slot");
|
|
}
|
|
|
|
var defaultNodes = normalizedList.flatMap(function (element, index) {
|
|
return item({
|
|
element: element,
|
|
index: index
|
|
}).map(function (node) {
|
|
node.key = getKey(element);
|
|
node.props = _objectSpread2(_objectSpread2({}, node.props || {}), {}, {
|
|
"data-draggable": true
|
|
});
|
|
return node;
|
|
});
|
|
});
|
|
|
|
if (defaultNodes.length !== normalizedList.length) {
|
|
throw new Error("Item slot must have only one child");
|
|
}
|
|
|
|
return {
|
|
header: header,
|
|
footer: footer,
|
|
default: defaultNodes
|
|
};
|
|
}
|
|
|
|
function getRootInformation(tag) {
|
|
var transition = isTransition(tag);
|
|
var externalComponent = !isHtmlTag(tag) && !transition;
|
|
return {
|
|
transition: transition,
|
|
externalComponent: externalComponent,
|
|
tag: externalComponent ? Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])(tag) : transition ? external_commonjs_vue_commonjs2_vue_root_Vue_["TransitionGroup"] : tag
|
|
};
|
|
}
|
|
|
|
function computeComponentStructure(_ref2) {
|
|
var $slots = _ref2.$slots,
|
|
tag = _ref2.tag,
|
|
realList = _ref2.realList,
|
|
getKey = _ref2.getKey;
|
|
var nodes = computeNodes({
|
|
$slots: $slots,
|
|
realList: realList,
|
|
getKey: getKey
|
|
});
|
|
var root = getRootInformation(tag);
|
|
return new componentStructure_ComponentStructure({
|
|
nodes: nodes,
|
|
root: root,
|
|
realList: realList
|
|
});
|
|
}
|
|
|
|
|
|
// CONCATENATED MODULE: ./src/vuedraggable.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function _emit(evtName, evtData) {
|
|
var _this = this;
|
|
|
|
Object(external_commonjs_vue_commonjs2_vue_root_Vue_["nextTick"])(function () {
|
|
return _this.$emit(evtName.toLowerCase(), evtData);
|
|
});
|
|
}
|
|
|
|
function _manage(evtName) {
|
|
var _this2 = this;
|
|
|
|
return function (evtData, originalElement) {
|
|
if (_this2.realList !== null) {
|
|
return _this2["onDrag".concat(evtName)](evtData, originalElement);
|
|
}
|
|
};
|
|
}
|
|
|
|
function _manageAndEmit(evtName) {
|
|
var _this3 = this;
|
|
|
|
var delegateCallBack = _manage.call(this, evtName);
|
|
|
|
return function (evtData, originalElement) {
|
|
delegateCallBack.call(_this3, evtData, originalElement);
|
|
|
|
_emit.call(_this3, evtName, evtData);
|
|
};
|
|
}
|
|
|
|
var draggingElement = null;
|
|
var props = {
|
|
list: {
|
|
type: Array,
|
|
required: false,
|
|
default: null
|
|
},
|
|
modelValue: {
|
|
type: Array,
|
|
required: false,
|
|
default: null
|
|
},
|
|
itemKey: {
|
|
type: [String, Function],
|
|
required: true
|
|
},
|
|
clone: {
|
|
type: Function,
|
|
default: function _default(original) {
|
|
return original;
|
|
}
|
|
},
|
|
tag: {
|
|
type: String,
|
|
default: "div"
|
|
},
|
|
move: {
|
|
type: Function,
|
|
default: null
|
|
},
|
|
componentData: {
|
|
type: Object,
|
|
required: false,
|
|
default: null
|
|
}
|
|
};
|
|
var emits = ["update:modelValue", "change"].concat(_toConsumableArray([].concat(_toConsumableArray(events.manageAndEmit), _toConsumableArray(events.emit)).map(function (evt) {
|
|
return evt.toLowerCase();
|
|
})));
|
|
var draggableComponent = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({
|
|
name: "draggable",
|
|
inheritAttrs: false,
|
|
props: props,
|
|
emits: emits,
|
|
data: function data() {
|
|
return {
|
|
error: false
|
|
};
|
|
},
|
|
render: function render() {
|
|
try {
|
|
this.error = false;
|
|
var $slots = this.$slots,
|
|
$attrs = this.$attrs,
|
|
tag = this.tag,
|
|
componentData = this.componentData,
|
|
realList = this.realList,
|
|
getKey = this.getKey;
|
|
var componentStructure = computeComponentStructure({
|
|
$slots: $slots,
|
|
tag: tag,
|
|
realList: realList,
|
|
getKey: getKey
|
|
});
|
|
this.componentStructure = componentStructure;
|
|
var attributes = getComponentAttributes({
|
|
$attrs: $attrs,
|
|
componentData: componentData
|
|
});
|
|
return componentStructure.render(external_commonjs_vue_commonjs2_vue_root_Vue_["h"], attributes);
|
|
} catch (err) {
|
|
this.error = true;
|
|
return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["h"])("pre", {
|
|
style: {
|
|
color: "red"
|
|
}
|
|
}, err.stack);
|
|
}
|
|
},
|
|
created: function created() {
|
|
if (this.list !== null && this.modelValue !== null) {
|
|
console["a" /* console */].error("modelValue and list props are mutually exclusive! Please set one or another.");
|
|
}
|
|
},
|
|
mounted: function mounted() {
|
|
var _this4 = this;
|
|
|
|
if (this.error) {
|
|
return;
|
|
}
|
|
|
|
var $attrs = this.$attrs,
|
|
$el = this.$el,
|
|
componentStructure = this.componentStructure;
|
|
componentStructure.updated();
|
|
var sortableOptions = createSortableOption({
|
|
$attrs: $attrs,
|
|
callBackBuilder: {
|
|
manageAndEmit: function manageAndEmit(event) {
|
|
return _manageAndEmit.call(_this4, event);
|
|
},
|
|
emit: function emit(event) {
|
|
return _emit.bind(_this4, event);
|
|
},
|
|
manage: function manage(event) {
|
|
return _manage.call(_this4, event);
|
|
}
|
|
}
|
|
});
|
|
var targetDomElement = $el.nodeType === 1 ? $el : $el.parentElement;
|
|
this._sortable = new external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_default.a(targetDomElement, sortableOptions);
|
|
this.targetDomElement = targetDomElement;
|
|
targetDomElement.__draggable_component__ = this;
|
|
},
|
|
updated: function updated() {
|
|
this.componentStructure.updated();
|
|
},
|
|
beforeUnmount: function beforeUnmount() {
|
|
if (this._sortable !== undefined) this._sortable.destroy();
|
|
},
|
|
computed: {
|
|
realList: function realList() {
|
|
var list = this.list;
|
|
return list ? list : this.modelValue;
|
|
},
|
|
getKey: function getKey() {
|
|
var itemKey = this.itemKey;
|
|
|
|
if (typeof itemKey === "function") {
|
|
return itemKey;
|
|
}
|
|
|
|
return function (element) {
|
|
return element[itemKey];
|
|
};
|
|
}
|
|
},
|
|
watch: {
|
|
$attrs: {
|
|
handler: function handler(newOptionValue) {
|
|
var _sortable = this._sortable;
|
|
getValidSortableEntries(newOptionValue).forEach(function (_ref) {
|
|
var _ref2 = _slicedToArray(_ref, 2),
|
|
key = _ref2[0],
|
|
value = _ref2[1];
|
|
|
|
_sortable.option(key, value);
|
|
});
|
|
},
|
|
deep: true
|
|
}
|
|
},
|
|
methods: {
|
|
getUnderlyingVm: function getUnderlyingVm(domElement) {
|
|
return this.componentStructure.getUnderlyingVm(domElement) || null;
|
|
},
|
|
getUnderlyingPotencialDraggableComponent: function getUnderlyingPotencialDraggableComponent(htmElement) {
|
|
//TODO check case where you need to see component children
|
|
return htmElement.__draggable_component__;
|
|
},
|
|
emitChanges: function emitChanges(evt) {
|
|
var _this5 = this;
|
|
|
|
Object(external_commonjs_vue_commonjs2_vue_root_Vue_["nextTick"])(function () {
|
|
return _this5.$emit("change", evt);
|
|
});
|
|
},
|
|
alterList: function alterList(onList) {
|
|
if (this.list) {
|
|
onList(this.list);
|
|
return;
|
|
}
|
|
|
|
var newList = _toConsumableArray(this.modelValue);
|
|
|
|
onList(newList);
|
|
this.$emit("update:modelValue", newList);
|
|
},
|
|
spliceList: function spliceList() {
|
|
var _arguments = arguments;
|
|
|
|
var spliceList = function spliceList(list) {
|
|
return list.splice.apply(list, _toConsumableArray(_arguments));
|
|
};
|
|
|
|
this.alterList(spliceList);
|
|
},
|
|
updatePosition: function updatePosition(oldIndex, newIndex) {
|
|
var updatePosition = function updatePosition(list) {
|
|
return list.splice(newIndex, 0, list.splice(oldIndex, 1)[0]);
|
|
};
|
|
|
|
this.alterList(updatePosition);
|
|
},
|
|
getRelatedContextFromMoveEvent: function getRelatedContextFromMoveEvent(_ref3) {
|
|
var to = _ref3.to,
|
|
related = _ref3.related;
|
|
var component = this.getUnderlyingPotencialDraggableComponent(to);
|
|
|
|
if (!component) {
|
|
return {
|
|
component: component
|
|
};
|
|
}
|
|
|
|
var list = component.realList;
|
|
var context = {
|
|
list: list,
|
|
component: component
|
|
};
|
|
|
|
if (to !== related && list) {
|
|
var destination = component.getUnderlyingVm(related) || {};
|
|
return _objectSpread2(_objectSpread2({}, destination), context);
|
|
}
|
|
|
|
return context;
|
|
},
|
|
getVmIndexFromDomIndex: function getVmIndexFromDomIndex(domIndex) {
|
|
return this.componentStructure.getVmIndexFromDomIndex(domIndex, this.targetDomElement);
|
|
},
|
|
onDragStart: function onDragStart(evt) {
|
|
this.context = this.getUnderlyingVm(evt.item);
|
|
evt.item._underlying_vm_ = this.clone(this.context.element);
|
|
draggingElement = evt.item;
|
|
},
|
|
onDragAdd: function onDragAdd(evt) {
|
|
var element = evt.item._underlying_vm_;
|
|
|
|
if (element === undefined) {
|
|
return;
|
|
}
|
|
|
|
removeNode(evt.item);
|
|
var newIndex = this.getVmIndexFromDomIndex(evt.newIndex);
|
|
this.spliceList(newIndex, 0, element);
|
|
var added = {
|
|
element: element,
|
|
newIndex: newIndex
|
|
};
|
|
this.emitChanges({
|
|
added: added
|
|
});
|
|
},
|
|
onDragRemove: function onDragRemove(evt) {
|
|
insertNodeAt(this.$el, evt.item, evt.oldIndex);
|
|
|
|
if (evt.pullMode === "clone") {
|
|
removeNode(evt.clone);
|
|
return;
|
|
}
|
|
|
|
var _this$context = this.context,
|
|
oldIndex = _this$context.index,
|
|
element = _this$context.element;
|
|
this.spliceList(oldIndex, 1);
|
|
var removed = {
|
|
element: element,
|
|
oldIndex: oldIndex
|
|
};
|
|
this.emitChanges({
|
|
removed: removed
|
|
});
|
|
},
|
|
onDragUpdate: function onDragUpdate(evt) {
|
|
removeNode(evt.item);
|
|
insertNodeAt(evt.from, evt.item, evt.oldIndex);
|
|
var oldIndex = this.context.index;
|
|
var newIndex = this.getVmIndexFromDomIndex(evt.newIndex);
|
|
this.updatePosition(oldIndex, newIndex);
|
|
var moved = {
|
|
element: this.context.element,
|
|
oldIndex: oldIndex,
|
|
newIndex: newIndex
|
|
};
|
|
this.emitChanges({
|
|
moved: moved
|
|
});
|
|
},
|
|
computeFutureIndex: function computeFutureIndex(relatedContext, evt) {
|
|
if (!relatedContext.element) {
|
|
return 0;
|
|
}
|
|
|
|
var domChildren = _toConsumableArray(evt.to.children).filter(function (el) {
|
|
return el.style["display"] !== "none";
|
|
});
|
|
|
|
var currentDomIndex = domChildren.indexOf(evt.related);
|
|
var currentIndex = relatedContext.component.getVmIndexFromDomIndex(currentDomIndex);
|
|
var draggedInList = domChildren.indexOf(draggingElement) !== -1;
|
|
return draggedInList || !evt.willInsertAfter ? currentIndex : currentIndex + 1;
|
|
},
|
|
onDragMove: function onDragMove(evt, originalEvent) {
|
|
var move = this.move,
|
|
realList = this.realList;
|
|
|
|
if (!move || !realList) {
|
|
return true;
|
|
}
|
|
|
|
var relatedContext = this.getRelatedContextFromMoveEvent(evt);
|
|
var futureIndex = this.computeFutureIndex(relatedContext, evt);
|
|
|
|
var draggedContext = _objectSpread2(_objectSpread2({}, this.context), {}, {
|
|
futureIndex: futureIndex
|
|
});
|
|
|
|
var sendEvent = _objectSpread2(_objectSpread2({}, evt), {}, {
|
|
relatedContext: relatedContext,
|
|
draggedContext: draggedContext
|
|
});
|
|
|
|
return move(sendEvent, originalEvent);
|
|
},
|
|
onDragEnd: function onDragEnd() {
|
|
draggingElement = null;
|
|
}
|
|
}
|
|
});
|
|
/* harmony default export */ var vuedraggable = (draggableComponent);
|
|
// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js
|
|
|
|
|
|
/* harmony default export */ var entry_lib = __webpack_exports__["default"] = (vuedraggable);
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fb6a":
|
|
/***/ (function(module, exports, __nested_webpack_require_154056__) {
|
|
|
|
"use strict";
|
|
|
|
var $ = __nested_webpack_require_154056__("23e7");
|
|
var isObject = __nested_webpack_require_154056__("861d");
|
|
var isArray = __nested_webpack_require_154056__("e8b5");
|
|
var toAbsoluteIndex = __nested_webpack_require_154056__("23cb");
|
|
var toLength = __nested_webpack_require_154056__("50c4");
|
|
var toIndexedObject = __nested_webpack_require_154056__("fc6a");
|
|
var createProperty = __nested_webpack_require_154056__("8418");
|
|
var wellKnownSymbol = __nested_webpack_require_154056__("b622");
|
|
var arrayMethodHasSpeciesSupport = __nested_webpack_require_154056__("1dde");
|
|
var arrayMethodUsesToLength = __nested_webpack_require_154056__("ae40");
|
|
|
|
var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
|
|
var USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });
|
|
|
|
var SPECIES = wellKnownSymbol('species');
|
|
var nativeSlice = [].slice;
|
|
var max = Math.max;
|
|
|
|
// `Array.prototype.slice` method
|
|
// https://tc39.github.io/ecma262/#sec-array.prototype.slice
|
|
// fallback for not array-like ES3 strings and DOM objects
|
|
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
|
|
slice: function slice(start, end) {
|
|
var O = toIndexedObject(this);
|
|
var length = toLength(O.length);
|
|
var k = toAbsoluteIndex(start, length);
|
|
var fin = toAbsoluteIndex(end === undefined ? length : end, length);
|
|
// inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
|
|
var Constructor, result, n;
|
|
if (isArray(O)) {
|
|
Constructor = O.constructor;
|
|
// cross-realm fallback
|
|
if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {
|
|
Constructor = undefined;
|
|
} else if (isObject(Constructor)) {
|
|
Constructor = Constructor[SPECIES];
|
|
if (Constructor === null) Constructor = undefined;
|
|
}
|
|
if (Constructor === Array || Constructor === undefined) {
|
|
return nativeSlice.call(O, k, fin);
|
|
}
|
|
}
|
|
result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
|
|
for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
|
|
result.length = n;
|
|
return result;
|
|
}
|
|
});
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fc6a":
|
|
/***/ (function(module, exports, __nested_webpack_require_156198__) {
|
|
|
|
// toObject with fallback for non-array-like ES3 strings
|
|
var IndexedObject = __nested_webpack_require_156198__("44ad");
|
|
var requireObjectCoercible = __nested_webpack_require_156198__("1d80");
|
|
|
|
module.exports = function (it) {
|
|
return IndexedObject(requireObjectCoercible(it));
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fdbc":
|
|
/***/ (function(module, exports) {
|
|
|
|
// iterable DOM collections
|
|
// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
|
|
module.exports = {
|
|
CSSRuleList: 0,
|
|
CSSStyleDeclaration: 0,
|
|
CSSValueList: 0,
|
|
ClientRectList: 0,
|
|
DOMRectList: 0,
|
|
DOMStringList: 0,
|
|
DOMTokenList: 1,
|
|
DataTransferItemList: 0,
|
|
FileList: 0,
|
|
HTMLAllCollection: 0,
|
|
HTMLCollection: 0,
|
|
HTMLFormElement: 0,
|
|
HTMLSelectElement: 0,
|
|
MediaList: 0,
|
|
MimeTypeArray: 0,
|
|
NamedNodeMap: 0,
|
|
NodeList: 1,
|
|
PaintRequestList: 0,
|
|
Plugin: 0,
|
|
PluginArray: 0,
|
|
SVGLengthList: 0,
|
|
SVGNumberList: 0,
|
|
SVGPathSegList: 0,
|
|
SVGPointList: 0,
|
|
SVGStringList: 0,
|
|
SVGTransformList: 0,
|
|
SourceBufferList: 0,
|
|
StyleSheetList: 0,
|
|
TextTrackCueList: 0,
|
|
TextTrackList: 0,
|
|
TouchList: 0
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fdbf":
|
|
/***/ (function(module, exports, __nested_webpack_require_157351__) {
|
|
|
|
var NATIVE_SYMBOL = __nested_webpack_require_157351__("4930");
|
|
|
|
module.exports = NATIVE_SYMBOL
|
|
// eslint-disable-next-line no-undef
|
|
&& !Symbol.sham
|
|
// eslint-disable-next-line no-undef
|
|
&& typeof Symbol.iterator == 'symbol';
|
|
|
|
|
|
/***/ })
|
|
|
|
/******/ })["default"];
|
|
});
|
|
//# sourceMappingURL=vuedraggable.umd.js.map
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
/************************************************************************/
|
|
/******/ // The module cache
|
|
/******/ var __webpack_module_cache__ = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/ // Check if module is in cache
|
|
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
/******/ if (cachedModule !== undefined) {
|
|
/******/ return cachedModule.exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
/******/ id: moduleId,
|
|
/******/ loaded: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.loaded = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/************************************************************************/
|
|
/******/ /* webpack/runtime/compat get default export */
|
|
/******/ (() => {
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = (module) => {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ () => (module['default']) :
|
|
/******/ () => (module);
|
|
/******/ __webpack_require__.d(getter, { a: getter });
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/ })();
|
|
/******/
|
|
/******/ /* webpack/runtime/define property getters */
|
|
/******/ (() => {
|
|
/******/ // define getter functions for harmony exports
|
|
/******/ __webpack_require__.d = (exports, definition) => {
|
|
/******/ for(var key in definition) {
|
|
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
/******/ }
|
|
/******/ }
|
|
/******/ };
|
|
/******/ })();
|
|
/******/
|
|
/******/ /* webpack/runtime/global */
|
|
/******/ (() => {
|
|
/******/ __webpack_require__.g = (function() {
|
|
/******/ if (typeof globalThis === 'object') return globalThis;
|
|
/******/ try {
|
|
/******/ return this || new Function('return this')();
|
|
/******/ } catch (e) {
|
|
/******/ if (typeof window === 'object') return window;
|
|
/******/ }
|
|
/******/ })();
|
|
/******/ })();
|
|
/******/
|
|
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
/******/ (() => {
|
|
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
/******/ })();
|
|
/******/
|
|
/******/ /* webpack/runtime/make namespace object */
|
|
/******/ (() => {
|
|
/******/ // define __esModule on exports
|
|
/******/ __webpack_require__.r = (exports) => {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/ })();
|
|
/******/
|
|
/******/ /* webpack/runtime/node module decorator */
|
|
/******/ (() => {
|
|
/******/ __webpack_require__.nmd = (module) => {
|
|
/******/ module.paths = [];
|
|
/******/ if (!module.children) module.children = [];
|
|
/******/ return module;
|
|
/******/ };
|
|
/******/ })();
|
|
/******/
|
|
/************************************************************************/
|
|
var __webpack_exports__ = {};
|
|
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
|
|
(() => {
|
|
"use strict";
|
|
/*!*****************************!*\
|
|
!*** ./resources/js/app.js ***!
|
|
\*****************************/
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vuedraggable */ "./node_modules/vuedraggable/dist/vuedraggable.umd.js");
|
|
/* harmony import */ var vuedraggable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vuedraggable__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var vue2_datepicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue2-datepicker */ "./node_modules/vue2-datepicker/index.esm.js");
|
|
/* harmony import */ var vue2_datepicker_index_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue2-datepicker/index.css */ "./node_modules/vue2-datepicker/index.css");
|
|
/* harmony import */ var _components_gdooFrameHeader_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/gdooFrameHeader.vue */ "./resources/js/components/gdooFrameHeader.vue");
|
|
/* harmony import */ var _components_gdooFormDesigner_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/gdooFormDesigner.vue */ "./resources/js/components/gdooFormDesigner.vue");
|
|
/* harmony import */ var _components_gdooGridHeader_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/gdooGridHeader.vue */ "./resources/js/components/gdooGridHeader.vue");
|
|
__webpack_require__(/*! ./bootstrap */ "./resources/js/bootstrap.js");
|
|
|
|
var Vue = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
|
|
|
|
window.Vue = Vue; // 第三方全局模块
|
|
|
|
|
|
(vuedraggable__WEBPACK_IMPORTED_MODULE_0___default().name) = 'gdoo-draggable';
|
|
window.gdooDraggable = (vuedraggable__WEBPACK_IMPORTED_MODULE_0___default());
|
|
|
|
// 自定义全局模块
|
|
|
|
|
|
|
|
|
|
window.gdooFrameHeader = _components_gdooFrameHeader_vue__WEBPACK_IMPORTED_MODULE_3__.default;
|
|
window.gdooFormDesigner = _components_gdooFormDesigner_vue__WEBPACK_IMPORTED_MODULE_4__.default;
|
|
window.gdooGridHeader = _components_gdooGridHeader_vue__WEBPACK_IMPORTED_MODULE_5__.default;
|
|
})();
|
|
|
|
/******/ })()
|
|
; |