/src/sql/workbench/api/common/extHostRequireInterceptor.ts

https://github.com/Microsoft/sqlopsstudio · TypeScript · 50 lines · 37 code · 7 blank · 6 comment · 4 complexity · 998da81f9fa053608bb0bb1319ca4b76 MD5 · raw file

  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the Source EULA. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { TernarySearchTree } from 'vs/base/common/map';
  6. import { URI } from 'vs/base/common/uri';
  7. import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
  8. import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
  9. import * as azdata from 'azdata';
  10. import { IAzdataExtensionApiFactory } from 'sql/workbench/api/common/sqlExtHost.api.impl';
  11. import { INodeModuleFactory } from 'vs/workbench/api/common/extHostRequireInterceptor';
  12. import { ILogService } from 'vs/platform/log/common/log';
  13. export class AzdataNodeModuleFactory implements INodeModuleFactory {
  14. public readonly nodeModuleName = 'azdata';
  15. private readonly _extApiImpl = new Map<string, typeof azdata>();
  16. private _defaultApiImpl: typeof azdata;
  17. constructor(
  18. private readonly _apiFactory: IAzdataExtensionApiFactory,
  19. private readonly _extensionPaths: TernarySearchTree<string, IExtensionDescription>,
  20. private readonly _logService: ILogService
  21. ) {
  22. }
  23. public load(request: string, parent: URI): any {
  24. // get extension id from filename and api for extension
  25. const ext = this._extensionPaths.findSubstr(parent.fsPath);
  26. if (ext) {
  27. let apiImpl = this._extApiImpl.get(ExtensionIdentifier.toKey(ext.identifier));
  28. if (!apiImpl) {
  29. apiImpl = this._apiFactory(ext);
  30. this._extApiImpl.set(ExtensionIdentifier.toKey(ext.identifier), apiImpl);
  31. }
  32. return apiImpl;
  33. }
  34. // fall back to a default implementation
  35. if (!this._defaultApiImpl) {
  36. let extensionPathsPretty = '';
  37. this._extensionPaths.forEach((value, index) => extensionPathsPretty += `\t${index} -> ${value.identifier.value}\n`);
  38. this._logService.warn(`Could not identify extension for 'azdata' require call from ${parent.fsPath}. These are the extension path mappings: \n${extensionPathsPretty}`);
  39. this._defaultApiImpl = this._apiFactory(nullExtensionDescription);
  40. }
  41. return this._defaultApiImpl;
  42. }
  43. }