├── src ├── webviews │ ├── src │ │ ├── hooks │ │ │ └── index.ts │ │ ├── modules │ │ │ ├── config │ │ │ │ └── index.ts │ │ │ ├── eula │ │ │ │ ├── index.ts │ │ │ │ └── styles.module.scss │ │ │ ├── settings │ │ │ │ ├── index.ts │ │ │ │ └── styles.module.scss │ │ │ ├── keys-tree │ │ │ │ ├── utils │ │ │ │ │ └── index.ts │ │ │ │ ├── components │ │ │ │ │ ├── node │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── key-row-name │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── key-row-type │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── styles.module.scss │ │ │ │ │ │ └── KeyRowType.tsx │ │ │ │ │ ├── key-row-delete │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── keys-summary │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── keys-tree-filter │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── database-wrapper │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── keys-tree-header │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── logical-database-wrapper │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ └── virtual-tree │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ ├── index.ts │ │ │ │ ├── constants │ │ │ │ │ └── index.ts │ │ │ │ └── styles.module.scss │ │ │ ├── cli │ │ │ │ ├── components │ │ │ │ │ ├── cli-history │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── cli-body │ │ │ │ │ │ ├── cli-body │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── cli-input │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── cli-input │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ │ └── cli-autocomplete │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ ├── index.ts │ │ │ │ ├── utils │ │ │ │ │ ├── index.ts │ │ │ │ │ └── textFormatters.ts │ │ │ │ └── constants.ts │ │ │ ├── database-panel │ │ │ │ ├── index.ts │ │ │ │ ├── database-connections │ │ │ │ │ └── index.ts │ │ │ │ ├── styles.module.scss │ │ │ │ └── DatabasePanel.spec.tsx │ │ │ ├── oauth │ │ │ │ ├── shared │ │ │ │ │ ├── oauth-form │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── components │ │ │ │ │ │ │ └── oauth-sso-form │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── oauth-agreement │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── oauth-advantages │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── OAuthAdvantages.spec.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── oauth-social-buttons │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── oauth-recommended-settings │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ └── index.ts │ │ │ │ ├── oauth-jobs │ │ │ │ │ └── index.ts │ │ │ │ ├── oauth-sso-dialog │ │ │ │ │ ├── index.ts │ │ │ │ │ └── styles.module.scss │ │ │ │ ├── oauth-sso │ │ │ │ │ ├── index.ts │ │ │ │ │ └── oauth-create-db │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ ├── oauth-select-plan │ │ │ │ │ └── index.ts │ │ │ │ ├── oauth-create-free-db │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── key-details │ │ │ │ ├── components │ │ │ │ │ ├── rejson-details │ │ │ │ │ │ ├── utils │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── add-item │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── add-item-field-action │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── edit-entire-item-action │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── edit-item-field-action │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── rejson-details │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── rejson-object │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── rejson-scalar │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── styles.scss │ │ │ │ │ │ ├── rejson-dynamic-types │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── RejsonDynamicTypes.spec.tsx │ │ │ │ │ │ └── constants.ts │ │ │ │ │ ├── hash-details │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── add-hash-fields │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── hash-details-table │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── list-details │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── add-list-elements │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── list-details-table │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ │ ├── remove-list-elements │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── set-details │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── add-set-members │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── set-details-table │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── SetDetails.spec.tsx │ │ │ │ │ ├── zset-details │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── add-zset-members │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── zset-details-table │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ │ └── ZSetDetails.spec.tsx │ │ │ │ │ ├── dynamic-type-details │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── unsupported-type-details │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── styles.module.scss │ │ │ │ │ │ └── UnsupportedTypeDetails.spec.tsx │ │ │ │ │ ├── string-details │ │ │ │ │ │ ├── string-details-value │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── constants │ │ │ │ │ │ │ └── string.ts │ │ │ │ │ │ ├── utils │ │ │ │ │ │ │ ├── calculateTextareaLines.ts │ │ │ │ │ │ │ ├── useStringSelector.ts │ │ │ │ │ │ │ └── tests │ │ │ │ │ │ │ │ └── calculateTextareaLines.spec.ts │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ └── key-details-actions │ │ │ │ │ │ ├── styles.module.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── add-items-action │ │ │ │ │ │ └── AddItemsAction.spec.tsx │ │ │ │ │ │ ├── edit-item-action │ │ │ │ │ │ └── EditItemAction.spec.tsx │ │ │ │ │ │ └── remove-items-action │ │ │ │ │ │ └── RemoveItemsAction.spec.tsx │ │ │ │ ├── shared │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── editable-input │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ └── editable-textarea │ │ │ │ │ │ └── styles.module.scss │ │ │ │ └── index.ts │ │ │ ├── manual-connection │ │ │ │ ├── index.ts │ │ │ │ └── manual-connection-form │ │ │ │ │ └── index.ts │ │ │ ├── add-key │ │ │ │ ├── constants │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── keys.ts │ │ │ │ │ └── key-type-options.ts │ │ │ │ ├── components │ │ │ │ │ ├── AddKeyHash │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── constants.ts │ │ │ │ │ ├── AddKeySet │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── constants.ts │ │ │ │ │ ├── AddKeyZSet │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── constants.ts │ │ │ │ │ └── AddKeyCommonFields │ │ │ │ │ │ └── styles.module.scss │ │ │ │ ├── index.ts │ │ │ │ └── styles.module.scss │ │ │ ├── common-app-subscription │ │ │ │ └── index.ts │ │ │ ├── key-details-header │ │ │ │ ├── components │ │ │ │ │ ├── key-details-header-name │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ ├── key-details-header-ttl │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── KeyDetailsHeaderTTL.spec.tsx │ │ │ │ │ ├── key-details-header-formatter │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ └── key-details-header-size-length │ │ │ │ │ │ ├── styles.module.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── KeyDetailsHeaderSizeLength.spec.tsx │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── utils │ │ │ ├── notifications │ │ │ │ └── index.ts │ │ │ ├── decompressors │ │ │ │ ├── index.ts │ │ │ │ └── tests │ │ │ │ │ └── index.ts │ │ │ ├── core │ │ │ │ ├── regex.ts │ │ │ │ ├── index.ts │ │ │ │ ├── links.ts │ │ │ │ ├── statuses.ts │ │ │ │ └── tests │ │ │ │ │ └── apiResponse.spec.ts │ │ │ ├── dom │ │ │ │ ├── index.ts │ │ │ │ ├── scrollIntoView.ts │ │ │ │ └── downloadFile.ts │ │ │ ├── telemetry │ │ │ │ └── index.ts │ │ │ ├── vscode │ │ │ │ ├── index.ts │ │ │ │ └── windowMessage.ts │ │ │ ├── formatters │ │ │ │ ├── index.ts │ │ │ │ ├── textFormatters.ts │ │ │ │ └── json.ts │ │ │ ├── comparisons │ │ │ │ └── index.ts │ │ │ ├── keys │ │ │ │ ├── index.ts │ │ │ │ ├── groupTypes.ts │ │ │ │ ├── tree.ts │ │ │ │ └── numbers.ts │ │ │ ├── transformers │ │ │ │ ├── index.ts │ │ │ │ ├── removeEmpty.ts │ │ │ │ ├── core.ts │ │ │ │ └── tests │ │ │ │ │ ├── removeEmpty.spec.ts │ │ │ │ │ └── core.spec.ts │ │ │ ├── events │ │ │ │ ├── index.ts │ │ │ │ └── selectOnFocus.ts │ │ │ ├── database │ │ │ │ ├── getDatabaseId.ts │ │ │ │ ├── index.ts │ │ │ │ ├── getEncoding.ts │ │ │ │ └── getUrlDatabase.ts │ │ │ ├── index.ts │ │ │ └── table │ │ │ │ └── tests │ │ │ │ └── column.spec.ts │ │ ├── pages │ │ │ ├── CliPage │ │ │ │ ├── index.ts │ │ │ │ ├── CliPage.spec.tsx │ │ │ │ └── CliPage.tsx │ │ │ ├── EulaPage │ │ │ │ ├── index.ts │ │ │ │ └── EulaPage.spec.tsx │ │ │ ├── MainPage │ │ │ │ ├── index.ts │ │ │ │ ├── MainPage.spec.tsx │ │ │ │ └── MainPage.tsx │ │ │ ├── AddKeyPage │ │ │ │ ├── index.ts │ │ │ │ ├── AddKeyPage.spec.tsx │ │ │ │ └── AddKeyPage.tsx │ │ │ ├── SidebarPage │ │ │ │ ├── index.ts │ │ │ │ └── SidebarPage.spec.tsx │ │ │ ├── WelcomePage │ │ │ │ ├── index.ts │ │ │ │ ├── WelcomePage.spec.tsx │ │ │ │ └── styles.module.scss │ │ │ ├── NotFoundPage │ │ │ │ ├── index.ts │ │ │ │ ├── NotFoundPage.tsx │ │ │ │ └── NotFoundPage.spec.tsx │ │ │ ├── SettingsPage │ │ │ │ ├── index.ts │ │ │ │ ├── SettingsPage.tsx │ │ │ │ └── SettingsPage.spec.tsx │ │ │ ├── AddDatabasePage │ │ │ │ └── index.ts │ │ │ ├── KeyDetailsPage │ │ │ │ ├── index.ts │ │ │ │ └── KeyDetailsPage.spec.tsx │ │ │ ├── EditDatabasePage │ │ │ │ ├── index.ts │ │ │ │ └── EditDatabasePage.spec.tsx │ │ │ └── index.ts │ │ ├── components │ │ │ ├── scan-more │ │ │ │ ├── index.ts │ │ │ │ └── styles.module.scss │ │ │ ├── no-databases │ │ │ │ └── index.ts │ │ │ ├── consents-option │ │ │ │ ├── index.ts │ │ │ │ └── ConsentsOption.spec.tsx │ │ │ ├── no-keys-message │ │ │ │ ├── index.ts │ │ │ │ └── styles.module.scss │ │ │ ├── notifications │ │ │ │ ├── global-toasts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── GlobalToasts.tsx │ │ │ │ │ └── styles.module.scss │ │ │ │ └── infinite-messages │ │ │ │ │ └── index.ts │ │ │ ├── virtual-table │ │ │ │ ├── index.ts │ │ │ │ ├── components │ │ │ │ │ ├── table-column-search │ │ │ │ │ │ └── styles.module.scss │ │ │ │ │ └── table-column-search-trigger │ │ │ │ │ │ └── styles.module.scss │ │ │ │ └── utils.tsx │ │ │ ├── consents-privacy │ │ │ │ ├── index.ts │ │ │ │ └── interface.ts │ │ │ ├── monaco-editor │ │ │ │ ├── index.ts │ │ │ │ ├── MonacoEditor.spec.tsx │ │ │ │ ├── components │ │ │ │ │ └── monaco-json │ │ │ │ │ │ ├── MonacoJson.spec.tsx │ │ │ │ │ │ └── MonacoJson.tsx │ │ │ │ └── interfaces.ts │ │ │ ├── field-message │ │ │ │ ├── styles.module.scss │ │ │ │ └── FieldMessage.spec.tsx │ │ │ ├── database-form │ │ │ │ ├── index.ts │ │ │ │ └── Messages.tsx │ │ │ ├── popover-delete │ │ │ │ └── styles.module.scss │ │ │ ├── monaco-languages │ │ │ │ ├── MonacoLanguages.spec.tsx │ │ │ │ └── json │ │ │ │ │ └── jsonLanguageConfig.ts │ │ │ ├── upload-file │ │ │ │ └── styles.module.scss │ │ │ ├── inline-editor │ │ │ │ └── InlineEditor.spec.tsx │ │ │ ├── multi-select │ │ │ │ └── MultiSelect.spec.tsx │ │ │ ├── super-select │ │ │ │ └── components │ │ │ │ │ └── removable-option │ │ │ │ │ └── RemovableOption.spec.tsx │ │ │ ├── auto-refresh │ │ │ │ └── utils.ts │ │ │ └── database-modules │ │ │ │ └── styles.module.scss │ │ ├── ui │ │ │ ├── spinner │ │ │ │ └── styles.module.scss │ │ │ ├── json-viewer │ │ │ │ ├── components │ │ │ │ │ ├── json-array │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── json-object │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── json-pretty │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── json-primitive │ │ │ │ │ │ └── index.ts │ │ │ │ ├── utils.ts │ │ │ │ ├── interfaces.ts │ │ │ │ └── JSONViewer.spec.tsx │ │ │ ├── separator │ │ │ │ ├── styles.module.scss │ │ │ │ ├── Separator.spec.tsx │ │ │ │ └── Separator.tsx │ │ │ ├── button │ │ │ │ ├── styles.module.scss │ │ │ │ ├── RiButton.spec.tsx │ │ │ │ └── RiButton.tsx │ │ │ ├── spacer │ │ │ │ ├── styles.module.scss │ │ │ │ ├── Spacer.spec.tsx │ │ │ │ └── Spacer.tsx │ │ │ ├── link │ │ │ │ ├── styles.module.scss │ │ │ │ ├── Link.spec.tsx │ │ │ │ └── Link.tsx │ │ │ ├── radio-group │ │ │ │ └── styles.module.scss │ │ │ ├── tooltip │ │ │ │ └── Tooltip.spec.tsx │ │ │ ├── checkbox │ │ │ │ └── Checkbox.spec.tsx │ │ │ ├── text-area │ │ │ │ ├── TextArea.spec.tsx │ │ │ │ └── styles.module.scss │ │ │ ├── icons │ │ │ │ ├── chevron │ │ │ │ │ ├── Chevron.spec.tsx │ │ │ │ │ └── Chevron.tsx │ │ │ │ └── database │ │ │ │ │ └── DatabaseIcon.spec.tsx │ │ │ ├── input-text │ │ │ │ ├── InputText.spec.tsx │ │ │ │ └── styles.module.scss │ │ │ ├── promo-link │ │ │ │ └── styles.module.scss │ │ │ └── refresh-btn │ │ │ │ └── RefreshBtn.spec.tsx │ │ ├── styles │ │ │ ├── base │ │ │ │ ├── _base.scss │ │ │ │ ├── _form.scss │ │ │ │ └── _select.scss │ │ │ ├── main.scss │ │ │ └── components │ │ │ │ ├── _components.scss │ │ │ │ ├── _popup.scss │ │ │ │ ├── _react-select_overrides.scss │ │ │ │ └── _monaco.scss │ │ ├── constants │ │ │ ├── monaco │ │ │ │ └── monacoLanguage.ts │ │ │ ├── cli │ │ │ │ ├── index.ts │ │ │ │ └── cliOutputConstants.ts │ │ │ ├── sockets │ │ │ │ ├── socketErrors.ts │ │ │ │ └── socketEvents.ts │ │ │ ├── window │ │ │ │ ├── popover.ts │ │ │ │ ├── table.ts │ │ │ │ └── keys.ts │ │ │ ├── core │ │ │ │ ├── eventKeys.ts │ │ │ │ ├── app.ts │ │ │ │ └── apiErrors.ts │ │ │ ├── keys │ │ │ │ ├── selectedKey.ts │ │ │ │ ├── detailsHeader.ts │ │ │ │ ├── tree.ts │ │ │ │ └── formatters.ts │ │ │ ├── database │ │ │ │ ├── connections.ts │ │ │ │ ├── commandsVersions.ts │ │ │ │ └── validationErrors.ts │ │ │ ├── validators │ │ │ │ └── validations.ts │ │ │ ├── cloud │ │ │ │ └── oauth.ts │ │ │ └── connections │ │ │ │ └── databases.ts │ │ ├── types │ │ │ ├── css.d.ts │ │ │ └── index.d.ts │ │ ├── interfaces │ │ │ ├── vscode │ │ │ │ └── toolkit.ts │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ └── keys │ │ │ │ └── key.ts │ │ ├── actions │ │ │ ├── addDatabaseAction.ts │ │ │ ├── refreshTreeAction.ts │ │ │ ├── setSelectedKeyAction.ts │ │ │ ├── setDatabaseAction.ts │ │ │ ├── index.ts │ │ │ ├── tests │ │ │ │ ├── processCliAction.spec.ts │ │ │ │ └── selectKeyAction.spec.ts │ │ │ └── processCliAction.ts │ │ ├── services │ │ │ ├── index.ts │ │ │ ├── databaseService.ts │ │ │ └── migrateStorageData.ts │ │ ├── vite-env.d.ts │ │ ├── store │ │ │ ├── zustandTypes.ts │ │ │ ├── hooks │ │ │ │ └── use-certificates-store │ │ │ │ │ └── interface.ts │ │ │ ├── index.ts │ │ │ └── selectors.ts │ │ ├── assets │ │ │ ├── icons │ │ │ │ ├── raw_mode.svg │ │ │ │ ├── version.svg │ │ │ │ ├── connection.svg │ │ │ │ ├── group_mode.svg │ │ │ │ ├── snooze.svg │ │ │ │ ├── star.svg │ │ │ │ ├── stars.svg │ │ │ │ ├── data-upload-bulk.svg │ │ │ │ ├── treeview.svg │ │ │ │ ├── send.svg │ │ │ │ ├── like.svg │ │ │ │ ├── user.svg │ │ │ │ └── dislike.svg │ │ │ └── oauth │ │ │ │ ├── cloud_centered.svg │ │ │ │ ├── cloud.svg │ │ │ │ └── azure_provider.svg │ │ ├── custom.d.ts │ │ └── mocks │ │ │ └── data │ │ │ └── oauth.ts │ ├── public │ │ └── favicon.ico │ ├── test │ │ ├── handlers │ │ │ ├── oauth │ │ │ │ ├── index.ts │ │ │ │ └── oauthHandlers.ts │ │ │ ├── database │ │ │ │ ├── index.ts │ │ │ │ └── certificatesHandlers.ts │ │ │ ├── app │ │ │ │ ├── index.ts │ │ │ │ └── telemetry.ts │ │ │ ├── index.ts │ │ │ └── browser │ │ │ │ ├── index.ts │ │ │ │ ├── stringHandlers.ts │ │ │ │ └── selectedKeyHandlers.ts │ │ ├── helpers │ │ │ └── index.ts │ │ ├── server.ts │ │ ├── res │ │ │ └── responseComposition.ts │ │ └── init.ts │ └── index.html ├── lib │ ├── index.ts │ ├── cloud_oauth_callback │ │ ├── favicon.png │ │ └── fonts │ │ │ ├── Graphik-Medium.woff2 │ │ │ └── Graphik-Regular.woff2 │ └── auth │ │ ├── auth.factory.ts │ │ ├── models │ │ ├── cloud-auth-response.ts │ │ ├── session.ts │ │ └── cloud-auth-request.ts │ │ └── auth.interface.ts ├── resources │ └── 256x256.png ├── utils │ ├── index.ts │ ├── wrapErrorSensitiveData.ts │ ├── handleUri.ts │ └── utils.ts └── constants.ts ├── tests └── e2e │ ├── .vscodeignore │ ├── rte │ ├── openvpn │ │ ├── openvpn-data │ │ │ └── conf │ │ │ │ ├── pki │ │ │ │ ├── index.txt.attr │ │ │ │ ├── index.txt.attr.old │ │ │ │ ├── serial │ │ │ │ ├── serial.old │ │ │ │ ├── index.txt.old │ │ │ │ ├── index.txt │ │ │ │ ├── dh.pem │ │ │ │ ├── crl.pem │ │ │ │ └── ta.key │ │ │ │ ├── crl.pem │ │ │ │ └── openvpn.conf.1636357834.bak │ │ └── docker-compose.yml │ ├── ssh │ │ └── keys │ │ │ ├── pub │ │ │ ├── test.pub │ │ │ └── testp.pub │ │ │ ├── test │ │ │ └── testp │ ├── redis-enterprise │ │ ├── db.json │ │ └── Dockerfile │ ├── oss-standalone-big │ │ ├── entrypoint.sh │ │ └── Dockerfile │ ├── oss-cluster-7-rs │ │ ├── creator.Dockerfile │ │ ├── cluster-create.sh │ │ └── Dockerfile │ ├── oss-cluster-7 │ │ ├── creator.Dockerfile │ │ ├── cluster-create.sh │ │ └── Dockerfile │ ├── oss-sentinel │ │ ├── Dockerfile │ │ ├── entrypoint.sh │ │ └── sentinel.conf │ └── oss-standalone-tls │ │ └── Dockerfile │ ├── static.ts │ ├── static-server.Dockerfile │ ├── src │ ├── helpers │ │ ├── index.ts │ │ ├── api │ │ │ ├── index.ts │ │ │ └── Eula.ts │ │ ├── common-actions │ │ │ ├── index.ts │ │ │ └── actions │ │ │ │ └── index.ts │ │ └── CommonDriverExtension.ts │ ├── page-objects │ │ └── components │ │ │ ├── common │ │ │ └── InputWithButtons.ts │ │ │ ├── editor-view │ │ │ ├── WelcomeView.ts │ │ │ └── StringKeyDetailsView.ts │ │ │ └── tree-view │ │ │ └── EmptyDatabaseView.ts │ └── test-data │ │ └── upload-json │ │ └── sample.json │ ├── settings.json │ ├── .gitignore │ ├── README.md │ ├── .eslintignore │ ├── tsconfig.json │ ├── wait-for-redis.sh │ └── .mocharc.js ├── .github ├── Redis_for_VS_Code_main_screen.png ├── build │ └── sum_sha256.sh ├── CODEOWNERS ├── workflows │ ├── weekly.yml │ └── release-stage.yml ├── actions │ ├── download-backend │ │ └── action.yml │ └── install-all-build-libs │ │ └── action.yml ├── e2e │ └── test.app.sh └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── .gitattributes ├── .editorconfig ├── postcss.config.js ├── .prettierrc ├── pull_request_template.md ├── .vscode └── extensions.json ├── tsconfig.json ├── patches └── react-virtualized+9.22.5.patch ├── tailwind.config.js └── .vscodeignore /src/webviews/src/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useWebworkers' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Config' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/eula/index.ts: -------------------------------------------------------------------------------- 1 | export { Eula } from './Eula' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/settings/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Settings' 2 | -------------------------------------------------------------------------------- /src/webviews/src/utils/notifications/index.ts: -------------------------------------------------------------------------------- 1 | export * from './toasts' 2 | -------------------------------------------------------------------------------- /tests/e2e/.vscodeignore: -------------------------------------------------------------------------------- 1 | src/** 2 | test-resources/** 3 | test-extensions/** -------------------------------------------------------------------------------- /src/webviews/src/pages/CliPage/index.ts: -------------------------------------------------------------------------------- 1 | export { CliPage } from './CliPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/EulaPage/index.ts: -------------------------------------------------------------------------------- 1 | export { EulaPage } from './EulaPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/MainPage/index.ts: -------------------------------------------------------------------------------- 1 | export { MainPage } from './MainPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/utils/decompressors/index.ts: -------------------------------------------------------------------------------- 1 | export * from './decompressors' 2 | -------------------------------------------------------------------------------- /src/webviews/src/utils/decompressors/tests/index.ts: -------------------------------------------------------------------------------- 1 | export * from './constants' 2 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/openvpn-data/conf/pki/index.txt.attr: -------------------------------------------------------------------------------- 1 | unique_subject = no 2 | -------------------------------------------------------------------------------- /src/webviews/src/components/scan-more/index.ts: -------------------------------------------------------------------------------- 1 | export { ScanMore } from './ScanMore' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './parseResponse' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/AddKeyPage/index.ts: -------------------------------------------------------------------------------- 1 | export { AddKeyPage } from './AddKeyPage' 2 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/openvpn-data/conf/pki/index.txt.attr.old: -------------------------------------------------------------------------------- 1 | unique_subject = no 2 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/openvpn-data/conf/pki/serial: -------------------------------------------------------------------------------- 1 | 8055804ACAE0109030FB7947F31147AA 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-history/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CliHistory' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/node/index.ts: -------------------------------------------------------------------------------- 1 | export { Node } from './Node' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/SidebarPage/index.ts: -------------------------------------------------------------------------------- 1 | export { SidebarPage } from './SidebarPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/WelcomePage/index.ts: -------------------------------------------------------------------------------- 1 | export { WelcomePage } from './WelcomePage' 2 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/openvpn-data/conf/pki/serial.old: -------------------------------------------------------------------------------- 1 | 8055804acae0109030fb7947f31147a9 2 | -------------------------------------------------------------------------------- /src/webviews/src/components/no-databases/index.ts: -------------------------------------------------------------------------------- 1 | export { NoDatabases } from './NoDatabases' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-body/cli-body/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CliBody' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-body/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CliBodyWrapper' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-input/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CliInputWrapper' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Cli' 2 | export * from './constants' 3 | -------------------------------------------------------------------------------- /src/webviews/src/pages/NotFoundPage/index.ts: -------------------------------------------------------------------------------- 1 | export { NotFoundPage } from './NotFoundPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/SettingsPage/index.ts: -------------------------------------------------------------------------------- 1 | export { SettingsPage } from './SettingsPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-input/cli-input/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CliInput' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/database-panel/index.ts: -------------------------------------------------------------------------------- 1 | export { DatabasePanel } from './DatabasePanel' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/key-row-name/index.ts: -------------------------------------------------------------------------------- 1 | export * from './KeyRowName' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/key-row-type/index.ts: -------------------------------------------------------------------------------- 1 | export * from './KeyRowType' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-form/index.ts: -------------------------------------------------------------------------------- 1 | export { OAuthForm } from './OAuthForm' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/AddDatabasePage/index.ts: -------------------------------------------------------------------------------- 1 | export { AddDatabasePage } from './AddDatabasePage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/KeyDetailsPage/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyDetailsPage } from './KeyDetailsPage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/components/consents-option/index.ts: -------------------------------------------------------------------------------- 1 | export { ConsentsOption } from './ConsentsOption' 2 | -------------------------------------------------------------------------------- /src/webviews/src/components/no-keys-message/index.ts: -------------------------------------------------------------------------------- 1 | export { NoKeysMessage } from './NoKeysMessage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/key-row-delete/index.ts: -------------------------------------------------------------------------------- 1 | export * from './KeyRowDelete' 2 | -------------------------------------------------------------------------------- /src/webviews/src/pages/EditDatabasePage/index.ts: -------------------------------------------------------------------------------- 1 | export { EditDatabasePage } from './EditDatabasePage' 2 | -------------------------------------------------------------------------------- /src/webviews/src/ui/spinner/styles.module.scss: -------------------------------------------------------------------------------- 1 | .bar { 2 | @apply w-full absolute #{!important}; 3 | } 4 | -------------------------------------------------------------------------------- /src/webviews/src/utils/core/regex.ts: -------------------------------------------------------------------------------- 1 | export const IS_ABSOLUTE_PATH = new RegExp('^(?:[a-z]+:)?//', 'i') 2 | -------------------------------------------------------------------------------- /src/webviews/src/utils/dom/index.ts: -------------------------------------------------------------------------------- 1 | export * from './scrollIntoView' 2 | export * from './downloadFile' 3 | -------------------------------------------------------------------------------- /src/webviews/src/utils/telemetry/index.ts: -------------------------------------------------------------------------------- 1 | export * from './telemetryUtils' 2 | export * from './events' 3 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from './workspace/workspaceState' 2 | export * from './update/checkVersionUpdate' 3 | -------------------------------------------------------------------------------- /src/resources/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis/Redis-for-VS-Code/HEAD/src/resources/256x256.png -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-input/cli-autocomplete/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CliAutocomplete' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/manual-connection/index.ts: -------------------------------------------------------------------------------- 1 | export { ManualConnection } from './ManualConnection' 2 | -------------------------------------------------------------------------------- /src/webviews/src/styles/base/_base.scss: -------------------------------------------------------------------------------- 1 | a { 2 | @apply text-vscode-textLink-foreground #{!important}; 3 | } 4 | -------------------------------------------------------------------------------- /src/webviews/src/components/notifications/global-toasts/index.ts: -------------------------------------------------------------------------------- 1 | export { GlobalToasts } from './GlobalToasts' 2 | -------------------------------------------------------------------------------- /src/webviews/src/constants/monaco/monacoLanguage.ts: -------------------------------------------------------------------------------- 1 | export enum MonacoLanguage { 2 | Json = 'ri-json', 3 | } 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './keys' 2 | export * from './key-type-options' 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/hash-details/index.ts: -------------------------------------------------------------------------------- 1 | export { HashDetails } from './HashDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/list-details/index.ts: -------------------------------------------------------------------------------- 1 | export { ListDetails } from './ListDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/set-details/index.ts: -------------------------------------------------------------------------------- 1 | export { SetDetails } from './SetDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/zset-details/index.ts: -------------------------------------------------------------------------------- 1 | export { ZSetDetails } from './ZSetDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/keys-summary/index.ts: -------------------------------------------------------------------------------- 1 | export { KeysSummary } from './KeysSummary' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/index.ts: -------------------------------------------------------------------------------- 1 | export { KeysTree } from './KeysTree' 2 | export * from './components' 3 | -------------------------------------------------------------------------------- /src/webviews/src/utils/vscode/index.ts: -------------------------------------------------------------------------------- 1 | export { showErrorMessage, showInformationMessage } from './windowMessage' 2 | -------------------------------------------------------------------------------- /src/webviews/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis/Redis-for-VS-Code/HEAD/src/webviews/public/favicon.ico -------------------------------------------------------------------------------- /src/webviews/src/constants/cli/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cliOutputComponents' 2 | export * from './cliOutputConstants' 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/keys-tree-filter/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyTreeFilter } from './KeyTreeFilter' 2 | -------------------------------------------------------------------------------- /tests/e2e/rte/ssh/keys/pub/test.pub: -------------------------------------------------------------------------------- 1 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPXS0xkxY7o+MUNBJJnf6fKh6AFFpzB0YIfifHSSseXw 2 | -------------------------------------------------------------------------------- /tests/e2e/rte/ssh/keys/pub/testp.pub: -------------------------------------------------------------------------------- 1 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEs/ewkUXl0+uDr7hxSM2vURqdRNFHm7+x05azzW/Yzu 2 | -------------------------------------------------------------------------------- /src/webviews/src/constants/sockets/socketErrors.ts: -------------------------------------------------------------------------------- 1 | export enum SocketErrors { 2 | TransportError = 'TransportError', 3 | } 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/common-app-subscription/index.ts: -------------------------------------------------------------------------------- 1 | export { CommonAppSubscription } from './CommonAppSubscription' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/database-wrapper/index.ts: -------------------------------------------------------------------------------- 1 | export { DatabaseWrapper } from './DatabaseWrapper' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/keys-tree-header/index.ts: -------------------------------------------------------------------------------- 1 | export { KeysTreeHeader } from './KeysTreeHeader' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/constants/index.ts: -------------------------------------------------------------------------------- 1 | export const PADDING_LEVEL = 22 2 | export const MIN_NODE_WIDTH = 100 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-jobs/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthJobs from './OAuthJobs' 2 | 3 | export default OAuthJobs 4 | -------------------------------------------------------------------------------- /src/webviews/src/components/virtual-table/index.ts: -------------------------------------------------------------------------------- 1 | export { VirtualTable } from './VirtualTable' 2 | 3 | export * from './utils' 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/database-panel/database-connections/index.ts: -------------------------------------------------------------------------------- 1 | export { DatabaseConnections } from './DatabaseConnections' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/components/add-item/index.ts: -------------------------------------------------------------------------------- 1 | export { AddItem } from './AddItem' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './keys-tree-header' 2 | export * from './database-wrapper' 3 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/openvpn-data/conf/pki/index.txt.old: -------------------------------------------------------------------------------- 1 | V 240211074915Z 139D258986D24CF7F2000F4365EA7CDE unknown /CN=localhost 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/hash-details/add-hash-fields/index.ts: -------------------------------------------------------------------------------- 1 | export { AddHashFields } from './AddHashFields' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/index.ts: -------------------------------------------------------------------------------- 1 | export { RejsonDetailsWrapper } from './RejsonDetailsWrapper' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/rejson-details/index.ts: -------------------------------------------------------------------------------- 1 | export { RejsonDetails } from './RejsonDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/rejson-object/index.ts: -------------------------------------------------------------------------------- 1 | export { RejsonObject } from './RejsonObject' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/rejson-scalar/index.ts: -------------------------------------------------------------------------------- 1 | export { RejsonScalar } from './RejsonScalar' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/set-details/add-set-members/index.ts: -------------------------------------------------------------------------------- 1 | export { AddSetMembers } from './AddSetMembers' 2 | -------------------------------------------------------------------------------- /src/webviews/src/ui/json-viewer/components/json-array/index.ts: -------------------------------------------------------------------------------- 1 | import JsonArray from './JsonArray' 2 | 3 | export default JsonArray 4 | -------------------------------------------------------------------------------- /.github/Redis_for_VS_Code_main_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis/Redis-for-VS-Code/HEAD/.github/Redis_for_VS_Code_main_screen.png -------------------------------------------------------------------------------- /src/lib/cloud_oauth_callback/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis/Redis-for-VS-Code/HEAD/src/lib/cloud_oauth_callback/favicon.png -------------------------------------------------------------------------------- /src/webviews/src/components/consents-privacy/index.ts: -------------------------------------------------------------------------------- 1 | export { ConsentsPrivacy } from './ConsentsPrivacy' 2 | export * from './interface' 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/dynamic-type-details/index.ts: -------------------------------------------------------------------------------- 1 | export { DynamicTypeDetails } from './DynamicTypeDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/list-details/add-list-elements/index.ts: -------------------------------------------------------------------------------- 1 | export { AddListElements } from './AddListElements' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/styles.scss: -------------------------------------------------------------------------------- 1 | .jsonItemEditor { 2 | @apply w-full pr-20 max-w-[600px]; 3 | } 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/set-details/set-details-table/index.ts: -------------------------------------------------------------------------------- 1 | export { SetDetailsTable } from './SetDetailsTable' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/zset-details/add-zset-members/index.ts: -------------------------------------------------------------------------------- 1 | export { AddZSetMembers } from './AddZSetMembers' 2 | -------------------------------------------------------------------------------- /src/webviews/src/ui/json-viewer/components/json-object/index.ts: -------------------------------------------------------------------------------- 1 | import JsonObject from './JsonObject' 2 | 3 | export default JsonObject 4 | -------------------------------------------------------------------------------- /src/webviews/src/ui/json-viewer/components/json-pretty/index.ts: -------------------------------------------------------------------------------- 1 | import JsonPretty from './JsonPretty' 2 | 3 | export default JsonPretty 4 | -------------------------------------------------------------------------------- /src/webviews/src/components/notifications/infinite-messages/index.ts: -------------------------------------------------------------------------------- 1 | export { InfiniteMessagesIds, INFINITE_MESSAGES } from './InfiniteMessages' 2 | -------------------------------------------------------------------------------- /src/webviews/src/constants/window/popover.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_POPOVER_MAX_WIDTH = 524 2 | export const POPOVER_WINDOW_BORDER_WIDTH = 100 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/hash-details/hash-details-table/index.ts: -------------------------------------------------------------------------------- 1 | export { HashDetailsTable } from './HashDetailsTable' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/list-details/list-details-table/index.ts: -------------------------------------------------------------------------------- 1 | export { ListDetailsTable } from './ListDetailsTable' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/zset-details/zset-details-table/index.ts: -------------------------------------------------------------------------------- 1 | export { ZSetDetailsTable } from './ZSetDetailsTable' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-sso-dialog/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthSsoDialog from './OAuthSsoDialog' 2 | 3 | export default OAuthSsoDialog 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-sso/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthCreateDb from './oauth-create-db' 2 | 3 | export { 4 | OAuthCreateDb, 5 | } 6 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cliHelper' 2 | export * from './cliTextFormatter' 3 | export * from './textFormatters' 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details-header/components/key-details-header-name/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyDetailsHeaderName } from './KeyDetailsHeaderName' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details-header/components/key-details-header-ttl/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyDetailsHeaderTTL } from './KeyDetailsHeaderTTL' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/list-details/remove-list-elements/index.ts: -------------------------------------------------------------------------------- 1 | export { RemoveListElements } from './RemoveListElements' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/unsupported-type-details/index.ts: -------------------------------------------------------------------------------- 1 | export { UnsupportedTypeDetails } from './UnsupportedTypeDetails' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/logical-database-wrapper/index.ts: -------------------------------------------------------------------------------- 1 | export { LogicalDatabaseWrapper } from './LogicalDatabaseWrapper' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-select-plan/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthSelectPlan from './OAuthSelectPlan' 2 | 3 | export default OAuthSelectPlan 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-sso/oauth-create-db/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthCreateDb from './OAuthCreateDb' 2 | 3 | export default OAuthCreateDb 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-agreement/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthAgreement from './OAuthAgreement' 2 | 3 | export default OAuthAgreement 4 | -------------------------------------------------------------------------------- /src/webviews/src/styles/main.scss: -------------------------------------------------------------------------------- 1 | @import 'base/base'; 2 | @import 'base/form'; 3 | @import 'base/select'; 4 | 5 | @import 'components/components'; 6 | -------------------------------------------------------------------------------- /src/webviews/src/types/css.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.scss' { 2 | const content: { [className: string]: string } 3 | export default content 4 | } 5 | -------------------------------------------------------------------------------- /src/webviews/src/ui/json-viewer/components/json-primitive/index.ts: -------------------------------------------------------------------------------- 1 | import JsonPrimitive from './JsonPrimitive' 2 | 3 | export default JsonPrimitive 4 | -------------------------------------------------------------------------------- /.github/build/sum_sha256.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | find ./release -type f -name '*.tar.gz' -execdir sh -c 'sha256sum "$1" > "$1.sha256"' _ {} \; 5 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/rejson-dynamic-types/index.ts: -------------------------------------------------------------------------------- 1 | export { RejsonDynamicTypes } from './RejsonDynamicTypes' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/string-details/string-details-value/index.ts: -------------------------------------------------------------------------------- 1 | export { StringDetailsValue } from './StringDetailsValue' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/zset-details/zset-details-table/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply flex flex-1 w-full p-4; 3 | } 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-create-free-db/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthCreateFreeDb from './OAuthCreateFreeDb' 2 | 3 | export default OAuthCreateFreeDb 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-advantages/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthAdvantages from './OAuthAdvantages' 2 | 3 | export default OAuthAdvantages 4 | -------------------------------------------------------------------------------- /src/webviews/src/utils/formatters/index.ts: -------------------------------------------------------------------------------- 1 | export * from './bufferFormatters' 2 | export * from './textFormatters' 3 | export * from './valueFormatters' 4 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils' 2 | export * from './wrapErrorSensitiveData' 3 | export * from './handleMessage' 4 | export * from './handleUri' 5 | -------------------------------------------------------------------------------- /tests/e2e/rte/redis-enterprise/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test-re-standalone", 3 | "type": "redis", 4 | "memory_size": 268435456, 5 | "port": 12000 6 | } 7 | -------------------------------------------------------------------------------- /src/webviews/src/constants/core/eventKeys.ts: -------------------------------------------------------------------------------- 1 | export enum EventKeys { 2 | ENTER = 'Enter', 3 | SPACE = ' ', 4 | ESCAPE = 'Escape', 5 | TAB = 'Tab', 6 | } 7 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details-header/components/key-details-header-formatter/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyDetailsHeaderFormatter } from './KeyDetailsHeaderFormatter' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details-header/components/key-details-header-size-length/styles.module.scss: -------------------------------------------------------------------------------- 1 | .subtitleText { 2 | padding: 6px 2px 6px 0; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/components/add-item-field-action/index.ts: -------------------------------------------------------------------------------- 1 | export { AddItemFieldAction } from './AddItemFieldAction' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-form/components/oauth-sso-form/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthSsoForm from './OAuthSsoForm' 2 | 3 | export default OAuthSsoForm 4 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-social-buttons/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthSocialButtons from './OAuthSocialButtons' 2 | 3 | export default OAuthSocialButtons 4 | -------------------------------------------------------------------------------- /src/lib/cloud_oauth_callback/fonts/Graphik-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis/Redis-for-VS-Code/HEAD/src/lib/cloud_oauth_callback/fonts/Graphik-Medium.woff2 -------------------------------------------------------------------------------- /src/lib/cloud_oauth_callback/fonts/Graphik-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redis/Redis-for-VS-Code/HEAD/src/lib/cloud_oauth_callback/fonts/Graphik-Regular.woff2 -------------------------------------------------------------------------------- /src/webviews/src/components/monaco-editor/index.ts: -------------------------------------------------------------------------------- 1 | export { MonacoEditor } from './MonacoEditor' 2 | export { MonacoJson } from './components/monaco-json/MonacoJson' 3 | -------------------------------------------------------------------------------- /src/webviews/src/constants/keys/selectedKey.ts: -------------------------------------------------------------------------------- 1 | export enum SelectedKeyActionType { 2 | Added = 'Added', 3 | Removed = 'Removed', 4 | Renamed = 'Renamed', 5 | } 6 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details-header/components/key-details-header-size-length/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyDetailsHeaderSizeLength } from './KeyDetailsHeaderSizeLength' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/components/edit-entire-item-action/index.ts: -------------------------------------------------------------------------------- 1 | export { EditEntireItemAction } from './EditEntireItemAction' 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/components/edit-item-field-action/index.ts: -------------------------------------------------------------------------------- 1 | export { EditItemFieldAction } from './EditItemFieldAction' 2 | -------------------------------------------------------------------------------- /tests/e2e/static.ts: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | 3 | const app = express(); 4 | app.use('/remote', express.static('./remote')); 5 | 6 | app.listen(5551); 7 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/components/AddKeyHash/index.ts: -------------------------------------------------------------------------------- 1 | export { INITIAL_HASH_FIELD_STATE } from './constants' 2 | export type { IHashFieldState } from './constants' 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/components/AddKeySet/index.ts: -------------------------------------------------------------------------------- 1 | export { INITIAL_SET_MEMBER_STATE } from './constants' 2 | export type { ISetMemberState } from './constants' 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details-header/index.ts: -------------------------------------------------------------------------------- 1 | export { KeyDetailsHeader } from './KeyDetailsHeader' 2 | export type { KeyDetailsHeaderProps } from './KeyDetailsHeader' 3 | -------------------------------------------------------------------------------- /src/webviews/src/utils/comparisons/index.ts: -------------------------------------------------------------------------------- 1 | export * from './diff' 2 | export * from './compareVersions' 3 | export * from './compareConsents' 4 | export * from './bigKeys' 5 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/components/AddKeyZSet/index.ts: -------------------------------------------------------------------------------- 1 | export { INITIAL_ZSET_MEMBER_STATE } from './constants' 2 | export type { IZsetMemberState } from './constants' 3 | -------------------------------------------------------------------------------- /src/webviews/src/interfaces/vscode/toolkit.ts: -------------------------------------------------------------------------------- 1 | import { FormEventHandler } from 'react' 2 | 3 | export type VSCodeToolkitEvent = ((e: Event) => unknown) & FormEventHandler 4 | -------------------------------------------------------------------------------- /src/webviews/src/components/no-keys-message/styles.module.scss: -------------------------------------------------------------------------------- 1 | .addKey { 2 | @apply mr-4 min-w-[72px] max-h-[22px]; 3 | 4 | &::part(control) { 5 | @apply px-2 py-0.5; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/key-details-actions/styles.module.scss: -------------------------------------------------------------------------------- 1 | .actionBtn { 2 | @apply relative mr-3; 3 | z-index: 2; 4 | 5 | &.withText { 6 | 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/key-row-delete/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply absolute right-0; 3 | } 4 | 5 | .trigger { 6 | @apply hidden h-[22px]; 7 | } 8 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-recommended-settings/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthRecommendedSettings from './OAuthRecommendedSettings' 2 | 3 | export default OAuthRecommendedSettings 4 | -------------------------------------------------------------------------------- /src/webviews/src/styles/components/_components.scss: -------------------------------------------------------------------------------- 1 | @import 'react_virtualized'; 2 | @import 'popup'; 3 | @import 'react-select_overrides'; 4 | @import 'json_view'; 5 | @import 'monaco'; 6 | -------------------------------------------------------------------------------- /src/webviews/src/utils/keys/index.ts: -------------------------------------------------------------------------------- 1 | export * from './longNames' 2 | export * from './groupTypes' 3 | export * from './itemsUtils' 4 | export * from './numbers' 5 | export * from './tree' 6 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/string-details/index.ts: -------------------------------------------------------------------------------- 1 | export { StringDetails } from './StringDetails' 2 | export { useStringStore, fetchString } from './hooks/useStringStore' 3 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/shared/index.ts: -------------------------------------------------------------------------------- 1 | export { EditableInput } from './editable-input/EditableInput' 2 | export { EditableTextArea } from './editable-textarea/EditableTextArea' 3 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * krum.tyukenov@redis.com pavel.angelov@redis.com dijana.antovska@redis.com artem.horuzhenko@redis.com petar.dzhambazov@redis.com valentin.kirilov@redis.com dimo.georgiev@redis.com 2 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/index.ts: -------------------------------------------------------------------------------- 1 | export * from './AddKey' 2 | export * from './components/AddKeyHash' 3 | export * from './components/AddKeySet' 4 | export * from './components/AddKeyZSet' 5 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/index.ts: -------------------------------------------------------------------------------- 1 | export { fetchString, useStringStore } from './components/string-details' 2 | 3 | export { KeyDetails } from './KeyDetails' 4 | export * from './shared' 5 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/openvpn-data/conf/pki/index.txt: -------------------------------------------------------------------------------- 1 | V 240211074915Z 139D258986D24CF7F2000F4365EA7CDE unknown /CN=localhost 2 | V 240211075156Z 8055804ACAE0109030FB7947F31147A9 unknown /CN=test 3 | -------------------------------------------------------------------------------- /tests/e2e/rte/oss-standalone-big/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ -e dump.tar.gz ] 4 | then 5 | echo 'Extracting .rdb file...' 6 | tar -zxvf dump.tar.gz 7 | fi 8 | 9 | exec "$@" 10 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-input/cli-input/styles.module.scss: -------------------------------------------------------------------------------- 1 | #command { 2 | min-width: 5px; 3 | display: inline; 4 | 5 | &:focus-visible { 6 | outline: none; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/webviews/src/utils/transformers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './formatBytes' 2 | export * from './formatDate' 3 | export * from './truncateTTL' 4 | export * from './removeEmpty' 5 | export * from './core' 6 | -------------------------------------------------------------------------------- /tests/e2e/static-server.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.14-alpine 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json . 6 | RUN yarn add express fs-extra 7 | COPY . . 8 | 9 | CMD ["node", "static.ts"] 10 | -------------------------------------------------------------------------------- /src/webviews/src/pages/SettingsPage/SettingsPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from 'react' 2 | import { Settings } from 'uiSrc/modules' 3 | 4 | export const SettingsPage: FC = () => ( 5 | 6 | ) 7 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/virtual-tree/index.ts: -------------------------------------------------------------------------------- 1 | import VirtualTree from './VirtualTree' 2 | 3 | export * from './interfaces' 4 | 5 | export { VirtualTree } 6 | 7 | export default VirtualTree 8 | -------------------------------------------------------------------------------- /src/webviews/src/utils/events/index.ts: -------------------------------------------------------------------------------- 1 | import handlePasteHostName from './handlePasteHostName' 2 | import selectOnFocus from './selectOnFocus' 3 | 4 | export { 5 | handlePasteHostName, 6 | selectOnFocus, 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/weekly.yml: -------------------------------------------------------------------------------- 1 | name: Weekly jobs 2 | on: 3 | schedule: 4 | - cron: 0 0 * * 1 5 | 6 | jobs: 7 | licenses-check: 8 | uses: ./.github/workflows/licenses-check.yml 9 | secrets: inherit 10 | -------------------------------------------------------------------------------- /src/webviews/src/constants/keys/detailsHeader.ts: -------------------------------------------------------------------------------- 1 | const PADDING_WRAPPER_SIZE = 36 2 | export const HIDE_LAST_REFRESH = 850 - PADDING_WRAPPER_SIZE 3 | export const MIDDLE_SCREEN_RESOLUTION = 740 - PADDING_WRAPPER_SIZE 4 | -------------------------------------------------------------------------------- /tests/e2e/rte/oss-cluster-7-rs/creator.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM redis:7.0.6 2 | 3 | USER root 4 | 5 | COPY cluster-create.sh ./ 6 | 7 | RUN chmod a+x cluster-create.sh 8 | 9 | CMD ["/bin/sh", "./cluster-create.sh"] 10 | -------------------------------------------------------------------------------- /tests/e2e/rte/oss-cluster-7/creator.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM redis:7.0.0 2 | 3 | USER root 4 | 5 | COPY cluster-create.sh ./ 6 | 7 | RUN chmod a+x cluster-create.sh 8 | 9 | CMD ["/bin/sh", "./cluster-create.sh"] 10 | -------------------------------------------------------------------------------- /src/webviews/src/modules/manual-connection/manual-connection-form/index.ts: -------------------------------------------------------------------------------- 1 | export { ManualConnectionForm } from './ManualConnectionForm' 2 | export type { Props as ManualConnectionFormProps } from './ManualConnectionForm' 3 | -------------------------------------------------------------------------------- /src/webviews/src/components/virtual-table/components/table-column-search/styles.module.scss: -------------------------------------------------------------------------------- 1 | .search { 2 | @apply flex absolute h-[40px] w-auto min-w-[260px] m-auto right-0 top-0 bottom-0; 3 | padding: 0 10px 0 20px; 4 | } 5 | -------------------------------------------------------------------------------- /src/webviews/test/handlers/oauth/index.ts: -------------------------------------------------------------------------------- 1 | import { RequestHandler } from 'msw' 2 | 3 | import oauth from './oauthHandlers' 4 | 5 | const handlers: RequestHandler[] = [].concat( 6 | oauth, 7 | ) 8 | export default handlers 9 | -------------------------------------------------------------------------------- /tests/e2e/src/helpers/index.ts: -------------------------------------------------------------------------------- 1 | import { Common } from './Common' 2 | import { CommonDriverExtension } from './CommonDriverExtension' 3 | import { Config } from './Conf' 4 | 5 | export { Common, CommonDriverExtension, Config, } 6 | -------------------------------------------------------------------------------- /src/webviews/src/modules/eula/styles.module.scss: -------------------------------------------------------------------------------- 1 | .title { 2 | @apply font-bold; 3 | font-size: 14px; 4 | 5 | } 6 | 7 | .footer { 8 | @apply flex fixed bottom-4 items-center justify-between w-[calc(100%-32px)]; 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/modules/settings/styles.module.scss: -------------------------------------------------------------------------------- 1 | .box { 2 | @apply bg-vscode-tab-unfocusedInactiveBackground p-4 mt-9; 3 | } 4 | 5 | .applyBtn { 6 | @apply flex items-center bg-vscode-button-background w-6 rounded-none; 7 | } 8 | -------------------------------------------------------------------------------- /src/webviews/src/constants/database/connections.ts: -------------------------------------------------------------------------------- 1 | export enum AddDbType { 2 | manual, 3 | auto, 4 | } 5 | 6 | export enum DbType { 7 | STANDALONE = 'STANDALONE', 8 | CLUSTER = 'CLUSTER', 9 | SENTINEL = 'SENTINEL', 10 | } 11 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-recommended-settings/styles.module.scss: -------------------------------------------------------------------------------- 1 | .recommendedSettings { 2 | @apply mb-2 flex items-center; 3 | 4 | .recommendedSettingsToolTip { 5 | @apply inline-flex ml-[4px] mb-[4px]; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/lib/auth/auth.factory.ts: -------------------------------------------------------------------------------- 1 | import { AuthStrategy } from './auth.interface' 2 | import { ServiceAuthStrategy } from './service.auth.strategy' 3 | 4 | export const createAuthStrategy = (): AuthStrategy => 5 | ServiceAuthStrategy.getInstance() 6 | -------------------------------------------------------------------------------- /src/webviews/src/utils/database/getDatabaseId.ts: -------------------------------------------------------------------------------- 1 | import { get } from 'lodash' 2 | import { useDatabasesStore } from 'uiSrc/store' 3 | 4 | export const getDatabaseId = (): string => 5 | get(useDatabasesStore.getState(), 'connectedDatabase.id', '') 6 | -------------------------------------------------------------------------------- /src/webviews/src/utils/events/selectOnFocus.ts: -------------------------------------------------------------------------------- 1 | const selectOnFocus = (e: React.FocusEvent, callback?: (e: React.FocusEvent) => void) => { 2 | (e.target as HTMLInputElement)?.select() 3 | callback?.(e) 4 | } 5 | 6 | export default selectOnFocus 7 | -------------------------------------------------------------------------------- /src/webviews/test/handlers/database/index.ts: -------------------------------------------------------------------------------- 1 | import { RequestHandler } from 'msw' 2 | 3 | import certificates from './certificatesHandlers' 4 | 5 | const handlers: RequestHandler[] = [].concat( 6 | certificates, 7 | ) 8 | export default handlers 9 | -------------------------------------------------------------------------------- /src/webviews/test/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export { constants } from './constants' 2 | export { 3 | render, 4 | getMWSUrl, 5 | cleanup, 6 | screen, 7 | fireEvent, 8 | waitForStack, 9 | waitFor, 10 | act, 11 | } from './testUtils' 12 | -------------------------------------------------------------------------------- /tests/e2e/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.updateImportsOnFileMove.enabled": "always", 3 | "workbench.editor.enablePreview": true, 4 | "git.autoRepositoryDetection": false, 5 | "terminal.integrated.sendKeybindingsToShell": true 6 | } 7 | -------------------------------------------------------------------------------- /src/webviews/test/server.ts: -------------------------------------------------------------------------------- 1 | import { setupServer } from 'msw/node' 2 | import './init' 3 | 4 | import { handlers } from './handlers' 5 | 6 | // Setup requests interception using the given handlers. 7 | export const mswServer = setupServer(...handlers) 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | *.exe binary 3 | *.png binary 4 | *.jpg binary 5 | *.jpeg binary 6 | *.ico binary 7 | *.icns binary 8 | *.otf binary 9 | *.eot binary 10 | *.ttf binary 11 | *.woff binary 12 | *.woff2 binary 13 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/components/AddKeySet/constants.ts: -------------------------------------------------------------------------------- 1 | export interface ISetMemberState { 2 | name: string 3 | id: number 4 | } 5 | 6 | export const INITIAL_SET_MEMBER_STATE: ISetMemberState = { 7 | name: '', 8 | id: 0, 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/constants.ts: -------------------------------------------------------------------------------- 1 | export enum CommandExecutionStatus { 2 | Success = 'success', 3 | Fail = 'fail', 4 | } 5 | 6 | export enum ClusterNodeRole { 7 | All = 'ALL', 8 | Master = 'MASTER', 9 | Slave = 'SLAVE', 10 | } 11 | -------------------------------------------------------------------------------- /src/lib/auth/models/cloud-auth-response.ts: -------------------------------------------------------------------------------- 1 | export enum CloudAuthStatus { 2 | Succeed = 'succeed', 3 | Failed = 'failed', 4 | } 5 | 6 | export interface CloudAuthResponse { 7 | status: CloudAuthStatus 8 | message?: string 9 | error?: any 10 | } 11 | -------------------------------------------------------------------------------- /src/webviews/src/modules/cli/components/cli-input/cli-autocomplete/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | font: normal normal normal 13px/15px !important; 3 | opacity: 0.8; 4 | margin-left: 1px; 5 | } 6 | 7 | .params { 8 | padding: 0 5px; 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/ui/separator/styles.module.scss: -------------------------------------------------------------------------------- 1 | .separator { 2 | @apply bg-vscode-menu-separatorBackground; 3 | 4 | &Horizontal { 5 | @apply h-px w-full my-2; 6 | } 7 | 8 | &Vertical { 9 | @apply h-full w-px mx-2; 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/webviews/src/components/field-message/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply flex flex-1 text-error py-1 px-0; 3 | } 4 | .icon { 5 | @apply mr-1 6 | } 7 | .message { 8 | @apply text-[12px] leading-[16px]; 9 | letter-spacing: -0.12px 10 | } 11 | -------------------------------------------------------------------------------- /src/webviews/src/utils/formatters/textFormatters.ts: -------------------------------------------------------------------------------- 1 | // remove line break and encode angular brackets 2 | const parsePastedText = (text: string = '') => 3 | text.replace(/(\r?\n)/gi, '').replace(//gi, '>') 4 | 5 | export { 6 | parsePastedText, 7 | } 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | quote_type = single 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | // postcss.config.js 2 | // Taken from: https://tailwindcss.com/docs/installation#using-tailwind-with-postcss 3 | module.exports = { 4 | plugins: { 5 | 'postcss-import': {}, 6 | 'tailwindcss/nesting': {}, 7 | tailwindcss: {}, 8 | }, 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/test/handlers/app/index.ts: -------------------------------------------------------------------------------- 1 | import { RequestHandler } from 'msw' 2 | 3 | import telemetry from './telemetry' 4 | import info from './info' 5 | 6 | const handlers: RequestHandler[] = [].concat( 7 | telemetry, 8 | info, 9 | ) 10 | export default handlers 11 | -------------------------------------------------------------------------------- /src/webviews/src/actions/addDatabaseAction.ts: -------------------------------------------------------------------------------- 1 | import { useDatabasesStore } from 'uiSrc/store' 2 | 3 | export const addDatabaseAction = (message: any) => { 4 | if (message.data?.database?.id) { 5 | useDatabasesStore.getState().addDatabaseToList(message.data?.database!) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /tests/e2e/.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | dist 3 | node_modules 4 | .idea 5 | .vscode-test 6 | .vscode 7 | te 8 | vscodey** 9 | 10 | # test data 11 | test-extensions 12 | test-resources 13 | 14 | # E2E tests report 15 | report 16 | results 17 | remote 18 | mochawesome-report 19 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/key-details-actions/index.ts: -------------------------------------------------------------------------------- 1 | export { EditItemAction } from './edit-item-action/EditItemAction' 2 | export { AddItemsAction } from './add-items-action/AddItemsAction' 3 | export { RemoveItemsAction } from './remove-items-action/RemoveItemsAction' 4 | -------------------------------------------------------------------------------- /src/webviews/src/utils/database/index.ts: -------------------------------------------------------------------------------- 1 | export { getUrl, getDatabaseUrl } from './getUrlDatabase' 2 | export { getEncoding } from './getEncoding' 3 | export { getDatabaseId } from './getDatabaseId' 4 | 5 | export * from './redistack' 6 | export * from './modules' 7 | export * from './form' 8 | -------------------------------------------------------------------------------- /src/webviews/src/constants/core/app.ts: -------------------------------------------------------------------------------- 1 | import * as l10n from '@vscode/l10n' 2 | 3 | export enum SortOrder { 4 | ASC = 'ASC', 5 | DESC = 'DESC', 6 | } 7 | 8 | export const DEFAULT_ERROR_MESSAGE = l10n.t('Something was wrong!') 9 | export const APPLICATION_NAME = 'Redis for VS Code' 10 | -------------------------------------------------------------------------------- /src/webviews/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types' 2 | export * from './core/app' 3 | export * from './cli' 4 | export * from './database/databases' 5 | export * from './database/form' 6 | export * from './keys/key' 7 | export * from './vscode/toolkit' 8 | export * from './vscode/api' 9 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/components/AddKeyZSet/constants.ts: -------------------------------------------------------------------------------- 1 | export interface IZsetMemberState { 2 | name: string 3 | score: string 4 | id: number 5 | } 6 | 7 | export const INITIAL_ZSET_MEMBER_STATE: IZsetMemberState = { 8 | name: '', 9 | score: '', 10 | id: 0, 11 | } 12 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "avoid", 3 | "semi": false, 4 | "singleQuote": true, 5 | "overrides": [ 6 | { 7 | "files": "tailwind.config.js", 8 | "options": { 9 | "quoteProps": "consistent", 10 | "printWidth": 200 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /src/webviews/src/interfaces/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The value MUST exist, but can be undefined 3 | */ 4 | export type Maybe = T | undefined 5 | 6 | /** 7 | * The value can have NULL value 8 | */ 9 | export type Nullable = T | null 10 | 11 | export interface WithId { 12 | id: number 13 | } 14 | -------------------------------------------------------------------------------- /src/webviews/test/handlers/index.ts: -------------------------------------------------------------------------------- 1 | import browser from './browser' 2 | import database from './database' 3 | import app from './app' 4 | import oauth from './oauth' 5 | 6 | // @ts-ignore 7 | export const handlers: any[] = [].concat( 8 | app, 9 | browser, 10 | database, 11 | oauth, 12 | ) 13 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/string-details/constants/string.ts: -------------------------------------------------------------------------------- 1 | import { 2 | STRING_MAX_LENGTH, 3 | } from 'uiSrc/constants' 4 | 5 | export const MAX_ROWS = 25 6 | export const MIN_ROWS = 4 7 | export const APPROXIMATE_WIDTH_OF_SIGN = 8.6 8 | export const MAX_LENGTH = STRING_MAX_LENGTH + 1 9 | -------------------------------------------------------------------------------- /src/webviews/src/pages/CliPage/CliPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { CliPage } from './CliPage' 5 | 6 | describe('CliPage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/ui/json-viewer/utils.ts: -------------------------------------------------------------------------------- 1 | export const isBigInt = (data: any) => typeof data === 'bigint' || data instanceof BigInt 2 | export const isArray = (data: any) => Array.isArray(data) 3 | export const isObject = (data: any) => typeof data === 'object' 4 | && data !== null 5 | && !Array.isArray(data) 6 | -------------------------------------------------------------------------------- /src/webviews/test/handlers/browser/index.ts: -------------------------------------------------------------------------------- 1 | import { RequestHandler } from 'msw' 2 | 3 | import string from './stringHandlers' 4 | import selectedKey from './selectedKeyHandlers' 5 | 6 | const handlers: RequestHandler[] = [].concat( 7 | string, 8 | selectedKey, 9 | ) 10 | export default handlers 11 | -------------------------------------------------------------------------------- /src/webviews/test/res/responseComposition.ts: -------------------------------------------------------------------------------- 1 | import { HttpResponse, http } from 'msw' 2 | import { DEFAULT_ERROR_MESSAGE } from 'uiSrc/constants' 3 | 4 | export const errorHandlers = [ 5 | http.all( 6 | '*', 7 | () => HttpResponse.json(DEFAULT_ERROR_MESSAGE, { status: 500 }), 8 | ), 9 | ] 10 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | # What 2 | 3 | 4 | # Testing 5 | 6 | -------------------------------------------------------------------------------- /src/webviews/src/constants/validators/validations.ts: -------------------------------------------------------------------------------- 1 | export const MAX_TTL_NUMBER = 2_147_483_647 2 | export const MAX_PORT_NUMBER = 65_535 3 | export const MAX_TIMEOUT_NUMBER = 1_000_000 4 | export const MAX_SCORE_DECIMAL_LENGTH = 15 5 | export const MAX_REFRESH_RATE = 999.9 6 | export const MIN_REFRESH_RATE = 1.0 7 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/key-row-type/styles.module.scss: -------------------------------------------------------------------------------- 1 | .keyInfoLoading { 2 | @apply mt-2 pl-4; 3 | } 4 | 5 | .keyType { 6 | @apply text-vscode-foreground pr-4 pl-3 opacity-80; 7 | font-size: 11px; 8 | line-height: 24px; 9 | 10 | width: 88px; 11 | min-width: 88px; 12 | } 13 | -------------------------------------------------------------------------------- /src/webviews/src/pages/EulaPage/EulaPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { EulaPage } from './EulaPage' 5 | 6 | describe('EulaPage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/components/index.ts: -------------------------------------------------------------------------------- 1 | export { AddItemFieldAction } from './add-item-field-action' 2 | export { EditEntireItemAction } from './edit-entire-item-action' 3 | export { EditItemFieldAction } from './edit-item-field-action' 4 | export { AddItem } from './add-item' 5 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-form/components/oauth-sso-form/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply mb-[190px] pt-[60px] w-full text-left; 3 | 4 | .title { 5 | @apply pb-[20px] text-[16px] #{!important}; 6 | } 7 | 8 | .formRaw { 9 | @apply p-0 #{!important}; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/webviews/src/pages/MainPage/MainPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { MainPage } from './MainPage' 5 | 6 | describe('DatabasePage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/lib/auth/models/session.ts: -------------------------------------------------------------------------------- 1 | export interface ISessionMetadata { 2 | userId: string 3 | sessionId: string 4 | uniqueId?: string 5 | } 6 | 7 | export interface SessionMetadata extends ISessionMetadata { 8 | userId: string 9 | sessionId: string 10 | uniqueId?: string 11 | correlationId?: string 12 | } 13 | -------------------------------------------------------------------------------- /src/webviews/src/components/database-form/index.ts: -------------------------------------------------------------------------------- 1 | export { DbInfo } from './DbInfo' 2 | export { MessageStandalone } from './Messages' 3 | export { DbCompressor } from './DbCompressor' 4 | export { TlsDetails } from './TlsDetails' 5 | export { DatabaseForm } from './DatabaseForm' 6 | export { SSHDetails } from './SSHDetails' 7 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/unsupported-type-details/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply flex flex-grow pt-4 pb-7 px-10 justify-center; 3 | 4 | h3 { 5 | @apply font-bold text-[18px] pb-4; 6 | } 7 | } 8 | 9 | .textWrapper { 10 | @apply max-w-[640px] relative -top-[7%]; 11 | } 12 | -------------------------------------------------------------------------------- /src/webviews/src/pages/NotFoundPage/NotFoundPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from 'react' 2 | import * as l10n from '@vscode/l10n' 3 | 4 | export const NotFoundPage: FC = () => ( 5 |
6 | {l10n.t('Page was not found')} 7 |
8 | ) 9 | -------------------------------------------------------------------------------- /tests/e2e/rte/redis-enterprise/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM redislabs/redis:6.2.8-50 2 | 3 | ## Set the env var to instruct RE to create a cluster on startup 4 | ENV BOOTSTRAP_ACTION create_cluster 5 | ENV BOOTSTRAP_CLUSTER_FQDN cluster.local 6 | 7 | COPY entrypoint.sh db.json ./ 8 | 9 | ENTRYPOINT [ "bash", "./entrypoint.sh" ] 10 | -------------------------------------------------------------------------------- /src/webviews/src/components/popover-delete/styles.module.scss: -------------------------------------------------------------------------------- 1 | .popover { 2 | } 3 | 4 | .appendInfo { 5 | @apply flex mt-4; 6 | 7 | > div { 8 | font-size: 12px !important; 9 | } 10 | } 11 | 12 | .popoverFooter { 13 | @apply flex justify-end mt-3; 14 | } 15 | 16 | .trigger { 17 | @apply outline-0; 18 | } 19 | -------------------------------------------------------------------------------- /src/webviews/src/pages/SidebarPage/SidebarPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { SidebarPage } from './SidebarPage' 5 | 6 | describe('SidebarPage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/pages/WelcomePage/WelcomePage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { WelcomePage } from './WelcomePage' 5 | 6 | describe('WelcomePage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/services/index.ts: -------------------------------------------------------------------------------- 1 | import apiService from './apiService' 2 | 3 | export { vscodeApi } from './vscodeAPI' 4 | export { resourcesService } from './resourcesService' 5 | export * from './storage' 6 | export * from './routing' 7 | export * from './migrateStorageData' 8 | 9 | export { 10 | apiService, 11 | } 12 | -------------------------------------------------------------------------------- /tests/e2e/rte/openvpn/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.4" 2 | 3 | services: 4 | openvpn: 5 | cap_add: 6 | - NET_ADMIN 7 | image: kylemanna/openvpn 8 | container_name: openvpn 9 | ports: 10 | - "1194:1194/udp" 11 | restart: always 12 | volumes: 13 | - ./openvpn-data/conf:/etc/openvpn 14 | -------------------------------------------------------------------------------- /src/webviews/src/constants/keys/tree.ts: -------------------------------------------------------------------------------- 1 | import { SortOrder } from 'uiSrc/constants/core/app' 2 | 3 | export const DEFAULT_SEARCH_MATCH = '*' 4 | export const DEFAULT_DELIMITER = ':' 5 | export const MAX_DELIMITER_LENGTH = 5 6 | export const DEFAULT_TREE_SORTING = SortOrder.ASC 7 | export const MAX_HEIGHT_TREE = window.screen.height - 140 8 | -------------------------------------------------------------------------------- /src/webviews/src/pages/NotFoundPage/NotFoundPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { NotFoundPage } from './NotFoundPage' 5 | 6 | describe('NotFoundPage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/pages/SettingsPage/SettingsPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { SettingsPage } from './SettingsPage' 5 | 6 | describe('SettingsPage', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /tests/e2e/README.md: -------------------------------------------------------------------------------- 1 | # Redis-for-VS-Code e2e tests 2 | 3 | ### Before run tests run next commands 4 | 5 | ```bash 6 | yarn install 7 | yarn install:deps 8 | yarn install:extension 9 | ``` 10 | 11 | 12 | ### Run tests locally from the tests/e2e folder 13 | 14 | - to run e2e tests run 15 | 16 | ```bash 17 | yarn test 18 | ``` 19 | -------------------------------------------------------------------------------- /tests/e2e/rte/oss-cluster-7/cluster-create.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo 'Try to sleep for a while...' 4 | sleep 5 5 | echo 'Creating cluster...' 6 | echo "yes" | redis-cli \ 7 | --cluster create \ 8 | 172.31.100.211:6379 \ 9 | 172.31.100.212:6379 \ 10 | 172.31.100.213:6379 \ 11 | --cluster-replicas 0 \ 12 | && redis-server 13 | -------------------------------------------------------------------------------- /src/webviews/src/components/virtual-table/utils.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export const StopPropagation = ({ children }: { children: JSX.Element }) => ( 4 |
e.stopPropagation()} 7 | role="presentation" 8 | > 9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /src/webviews/src/constants/window/table.ts: -------------------------------------------------------------------------------- 1 | export enum TableCellAlignment { 2 | Left = 'flex-start', 3 | Center = 'center', 4 | Right = 'flex-end', 5 | } 6 | 7 | export enum TableCellTextAlignment { 8 | Left = 'left', 9 | Center = 'center', 10 | Right = 'right', 11 | } 12 | 13 | export const OVER_RENDER_BUFFER_COUNT = 50 14 | -------------------------------------------------------------------------------- /tests/e2e/rte/oss-cluster-7-rs/cluster-create.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo 'Try to sleep for a while...' 4 | sleep 5 5 | echo 'Creating cluster...' 6 | echo "yes" | redis-cli \ 7 | --cluster create \ 8 | 172.31.100.221:6379 \ 9 | 172.31.100.222:6379 \ 10 | 172.31.100.223:6379 \ 11 | --cluster-replicas 0 \ 12 | && redis-server 13 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/constants/keys.ts: -------------------------------------------------------------------------------- 1 | import { RedisResponseBuffer } from 'uiSrc/interfaces' 2 | import { AllKeyTypes } from 'uiSrc/constants' 3 | 4 | export interface IKeyPropTypes { 5 | nameString: string 6 | name: RedisResponseBuffer 7 | type: AllKeyTypes 8 | ttl: number 9 | size: number 10 | length: number 11 | } 12 | -------------------------------------------------------------------------------- /src/webviews/src/pages/AddKeyPage/AddKeyPage.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { render } from 'testSrc/helpers' 4 | import { AddKeyPage } from './AddKeyPage' 5 | 6 | describe('AddKeyPage', () => { 7 | it('should render', () => { 8 | expect(render(, { withRouter: true })).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/ui/button/styles.module.scss: -------------------------------------------------------------------------------- 1 | .button { 2 | @apply flex justify-center items-center text-vscode-foreground min-h-[22px] min-w-[22px]; 3 | border-radius: 5px; 4 | 5 | svg { 6 | @apply min-w-4 min-h-4; 7 | } 8 | 9 | &:hover { 10 | background-color: var(--button-icon-hover-background); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /src/webviews/src/utils/formatters/json.ts: -------------------------------------------------------------------------------- 1 | import JSONBigInt from 'json-bigint' 2 | 3 | export const reSerializeJSON = (val: string, space?: number) => { 4 | try { 5 | const json = JSONBigInt({ useNativeBigInt: true }).parse(val) 6 | return JSONBigInt.stringify(json, null, space) 7 | } catch (e) { 8 | return val 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/webviews/src/actions/refreshTreeAction.ts: -------------------------------------------------------------------------------- 1 | import { fetchDatabases, useDatabasesStore } from 'uiSrc/store' 2 | 3 | export const refreshTreeAction = (message: any) => { 4 | fetchDatabases(() => { 5 | if (message.data?.database?.id) { 6 | useDatabasesStore.getState().setDatabaseToList(message.data?.database!) 7 | } 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/constants/database/commandsVersions.ts: -------------------------------------------------------------------------------- 1 | export const CommandsVersions = { 2 | REMOVE_MULTIPLE_LIST_ELEMENTS: { 3 | since: '6.2', 4 | }, 5 | FILTER_PER_KEY_TYPES: { 6 | since: '6.0', 7 | }, 8 | SPUBLISH_NOT_SUPPORTED: { 9 | since: '7.0', 10 | }, 11 | HASH_FIELD_TTL: { 12 | since: '7.3', 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /src/webviews/src/constants/sockets/socketEvents.ts: -------------------------------------------------------------------------------- 1 | export enum SocketEvent { 2 | Connect = 'connect', 3 | Disconnect = 'disconnect', 4 | ConnectionError = 'connect_error', 5 | } 6 | 7 | export enum SocketFeaturesEvent { 8 | Features = 'features', 9 | } 10 | 11 | export enum CloudJobEvents { 12 | Monitor = 'cloud:job:monitor', 13 | } 14 | -------------------------------------------------------------------------------- /src/webviews/src/pages/MainPage/MainPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from 'react' 2 | import { Outlet } from 'react-router-dom' 3 | import { GlobalToasts } from 'uiSrc/components' 4 | 5 | export const MainPage: FC = () => ( 6 |
7 | 8 | 9 |
10 | ) 11 | -------------------------------------------------------------------------------- /src/webviews/src/actions/setSelectedKeyAction.ts: -------------------------------------------------------------------------------- 1 | import { SelectedKeyAction } from 'uiSrc/interfaces' 2 | import { useSelectedKeyStore } from 'uiSrc/store' 3 | 4 | export const setSelectedKeyAction = (message: SelectedKeyAction) => { 5 | if (message.data?.keyInfo?.key) { 6 | useSelectedKeyStore.getState().setSelectedKeyAction(message.data) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/webviews/src/components/monaco-languages/MonacoLanguages.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { render } from 'testSrc/helpers' 3 | 4 | import { MonacoLanguages } from './MonacoLanguages' 5 | 6 | describe('MonacoLanguages', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthSsoDialog from './oauth-sso-dialog' 2 | import OAuthJobs from './oauth-jobs' 3 | import OAuthCreateFreeDb from './oauth-create-free-db' 4 | import OAuthSelectPlan from './oauth-select-plan' 5 | 6 | export { 7 | OAuthCreateFreeDb, 8 | OAuthSsoDialog, 9 | OAuthJobs, 10 | OAuthSelectPlan, 11 | } 12 | -------------------------------------------------------------------------------- /tests/e2e/src/helpers/api/index.ts: -------------------------------------------------------------------------------- 1 | import { CliAPIRequests } from './CliApi' 2 | import { CommonAPIRequests } from './CommonApi' 3 | import { DatabaseAPIRequests } from './DatabaseApi' 4 | import { KeyAPIRequests } from './KeyApi' 5 | 6 | export { 7 | CliAPIRequests, 8 | CommonAPIRequests, 9 | DatabaseAPIRequests, 10 | KeyAPIRequests, 11 | } 12 | -------------------------------------------------------------------------------- /.github/actions/download-backend/action.yml: -------------------------------------------------------------------------------- 1 | name: Download backend 2 | 3 | inputs: 4 | arch: 5 | description: Architecture arm64 or x64 6 | required: false 7 | default: 'x64' 8 | 9 | runs: 10 | using: 'composite' 11 | steps: 12 | - name: Download backend 13 | shell: bash 14 | run: yarn download:backend ${{ inputs.arch }} 15 | -------------------------------------------------------------------------------- /src/webviews/src/constants/cloud/oauth.ts: -------------------------------------------------------------------------------- 1 | export enum CloudSubscriptionPlanProvider { 2 | AWS = 'AWS', 3 | GCP = 'GCP', 4 | Azure = 'Azure', 5 | } 6 | 7 | export enum CloudSubscriptionType { 8 | Flexible = 'flexible', 9 | Fixed = 'fixed', 10 | } 11 | 12 | export enum CloudAuthStatus { 13 | Succeed = 'succeed', 14 | Failed = 'failed', 15 | } 16 | -------------------------------------------------------------------------------- /src/webviews/src/modules/add-key/components/AddKeyHash/constants.ts: -------------------------------------------------------------------------------- 1 | export interface IHashFieldState { 2 | fieldName: string 3 | fieldValue: string 4 | id: number 5 | fieldTTL?: number 6 | } 7 | 8 | export const INITIAL_HASH_FIELD_STATE: IHashFieldState = { 9 | fieldName: '', 10 | fieldValue: '', 11 | fieldTTL: undefined, 12 | id: 0, 13 | } 14 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/oauth-sso/oauth-create-db/constants.ts: -------------------------------------------------------------------------------- 1 | // TODO [DA]: Remove once logout is implemented and it is decided that this functionality no longer needed 2 | // Added in order to give flexibility to the user to login every time and change cloud accounts 3 | // on each create free db event 4 | export const REQUIRE_LOGIN_ON_NEW_DB: boolean = true 5 | -------------------------------------------------------------------------------- /src/webviews/src/ui/spacer/styles.module.scss: -------------------------------------------------------------------------------- 1 | .spacer { 2 | &_xxs { 3 | @apply h-0.5; 4 | } 5 | 6 | &_xs { 7 | @apply h-1; 8 | } 9 | 10 | &_s { 11 | @apply h-2; 12 | } 13 | 14 | &_m { 15 | @apply h-4; 16 | } 17 | 18 | &_l { 19 | @apply h-6; 20 | } 21 | 22 | &_xl { 23 | @apply h-10; 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/oauth-advantages/OAuthAdvantages.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { render } from 'testSrc/helpers' 3 | 4 | import OAuthAdvantages from './OAuthAdvantages' 5 | 6 | describe('OAuthAdvantages', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/ui/link/styles.module.scss: -------------------------------------------------------------------------------- 1 | $inputHeight: 28px; 2 | $inputMinWidth: 100px; 3 | 4 | .link { 5 | @apply text-vscode-input-foreground border-vscode-input-border focus:border-vscode-inputOption-activeBorder w-full px-[6px] outline-none border-solid border rounded-none; 6 | 7 | border-color: transparent; 8 | min-width: $inputMinWidth; 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/utils/database/getEncoding.ts: -------------------------------------------------------------------------------- 1 | import { get } from 'lodash' 2 | import { RedisResponseEncoding } from 'uiSrc/interfaces' 3 | import { useAppInfoStore } from 'uiSrc/store/hooks/use-app-info-store/useAppInfoStore' 4 | 5 | export const getEncoding = (): RedisResponseEncoding => 6 | get(useAppInfoStore.getState(), 'encoding', RedisResponseEncoding.Buffer) 7 | -------------------------------------------------------------------------------- /tests/e2e/src/page-objects/components/common/InputWithButtons.ts: -------------------------------------------------------------------------------- 1 | import { By } from 'vscode-extension-tester' 2 | import { BaseComponent } from '../BaseComponent' 3 | 4 | export class InputWithButtons extends BaseComponent { 5 | static applyInput = By.xpath(`//*[@data-testid='apply-btn']`) 6 | static cancelInput = By.xpath(`//*[@data-testid='cancel-btn']`) 7 | } 8 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/string-details/utils/calculateTextareaLines.ts: -------------------------------------------------------------------------------- 1 | const APPROXIMATE_WIDTH_OF_SIGN = 7.05 2 | 3 | export const calculateTextareaLines = (text: string, width: number = 1, signWidth = APPROXIMATE_WIDTH_OF_SIGN) => 4 | text?.split('\n') 5 | .reduce((prev, current) => Math.ceil((current.length * signWidth) / width) + prev, 0) || 1 6 | -------------------------------------------------------------------------------- /tests/e2e/src/helpers/common-actions/index.ts: -------------------------------------------------------------------------------- 1 | import { KeyDetailsActions } from './KeyDetailsActions' 2 | import { DatabasesActions } from './DatabasesActions' 3 | import { TreeViewActions } from './TreeViewActions' 4 | import { KeyActions } from './KeyActions' 5 | 6 | export { KeyDetailsActions, DatabasesActions, TreeViewActions, KeyActions } 7 | export * from './actions' 8 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/keys-summary/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply h-[22px] flex flex-row justify-between pl-6; 3 | &:hover { 4 | background-color: var(--vscode-merge-commonHeaderBackground); 5 | } 6 | } 7 | 8 | .content { 9 | @apply flex flex-row items-center flex-grow text-vscode-foreground opacity-80 pl-1 truncate; 10 | } 11 | -------------------------------------------------------------------------------- /src/webviews/src/ui/json-viewer/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface IDefaultProps { 2 | data: any 3 | space?: number 4 | gap?: number 5 | lastElement?: boolean 6 | } 7 | 8 | export interface IJsonArrayProps extends IDefaultProps { 9 | data: Array 10 | } 11 | 12 | export interface IJsonObjectProps extends IDefaultProps { 13 | data: Record 14 | } 15 | -------------------------------------------------------------------------------- /src/webviews/src/components/monaco-editor/MonacoEditor.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { render } from 'testSrc/helpers' 3 | 4 | import MonacoEditor from './MonacoEditor' 5 | 6 | describe('MonacoEditor', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/modules/index.ts: -------------------------------------------------------------------------------- 1 | export * from './config' 2 | export * from './keys-tree' 3 | export * from './key-details' 4 | export * from './key-details-header' 5 | export * from './database-panel' 6 | export * from './manual-connection' 7 | export * from './add-key' 8 | export * from './settings' 9 | export * from './eula' 10 | export * from './common-app-subscription' 11 | -------------------------------------------------------------------------------- /src/webviews/src/components/monaco-editor/components/monaco-json/MonacoJson.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { render } from 'testSrc/helpers' 3 | 4 | import { MonacoJson } from './MonacoJson' 5 | 6 | describe('MonacoJson', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/rejson-details/constants.ts: -------------------------------------------------------------------------------- 1 | import * as l10n from '@vscode/l10n' 2 | 3 | export const JSONErrors = { 4 | keyCorrectSyntax: l10n.t('Key should have correct syntax.'), 5 | valueJSONFormat: l10n.t('Value should have JSON format.'), 6 | } 7 | 8 | export const MIN_LEFT_PADDING_NESTING = 1 9 | export const MAX_LEFT_PADDING_NESTING = 8 10 | -------------------------------------------------------------------------------- /src/webviews/src/utils/transformers/removeEmpty.ts: -------------------------------------------------------------------------------- 1 | export function removeEmpty(obj: any) { 2 | Object.keys(obj).forEach((key) => { 3 | // eslint-disable-next-line @typescript-eslint/no-unused-expressions 4 | (obj[key] && typeof obj[key] === 'object' && removeEmpty(obj[key])) 5 | || ((obj[key] === '' || obj[key] === null) && delete obj[key]) 6 | }) 7 | return obj 8 | } 9 | -------------------------------------------------------------------------------- /tests/e2e/src/page-objects/components/editor-view/WelcomeView.ts: -------------------------------------------------------------------------------- 1 | import { By } from 'selenium-webdriver' 2 | import { WebView } from '@e2eSrc/page-objects/components/WebView' 3 | 4 | /** 5 | * Welcome view 6 | */ 7 | export class WelcomeView extends WebView { 8 | connectLinks = By.xpath( 9 | `//a[@data-testid='connect-database-btn']/following-sibling::a`, 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /src/webviews/src/utils/transformers/core.ts: -------------------------------------------------------------------------------- 1 | import { MultiSelectOption } from 'uiSrc/components' 2 | 3 | export const multiSelectToArray = (items: readonly MultiSelectOption[]) => [...items] 4 | .map(({ label }) => label) 5 | .filter((item) => item) 6 | 7 | export const arrayToMultiSelect = (items: string[]) => [...items].map((item) => ({ 8 | label: item, 9 | value: item, 10 | })) 11 | -------------------------------------------------------------------------------- /src/webviews/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | interface ImportMetaEnv { 5 | readonly RI_BASE_API_URL: string 6 | readonly RI_APP_PREFIX: string 7 | readonly RI_APP_PORT: number 8 | readonly RI_SCAN_TREE_COUNT: number 9 | } 10 | 11 | interface ImportMeta { 12 | readonly env: ImportMetaEnv 13 | } 14 | -------------------------------------------------------------------------------- /src/webviews/src/ui/radio-group/styles.module.scss: -------------------------------------------------------------------------------- 1 | $inputHeight: 28px; 2 | $inputMinWidth: 100px; 3 | 4 | .link { 5 | @apply bg-vscode-input-background text-vscode-input-foreground border-vscode-input-border focus:border-vscode-inputOption-activeBorder w-full px-[6px] outline-none border-solid border rounded-none; 6 | 7 | border-color: transparent; 8 | min-width: $inputMinWidth; 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/components/notifications/global-toasts/GlobalToasts.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from 'react' 2 | import { Flip, ToastContainer } from 'react-toastify' 3 | import styles from './styles.module.scss' 4 | 5 | export const GlobalToasts: FC = () => ( 6 | 11 | ) 12 | -------------------------------------------------------------------------------- /src/webviews/src/modules/keys-tree/components/key-row-name/styles.module.scss: -------------------------------------------------------------------------------- 1 | .keyInfoLoading { 2 | width: 70%; 3 | margin-top: 7px; 4 | } 5 | 6 | .keyName { 7 | @apply inline-block truncate; 8 | padding-left: 10px; 9 | line-height: 22px; 10 | max-width: calc(100% - 13px); 11 | } 12 | 13 | .icon { 14 | @apply inline-block h-full; 15 | margin-left: 1px; 16 | min-width: 13px; 17 | } 18 | -------------------------------------------------------------------------------- /src/webviews/src/modules/oauth/shared/index.ts: -------------------------------------------------------------------------------- 1 | import OAuthAdvantages from './oauth-advantages' 2 | import OAuthAgreement from './oauth-agreement' 3 | import OAuthRecommendedSettings from './oauth-recommended-settings' 4 | import OAuthSocialButtons from './oauth-social-buttons' 5 | 6 | export { 7 | OAuthAdvantages, 8 | OAuthAgreement, 9 | OAuthRecommendedSettings, 10 | OAuthSocialButtons, 11 | } 12 | -------------------------------------------------------------------------------- /src/webviews/src/ui/link/Link.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { instance, mock } from 'ts-mockito' 3 | 4 | import { render } from 'testSrc/helpers' 5 | import { Link, Props } from './Link' 6 | 7 | const mockedProps = mock() 8 | 9 | describe('Link', () => { 10 | it('should render', () => { 11 | expect(render()).toBeTruthy() 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /src/webviews/src/actions/setDatabaseAction.ts: -------------------------------------------------------------------------------- 1 | import { SetDatabaseAction } from 'uiSrc/interfaces' 2 | import { useDatabasesStore } from 'uiSrc/store' 3 | 4 | export const setDatabaseAction = (message: SetDatabaseAction) => { 5 | if (message.data?.database?.id) { 6 | window.ri.database = message.data.database 7 | useDatabasesStore.getState().setConnectedDatabase(message.data.database) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/webviews/src/modules/database-panel/styles.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | @apply overflow-auto; 3 | .content { 4 | @apply w-[660px] pr-2; 5 | } 6 | input:not(:global([id^="react-select-"])) { 7 | @apply h-9 pl-3 pr-3; 8 | } 9 | 10 | textarea { 11 | @apply min-h-20 h-20 pl-3 pr-3 pt-2; 12 | } 13 | 14 | :global(.checkbox) { 15 | @apply mt-3 mb-3 #{!important}; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/e2e/rte/oss-cluster-7/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM redislabs/rejson:1.0.8 as rejson 2 | 3 | FROM redislabs/redisearch:2.0.13 as redisearch 4 | 5 | FROM redis:7.0.0 6 | 7 | COPY redis.conf /etc/redis/ 8 | COPY --from=rejson /usr/lib/redis/modules/rejson.so /etc/redis/modules/ 9 | COPY --from=redisearch /usr/lib/redis/modules/redisearch.so /etc/redis/modules/ 10 | 11 | CMD [ "redis-server", "/etc/redis/redis.conf" ] 12 | -------------------------------------------------------------------------------- /src/webviews/src/components/virtual-table/components/table-column-search-trigger/styles.module.scss: -------------------------------------------------------------------------------- 1 | .search { 2 | @apply flex absolute h-[24px] m-auto top-1/2 bottom-1/2 right-3 items-center; 3 | width: calc(100% - 20px); 4 | 5 | input { 6 | @apply border-0 h-full w-full focus:outline-vscode-inputOption-activeBorder pr-7; 7 | } 8 | } 9 | 10 | .declineBtn { 11 | @apply absolute right-1 flex; 12 | } 13 | -------------------------------------------------------------------------------- /src/webviews/src/modules/key-details/components/unsupported-type-details/UnsupportedTypeDetails.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { render } from 'testSrc/helpers' 3 | 4 | import { UnsupportedTypeDetails } from './UnsupportedTypeDetails' 5 | 6 | describe('UnsupportedTypeDetails', () => { 7 | it('should render', () => { 8 | expect(render()).toBeTruthy() 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /tests/e2e/src/helpers/common-actions/actions/index.ts: -------------------------------------------------------------------------------- 1 | import { ButtonActions } from './ButtonActions' 2 | import { CheckboxActions } from './CheckboxActions' 3 | import { DropdownActions } from './DropdownActions' 4 | import { InputActions } from './InputActions' 5 | import { NotificationActions } from './NotificationActions' 6 | 7 | export { ButtonActions, CheckboxActions, DropdownActions, InputActions, NotificationActions } 8 | -------------------------------------------------------------------------------- /src/webviews/src/ui/button/RiButton.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { instance, mock } from 'ts-mockito' 3 | 4 | import { render } from 'testSrc/helpers' 5 | import { RiButton, Props } from './RiButton' 6 | 7 | const mockedProps = mock() 8 | 9 | describe('RiButton', () => { 10 | it('should render', () => { 11 | expect(render()).toBeTruthy() 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /src/webviews/src/ui/spacer/Spacer.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { instance, mock } from 'ts-mockito' 3 | 4 | import { render } from 'testSrc/helpers' 5 | import { Spacer, Props } from './Spacer' 6 | 7 | const mockedProps = mock() 8 | 9 | describe('Spacer', () => { 10 | it('should render', async () => { 11 | expect(render()).toBeTruthy() 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /src/webviews/src/ui/tooltip/Tooltip.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { instance, mock } from 'ts-mockito' 3 | 4 | import { render } from 'testSrc/helpers' 5 | import { Tooltip, Props } from './Tooltip' 6 | 7 | const mockedProps = mock() 8 | 9 | describe('Tooltip', () => { 10 | it('should render', () => { 11 | expect(render()).toBeTruthy() 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /src/webviews/src/ui/checkbox/Checkbox.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { instance, mock } from 'ts-mockito' 3 | 4 | import { render } from 'testSrc/helpers' 5 | import { Checkbox, Props } from './Checkbox' 6 | 7 | const mockedProps = mock() 8 | 9 | describe('Checkbox', () => { 10 | it('should render', () => { 11 | expect(render()).toBeTruthy() 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /src/webviews/src/ui/text-area/TextArea.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { instance, mock } from 'ts-mockito' 3 | 4 | import { render } from 'testSrc/helpers' 5 | import { TextArea, Props } from './TextArea' 6 | 7 | const mockedProps = mock() 8 | 9 | describe('TextArea', () => { 10 | it('should render', () => { 11 | expect(render(