@elyx-code/editor-ui 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +109 -0
- package/src/App.tsx +31 -0
- package/src/Router.tsx +115 -0
- package/src/__mocks__/defaultModuleMock.ts +1 -0
- package/src/__mocks__/fileMock.ts +1 -0
- package/src/__mocks__/styleMock.ts +1 -0
- package/src/assets/Clock-11.1s-18px.svg +16 -0
- package/src/assets/Clock-11.1s-28px.svg +16 -0
- package/src/assets/authentication.svg +1 -0
- package/src/assets/canvas-backdrop-0.png +0 -0
- package/src/assets/canvas-backdrop-1.png +0 -0
- package/src/assets/canvas-backdrop-2.png +0 -0
- package/src/assets/canvas-backdrop-3.png +0 -0
- package/src/assets/canvas-backdrop-4.png +0 -0
- package/src/assets/canvas-backdrop-5.png +0 -0
- package/src/assets/canvas-backdrop.png +0 -0
- package/src/assets/checkmark-animation.gif +0 -0
- package/src/assets/checkmark-animation.mp4 +0 -0
- package/src/assets/code-formatting/format-black.svg +6 -0
- package/src/assets/code-formatting/format-dark-grey.svg +6 -0
- package/src/assets/code-formatting/format-light-grey.svg +6 -0
- package/src/assets/code-formatting/format-white.svg +6 -0
- package/src/assets/code-formatting/inline-black.svg +5 -0
- package/src/assets/code-formatting/inline-dark-grey.svg +5 -0
- package/src/assets/code-formatting/inline-light-grey.svg +5 -0
- package/src/assets/code-formatting/inline-white.svg +5 -0
- package/src/assets/contained-logo-full-word.png +0 -0
- package/src/assets/cron-job-color.png +0 -0
- package/src/assets/cron-job.png +0 -0
- package/src/assets/database-table-color.png +0 -0
- package/src/assets/database-table.png +0 -0
- package/src/assets/datatype-icons/black/any.svg +1 -0
- package/src/assets/datatype-icons/black/binary.svg +1 -0
- package/src/assets/datatype-icons/black/boolean.svg +3 -0
- package/src/assets/datatype-icons/black/date-time.svg +3 -0
- package/src/assets/datatype-icons/black/definition-entity.svg +6 -0
- package/src/assets/datatype-icons/black/key-file.svg +1 -0
- package/src/assets/datatype-icons/black/list.svg +3 -0
- package/src/assets/datatype-icons/black/null.svg +3 -0
- package/src/assets/datatype-icons/black/number.svg +13 -0
- package/src/assets/datatype-icons/black/project.svg +12 -0
- package/src/assets/datatype-icons/black/sql-program.svg +2 -0
- package/src/assets/datatype-icons/black/text.svg +3 -0
- package/src/assets/datatype-icons/black/unknown.svg +3 -0
- package/src/assets/datatype-icons/black/uuid.svg +4 -0
- package/src/assets/datatype-icons/black/void.svg +1 -0
- package/src/assets/datatype-icons/dark-grey/any.svg +1 -0
- package/src/assets/datatype-icons/dark-grey/boolean.svg +3 -0
- package/src/assets/datatype-icons/dark-grey/date-time.svg +3 -0
- package/src/assets/datatype-icons/dark-grey/definition-entity.svg +6 -0
- package/src/assets/datatype-icons/dark-grey/list.svg +3 -0
- package/src/assets/datatype-icons/dark-grey/null.svg +3 -0
- package/src/assets/datatype-icons/dark-grey/number.svg +13 -0
- package/src/assets/datatype-icons/dark-grey/project.svg +12 -0
- package/src/assets/datatype-icons/dark-grey/sql-program.svg +2 -0
- package/src/assets/datatype-icons/dark-grey/text.svg +3 -0
- package/src/assets/datatype-icons/dark-grey/unknown.svg +3 -0
- package/src/assets/datatype-icons/dark-grey/uuid.svg +4 -0
- package/src/assets/datatype-icons/dark-grey/void.svg +1 -0
- package/src/assets/datatype-icons/light-grey/any.svg +1 -0
- package/src/assets/datatype-icons/light-grey/boolean.svg +3 -0
- package/src/assets/datatype-icons/light-grey/date-time.svg +3 -0
- package/src/assets/datatype-icons/light-grey/definition-entity.svg +6 -0
- package/src/assets/datatype-icons/light-grey/list.svg +3 -0
- package/src/assets/datatype-icons/light-grey/null.svg +3 -0
- package/src/assets/datatype-icons/light-grey/number.svg +13 -0
- package/src/assets/datatype-icons/light-grey/project.svg +12 -0
- package/src/assets/datatype-icons/light-grey/sql-program.svg +2 -0
- package/src/assets/datatype-icons/light-grey/text.svg +3 -0
- package/src/assets/datatype-icons/light-grey/unknown.svg +3 -0
- package/src/assets/datatype-icons/light-grey/uuid.svg +4 -0
- package/src/assets/datatype-icons/light-grey/void.svg +1 -0
- package/src/assets/edit.png +0 -0
- package/src/assets/execution.svg +13 -0
- package/src/assets/favicon.svg +14 -0
- package/src/assets/file-search.svg +1 -0
- package/src/assets/http-endpoint.png +0 -0
- package/src/assets/image-input-placeholder.png +0 -0
- package/src/assets/logo-full-word-white.png +0 -0
- package/src/assets/logo-full-word.png +0 -0
- package/src/assets/password.svg +85 -0
- package/src/assets/pencil.png +0 -0
- package/src/assets/publish-project-rich-icon-2.svg +1 -0
- package/src/assets/publish-project-rich-icon.svg +1 -0
- package/src/assets/relational-database.png +0 -0
- package/src/assets/resources.svg +3 -0
- package/src/assets/resume-icon-14px.png +0 -0
- package/src/assets/server.png +0 -0
- package/src/assets/small-status/checkmark.svg +4 -0
- package/src/assets/small-status/error.svg +4 -0
- package/src/assets/small-status/loading.svg +4 -0
- package/src/assets/small-status/skipped.svg +11 -0
- package/src/assets/sql-connection-config.svg +1 -0
- package/src/assets/sql-row-transformer.svg +1 -0
- package/src/assets/ssl-certificate-config.svg +1 -0
- package/src/assets/sync.svg +1 -0
- package/src/assets/testing-logic-icon.svg +1 -0
- package/src/assets/versions.svg +25 -0
- package/src/assets/visual-programming-icon.svg +1 -0
- package/src/assets/warning-sign-24px.png +0 -0
- package/src/auth/index.ts +318 -0
- package/src/components/DialogLoader.tsx +94 -0
- package/src/components/EntityDialogHeader.tsx +110 -0
- package/src/components/EntityDialogSectionHeader.tsx +214 -0
- package/src/components/GalleryAddExternalIntegrationInfoDialog.tsx +87 -0
- package/src/components/GenerateProjectStartingLogicPromptDialog.tsx +281 -0
- package/src/components/LegacyRouteRedirector.tsx +55 -0
- package/src/components/ProPlanChip.tsx +23 -0
- package/src/components/ReportBugDialog.tsx +412 -0
- package/src/components/RequestIntegrationAccessDialog.tsx +261 -0
- package/src/components/UseTemplateProjectDialog.tsx +193 -0
- package/src/components/WorkspaceLayout.tsx +152 -0
- package/src/components/animated-svg/AnimatedCheckmark.tsx +41 -0
- package/src/components/animated-svg/AnimatedCrossmark.tsx +51 -0
- package/src/components/animated-svg/AnimatedEmailSending.tsx +38 -0
- package/src/components/animated-svg/AnimatedLoading.tsx +72 -0
- package/src/components/animated-svg/animated-svg.css +239 -0
- package/src/components/canvas/Canvas.tsx +16 -0
- package/src/components/canvas/CreateEntityMenu.tsx +2020 -0
- package/src/components/canvas/canvas.css +10 -0
- package/src/components/canvas/create-entity-menu.css +579 -0
- package/src/components/canvas-search/CanvasSearch.tsx +501 -0
- package/src/components/canvas-search/canvas-search.css +126 -0
- package/src/components/canvas-settings-menu/CanvasSettingsMenuButton.tsx +515 -0
- package/src/components/canvas-settings-menu/canvas-settings-menu.css +96 -0
- package/src/components/circular-image-upload/CircularImageUpload.tsx +113 -0
- package/src/components/circular-image-upload/circular-image-upload.css +69 -0
- package/src/components/costs/CostsDialog.tsx +459 -0
- package/src/components/data-type/DataTypeBuilder.tsx +3127 -0
- package/src/components/data-type/data-type-builder.css +45 -0
- package/src/components/dialogs/BetaAcknowledgeDialog.tsx +43 -0
- package/src/components/dialogs/ComplexDataDialog.tsx +458 -0
- package/src/components/dialogs/CronBuilderDialog.tsx +2145 -0
- package/src/components/dialogs/ExternalIntegrationConnections.tsx +565 -0
- package/src/components/dialogs/JsonEditorDialog.tsx +1392 -0
- package/src/components/dialogs/StringEditorDialog.tsx +268 -0
- package/src/components/dialogs/argument-declaration/ArgumentDeclaration.tsx +1167 -0
- package/src/components/dialogs/argument-declaration/ArgumentDeclarationDialogContent.tsx +128 -0
- package/src/components/dialogs/beta-dialog.css +165 -0
- package/src/components/dialogs/condition/Condition.tsx +431 -0
- package/src/components/dialogs/condition/ConditionDialogContent.tsx +126 -0
- package/src/components/dialogs/definition-entity/DefinitionEntityDialogContent.tsx +973 -0
- package/src/components/dialogs/function-call/FunctionCall.tsx +442 -0
- package/src/components/dialogs/function-call/FunctionCallDialogContent.tsx +126 -0
- package/src/components/dialogs/function-declaration/FunctionDeclaration.tsx +926 -0
- package/src/components/dialogs/function-declaration/FunctionDeclarationDialogContent.tsx +124 -0
- package/src/components/dialogs/generating-project-starting-logic-overlay/GeneratingProjectStartingLogicOverlay.tsx +176 -0
- package/src/components/dialogs/generating-project-starting-logic-overlay/generating-project-starting-logic-overlay.css +13 -0
- package/src/components/dialogs/global-event/GlobalEvent.tsx +475 -0
- package/src/components/dialogs/global-event/GlobalEventDialogContent.tsx +126 -0
- package/src/components/dialogs/help/HelpDialog.tsx +217 -0
- package/src/components/dialogs/help/HelpDilalogHomeContent.tsx +178 -0
- package/src/components/dialogs/help/help-dialog.css +116 -0
- package/src/components/dialogs/help/help-icon/HelpIconButton.tsx +41 -0
- package/src/components/dialogs/help/help-icon/help-icon.css +9 -0
- package/src/components/dialogs/input-map/InputMap.tsx +635 -0
- package/src/components/dialogs/input-map/InputMapDialogContent.tsx +126 -0
- package/src/components/dialogs/json-editor-dialog.css +4 -0
- package/src/components/dialogs/loop/Loop.tsx +650 -0
- package/src/components/dialogs/loop/LoopDialogContent.tsx +122 -0
- package/src/components/dialogs/operation/Operation.tsx +440 -0
- package/src/components/dialogs/operation/OperationDialogContent.tsx +126 -0
- package/src/components/dialogs/output-map/OutputMap.tsx +536 -0
- package/src/components/dialogs/output-map/OutputMapDialogContent.tsx +126 -0
- package/src/components/dialogs/property/Property.tsx +1490 -0
- package/src/components/dialogs/property/PropertyDialogContent.tsx +106 -0
- package/src/components/dialogs/search-statement/ColumnSelector.tsx +334 -0
- package/src/components/dialogs/search-statement/ConditionBuilder.tsx +750 -0
- package/src/components/dialogs/search-statement/DataAggregationSection.tsx +621 -0
- package/src/components/dialogs/search-statement/DataSourceSelection.tsx +734 -0
- package/src/components/dialogs/search-statement/EntityMetadataSection.tsx +135 -0
- package/src/components/dialogs/search-statement/FilterConditionsSection.tsx +151 -0
- package/src/components/dialogs/search-statement/InlineInputMap.tsx +153 -0
- package/src/components/dialogs/search-statement/LiteralValue.tsx +616 -0
- package/src/components/dialogs/search-statement/MainSourceAndInputsSection.tsx +271 -0
- package/src/components/dialogs/search-statement/NestedSearchStatementBuilder.tsx +170 -0
- package/src/components/dialogs/search-statement/OutputFormatSection.tsx +1779 -0
- package/src/components/dialogs/search-statement/ResultsSection.tsx +344 -0
- package/src/components/dialogs/search-statement/SearchStatementBuilder.tsx +251 -0
- package/src/components/dialogs/search-statement/SearchStatementDialogContent.tsx +398 -0
- package/src/components/dialogs/search-statement/ValueSelector.tsx +766 -0
- package/src/components/dialogs/search-statement/search-statement-context.tsx +1630 -0
- package/src/components/dialogs/search-statement/search-statement-dialog.css +56 -0
- package/src/components/dialogs/search-statement/test.sql +111 -0
- package/src/components/dialogs/value-descriptor/ValueDescriptor.tsx +824 -0
- package/src/components/dialogs/value-descriptor/ValueDescriptorDialogContent.tsx +124 -0
- package/src/components/dialogs/variable-declaration/VariableDeclaration.tsx +836 -0
- package/src/components/dialogs/variable-declaration/VariableDeclarationDialogContent.tsx +106 -0
- package/src/components/dialogs/variable-instance/VariableInstance.tsx +443 -0
- package/src/components/dialogs/variable-instance/VariableInstanceDialogContent.tsx +124 -0
- package/src/components/draggable-entity-card/ArgumentDeclaration.tsx +736 -0
- package/src/components/draggable-entity-card/CollapseEntityButton.tsx +170 -0
- package/src/components/draggable-entity-card/ConditionCard.tsx +1062 -0
- package/src/components/draggable-entity-card/ConnectionDeleteButton.tsx +309 -0
- package/src/components/draggable-entity-card/DataTypeIcon.tsx +624 -0
- package/src/components/draggable-entity-card/DraggableEntityCard.tsx +617 -0
- package/src/components/draggable-entity-card/ErrorMapProperty.tsx +464 -0
- package/src/components/draggable-entity-card/EventCard.tsx +700 -0
- package/src/components/draggable-entity-card/ExecutionInProgressValue.tsx +327 -0
- package/src/components/draggable-entity-card/FunctionDeclarationCard.tsx +819 -0
- package/src/components/draggable-entity-card/InputMapProperty.tsx +1067 -0
- package/src/components/draggable-entity-card/InternalCall.tsx +978 -0
- package/src/components/draggable-entity-card/InternalCallExecutionNode.tsx +643 -0
- package/src/components/draggable-entity-card/LogicScopeCallerNode.tsx +262 -0
- package/src/components/draggable-entity-card/LoopCard.tsx +791 -0
- package/src/components/draggable-entity-card/MainValueInput.tsx +523 -0
- package/src/components/draggable-entity-card/MainValueOutput.tsx +458 -0
- package/src/components/draggable-entity-card/MethodDeclaration.tsx +1088 -0
- package/src/components/draggable-entity-card/NestedCondition.tsx +1025 -0
- package/src/components/draggable-entity-card/OutputMapProperty.tsx +843 -0
- package/src/components/draggable-entity-card/PassthroughEntityCard.tsx +1247 -0
- package/src/components/draggable-entity-card/ReturnedError.tsx +549 -0
- package/src/components/draggable-entity-card/SmallSuccessFailureNodes.tsx +523 -0
- package/src/components/draggable-entity-card/SuccessFailureNodes.tsx +509 -0
- package/src/components/draggable-entity-card/TestEntityButton.tsx +946 -0
- package/src/components/draggable-entity-card/TestMenu.tsx +523 -0
- package/src/components/draggable-entity-card/TestMenuValidationDropdown.tsx +84 -0
- package/src/components/draggable-entity-card/UnreachableMarker.tsx +114 -0
- package/src/components/draggable-entity-card/VariableCard.tsx +1577 -0
- package/src/components/draggable-entity-card/VariableScopeMarker.tsx +117 -0
- package/src/components/draggable-entity-card/collapse-entity-button.css +44 -0
- package/src/components/draggable-entity-card/definition-entity/DefinitionEntityCard.tsx +1181 -0
- package/src/components/draggable-entity-card/definition-entity/DefinitionEntityIcon.tsx +36 -0
- package/src/components/draggable-entity-card/definition-entity/DefinitionEntityProperty.tsx +478 -0
- package/src/components/draggable-entity-card/definition-entity/DynamicFooterActions.tsx +112 -0
- package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/ExportCredentialsFooterAction.tsx +461 -0
- package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/RestablishConnectionFooterAction.tsx +199 -0
- package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/restablish-connection-footer-action.css +85 -0
- package/src/components/draggable-entity-card/definition-entity/actions/google-drive/GoogleDriveFilePickerAPIFooterAction.tsx +277 -0
- package/src/components/draggable-entity-card/definition-entity/actions/google-drive/google-drive-file-picker-api-footer-action.css +107 -0
- package/src/components/draggable-entity-card/definition-entity/actions/persisted-entity/DatabaseFooterAction.tsx +452 -0
- package/src/components/draggable-entity-card/definition-entity/actions/persisted-entity/database-footer-action.css +86 -0
- package/src/components/draggable-entity-card/definition-entity/definition-entity-card.css +17 -0
- package/src/components/draggable-entity-card/draggable-entity-card.css +1140 -0
- package/src/components/draggable-entity-card/entity-locked-icon/EntityLockedIcon.tsx +133 -0
- package/src/components/draggable-entity-card/entity-locked-icon/entity-locked.css +8 -0
- package/src/components/draggable-entity-card/expand-properties-icon-button/ExpandPropertiesIconButton.tsx +84 -0
- package/src/components/draggable-entity-card/expand-properties-icon-button/expand-properties-icon-button.css +21 -0
- package/src/components/draggable-entity-card/implement-entity-icon/ImplementEntityIcon.tsx +74 -0
- package/src/components/draggable-entity-card/implement-entity-icon/implement-entity-icon.css +13 -0
- package/src/components/draggable-entity-card/logic-error/LogicErrorIconMenu.tsx +424 -0
- package/src/components/draggable-entity-card/logic-error/logic-error.css +23 -0
- package/src/components/draggable-entity-card/new-card-input-button/NewCardInputButton.tsx +193 -0
- package/src/components/draggable-entity-card/new-card-input-button/NewDynamicInputButton.tsx +214 -0
- package/src/components/draggable-entity-card/new-card-input-button/new-card-input-button.css +71 -0
- package/src/components/draggable-entity-card/new-card-output-button/NewCardOutputButton.tsx +192 -0
- package/src/components/draggable-entity-card/new-card-output-button/new-card-output-button.css +71 -0
- package/src/components/draggable-entity-card/termination-statement/TerminationStatementCard.tsx +1543 -0
- package/src/components/draggable-entity-card/termination-statement/termination-statement-card.css +17 -0
- package/src/components/draggable-entity-card/test-entity-button.css +55 -0
- package/src/components/draggable-entity-card/test-menu.css +181 -0
- package/src/components/draggable-entity-card/unreachable-marker.css +43 -0
- package/src/components/draggable-entity-card/variable-scope-marker.css +22 -0
- package/src/components/dynamic-value/DynamicValue.tsx +2395 -0
- package/src/components/dynamic-value/DynamicValueEntry.tsx +1957 -0
- package/src/components/dynamic-value/dynamic-value.css +230 -0
- package/src/components/editor/ElyxMonacoEditor.tsx +38 -0
- package/src/components/entity-error/EntityErrorListItem.tsx +47 -0
- package/src/components/entity-error/entity-error.css +198 -0
- package/src/components/entity-icon/EntityIcon.tsx +292 -0
- package/src/components/entity-icon/entity-icon.css +39 -0
- package/src/components/gallery-card/CreateNewProject.tsx +222 -0
- package/src/components/gallery-card/GalleryCard.tsx +171 -0
- package/src/components/gallery-card/MarketplaceCard.tsx +87 -0
- package/src/components/gallery-card/ProjectDuplicationCard.tsx +575 -0
- package/src/components/gallery-card/gallery-card.css +25 -0
- package/src/components/notifications/NotificationsIconButton.tsx +124 -0
- package/src/components/notifications/NotificationsPanel.tsx +385 -0
- package/src/components/notifications/notifications.css +189 -0
- package/src/components/online-users/LocalOnlineUsers.tsx +175 -0
- package/src/components/online-users/PageOnlineUsers.tsx +297 -0
- package/src/components/online-users/online-users.css +72 -0
- package/src/components/page-backdrop/PageBackdrop.tsx +8 -0
- package/src/components/page-backdrop/page-backdrop.css +7 -0
- package/src/components/project-configuration/DeleteProjectConfirmationDialog.tsx +134 -0
- package/src/components/project-configuration/ProjectConfigurationDialog.tsx +972 -0
- package/src/components/project-configuration/ProjectDataForm.tsx +121 -0
- package/src/components/project-configuration/UnpublishProjectConfirmationDialog.tsx +162 -0
- package/src/components/project-configuration/project-configuration-content.css +209 -0
- package/src/components/project-name/ProjectName.tsx +2025 -0
- package/src/components/project-name/project-name.css +599 -0
- package/src/components/publishing/Publication.tsx +133 -0
- package/src/components/publishing/history/PublicationHistoryContent.tsx +414 -0
- package/src/components/publishing/history/PublicationHistoryDialog.tsx +234 -0
- package/src/components/publishing/preview/PublicationPreviewDialog.tsx +1158 -0
- package/src/components/publishing/preview/PublishingPriceForecast.tsx +160 -0
- package/src/components/publishing/preview/PublishingResourcesDetails.tsx +91 -0
- package/src/components/publishing/publication-sequence/PublishingSequenceContent.tsx +375 -0
- package/src/components/publishing/publication-sequence/PublishingSequenceDialog.tsx +344 -0
- package/src/components/publishing/publishing-dialog.css +142 -0
- package/src/components/publishing/utils.ts +227 -0
- package/src/components/resources/ResourcesDialog.tsx +591 -0
- package/src/components/resources/UpgradeBanner.tsx +102 -0
- package/src/components/resources/codebase/CodebaseDetails.tsx +156 -0
- package/src/components/resources/cron-job/CronJobsList.tsx +532 -0
- package/src/components/resources/functions/FunctionsList.tsx +454 -0
- package/src/components/resources/http-api/HttpAPI.tsx +566 -0
- package/src/components/resources/http-api/HttpAPIClientModule.tsx +37 -0
- package/src/components/resources/logs/LogsViewer.tsx +768 -0
- package/src/components/resources/query.ts +74 -0
- package/src/components/resources/relational-database/DatabaseTable.tsx +905 -0
- package/src/components/resources/relational-database/RelationalDatabase.tsx +83 -0
- package/src/components/resources/relational-database/RelationalDatabaseSecrets.tsx +361 -0
- package/src/components/resources/resources-dialog.css +74 -0
- package/src/components/test-relational-database/DatabaseTable.tsx +913 -0
- package/src/components/test-relational-database/TestDatabaseDialogContent.tsx +670 -0
- package/src/components/test-relational-database/query.ts +74 -0
- package/src/components/toolbar/ToolBar.tsx +236 -0
- package/src/components/toolbar/toolbar.css +78 -0
- package/src/components/transaction-history/TransactionHistoryDialog.tsx +268 -0
- package/src/components/user/CurrentUserAvatar.tsx +65 -0
- package/src/components/user/UserChip.tsx +62 -0
- package/src/components/user/user.css +39 -0
- package/src/components/user-profile/ChangePasswordForm.tsx +67 -0
- package/src/components/user-profile/OwnUserProfileContent.tsx +665 -0
- package/src/components/user-profile/PublicUserProfileContent.tsx +99 -0
- package/src/components/user-profile/UserDataForm.tsx +75 -0
- package/src/components/user-profile/UserProfileDialog.tsx +110 -0
- package/src/components/user-profile/user-profile-content.css +25 -0
- package/src/config.ts +130 -0
- package/src/globals.d.ts +13 -0
- package/src/index.html +27 -0
- package/src/index.tsx +23 -0
- package/src/lib/badge/Badge.tsx +35 -0
- package/src/lib/badge/badge.css +32 -0
- package/src/lib/button/Button.tsx +129 -0
- package/src/lib/button/button.css +145 -0
- package/src/lib/canvas/canvas-undo-redo.ts +263 -0
- package/src/lib/canvas/defs.ts +170 -0
- package/src/lib/canvas/index.test.ts +189 -0
- package/src/lib/canvas/index.ts +6999 -0
- package/src/lib/canvas/utils.ts +59 -0
- package/src/lib/card/Card.tsx +62 -0
- package/src/lib/card/LoadingCard.tsx +82 -0
- package/src/lib/card/card.css +259 -0
- package/src/lib/chip/Chip.tsx +79 -0
- package/src/lib/chip/chip.css +0 -0
- package/src/lib/dialog/Dialog.tsx +122 -0
- package/src/lib/dialog/SmallDialog.tsx +61 -0
- package/src/lib/dialog/dialog.css +40 -0
- package/src/lib/display-data-structure/index.tsx +21 -0
- package/src/lib/dropdown/CanvasDropdownMenuCard.tsx +68 -0
- package/src/lib/dropdown/CanvasDropdownMenuCardOption.tsx +136 -0
- package/src/lib/dropdown/DropdownButton.tsx +104 -0
- package/src/lib/dropdown/DropdownMenuCard.tsx +324 -0
- package/src/lib/dropdown/DropdownMenuPopup.tsx +27 -0
- package/src/lib/dropdown/dropdown-button.css +76 -0
- package/src/lib/dropdown/dropdown-menu.css +151 -0
- package/src/lib/json-editor/RawJsonEditor.tsx +137 -0
- package/src/lib/json-editor/json-editor.css +35 -0
- package/src/lib/loader/Loader.tsx +120 -0
- package/src/lib/loader/loader.css +38 -0
- package/src/lib/pagination/Pagination.tsx +64 -0
- package/src/lib/popup/CanvasPopupBaseComponent.tsx +103 -0
- package/src/lib/popup/Popup.tsx +243 -0
- package/src/lib/popup/popup.css +16 -0
- package/src/lib/table/RowForm.tsx +301 -0
- package/src/lib/table/Table.tsx +1069 -0
- package/src/lib/table/table.css +249 -0
- package/src/lib/table/types.ts +108 -0
- package/src/lib/text-area/TextArea.tsx +183 -0
- package/src/lib/text-area/text-area.css +156 -0
- package/src/lib/text-field/TextField.tsx +218 -0
- package/src/lib/text-field/index.ts +8 -0
- package/src/lib/text-field/text-field.css +201 -0
- package/src/lib/tooltip/Tooltip.tsx +24 -0
- package/src/lib/tooltip/tooltip.css +17 -0
- package/src/localization/index.ts +47 -0
- package/src/main.css +343 -0
- package/src/pages/Auth.tsx +848 -0
- package/src/pages/Editor.tsx +883 -0
- package/src/pages/ErrorPage.tsx +179 -0
- package/src/pages/Gallery.tsx +1693 -0
- package/src/pages/NewPaymentMethodCallback.tsx +53 -0
- package/src/pages/NotFoundPage.tsx +126 -0
- package/src/pages/PricingPlans.tsx +155 -0
- package/src/pages/auth.css +304 -0
- package/src/pages/gallery.css +421 -0
- package/src/payments/index.ts +187 -0
- package/src/popup-notification/index.ts +90 -0
- package/src/services/database/index.ts +1 -0
- package/src/services/database/utils.ts +1301 -0
- package/src/services/editor/CanvasElement.tsx +2934 -0
- package/src/services/editor/CanvasElementConnectionDeleteButton.ts +204 -0
- package/src/services/editor/CanvasPopup.tsx +749 -0
- package/src/services/editor/EditorService.ts +8157 -0
- package/src/services/editor/area.ts +1312 -0
- package/src/services/editor/connections.ts +1019 -0
- package/src/services/editor/create/condition.ts +25 -0
- package/src/services/editor/create/definition-entity.ts +29 -0
- package/src/services/editor/create/function-call.ts +25 -0
- package/src/services/editor/create/global-event.ts +33 -0
- package/src/services/editor/create/loop.ts +25 -0
- package/src/services/editor/create/operation.ts +30 -0
- package/src/services/editor/create/utils.ts +140 -0
- package/src/services/editor/create/variable-declaration.ts +135 -0
- package/src/services/editor/create/variable-instance.ts +100 -0
- package/src/services/editor/editor-ui-extensions-context.ts +43 -0
- package/src/services/editor/entities-metadata.json +9310 -0
- package/src/services/editor/icons.ts +1093 -0
- package/src/services/editor/index.ts +1 -0
- package/src/services/editor/layout.ts +102 -0
- package/src/services/editor/modules/built-in-function-implementations/base.ts +14 -0
- package/src/services/editor/modules/built-in-function-implementations/create-persisted-entity/index.ts +56 -0
- package/src/services/editor/modules/built-in-function-implementations/delete-persisted-entity/index.ts +55 -0
- package/src/services/editor/modules/built-in-function-implementations/index.ts +4 -0
- package/src/services/editor/modules/built-in-function-implementations/update-persisted-entity/index.ts +56 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/get-files.ts +183 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/list-drives.ts +124 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/list-root-folders.ts +125 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/smart-fetch-document.ts +702 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/upload-document.ts +535 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-gemini/generate-content.ts +193 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-mail/get-emails.ts +586 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/google-mail/send-email.ts +386 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/index.ts +12 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/slack/channels.ts +240 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/slack/messages.ts +210 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/slack/replies.ts +200 -0
- package/src/services/editor/modules/operations-implementations/external-integrations/slack/send-message.ts +177 -0
- package/src/services/editor/modules/operations-implementations/index.ts +1 -0
- package/src/services/editor/modules/search-node-implementation/index.ts +42 -0
- package/src/services/editor/modules/sql-migrations-generation.tsx +1054 -0
- package/src/services/editor/publication/publication.ts +578 -0
- package/src/services/editor/ui.ts +1348 -0
- package/src/services/editor/utils.ts +5868 -0
- package/src/services/editor/value-store.ts +619 -0
- package/src/services/execution/built-in-function-implementations.ts +422 -0
- package/src/services/execution/index.ts +4747 -0
- package/src/services/execution/logic.ts +121 -0
- package/src/services/execution/test-instance.tsx +2296 -0
- package/src/services/execution/utils.ts +33 -0
- package/src/services/execution/value-resolution.test.ts +424 -0
- package/src/services/execution/value-resolution.ts +4087 -0
- package/src/services/integrations/ExternalIntegrationsService.ts +439 -0
- package/src/services/integrations/api.ts +175 -0
- package/src/services/local-relational-database/idb_helper.ts +66 -0
- package/src/services/local-relational-database/index.ts +3308 -0
- package/src/services/local-relational-database/utils.ts +403 -0
- package/src/services/notifications/index.ts +525 -0
- package/src/services/user/index.ts +144 -0
- package/src/setupTests.ts +1 -0
- package/src/socket/socket.ts +248 -0
- package/src/socket/utils.ts +10 -0
- package/src/store/workspace.ts +12 -0
- package/src/theme.ts +19 -0
- package/src/utils/DOM.ts +39 -0
- package/src/utils/date.ts +169 -0
- package/src/utils/index.ts +158 -0
- package/src/utils/react.tsx +679 -0
- package/src/utils/testing.ts +103 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import type { ConnectUI } from '@nangohq/frontend';
|
|
2
|
+
import Nango from '@nangohq/frontend';
|
|
3
|
+
import {
|
|
4
|
+
editorRuntimeServiceBaseUrl,
|
|
5
|
+
getCredentials,
|
|
6
|
+
getProjectCredentials,
|
|
7
|
+
postConnectSession,
|
|
8
|
+
} from './api';
|
|
9
|
+
import { EditorService } from '../editor';
|
|
10
|
+
import { AxiosResponse } from 'axios';
|
|
11
|
+
import {
|
|
12
|
+
ApiPublicConnection,
|
|
13
|
+
ApiPublicConnectionFull,
|
|
14
|
+
AuthModes,
|
|
15
|
+
CombinedFilterAction,
|
|
16
|
+
NangoRecord,
|
|
17
|
+
UserProvidedProxyConfiguration,
|
|
18
|
+
} from '@nangohq/types';
|
|
19
|
+
import { getAccessToken } from '../../auth';
|
|
20
|
+
import {
|
|
21
|
+
BaseEntityNames,
|
|
22
|
+
BUILT_IN_BASE_ENTITY_IDS,
|
|
23
|
+
checkHasBaseEntity,
|
|
24
|
+
ExternalIntegrationNames,
|
|
25
|
+
isObject,
|
|
26
|
+
} from '@elyx-code/project-logic-tree';
|
|
27
|
+
import { Logger } from '@elyx-code/common-ts-utils';
|
|
28
|
+
import { envConfig } from '../../config';
|
|
29
|
+
|
|
30
|
+
const apiURL =
|
|
31
|
+
envConfig.EXTERNAL_INTEGRATIONS_URL ?? 'https://integrations.dev.elyx.tech';
|
|
32
|
+
const nango = new Nango({ host: apiURL, publicKey: 'empty' });
|
|
33
|
+
const connectUIBaseUrl =
|
|
34
|
+
envConfig.EXTERNAL_INTEGRATIONS_CONNECT_URL ??
|
|
35
|
+
'https://connect.dev.elyx.tech';
|
|
36
|
+
|
|
37
|
+
export interface Integration {
|
|
38
|
+
created_at: string;
|
|
39
|
+
updated_at: string;
|
|
40
|
+
unique_key: string;
|
|
41
|
+
provider: string;
|
|
42
|
+
logo: string;
|
|
43
|
+
display_name: string;
|
|
44
|
+
webhook_url?: string | null;
|
|
45
|
+
credentials?:
|
|
46
|
+
| {
|
|
47
|
+
type: AuthModes['OAuth2'] | AuthModes['OAuth1'] | AuthModes['TBA'];
|
|
48
|
+
client_id: string | null;
|
|
49
|
+
client_secret: string | null;
|
|
50
|
+
scopes: string | null;
|
|
51
|
+
}
|
|
52
|
+
| {
|
|
53
|
+
type: AuthModes['App'];
|
|
54
|
+
app_id: string | null;
|
|
55
|
+
private_key: string | null;
|
|
56
|
+
app_link: string | null;
|
|
57
|
+
}
|
|
58
|
+
| null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type GetIntegrations = {
|
|
62
|
+
integrations: Integration[];
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export interface GetConnectionsSuccess {
|
|
66
|
+
connections: ApiPublicConnection[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ListRecordsRequestConfig {
|
|
70
|
+
providerConfigKey: string;
|
|
71
|
+
connectionId: string;
|
|
72
|
+
model: string;
|
|
73
|
+
variant?: string;
|
|
74
|
+
modifiedAfter?: string;
|
|
75
|
+
limit?: number;
|
|
76
|
+
filter?: CombinedFilterAction | CombinedFilterAction;
|
|
77
|
+
cursor?: string | null;
|
|
78
|
+
ids?: string[];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export type ProxyConfiguration = Omit<
|
|
82
|
+
UserProvidedProxyConfiguration,
|
|
83
|
+
'files' | 'providerConfigKey'
|
|
84
|
+
> & {
|
|
85
|
+
providerConfigKey?: string;
|
|
86
|
+
connectionId?: string;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export interface IConnectOptions {
|
|
90
|
+
onSuccess?: (connection: ApiPublicConnection) => Promise<void> | void;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export class ExternalIntegrationsService {
|
|
94
|
+
// Service methods and logic go here
|
|
95
|
+
nango = nango;
|
|
96
|
+
|
|
97
|
+
connectUI: ConnectUI | null = null;
|
|
98
|
+
|
|
99
|
+
editor: EditorService;
|
|
100
|
+
|
|
101
|
+
allIntegrations: Integration[] = [];
|
|
102
|
+
allConnections: ApiPublicConnection[] = [];
|
|
103
|
+
|
|
104
|
+
constructor(editor: EditorService) {
|
|
105
|
+
this.editor = editor;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
integration(uniqueKey: string): Integration | null {
|
|
109
|
+
return (
|
|
110
|
+
this.allIntegrations.find(
|
|
111
|
+
(integration) => integration.unique_key === uniqueKey,
|
|
112
|
+
) || null
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// We check the existing connections against the entities in the project
|
|
117
|
+
// And return the ones that are not tracked by the project
|
|
118
|
+
getUntrackedConnections(): ApiPublicConnection[] {
|
|
119
|
+
return this.allConnections.filter((connection) => {
|
|
120
|
+
const connectionId = connection.connection_id;
|
|
121
|
+
|
|
122
|
+
const trackedIds = this.editor.project?.entities
|
|
123
|
+
.filter((entity) =>
|
|
124
|
+
checkHasBaseEntity(
|
|
125
|
+
entity,
|
|
126
|
+
BaseEntityNames.EXTERNAL_INTEGRATION_CONNECTION,
|
|
127
|
+
),
|
|
128
|
+
)
|
|
129
|
+
.map((entity) => {
|
|
130
|
+
const builtInConnectionPropertyId =
|
|
131
|
+
BUILT_IN_BASE_ENTITY_IDS['built-in-base-entity']
|
|
132
|
+
.BUILT_IN_EXTERNAL_INTEGRATION_CONNECTION_ENTITY.properties
|
|
133
|
+
.connectionId.id;
|
|
134
|
+
const connectionIdProperty = entity.properties.find(
|
|
135
|
+
(property) =>
|
|
136
|
+
property.implements.find(
|
|
137
|
+
(impl) => impl.id === builtInConnectionPropertyId,
|
|
138
|
+
) ||
|
|
139
|
+
// It could be that this is a specific connection entity, and therefore itself extends the base connection entity
|
|
140
|
+
property.implements.find(
|
|
141
|
+
(impl) => impl.extends?.id === builtInConnectionPropertyId,
|
|
142
|
+
),
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const connectionIdValue =
|
|
146
|
+
connectionIdProperty?.getDefaultValue()?.value;
|
|
147
|
+
|
|
148
|
+
return connectionIdValue as string;
|
|
149
|
+
})
|
|
150
|
+
.filter((id) => !!id);
|
|
151
|
+
|
|
152
|
+
return !trackedIds?.includes(connectionId);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
connect(
|
|
157
|
+
integrationOrOptions?: ExternalIntegrationNames | IConnectOptions,
|
|
158
|
+
options?: IConnectOptions,
|
|
159
|
+
): void {
|
|
160
|
+
// if (!integrationUniqueKey) {
|
|
161
|
+
// throw new Error(
|
|
162
|
+
// `To 'connect' you must provide an integration unique key`
|
|
163
|
+
// );
|
|
164
|
+
// }
|
|
165
|
+
|
|
166
|
+
let sanitizedUniqueKey: ExternalIntegrationNames | null = null;
|
|
167
|
+
let sanitizedOptions: IConnectOptions = options || {};
|
|
168
|
+
|
|
169
|
+
if (typeof integrationOrOptions === 'string') {
|
|
170
|
+
sanitizedUniqueKey = integrationOrOptions;
|
|
171
|
+
} else if (isObject(integrationOrOptions)) {
|
|
172
|
+
sanitizedOptions = integrationOrOptions;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// sanitizedUniqueKey = getRootExternalIntegrationFromAlias(
|
|
176
|
+
// sanitizedUniqueKey as ExternalIntegrationAliasProviders
|
|
177
|
+
// ) as ExternalIntegrationNames;
|
|
178
|
+
|
|
179
|
+
this.connectUI = nango.openConnectUI({
|
|
180
|
+
// host: connectUIBaseUrl, // Type error: Property 'host' does not exist on type 'ConnectUIOptions'
|
|
181
|
+
apiURL,
|
|
182
|
+
baseURL: connectUIBaseUrl,
|
|
183
|
+
onEvent: async (event) => {
|
|
184
|
+
if (event.type === 'close') {
|
|
185
|
+
// Open alert to notify the user
|
|
186
|
+
return;
|
|
187
|
+
} else if (event.type === 'connect') {
|
|
188
|
+
// The backend will receive a webhook with the connection info
|
|
189
|
+
// Open alert to notify the user
|
|
190
|
+
if (sanitizedOptions.onSuccess) {
|
|
191
|
+
Logger.log('Connection established successfully:', event);
|
|
192
|
+
|
|
193
|
+
// Re-fetch the connections list
|
|
194
|
+
const result =
|
|
195
|
+
await this.editor.integrationsService.listConnections();
|
|
196
|
+
|
|
197
|
+
this.allConnections = result.connections;
|
|
198
|
+
|
|
199
|
+
const newConnection = result.connections.find(
|
|
200
|
+
(connection) =>
|
|
201
|
+
connection.connection_id === event.payload.connectionId,
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
await sanitizedOptions.onSuccess(
|
|
205
|
+
newConnection as ApiPublicConnection,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
console.warn('Unknown connect external integration event type:', event);
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// We defer the token creation so the iframe can open and display a loading screen
|
|
216
|
+
setTimeout(async () => {
|
|
217
|
+
Logger.log(
|
|
218
|
+
'Creating connect session for unique key:',
|
|
219
|
+
sanitizedUniqueKey,
|
|
220
|
+
);
|
|
221
|
+
const res = await postConnectSession(
|
|
222
|
+
sanitizedUniqueKey as string,
|
|
223
|
+
this.editor.projectId,
|
|
224
|
+
);
|
|
225
|
+
Logger.log('Connect session response:', res);
|
|
226
|
+
this.connectUI!.setSessionToken(res.connectSession);
|
|
227
|
+
}, 10);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async listIntegrations(): Promise<GetIntegrations> {
|
|
231
|
+
const res = await fetch(
|
|
232
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/integrations`,
|
|
233
|
+
{
|
|
234
|
+
headers: {
|
|
235
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
if (res.status !== 200) {
|
|
241
|
+
const errorText = await res.text();
|
|
242
|
+
try {
|
|
243
|
+
// If the server returned JSON, throw the parsed object
|
|
244
|
+
// or a custom error with that data attached.
|
|
245
|
+
const errorJson = JSON.parse(errorText);
|
|
246
|
+
throw errorJson;
|
|
247
|
+
} catch (e) {
|
|
248
|
+
throw new Error(errorText || 'Error listing external integrations');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const json = (await res.json()) as GetIntegrations;
|
|
253
|
+
return json;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async listConnections(): Promise<GetConnectionsSuccess> {
|
|
257
|
+
const res = await fetch(
|
|
258
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/all-connections/${this.editor.projectId}`,
|
|
259
|
+
{
|
|
260
|
+
headers: {
|
|
261
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
if (res.status !== 200) {
|
|
267
|
+
const errorText = await res.text();
|
|
268
|
+
try {
|
|
269
|
+
// If the server returned JSON, throw the parsed object
|
|
270
|
+
// or a custom error with that data attached.
|
|
271
|
+
const errorJson = JSON.parse(errorText);
|
|
272
|
+
throw errorJson;
|
|
273
|
+
} catch (e) {
|
|
274
|
+
throw new Error(
|
|
275
|
+
errorText || 'Error listing external integrations connections',
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const json = (await res.json()) as GetConnectionsSuccess;
|
|
281
|
+
|
|
282
|
+
this.allConnections = json.connections;
|
|
283
|
+
|
|
284
|
+
return json;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Generic list method which can be used to list any records from any integration
|
|
288
|
+
async listRecords<T extends Record<string, any> = any>(
|
|
289
|
+
providerConfigKey: string,
|
|
290
|
+
connectionId: string,
|
|
291
|
+
model: string,
|
|
292
|
+
config: Omit<
|
|
293
|
+
ListRecordsRequestConfig,
|
|
294
|
+
'providerConfigKey' | 'connectionId' | 'model'
|
|
295
|
+
> = {},
|
|
296
|
+
): Promise<{
|
|
297
|
+
records: NangoRecord<T>[];
|
|
298
|
+
next_cursor: string | null;
|
|
299
|
+
}> {
|
|
300
|
+
const querySanitisedConfig = {
|
|
301
|
+
variant: config.variant,
|
|
302
|
+
modifiedAfter: config.modifiedAfter,
|
|
303
|
+
limit: config.limit ? String(config.limit) : undefined,
|
|
304
|
+
filter: config.filter,
|
|
305
|
+
cursor: config.cursor,
|
|
306
|
+
ids: config.ids ? config.ids.join(',') : undefined,
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
// Loop over the keys and remove undefined values
|
|
310
|
+
Object.keys(querySanitisedConfig).forEach((key) => {
|
|
311
|
+
// @ts-ignore
|
|
312
|
+
if (querySanitisedConfig[key] === undefined) {
|
|
313
|
+
// @ts-ignore
|
|
314
|
+
delete querySanitisedConfig[key];
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
const queryParams = new URLSearchParams(
|
|
319
|
+
querySanitisedConfig as Record<string, string>,
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
const url = `${editorRuntimeServiceBaseUrl}/v1/external-integrations/list-records/${providerConfigKey}/${connectionId}/${model}?${queryParams.toString()}`;
|
|
323
|
+
|
|
324
|
+
const res = await fetch(url, {
|
|
325
|
+
method: 'GET',
|
|
326
|
+
headers: {
|
|
327
|
+
'Content-Type': 'application/json',
|
|
328
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
if (res.status !== 200) {
|
|
333
|
+
const errorText = await res.text();
|
|
334
|
+
try {
|
|
335
|
+
// If the server returned JSON, throw the parsed object
|
|
336
|
+
// or a custom error with that data attached.
|
|
337
|
+
const errorJson = JSON.parse(errorText);
|
|
338
|
+
throw errorJson;
|
|
339
|
+
} catch (e) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
errorText || 'Error listing records from external integration',
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const json = (await res.json()) as {
|
|
347
|
+
records: NangoRecord<T>[];
|
|
348
|
+
next_cursor: string | null;
|
|
349
|
+
};
|
|
350
|
+
return json;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Generic method to get a single record
|
|
354
|
+
async get<T = any>(
|
|
355
|
+
providerConfigKey: string,
|
|
356
|
+
connectionId: string,
|
|
357
|
+
config: ProxyConfiguration,
|
|
358
|
+
): Promise<AxiosResponse<T>> {
|
|
359
|
+
const res = await fetch(
|
|
360
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/get-item/${providerConfigKey}/${connectionId}`,
|
|
361
|
+
{
|
|
362
|
+
method: 'POST',
|
|
363
|
+
headers: {
|
|
364
|
+
'Content-Type': 'application/json',
|
|
365
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
366
|
+
},
|
|
367
|
+
body: JSON.stringify(config),
|
|
368
|
+
},
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
if (res.status !== 200) {
|
|
372
|
+
const errorText = await res.text();
|
|
373
|
+
try {
|
|
374
|
+
// If the server returned JSON, throw the parsed object
|
|
375
|
+
// or a custom error with that data attached.
|
|
376
|
+
const errorJson = JSON.parse(errorText);
|
|
377
|
+
throw errorJson;
|
|
378
|
+
} catch (e) {
|
|
379
|
+
throw new Error(
|
|
380
|
+
errorText || 'Error getting item from external integration',
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
const json = (await res.json()) as AxiosResponse<T>;
|
|
386
|
+
return json;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Generic method to trigger an action
|
|
390
|
+
async triggerAction<In = unknown, Out = object>(
|
|
391
|
+
providerConfigKey: string,
|
|
392
|
+
connectionId: string,
|
|
393
|
+
action: string,
|
|
394
|
+
payload: In,
|
|
395
|
+
): Promise<Out> {
|
|
396
|
+
const res = await fetch(
|
|
397
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/trigger-action/${providerConfigKey}/${connectionId}/${action}`,
|
|
398
|
+
{
|
|
399
|
+
method: 'POST',
|
|
400
|
+
headers: {
|
|
401
|
+
'Content-Type': 'application/json',
|
|
402
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
403
|
+
},
|
|
404
|
+
body: JSON.stringify({
|
|
405
|
+
// providerConfigKey,
|
|
406
|
+
// connectionId,
|
|
407
|
+
// action,
|
|
408
|
+
payload,
|
|
409
|
+
}),
|
|
410
|
+
},
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
if (res.status !== 200) {
|
|
414
|
+
const errorText = await res.text();
|
|
415
|
+
try {
|
|
416
|
+
// If the server returned JSON, throw the parsed object
|
|
417
|
+
// or a custom error with that data attached.
|
|
418
|
+
const errorJson = JSON.parse(errorText);
|
|
419
|
+
throw errorJson;
|
|
420
|
+
} catch (e) {
|
|
421
|
+
throw new Error(
|
|
422
|
+
errorText || 'Error triggering external integration action',
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const json = (await res.json()) as Out;
|
|
427
|
+
return json;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
getProjectCredentials(
|
|
431
|
+
connectionIds?: string[],
|
|
432
|
+
): Promise<{ credentials: ApiPublicConnectionFull[] }> {
|
|
433
|
+
return getProjectCredentials(this.editor.projectId, connectionIds);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
getCredentials(integrationId: string, connectionId: string): Promise<any> {
|
|
437
|
+
return getCredentials(this.editor.projectId, integrationId, connectionId);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { ApiPublicConnectionFull } from '@nangohq/types';
|
|
2
|
+
import { getAccessToken } from '../../auth';
|
|
3
|
+
import { envConfig } from '../../config';
|
|
4
|
+
|
|
5
|
+
export const editorRuntimeServiceBaseUrl =
|
|
6
|
+
`${envConfig.API_BASE_URL}/editor-runtime` ||
|
|
7
|
+
'http://localhost:3010';
|
|
8
|
+
|
|
9
|
+
type File = {
|
|
10
|
+
[key: string]: any;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export async function postConnectSession(
|
|
14
|
+
integration: string,
|
|
15
|
+
projectId: string
|
|
16
|
+
): Promise<any> {
|
|
17
|
+
const res = await fetch(
|
|
18
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/connect-session/${projectId}`,
|
|
19
|
+
{
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: {
|
|
22
|
+
'Content-Type': 'application/json',
|
|
23
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
24
|
+
},
|
|
25
|
+
body: JSON.stringify({ integration }),
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
if (res.status !== 200) {
|
|
29
|
+
throw new Error();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const json = (await res.json()) as any;
|
|
33
|
+
return json;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function listIntegrations(): Promise<any> {
|
|
37
|
+
const res = await fetch(`${editorRuntimeServiceBaseUrl}/integrations`, {
|
|
38
|
+
method: 'GET',
|
|
39
|
+
headers: {
|
|
40
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
if (res.status !== 200) {
|
|
44
|
+
throw new Error();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const json = (await res.json()) as any;
|
|
48
|
+
return json;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export async function listConnections(): Promise<any> {
|
|
52
|
+
const res = await fetch(`${editorRuntimeServiceBaseUrl}/v1/external-integrations/connections`, {
|
|
53
|
+
method: 'GET',
|
|
54
|
+
headers: {
|
|
55
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
if (res.status !== 200) {
|
|
59
|
+
throw new Error();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const json = (await res.json()) as any;
|
|
63
|
+
return json;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function getNangoCredentials(integrationId: string): Promise<any> {
|
|
67
|
+
const res = await fetch(
|
|
68
|
+
`${editorRuntimeServiceBaseUrl}/nango-credentials?integrationId=${integrationId}`
|
|
69
|
+
);
|
|
70
|
+
if (res.status !== 200) {
|
|
71
|
+
throw new Error('Failed to get Nango credentials');
|
|
72
|
+
}
|
|
73
|
+
return res.json();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function setConnectionMetadata(
|
|
77
|
+
integrationId: string,
|
|
78
|
+
metadata: Record<string, any>
|
|
79
|
+
): Promise<void> {
|
|
80
|
+
const res = await fetch(
|
|
81
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/set-connection-metadata`,
|
|
82
|
+
{
|
|
83
|
+
method: 'POST',
|
|
84
|
+
headers: {
|
|
85
|
+
'Content-Type': 'application/json',
|
|
86
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({ integrationId, metadata }),
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
if (res.status !== 200) {
|
|
92
|
+
throw new Error('Failed to set connection metadata');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function getFiles(): Promise<File[]> {
|
|
97
|
+
const res = await fetch(`${editorRuntimeServiceBaseUrl}/get-files`);
|
|
98
|
+
if (res.status !== 200) {
|
|
99
|
+
throw new Error('Failed to get files');
|
|
100
|
+
}
|
|
101
|
+
const json: { files: File[] } = await res.json();
|
|
102
|
+
return json.files;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function downloadFile(fileId: string): Promise<Blob> {
|
|
106
|
+
const res = await fetch(`${editorRuntimeServiceBaseUrl}/download/${fileId}`, {
|
|
107
|
+
method: 'GET',
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
if (!res.ok) {
|
|
111
|
+
throw new Error('Failed to download file');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return res.blob();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export async function deleteConnection(integration: string): Promise<void> {
|
|
118
|
+
const res = await fetch(
|
|
119
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/connections/${integration}`,
|
|
120
|
+
{
|
|
121
|
+
headers: {
|
|
122
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
123
|
+
},
|
|
124
|
+
method: 'DELETE',
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
if (res.status !== 200) {
|
|
128
|
+
throw new Error('Failed to delete connection');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export async function getProjectCredentials(
|
|
133
|
+
projectId: string,
|
|
134
|
+
connectionIds?: string[]
|
|
135
|
+
): Promise<{ credentials: ApiPublicConnectionFull[] }> {
|
|
136
|
+
const res = await fetch(
|
|
137
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/credentials/${projectId}${
|
|
138
|
+
!!connectionIds ? `?connectionIds=${connectionIds.join(',')}` : ''
|
|
139
|
+
}`,
|
|
140
|
+
{
|
|
141
|
+
method: 'GET',
|
|
142
|
+
headers: {
|
|
143
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
144
|
+
},
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
if (res.status !== 200) {
|
|
149
|
+
throw new Error('Failed to get credentials');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return res.json();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export async function getCredentials(
|
|
156
|
+
projectId: string,
|
|
157
|
+
integrationId: string,
|
|
158
|
+
connectionId: string
|
|
159
|
+
): Promise<{ credentials: ApiPublicConnectionFull[] }> {
|
|
160
|
+
const res = await fetch(
|
|
161
|
+
`${editorRuntimeServiceBaseUrl}/v1/external-integrations/credentials/${projectId}/${integrationId}/${connectionId}`,
|
|
162
|
+
{
|
|
163
|
+
method: 'GET',
|
|
164
|
+
headers: {
|
|
165
|
+
Authorization: `Bearer ${await getAccessToken()}`,
|
|
166
|
+
},
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
if (res.status !== 200) {
|
|
171
|
+
throw new Error('Failed to get credentials');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return res.json();
|
|
175
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Logger } from '@elyx-code/common-ts-utils';
|
|
2
|
+
import { IDataBase, Connection } from 'jsstore';
|
|
3
|
+
import SqlWeb from 'sqlweb';
|
|
4
|
+
|
|
5
|
+
const getWorkerPath = () => {
|
|
6
|
+
try {
|
|
7
|
+
if (process.env.NODE_ENV === 'development') {
|
|
8
|
+
return require('file-loader?name=scripts/[name].[hash].js!jsstore/dist/jsstore.worker.js');
|
|
9
|
+
} else {
|
|
10
|
+
return require('file-loader?name=scripts/[name].[hash].js!jsstore/dist/jsstore.worker.min.js');
|
|
11
|
+
}
|
|
12
|
+
} catch (ex) {
|
|
13
|
+
// Logger.error(ex);
|
|
14
|
+
return {
|
|
15
|
+
default: '',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Ensure that we are using only one instance.
|
|
21
|
+
// Otherwise due to multiple instance multiple worker will be created.
|
|
22
|
+
const workerPath = getWorkerPath().default;
|
|
23
|
+
|
|
24
|
+
export const initLocalDBConnection = async (): Promise<
|
|
25
|
+
Connection & {
|
|
26
|
+
$sql: {
|
|
27
|
+
run: (sql: string) => Promise<any>;
|
|
28
|
+
};
|
|
29
|
+
} & {
|
|
30
|
+
database: IDataBase;
|
|
31
|
+
}
|
|
32
|
+
> => {
|
|
33
|
+
try {
|
|
34
|
+
const idbCon = !!workerPath
|
|
35
|
+
? new Connection(new Worker(workerPath))
|
|
36
|
+
: new Connection();
|
|
37
|
+
|
|
38
|
+
// Add SqlWeb so we can use raw SQL queries
|
|
39
|
+
await idbCon.addPlugin(SqlWeb);
|
|
40
|
+
|
|
41
|
+
return idbCon as Connection & {
|
|
42
|
+
$sql: {
|
|
43
|
+
run: (sql: string) => Promise<any>;
|
|
44
|
+
};
|
|
45
|
+
} & {
|
|
46
|
+
database: IDataBase;
|
|
47
|
+
};
|
|
48
|
+
} catch (ex) {
|
|
49
|
+
Logger.log('Here');
|
|
50
|
+
Logger.error('HERE :', ex);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const initLocalIndexedDatabase = async (
|
|
55
|
+
connection: Connection,
|
|
56
|
+
database: IDataBase
|
|
57
|
+
): Promise<boolean> => {
|
|
58
|
+
try {
|
|
59
|
+
Logger.log('Initializing database at jsstore level');
|
|
60
|
+
|
|
61
|
+
return connection.initDb(database);
|
|
62
|
+
} catch (ex) {
|
|
63
|
+
Logger.log('Here');
|
|
64
|
+
Logger.error('HERE :', ex);
|
|
65
|
+
}
|
|
66
|
+
};
|