export async function activate()

in src/extension.ts [20:284]


export async function activate(context: vscode.ExtensionContext) {
  const storagePath: string = context.globalStorageUri.fsPath;
  const reviewsCache = new AssayCache("addonMeta", storagePath);

  // Menu Controllers
  const addonCacheController = new AddonCacheController(reviewsCache);
  const credentialController = new CredentialController(context.secrets);
  const directoryController = new DirectoryController();

  const fileDecorationProvider = new CustomFileDecorationProvider();
  const fileDecoratorController = new FileDecoratorController(
    fileDecorationProvider
  );

  const commentsCache = new AssayCache("comments", storagePath);
  const commentCacheController = new CommentCacheController(
    commentsCache,
    directoryController,
    fileDecoratorController
  );
  const commentController = new CommentController(
    "assay-comments",
    "Assay",
    commentCacheController,
    directoryController
  );

  const rootFolderPath = await directoryController.getRootFolderPath();
  const sidebarController = new SidebarController(
    "assayCommands",
    rootFolderPath
  );
  const sidebarTreeViewDisposable = sidebarController.treeView;

  const sidebarRefreshDisposable = vscode.commands.registerCommand(
    "assay.refresh",
    sidebarController.refresh
  );

  const sidebarDeleteDisposable = vscode.commands.registerCommand(
    "assay.sidebarDelete",
    (treeItem: AddonTreeItem, list: AddonTreeItem[]) => {
      commentController.deleteCommentsFromMenu(treeItem, list);
      sidebarController.delete(treeItem, list);
    }
  );

  const diagnosticCollection =
    vscode.languages.createDiagnosticCollection("addons-linter");

  const lintController = new LintController(
    diagnosticCollection,
    credentialController,
    addonCacheController,
    directoryController
  );

  const addonController = new AddonController(
    credentialController,
    addonCacheController,
    directoryController,
    sidebarController
  );

  const urlController = new UrlController(
    context,
    addonController,
    directoryController,
    lintController
  );
  const diffController = new DiffController();

  const UriHandlerDisposable = vscode.window.registerUriHandler(urlController);

  const viewAddonDisposable = vscode.commands.registerCommand(
    "assay.viewAddon",
    urlController.viewAddon,
    urlController
  );

  const diffDisposable = vscode.commands.registerCommand(
    "assay.sidebarDiff",
    diffController.diffFromSidebar,
    diffController
  );
  const assayUpdaterDisposable = vscode.commands.registerCommand(
    "assay.checkForUpdates",
    UpdateHelper.updateAssay
  );

  const apiKeyDisposable = vscode.commands.registerCommand(
    "assay.getApiKey",
    credentialController.getApiKeyFromUser,
    credentialController
  );

  const apiSecretDisposable = vscode.commands.registerCommand(
    "assay.getSecret",
    credentialController.getSecretFromUser,
    credentialController
  );

  const apiCredentialsTestDisposable = vscode.commands.registerCommand(
    "assay.testApiCredentials",
    credentialController.testApiCredentials,
    credentialController
  );

  const reviewDisposable = vscode.commands.registerCommand(
    "assay.review",
    (url: string) => {
      vscode.env.openExternal(vscode.Uri.parse(url));
    }
  );

  const getDisposable = vscode.commands.registerCommand(
    "assay.get",
    urlController.getAddonByUrl,
    urlController
  );

  context.subscriptions.push(
    UriHandlerDisposable,
    reviewDisposable,
    getDisposable,
    apiKeyDisposable,
    apiSecretDisposable,
    apiCredentialsTestDisposable,
    sidebarTreeViewDisposable,
    sidebarRefreshDisposable,
    sidebarDeleteDisposable,
    viewAddonDisposable,
    diffDisposable,
    assayUpdaterDisposable
  );

  UpdateHelper.updateAssay(false);

  await vscode.commands.executeCommand(
    "setContext",
    "assay.commentsEnabled",
    false
  );

  // Do not launch commenting system if not in the rootFolder.
  // Still allows Assay to be launched to use other commands (setup, installs).
  const workspace = vscode.workspace.workspaceFolders;

  if (!workspace || !(await directoryController.inRoot(workspace[0].uri))) {
    return;
  }

  await vscode.commands.executeCommand(
    "setContext",
    "assay.commentsEnabled",
    true
  );

  // Review Controllers
  fileDecorationProvider.setProvideDecorationClause(
    commentCacheController.fileHasComment
  );

  const statusBarController = new StatusBarController(
    addonCacheController,
    directoryController
  );

  urlController.openCachedFile();
  lintController.lintWorkspace();

  const clearLintDisposable = vscode.workspace.onDidSaveTextDocument(
    lintController.clearLintsOnDirty,
    lintController
  );

  const addDirtyOnDeleteDisposable = vscode.workspace.onDidDeleteFiles(
    lintController.clearLintsOnDelete,
    lintController
  );

  const addDirtyOnChangeDisposable = vscode.workspace.onDidChangeTextDocument(
    lintController.toggleDirty,
    lintController
  );

  const removeDirtyDisposable = vscode.workspace.onDidCloseTextDocument(
    lintController.removeDirty,
    lintController
  );

  const fileDecorationProviderDisposable =
    vscode.window.registerFileDecorationProvider(fileDecorationProvider);

  const updateStatusBarController = vscode.window.onDidChangeActiveTextEditor(
    statusBarController.updateStatusBar,
    statusBarController
  );

  const deleteCommentsFolderDisposable = vscode.commands.registerCommand(
    "assay.deleteCommentsFromContext",
    commentController.deleteCommentsFromMenu,
    commentController
  );

  const exportCommentDisposable = vscode.commands.registerCommand(
    "assay.exportComments",
    commentController.exportComments,
    commentController
  );

  const addCommentDisposable = vscode.commands.registerCommand(
    "assay.addComment",
    commentController.addComment,
    commentController
  );

  const copyLineNumberDisposable = vscode.commands.registerCommand(
    "assay.copyLineNumber",
    commentController.copyLineNumber,
    commentController
  );

  const deleteCommentDisposable = vscode.commands.registerCommand(
    "assay.deleteComment",
    commentController.deleteThread,
    commentController
  );

  const copyLinkFromThreadDisposable = vscode.commands.registerCommand(
    "assay.copyLink",
    commentController.copyLinkFromThread,
    commentController
  );

  const copyLinkFromContextDisposable = vscode.commands.registerCommand(
    "assay.copyLinkFromContext",
    commentController.copyLinkFromContext,
    commentController
  );

  const disposeCommentDisposable = vscode.commands.registerCommand(
    "assay.disposeComment",
    commentController.dispose,
    commentController
  );

  context.subscriptions.push(
    updateStatusBarController,
    fileDecorationProviderDisposable,
    commentController.controller,
    addCommentDisposable,
    copyLineNumberDisposable,
    deleteCommentDisposable,
    exportCommentDisposable,
    disposeCommentDisposable,
    copyLinkFromThreadDisposable,
    copyLinkFromContextDisposable,
    deleteCommentsFolderDisposable,
    clearLintDisposable,
    addDirtyOnDeleteDisposable,
    addDirtyOnChangeDisposable,
    removeDirtyDisposable
  );
}