/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import GlobalModel from './Global'; import { ComponentOption, ComponentMainType } from '../util/types'; import { createHashMap, assert } from 'zrender/src/core/util'; import { isComponentIdInternal } from '../util/model'; // PNEDING: // (1) Only Internal usage at present, do not export to uses. // (2) "Internal components" are generated internally during the `Global.ts#_mergeOption`. // It is added since echarts 3. // (3) Why keep supporting "internal component" in global model rather than // make each type components manage their models themselves? // Because a potential feature that reproduces a chart from a different chart instance // might be useful in some BI analysis scenario, where the entire state needs to be // retrieved from the current chart instance. So we'd better manage all of the // state universally. // (4) Internal component always merged in "replaceMerge" approach, that is, if the existing // internal components does not matched by a new option with the same id, it will be // removed. // (5) In `InternalOptionCreator`, only the previous component models (dependencies) can be read. interface InternalOptionCreator { (ecModel: GlobalModel): ComponentOption[] } const internalOptionCreatorMap = createHashMap(); export function registerInternalOptionCreator( mainType: ComponentMainType, creator: InternalOptionCreator ) { assert(internalOptionCreatorMap.get(mainType) == null && creator); internalOptionCreatorMap.set(mainType, creator); } export function concatInternalOptions( ecModel: GlobalModel, mainType: ComponentMainType, newCmptOptionList: ComponentOption[] ): ComponentOption[] { const internalOptionCreator = internalOptionCreatorMap.get(mainType); if (!internalOptionCreator) { return newCmptOptionList; } const internalOptions = internalOptionCreator(ecModel); if (!internalOptions) { return newCmptOptionList; } if (__DEV__) { for (let i = 0; i < internalOptions.length; i++) { assert(isComponentIdInternal(internalOptions[i])); } } return newCmptOptionList.concat(internalOptions); }