diff --git a/Makefile b/Makefile index 841baacc..9550473b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ include .env export -generate-metadata-real: +generate-metadata-dev: npx ts-node -r tsconfig-paths/register -P tools/tsconfig.tools.json tools/scripts/metadata/insert-real-metadata.ts libs/connectors/framework generate-metadata-prod: diff --git a/apps/web/app/app/subscriptions/SubscriptionCard.tsx b/apps/web/app/app/subscriptions/SubscriptionCard.tsx index 7c901e73..be1ed997 100644 --- a/apps/web/app/app/subscriptions/SubscriptionCard.tsx +++ b/apps/web/app/app/subscriptions/SubscriptionCard.tsx @@ -3,7 +3,7 @@ import { Separator } from '@linkerry/ui-components/client' import { Card, CardContent, H4 } from '@linkerry/ui-components/server' import dayjs from 'dayjs' import { HTMLAttributes } from 'react' -import { ConfigurationItem } from '../../../modules/billing/components/ConfigItem' +import { KeyValueItem } from '../../../shared/components/KeyValueItem' export interface SubscriptionCardProps extends HTMLAttributes { subscription: SubscriptionPopulated @@ -67,7 +67,7 @@ export const SubscriptionCard = ({ subscription }: SubscriptionCardProps) => { Current Plan: {item.product.name} {(Object.entries(planConfigurationDetails) as [keyof PlanProductConfiguration, PlanConfigurationDetailsValue][]).map(([name, value]) => ( - + ))} // diff --git a/apps/web/app/app/subscriptions/UsageCard.tsx b/apps/web/app/app/subscriptions/UsageCard.tsx index be9acd7b..a3b00fdb 100644 --- a/apps/web/app/app/subscriptions/UsageCard.tsx +++ b/apps/web/app/app/subscriptions/UsageCard.tsx @@ -3,8 +3,8 @@ import { Separator } from '@linkerry/ui-components/client' import { Card, CardContent, H4 } from '@linkerry/ui-components/server' import dayjs from 'dayjs' import { HTMLAttributes } from 'react' -import { ConfigurationItem } from '../../../modules/billing/components/ConfigItem' import { ErrorInfo } from '../../../shared/components' +import { KeyValueItem } from '../../../shared/components/KeyValueItem' export interface UsageCardProps extends HTMLAttributes { subscription: SubscriptionPopulated @@ -32,7 +32,7 @@ export const UsageCard = ({ usage, subscription }: UsageCardProps) => {

Current Usage

{(Object.entries(planConfigurationDetails) as [keyof PlanProductConfiguration, PlanConfigurationDetailsValue][]).map(([name, value]) => ( - {} @@ -46,7 +46,7 @@ export const ReachLimitDialog = () => { if (!itemValue) itemValue = usage[name] ? `${usage[name]} / ${currentPlan?.config[name]}` : '-' return ( - {} @@ -21,6 +27,7 @@ export interface EditorFlowMenuProps extends HTMLAttributes {} export const EditorFlowMenu = ({ children }: EditorFlowMenuProps) => { const { flow, updateFlowVersionDisplayName, publishFlow, flowOperationRunning, setFlowStatus, onClickFlowRuns } = useEditor() const [flowVersionName, setFlowVersionName] = useState(flow.version.displayName) + const [flowDetails, showFlowDetails] = useState(false) const inputFlowVersionNameRef = useRef(null) const { toast } = useToast() const flowValidity = useMemo(() => { @@ -170,6 +177,29 @@ export const EditorFlowMenu = ({ children }: EditorFlowMenuProps) => { */} + {/* flowDetails, showFlowDetails */} + + + + + + + + + Flow Details + + + Flow ID (don't show anybody) + + } + value={flow._id} + /> + + ) diff --git a/apps/web/modules/editor/store/triggersSlice.ts b/apps/web/modules/editor/store/triggersSlice.ts index b7331b04..f3c5d1a9 100644 --- a/apps/web/modules/editor/store/triggersSlice.ts +++ b/apps/web/modules/editor/store/triggersSlice.ts @@ -255,7 +255,7 @@ export const createTriggersSlice: CreateSlice = (set, get) => ({ set({ webhookTriggerWatcherWorks: false, }) - if (typeof data === 'string') { + if ('message' in data) { // neutral message like "manual cancelation", "timeout" set({ flowOperationRunning: null, diff --git a/apps/web/modules/editor/store/types.ts b/apps/web/modules/editor/store/types.ts index 10f62c35..28fd6668 100644 --- a/apps/web/modules/editor/store/types.ts +++ b/apps/web/modules/editor/store/types.ts @@ -12,6 +12,8 @@ import { TriggerConnector, TriggerEvent, WEBSOCKET_NAMESPACE, + WatchTriggerEventsWSResponse, + WatchTriggerEventsWSResponseFailure, } from '@linkerry/shared' import { Dispatch, SetStateAction } from 'react' import { Edge, OnConnect, OnEdgesChange, OnNodesChange } from 'reactflow' @@ -98,7 +100,7 @@ export interface TriggersSlice { patchEditedTriggerConnector: (update: DeepPartial>) => Promise resetTrigger: (triggerName: string) => Promise testPoolTrigger: () => Promise - testWebhookTrigger: () => Promise + testWebhookTrigger: () => Promise webhookTriggerWatcherWorks: boolean cancelWebhookTrigger: () => Promise } diff --git a/apps/web/modules/editor/trigger/TriggerWebhookSimulation.tsx b/apps/web/modules/editor/trigger/TriggerWebhookSimulation.tsx index 77661e02..9e04e1f9 100644 --- a/apps/web/modules/editor/trigger/TriggerWebhookSimulation.tsx +++ b/apps/web/modules/editor/trigger/TriggerWebhookSimulation.tsx @@ -31,6 +31,7 @@ export const TriggerWebhookSimulation = ({ panelSize, disabled, disabledMessage, cancelWebhookTrigger, webhookTriggerWatcherWorks, } = useEditor() + const [errorMessage, setErrorMessage] = useState('') assertNotNullOrUndefined(editedTrigger?.name, 'editedTrigger.name') if (!isConnectorTrigger(editedTrigger)) throw new CustomError('Invalid trigger type, can not use other than ConnectorTrigger', ErrorCode.INVALID_TYPE, { @@ -89,14 +90,20 @@ export const TriggerWebhookSimulation = ({ panelSize, disabled, disabledMessage, if (status === 'pending') return const onClickTest = async () => { + setErrorMessage('') + try { const triggerEventsData = await testWebhookTrigger() - if (typeof triggerEventsData === 'string') - return toast({ - title: 'Stop Test Trigger Webhook', - description: triggerEventsData, - variant: 'default', - }) + if ('message' in triggerEventsData) { + if (triggerEventsData.error) { + return setErrorMessage(triggerEventsData.message) + } else + return toast({ + title: 'Stop Test Trigger Webhook', + description: triggerEventsData.message, + variant: 'default', + }) + } const queryClient = getBrowserQueryCllient() queryClient.setQueryData(['trigger-events', editedTrigger.name], triggerEventsData) @@ -104,19 +111,10 @@ export const TriggerWebhookSimulation = ({ panelSize, disabled, disabledMessage, setSelectedTriggerEventId(triggerEventsData[triggerEventsData.length - 1]._id) setInitialTime(dayjs().format()) } catch (error: any) { - if (typeof error === 'string') - toast({ - title: 'Test Trigger Webhook Error', - description: error, - variant: 'destructive', - }) + if (typeof error === 'string') return setErrorMessage(error) else { console.error(error) - toast({ - title: 'Test Trigger Webhook Error', - description: 'Unknwon error occurred', - variant: 'destructive', - }) + return setErrorMessage('Unknwon error occurred') } } } @@ -212,6 +210,8 @@ export const TriggerWebhookSimulation = ({ panelSize, disabled, disabledMessage,
)} + {errorMessage.length ? : null} + {record && ( { const [isOpen, setIsOpen] = useState(false) - const [hide, setHide] = useState(false) + const [hide, setHide] = useState(true) const accept = () => { setIsOpen(false) diff --git a/apps/web/modules/billing/components/ConfigItem.tsx b/apps/web/shared/components/KeyValueItem.tsx similarity index 65% rename from apps/web/modules/billing/components/ConfigItem.tsx rename to apps/web/shared/components/KeyValueItem.tsx index dbb6f423..2e7a68f3 100644 --- a/apps/web/modules/billing/components/ConfigItem.tsx +++ b/apps/web/shared/components/KeyValueItem.tsx @@ -1,12 +1,12 @@ import { cn } from '@linkerry/ui-components/utils' import { HTMLAttributes } from 'react' -export interface ConfigurationItemProps extends HTMLAttributes { - label: string +export interface KeyValueItemProps extends HTMLAttributes { + label: string | JSX.Element value: string | number } -export const ConfigurationItem = ({ label, value, className }: ConfigurationItemProps) => { +export const KeyValueItem = ({ label, value, className }: KeyValueItemProps) => { return (

{label}: diff --git a/docs/ai-prompts/describe-connector.md b/docs/ai-prompts/describe-connector.md new file mode 100644 index 00000000..8fe60c91 --- /dev/null +++ b/docs/ai-prompts/describe-connector.md @@ -0,0 +1,5 @@ +Write short descriptions for app which will be used as a plugin to create flows. + +Examples: +``` +``` diff --git a/libs/connectors/binance/src/index.ts b/libs/connectors/binance/src/index.ts index 026b47df..e266ef54 100644 --- a/libs/connectors/binance/src/index.ts +++ b/libs/connectors/binance/src/index.ts @@ -23,7 +23,9 @@ export const coingecko = createConnector({ displayName: 'Binance', logoUrl: '/images/connectors/binance.png', triggers: [], - description: 'Binance connector for interacting with the bigest cryptocurrency exchange', + description: 'Binance connector for interacting with the biggest cryptocurrency exchange', + descriptionLong: + "The Binance connector is a comprehensive tool designed for seamless interaction with the world's largest cryptocurrency exchange, Binance. With this app, you can execute a wide range of functionalities including placing buy and sell orders, checking real-time market prices, and managing your portfolio. It allows you to track your account balances, access detailed trading history, and automate trading strategies with ease. Additionally, the connector supports advanced features like setting stop-loss and take-profit limits, and integrating various trading bots. Whether you're a novice trader or a seasoned crypto investor, this connector provides a robust solution for all your Binance exchange needs.", minimumSupportedRelease: '0.0.0', actions: [ cancelAllSymbolOrdersActionFactory(BinanceClient, binanceAuth), diff --git a/libs/connectors/framework/src/lib/connectors.ts b/libs/connectors/framework/src/lib/connectors.ts index 18a119a0..8c0b77ca 100644 --- a/libs/connectors/framework/src/lib/connectors.ts +++ b/libs/connectors/framework/src/lib/connectors.ts @@ -14,6 +14,7 @@ export class Connector(par params.displayName, params.logoUrl, params.description, + params.descriptionLong || '', params.minimumSupportedRelease, params.maximumSupportedRelease ?? '9999.9999.9999', params.tags, diff --git a/libs/connectors/trading-view/.eslintrc.json b/libs/connectors/trading-view/.eslintrc.json new file mode 100644 index 00000000..c9748d24 --- /dev/null +++ b/libs/connectors/trading-view/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "extends": ["../../../.eslintrc.base.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": "error" + } + } + ] +} diff --git a/libs/connectors/trading-view/README.md b/libs/connectors/trading-view/README.md new file mode 100644 index 00000000..88f0fe59 --- /dev/null +++ b/libs/connectors/trading-view/README.md @@ -0,0 +1,7 @@ +# connectors-trading-view + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build connectors-trading-view` to build the library. diff --git a/libs/connectors/trading-view/package.json b/libs/connectors/trading-view/package.json new file mode 100644 index 00000000..8b539c7c --- /dev/null +++ b/libs/connectors/trading-view/package.json @@ -0,0 +1,10 @@ +{ + "name": "@linkerry/trading-view", + "version": "0.0.1", + "dependencies": { + "tslib": "^2.3.0" + }, + "type": "commonjs", + "main": "./src/index.js", + "typings": "./src/index.d.ts" +} diff --git a/libs/connectors/trading-view/project.json b/libs/connectors/trading-view/project.json new file mode 100644 index 00000000..00343c91 --- /dev/null +++ b/libs/connectors/trading-view/project.json @@ -0,0 +1,21 @@ +{ + "name": "connectors-trading-view", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/connectors/trading-view/src", + "projectType": "library", + "tags": [], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/libs/connectors/trading-view", + "main": "libs/connectors/trading-view/src/index.ts", + "tsConfig": "libs/connectors/trading-view/tsconfig.lib.json", + "assets": ["libs/connectors/trading-view/*.md"], + "buildableProjectDepsInPackageJsonType": "dependencies", + "updateBuildableProjectDepsInPackageJson": true + } + } + } +} diff --git a/libs/connectors/trading-view/src/common/instructions.ts b/libs/connectors/trading-view/src/common/instructions.ts new file mode 100644 index 00000000..b3f0e85c --- /dev/null +++ b/libs/connectors/trading-view/src/common/instructions.ts @@ -0,0 +1,24 @@ +/* eslint-disable no-useless-escape */ + +export const instructions = { + instructions_webhook_url: `You need to paste webhook URL in the "Notification" tab at Trading View alert. + +This URL should be: *https://api.linkerry.com/api/v1/webhooks/\*. +Replace \ to the current flow ID. You can find this ID by clicking the **"Details"** button on the top menu. For **testing purpose**, you must append "/simulate" to the end of URL, so it should looks like *https://api.linkerry.com/api/v1/webhooks/\/simulate*. After test back to the previous URL without "/simulate". +**Don't show this URLs to anybody**.`, + instructions_message: `You need to prepare the correct webhook message. Go to the "Settings" tab for your TradingView alert and fill in the "Message" input. It must be a valid JSON. You can refer to this [TradingView tutorial](https://www.tradingview.com/support/solutions/43000529348-about-webhooks/) on how to create this message and include the necessary data. + +This JSON data will be available in the next flow steps. You can use dynamic variables provided by TradingView. Check [this article](https://www.tradingview.com/support/solutions/43000531021-how-to-use-a-variable-value-in-alert/) to learn how to use them. + +Correct message can looks like: +\`\`\` +{ + "symbol": "{{ticker}}", + "price": "{{close}}", + "price_time": "{{time}}", + "webhook_time": "{{timenow}}", + "my_fixed_message": "This is fixed message, it can be use later in flow for example to send to Telegram", + "to_buy_at_CEX": "BTC/USDT" +} +\`\`\``, +} diff --git a/libs/connectors/trading-view/src/index.ts b/libs/connectors/trading-view/src/index.ts new file mode 100644 index 00000000..388d2322 --- /dev/null +++ b/libs/connectors/trading-view/src/index.ts @@ -0,0 +1,14 @@ +import { ConnectorAuth, createConnector } from '@linkerry/connectors-framework' +import { tradingViewNewAlert } from './triggers/new-alert' + +export const telegramBot = createConnector({ + displayName: 'Trading View', + description: 'Live advanced charting and analysis for financial markets', + minimumSupportedRelease: '0.0.0', + logoUrl: '/images/connectors/trading-view.png', + tags: ['alerts', 'chart', 'cryptocurrency', 'data feed', 'exchange', 'stock market', 'trading'], + auth: ConnectorAuth.None(), + actions: [ + ], + triggers: [tradingViewNewAlert], +}) diff --git a/libs/connectors/trading-view/src/triggers/new-alert.ts b/libs/connectors/trading-view/src/triggers/new-alert.ts new file mode 100644 index 00000000..9da5da61 --- /dev/null +++ b/libs/connectors/trading-view/src/triggers/new-alert.ts @@ -0,0 +1,32 @@ +/* eslint-disable no-useless-escape */ +import { Property, createTrigger } from '@linkerry/connectors-framework' +import { TriggerStrategy } from '@linkerry/shared' +import { instructions } from '../common/instructions' + +export const tradingViewNewAlert = createTrigger({ + name: 'new_alert', + displayName: 'New Alert', + description: 'Triggers when Trading View trigger new Alert', + props: { + instructions_webhook_url: Property.MarkDown({ + displayName: 'Webhook URL', + description: instructions.instructions_webhook_url, + }), + instructions_message: Property.MarkDown({ + displayName: 'Alert Message', + description: instructions.instructions_message, + }), + }, + type: TriggerStrategy.WEBHOOK, + // sampleData: { + // }, + async onEnable(context) { + console.log('Trading View enabled') + }, + async onDisable(context) { + console.log('Trading View disabled') + }, + async run(context) { + return context.payload.body + }, +}) diff --git a/libs/connectors/trading-view/tsconfig.json b/libs/connectors/trading-view/tsconfig.json new file mode 100644 index 00000000..f2400abe --- /dev/null +++ b/libs/connectors/trading-view/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/connectors/trading-view/tsconfig.lib.json b/libs/connectors/trading-view/tsconfig.lib.json new file mode 100644 index 00000000..8f9c818e --- /dev/null +++ b/libs/connectors/trading-view/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/nest-core/src/modules/flows/trigger-events/trigger-events.service.ts b/libs/nest-core/src/modules/flows/trigger-events/trigger-events.service.ts index 446c1735..91f27903 100644 --- a/libs/nest-core/src/modules/flows/trigger-events/trigger-events.service.ts +++ b/libs/nest-core/src/modules/flows/trigger-events/trigger-events.service.ts @@ -33,7 +33,10 @@ import { TriggerEventModel } from './schemas/trigger-events.schema' import { InsertNewTrigerEventEvent, SaveTriggerEventInput } from './types' // const listeners = new Map void>() -const listeners = new Map Promise; cancel: () => Promise }>() +const listeners = new Map< + string, + { resolve: (data: WatchTriggerEventsWSResponse) => Promise; cancel: (errorMessage?: string) => Promise } +>() const triggerEventsWatchers = new Map['collection']['watch']>>() @Injectable() @@ -363,10 +366,12 @@ export class TriggerEventsService { this.logger.log(`#watchTriggerEvents success listenerKey=${listenerKey}`) resolve(data) }, - cancel: async () => { + cancel: async (errorMessage?: string) => { await clearSideEffects() this.logger.log(`#watchTriggerEvents canceled listenerKey=${listenerKey}`) - resolve('Manula cancelation') + if (errorMessage) { + resolve({ error: true, message: errorMessage }) + } else resolve({ error: false, message: 'Manula cancelation' }) }, } @@ -379,19 +384,19 @@ export class TriggerEventsService { timeout = setTimeout(async () => { this.logger.debug(`#watchTriggerEvents timeout`) await clearSideEffects() - resolve(`Trigger events timeout`) + resolve({ error: false, message: 'Trigger events timeout' }) }, this.WEBHOOK_TIMEOUT_MS) listeners.set(listenerKey, listenerHandlers) } }) } - async cancelTriggerEventsWatcher(input: WatchTriggerEventsWSInput) { + async cancelTriggerEventsWatcher(input: WatchTriggerEventsWSInput, errorMessage?: string) { const listenerKey = `${input.flowId}/${input.triggerName}` const listener = listeners.get(listenerKey) if (listener) { - await listener.cancel() + await listener.cancel(errorMessage) } } diff --git a/libs/nest-core/src/modules/flows/triggers/trigger-hooks/trigger-hooks.service.ts b/libs/nest-core/src/modules/flows/triggers/trigger-hooks/trigger-hooks.service.ts index 6c6186f7..711d3678 100644 --- a/libs/nest-core/src/modules/flows/triggers/trigger-hooks/trigger-hooks.service.ts +++ b/libs/nest-core/src/modules/flows/triggers/trigger-hooks/trigger-hooks.service.ts @@ -301,10 +301,13 @@ export class TriggerHooks { projectId, }) - if (result.success && Array.isArray(result.output)) { + if (result?.success && Array.isArray(result.output)) { payloads = result.output } else { this.logger.error(`Flow ${flowTrigger.name} with ${connectorTrigger.name} trigger throws and error, returning as zero payload `, result) + + // for simulate purpose return errorts to pass it to the frontend + if(simulate) return result as any payloads = [] } diff --git a/libs/nest-core/src/modules/webhooks/webhooks.service.ts b/libs/nest-core/src/modules/webhooks/webhooks.service.ts index 9398d317..7738e5ac 100644 --- a/libs/nest-core/src/modules/webhooks/webhooks.service.ts +++ b/libs/nest-core/src/modules/webhooks/webhooks.service.ts @@ -37,7 +37,7 @@ export class WebhooksService { payload, projectId, }) - .catch((error) => { + .catch((error: any) => { this.logger.error(`#_saveSampleDataForWebhookTesting`, error) }) } @@ -198,6 +198,17 @@ export class WebhooksService { simulate: true, }) + // this mean that there was an error durning simulation + if (typeof events === 'string') { + return await this.triggerEventsService.cancelTriggerEventsWatcher( + { + flowId: flow._id, + triggerName: flow.version.triggers[0].name, + }, + events, + ) + } + if (events.length === 0) { return } diff --git a/libs/shared/src/lib/modules/flows/triggers/trigger-events.ts b/libs/shared/src/lib/modules/flows/triggers/trigger-events.ts index 95a67ca1..a6ce4464 100644 --- a/libs/shared/src/lib/modules/flows/triggers/trigger-events.ts +++ b/libs/shared/src/lib/modules/flows/triggers/trigger-events.ts @@ -19,9 +19,14 @@ export interface WatchTriggerEventsWSInput { triggerName: string } +export type WatchTriggerEventsWSResponseFailure = { + error: boolean + message: string +} + export type WatchTriggerEventsWSResponse = | { triggerEvents: TriggerEvent[] flowVersion: FlowVersion } - | string + | WatchTriggerEventsWSResponseFailure diff --git a/tools/scripts/package-manager/package-pre-publish-checks.ts b/tools/scripts/package-manager/package-pre-publish-checks.ts index 665f4bc7..f3455d55 100644 --- a/tools/scripts/package-manager/package-pre-publish-checks.ts +++ b/tools/scripts/package-manager/package-pre-publish-checks.ts @@ -43,10 +43,7 @@ const getLatestPublishedVersionPrivateRegistry = async (packageName: string, max for (let attempt = 1; attempt <= maxRetries; attempt++) { const URL = - process.env.NODE_ENV === 'production' - ? // ? `https://package-registry.linkerry.com/${packageName}/latest` - `http://64.226.97.74:4873/${packageName}/latest` - : `http://localhost:4873/${packageName}/latest` + process.env.NODE_ENV === 'production' ? `http://64.226.97.74:4873/${packageName}/latest` : `http://localhost:4873/${packageName}/latest` try { const response = await axios(URL, { diff --git a/tools/scripts/package-manager/publish.mjs b/tools/scripts/package-manager/publish.mjs index fcd59220..9872bf1c 100644 --- a/tools/scripts/package-manager/publish.mjs +++ b/tools/scripts/package-manager/publish.mjs @@ -54,7 +54,7 @@ try { const REGISTRY = process.env.NODE_ENV === 'production' ? process.env.REGISTRY_URL : 'http://localhost:4873/' const main = async () => { - const {stderr, stdout} = await exec(`npm publish --registry ${process.env.REGISTRY_URL} --access public --tag ${tag}`) + const {stderr, stdout} = await exec(`npm publish --registry ${REGISTRY} --access public --tag ${tag}`) // execSync(`npm publish --registry ${process.env.REGISTRY_URL} --access public --tag ${tag}`) process.exit(0) } diff --git a/tsconfig.base.json b/tsconfig.base.json index 3a581938..86125942 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -22,6 +22,7 @@ "@linkerry/common-exchanges": ["libs/connectors/common-exchanges/src/index.ts"], "@linkerry/connectors-common": ["libs/connectors/common/src/index.ts"], "@linkerry/connectors-framework": ["libs/connectors/framework/src/index.ts"], + "@linkerry/trading-view": ["libs/connectors/trading-view/src/index.ts"], "@linkerry/discord": ["libs/connectors/discord/src/index.ts"], "@linkerry/engine": ["libs/engine/src/index.ts"], "@linkerry/google-sheets": ["libs/connectors/google-sheets/src/index.ts"],