/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as extHostApi from 'vs/workbench/api/node/extHost.api.impl'; import { IInitData, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { URI } from 'vs/base/common/uri'; import * as azdata from 'azdata'; import * as sqlops from 'sqlops'; import * as vscode from 'vscode'; import { SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { ExtHostAccountManagement } from 'sql/workbench/api/node/extHostAccountManagement'; import { ExtHostCredentialManagement } from 'sql/workbench/api/node/extHostCredentialManagement'; import { ExtHostDataProtocol } from 'sql/workbench/api/node/extHostDataProtocol'; import { ExtHostSerializationProvider } from 'sql/workbench/api/node/extHostSerializationProvider'; import { ExtHostResourceProvider } from 'sql/workbench/api/node/extHostResourceProvider'; import * as sqlExtHostTypes from 'sql/workbench/api/common/sqlExtHostTypes'; import { ExtHostModalDialogs } from 'sql/workbench/api/node/extHostModalDialog'; import { ExtHostTasks } from 'sql/workbench/api/node/extHostTasks'; import { ExtHostDashboardWebviews } from 'sql/workbench/api/node/extHostDashboardWebview'; import { ExtHostModelView } from 'sql/workbench/api/node/extHostModelView'; import { ExtHostConnectionManagement } from 'sql/workbench/api/node/extHostConnectionManagement'; import { ExtHostDashboard } from 'sql/workbench/api/node/extHostDashboard'; import { ExtHostObjectExplorer } from 'sql/workbench/api/node/extHostObjectExplorer'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; import { ExtHostModelViewDialog } from 'sql/workbench/api/node/extHostModelViewDialog'; import { ExtHostModelViewTreeViews } from 'sql/workbench/api/node/extHostModelViewTree'; import { ExtHostQueryEditor } from 'sql/workbench/api/node/extHostQueryEditor'; import { ExtHostBackgroundTaskManagement } from './extHostBackgroundTaskManagement'; import { ExtHostNotebook } from 'sql/workbench/api/node/extHostNotebook'; import { ExtHostNotebookDocumentsAndEditors } from 'sql/workbench/api/node/extHostNotebookDocumentsAndEditors'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { ExtHostExtensionManagement } from 'sql/workbench/api/node/extHostExtensionManagement'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { TernarySearchTree } from 'vs/base/common/map'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { AzureResource } from 'sql/platform/accounts/common/interfaces'; import { mssqlProviderName } from 'sql/platform/connection/common/constants'; export interface ISqlExtensionApiFactory { vsCodeFactory(extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; sqlopsFactory(extension: IExtensionDescription): typeof sqlops; azdataFactory(extension: IExtensionDescription): typeof azdata; } /** * This method instantiates and returns the extension API surface */ export function createApiFactory( initData: IInitData, rpcProtocol: IMainContext, extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, extensionService: ExtHostExtensionService, logService: ExtHostLogService, extHostStorage: ExtHostStorage, schemeTransformer: ISchemeTransformer | null, outputChannelName: string ): ISqlExtensionApiFactory { let vsCodeFactory = extHostApi.createApiFactory(initData, rpcProtocol, extHostWorkspace, extHostConfiguration, extensionService, logService, extHostStorage, schemeTransformer, outputChannelName); // Addressable instances const extHostAccountManagement = rpcProtocol.set(SqlExtHostContext.ExtHostAccountManagement, new ExtHostAccountManagement(rpcProtocol)); const extHostConnectionManagement = rpcProtocol.set(SqlExtHostContext.ExtHostConnectionManagement, new ExtHostConnectionManagement(rpcProtocol)); const extHostCredentialManagement = rpcProtocol.set(SqlExtHostContext.ExtHostCredentialManagement, new ExtHostCredentialManagement(rpcProtocol)); const extHostDataProvider = rpcProtocol.set(SqlExtHostContext.ExtHostDataProtocol, new ExtHostDataProtocol(rpcProtocol)); const extHostObjectExplorer = rpcProtocol.set(SqlExtHostContext.ExtHostObjectExplorer, new ExtHostObjectExplorer(rpcProtocol)); const extHostSerializationProvider = rpcProtocol.set(SqlExtHostContext.ExtHostSerializationProvider, new ExtHostSerializationProvider(rpcProtocol)); const extHostResourceProvider = rpcProtocol.set(SqlExtHostContext.ExtHostResourceProvider, new ExtHostResourceProvider(rpcProtocol)); const extHostModalDialogs = rpcProtocol.set(SqlExtHostContext.ExtHostModalDialogs, new ExtHostModalDialogs(rpcProtocol)); const extHostTasks = rpcProtocol.set(SqlExtHostContext.ExtHostTasks, new ExtHostTasks(rpcProtocol, logService)); const extHostBackgroundTaskManagement = rpcProtocol.set(SqlExtHostContext.ExtHostBackgroundTaskManagement, new ExtHostBackgroundTaskManagement(rpcProtocol)); const extHostWebviewWidgets = rpcProtocol.set(SqlExtHostContext.ExtHostDashboardWebviews, new ExtHostDashboardWebviews(rpcProtocol)); const extHostModelViewTree = rpcProtocol.set(SqlExtHostContext.ExtHostModelViewTreeViews, new ExtHostModelViewTreeViews(rpcProtocol)); const extHostModelView = rpcProtocol.set(SqlExtHostContext.ExtHostModelView, new ExtHostModelView(rpcProtocol, extHostModelViewTree)); const extHostDashboard = rpcProtocol.set(SqlExtHostContext.ExtHostDashboard, new ExtHostDashboard(rpcProtocol)); const extHostModelViewDialog = rpcProtocol.set(SqlExtHostContext.ExtHostModelViewDialog, new ExtHostModelViewDialog(rpcProtocol, extHostModelView, extHostBackgroundTaskManagement)); const extHostQueryEditor = rpcProtocol.set(SqlExtHostContext.ExtHostQueryEditor, new ExtHostQueryEditor(rpcProtocol)); const extHostNotebook = rpcProtocol.set(SqlExtHostContext.ExtHostNotebook, new ExtHostNotebook(rpcProtocol)); const extHostNotebookDocumentsAndEditors = rpcProtocol.set(SqlExtHostContext.ExtHostNotebookDocumentsAndEditors, new ExtHostNotebookDocumentsAndEditors(rpcProtocol)); const extHostExtensionManagement = rpcProtocol.set(SqlExtHostContext.ExtHostExtensionManagement, new ExtHostExtensionManagement(rpcProtocol)); return { vsCodeFactory: vsCodeFactory, azdataFactory: function (extension: IExtensionDescription): typeof azdata { // namespace: connection const connection: typeof azdata.connection = { // "azdata" API definition ConnectionProfile: sqlExtHostTypes.ConnectionProfile, getCurrentConnection(): Thenable { return extHostConnectionManagement.$getCurrentConnection(); }, // "sqlops" back-compat APIs getActiveConnections(): Thenable { return extHostConnectionManagement.$getActiveConnections(); }, getCredentials(connectionId: string): Thenable<{ [name: string]: string }> { return extHostConnectionManagement.$getCredentials(connectionId); }, getServerInfo(connectionId: string): Thenable { return extHostConnectionManagement.$getServerInfo(connectionId); }, openConnectionDialog(providers?: string[], initialConnectionProfile?: azdata.IConnectionProfile, connectionCompletionOptions?: azdata.IConnectionCompletionOptions): Thenable { return extHostConnectionManagement.$openConnectionDialog(providers, initialConnectionProfile, connectionCompletionOptions); }, listDatabases(connectionId: string): Thenable { return extHostConnectionManagement.$listDatabases(connectionId); }, getConnectionString(connectionId: string, includePassword: boolean): Thenable { return extHostConnectionManagement.$getConnectionString(connectionId, includePassword); }, getUriForConnection(connectionId: string): Thenable { return extHostConnectionManagement.$getUriForConnection(connectionId); }, connect(connectionProfile: azdata.IConnectionProfile, saveConnection: boolean, showDashboard: boolean): Thenable { return extHostConnectionManagement.$connect(connectionProfile, saveConnection, showDashboard); } }; // Backcompat "sqlops" APIs // namespace: accounts const accounts: typeof azdata.accounts = { registerAccountProvider(providerMetadata: azdata.AccountProviderMetadata, provider: azdata.AccountProvider): vscode.Disposable { return extHostAccountManagement.$registerAccountProvider(providerMetadata, provider); }, beginAutoOAuthDeviceCode(providerId: string, title: string, message: string, userCode: string, uri: string): Thenable { return extHostAccountManagement.$beginAutoOAuthDeviceCode(providerId, title, message, userCode, uri); }, endAutoOAuthDeviceCode(): void { return extHostAccountManagement.$endAutoOAuthDeviceCode(); }, accountUpdated(updatedAccount: azdata.Account): void { return extHostAccountManagement.$accountUpdated(updatedAccount); }, getAllAccounts(): Thenable { return extHostAccountManagement.$getAllAccounts(); }, getSecurityToken(account: azdata.Account, resource?: azdata.AzureResource): Thenable<{}> { return extHostAccountManagement.$getSecurityToken(account, resource); }, onDidChangeAccounts(listener: (e: azdata.DidChangeAccountsParams) => void, thisArgs?: any, disposables?: extHostTypes.Disposable[]) { return extHostAccountManagement.onDidChangeAccounts(listener, thisArgs, disposables); } }; // namespace: credentials const credentials: typeof azdata.credentials = { registerProvider(provider: azdata.CredentialProvider): vscode.Disposable { return extHostCredentialManagement.$registerCredentialProvider(provider); }, getProvider(namespaceId: string): Thenable { return extHostCredentialManagement.$getCredentialProvider(namespaceId); } }; // namespace: objectexplorer const objectExplorer: typeof azdata.objectexplorer = { getNode(connectionId: string, nodePath?: string): Thenable { return extHostObjectExplorer.$getNode(connectionId, nodePath); }, getActiveConnectionNodes(): Thenable { return extHostObjectExplorer.$getActiveConnectionNodes(); }, findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames: string[]): Thenable { return extHostObjectExplorer.$findNodes(connectionId, type, schema, name, database, parentObjectNames); }, getNodeActions(connectionId: string, nodePath: string): Thenable { return extHostObjectExplorer.$getNodeActions(connectionId, nodePath); }, getSessionConnectionProfile(sessionId: string): Thenable { return extHostObjectExplorer.$getSessionConnectionProfile(sessionId); } }; // namespace: serialization const serialization: typeof azdata.serialization = { registerProvider(provider: azdata.SerializationProvider): vscode.Disposable { return extHostSerializationProvider.$registerSerializationProvider(provider); }, }; // namespace: serialization const resources: typeof azdata.resources = { registerResourceProvider(providerMetadata: azdata.ResourceProviderMetadata, provider: azdata.ResourceProvider): vscode.Disposable { return extHostResourceProvider.$registerResourceProvider(providerMetadata, provider); } }; let registerConnectionProvider = (provider: azdata.ConnectionProvider): vscode.Disposable => { // Connection callbacks provider.registerOnConnectionComplete((connSummary: azdata.ConnectionInfoSummary) => { extHostDataProvider.$onConnectComplete(provider.handle, connSummary); }); provider.registerOnIntelliSenseCacheComplete((connectionUri: string) => { extHostDataProvider.$onIntelliSenseCacheComplete(provider.handle, connectionUri); }); provider.registerOnConnectionChanged((changedConnInfo: azdata.ChangedConnectionInfo) => { extHostDataProvider.$onConnectionChanged(provider.handle, changedConnInfo); }); return extHostDataProvider.$registerConnectionProvider(provider); }; let registerQueryProvider = (provider: azdata.QueryProvider): vscode.Disposable => { provider.registerOnQueryComplete((result: azdata.QueryExecuteCompleteNotificationResult) => { extHostDataProvider.$onQueryComplete(provider.handle, result); }); provider.registerOnBatchStart((batchInfo: azdata.QueryExecuteBatchNotificationParams) => { extHostDataProvider.$onBatchStart(provider.handle, batchInfo); }); provider.registerOnBatchComplete((batchInfo: azdata.QueryExecuteBatchNotificationParams) => { extHostDataProvider.$onBatchComplete(provider.handle, batchInfo); }); provider.registerOnResultSetAvailable((resultSetInfo: azdata.QueryExecuteResultSetNotificationParams) => { extHostDataProvider.$onResultSetAvailable(provider.handle, resultSetInfo); }); provider.registerOnResultSetUpdated((resultSetInfo: azdata.QueryExecuteResultSetNotificationParams) => { extHostDataProvider.$onResultSetUpdated(provider.handle, resultSetInfo); }); provider.registerOnMessage((message: azdata.QueryExecuteMessageParams) => { extHostDataProvider.$onQueryMessage(provider.handle, message); }); provider.registerOnEditSessionReady((ownerUri: string, success: boolean, message: string) => { extHostDataProvider.$onEditSessionReady(provider.handle, ownerUri, success, message); }); return extHostDataProvider.$registerQueryProvider(provider); }; let registerObjectExplorerProvider = (provider: azdata.ObjectExplorerProvider): vscode.Disposable => { provider.registerOnSessionCreated((response: azdata.ObjectExplorerSession) => { extHostDataProvider.$onObjectExplorerSessionCreated(provider.handle, response); }); if (provider.registerOnSessionDisconnected) { provider.registerOnSessionDisconnected((response: azdata.ObjectExplorerSession) => { extHostDataProvider.$onObjectExplorerSessionDisconnected(provider.handle, response); }); } provider.registerOnExpandCompleted((response: azdata.ObjectExplorerExpandInfo) => { extHostDataProvider.$onObjectExplorerNodeExpanded(provider.providerId, response); }); return extHostDataProvider.$registerObjectExplorerProvider(provider); }; let registerObjectExplorerNodeProvider = (provider: azdata.ObjectExplorerNodeProvider): vscode.Disposable => { provider.registerOnExpandCompleted((response: azdata.ObjectExplorerExpandInfo) => { extHostDataProvider.$onObjectExplorerNodeExpanded(provider.providerId, response); }); return extHostDataProvider.$registerObjectExplorerNodeProvider(provider); }; let registerIconProvider = (provider: azdata.IconProvider): vscode.Disposable => { return extHostDataProvider.$registerIconProvider(provider); }; let registerTaskServicesProvider = (provider: azdata.TaskServicesProvider): vscode.Disposable => { provider.registerOnTaskCreated((response: azdata.TaskInfo) => { extHostDataProvider.$onTaskCreated(provider.handle, response); }); provider.registerOnTaskStatusChanged((response: azdata.TaskProgressInfo) => { extHostDataProvider.$onTaskStatusChanged(provider.handle, response); }); return extHostDataProvider.$registerTaskServicesProvider(provider); }; let registerFileBrowserProvider = (provider: azdata.FileBrowserProvider): vscode.Disposable => { provider.registerOnFileBrowserOpened((response: azdata.FileBrowserOpenedParams) => { extHostDataProvider.$onFileBrowserOpened(provider.handle, response); }); provider.registerOnFolderNodeExpanded((response: azdata.FileBrowserExpandedParams) => { extHostDataProvider.$onFolderNodeExpanded(provider.handle, response); }); provider.registerOnFilePathsValidated((response: azdata.FileBrowserValidatedParams) => { extHostDataProvider.$onFilePathsValidated(provider.handle, response); }); return extHostDataProvider.$registerFileBrowserProvider(provider); }; let registerScriptingProvider = (provider: azdata.ScriptingProvider): vscode.Disposable => { provider.registerOnScriptingComplete((response: azdata.ScriptingCompleteResult) => { extHostDataProvider.$onScriptingComplete(provider.handle, response); }); return extHostDataProvider.$registerScriptingProvider(provider); }; let registerProfilerProvider = (provider: azdata.ProfilerProvider): vscode.Disposable => { provider.registerOnSessionEventsAvailable((response: azdata.ProfilerSessionEvents) => { extHostDataProvider.$onSessionEventsAvailable(provider.handle, response); }); provider.registerOnSessionStopped((response: azdata.ProfilerSessionStoppedParams) => { extHostDataProvider.$onSessionStopped(provider.handle, response); }); provider.registerOnProfilerSessionCreated((response: azdata.ProfilerSessionCreatedParams) => { extHostDataProvider.$onProfilerSessionCreated(provider.handle, response); }); return extHostDataProvider.$registerProfilerProvider(provider); }; let registerBackupProvider = (provider: azdata.BackupProvider): vscode.Disposable => { return extHostDataProvider.$registerBackupProvider(provider); }; let registerRestoreProvider = (provider: azdata.RestoreProvider): vscode.Disposable => { return extHostDataProvider.$registerRestoreProvider(provider); }; let registerMetadataProvider = (provider: azdata.MetadataProvider): vscode.Disposable => { return extHostDataProvider.$registerMetadataProvider(provider); }; let registerCapabilitiesServiceProvider = (provider: azdata.CapabilitiesProvider): vscode.Disposable => { return extHostDataProvider.$registerCapabilitiesServiceProvider(provider); }; let registerAdminServicesProvider = (provider: azdata.AdminServicesProvider): vscode.Disposable => { return extHostDataProvider.$registerAdminServicesProvider(provider); }; let registerAgentServicesProvider = (provider: azdata.AgentServicesProvider): vscode.Disposable => { provider.registerOnUpdated(() => { extHostDataProvider.$onJobDataUpdated(provider.handle); }); return extHostDataProvider.$registerAgentServiceProvider(provider); }; let registerDacFxServicesProvider = (provider: azdata.DacFxServicesProvider): vscode.Disposable => { return extHostDataProvider.$registerDacFxServiceProvider(provider); }; let registerSchemaCompareServicesProvider = (provider: azdata.SchemaCompareServicesProvider): vscode.Disposable => { return extHostDataProvider.$registerSchemaCompareServiceProvider(provider); }; // namespace: dataprotocol const dataprotocol: typeof azdata.dataprotocol = { registerBackupProvider, registerConnectionProvider, registerFileBrowserProvider, registerMetadataProvider, registerObjectExplorerProvider, registerObjectExplorerNodeProvider, registerIconProvider, registerProfilerProvider, registerRestoreProvider, registerScriptingProvider, registerTaskServicesProvider, registerQueryProvider, registerAdminServicesProvider, registerAgentServicesProvider, registerCapabilitiesServiceProvider, registerDacFxServicesProvider, registerSchemaCompareServicesProvider, onDidChangeLanguageFlavor(listener: (e: azdata.DidChangeLanguageFlavorParams) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) { return extHostDataProvider.onDidChangeLanguageFlavor(listener, thisArgs, disposables); }, getProvider(providerId: string, providerType: azdata.DataProviderType) { return extHostDataProvider.getProvider(providerId, providerType); }, getProvidersByType(providerType: azdata.DataProviderType) { return extHostDataProvider.getProvidersByType(providerType); } }; const window: typeof azdata.window = { createWebViewDialog(name: string) { return extHostModalDialogs.createDialog(name); }, createModelViewDialog(title: string, dialogName?: string, isWide?: boolean): azdata.window.Dialog { return extHostModelViewDialog.createDialog(title, dialogName, extension, !!isWide); }, createTab(title: string): azdata.window.DialogTab { return extHostModelViewDialog.createTab(title, extension); }, createButton(label: string): azdata.window.Button { return extHostModelViewDialog.createButton(label); }, openDialog(dialog: azdata.window.Dialog) { return extHostModelViewDialog.openDialog(dialog); }, closeDialog(dialog: azdata.window.Dialog) { return extHostModelViewDialog.closeDialog(dialog); }, createWizardPage(title: string): azdata.window.WizardPage { return extHostModelViewDialog.createWizardPage(title); }, createWizard(title: string): azdata.window.Wizard { return extHostModelViewDialog.createWizard(title); }, MessageLevel: sqlExtHostTypes.MessageLevel }; const tasks: typeof azdata.tasks = { registerTask(id: string, task: (...args: any[]) => any, thisArgs?: any): vscode.Disposable { return extHostTasks.registerTask(id, task, thisArgs); }, startBackgroundOperation(operationInfo: azdata.BackgroundOperationInfo): void { extHostBackgroundTaskManagement.$registerTask(operationInfo); } }; const workspace: typeof azdata.workspace = { onDidOpenDashboard: extHostDashboard.onDidOpenDashboard, onDidChangeToDashboard: extHostDashboard.onDidChangeToDashboard, createModelViewEditor(title: string, options?: azdata.ModelViewEditorOptions): azdata.workspace.ModelViewEditor { return extHostModelViewDialog.createModelViewEditor(title, extension, options); } }; const dashboard = { registerWebviewProvider(widgetId: string, handler: (webview: azdata.DashboardWebview) => void) { extHostWebviewWidgets.$registerProvider(widgetId, handler); } }; const ui = { registerModelViewProvider(modelViewId: string, handler: (view: azdata.ModelView) => void): void { extHostModelView.$registerProvider(modelViewId, handler, extension); } }; // namespace: queryeditor const queryEditor: typeof azdata.queryeditor = { connect(fileUri: string, connectionId: string): Thenable { return extHostQueryEditor.$connect(fileUri, connectionId); }, runQuery(fileUri: string, options?: Map): void { extHostQueryEditor.$runQuery(fileUri); }, registerQueryEventListener(listener: azdata.queryeditor.QueryEventListener): void { extHostQueryEditor.$registerQueryInfoListener(mssqlProviderName, listener); }, getQueryDocument(fileUri: string): Thenable { return extHostQueryEditor.$getQueryDocument(fileUri); } }; const extensions: typeof azdata.extensions = { install(vsixPath: string): Thenable { return extHostExtensionManagement.$install(vsixPath); } }; const nb = { get notebookDocuments() { return extHostNotebookDocumentsAndEditors.getAllDocuments().map(doc => doc.document); }, get activeNotebookEditor() { return extHostNotebookDocumentsAndEditors.getActiveEditor(); }, get visibleNotebookEditors() { return extHostNotebookDocumentsAndEditors.getAllEditors(); }, get onDidOpenNotebookDocument() { return extHostNotebookDocumentsAndEditors.onDidOpenNotebookDocument; }, get onDidChangeNotebookCell() { return extHostNotebookDocumentsAndEditors.onDidChangeNotebookCell; }, showNotebookDocument(uri: vscode.Uri, showOptions: azdata.nb.NotebookShowOptions) { return extHostNotebookDocumentsAndEditors.showNotebookDocument(uri, showOptions); }, registerNotebookProvider(provider: azdata.nb.NotebookProvider): vscode.Disposable { return extHostNotebook.registerNotebookProvider(provider); }, CellRange: sqlExtHostTypes.CellRange, NotebookChangeKind: sqlExtHostTypes.NotebookChangeKind }; return { accounts, connection, credentials, objectexplorer: objectExplorer, resources, serialization, dataprotocol, DataProviderType: sqlExtHostTypes.DataProviderType, DeclarativeDataType: sqlExtHostTypes.DeclarativeDataType, ServiceOptionType: sqlExtHostTypes.ServiceOptionType, ConnectionOptionSpecialType: sqlExtHostTypes.ConnectionOptionSpecialType, EditRowState: sqlExtHostTypes.EditRowState, MetadataType: sqlExtHostTypes.MetadataType, TaskStatus: sqlExtHostTypes.TaskStatus, TaskExecutionMode: sqlExtHostTypes.TaskExecutionMode, ScriptOperation: sqlExtHostTypes.ScriptOperation, WeekDays: sqlExtHostTypes.WeekDays, NotifyMethods: sqlExtHostTypes.NotifyMethods, JobCompletionActionCondition: sqlExtHostTypes.JobCompletionActionCondition, JobExecutionStatus: sqlExtHostTypes.JobExecutionStatus, AlertType: sqlExtHostTypes.AlertType, FrequencyTypes: sqlExtHostTypes.FrequencyTypes, FrequencySubDayTypes: sqlExtHostTypes.FrequencySubDayTypes, FrequencyRelativeIntervals: sqlExtHostTypes.FrequencyRelativeIntervals, window, tasks, dashboard, workspace, queryeditor: queryEditor, ui: ui, StatusIndicator: sqlExtHostTypes.StatusIndicator, CardType: sqlExtHostTypes.CardType, Orientation: sqlExtHostTypes.Orientation, SqlThemeIcon: sqlExtHostTypes.SqlThemeIcon, TreeComponentItem: sqlExtHostTypes.TreeComponentItem, nb: nb, AzureResource: sqlExtHostTypes.AzureResource, TreeItem: sqlExtHostTypes.TreeItem, extensions: extensions, SchemaUpdateAction: sqlExtHostTypes.SchemaUpdateAction, SchemaDifferenceType: sqlExtHostTypes.SchemaDifferenceType, SchemaCompareEndpointType: sqlExtHostTypes.SchemaCompareEndpointType, SchemaObjectType: sqlExtHostTypes.SchemaObjectType, ColumnType: sqlExtHostTypes.ColumnType, ActionOnCellCheckboxCheck: sqlExtHostTypes.ActionOnCellCheckboxCheck, }; }, // "sqlops" namespace provided for back-compat only, add new interfaces to "azdata" sqlopsFactory: function (extension: IExtensionDescription): typeof sqlops { // namespace: connection const connection: typeof sqlops.connection = { getActiveConnections(): Thenable { return extHostConnectionManagement.$getActiveConnections(); }, getCurrentConnection(): Thenable { return extHostConnectionManagement.$getSqlOpsCurrentConnection(); }, getCredentials(connectionId: string): Thenable<{ [name: string]: string }> { return extHostConnectionManagement.$getCredentials(connectionId); }, getServerInfo(connectionId: string): Thenable { return extHostConnectionManagement.$getServerInfo(connectionId); }, openConnectionDialog(providers?: string[], initialConnectionProfile?: sqlops.IConnectionProfile, connectionCompletionOptions?: sqlops.IConnectionCompletionOptions): Thenable { return extHostConnectionManagement.$openConnectionDialog(providers, initialConnectionProfile, connectionCompletionOptions); }, listDatabases(connectionId: string): Thenable { return extHostConnectionManagement.$listDatabases(connectionId); }, getConnectionString(connectionId: string, includePassword: boolean): Thenable { return extHostConnectionManagement.$getConnectionString(connectionId, includePassword); }, getUriForConnection(connectionId: string): Thenable { return extHostConnectionManagement.$getUriForConnection(connectionId); }, connect(connectionProfile: sqlops.IConnectionProfile, saveConnection: boolean, showDashboard: boolean): Thenable { return extHostConnectionManagement.$connect(connectionProfile, saveConnection, showDashboard); } }; // namespace: credentials const credentials: typeof sqlops.credentials = { registerProvider(provider: sqlops.CredentialProvider): vscode.Disposable { return extHostCredentialManagement.$registerCredentialProvider(provider); }, getProvider(namespaceId: string): Thenable { return extHostCredentialManagement.$getCredentialProvider(namespaceId); } }; // namespace: objectexplorer const objectExplorer: typeof sqlops.objectexplorer = { getNode(connectionId: string, nodePath?: string): Thenable { return extHostObjectExplorer.$getNode(connectionId, nodePath); }, getActiveConnectionNodes(): Thenable { return extHostObjectExplorer.$getActiveConnectionNodes(); }, findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames: string[]): Thenable { return extHostObjectExplorer.$findNodes(connectionId, type, schema, name, database, parentObjectNames); }, getNodeActions(connectionId: string, nodePath: string): Thenable { return extHostObjectExplorer.$getNodeActions(connectionId, nodePath); }, getSessionConnectionProfile(sessionId: string): Thenable { return extHostObjectExplorer.$getSessionConnectionProfile(sessionId); } }; // namespace: serialization const serialization: typeof sqlops.serialization = { registerProvider(provider: sqlops.SerializationProvider): vscode.Disposable { return extHostSerializationProvider.$registerSerializationProvider(provider); }, }; let registerConnectionProvider = (provider: sqlops.ConnectionProvider): vscode.Disposable => { // Connection callbacks provider.registerOnConnectionComplete((connSummary: sqlops.ConnectionInfoSummary) => { extHostDataProvider.$onConnectComplete(provider.handle, connSummary); }); provider.registerOnIntelliSenseCacheComplete((connectionUri: string) => { extHostDataProvider.$onIntelliSenseCacheComplete(provider.handle, connectionUri); }); provider.registerOnConnectionChanged((changedConnInfo: sqlops.ChangedConnectionInfo) => { extHostDataProvider.$onConnectionChanged(provider.handle, changedConnInfo); }); return extHostDataProvider.$registerConnectionProvider(provider); }; let registerQueryProvider = (provider: sqlops.QueryProvider): vscode.Disposable => { provider.registerOnQueryComplete((result: sqlops.QueryExecuteCompleteNotificationResult) => { extHostDataProvider.$onQueryComplete(provider.handle, result); }); provider.registerOnBatchStart((batchInfo: sqlops.QueryExecuteBatchNotificationParams) => { extHostDataProvider.$onBatchStart(provider.handle, batchInfo); }); provider.registerOnBatchComplete((batchInfo: sqlops.QueryExecuteBatchNotificationParams) => { extHostDataProvider.$onBatchComplete(provider.handle, batchInfo); }); provider.registerOnResultSetAvailable((resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams) => { extHostDataProvider.$onResultSetAvailable(provider.handle, resultSetInfo); }); provider.registerOnResultSetUpdated((resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams) => { extHostDataProvider.$onResultSetUpdated(provider.handle, resultSetInfo); }); provider.registerOnMessage((message: sqlops.QueryExecuteMessageParams) => { extHostDataProvider.$onQueryMessage(provider.handle, message); }); provider.registerOnEditSessionReady((ownerUri: string, success: boolean, message: string) => { extHostDataProvider.$onEditSessionReady(provider.handle, ownerUri, success, message); }); return extHostDataProvider.$registerQueryProvider(provider); }; let registerObjectExplorerProvider = (provider: sqlops.ObjectExplorerProvider): vscode.Disposable => { provider.registerOnSessionCreated((response: sqlops.ObjectExplorerSession) => { extHostDataProvider.$onObjectExplorerSessionCreated(provider.handle, response); }); if (provider.registerOnSessionDisconnected) { provider.registerOnSessionDisconnected((response: sqlops.ObjectExplorerSession) => { extHostDataProvider.$onObjectExplorerSessionDisconnected(provider.handle, response); }); } provider.registerOnExpandCompleted((response: sqlops.ObjectExplorerExpandInfo) => { extHostDataProvider.$onObjectExplorerNodeExpanded(provider.providerId, response); }); return extHostDataProvider.$registerObjectExplorerProvider(provider); }; let registerObjectExplorerNodeProvider = (provider: sqlops.ObjectExplorerNodeProvider): vscode.Disposable => { provider.registerOnExpandCompleted((response: sqlops.ObjectExplorerExpandInfo) => { extHostDataProvider.$onObjectExplorerNodeExpanded(provider.providerId, response); }); return extHostDataProvider.$registerObjectExplorerNodeProvider(provider); }; let registerTaskServicesProvider = (provider: sqlops.TaskServicesProvider): vscode.Disposable => { provider.registerOnTaskCreated((response: sqlops.TaskInfo) => { extHostDataProvider.$onTaskCreated(provider.handle, response); }); provider.registerOnTaskStatusChanged((response: sqlops.TaskProgressInfo) => { extHostDataProvider.$onTaskStatusChanged(provider.handle, response); }); return extHostDataProvider.$registerTaskServicesProvider(provider); }; let registerFileBrowserProvider = (provider: sqlops.FileBrowserProvider): vscode.Disposable => { provider.registerOnFileBrowserOpened((response: sqlops.FileBrowserOpenedParams) => { extHostDataProvider.$onFileBrowserOpened(provider.handle, response); }); provider.registerOnFolderNodeExpanded((response: sqlops.FileBrowserExpandedParams) => { extHostDataProvider.$onFolderNodeExpanded(provider.handle, response); }); provider.registerOnFilePathsValidated((response: sqlops.FileBrowserValidatedParams) => { extHostDataProvider.$onFilePathsValidated(provider.handle, response); }); return extHostDataProvider.$registerFileBrowserProvider(provider); }; let registerScriptingProvider = (provider: sqlops.ScriptingProvider): vscode.Disposable => { provider.registerOnScriptingComplete((response: sqlops.ScriptingCompleteResult) => { extHostDataProvider.$onScriptingComplete(provider.handle, response); }); return extHostDataProvider.$registerScriptingProvider(provider); }; let registerMetadataProvider = (provider: sqlops.MetadataProvider): vscode.Disposable => { return extHostDataProvider.$registerMetadataProvider(provider); }; let registerCapabilitiesServiceProvider = (provider: sqlops.CapabilitiesProvider): vscode.Disposable => { return extHostDataProvider.$registerCapabilitiesServiceProvider(provider); }; let registerAdminServicesProvider = (provider: sqlops.AdminServicesProvider): vscode.Disposable => { return extHostDataProvider.$registerAdminServicesProvider(provider); }; // namespace: dataprotocol const dataprotocol: typeof sqlops.dataprotocol = { registerConnectionProvider, registerFileBrowserProvider, registerMetadataProvider, registerObjectExplorerProvider, registerObjectExplorerNodeProvider, registerScriptingProvider, registerTaskServicesProvider, registerQueryProvider, registerAdminServicesProvider, registerCapabilitiesServiceProvider, onDidChangeLanguageFlavor(listener: (e: sqlops.DidChangeLanguageFlavorParams) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) { return extHostDataProvider.onDidChangeLanguageFlavor(listener, thisArgs, disposables); }, getProvider(providerId: string, providerType: sqlops.DataProviderType) { return extHostDataProvider.getProvider(providerId, providerType); }, getProvidersByType(providerType: sqlops.DataProviderType) { return extHostDataProvider.getProvidersByType(providerType); } }; const modelViewDialog: typeof sqlops.window.modelviewdialog = { createDialog(title: string, dialogName?: string): sqlops.window.modelviewdialog.Dialog { console.warn('the method sqlops.window.modelviewdialog.createDialog has been deprecated, replace it with azdata.window.createModelViewDialog'); return extHostModelViewDialog.createDialog(title, dialogName, extension); }, createTab(title: string): sqlops.window.modelviewdialog.DialogTab { console.warn('the method sqlops.window.modelviewdialog.createTab has been deprecated, replace it with azdata.window.createTab'); return extHostModelViewDialog.createTab(title, extension); }, createButton(label: string): sqlops.window.modelviewdialog.Button { console.warn('the method sqlops.window.modelviewdialog.createButton has been deprecated, replace it with azdata.window.createButton'); return extHostModelViewDialog.createButton(label); }, openDialog(dialog: sqlops.window.modelviewdialog.Dialog) { console.warn('the method sqlops.window.modelviewdialog.openDialog has been deprecated, replace it with azdata.window.openDialog'); return extHostModelViewDialog.openDialog(dialog as azdata.window.Dialog); }, closeDialog(dialog: sqlops.window.modelviewdialog.Dialog) { console.warn('the method sqlops.window.modelviewdialog.closeDialog has been deprecated, replace it with azdata.window.closeDialog'); return extHostModelViewDialog.closeDialog(dialog as azdata.window.Dialog); }, createWizardPage(title: string): sqlops.window.modelviewdialog.WizardPage { console.warn('the method sqlops.window.modelviewdialog.createWizardPage has been deprecated, replace it with azdata.window.createWizardPage'); return extHostModelViewDialog.createWizardPage(title); }, createWizard(title: string): sqlops.window.modelviewdialog.Wizard { console.warn('the method sqlops.window.modelviewdialog.createWizard has been deprecated, replace it with azdata.window.createWizard'); return extHostModelViewDialog.createWizard(title); }, MessageLevel: sqlExtHostTypes.MessageLevel }; const window: typeof sqlops.window = { createDialog(name: string) { console.warn('the method sqlops.window.createDialog has been deprecated, replace it with azdata.window.createWebViewDialog'); return extHostModalDialogs.createDialog(name); }, modelviewdialog: modelViewDialog, createWebViewDialog(name: string) { return extHostModalDialogs.createDialog(name); }, createModelViewDialog(title: string, dialogName?: string): sqlops.window.Dialog { return extHostModelViewDialog.createDialog(title, dialogName, extension); }, createTab(title: string): sqlops.window.DialogTab { return extHostModelViewDialog.createTab(title, extension); }, createButton(label: string): sqlops.window.Button { return extHostModelViewDialog.createButton(label); }, openDialog(dialog: sqlops.window.Dialog) { return extHostModelViewDialog.openDialog(dialog as azdata.window.Dialog); }, closeDialog(dialog: sqlops.window.Dialog) { return extHostModelViewDialog.closeDialog(dialog as azdata.window.Dialog); }, createWizardPage(title: string): sqlops.window.WizardPage { return extHostModelViewDialog.createWizardPage(title); }, createWizard(title: string): sqlops.window.Wizard { return extHostModelViewDialog.createWizard(title); }, MessageLevel: sqlExtHostTypes.MessageLevel }; const tasks: typeof sqlops.tasks = { registerTask(id: string, task: (...args: any[]) => any, thisArgs?: any): vscode.Disposable { return extHostTasks.registerTask(id, task, thisArgs); }, startBackgroundOperation(operationInfo: sqlops.BackgroundOperationInfo): void { extHostBackgroundTaskManagement.$registerTask(operationInfo); } }; const workspace: typeof sqlops.workspace = { onDidOpenDashboard: extHostDashboard.onDidOpenDashboard, onDidChangeToDashboard: extHostDashboard.onDidChangeToDashboard, createModelViewEditor(title: string, options?: sqlops.ModelViewEditorOptions): sqlops.workspace.ModelViewEditor { return extHostModelViewDialog.createModelViewEditor(title, extension, options); } }; const dashboard = { registerWebviewProvider(widgetId: string, handler: (webview: sqlops.DashboardWebview) => void) { extHostWebviewWidgets.$registerProvider(widgetId, handler); } }; const ui = { registerModelViewProvider(modelViewId: string, handler: (view: sqlops.ModelView) => void): void { extHostModelView.$registerProvider(modelViewId, handler, extension); } }; // namespace: queryeditor const queryEditor: typeof sqlops.queryeditor = { connect(fileUri: string, connectionId: string): Thenable { return extHostQueryEditor.$connect(fileUri, connectionId); }, runQuery(fileUri: string): void { extHostQueryEditor.$runQuery(fileUri); } }; const extensions: typeof sqlops.extensions = { install(vsixPath: string): Thenable { return extHostExtensionManagement.$install(vsixPath); } }; return { connection, credentials, objectexplorer: objectExplorer, serialization, dataprotocol, DataProviderType: sqlExtHostTypes.DataProviderType, DeclarativeDataType: sqlExtHostTypes.DeclarativeDataType, ServiceOptionType: sqlExtHostTypes.ServiceOptionType, ConnectionOptionSpecialType: sqlExtHostTypes.ConnectionOptionSpecialType, EditRowState: sqlExtHostTypes.EditRowState, MetadataType: sqlExtHostTypes.MetadataType, TaskStatus: sqlExtHostTypes.TaskStatus, TaskExecutionMode: sqlExtHostTypes.TaskExecutionMode, ScriptOperation: sqlExtHostTypes.ScriptOperation, window, tasks, dashboard, workspace, queryeditor: queryEditor, ui: ui, StatusIndicator: sqlExtHostTypes.StatusIndicator, CardType: sqlExtHostTypes.CardType, Orientation: sqlExtHostTypes.Orientation, SqlThemeIcon: sqlExtHostTypes.SqlThemeIcon, TreeComponentItem: sqlExtHostTypes.TreeComponentItem, AzureResource: sqlExtHostTypes.AzureResource, extensions: extensions, TreeItem: sqlExtHostTypes.TreeItem }; } }; } export function initializeExtensionApi(extensionService: ExtHostExtensionService, apiFactory: ISqlExtensionApiFactory, extensionRegistry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): Promise { return extensionService.getExtensionPathIndex().then(trie => defineAPI(apiFactory, trie, extensionRegistry, configProvider)); } function defineAPI(factory: ISqlExtensionApiFactory, extensionPaths: TernarySearchTree, extensionRegistry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): void { type ApiImpl = typeof vscode | typeof azdata | typeof sqlops; // each extension is meant to get its own api implementation const extApiImpl = new Map(); const dataExtApiImpl = new Map(); const azDataExtApiImpl = new Map(); let defaultApiImpl: typeof vscode; let defaultDataApiImpl: typeof sqlops; let defaultAzDataApiImpl: typeof azdata; // The module factory looks for an entry in the API map for an extension. If found, it reuses this. // If not, it loads it & saves it in the map let getModuleFactory = function (apiMap: Map, createApi: (extensionDescription: IExtensionDescription) => ApiImpl, defaultImpl: ApiImpl, setDefaultApiImpl: (defaultImpl: ApiImpl) => void, parent: any): ApiImpl { // get extension id from filename and api for extension const ext = extensionPaths.findSubstr(URI.file(parent.filename).fsPath); if (ext) { let apiImpl = apiMap.get(ext.identifier.value); if (!apiImpl) { apiImpl = createApi(ext); apiMap.set(ext.identifier.value, apiImpl); } return apiImpl; } // fall back to a default implementation if (!defaultImpl) { console.warn(`Could not identify extension for 'vscode' require call from ${parent.filename}`); defaultImpl = createApi(nullExtensionDescription); setDefaultApiImpl(defaultImpl); } return defaultImpl; }; const node_module = require.__$__nodeRequire('module'); const original = node_module._load; // TODO look into de-duplicating this code node_module._load = function load(request, parent, isMain) { if (request === 'vscode') { return getModuleFactory(extApiImpl, (ext) => factory.vsCodeFactory(ext, extensionRegistry, configProvider), defaultApiImpl, (impl) => defaultApiImpl = impl, parent); } else if (request === 'azdata') { return getModuleFactory(azDataExtApiImpl, (ext) => factory.azdataFactory(ext), defaultAzDataApiImpl, (impl) => defaultAzDataApiImpl = impl, parent); } else if (request === 'sqlops') { return getModuleFactory(dataExtApiImpl, (ext) => factory.sqlopsFactory(ext), defaultDataApiImpl, (impl) => defaultDataApiImpl = impl, parent); } else { // Allow standard node_module load to occur return original.apply(this, arguments); } }; } const nullExtensionDescription: IExtensionDescription = { identifier: new ExtensionIdentifier('nullExtensionDescription'), name: 'Null Extension Description', publisher: 'vscode', activationEvents: undefined, contributes: undefined, enableProposedApi: false, engines: undefined, extensionDependencies: undefined, extensionLocation: undefined, isBuiltin: false, main: undefined, version: undefined, isUnderDevelopment: true };