diff --git a/.eslintrc.js b/.eslintrc.js index d4675ee95..fb1ed3a73 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -40,7 +40,7 @@ module.exports = { }, ], rules: { - //CTODO uncomment when console debugging is reverted: "no-console": ["error", { allow: ["error", "warn", "dir"] }], + "no-console": ["error", { allow: ["error", "warn", "dir"] }], curly: "error", "@typescript-eslint/switch-exhaustiveness-check": "error", "@typescript-eslint/no-unused-vars": "error", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3ced85dc..7d58ebe85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -299,13 +299,26 @@ jobs: run: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --list - name: Run test shard ${{ matrix['shardIndex'] }} of ${{ matrix['shardTotal']}} run: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --workers=3 - - name: Upload blob report to GitHub Actions Artifacts + - name: "Re-auth for upload (refresh OIDC token)" if: ${{ !cancelled() }} - uses: actions/upload-artifact@v4 + uses: Azure/login@v2 with: - name: blob-report-${{ matrix.shardIndex }} - path: blob-report - retention-days: 1 + client-id: ${{ secrets.E2E_TESTS_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + - name: Upload shard blob-report to Azure Storage + if: ${{ !cancelled() }} + env: + KEY: ${{ github.run_id }}-${{ github.run_attempt }} + SHARD: ${{ matrix.shardIndex }} + run: | + az storage blob upload-batch \ + --account-name ${{ secrets.PREVIEW_STORAGE_ACCOUNT_NAME }} \ + --auth-mode login \ + -d playwright-reports \ + -s blob-report \ + --destination-path "${KEY}/shards/shard-${SHARD}" \ + --overwrite true merge-playwright-reports: name: "Merge Playwright Reports" @@ -317,6 +330,7 @@ jobs: permissions: contents: read pull-requests: write + id-token: write steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -325,29 +339,67 @@ jobs: - name: Install dependencies run: npm ci - - name: Download blob reports from GitHub Actions Artifacts - uses: actions/download-artifact@v4 + - name: "Az CLI login" + uses: Azure/login@v2 with: - path: all-blob-reports - pattern: blob-report-* - merge-multiple: true + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.PREVIEW_SUBSCRIPTION_ID }} + + - name: Download all shard reports from Azure Storage + env: + KEY: ${{ github.run_id }}-${{ github.run_attempt }} + run: | + mkdir -p all-blob-reports + az storage blob download-batch \ + --account-name ${{ secrets.PREVIEW_STORAGE_ACCOUNT_NAME }} \ + --auth-mode login \ + -s playwright-reports \ + --pattern "${KEY}/shards/*" \ + -d ./all-blob-reports + find ./all-blob-reports -type f -name "*.zip" -exec mv -t ./all-blob-reports {} + + find ./all-blob-reports -type d -empty -delete + ls -la ./all-blob-reports - name: Merge into HTML Report run: npx playwright merge-reports --reporter html ./all-blob-reports - - name: Upload HTML report - uses: actions/upload-artifact@v4 - with: - name: html-report--attempt-${{ github.run_attempt }} - path: playwright-report - retention-days: 14 + - name: Bundle merged report into a single zip + run: | + cd playwright-report + zip -r ../report.zip . + cd .. + + - name: Upload report.zip to Azure Storage + env: + KEY: ${{ github.run_id }}-${{ github.run_attempt }} + run: | + az storage blob upload \ + --account-name ${{ secrets.PREVIEW_STORAGE_ACCOUNT_NAME }} \ + --auth-mode login \ + -c playwright-reports \ + -n "${KEY}/report.zip" \ + -f report.zip \ + --overwrite + + - name: Clean up shard intermediates from Azure Storage + if: ${{ always() }} + env: + KEY: ${{ github.run_id }}-${{ github.run_attempt }} + run: | + az storage blob delete-batch \ + --account-name ${{ secrets.PREVIEW_STORAGE_ACCOUNT_NAME }} \ + --auth-mode login \ + -s playwright-reports \ + --pattern "${KEY}/shards/*" - name: Comment Playwright results on PR if: ${{ !cancelled() && github.event_name == 'pull_request' }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} PR: ${{ github.event.pull_request.number }} - REPORT_URL: https://dataexplorerpreview.z5.web.core.windows.net/playwright-reports/${{ github.run_id }}-${{ github.run_attempt }}/index.html + SA_ID: /subscriptions/${{ secrets.PREVIEW_SUBSCRIPTION_ID }}/resourceGroups/dataexplorer-preview/providers/Microsoft.Storage/storageAccounts/dataexplorerpreview + KEY: ${{ github.run_id }}-${{ github.run_attempt }} RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} run: | PLAYWRIGHT_JSON_OUTPUT_NAME=results.json npx playwright merge-reports --reporter json ./all-blob-reports @@ -355,6 +407,8 @@ jobs: BROKEN=$(gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}/jobs" \ --jq '[.jobs[] | select(.name | startswith("Run Playwright Tests")) | select(.conclusion == "failure")] | length') if [ "$FAILED" -gt 0 ] || [ "$BROKEN" -gt 0 ]; then ICON="โŒ failed"; else ICON="โœ… passed"; fi + SA_ENC=$(printf '%s' "$SA_ID" | jq -sRr @uri) + CONTAINER_URL="https://portal.azure.com/#view/Microsoft_Azure_Storage/ContainerMenuBlade/~/overview/storageAccountId/${SA_ENC}/path/playwright-reports" NOTE="" [ "$BROKEN" -gt 0 ] && NOTE=" @@ -365,38 +419,5 @@ jobs: | :---: | :---: | :---: | :---: | | $PASSED | $FAILED | $FLAKY | ${DURATION}s | - ๐Ÿ“Š [Open full report]($REPORT_URL) ยท [Workflow run]($RUN_URL)$NOTE" - - publish-playwright-report: - name: "Publish Playwright Report to Blob" - if: ${{ !cancelled() }} - needs: [merge-playwright-reports] - - runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - steps: - - name: Download HTML report artifact - uses: actions/download-artifact@v4 - with: - name: html-report--attempt-${{ github.run_attempt }} - path: playwright-report - - - name: "Az CLI login" - uses: Azure/login@v2 - with: - client-id: ${{ secrets.AZURE_CLIENT_ID }} - tenant-id: ${{ secrets.AZURE_TENANT_ID }} - subscription-id: ${{ secrets.PREVIEW_SUBSCRIPTION_ID }} - - - name: Upload Playwright report to blob storage - env: - KEY: ${{ github.run_id }}-${{ github.run_attempt }} - BASE: https://dataexplorerpreview.z5.web.core.windows.net - run: | - az storage blob upload-batch -d '$web' -s playwright-report \ - --destination-path "playwright-reports/${KEY}" \ - --account-name ${{ secrets.PREVIEW_STORAGE_ACCOUNT_NAME }} \ - --auth-mode login --overwrite true - echo "๐Ÿ“Š [Open Playwright report](${BASE}/playwright-reports/${KEY}/index.html)" >> $GITHUB_STEP_SUMMARY + ๐Ÿ“ **Report:** \`${KEY}/report.zip\` + [Open container]($CONTAINER_URL) (Azure sign-in required) โ†’ click into \`${KEY}\` folder โ†’ click \`report.zip\` โ†’ **Download** โ†’ unzip โ†’ open \`index.html\` ยท [Workflow run]($RUN_URL)$NOTE" diff --git a/docs/remove-notebooks-plan.md b/docs/remove-notebooks-plan.md new file mode 100644 index 000000000..9b6104509 --- /dev/null +++ b/docs/remove-notebooks-plan.md @@ -0,0 +1,214 @@ +# Implementation Plan: Remove Phoenix & Notebooks + +## Problem statement + +Cosmos Explorer contains a large, deeply-integrated **notebooks** feature backed by +the **Phoenix** compute-container service and the **Juno** service, plus a **GitHub** +integration used to pin/browse notebook repositories. This functionality is being +retired. The goal is to remove all notebooks/Phoenix/Juno/GitHub-for-notebooks code, +dependencies, UI surfaces, telemetry, and configuration, while **preserving the +database shell terminals** (Mongo / Cassandra / Postgres / VCoreMongo), which today +share the Terminal infrastructure with notebooks. + +This document is the implementation plan only. No code changes are made here. + +## Scope decisions (confirmed) + +- **Database shells**: Keep the Mongo/Cassandra/Postgres/VCoreMongo shells, but migrate + them to use the **CloudShell** path exclusively. Remove the legacy Phoenix + notebook-server shell path. +- **GitHub integration**: Remove entirely (it exists only for notebook pinned repos). +- **Schema Analyzer** (`src/Explorer/Notebook/SchemaAnalyzer`): Remove. +- **Phasing**: Every phase must leave the app in a **buildable, shippable** state + (build + lint + strict compile + unit tests green; shells still work). +- **Localization**: Remove notebook/GitHub strings from **all** resource files โ€” + `src/Localization/en/Resources.json` **and** every non-English locale + (`src/Localization//Resources.json`). (This deletion is an exception to the + usual convention of editing only the English file.) + +## Prior art / related commits + +This is a continuation of an in-progress removal effort. Reference commits: + +- `7295d63a` โ€” Remove gallery.html and all associated gallery functionality (#2474) +- `a36467f4` โ€” Remove Phoenix `getDbAccountAllowedStatus`; `isPhoenixNotebooks`/ + `isPhoenixFeatures` now always `false` (#2472) +- `31385950` โ€” removed NotebookViewer file (#2281) + +> **Note:** An unmerged branch `users/jawelton/remove-notebooks-terminal-052126` +> already contains related work (`5989c77c` "Remove terminal.html webpack entry point +> and notebooks terminal code", `c7f9d7e3` "Switch VCore Mongo quickstart to use +> CloudShell terminal"). These are **not** in `master`. Reconcile with that branch +> before/while starting Phase 1 to avoid duplicate or conflicting work. + +## Current-state survey (what exists today) + +**Core directories / files** +- `src/Phoenix/PhoenixClient.ts` โ€” container allocation, heartbeat, status polling. +- `src/Juno/JunoClient.ts` (+ test) โ€” pinned-repo / notebook metadata service client. +- `src/Explorer/Notebook/` โ€” the bulk of the feature: + - `useNotebook.ts` (Zustand store), `NotebookManager.tsx`, `NotebookContentClient.ts`, + `NotebookClientV2.ts`, `NotebookContainerClient.ts`, `NotebookContentItem.ts`, + `NotebookUtil.ts`, `NTeractUtil.ts`, `FileSystemUtil.ts` + - `NotebookComponent/` (nteract redux store, epics, reducers, content providers) + - `NotebookRenderer/` (nteract cell rendering, decorators, outputs) + - `SchemaAnalyzer/`, `SecurityWarningBar/` +- `src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx` (+ less/test) +- `src/Explorer/Controls/NotebookViewer/` โ€” read-only viewer + metadata. +- `src/Explorer/Tabs/NotebookV2Tab.ts`, `NotebookTabBase.ts`, `SchemaAnalyzerTab.ts` +- `src/Explorer/Panes/CopyNotebookPane/` +- `src/Explorer/Tabs/ShellAdapters/NotebookTerminalComponentAdapter.tsx` +- `src/CellOutputViewer/` โ€” webpack entry `cellOutputViewer`. +- `src/Utils/NotebookConfigurationUtils.ts`, `src/hooks/useNotebookSnapshotStore.ts` +- `src/Utils/arm/generatedClients/cosmosNotebooks/` โ€” generated ARM client. + +**GitHub integration (notebook-only)** +- `src/GitHub/` (`GitHubClient.ts`, `GitHubContentProvider.ts`, `GitHubOAuthService.ts`, + `GitHubConnector.ts`), `src/Utils/GitHubUtils.ts` +- `src/Explorer/Controls/GitHub/` (AuthorizeAccess, AddRepo, GitHubRepos components) +- `src/Explorer/Panes/GitHubReposPanel/` +- webpack entry `connectToGitHub` + `src/connectToGitHub.html` + +**Integration / glue points (edited, not deleted)** +- `src/Explorer/Explorer.tsx` โ€” `phoenixClient`, `notebookManager`, `gitHubOAuthService`, + `initNotebooks`, `initiateAndRefreshNotebookList`, `allocateContainer`, + `openNotebook*`, `openNotebookTerminal`, `createNotebookContentItemFile`, etc. +- `src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx` (+ adapter, test) + โ€” New Notebook / Open Terminal / shell buttons branching on `isShellEnabled`. +- `src/Explorer/Tree/treeNodeUtil.tsx` / `ResourceTreeAdapter.tsx` / `ResourceTree.tsx` + โ€” "My Notebooks" / "GitHub" tree nodes; `isNotebookEnabled` plumbing. +- `src/Explorer/SplashScreen/SplashScreen.tsx` โ€” notebook cards + `openNotebookTerminal` + for Postgres/VCoreMongo shells. +- `src/Explorer/Tabs/TerminalTab.tsx` โ€” chooses CloudShell vs notebook-server adapter. +- `src/Explorer/OpenActions/OpenActions.tsx`, `src/Explorer/ContextMenuButtonFactory.tsx`, + `src/Explorer/Tree/Collection.ts`, `src/Explorer/useSelectedNode.ts`, + `src/Explorer/MostRecentActivity/MostRecentActivity.ts` +- `src/hooks/useKnockoutExplorer.ts`, `src/hooks/useTabs.ts` +- `src/ConfigContext.ts`, `src/Common/Constants.ts`, `src/Contracts/DataModels.ts`, + `src/Contracts/ViewModels.ts`, `src/Contracts/ActionContracts.ts`, + `src/Platform/Hosted/extractFeatures.ts` (+ test) +- `src/Shared/Telemetry/TelemetryConstants.ts` +- `src/Localization/en/Resources.json` **and all non-English** `src/Localization//Resources.json` +- `webpack.config.js` โ€” `cellOutputViewer`, `connectToGitHub` entries + HTML plugins. +- `package.json` โ€” `@nteract/*`, `@jupyterlab/*`, `@phosphor/widgets`, `rx-jupyter`, + and other notebook-only dependencies. + +**Critical coupling โ€” Terminal / shells** +- `TerminalTab` uses `CloudShellTerminalComponentAdapter` when + `userContext.features.enableCloudShell`, otherwise `NotebookTerminalComponentAdapter` + (which needs a Phoenix-allocated notebook server + `terminal.html` iframe). +- Command-bar/splash shell buttons branch on + `useNotebook.getState().isShellEnabled || userContext.features.enableCloudShell`. +- `Explorer.openNotebookTerminal(...)` is the shared entry for opening shells and must + be retained (and rewired to CloudShell-only) โ€” only its notebook-server behavior is + removed. + +## Phased approach + +Each phase is independently buildable and shippable. Within each phase, **all +references to removed code are also removed** so the tree compiles. After every phase +run: `npm run compile`, `npm run compile:strict`, `npm run lint`, `npm run format:check`, +`npm test`, and a webpack build (`npm run build:ci`); manually verify the four shells +still open. + +### Phase 1 โ€” Decouple database shells to CloudShell-only +Remove the legacy Phoenix notebook-server terminal path so shells no longer depend on +notebook provisioning. +- Rewire `TerminalTab` to always use `CloudShellTerminalComponentAdapter`; delete the + `NotebookTerminalComponentAdapter` branch and `getNotebookServerInfo`. +- Delete `src/Explorer/Tabs/ShellAdapters/NotebookTerminalComponentAdapter.tsx` and + `src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx` (+ less/test/snapshot). +- Simplify shell buttons in `CommandBarComponentButtonFactory` and `SplashScreen` to + drop the `isShellEnabled` branch (CloudShell path only); keep `openNotebookTerminal`. +- Verify whether the `terminal`/`terminal.html` webpack entry is still needed by + CloudShell. If unused, remove it and `src/Terminal/`; otherwise keep. +- **Outcome:** Shells run purely on CloudShell. Phoenix no longer needed for terminals. + +### Phase 2 โ€” Remove the in-app notebook authoring & rendering experience +Delete the notebook tabs, the nteract rendering engine, panes, and the read-only viewer, +and remove all UI entry points that open notebooks. +- Delete: `src/Explorer/Notebook/NotebookComponent/`, + `src/Explorer/Notebook/NotebookRenderer/`, `src/Explorer/Notebook/SecurityWarningBar/`, + `NotebookClientV2.ts`, `notebookClientV2.test.ts`, `NotebookContentClient.ts`, + `NTeractUtil.ts`, `NotebookContentItem.ts`, `NotebookUtil.ts` (+ test), + `FileSystemUtil.ts`. +- Delete tabs/panes/viewer: `src/Explorer/Tabs/NotebookV2Tab.ts`, `NotebookTabBase.ts`, + `src/Explorer/Panes/CopyNotebookPane/`, `src/Explorer/Controls/NotebookViewer/`, + `src/CellOutputViewer/` (+ `cellOutputViewer` webpack entry & HTML plugin). +- Remove notebook entry points: "New Notebook"/open-notebook buttons in + `CommandBarComponentButtonFactory` (+ test), `OpenActions.tsx`, + `ContextMenuButtonFactory.tsx`, splash-screen notebook cards & recent-notebook items + (`MostRecentActivity` OpenNotebook type), and the `openNotebook*` / + `createNotebookContentItemFile` methods on `Explorer`. +- Remove notebook deps from `package.json`: `@nteract/*`, `@jupyterlab/*`, + `@phosphor/widgets`, `rx-jupyter` (and any now-unused transitive notebook-only libs). +- **Outcome:** Notebooks can no longer be authored, opened, or rendered. + +### Phase 3 โ€” Remove Schema Analyzer +- Delete `src/Explorer/Notebook/SchemaAnalyzer/` and `src/Explorer/Tabs/SchemaAnalyzerTab.ts`. +- Remove Schema Analyzer command-bar button and any tree/menu entry points. + +### Phase 4 โ€” Remove GitHub integration +- Delete `src/GitHub/`, `src/Explorer/Controls/GitHub/`, + `src/Explorer/Panes/GitHubReposPanel/`, `src/Utils/GitHubUtils.ts`, + `src/connectToGitHub.html`, and the `connectToGitHub` webpack entry & HTML plugin. +- Remove `gitHubOAuthService`, GitHub pinned-repo wiring, and `gitHubNotebooksContentRoot` + usage from `Explorer.tsx`, `useNotebook.ts`, `NotebookManager.tsx`, and `JunoClient` + pinned-repo methods. +- Remove GitHub-related localization keys from **all** locale files (`en` + non-English). + +### Phase 5 โ€” Remove Phoenix and the notebook container/allocation core +- Delete `src/Phoenix/`, `src/Explorer/Notebook/NotebookContainerClient.ts`, + `src/Explorer/Notebook/NotebookManager.tsx`, `src/Explorer/Notebook/useNotebook.ts`, + `src/Utils/NotebookConfigurationUtils.ts`, `src/hooks/useNotebookSnapshotStore.ts`. +- Remove from `Explorer.tsx`: `phoenixClient`, `notebookManager`, `_isInitializingNotebooks`, + `initNotebooks`, `initiateAndRefreshNotebookList`, `refreshNotebookList`, + `allocateContainer`, container heartbeat/connection logic, and notebook-server URL + feature overrides. +- Remove notebook tree nodes ("My Notebooks") and `isNotebookEnabled` plumbing from + `treeNodeUtil.tsx`, `ResourceTreeAdapter.tsx`, `ResourceTree.tsx`, `Collection.ts`, + `useSelectedNode.ts` (+ update tree snapshots/tests). +- Remove notebook initialization from `useKnockoutExplorer.ts` and notebook tab handling + in `useTabs.ts`. + +### Phase 6 โ€” Remove residual clients, config, contracts, telemetry & strings +- Delete `src/Juno/` and `src/Utils/arm/generatedClients/cosmosNotebooks/`. +- Remove notebook fields from `ConfigContext.ts`, `Constants.ts` (Notebook namespace), + `DataModels.ts` (notebook/Phoenix/container interfaces), `ViewModels.ts`, + `ActionContracts.ts`, and notebook feature flags from + `extractFeatures.ts` (+ update test). +- Remove notebook/Phoenix telemetry actions/areas from `TelemetryConstants.ts` (preserve + enum numbering if other systems depend on it โ€” mirror the cautious approach in + `a36467f4`). +- Remove remaining notebook strings from **all** locale `Resources.json` files (`en` + + every non-English locale) and any notebook images (e.g. `images/notebook/`). +- Final full build + test sweep; update `EndpointUtils.ts` (`allowedNotebookServerUrls`) + and any docs/comments referencing notebooks. + +## Cross-cutting verification (run after each phase) + +``` +npm run compile +npm run compile:strict +npm run lint +npm run format:check +npm test +npm run build:ci +``` +Plus manual smoke test: open Mongo, Cassandra, Postgres, and VCoreMongo shells. + +## Notes & considerations + +- **Strict null checks:** any file edited may need to stay in / be removed from + `tsconfig.strict.json`. Remove deleted files from that list. +- **Snapshots:** several Jest snapshots reference notebook UI + (`treeNodeUtil`, `SettingsComponent`, panel snapshots). Regenerate after edits. +- **Telemetry enum safety:** prior commit `a36467f4` deliberately reverted removal of + enum values to avoid breaking downstream consumers. Prefer leaving enum numeric values + intact unless confirmed safe to remove. +- **`enableCloudShell` feature flag:** confirm it is enabled in all target environments + before removing the Phoenix shell fallback, or shells will break. +- **E2E tests:** check `test/` for notebook/terminal specs to update or remove; shells + may have E2E coverage that needs the CloudShell-only path. +- **Reconcile** with branch `users/jawelton/remove-notebooks-terminal-052126` to avoid + rework, especially in Phase 1. diff --git a/package-lock.json b/package-lock.json index 385c69c6d..c172ed01c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -113,7 +113,7 @@ "react-youtube": "9.0.1", "reflect-metadata": "0.1.13", "rx-jupyter": "5.5.12", - "shell-quote": "1.7.3", + "shell-quote": "1.8.4", "styled-components": "5.0.1", "swr": "0.4.0", "terser-webpack-plugin": "5.3.9", @@ -122,7 +122,6 @@ "utility-types": "3.10.0", "uuid": "9.0.0", "web-vitals": "4.2.4", - "ws": "8.17.1", "zustand": "3.5.0" }, "devDependencies": { @@ -163,7 +162,7 @@ "@webpack-cli/serve": "2.0.5", "babel-jest": "29.7.0", "babel-loader": "8.1.0", - "brace-expansion": "1.1.12", + "brace-expansion": "1.1.15", "buffer": "5.1.0", "case-sensitive-paths-webpack-plugin": "2.4.0", "create-file-webpack": "1.0.2", @@ -214,7 +213,7 @@ "webpack-bundle-analyzer": "5.2.0", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", - "ws": "8.17.1" + "ws": "8.20.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -11604,10 +11603,11 @@ } }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", @@ -11617,7 +11617,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -11632,6 +11632,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -11641,6 +11642,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -11652,7 +11654,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.3.0", @@ -11679,9 +11682,10 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -12347,6 +12351,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15224,14 +15229,15 @@ } }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -15250,7 +15256,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -19459,27 +19465,6 @@ "node": ">=12" } }, - "node_modules/jest-environment-jsdom/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -22317,20 +22302,14 @@ "license": "Apache-2.0" }, "node_modules/launch-editor": { - "version": "2.6.1", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/launch-editor/node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" } }, "node_modules/leaflet": { @@ -22762,6 +22741,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -24033,7 +24013,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -24050,9 +24032,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -24129,6 +24111,24 @@ "version": "4.2.0", "license": "MIT" }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -24498,9 +24498,10 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -24585,6 +24586,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -24600,6 +24602,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -26303,8 +26306,16 @@ } }, "node_modules/shell-quote": { - "version": "1.7.3", - "license": "MIT" + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/shiki": { "version": "1.12.0", @@ -26524,7 +26535,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -27399,6 +27412,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -28278,27 +28292,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-cli": { "version": "5.1.4", "dev": true, @@ -29105,27 +29098,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -29503,10 +29475,11 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 19efa3a9b..9843793e6 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "react-youtube": "9.0.1", "reflect-metadata": "0.1.13", "rx-jupyter": "5.5.12", - "shell-quote": "1.7.3", + "shell-quote": "1.8.4", "styled-components": "5.0.1", "swr": "0.4.0", "terser-webpack-plugin": "5.3.9", @@ -117,7 +117,7 @@ "utility-types": "3.10.0", "uuid": "9.0.0", "web-vitals": "4.2.4", - "ws": "8.17.1", + "ws": "8.20.1", "zustand": "3.5.0" }, "overrides": { @@ -173,7 +173,7 @@ "@webpack-cli/serve": "2.0.5", "babel-jest": "29.7.0", "babel-loader": "8.1.0", - "brace-expansion": "1.1.12", + "brace-expansion": "1.1.15", "buffer": "5.1.0", "case-sensitive-paths-webpack-plugin": "2.4.0", "create-file-webpack": "1.0.2", @@ -224,7 +224,7 @@ "webpack-bundle-analyzer": "5.2.0", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", - "ws": "8.17.1" + "ws": "8.20.1" }, "scripts": { "postinstall": "patch-package && npm run generate:i18n-keys", diff --git a/preview/package-lock.json b/preview/package-lock.json index f2b68ac65..93cf042fd 100644 --- a/preview/package-lock.json +++ b/preview/package-lock.json @@ -695,7 +695,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" diff --git a/src/Common/ErrorHandlingUtils.ts b/src/Common/ErrorHandlingUtils.ts index 0f205eebc..6996f19cd 100644 --- a/src/Common/ErrorHandlingUtils.ts +++ b/src/Common/ErrorHandlingUtils.ts @@ -21,7 +21,6 @@ export const handleError = ( consoleErrorPrefix?: string, options?: HandleErrorOptions, ): void => { - console.log("{{cdbp}} in handleError(): raw error: " + stringifyError(error)); //CTODO in case a stray error happens const errorMessage = getErrorMessage(error); const errorCode = error instanceof ARMError ? error.code : undefined; diff --git a/src/Common/dataAccess/readDatabases.ts b/src/Common/dataAccess/readDatabases.ts index ace64c058..e9f43e65f 100644 --- a/src/Common/dataAccess/readDatabases.ts +++ b/src/Common/dataAccess/readDatabases.ts @@ -1,4 +1,3 @@ -import { stringifyError } from "Common/stringifyError"; import { CosmosDbArtifactType } from "Contracts/FabricMessagesContract"; import { isFabric, isFabricMirroredKey, isFabricNative } from "Platform/Fabric/FabricUtil"; import { AuthType } from "../../AuthType"; @@ -27,7 +26,6 @@ export async function readDatabases(): Promise { (userContext.fabricContext?.artifactInfo as FabricArtifactInfo[CosmosDbArtifactType.MIRRORED_KEY]).resourceTokenInfo .resourceTokens ) { - console.log("{{cdbp}} in readDatabases(): isFabricMirroredKey && has resourceTokens"); //CTODO should not get here const tokensData = (userContext.fabricContext.artifactInfo as FabricArtifactInfo[CosmosDbArtifactType.MIRRORED_KEY]) .resourceTokenInfo; @@ -61,7 +59,6 @@ export async function readDatabases(): Promise { clearMessage(); return databases; } else if (isFabricNative() && userContext.fabricContext?.databaseName) { - console.log("{{cdbp}} in readDatabases(): isFabricNative"); //CTODO should not get here const databaseId = userContext.fabricContext.databaseName; databases = [ { @@ -84,15 +81,9 @@ export async function readDatabases(): Promise { userContext.apiType !== "Tables" && !isFabric() ) { - console.log("{{cdbp}} in readDatabases(): authType == AAD, enableSDKOperations, apiType != Tables, !isFabric"); - console.log("{{cdbp}} in readDatabases(): databaseaccount: " + userContext.databaseAccount); - console.log("{{cdbp}} in readDatabases(): calling readDatabasesWithARM"); databases = await readDatabasesWithARM(); - console.log("{{cdbp}} in readDatabases(): done readDatabasesWithARM"); } else { - console.log("{{cdbp}} in readDatabases(): calling SDK"); const sdkResponse = await client().databases.readAll().fetchAll(); - console.log("{{cdbp}} in readDatabases(): done SDK"); databases = sdkResponse.resources as DataModels.Database[]; } } catch (error) { @@ -117,30 +108,22 @@ export async function readDatabasesWithARM(accountOverride?: { const accountName = accountOverride?.accountName ?? userContext?.databaseAccount?.name ?? ""; const apiType = accountOverride?.apiType ?? userContext.apiType; - try { - switch (apiType) { - case "SQL": - console.log("{{cdbp}} in readDatabasesWithARM(): calling listSqlDatabases"); - rpResponse = await listSqlDatabases(subscriptionId, resourceGroup, accountName); - console.log("{{cdbp}} in readDatabasesWithARM(): done listSqlDatabases"); - break; - case "Mongo": - rpResponse = await listMongoDBDatabases(subscriptionId, resourceGroup, accountName); - break; - case "Cassandra": - rpResponse = await listCassandraKeyspaces(subscriptionId, resourceGroup, accountName); - break; - case "Gremlin": - rpResponse = await listGremlinDatabases(subscriptionId, resourceGroup, accountName); - break; - default: - throw new Error(`Unsupported default experience type: ${apiType}`); - } - - console.log("{{cdbp}} in readDatabasesWithARM(): response: " + JSON.stringify(rpResponse)); - return rpResponse?.value?.map((database) => database.properties?.resource as DataModels.Database) ?? []; - } catch (error) { - console.log("{{cdbp}} in readDatabasesWithARM(): ERROR: " + stringifyError(error)); - throw error; + switch (apiType) { + case "SQL": + rpResponse = await listSqlDatabases(subscriptionId, resourceGroup, accountName); + break; + case "Mongo": + rpResponse = await listMongoDBDatabases(subscriptionId, resourceGroup, accountName); + break; + case "Cassandra": + rpResponse = await listCassandraKeyspaces(subscriptionId, resourceGroup, accountName); + break; + case "Gremlin": + rpResponse = await listGremlinDatabases(subscriptionId, resourceGroup, accountName); + break; + default: + throw new Error(`Unsupported default experience type: ${apiType}`); } + + return rpResponse?.value?.map((database) => database.properties?.resource as DataModels.Database) ?? []; } diff --git a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.less b/src/Explorer/Controls/Notebook/NotebookTerminalComponent.less deleted file mode 100644 index 305c8827c..000000000 --- a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.less +++ /dev/null @@ -1,13 +0,0 @@ -@import "../../../../less/Common/Constants"; - -.notebookTerminalContainer { - padding: @DefaultSpace; - height: 100%; - width: 100%; - - iframe { - border: none; - height: 100%; - width: 100%; - } -} \ No newline at end of file diff --git a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx b/src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx deleted file mode 100644 index bd816ac31..000000000 --- a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { shallow } from "enzyme"; -import React from "react"; -import * as DataModels from "../../../Contracts/DataModels"; -import { NotebookTerminalComponent, NotebookTerminalComponentProps } from "./NotebookTerminalComponent"; - -const testAccount: DataModels.DatabaseAccount = { - id: "id", - kind: "kind", - location: "location", - name: "name", - properties: { - documentEndpoint: "https://testDocumentEndpoint.azure.com/", - }, - type: "type", -}; - -const testMongo32Account: DataModels.DatabaseAccount = { - ...testAccount, -}; - -const testMongo36Account: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - mongoEndpoint: "https://testMongoEndpoint.azure.com/", - }, -}; - -const testCassandraAccount: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - cassandraEndpoint: "https://testCassandraEndpoint.azure.com/", - }, -}; - -const testPostgresAccount: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - postgresqlEndpoint: "https://testPostgresEndpoint.azure.com/", - }, -}; - -const testVCoreMongoAccount: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - vcoreMongoEndpoint: "https://testVCoreMongoEndpoint.azure.com/", - }, -}; - -const testNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com", - forwardingId: "Id", -}; - -const testMongoNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/mongo", - forwardingId: "Id", -}; - -const testCassandraNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/cassandra", - forwardingId: "Id", -}; - -const testPostgresNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/postgresql", - forwardingId: "Id", -}; - -const testVCoreMongoNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/mongovcore", - forwardingId: "Id", -}; - -describe("NotebookTerminalComponent", () => { - it("renders terminal", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testAccount, - notebookServerInfo: testNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders mongo 3.2 shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testMongo32Account, - notebookServerInfo: testMongoNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders mongo 3.6 shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testMongo36Account, - notebookServerInfo: testMongoNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders cassandra shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testCassandraAccount, - notebookServerInfo: testCassandraNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders Postgres shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testPostgresAccount, - notebookServerInfo: testPostgresNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders vCore Mongo shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testVCoreMongoAccount, - notebookServerInfo: testVCoreMongoNotebookServerInfo, - tabId: undefined, - username: "username", - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); -}); diff --git a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx b/src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx deleted file mode 100644 index 96d41155e..000000000 --- a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Wrapper around Notebook server terminal - */ - -import { useTerminal } from "hooks/useTerminal"; -import postRobot from "post-robot"; -import * as React from "react"; -import * as DataModels from "../../../Contracts/DataModels"; -import { TerminalProps } from "../../../Terminal/TerminalProps"; -import { userContext } from "../../../UserContext"; -import * as StringUtils from "../../../Utils/StringUtils"; - -export interface NotebookTerminalComponentProps { - notebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo; - databaseAccount: DataModels.DatabaseAccount; - tabId: string; - username?: string; -} - -export class NotebookTerminalComponent extends React.Component { - private terminalWindow: Window; - - constructor(props: NotebookTerminalComponentProps) { - super(props); - } - - componentDidMount(): void { - this.sendPropsToTerminalFrame(); - } - - public render(): JSX.Element { - return ( -
-