diff options
Diffstat (limited to 'portal-FE-common/src/app/shared/plugin/plugin-loader')
3 files changed, 188 insertions, 0 deletions
diff --git a/portal-FE-common/src/app/shared/plugin/plugin-loader/client-plugin-loader.service.ts b/portal-FE-common/src/app/shared/plugin/plugin-loader/client-plugin-loader.service.ts new file mode 100644 index 00000000..2666a523 --- /dev/null +++ b/portal-FE-common/src/app/shared/plugin/plugin-loader/client-plugin-loader.service.ts @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START========================================== + * ONAP Portal + * =================================================================== + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * + * Unless otherwise specified, all software contained herein is licensed + * under the Apache License, Version 2.0 (the "License"); + * you may not use this software 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. + * + * Unless otherwise specified, all documentation contained herein is licensed + * under the Creative Commons License, Attribution 4.0 Intl. (the "License"); + * you may not use this documentation except in compliance with the License. + * You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation + * 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. + * + * ============LICENSE_END============================================ + * + * + */ + +import { Injectable, NgModuleFactory } from '@angular/core'; +import { PluginLoaderService } from './plugin-loader.service'; +import { PLUGIN_EXTERNALS_MAP } from './plugin-externals'; +import { PluginsConfigProvider } from '../plugins-config.provider'; + +const SystemJs = window.System; + +@Injectable({ + providedIn: 'root', +}) +export class ClientPluginLoaderService extends PluginLoaderService { + constructor(private configProvider: PluginsConfigProvider) { + super(); + configProvider.loadConfig() + .toPromise() + .then(config => { + configProvider.config = config; + console.log(config); + }); + } + + provideExternals() { + Object.keys(PLUGIN_EXTERNALS_MAP).forEach(externalKey => + window.define(externalKey, [], () => PLUGIN_EXTERNALS_MAP[externalKey]) + ); + } + + load<T>(pluginName): Promise<NgModuleFactory<T>> { + + const { config } = this.configProvider; + if (!config[pluginName]) { + throw Error(`Can't find appropriate plugin`); + } + + const depsPromises = (config[pluginName].deps || []).map(dep => { + return SystemJs.import(window['base'] + config[dep].path).then(m => { + window['define'](dep, [], () => m.default); + }); + }); + + return Promise.all(depsPromises).then(() => { + + return SystemJs.import(window['base'] + config[pluginName].path).then( + module => module.default.default + ); + }); + } +} diff --git a/portal-FE-common/src/app/shared/plugin/plugin-loader/plugin-externals.ts b/portal-FE-common/src/app/shared/plugin/plugin-loader/plugin-externals.ts new file mode 100644 index 00000000..3bd5a133 --- /dev/null +++ b/portal-FE-common/src/app/shared/plugin/plugin-loader/plugin-externals.ts @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START========================================== + * ONAP Portal + * =================================================================== + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * + * Unless otherwise specified, all software contained herein is licensed + * under the Apache License, Version 2.0 (the "License"); + * you may not use this software 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. + * + * Unless otherwise specified, all documentation contained herein is licensed + * under the Creative Commons License, Attribution 4.0 Intl. (the "License"); + * you may not use this documentation except in compliance with the License. + * You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation + * 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. + * + * ============LICENSE_END============================================ + * + * + */ + +import * as core from '@angular/core'; +import * as common from '@angular/common'; +import * as forms from '@angular/forms'; +import * as router from '@angular/router'; +import * as rxjs from 'rxjs'; +import * as tslib from 'tslib'; + +export const PLUGIN_EXTERNALS_MAP = { + 'ng.core': core, + 'ng.common': common, + 'ng.forms': forms, + 'ng.router': router, + rxjs, + tslib +}; diff --git a/portal-FE-common/src/app/shared/plugin/plugin-loader/plugin-loader.service.ts b/portal-FE-common/src/app/shared/plugin/plugin-loader/plugin-loader.service.ts new file mode 100644 index 00000000..1d79b65f --- /dev/null +++ b/portal-FE-common/src/app/shared/plugin/plugin-loader/plugin-loader.service.ts @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START========================================== + * ONAP Portal + * =================================================================== + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * + * Unless otherwise specified, all software contained herein is licensed + * under the Apache License, Version 2.0 (the "License"); + * you may not use this software 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. + * + * Unless otherwise specified, all documentation contained herein is licensed + * under the Creative Commons License, Attribution 4.0 Intl. (the "License"); + * you may not use this documentation except in compliance with the License. + * You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation + * 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. + * + * ============LICENSE_END============================================ + * + * + */ + +import { NgModuleFactory } from '@angular/core'; + +export abstract class PluginLoaderService { + protected constructor() { + this.provideExternals(); + } + + abstract provideExternals(): void; + + abstract load<T>(pluginName): Promise<NgModuleFactory<T>>; +} |