diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e4303d7..f596c17b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' cache: 'yarn' cache-dependency-path: yarn.lock - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." @@ -24,7 +24,7 @@ jobs: - run: yarn --frozen-lockfile - run: yarn lint - run: echo "🍏 This job's status is ${{ job.status }}." - build-backend: + start-backend-server: runs-on: ubuntu-latest steps: - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." @@ -33,13 +33,36 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' cache: 'yarn' cache-dependency-path: yarn.lock - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "🖥️ The workflow is now ready to test your code on the runner." - run: yarn --frozen-lockfile && yarn lerna bootstrap - - run: cd packages/backend && yarn build + - run: cd packages/backend && yarn start + env: + ENCRYPTION_KEY: sample_encryption_key + WEBHOOK_SECRET_KEY: sample_webhook_secret_key + - run: echo "🍏 This job's status is ${{ job.status }}." + start-backend-worker: + runs-on: ubuntu-latest + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '18' + cache: 'yarn' + cache-dependency-path: yarn.lock + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - run: yarn --frozen-lockfile && yarn lerna bootstrap + - run: cd packages/backend && yarn start:worker + env: + ENCRYPTION_KEY: sample_encryption_key + WEBHOOK_SECRET_KEY: sample_webhook_secret_key - run: echo "🍏 This job's status is ${{ job.status }}." build-web: runs-on: ubuntu-latest @@ -50,7 +73,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' cache: 'yarn' cache-dependency-path: yarn.lock - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." @@ -69,12 +92,11 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' cache: 'yarn' cache-dependency-path: yarn.lock - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "🖥️ The workflow is now ready to test your code on the runner." - run: yarn --frozen-lockfile && yarn lerna bootstrap - - run: cd packages/backend && yarn build - run: cd packages/cli && yarn build - run: echo "🍏 This job's status is ${{ job.status }}." diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index a16ec858..9c750e7c 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -63,13 +63,13 @@ jobs: - name: Install Playwright Browsers run: yarn playwright install --with-deps - name: Build Automatisch - run: yarn lerna run --scope=@*/{web,backend,cli} build + run: yarn lerna run --scope=@*/{web,cli} build env: # Keep this until we clean up warnings in build processes CI: false - name: Migrate database working-directory: ./packages/backend - run: yarn db:migrate --migrations-directory ./dist/src/db/migrations + run: yarn db:migrate - name: Seed user working-directory: ./packages/backend run: yarn db:seed:user & @@ -96,7 +96,7 @@ jobs: run: yarn start & working-directory: ./packages/backend - name: Run Automatisch worker - run: node dist/src/worker.js & + run: yarn start:worker & working-directory: ./packages/backend - name: Setup upterm session if: false diff --git a/.node-version b/.node-version index 99cdd800..a9d08739 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -16.15.0 +18.19.0 diff --git a/.nvmrc b/.nvmrc index 99cdd800..a9d08739 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.15.0 +18.19.0 diff --git a/docker/Dockerfile b/docker/Dockerfile index cfcf7960..4fa5e8f7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1 -FROM node:16-alpine +FROM node:18-alpine WORKDIR /automatisch RUN \ diff --git a/docker/Dockerfile.cloud b/docker/Dockerfile.cloud index 94057b49..6fbbab10 100644 --- a/docker/Dockerfile.cloud +++ b/docker/Dockerfile.cloud @@ -1,17 +1,22 @@ # syntax=docker/dockerfile:1 -FROM node:16-alpine -WORKDIR /automatisch +FROM node:18-alpine ENV PORT 3000 -RUN ls -lna +RUN \ + apk --no-cache add --virtual build-dependencies python3 build-base git -# copy the app, note .dockerignore -COPY . ./ +RUN git clone -b https://github.com/automatisch/automatisch.git -RUN yarn -RUN yarn lerna bootstrap -RUN yarn lerna run --scope=@*/{web,backend,cli} build +WORKDIR /automatisch + +RUN yarn install + +RUN if [ "$WORKER" != "true" ]; then cd packages/web && yarn build; fi + +RUN \ + rm -rf /usr/local/share/.cache/ && \ + apk del build-dependencies COPY ./docker/entrypoint-cloud.sh /entrypoint-cloud.sh diff --git a/docker/entrypoint-cloud.sh b/docker/entrypoint-cloud.sh index 04b6d61d..322a468d 100755 --- a/docker/entrypoint-cloud.sh +++ b/docker/entrypoint-cloud.sh @@ -2,8 +2,12 @@ set -e +cd packages/backend + if [ -n "$WORKER" ]; then - yarn automatisch start-worker + yarn start:worker else - yarn automatisch start + yarn db:migrate + yarn db:seed:user + yarn start fi diff --git a/packages/backend/.eslintrc.js b/packages/backend/.eslintrc.js deleted file mode 100644 index 395cd7c2..00000000 --- a/packages/backend/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - root: true, - env: { - node: true, - }, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'prettier', - ], - overrides: [ - { - files: ['**/*.test.ts', '**/test/**/*.ts'], - rules: { - '@typescript-eslint/ban-ts-comment': ['off'], - '@typescript-eslint/no-explicit-any': ['off'], - }, - }, - { - files: ['**/*.ts'], - rules: { - '@typescript-eslint/no-explicit-any': ['off'], - }, - }, - ], -}; diff --git a/packages/backend/.eslintrc.json b/packages/backend/.eslintrc.json new file mode 100644 index 00000000..3731ac72 --- /dev/null +++ b/packages/backend/.eslintrc.json @@ -0,0 +1,12 @@ +{ + "root": true, + "env": { + "node": true, + "es6": true + }, + "extends": ["eslint:recommended", "prettier"], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + } +} diff --git a/packages/backend/bin/database/client.ts b/packages/backend/bin/database/client.js similarity index 59% rename from packages/backend/bin/database/client.ts rename to packages/backend/bin/database/client.js index 52ceed4f..08681b9e 100644 --- a/packages/backend/bin/database/client.ts +++ b/packages/backend/bin/database/client.js @@ -1,6 +1,6 @@ -import { Client } from 'pg'; +import pg from 'pg'; -const client = new Client({ +const client = new pg.Client({ host: 'localhost', user: 'postgres', port: 5432, diff --git a/packages/backend/bin/database/convert-migrations.js b/packages/backend/bin/database/convert-migrations.js new file mode 100644 index 00000000..e7d0243a --- /dev/null +++ b/packages/backend/bin/database/convert-migrations.js @@ -0,0 +1,26 @@ +import appConfig from '../../src/config/app.js'; +import logger from '../../src/helpers/logger.js'; +import '../../src/config/orm.js'; +import { client as knex } from '../../src/config/database.js'; + +export const renameMigrationsAsJsFiles = async () => { + if (!appConfig.isDev) { + return; + } + + try { + await knex.raw( + `UPDATE knex_migrations SET name = REPLACE(name, '.ts', '.js') WHERE name LIKE '%.ts';` + ); + + logger.info( + `Migration file names with typescript renamed as JS file names!` + ); + } catch (err) { + logger.error(err.message); + } + + await knex.destroy(); +}; + +renameMigrationsAsJsFiles(); diff --git a/packages/backend/bin/database/create.js b/packages/backend/bin/database/create.js new file mode 100644 index 00000000..572db5f5 --- /dev/null +++ b/packages/backend/bin/database/create.js @@ -0,0 +1,3 @@ +import { createDatabaseAndUser } from './utils.js'; + +createDatabaseAndUser(); diff --git a/packages/backend/bin/database/create.ts b/packages/backend/bin/database/create.ts deleted file mode 100644 index 9b13967d..00000000 --- a/packages/backend/bin/database/create.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createDatabaseAndUser } from './utils'; - -createDatabaseAndUser(); diff --git a/packages/backend/bin/database/drop.js b/packages/backend/bin/database/drop.js new file mode 100644 index 00000000..15b97022 --- /dev/null +++ b/packages/backend/bin/database/drop.js @@ -0,0 +1,3 @@ +import { dropDatabase } from './utils.js'; + +dropDatabase(); diff --git a/packages/backend/bin/database/drop.ts b/packages/backend/bin/database/drop.ts deleted file mode 100644 index 834d2949..00000000 --- a/packages/backend/bin/database/drop.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { dropDatabase } from './utils'; - -dropDatabase(); diff --git a/packages/backend/bin/database/seed-user.js b/packages/backend/bin/database/seed-user.js new file mode 100644 index 00000000..25f9bf7f --- /dev/null +++ b/packages/backend/bin/database/seed-user.js @@ -0,0 +1,3 @@ +import { createUser } from './utils.js'; + +createUser(); diff --git a/packages/backend/bin/database/seed-user.ts b/packages/backend/bin/database/seed-user.ts deleted file mode 100644 index 0ce56315..00000000 --- a/packages/backend/bin/database/seed-user.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createUser } from './utils'; - -createUser(); diff --git a/packages/backend/bin/database/utils.ts b/packages/backend/bin/database/utils.js similarity index 85% rename from packages/backend/bin/database/utils.ts rename to packages/backend/bin/database/utils.js index 3f6fce51..5e79c05d 100644 --- a/packages/backend/bin/database/utils.ts +++ b/packages/backend/bin/database/utils.js @@ -1,15 +1,14 @@ -import appConfig from '../../src/config/app'; -import logger from '../../src/helpers/logger'; -import client from './client'; -import User from '../../src/models/user'; -import Role from '../../src/models/role'; -import '../../src/config/orm'; +import appConfig from '../../src/config/app.js'; +import logger from '../../src/helpers/logger.js'; +import client from './client.js'; +import User from '../../src/models/user.js'; +import Role from '../../src/models/role.js'; +import '../../src/config/orm.js'; async function fetchAdminRole() { - const role = await Role - .query() + const role = await Role.query() .where({ - key: 'admin' + key: 'admin', }) .limit(1) .first(); @@ -41,7 +40,7 @@ export async function createUser( logger.info('No need to seed a user.'); } } catch (err) { - if ((err as any).nativeError.code !== UNIQUE_VIOLATION_CODE) { + if (err.nativeError.code !== UNIQUE_VIOLATION_CODE) { throw err; } @@ -68,7 +67,7 @@ export const createDatabase = async (database = appConfig.postgresDatabase) => { await client.query(`CREATE DATABASE ${database}`); logger.info(`Database: ${database} created!`); } catch (err) { - if ((err as any).code !== DUPLICATE_DB_CODE) { + if (err.code !== DUPLICATE_DB_CODE) { throw err; } @@ -85,7 +84,7 @@ export const createDatabaseUser = async (user = appConfig.postgresUsername) => { return result; } catch (err) { - if ((err as any).code !== DUPLICATE_OBJECT_CODE) { + if (err.code !== DUPLICATE_OBJECT_CODE) { throw err; } diff --git a/packages/backend/database-utils.d.ts b/packages/backend/database-utils.d.ts deleted file mode 100644 index 70df8d4a..00000000 --- a/packages/backend/database-utils.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist/bin/database/utils'; diff --git a/packages/backend/database-utils.js b/packages/backend/database-utils.js deleted file mode 100644 index 26504cbd..00000000 --- a/packages/backend/database-utils.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -module.exports = require('./dist/bin/database/utils'); diff --git a/packages/backend/database.d.ts b/packages/backend/database.d.ts deleted file mode 100644 index c5515232..00000000 --- a/packages/backend/database.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist/src/config/database'; diff --git a/packages/backend/database.js b/packages/backend/database.js deleted file mode 100644 index 96b681a6..00000000 --- a/packages/backend/database.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -module.exports = require('./dist/src/config/database'); diff --git a/packages/backend/jest.config.js b/packages/backend/jest.config.js deleted file mode 100644 index 41118f8d..00000000 --- a/packages/backend/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - setupFilesAfterEnv: ['./test/setup/global-hooks.ts'], - globalTeardown: './test/setup/global-teardown.ts', - collectCoverage: true, - collectCoverageFrom: ['src/graphql/queries/*.ts'], -}; diff --git a/packages/backend/knexfile.ts b/packages/backend/knexfile.js similarity index 78% rename from packages/backend/knexfile.ts rename to packages/backend/knexfile.js index 5a4d0a48..0748c74b 100644 --- a/packages/backend/knexfile.ts +++ b/packages/backend/knexfile.js @@ -1,7 +1,10 @@ import { knexSnakeCaseMappers } from 'objection'; -import appConfig from './src/config/app'; +import appConfig from './src/config/app.js'; +import path from 'path'; +import { fileURLToPath } from 'url'; -const fileExtension = appConfig.isDev || appConfig.isTest ? 'ts' : 'js'; +const fileExtension = 'js'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const knexConfig = { client: 'pg', diff --git a/packages/backend/logger.d.ts b/packages/backend/logger.d.ts deleted file mode 100644 index 1d049ef5..00000000 --- a/packages/backend/logger.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist/src/helpers/logger'; diff --git a/packages/backend/logger.js b/packages/backend/logger.js deleted file mode 100644 index a26b29a1..00000000 --- a/packages/backend/logger.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -module.exports = require('./dist/src/helpers/logger'); diff --git a/packages/backend/package.json b/packages/backend/package.json index f645d548..6c400ba4 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -3,27 +3,23 @@ "version": "0.10.0", "license": "See LICENSE file", "description": "The open source Zapier alternative. Build workflow automation without spending time and money.", + "type": "module", "scripts": { - "dev": "ts-node-dev --watch 'src/graphql/schema.graphql' --exit-child src/server.ts", - "worker": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/worker.ts", - "build": "tsc && yarn copy-statics", - "build:watch": "nodemon --watch 'src/**/*.ts' --watch 'bin/**/*.ts' --exec yarn build --ext ts", - "start": "node dist/src/server.js", - "pretest": "APP_ENV=test ts-node ./test/setup/prepare-test-env.ts", - "test": "APP_ENV=test jest --verbose", + "dev": "nodemon --watch 'src/**/*.js' --exec 'node' src/server.js", + "worker": "nodemon --watch 'src/**/*.js' --exec 'node' src/worker.js", + "start": "node src/server.js", + "start:worker": "node src/worker.js", + "pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js", + "test": "APP_ENV=test vitest run", "lint": "eslint . --ignore-path ../../.eslintignore", - "db:create": "ts-node ./bin/database/create.ts", - "db:seed:user": "ts-node ./bin/database/seed-user.ts", - "db:drop": "ts-node ./bin/database/drop.ts", + "db:create": "node ./bin/database/create.js", + "db:seed:user": "node ./bin/database/seed-user.js", + "db:drop": "node ./bin/database/drop.js", "db:migration:create": "knex migrate:make", "db:rollback": "knex migrate:rollback", - "db:migrate": "knex migrate:latest", - "copy-statics": "copyfiles src/**/*.{graphql,json,svg,hbs} dist", - "prepack": "yarn build", - "prebuild": "rm -rf ./dist" + "db:migrate": "node ./bin/database/convert-migrations.js && knex migrate:latest" }, "dependencies": { - "@automatisch/web": "^0.10.0", "@bull-board/express": "^3.10.1", "@casl/ability": "^6.5.0", "@graphql-tools/graphql-file-loader": "^7.3.4", @@ -32,10 +28,6 @@ "@rudderstack/rudder-sdk-node": "^1.1.2", "@sentry/node": "^7.42.0", "@sentry/tracing": "^7.42.0", - "@types/accounting": "^0.4.2", - "@types/luxon": "^2.3.1", - "@types/passport": "^1.0.12", - "@types/xmlrpc": "^1.3.7", "accounting": "^0.4.1", "ajv-formats": "^2.1.1", "axios": "1.6.0", @@ -87,26 +79,15 @@ } ], "homepage": "https://github.com/automatisch/automatisch#readme", - "main": "dist/src/app", + "main": "src/server", "directories": { "bin": "bin", "src": "src", "test": "__tests__" }, "files": [ - "dist", "bin", - "src", - "server.js", - "server.d.ts", - "worker.js", - "worker.d.ts", - "logger.js", - "logger.d.ts", - "database.js", - "database.d.ts", - "database-utils.js", - "database-utils.d.ts" + "src" ], "repository": { "type": "git", @@ -116,34 +97,9 @@ "url": "https://github.com/automatisch/automatisch/issues" }, "devDependencies": { - "@automatisch/types": "^0.10.0", - "@faker-js/faker": "^8.1.0", - "@types/bcrypt": "^5.0.0", - "@types/bull": "^3.15.8", - "@types/cors": "^2.8.12", - "@types/crypto-js": "^4.0.2", - "@types/express": "^4.17.15", - "@types/http-errors": "^1.8.1", - "@types/jest": "^29.5.5", - "@types/jsonwebtoken": "^8.5.8", - "@types/lodash.get": "^4.4.6", - "@types/memory-cache": "^0.2.2", - "@types/morgan": "^1.9.3", - "@types/multer": "1.4.7", - "@types/node": "^16.10.2", - "@types/nodemailer": "^6.4.4", - "@types/pg": "^8.6.1", - "@types/pino": "^7.0.5", - "@types/pluralize": "^0.0.30", - "@types/showdown": "^2.0.1", - "@types/supertest": "^2.0.14", - "jest": "^29.7.0", "nodemon": "^2.0.13", - "sinon": "^11.1.2", "supertest": "^6.3.3", - "ts-jest": "^29.1.1", - "ts-node": "^10.2.1", - "ts-node-dev": "^1.1.8" + "vitest": "^1.1.3" }, "publishConfig": { "access": "public" diff --git a/packages/backend/server.d.ts b/packages/backend/server.d.ts deleted file mode 100644 index b940dac2..00000000 --- a/packages/backend/server.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist/src/server'; diff --git a/packages/backend/server.js b/packages/backend/server.js deleted file mode 100644 index 821f6b37..00000000 --- a/packages/backend/server.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -module.exports = require('./dist/src/server.js'); diff --git a/packages/backend/src/app.ts b/packages/backend/src/app.js similarity index 61% rename from packages/backend/src/app.ts rename to packages/backend/src/app.js index aafb336a..170439ba 100644 --- a/packages/backend/src/app.ts +++ b/packages/backend/src/app.js @@ -2,22 +2,21 @@ import createError from 'http-errors'; import express from 'express'; import cors from 'cors'; -import { IRequest } from '@automatisch/types'; -import appConfig from './config/app'; -import corsOptions from './config/cors-options'; -import morgan from './helpers/morgan'; -import * as Sentry from './helpers/sentry.ee'; -import appAssetsHandler from './helpers/app-assets-handler'; -import webUIHandler from './helpers/web-ui-handler'; -import errorHandler from './helpers/error-handler'; -import './config/orm'; +import appConfig from './config/app.js'; +import corsOptions from './config/cors-options.js'; +import morgan from './helpers/morgan.js'; +import * as Sentry from './helpers/sentry.ee.js'; +import appAssetsHandler from './helpers/app-assets-handler.js'; +import webUIHandler from './helpers/web-ui-handler.js'; +import errorHandler from './helpers/error-handler.js'; +import './config/orm.js'; import { createBullBoardHandler, serverAdapter, -} from './helpers/create-bull-board-handler'; -import injectBullBoardHandler from './helpers/inject-bull-board-handler'; -import router from './routes'; -import configurePassport from './helpers/passport'; +} from './helpers/create-bull-board-handler.js'; +import injectBullBoardHandler from './helpers/inject-bull-board-handler.js'; +import router from './routes/index.js'; +import configurePassport from './helpers/passport.js'; createBullBoardHandler(serverAdapter); @@ -38,7 +37,7 @@ app.use( express.json({ limit: appConfig.requestBodySizeLimit, verify(req, res, buf) { - (req as IRequest).rawBody = buf; + req.rawBody = buf; }, }) ); @@ -47,7 +46,7 @@ app.use( extended: true, limit: appConfig.requestBodySizeLimit, verify(req, res, buf) { - (req as IRequest).rawBody = buf; + req.rawBody = buf; }, }) ); diff --git a/packages/backend/src/apps/azure-openai/actions/index.js b/packages/backend/src/apps/azure-openai/actions/index.js new file mode 100644 index 00000000..44f6cbc0 --- /dev/null +++ b/packages/backend/src/apps/azure-openai/actions/index.js @@ -0,0 +1,3 @@ +import sendPrompt from './send-prompt/index.js'; + +export default [sendPrompt]; diff --git a/packages/backend/src/apps/azure-openai/actions/index.ts b/packages/backend/src/apps/azure-openai/actions/index.ts deleted file mode 100644 index b91a5287..00000000 --- a/packages/backend/src/apps/azure-openai/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendPrompt from './send-prompt'; - -export default [sendPrompt]; diff --git a/packages/backend/src/apps/azure-openai/actions/send-prompt/index.js b/packages/backend/src/apps/azure-openai/actions/send-prompt/index.js new file mode 100644 index 00000000..91ae3070 --- /dev/null +++ b/packages/backend/src/apps/azure-openai/actions/send-prompt/index.js @@ -0,0 +1,97 @@ +import defineAction from '../../../../helpers/define-action.js'; + +const castFloatOrUndefined = (value) => { + return value === '' ? undefined : parseFloat(value); +}; + +export default defineAction({ + name: 'Send prompt', + key: 'sendPrompt', + description: 'Creates a completion for the provided prompt and parameters.', + arguments: [ + { + label: 'Prompt', + key: 'prompt', + type: 'string', + required: true, + variables: true, + description: 'The text to analyze.', + }, + { + label: 'Temperature', + key: 'temperature', + type: 'string', + required: false, + variables: true, + description: + 'What sampling temperature to use, between 0 and 2. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or Top P but not both.', + }, + { + label: 'Maximum tokens', + key: 'maxTokens', + type: 'string', + required: false, + variables: true, + description: + 'The maximum number of tokens to generate in the completion.', + }, + { + label: 'Stop Sequence', + key: 'stopSequence', + type: 'string', + required: false, + variables: true, + description: + 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.', + }, + { + label: 'Top P', + key: 'topP', + type: 'string', + required: false, + variables: true, + description: + 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.', + }, + { + label: 'Frequency Penalty', + key: 'frequencyPenalty', + type: 'string', + required: false, + variables: true, + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.`, + }, + { + label: 'Presence Penalty', + key: 'presencePenalty', + type: 'string', + required: false, + variables: true, + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.`, + }, + ], + + async run($) { + const payload = { + model: $.step.parameters.model, + prompt: $.step.parameters.prompt, + temperature: castFloatOrUndefined($.step.parameters.temperature), + max_tokens: castFloatOrUndefined($.step.parameters.maxTokens), + stop: $.step.parameters.stopSequence || null, + top_p: castFloatOrUndefined($.step.parameters.topP), + frequency_penalty: castFloatOrUndefined( + $.step.parameters.frequencyPenalty + ), + presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty), + }; + + const { data } = await $.http.post( + `/deployments/${$.auth.data.deploymentId}/completions`, + payload + ); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/azure-openai/actions/send-prompt/index.ts b/packages/backend/src/apps/azure-openai/actions/send-prompt/index.ts deleted file mode 100644 index 302a4b9d..00000000 --- a/packages/backend/src/apps/azure-openai/actions/send-prompt/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -import defineAction from '../../../../helpers/define-action'; - -const castFloatOrUndefined = (value: string | null) => { - return value === '' ? undefined : parseFloat(value); -} - -export default defineAction({ - name: 'Send prompt', - key: 'sendPrompt', - description: 'Creates a completion for the provided prompt and parameters.', - arguments: [ - { - label: 'Prompt', - key: 'prompt', - type: 'string' as const, - required: true, - variables: true, - description: 'The text to analyze.' - }, - { - label: 'Temperature', - key: 'temperature', - type: 'string' as const, - required: false, - variables: true, - description: 'What sampling temperature to use, between 0 and 2. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. We generally recommend altering this or Top P but not both.' - }, - { - label: 'Maximum tokens', - key: 'maxTokens', - type: 'string' as const, - required: false, - variables: true, - description: 'The maximum number of tokens to generate in the completion.' - }, - { - label: 'Stop Sequence', - key: 'stopSequence', - type: 'string' as const, - required: false, - variables: true, - description: 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.' - }, - { - label: 'Top P', - key: 'topP', - type: 'string' as const, - required: false, - variables: true, - description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both.' - }, - { - label: 'Frequency Penalty', - key: 'frequencyPenalty', - type: 'string' as const, - required: false, - variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.` - }, - { - label: 'Presence Penalty', - key: 'presencePenalty', - type: 'string' as const, - required: false, - variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.` - }, - ], - - async run($) { - const payload = { - model: $.step.parameters.model as string, - prompt: $.step.parameters.prompt as string, - temperature: castFloatOrUndefined($.step.parameters.temperature as string), - max_tokens: castFloatOrUndefined($.step.parameters.maxTokens as string), - stop: ($.step.parameters.stopSequence as string || null), - top_p: castFloatOrUndefined($.step.parameters.topP as string), - frequency_penalty: castFloatOrUndefined($.step.parameters.frequencyPenalty as string), - presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty as string), - }; - const { data } = await $.http.post(`/deployments/${$.auth.data.deploymentId}/completions`, payload); - - $.setActionItem({ - raw: data, - }); - }, -}); diff --git a/packages/backend/src/apps/azure-openai/auth/index.ts b/packages/backend/src/apps/azure-openai/auth/index.js similarity index 85% rename from packages/backend/src/apps/azure-openai/auth/index.ts rename to packages/backend/src/apps/azure-openai/auth/index.js index 716b4f10..3de895d5 100644 --- a/packages/backend/src/apps/azure-openai/auth/index.ts +++ b/packages/backend/src/apps/azure-openai/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'yourResourceName', label: 'Your Resource Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -30,7 +30,7 @@ export default { { key: 'deploymentId', label: 'Deployment ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -42,7 +42,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/azure-openai/auth/is-still-verified.js b/packages/backend/src/apps/azure-openai/auth/is-still-verified.js new file mode 100644 index 00000000..a88adf3b --- /dev/null +++ b/packages/backend/src/apps/azure-openai/auth/is-still-verified.js @@ -0,0 +1,6 @@ +const isStillVerified = async ($) => { + await $.http.get('/fine_tuning/jobs'); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/azure-openai/auth/is-still-verified.ts b/packages/backend/src/apps/azure-openai/auth/is-still-verified.ts deleted file mode 100644 index 4c990b92..00000000 --- a/packages/backend/src/apps/azure-openai/auth/is-still-verified.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { - await $.http.get('/fine_tuning/jobs'); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/azure-openai/auth/verify-credentials.js b/packages/backend/src/apps/azure-openai/auth/verify-credentials.js new file mode 100644 index 00000000..3f0e9dd1 --- /dev/null +++ b/packages/backend/src/apps/azure-openai/auth/verify-credentials.js @@ -0,0 +1,5 @@ +const verifyCredentials = async ($) => { + await $.http.get('/fine_tuning/jobs'); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/azure-openai/auth/verify-credentials.ts b/packages/backend/src/apps/azure-openai/auth/verify-credentials.ts deleted file mode 100644 index 946257d0..00000000 --- a/packages/backend/src/apps/azure-openai/auth/verify-credentials.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - await $.http.get('/fine_tuning/jobs'); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/azure-openai/common/add-auth-header.js b/packages/backend/src/apps/azure-openai/common/add-auth-header.js new file mode 100644 index 00000000..9e367063 --- /dev/null +++ b/packages/backend/src/apps/azure-openai/common/add-auth-header.js @@ -0,0 +1,13 @@ +const addAuthHeader = ($, requestConfig) => { + if ($.auth.data?.apiKey) { + requestConfig.headers['api-key'] = $.auth.data.apiKey; + } + + requestConfig.params = { + 'api-version': '2023-10-01-preview', + }; + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/azure-openai/common/add-auth-header.ts b/packages/backend/src/apps/azure-openai/common/add-auth-header.ts deleted file mode 100644 index 277fad8e..00000000 --- a/packages/backend/src/apps/azure-openai/common/add-auth-header.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data?.apiKey) { - requestConfig.headers['api-key'] = $.auth.data.apiKey as string; - } - - requestConfig.params = { - 'api-version': '2023-10-01-preview' - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/azure-openai/common/set-base-url.js b/packages/backend/src/apps/azure-openai/common/set-base-url.js new file mode 100644 index 00000000..222ccf79 --- /dev/null +++ b/packages/backend/src/apps/azure-openai/common/set-base-url.js @@ -0,0 +1,11 @@ +const setBaseUrl = ($, requestConfig) => { + const yourResourceName = $.auth.data.yourResourceName; + + if (yourResourceName) { + requestConfig.baseURL = `https://${yourResourceName}.openai.azure.com/openai`; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/azure-openai/common/set-base-url.ts b/packages/backend/src/apps/azure-openai/common/set-base-url.ts deleted file mode 100644 index 7e90dcfd..00000000 --- a/packages/backend/src/apps/azure-openai/common/set-base-url.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - const yourResourceName = $.auth.data.yourResourceName as string; - - if (yourResourceName) { - requestConfig.baseURL = `https://${yourResourceName}.openai.azure.com/openai`; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/azure-openai/index.d.ts b/packages/backend/src/apps/azure-openai/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/azure-openai/index.ts b/packages/backend/src/apps/azure-openai/index.js similarity index 51% rename from packages/backend/src/apps/azure-openai/index.ts rename to packages/backend/src/apps/azure-openai/index.js index 77f570c3..d319470e 100644 --- a/packages/backend/src/apps/azure-openai/index.ts +++ b/packages/backend/src/apps/azure-openai/index.js @@ -1,13 +1,14 @@ -import defineApp from '../../helpers/define-app'; -import setBaseUrl from './common/set-base-url'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import setBaseUrl from './common/set-base-url.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Azure OpenAI', key: 'azure-openai', - baseUrl: 'https://azure.microsoft.com/en-us/products/ai-services/openai-service', + baseUrl: + 'https://azure.microsoft.com/en-us/products/ai-services/openai-service', apiBaseUrl: '', iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg', authDocUrl: 'https://automatisch.io/docs/apps/azure-openai/connection', diff --git a/packages/backend/src/apps/carbone/actions/add-template/index.ts b/packages/backend/src/apps/carbone/actions/add-template/index.js similarity index 82% rename from packages/backend/src/apps/carbone/actions/add-template/index.ts rename to packages/backend/src/apps/carbone/actions/add-template/index.js index be120fd3..a247fffa 100644 --- a/packages/backend/src/apps/carbone/actions/add-template/index.ts +++ b/packages/backend/src/apps/carbone/actions/add-template/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Add Template', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Templete Data', key: 'templateData', - type: 'string' as const, + type: 'string', required: true, variables: true, description: 'The content of your new Template in XML/HTML format.', @@ -17,7 +17,7 @@ export default defineAction({ ], async run($) { - const templateData = $.step.parameters.templateData as string; + const templateData = $.step.parameters.templateData; const base64Data = Buffer.from(templateData).toString('base64'); const dataURI = `data:application/xml;base64,${base64Data}`; diff --git a/packages/backend/src/apps/carbone/actions/index.js b/packages/backend/src/apps/carbone/actions/index.js new file mode 100644 index 00000000..4c513e7a --- /dev/null +++ b/packages/backend/src/apps/carbone/actions/index.js @@ -0,0 +1,3 @@ +import addTemplate from './add-template/index.js'; + +export default [addTemplate]; diff --git a/packages/backend/src/apps/carbone/actions/index.ts b/packages/backend/src/apps/carbone/actions/index.ts deleted file mode 100644 index 41b98543..00000000 --- a/packages/backend/src/apps/carbone/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import addTemplate from './add-template'; - -export default [addTemplate]; diff --git a/packages/backend/src/apps/carbone/auth/index.ts b/packages/backend/src/apps/carbone/auth/index.js similarity index 77% rename from packages/backend/src/apps/carbone/auth/index.ts rename to packages/backend/src/apps/carbone/auth/index.js index 0242bc91..736516ee 100644 --- a/packages/backend/src/apps/carbone/auth/index.ts +++ b/packages/backend/src/apps/carbone/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/carbone/auth/is-still-verified.js b/packages/backend/src/apps/carbone/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/carbone/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/carbone/auth/is-still-verified.ts b/packages/backend/src/apps/carbone/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/carbone/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/carbone/auth/verify-credentials.ts b/packages/backend/src/apps/carbone/auth/verify-credentials.js similarity index 60% rename from packages/backend/src/apps/carbone/auth/verify-credentials.ts rename to packages/backend/src/apps/carbone/auth/verify-credentials.js index 3c5d01e3..7bf000bc 100644 --- a/packages/backend/src/apps/carbone/auth/verify-credentials.ts +++ b/packages/backend/src/apps/carbone/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await $.http.get('/templates'); await $.auth.set({ diff --git a/packages/backend/src/apps/carbone/common/add-auth-header.ts b/packages/backend/src/apps/carbone/common/add-auth-header.js similarity index 65% rename from packages/backend/src/apps/carbone/common/add-auth-header.ts rename to packages/backend/src/apps/carbone/common/add-auth-header.js index 615acdcd..ced8898d 100644 --- a/packages/backend/src/apps/carbone/common/add-auth-header.ts +++ b/packages/backend/src/apps/carbone/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.apiKey) { requestConfig.headers.Authorization = `Bearer ${$.auth.data.apiKey}`; requestConfig.headers['carbone-version'] = '4'; diff --git a/packages/backend/src/apps/carbone/index.d.ts b/packages/backend/src/apps/carbone/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/carbone/index.ts b/packages/backend/src/apps/carbone/index.js similarity index 66% rename from packages/backend/src/apps/carbone/index.ts rename to packages/backend/src/apps/carbone/index.js index 7eb98ac7..d715080a 100644 --- a/packages/backend/src/apps/carbone/index.ts +++ b/packages/backend/src/apps/carbone/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Carbone', diff --git a/packages/backend/src/apps/deepl/actions/index.js b/packages/backend/src/apps/deepl/actions/index.js new file mode 100644 index 00000000..f22e6e6d --- /dev/null +++ b/packages/backend/src/apps/deepl/actions/index.js @@ -0,0 +1,3 @@ +import translateText from './translate-text/index.js'; + +export default [translateText]; diff --git a/packages/backend/src/apps/deepl/actions/index.ts b/packages/backend/src/apps/deepl/actions/index.ts deleted file mode 100644 index db83a4f4..00000000 --- a/packages/backend/src/apps/deepl/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import translateText from './translate-text'; - -export default [translateText]; diff --git a/packages/backend/src/apps/deepl/actions/translate-text/index.ts b/packages/backend/src/apps/deepl/actions/translate-text/index.js similarity index 94% rename from packages/backend/src/apps/deepl/actions/translate-text/index.ts rename to packages/backend/src/apps/deepl/actions/translate-text/index.js index 18ee70eb..7202d024 100644 --- a/packages/backend/src/apps/deepl/actions/translate-text/index.ts +++ b/packages/backend/src/apps/deepl/actions/translate-text/index.js @@ -1,5 +1,5 @@ import qs from 'qs'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Translate text', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Text', key: 'text', - type: 'string' as const, + type: 'string', required: true, description: 'Text to be translated.', variables: true, @@ -17,7 +17,7 @@ export default defineAction({ { label: 'Target Language', key: 'targetLanguage', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Language to translate the text to.', variables: true, diff --git a/packages/backend/src/apps/deepl/auth/index.ts b/packages/backend/src/apps/deepl/auth/index.js similarity index 78% rename from packages/backend/src/apps/deepl/auth/index.ts rename to packages/backend/src/apps/deepl/auth/index.js index ed02f1bc..0de2ecc2 100644 --- a/packages/backend/src/apps/deepl/auth/index.ts +++ b/packages/backend/src/apps/deepl/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'authenticationKey', label: 'Authentication Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/deepl/auth/is-still-verified.js b/packages/backend/src/apps/deepl/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/deepl/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/deepl/auth/is-still-verified.ts b/packages/backend/src/apps/deepl/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/deepl/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/deepl/auth/verify-credentials.ts b/packages/backend/src/apps/deepl/auth/verify-credentials.js similarity index 55% rename from packages/backend/src/apps/deepl/auth/verify-credentials.ts rename to packages/backend/src/apps/deepl/auth/verify-credentials.js index 18c184a3..1310f2c2 100644 --- a/packages/backend/src/apps/deepl/auth/verify-credentials.ts +++ b/packages/backend/src/apps/deepl/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await $.http.get('/v2/usage'); await $.auth.set({ diff --git a/packages/backend/src/apps/deepl/common/add-auth-header.ts b/packages/backend/src/apps/deepl/common/add-auth-header.js similarity index 68% rename from packages/backend/src/apps/deepl/common/add-auth-header.ts rename to packages/backend/src/apps/deepl/common/add-auth-header.js index 864970e5..c1938e82 100644 --- a/packages/backend/src/apps/deepl/common/add-auth-header.ts +++ b/packages/backend/src/apps/deepl/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.authenticationKey) { const authorizationHeader = `DeepL-Auth-Key ${$.auth.data.authenticationKey}`; requestConfig.headers.Authorization = authorizationHeader; diff --git a/packages/backend/src/apps/deepl/index.d.ts b/packages/backend/src/apps/deepl/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/deepl/index.ts b/packages/backend/src/apps/deepl/index.js similarity index 66% rename from packages/backend/src/apps/deepl/index.ts rename to packages/backend/src/apps/deepl/index.js index b77ea2d8..dac53f19 100644 --- a/packages/backend/src/apps/deepl/index.ts +++ b/packages/backend/src/apps/deepl/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'DeepL', diff --git a/packages/backend/src/apps/delay/actions/delay-for/index.ts b/packages/backend/src/apps/delay/actions/delay-for/index.js similarity index 89% rename from packages/backend/src/apps/delay/actions/delay-for/index.ts rename to packages/backend/src/apps/delay/actions/delay-for/index.js index d3d15032..e50455ef 100644 --- a/packages/backend/src/apps/delay/actions/delay-for/index.ts +++ b/packages/backend/src/apps/delay/actions/delay-for/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Delay for', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Delay for unit', key: 'delayForUnit', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: null, description: 'Delay for unit, e.g. minutes, hours, days, weeks.', @@ -36,7 +36,7 @@ export default defineAction({ { label: 'Delay for value', key: 'delayForValue', - type: 'string' as const, + type: 'string', required: true, description: 'Delay for value, use a number, e.g. 1, 2, 3.', variables: true, diff --git a/packages/backend/src/apps/delay/actions/delay-until/index.ts b/packages/backend/src/apps/delay/actions/delay-until/index.js similarity index 84% rename from packages/backend/src/apps/delay/actions/delay-until/index.ts rename to packages/backend/src/apps/delay/actions/delay-until/index.js index 0303eecd..4d82b235 100644 --- a/packages/backend/src/apps/delay/actions/delay-until/index.ts +++ b/packages/backend/src/apps/delay/actions/delay-until/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Delay until', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Delay until (Date)', key: 'delayUntil', - type: 'string' as const, + type: 'string', required: true, description: 'Delay until the date. E.g. 2022-12-18', variables: true, diff --git a/packages/backend/src/apps/delay/actions/index.js b/packages/backend/src/apps/delay/actions/index.js new file mode 100644 index 00000000..8782fa78 --- /dev/null +++ b/packages/backend/src/apps/delay/actions/index.js @@ -0,0 +1,4 @@ +import delayFor from './delay-for/index.js'; +import delayUntil from './delay-until/index.js'; + +export default [delayFor, delayUntil]; diff --git a/packages/backend/src/apps/delay/actions/index.ts b/packages/backend/src/apps/delay/actions/index.ts deleted file mode 100644 index 0779892c..00000000 --- a/packages/backend/src/apps/delay/actions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import delayFor from './delay-for'; -import delayUntil from './delay-until'; - -export default [delayFor, delayUntil]; diff --git a/packages/backend/src/apps/delay/index.d.ts b/packages/backend/src/apps/delay/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/delay/index.ts b/packages/backend/src/apps/delay/index.js similarity index 75% rename from packages/backend/src/apps/delay/index.ts rename to packages/backend/src/apps/delay/index.js index 7f25c1b7..902dd27d 100644 --- a/packages/backend/src/apps/delay/index.ts +++ b/packages/backend/src/apps/delay/index.js @@ -1,5 +1,5 @@ -import defineApp from '../../helpers/define-app'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Delay', diff --git a/packages/backend/src/apps/discord/actions/create-scheduled-event/index.ts b/packages/backend/src/apps/discord/actions/create-scheduled-event/index.js similarity index 55% rename from packages/backend/src/apps/discord/actions/create-scheduled-event/index.ts rename to packages/backend/src/apps/discord/actions/create-scheduled-event/index.js index eecfb839..40a0611b 100644 --- a/packages/backend/src/apps/discord/actions/create-scheduled-event/index.ts +++ b/packages/backend/src/apps/discord/actions/create-scheduled-event/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create a scheduled event', @@ -8,13 +8,13 @@ export default defineAction({ { label: 'Type', key: 'entityType', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, options: [ { label: 'Stage channel', value: 1 }, { label: 'Voice channel', value: 2 }, - { label: 'External', value: 3 } + { label: 'External', value: 3 }, ], additionalFields: { type: 'query', @@ -34,61 +34,47 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Description', key: 'description', - type: 'string' as const, + type: 'string', required: false, variables: true, }, { label: 'Image', key: 'image', - type: 'string' as const, + type: 'string', required: false, - description: 'Image as DataURI scheme [data:image/;base64,BASE64_ENCODED__IMAGE_DATA]', + description: + 'Image as DataURI scheme [data:image/;base64,BASE64_ENCODED__IMAGE_DATA]', variables: true, }, ], async run($) { - type entity_metadata = { - location: string - } - - type guild_event = { - channel_id: number, - name: string, - privacy_level: number, - scheduled_start_time: string, - scheduled_end_time?: string, - description?: string, - entity_type?: number, - entity_metadata?: entity_metadata, - image?: string, //data:image/jpeg;base64,BASE64_ENCODED_JPEG_IMAGE_DATA - } - - - const data: guild_event = { - channel_id: $.step.parameters.channel_id as number, - name: $.step.parameters.name as string, + const data = { + channel_id: $.step.parameters.channel_id, + name: $.step.parameters.name, privacy_level: 2, - scheduled_start_time: $.step.parameters.scheduledStartTime as string, - scheduled_end_time: $.step.parameters.scheduledEndTime as string, - description: $.step.parameters.description as string, - entity_type: $.step.parameters.entityType as number, - image: $.step.parameters.image as string, + scheduled_start_time: $.step.parameters.scheduledStartTime, + scheduled_end_time: $.step.parameters.scheduledEndTime, + description: $.step.parameters.description, + entity_type: $.step.parameters.entityType, + image: $.step.parameters.image, }; const isExternal = $.step.parameters.entityType === 3; + if (isExternal) { data.entity_metadata = { - location: $.step.parameters.location as string, + location: $.step.parameters.location, }; + data.channel_id = null; } diff --git a/packages/backend/src/apps/discord/actions/index.js b/packages/backend/src/apps/discord/actions/index.js new file mode 100644 index 00000000..598e7b29 --- /dev/null +++ b/packages/backend/src/apps/discord/actions/index.js @@ -0,0 +1,4 @@ +import sendMessageToChannel from './send-message-to-channel/index.js'; +import createScheduledEvent from './create-scheduled-event/index.js'; + +export default [sendMessageToChannel, createScheduledEvent]; diff --git a/packages/backend/src/apps/discord/actions/index.ts b/packages/backend/src/apps/discord/actions/index.ts deleted file mode 100644 index 2db5e44e..00000000 --- a/packages/backend/src/apps/discord/actions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import sendMessageToChannel from './send-message-to-channel'; -import createScheduledEvent from './create-scheduled-event'; - -export default [sendMessageToChannel, createScheduledEvent]; diff --git a/packages/backend/src/apps/discord/actions/send-message-to-channel/index.ts b/packages/backend/src/apps/discord/actions/send-message-to-channel/index.js similarity index 83% rename from packages/backend/src/apps/discord/actions/send-message-to-channel/index.ts rename to packages/backend/src/apps/discord/actions/send-message-to-channel/index.js index fa72ea83..332ed9b8 100644 --- a/packages/backend/src/apps/discord/actions/send-message-to-channel/index.ts +++ b/packages/backend/src/apps/discord/actions/send-message-to-channel/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Send a message to channel', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Channel', key: 'channel', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick a channel to send the message to.', variables: true, @@ -26,7 +26,7 @@ export default defineAction({ { label: 'Message text', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The content of your new message.', variables: true, @@ -35,8 +35,9 @@ export default defineAction({ async run($) { const data = { - content: $.step.parameters.message as string, + content: $.step.parameters.message, }; + const response = await $.http?.post( `/channels/${$.step.parameters.channel}/messages`, data diff --git a/packages/backend/src/apps/discord/auth/generate-auth-url.ts b/packages/backend/src/apps/discord/auth/generate-auth-url.js similarity index 53% rename from packages/backend/src/apps/discord/auth/generate-auth-url.ts rename to packages/backend/src/apps/discord/auth/generate-auth-url.js index d912967b..60ac0b84 100644 --- a/packages/backend/src/apps/discord/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/discord/auth/generate-auth-url.js @@ -1,15 +1,15 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import scopes from '../common/scopes'; +import scopes from '../common/scopes.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const callbackUrl = oauthRedirectUrlField.value as string; + + const callbackUrl = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.consumerKey as string, + client_id: $.auth.data.consumerKey, redirect_uri: callbackUrl, response_type: 'code', permissions: '2146958591', diff --git a/packages/backend/src/apps/discord/auth/index.ts b/packages/backend/src/apps/discord/auth/index.js similarity index 82% rename from packages/backend/src/apps/discord/auth/index.ts rename to packages/backend/src/apps/discord/auth/index.js index 158077df..62579e42 100644 --- a/packages/backend/src/apps/discord/auth/index.ts +++ b/packages/backend/src/apps/discord/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/discord/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'consumerKey', label: 'Consumer Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -32,7 +32,7 @@ export default { { key: 'consumerSecret', label: 'Consumer Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -44,7 +44,7 @@ export default { { key: 'botToken', label: 'Bot token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/discord/auth/is-still-verified.js b/packages/backend/src/apps/discord/auth/is-still-verified.js new file mode 100644 index 00000000..62748909 --- /dev/null +++ b/packages/backend/src/apps/discord/auth/is-still-verified.js @@ -0,0 +1,9 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + await getCurrentUser($); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/discord/auth/is-still-verified.ts b/packages/backend/src/apps/discord/auth/is-still-verified.ts deleted file mode 100644 index fadd0880..00000000 --- a/packages/backend/src/apps/discord/auth/is-still-verified.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - await getCurrentUser($); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/discord/auth/verify-credentials.ts b/packages/backend/src/apps/discord/auth/verify-credentials.js similarity index 65% rename from packages/backend/src/apps/discord/auth/verify-credentials.ts rename to packages/backend/src/apps/discord/auth/verify-credentials.js index 13d012e6..57555c83 100644 --- a/packages/backend/src/apps/discord/auth/verify-credentials.ts +++ b/packages/backend/src/apps/discord/auth/verify-credentials.js @@ -1,22 +1,24 @@ -import { IGlobalVariable, IField } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import scopes from '../common/scopes'; -import getCurrentUser from '../common/get-current-user'; +import scopes from '../common/scopes.js'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const callbackUrl = oauthRedirectUrlField.value as string; + + const callbackUrl = oauthRedirectUrlField.value; + const params = new URLSearchParams({ - client_id: $.auth.data.consumerKey as string, + client_id: $.auth.data.consumerKey, redirect_uri: callbackUrl, response_type: 'code', scope: scopes.join(' '), - client_secret: $.auth.data.consumerSecret as string, - code: $.auth.data.code as string, + client_secret: $.auth.data.consumerSecret, + code: $.auth.data.code, grant_type: 'authorization_code', }); + const { data: verifiedCredentials } = await $.http.post( '/oauth2/token', params.toString() diff --git a/packages/backend/src/apps/discord/common/add-auth-header.ts b/packages/backend/src/apps/discord/common/add-auth-header.js similarity index 63% rename from packages/backend/src/apps/discord/common/add-auth-header.ts rename to packages/backend/src/apps/discord/common/add-auth-header.js index f4fc8f0f..d9f5b10a 100644 --- a/packages/backend/src/apps/discord/common/add-auth-header.ts +++ b/packages/backend/src/apps/discord/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { tokenType, botToken } = $.auth.data; if (tokenType && botToken) { requestConfig.headers.Authorization = `Bot ${botToken}`; diff --git a/packages/backend/src/apps/discord/common/get-current-user.ts b/packages/backend/src/apps/discord/common/get-current-user.js similarity index 50% rename from packages/backend/src/apps/discord/common/get-current-user.ts rename to packages/backend/src/apps/discord/common/get-current-user.js index 8b79e0c5..57ab474f 100644 --- a/packages/backend/src/apps/discord/common/get-current-user.ts +++ b/packages/backend/src/apps/discord/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/users/@me'); const currentUser = response.data; diff --git a/packages/backend/src/apps/discord/common/scopes.ts b/packages/backend/src/apps/discord/common/scopes.js similarity index 100% rename from packages/backend/src/apps/discord/common/scopes.ts rename to packages/backend/src/apps/discord/common/scopes.js diff --git a/packages/backend/src/apps/discord/dynamic-data/index.js b/packages/backend/src/apps/discord/dynamic-data/index.js new file mode 100644 index 00000000..d6a7cec1 --- /dev/null +++ b/packages/backend/src/apps/discord/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listChannels from './list-channels/index.js'; +import listVoiceChannels from './list-voice-channels/index.js'; + +export default [listChannels, listVoiceChannels]; diff --git a/packages/backend/src/apps/discord/dynamic-data/index.ts b/packages/backend/src/apps/discord/dynamic-data/index.ts deleted file mode 100644 index e018fb62..00000000 --- a/packages/backend/src/apps/discord/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listChannels from './list-channels'; -import listVoiceChannels from './list-voice-channels'; - -export default [listChannels, listVoiceChannels]; diff --git a/packages/backend/src/apps/discord/dynamic-data/list-channels/index.ts b/packages/backend/src/apps/discord/dynamic-data/list-channels/index.js similarity index 64% rename from packages/backend/src/apps/discord/dynamic-data/list-channels/index.ts rename to packages/backend/src/apps/discord/dynamic-data/list-channels/index.js index 6ab6e468..52fc719f 100644 --- a/packages/backend/src/apps/discord/dynamic-data/list-channels/index.ts +++ b/packages/backend/src/apps/discord/dynamic-data/list-channels/index.js @@ -1,14 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List channels', key: 'listChannels', - async run($: IGlobalVariable) { - const channels: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { + async run($) { + const channels = { data: [], error: null, }; @@ -18,11 +13,11 @@ export default { ); channels.data = response.data - .filter((channel: IJSONObject) => { + .filter((channel) => { // filter in text channels and announcement channels only return channel.type === 0 || channel.type === 5; }) - .map((channel: IJSONObject) => { + .map((channel) => { return { value: channel.id, name: channel.name, diff --git a/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts b/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.js similarity index 64% rename from packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts rename to packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.js index 74bad388..975e5fa6 100644 --- a/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.ts +++ b/packages/backend/src/apps/discord/dynamic-data/list-voice-channels/index.js @@ -1,14 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List voice channels', key: 'listVoiceChannels', - async run($: IGlobalVariable) { - const channels: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { + async run($) { + const channels = { data: [], error: null, }; @@ -18,11 +13,11 @@ export default { ); channels.data = response.data - .filter((channel: IJSONObject) => { + .filter((channel) => { // filter in voice and stage channels only return channel.type === 2 || channel.type === 13; }) - .map((channel: IJSONObject) => { + .map((channel) => { return { value: channel.id, name: channel.name, diff --git a/packages/backend/src/apps/discord/dynamic-fields/index.ts b/packages/backend/src/apps/discord/dynamic-fields/index.js similarity index 78% rename from packages/backend/src/apps/discord/dynamic-fields/index.ts rename to packages/backend/src/apps/discord/dynamic-fields/index.js index 3b0735da..889acb3e 100644 --- a/packages/backend/src/apps/discord/dynamic-fields/index.ts +++ b/packages/backend/src/apps/discord/dynamic-fields/index.js @@ -1,3 +1,3 @@ -import listExternalScheduledEventFields from './list-external-scheduled-event-fields'; +import listExternalScheduledEventFields from './list-external-scheduled-event-fields/index.js'; export default [listExternalScheduledEventFields]; diff --git a/packages/backend/src/apps/discord/dynamic-fields/list-external-scheduled-event-fields/index.ts b/packages/backend/src/apps/discord/dynamic-fields/list-external-scheduled-event-fields/index.js similarity index 62% rename from packages/backend/src/apps/discord/dynamic-fields/list-external-scheduled-event-fields/index.ts rename to packages/backend/src/apps/discord/dynamic-fields/list-external-scheduled-event-fields/index.js index 1f935a53..dbe66bf7 100644 --- a/packages/backend/src/apps/discord/dynamic-fields/list-external-scheduled-event-fields/index.ts +++ b/packages/backend/src/apps/discord/dynamic-fields/list-external-scheduled-event-fields/index.js @@ -1,9 +1,8 @@ -import { IGlobalVariable } from '@automatisch/types'; export default { name: 'List external scheduled event fields', key: 'listExternalScheduledEventFields', - async run($: IGlobalVariable) { + async run($) { const isExternal = $.step.parameters.entityType === 3; if (isExternal) { @@ -11,15 +10,16 @@ export default { { label: 'Location', key: 'location', - type: 'string' as const, + type: 'string', required: true, - description: 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL', + description: + 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL', variables: true, }, { label: 'Start-Time', key: 'scheduledStartTime', - type: 'string' as const, + type: 'string', required: true, description: 'The time the event will start [ISO8601]', variables: true, @@ -27,9 +27,10 @@ export default { { label: 'End-Time', key: 'scheduledEndTime', - type: 'string' as const, + type: 'string', required: true, - description: 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL', + description: + 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL', variables: true, }, ]; @@ -39,9 +40,10 @@ export default { { label: 'Channel', key: 'channel_id', - type: 'dropdown' as const, + type: 'dropdown', required: true, - description: 'Pick a voice or stage channel to link the event to. This will be omitted if type is EXTERNAL', + description: + 'Pick a voice or stage channel to link the event to. This will be omitted if type is EXTERNAL', variables: true, source: { type: 'query', @@ -57,15 +59,16 @@ export default { { label: 'Location', key: 'location', - type: 'string' as const, + type: 'string', required: false, - description: 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL', + description: + 'The location of the event (1-100 characters). This will be omitted if type is NOT EXTERNAL', variables: true, }, { label: 'Start-Time', key: 'scheduledStartTime', - type: 'string' as const, + type: 'string', required: true, description: 'The time the event will start [ISO8601]', variables: true, @@ -73,9 +76,10 @@ export default { { label: 'End-Time', key: 'scheduledEndTime', - type: 'string' as const, + type: 'string', required: false, - description: 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL', + description: + 'The time the event will end [ISO8601]. This will be omitted if type is NOT EXTERNAL', variables: true, }, ]; diff --git a/packages/backend/src/apps/discord/index.d.ts b/packages/backend/src/apps/discord/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/discord/index.ts b/packages/backend/src/apps/discord/index.js similarity index 55% rename from packages/backend/src/apps/discord/index.ts rename to packages/backend/src/apps/discord/index.js index 918138cf..6f42305e 100644 --- a/packages/backend/src/apps/discord/index.ts +++ b/packages/backend/src/apps/discord/index.js @@ -1,10 +1,10 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import dynamicData from './dynamic-data'; -import actions from './actions'; -import triggers from './triggers'; -import dynamicFields from './dynamic-fields'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import dynamicData from './dynamic-data/index.js'; +import actions from './actions/index.js'; +import triggers from './triggers/index.js'; +import dynamicFields from './dynamic-fields/index.js'; export default defineApp({ name: 'Discord', diff --git a/packages/backend/src/apps/discord/triggers/index.ts b/packages/backend/src/apps/discord/triggers/index.js similarity index 100% rename from packages/backend/src/apps/discord/triggers/index.ts rename to packages/backend/src/apps/discord/triggers/index.js diff --git a/packages/backend/src/apps/dropbox/actions/create-folder/index.ts b/packages/backend/src/apps/dropbox/actions/create-folder/index.js similarity index 57% rename from packages/backend/src/apps/dropbox/actions/create-folder/index.ts rename to packages/backend/src/apps/dropbox/actions/create-folder/index.js index 181977cc..8309f94d 100644 --- a/packages/backend/src/apps/dropbox/actions/create-folder/index.ts +++ b/packages/backend/src/apps/dropbox/actions/create-folder/index.js @@ -1,23 +1,25 @@ import path from 'node:path'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create folder', key: 'createFolder', - description: 'Create a new folder with the given parent folder and folder name', + description: + 'Create a new folder with the given parent folder and folder name', arguments: [ { label: 'Folder', key: 'parentFolder', - type: 'string' as const, + type: 'string', required: true, - description: 'Enter the parent folder path, like /TextFiles/ or /Documents/Taxes/', + description: + 'Enter the parent folder path, like /TextFiles/ or /Documents/Taxes/', variables: true, }, { label: 'Folder Name', key: 'folderName', - type: 'string' as const, + type: 'string', required: true, description: 'Enter the name for the new folder', variables: true, @@ -25,11 +27,13 @@ export default defineAction({ ], async run($) { - const parentFolder = $.step.parameters.parentFolder as string; - const folderName = $.step.parameters.folderName as string; + const parentFolder = $.step.parameters.parentFolder; + const folderName = $.step.parameters.folderName; const folderPath = path.join(parentFolder, folderName); - const response = await $.http.post('/2/files/create_folder_v2', { path: folderPath }); + const response = await $.http.post('/2/files/create_folder_v2', { + path: folderPath, + }); $.setActionItem({ raw: response.data }); }, diff --git a/packages/backend/src/apps/dropbox/actions/index.js b/packages/backend/src/apps/dropbox/actions/index.js new file mode 100644 index 00000000..c0b1917b --- /dev/null +++ b/packages/backend/src/apps/dropbox/actions/index.js @@ -0,0 +1,4 @@ +import createFolder from './create-folder/index.js'; +import renameFile from './rename-file/index.js'; + +export default [createFolder, renameFile]; diff --git a/packages/backend/src/apps/dropbox/actions/index.ts b/packages/backend/src/apps/dropbox/actions/index.ts deleted file mode 100644 index 14f401da..00000000 --- a/packages/backend/src/apps/dropbox/actions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import createFolder from "./create-folder"; -import renameFile from "./rename-file"; - -export default [createFolder, renameFile]; diff --git a/packages/backend/src/apps/dropbox/actions/rename-file/index.ts b/packages/backend/src/apps/dropbox/actions/rename-file/index.js similarity index 66% rename from packages/backend/src/apps/dropbox/actions/rename-file/index.ts rename to packages/backend/src/apps/dropbox/actions/rename-file/index.js index 76bacffc..789b3f3a 100644 --- a/packages/backend/src/apps/dropbox/actions/rename-file/index.ts +++ b/packages/backend/src/apps/dropbox/actions/rename-file/index.js @@ -1,5 +1,5 @@ import path from 'node:path'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Rename file', @@ -9,25 +9,25 @@ export default defineAction({ { label: 'File Path', key: 'filePath', - type: 'string' as const, + type: 'string', required: true, - description: - 'Write the full path to the file such as /Folder1/File.pdf', + description: 'Write the full path to the file such as /Folder1/File.pdf', variables: true, }, { label: 'New Name', key: 'newName', - type: 'string' as const, + type: 'string', required: true, - description: "Enter the new name for the file (without the extension, e.g., '.pdf')", + description: + "Enter the new name for the file (without the extension, e.g., '.pdf')", variables: true, }, ], async run($) { - const filePath = $.step.parameters.filePath as string; - const newName = $.step.parameters.newName as string; + const filePath = $.step.parameters.filePath; + const newName = $.step.parameters.newName; const fileObject = path.parse(filePath); const newPath = path.format({ dir: fileObject.dir, diff --git a/packages/backend/src/apps/dropbox/auth/generate-auth-url.ts b/packages/backend/src/apps/dropbox/auth/generate-auth-url.js similarity index 53% rename from packages/backend/src/apps/dropbox/auth/generate-auth-url.ts rename to packages/backend/src/apps/dropbox/auth/generate-auth-url.js index d663c25c..1aa78f6b 100644 --- a/packages/backend/src/apps/dropbox/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/dropbox/auth/generate-auth-url.js @@ -1,15 +1,15 @@ import { URLSearchParams } from 'url'; -import { IField, IGlobalVariable } from '@automatisch/types'; -import scopes from '../common/scopes'; +import scopes from '../common/scopes.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const callbackUrl = oauthRedirectUrlField.value as string; + + const callbackUrl = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: callbackUrl, response_type: 'code', scope: scopes.join(' '), diff --git a/packages/backend/src/apps/dropbox/auth/index.ts b/packages/backend/src/apps/dropbox/auth/index.js similarity index 74% rename from packages/backend/src/apps/dropbox/auth/index.ts rename to packages/backend/src/apps/dropbox/auth/index.js index 4331302b..a037f9ec 100644 --- a/packages/backend/src/apps/dropbox/auth/index.ts +++ b/packages/backend/src/apps/dropbox/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/dropbox/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'App Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'App Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/dropbox/auth/is-still-verified.js b/packages/backend/src/apps/dropbox/auth/is-still-verified.js new file mode 100644 index 00000000..b65bc239 --- /dev/null +++ b/packages/backend/src/apps/dropbox/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentAccount from '../common/get-current-account.js'; + +const isStillVerified = async ($) => { + const account = await getCurrentAccount($); + return !!account; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/dropbox/auth/is-still-verified.ts b/packages/backend/src/apps/dropbox/auth/is-still-verified.ts deleted file mode 100644 index bf70f874..00000000 --- a/packages/backend/src/apps/dropbox/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentAccount from '../common/get-current-account'; - -const isStillVerified = async ($: IGlobalVariable) => { - const account = await getCurrentAccount($); - return !!account; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/dropbox/auth/refresh-token.js b/packages/backend/src/apps/dropbox/auth/refresh-token.js new file mode 100644 index 00000000..1f34cdee --- /dev/null +++ b/packages/backend/src/apps/dropbox/auth/refresh-token.js @@ -0,0 +1,36 @@ +import { Buffer } from 'node:buffer'; + +const refreshToken = async ($) => { + const params = { + grant_type: 'refresh_token', + refresh_token: $.auth.data.refreshToken, + }; + + const basicAuthToken = Buffer.from( + `${$.auth.data.clientId}:${$.auth.data.clientSecret}` + ).toString('base64'); + + const { data } = await $.http.post('oauth2/token', null, { + params, + headers: { + Authorization: `Basic ${basicAuthToken}`, + }, + additionalProperties: { + skipAddingAuthHeader: true, + }, + }); + + const { + access_token: accessToken, + expires_in: expiresIn, + token_type: tokenType, + } = data; + + await $.auth.set({ + accessToken, + expiresIn, + tokenType, + }); +}; + +export default refreshToken; diff --git a/packages/backend/src/apps/dropbox/auth/refresh-token.ts b/packages/backend/src/apps/dropbox/auth/refresh-token.ts deleted file mode 100644 index 67c4454f..00000000 --- a/packages/backend/src/apps/dropbox/auth/refresh-token.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Buffer } from 'node:buffer'; -import { IGlobalVariable } from '@automatisch/types'; - -const refreshToken = async ($: IGlobalVariable) => { - const params = { - grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, - }; - - const basicAuthToken = Buffer - .from(`${$.auth.data.clientId}:${$.auth.data.clientSecret}`) - .toString('base64'); - - const { data } = await $.http.post( - 'oauth2/token', - null, - { - params, - headers: { - Authorization: `Basic ${basicAuthToken}` - }, - additionalProperties: { - skipAddingAuthHeader: true - } - } - ); - - const { - access_token: accessToken, - expires_in: expiresIn, - token_type: tokenType, - } = data; - - await $.auth.set({ - accessToken, - expiresIn, - tokenType, - }); -}; - -export default refreshToken; diff --git a/packages/backend/src/apps/dropbox/auth/verify-credentials.ts b/packages/backend/src/apps/dropbox/auth/verify-credentials.js similarity index 57% rename from packages/backend/src/apps/dropbox/auth/verify-credentials.ts rename to packages/backend/src/apps/dropbox/auth/verify-credentials.js index f56b25d2..22097a1c 100644 --- a/packages/backend/src/apps/dropbox/auth/verify-credentials.ts +++ b/packages/backend/src/apps/dropbox/auth/verify-credentials.js @@ -1,44 +1,20 @@ -import { IGlobalVariable, IField } from '@automatisch/types'; -import getCurrentAccount from '../common/get-current-account'; +import getCurrentAccount from '../common/get-current-account.js'; -type TAccount = { - account_id: string, - name: { - given_name: string, - surname: string, - familiar_name: string, - display_name: string, - abbreviated_name: string, - }, - email: string, - email_verified: boolean, - disabled: boolean, - country: string, - locale: string, - referral_link: string, - is_paired: boolean, - account_type: { - ".tag": string, - }, - root_info: { - ".tag": string, - root_namespace_id: string, - home_namespace_id: string, - }, -} - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUrl = oauthRedirectUrlField.value as string; + + const redirectUrl = oauthRedirectUrlField.value; + const params = { - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUrl, - client_secret: $.auth.data.clientSecret as string, - code: $.auth.data.code as string, + client_secret: $.auth.data.clientSecret, + code: $.auth.data.code, grant_type: 'authorization_code', - } + }; + const { data: verifiedCredentials } = await $.http.post( '/oauth2/token', null, @@ -66,10 +42,10 @@ const verifyCredentials = async ($: IGlobalVariable) => { accountId, teamId, idToken, - uid + uid, }); - const account = await getCurrentAccount($) as TAccount; + const account = await getCurrentAccount($); await $.auth.set({ accountId: account.account_id, @@ -88,10 +64,10 @@ const verifyCredentials = async ($: IGlobalVariable) => { referralLink: account.referral_link, isPaired: account.is_paired, accountType: { - ".tag": account.account_type['.tag'], + '.tag': account.account_type['.tag'], }, rootInfo: { - ".tag": account.root_info['.tag'], + '.tag': account.root_info['.tag'], rootNamespaceId: account.root_info.root_namespace_id, homeNamespaceId: account.root_info.home_namespace_id, }, diff --git a/packages/backend/src/apps/dropbox/common/add-auth-header.js b/packages/backend/src/apps/dropbox/common/add-auth-header.js new file mode 100644 index 00000000..1030633b --- /dev/null +++ b/packages/backend/src/apps/dropbox/common/add-auth-header.js @@ -0,0 +1,14 @@ +const addAuthHeader = ($, requestConfig) => { + requestConfig.headers['Content-Type'] = 'application/json'; + + if ( + !requestConfig.additionalProperties?.skipAddingAuthHeader && + $.auth.data?.accessToken + ) { + requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/dropbox/common/add-auth-header.ts b/packages/backend/src/apps/dropbox/common/add-auth-header.ts deleted file mode 100644 index ac7b7231..00000000 --- a/packages/backend/src/apps/dropbox/common/add-auth-header.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - requestConfig.headers['Content-Type'] = 'application/json'; - - if (!requestConfig.additionalProperties?.skipAddingAuthHeader && $.auth.data?.accessToken) { - requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`; - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/dropbox/common/get-current-account.js b/packages/backend/src/apps/dropbox/common/get-current-account.js new file mode 100644 index 00000000..26786dde --- /dev/null +++ b/packages/backend/src/apps/dropbox/common/get-current-account.js @@ -0,0 +1,6 @@ +const getCurrentAccount = async ($) => { + const response = await $.http.post('/2/users/get_current_account', null); + return response.data; +}; + +export default getCurrentAccount; diff --git a/packages/backend/src/apps/dropbox/common/get-current-account.ts b/packages/backend/src/apps/dropbox/common/get-current-account.ts deleted file mode 100644 index 6764e781..00000000 --- a/packages/backend/src/apps/dropbox/common/get-current-account.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentAccount = async ($: IGlobalVariable): Promise => { - const response = await $.http.post('/2/users/get_current_account', null); - return response.data; -}; - -export default getCurrentAccount; diff --git a/packages/backend/src/apps/dropbox/common/scopes.ts b/packages/backend/src/apps/dropbox/common/scopes.js similarity index 100% rename from packages/backend/src/apps/dropbox/common/scopes.ts rename to packages/backend/src/apps/dropbox/common/scopes.js diff --git a/packages/backend/src/apps/dropbox/index.d.ts b/packages/backend/src/apps/dropbox/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/dropbox/index.ts b/packages/backend/src/apps/dropbox/index.js similarity index 66% rename from packages/backend/src/apps/dropbox/index.ts rename to packages/backend/src/apps/dropbox/index.js index d7bc877b..6a0e4729 100644 --- a/packages/backend/src/apps/dropbox/index.ts +++ b/packages/backend/src/apps/dropbox/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Dropbox', diff --git a/packages/backend/src/apps/filter/actions/continue/index.js b/packages/backend/src/apps/filter/actions/continue/index.js new file mode 100644 index 00000000..57240287 --- /dev/null +++ b/packages/backend/src/apps/filter/actions/continue/index.js @@ -0,0 +1,88 @@ +import defineAction from '../../../../helpers/define-action.js'; + +const isEqual = (a, b) => a === b; +const isNotEqual = (a, b) => !isEqual(a, b); +const isGreaterThan = (a, b) => Number(a) > Number(b); +const isLessThan = (a, b) => Number(a) < Number(b); +const isGreaterThanOrEqual = (a, b) => Number(a) >= Number(b); +const isLessThanOrEqual = (a, b) => Number(a) <= Number(b); +const contains = (a, b) => a.includes(b); +const doesNotContain = (a, b) => !contains(a, b); + +const shouldContinue = (orGroups) => { + let atLeastOneGroupMatches = false; + + for (const group of orGroups) { + let groupMatches = true; + + for (const condition of group.and) { + const conditionMatches = operate( + condition.operator, + condition.key, + condition.value + ); + + if (!conditionMatches) { + groupMatches = false; + + break; + } + } + + if (groupMatches) { + atLeastOneGroupMatches = true; + + break; + } + } + + return atLeastOneGroupMatches; +}; + +const operators = { + equal: isEqual, + not_equal: isNotEqual, + greater_than: isGreaterThan, + less_than: isLessThan, + greater_than_or_equal: isGreaterThanOrEqual, + less_than_or_equal: isLessThanOrEqual, + contains: contains, + not_contains: doesNotContain, +}; + +const operate = (operation, a, b) => { + return operators[operation](a, b); +}; + +export default defineAction({ + name: 'Continue if conditions match', + key: 'continueIfMatches', + description: 'Let the execution continue if the conditions match', + arguments: [], + + async run($) { + const orGroups = $.step.parameters.or; + + const matchingGroups = orGroups.reduce((groups, group) => { + const matchingConditions = group.and.filter((condition) => + operate(condition.operator, condition.key, condition.value) + ); + + if (matchingConditions.length) { + return groups.concat([{ and: matchingConditions }]); + } + + return groups; + }, []); + + if (!shouldContinue(orGroups)) { + $.execution.exit(); + } + + $.setActionItem({ + raw: { + or: matchingGroups, + }, + }); + }, +}); diff --git a/packages/backend/src/apps/filter/actions/continue/index.ts b/packages/backend/src/apps/filter/actions/continue/index.ts deleted file mode 100644 index 1e264f72..00000000 --- a/packages/backend/src/apps/filter/actions/continue/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -import defineAction from '../../../../helpers/define-action'; - -type TGroupItem = { - key: string; - operator: keyof TOperators; - value: string; - id: string; -} - -type TGroup = Record<'and', TGroupItem[]>; - -const isEqual = (a: string, b: string) => a === b; -const isNotEqual = (a: string, b: string) => !isEqual(a, b); -const isGreaterThan = (a: string, b: string) => Number(a) > Number(b); -const isLessThan = (a: string, b: string) => Number(a) < Number(b); -const isGreaterThanOrEqual = (a: string, b: string) => Number(a) >= Number(b); -const isLessThanOrEqual = (a: string, b: string) => Number(a) <= Number(b); -const contains = (a: string, b: string) => a.includes(b); -const doesNotContain = (a: string, b: string) => !contains(a, b); - -const shouldContinue = (orGroups: TGroup[]) => { - let atLeastOneGroupMatches = false; - - for (const group of orGroups) { - let groupMatches = true; - - for (const condition of group.and) { - const conditionMatches = operate( - condition.operator, - condition.key, - condition.value - ); - - if (!conditionMatches) { - groupMatches = false; - - break; - } - } - - if (groupMatches) { - atLeastOneGroupMatches = true; - - break; - } - } - - return atLeastOneGroupMatches; -} - -type TOperatorFunc = (a: string, b: string) => boolean; - -type TOperators = { - equal: TOperatorFunc; - not_equal: TOperatorFunc; - greater_than: TOperatorFunc; - less_than: TOperatorFunc; - greater_than_or_equal: TOperatorFunc; - less_than_or_equal: TOperatorFunc; - contains: TOperatorFunc; - not_contains: TOperatorFunc; -}; - -const operators: TOperators = { - 'equal': isEqual, - 'not_equal': isNotEqual, - 'greater_than': isGreaterThan, - 'less_than': isLessThan, - 'greater_than_or_equal': isGreaterThanOrEqual, - 'less_than_or_equal': isLessThanOrEqual, - 'contains': contains, - 'not_contains': doesNotContain, -}; - -const operate = (operation: keyof TOperators, a: string, b: string) => { - return operators[operation](a, b); -}; - -export default defineAction({ - name: 'Continue if conditions match', - key: 'continueIfMatches', - description: 'Let the execution continue if the conditions match', - arguments: [], - - async run($) { - const orGroups = $.step.parameters.or as TGroup[]; - - const matchingGroups = orGroups.reduce((groups, group) => { - const matchingConditions = group.and - .filter((condition) => operate(condition.operator, condition.key, condition.value)); - - if (matchingConditions.length) { - return groups.concat([{ and: matchingConditions }]); - } - - return groups; - }, []); - - if (!shouldContinue(orGroups)) { - $.execution.exit(); - } - - $.setActionItem({ - raw: { - or: matchingGroups, - } - }); - }, -}); diff --git a/packages/backend/src/apps/filter/actions/index.js b/packages/backend/src/apps/filter/actions/index.js new file mode 100644 index 00000000..0390f47d --- /dev/null +++ b/packages/backend/src/apps/filter/actions/index.js @@ -0,0 +1,3 @@ +import continueIfMatches from './continue/index.js'; + +export default [continueIfMatches]; diff --git a/packages/backend/src/apps/filter/actions/index.ts b/packages/backend/src/apps/filter/actions/index.ts deleted file mode 100644 index 0880c5cd..00000000 --- a/packages/backend/src/apps/filter/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import continueIfMatches from './continue'; - -export default [continueIfMatches]; diff --git a/packages/backend/src/apps/filter/index.d.ts b/packages/backend/src/apps/filter/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/filter/index.ts b/packages/backend/src/apps/filter/index.js similarity index 75% rename from packages/backend/src/apps/filter/index.ts rename to packages/backend/src/apps/filter/index.js index 9b4a81ce..f1d214f1 100644 --- a/packages/backend/src/apps/filter/index.ts +++ b/packages/backend/src/apps/filter/index.js @@ -1,5 +1,5 @@ -import defineApp from '../../helpers/define-app'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Filter', diff --git a/packages/backend/src/apps/flickr/auth/generate-auth-url.ts b/packages/backend/src/apps/flickr/auth/generate-auth-url.js similarity index 76% rename from packages/backend/src/apps/flickr/auth/generate-auth-url.ts rename to packages/backend/src/apps/flickr/auth/generate-auth-url.js index f3eea3fd..4de36c07 100644 --- a/packages/backend/src/apps/flickr/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/flickr/auth/generate-auth-url.js @@ -1,9 +1,8 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); const callbackUrl = oauthRedirectUrlField.value; diff --git a/packages/backend/src/apps/flickr/auth/index.ts b/packages/backend/src/apps/flickr/auth/index.js similarity index 81% rename from packages/backend/src/apps/flickr/auth/index.ts rename to packages/backend/src/apps/flickr/auth/index.js index 5cc50871..f06e6db0 100644 --- a/packages/backend/src/apps/flickr/auth/index.ts +++ b/packages/backend/src/apps/flickr/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/flickr/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'consumerKey', label: 'Consumer Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -32,7 +32,7 @@ export default { { key: 'consumerSecret', label: 'Consumer Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/flickr/auth/is-still-verified.ts b/packages/backend/src/apps/flickr/auth/is-still-verified.js similarity index 67% rename from packages/backend/src/apps/flickr/auth/is-still-verified.ts rename to packages/backend/src/apps/flickr/auth/is-still-verified.js index 634776a9..3c695828 100644 --- a/packages/backend/src/apps/flickr/auth/is-still-verified.ts +++ b/packages/backend/src/apps/flickr/auth/is-still-verified.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { +const isStillVerified = async ($) => { const params = { method: 'flickr.test.login', format: 'json', diff --git a/packages/backend/src/apps/flickr/auth/verify-credentials.ts b/packages/backend/src/apps/flickr/auth/verify-credentials.js similarity index 84% rename from packages/backend/src/apps/flickr/auth/verify-credentials.ts rename to packages/backend/src/apps/flickr/auth/verify-credentials.js index 4a42af8f..1d3905dc 100644 --- a/packages/backend/src/apps/flickr/auth/verify-credentials.ts +++ b/packages/backend/src/apps/flickr/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const response = await $.http.post( `/oauth/access_token?oauth_verifier=${$.auth.data.oauth_verifier}&oauth_token=${$.auth.data.accessToken}`, null diff --git a/packages/backend/src/apps/flickr/common/add-auth-header.ts b/packages/backend/src/apps/flickr/common/add-auth-header.js similarity index 51% rename from packages/backend/src/apps/flickr/common/add-auth-header.ts rename to packages/backend/src/apps/flickr/common/add-auth-header.js index 7e9daa02..01c26019 100644 --- a/packages/backend/src/apps/flickr/common/add-auth-header.ts +++ b/packages/backend/src/apps/flickr/common/add-auth-header.js @@ -1,22 +1,14 @@ -import { Token } from 'oauth-1.0a'; -import { IJSONObject, TBeforeRequest } from '@automatisch/types'; -import oauthClient from './oauth-client'; +import oauthClient from './oauth-client.js'; -type RequestDataType = { - url: string; - method: string; - data?: IJSONObject; -}; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { url, method, data, params } = requestConfig; - const token: Token = { - key: $.auth.data?.accessToken as string, - secret: $.auth.data?.accessSecret as string, + const token = { + key: $.auth.data?.accessToken, + secret: $.auth.data?.accessSecret, }; - const requestData: RequestDataType = { + const requestData = { url: `${requestConfig.baseURL}${url}`, method, }; diff --git a/packages/backend/src/apps/flickr/common/oauth-client.ts b/packages/backend/src/apps/flickr/common/oauth-client.js similarity index 65% rename from packages/backend/src/apps/flickr/common/oauth-client.ts rename to packages/backend/src/apps/flickr/common/oauth-client.js index c29f6a0a..d89c4889 100644 --- a/packages/backend/src/apps/flickr/common/oauth-client.ts +++ b/packages/backend/src/apps/flickr/common/oauth-client.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; import crypto from 'crypto'; import OAuth from 'oauth-1.0a'; -const oauthClient = ($: IGlobalVariable) => { +const oauthClient = ($) => { const consumerData = { - key: $.auth.data.consumerKey as string, - secret: $.auth.data.consumerSecret as string, + key: $.auth.data.consumerKey, + secret: $.auth.data.consumerSecret, }; return new OAuth({ diff --git a/packages/backend/src/apps/flickr/dynamic-data/index.js b/packages/backend/src/apps/flickr/dynamic-data/index.js new file mode 100644 index 00000000..cd0d4c38 --- /dev/null +++ b/packages/backend/src/apps/flickr/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listAlbums from './list-albums/index.js'; + +export default [listAlbums]; diff --git a/packages/backend/src/apps/flickr/dynamic-data/index.ts b/packages/backend/src/apps/flickr/dynamic-data/index.ts deleted file mode 100644 index b4d81ec4..00000000 --- a/packages/backend/src/apps/flickr/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listAlbums from './list-albums'; - -export default [listAlbums]; diff --git a/packages/backend/src/apps/flickr/dynamic-data/list-albums/index.ts b/packages/backend/src/apps/flickr/dynamic-data/list-albums/index.js similarity index 58% rename from packages/backend/src/apps/flickr/dynamic-data/list-albums/index.ts rename to packages/backend/src/apps/flickr/dynamic-data/list-albums/index.js index 115dcd17..55f0b9cf 100644 --- a/packages/backend/src/apps/flickr/dynamic-data/list-albums/index.ts +++ b/packages/backend/src/apps/flickr/dynamic-data/list-albums/index.js @@ -1,22 +1,8 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type TResponse = { - data: IJSONObject[]; - error?: IJSONObject; -}; - -type TPhotoset = { - id: string; - title: { - _content: string; - }; -}; - export default { name: 'List albums', key: 'listAlbums', - async run($: IGlobalVariable) { + async run($) { const params = { page: 1, per_page: 500, @@ -25,9 +11,10 @@ export default { format: 'json', nojsoncallback: 1, }; + let response = await $.http.get('/rest', { params }); - const aggregatedResponse: TResponse = { + const aggregatedResponse = { data: [...response.data.photosets.photoset], }; @@ -42,14 +29,12 @@ export default { aggregatedResponse.data.push(...response.data.photosets.photoset); } - aggregatedResponse.data = aggregatedResponse.data.map( - (photoset: TPhotoset) => { - return { - value: photoset.id, - name: photoset.title._content, - } as IJSONObject; - } - ); + aggregatedResponse.data = aggregatedResponse.data.map((photoset) => { + return { + value: photoset.id, + name: photoset.title._content, + }; + }); return aggregatedResponse; }, diff --git a/packages/backend/src/apps/flickr/index.d.ts b/packages/backend/src/apps/flickr/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/flickr/index.ts b/packages/backend/src/apps/flickr/index.js similarity index 65% rename from packages/backend/src/apps/flickr/index.ts rename to packages/backend/src/apps/flickr/index.js index 44254ca0..835db6cd 100644 --- a/packages/backend/src/apps/flickr/index.ts +++ b/packages/backend/src/apps/flickr/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Flickr', diff --git a/packages/backend/src/apps/flickr/triggers/index.js b/packages/backend/src/apps/flickr/triggers/index.js new file mode 100644 index 00000000..2c978926 --- /dev/null +++ b/packages/backend/src/apps/flickr/triggers/index.js @@ -0,0 +1,6 @@ +import newAlbums from './new-albums/index.js'; +import newFavoritePhotos from './new-favorite-photos/index.js'; +import newPhotos from './new-photos/index.js'; +import newPhotosInAlbums from './new-photos-in-album/index.js'; + +export default [newAlbums, newFavoritePhotos, newPhotos, newPhotosInAlbums]; diff --git a/packages/backend/src/apps/flickr/triggers/index.ts b/packages/backend/src/apps/flickr/triggers/index.ts deleted file mode 100644 index 5e8bad6a..00000000 --- a/packages/backend/src/apps/flickr/triggers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import newAlbums from './new-albums'; -import newFavoritePhotos from './new-favorite-photos'; -import newPhotos from './new-photos'; -import newPhotosInAlbums from './new-photos-in-album'; - -export default [newAlbums, newFavoritePhotos, newPhotos, newPhotosInAlbums]; diff --git a/packages/backend/src/apps/flickr/triggers/new-albums/index.ts b/packages/backend/src/apps/flickr/triggers/new-albums/index.js similarity index 65% rename from packages/backend/src/apps/flickr/triggers/new-albums/index.ts rename to packages/backend/src/apps/flickr/triggers/new-albums/index.js index e7bf9178..ff7bca12 100644 --- a/packages/backend/src/apps/flickr/triggers/new-albums/index.ts +++ b/packages/backend/src/apps/flickr/triggers/new-albums/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newAlbums from './new-albums'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newAlbums from './new-albums.js'; export default defineTrigger({ name: 'New albums', diff --git a/packages/backend/src/apps/flickr/triggers/new-albums/new-albums.ts b/packages/backend/src/apps/flickr/triggers/new-albums/new-albums.js similarity index 85% rename from packages/backend/src/apps/flickr/triggers/new-albums/new-albums.ts rename to packages/backend/src/apps/flickr/triggers/new-albums/new-albums.js index 918ac412..b4490942 100644 --- a/packages/backend/src/apps/flickr/triggers/new-albums/new-albums.ts +++ b/packages/backend/src/apps/flickr/triggers/new-albums/new-albums.js @@ -1,5 +1,3 @@ -import { IGlobalVariable } from '@automatisch/types'; - const extraFields = [ 'license', 'date_upload', @@ -22,7 +20,7 @@ const extraFields = [ 'url_o', ].join(','); -const newAlbums = async ($: IGlobalVariable) => { +const newAlbums = async ($) => { let page = 1; let pages = 1; @@ -45,7 +43,7 @@ const newAlbums = async ($: IGlobalVariable) => { $.pushTriggerItem({ raw: photoset, meta: { - internalId: photoset.id as string, + internalId: photoset.id, }, }); } diff --git a/packages/backend/src/apps/flickr/triggers/new-favorite-photos/index.ts b/packages/backend/src/apps/flickr/triggers/new-favorite-photos/index.js similarity index 64% rename from packages/backend/src/apps/flickr/triggers/new-favorite-photos/index.ts rename to packages/backend/src/apps/flickr/triggers/new-favorite-photos/index.js index 70babf6d..6e80d2b4 100644 --- a/packages/backend/src/apps/flickr/triggers/new-favorite-photos/index.ts +++ b/packages/backend/src/apps/flickr/triggers/new-favorite-photos/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newFavoritePhotos from './new-favorite-photos'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newFavoritePhotos from './new-favorite-photos.js'; export default defineTrigger({ name: 'New favorite photos', diff --git a/packages/backend/src/apps/flickr/triggers/new-favorite-photos/new-favorite-photos.ts b/packages/backend/src/apps/flickr/triggers/new-favorite-photos/new-favorite-photos.js similarity index 86% rename from packages/backend/src/apps/flickr/triggers/new-favorite-photos/new-favorite-photos.ts rename to packages/backend/src/apps/flickr/triggers/new-favorite-photos/new-favorite-photos.js index 4e7f9842..5a06649a 100644 --- a/packages/backend/src/apps/flickr/triggers/new-favorite-photos/new-favorite-photos.ts +++ b/packages/backend/src/apps/flickr/triggers/new-favorite-photos/new-favorite-photos.js @@ -1,5 +1,3 @@ -import { IGlobalVariable } from '@automatisch/types'; - const extraFields = [ 'description', 'license', @@ -28,7 +26,7 @@ const extraFields = [ 'url_o', ].join(','); -const newPhotos = async ($: IGlobalVariable) => { +const newPhotos = async ($) => { let page = 1; let pages = 1; @@ -51,7 +49,7 @@ const newPhotos = async ($: IGlobalVariable) => { $.pushTriggerItem({ raw: photo, meta: { - internalId: photo.date_faved as string, + internalId: photo.date_faved, }, }); } diff --git a/packages/backend/src/apps/flickr/triggers/new-photos-in-album/index.ts b/packages/backend/src/apps/flickr/triggers/new-photos-in-album/index.js similarity index 78% rename from packages/backend/src/apps/flickr/triggers/new-photos-in-album/index.ts rename to packages/backend/src/apps/flickr/triggers/new-photos-in-album/index.js index d3e7022b..d61261b7 100644 --- a/packages/backend/src/apps/flickr/triggers/new-photos-in-album/index.ts +++ b/packages/backend/src/apps/flickr/triggers/new-photos-in-album/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newPhotosInAlbum from './new-photos-in-album'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newPhotosInAlbum from './new-photos-in-album.js'; export default defineTrigger({ name: 'New photos in album', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Album', key: 'album', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: false, source: { diff --git a/packages/backend/src/apps/flickr/triggers/new-photos-in-album/new-photos-in-album.ts b/packages/backend/src/apps/flickr/triggers/new-photos-in-album/new-photos-in-album.js similarity index 81% rename from packages/backend/src/apps/flickr/triggers/new-photos-in-album/new-photos-in-album.ts rename to packages/backend/src/apps/flickr/triggers/new-photos-in-album/new-photos-in-album.js index 98ba9ff3..aa681dd6 100644 --- a/packages/backend/src/apps/flickr/triggers/new-photos-in-album/new-photos-in-album.ts +++ b/packages/backend/src/apps/flickr/triggers/new-photos-in-album/new-photos-in-album.js @@ -1,5 +1,3 @@ -import { IGlobalVariable } from '@automatisch/types'; - const extraFields = [ 'license', 'date_upload', @@ -22,7 +20,7 @@ const extraFields = [ 'url_o', ].join(','); -const newPhotosInAlbum = async ($: IGlobalVariable) => { +const newPhotosInAlbum = async ($) => { let page = 1; let pages = 1; @@ -32,7 +30,7 @@ const newPhotosInAlbum = async ($: IGlobalVariable) => { per_page: 11, user_id: $.auth.data.userId, extras: extraFields, - photoset_id: $.step.parameters.album as string, + photoset_id: $.step.parameters.album, method: 'flickr.photosets.getPhotos', format: 'json', nojsoncallback: 1, @@ -46,7 +44,7 @@ const newPhotosInAlbum = async ($: IGlobalVariable) => { $.pushTriggerItem({ raw: photo, meta: { - internalId: photo.id as string, + internalId: photo.id, }, }); } diff --git a/packages/backend/src/apps/flickr/triggers/new-photos/index.ts b/packages/backend/src/apps/flickr/triggers/new-photos/index.js similarity index 64% rename from packages/backend/src/apps/flickr/triggers/new-photos/index.ts rename to packages/backend/src/apps/flickr/triggers/new-photos/index.js index 66e95ede..f88a7b97 100644 --- a/packages/backend/src/apps/flickr/triggers/new-photos/index.ts +++ b/packages/backend/src/apps/flickr/triggers/new-photos/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newPhotos from './new-photos'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newPhotos from './new-photos.js'; export default defineTrigger({ name: 'New photos', diff --git a/packages/backend/src/apps/flickr/triggers/new-photos/new-photos.ts b/packages/backend/src/apps/flickr/triggers/new-photos/new-photos.js similarity index 86% rename from packages/backend/src/apps/flickr/triggers/new-photos/new-photos.ts rename to packages/backend/src/apps/flickr/triggers/new-photos/new-photos.js index a27a9185..feef50ee 100644 --- a/packages/backend/src/apps/flickr/triggers/new-photos/new-photos.ts +++ b/packages/backend/src/apps/flickr/triggers/new-photos/new-photos.js @@ -1,5 +1,3 @@ -import { IGlobalVariable } from '@automatisch/types'; - const extraFields = [ 'description', 'license', @@ -28,7 +26,7 @@ const extraFields = [ 'url_o', ].join(','); -const newPhotos = async ($: IGlobalVariable) => { +const newPhotos = async ($) => { let page = 1; let pages = 1; @@ -51,7 +49,7 @@ const newPhotos = async ($: IGlobalVariable) => { $.pushTriggerItem({ raw: photo, meta: { - internalId: photo.id as string, + internalId: photo.id, }, }); } diff --git a/packages/backend/src/apps/flowers-software/auth/index.ts b/packages/backend/src/apps/flowers-software/auth/index.js similarity index 77% rename from packages/backend/src/apps/flowers-software/auth/index.ts rename to packages/backend/src/apps/flowers-software/auth/index.js index 6dd40712..04724510 100644 --- a/packages/backend/src/apps/flowers-software/auth/index.ts +++ b/packages/backend/src/apps/flowers-software/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'username', label: 'Username', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -17,7 +17,7 @@ export default { { key: 'password', label: 'Password', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -28,7 +28,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/flowers-software/auth/is-still-verified.js b/packages/backend/src/apps/flowers-software/auth/is-still-verified.js new file mode 100644 index 00000000..270d415b --- /dev/null +++ b/packages/backend/src/apps/flowers-software/auth/is-still-verified.js @@ -0,0 +1,9 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/flowers-software/auth/is-still-verified.ts b/packages/backend/src/apps/flowers-software/auth/is-still-verified.ts deleted file mode 100644 index 5a2fe2ae..00000000 --- a/packages/backend/src/apps/flowers-software/auth/is-still-verified.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/flowers-software/auth/verify-credentials.ts b/packages/backend/src/apps/flowers-software/auth/verify-credentials.js similarity index 69% rename from packages/backend/src/apps/flowers-software/auth/verify-credentials.ts rename to packages/backend/src/apps/flowers-software/auth/verify-credentials.js index 4e7a4f69..33c709ba 100644 --- a/packages/backend/src/apps/flowers-software/auth/verify-credentials.ts +++ b/packages/backend/src/apps/flowers-software/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getWebhooks from '../common/get-webhooks'; +import getWebhooks from '../common/get-webhooks.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const response = await getWebhooks($); const successful = Array.isArray(response.data); diff --git a/packages/backend/src/apps/flowers-software/common/add-auth-header.js b/packages/backend/src/apps/flowers-software/common/add-auth-header.js new file mode 100644 index 00000000..23e64600 --- /dev/null +++ b/packages/backend/src/apps/flowers-software/common/add-auth-header.js @@ -0,0 +1,16 @@ +const addAuthHeader = ($, requestConfig) => { + const { data } = $.auth; + + if (data?.username && data.password && data.apiKey) { + requestConfig.headers['x-api-key'] = data.apiKey; + + requestConfig.auth = { + username: data.username, + password: data.password, + }; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/flowers-software/common/add-auth-header.ts b/packages/backend/src/apps/flowers-software/common/add-auth-header.ts deleted file mode 100644 index 02f524fd..00000000 --- a/packages/backend/src/apps/flowers-software/common/add-auth-header.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - const { data } = $.auth; - - if (data?.username && data.password && data.apiKey) { - requestConfig.headers['x-api-key'] = data.apiKey as string; - - requestConfig.auth = { - username: data.username as string, - password: data.password as string, - }; - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/flowers-software/common/get-webhooks.js b/packages/backend/src/apps/flowers-software/common/get-webhooks.js new file mode 100644 index 00000000..70c06fe3 --- /dev/null +++ b/packages/backend/src/apps/flowers-software/common/get-webhooks.js @@ -0,0 +1,3 @@ +export default async function getWebhooks($) { + return await $.http.get('/v2/public/api/webhooks'); +} diff --git a/packages/backend/src/apps/flowers-software/common/get-webhooks.ts b/packages/backend/src/apps/flowers-software/common/get-webhooks.ts deleted file mode 100644 index bb529c26..00000000 --- a/packages/backend/src/apps/flowers-software/common/get-webhooks.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { IGlobalVariable } from "@automatisch/types"; - -export default async function getWebhooks($: IGlobalVariable) { - return await $.http.get('/v2/public/api/webhooks'); -} diff --git a/packages/backend/src/apps/flowers-software/common/webhook-filters.ts b/packages/backend/src/apps/flowers-software/common/webhook-filters.js similarity index 100% rename from packages/backend/src/apps/flowers-software/common/webhook-filters.ts rename to packages/backend/src/apps/flowers-software/common/webhook-filters.js diff --git a/packages/backend/src/apps/flowers-software/index.d.ts b/packages/backend/src/apps/flowers-software/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/flowers-software/index.ts b/packages/backend/src/apps/flowers-software/index.js similarity index 69% rename from packages/backend/src/apps/flowers-software/index.ts rename to packages/backend/src/apps/flowers-software/index.js index a0234867..44a0be6a 100644 --- a/packages/backend/src/apps/flowers-software/index.ts +++ b/packages/backend/src/apps/flowers-software/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Flowers Software', diff --git a/packages/backend/src/apps/flowers-software/triggers/index.js b/packages/backend/src/apps/flowers-software/triggers/index.js new file mode 100644 index 00000000..0c60d46e --- /dev/null +++ b/packages/backend/src/apps/flowers-software/triggers/index.js @@ -0,0 +1,3 @@ +import newActivity from './new-activity/index.js'; + +export default [newActivity]; diff --git a/packages/backend/src/apps/flowers-software/triggers/index.ts b/packages/backend/src/apps/flowers-software/triggers/index.ts deleted file mode 100644 index 5599f298..00000000 --- a/packages/backend/src/apps/flowers-software/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newActivity from './new-activity'; - -export default [newActivity]; diff --git a/packages/backend/src/apps/flowers-software/triggers/new-activity/index.ts b/packages/backend/src/apps/flowers-software/triggers/new-activity/index.js similarity index 86% rename from packages/backend/src/apps/flowers-software/triggers/new-activity/index.ts rename to packages/backend/src/apps/flowers-software/triggers/new-activity/index.js index ef01d81b..a0c975e2 100644 --- a/packages/backend/src/apps/flowers-software/triggers/new-activity/index.ts +++ b/packages/backend/src/apps/flowers-software/triggers/new-activity/index.js @@ -1,7 +1,7 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; -import webhookFilters from '../../common/webhook-filters'; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import webhookFilters from '../../common/webhook-filters.js'; export default defineTrigger({ name: 'New activity', @@ -12,7 +12,7 @@ export default defineTrigger({ { label: 'Activity type', key: 'filters', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick an activity type to receive events for.', variables: false, diff --git a/packages/backend/src/apps/formatter/actions/date-time/index.ts b/packages/backend/src/apps/formatter/actions/date-time/index.js similarity index 77% rename from packages/backend/src/apps/formatter/actions/date-time/index.ts rename to packages/backend/src/apps/formatter/actions/date-time/index.js index c5579fce..830421d7 100644 --- a/packages/backend/src/apps/formatter/actions/date-time/index.ts +++ b/packages/backend/src/apps/formatter/actions/date-time/index.js @@ -1,6 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; - -import formatDateTime from './transformers/format-date-time'; +import defineAction from '../../../../helpers/define-action.js'; +import formatDateTime from './transformers/format-date-time.js'; const transformers = { formatDateTime, @@ -14,7 +13,7 @@ export default defineAction({ { label: 'Transform', key: 'transform', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, options: [{ label: 'Format Date / Time', value: 'formatDateTime' }], @@ -36,8 +35,7 @@ export default defineAction({ ], async run($) { - const transformerName = $.step.parameters - .transform as keyof typeof transformers; + const transformerName = $.step.parameters.transform; const output = transformers[transformerName]($); $.setActionItem({ diff --git a/packages/backend/src/apps/formatter/actions/date-time/transformers/format-date-time.js b/packages/backend/src/apps/formatter/actions/date-time/transformers/format-date-time.js new file mode 100644 index 00000000..47f0266d --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/date-time/transformers/format-date-time.js @@ -0,0 +1,22 @@ +import { DateTime } from 'luxon'; + +const formatDateTime = ($) => { + const input = $.step.parameters.input; + + const fromFormat = $.step.parameters.fromFormat; + const fromTimezone = $.step.parameters.fromTimezone; + + const inputDateTime = DateTime.fromFormat(input, fromFormat, { + zone: fromTimezone, + setZone: true, + }); + + const toFormat = $.step.parameters.toFormat; + const toTimezone = $.step.parameters.toTimezone; + + const outputDateTime = inputDateTime.setZone(toTimezone).toFormat(toFormat); + + return outputDateTime; +}; + +export default formatDateTime; diff --git a/packages/backend/src/apps/formatter/actions/date-time/transformers/format-date-time.ts b/packages/backend/src/apps/formatter/actions/date-time/transformers/format-date-time.ts deleted file mode 100644 index 3536548a..00000000 --- a/packages/backend/src/apps/formatter/actions/date-time/transformers/format-date-time.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import { DateTime } from 'luxon'; - -const formatDateTime = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - - const fromFormat = $.step.parameters.fromFormat as string; - const fromTimezone = $.step.parameters.fromTimezone as string; - - const inputDateTime = DateTime.fromFormat(input, fromFormat, { - zone: fromTimezone, - setZone: true, - }); - - const toFormat = $.step.parameters.toFormat as string; - const toTimezone = $.step.parameters.toTimezone as string; - - const outputDateTime = inputDateTime.setZone(toTimezone).toFormat(toFormat); - - return outputDateTime; -}; - -export default formatDateTime; diff --git a/packages/backend/src/apps/formatter/actions/index.js b/packages/backend/src/apps/formatter/actions/index.js new file mode 100644 index 00000000..f7f07e50 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/index.js @@ -0,0 +1,5 @@ +import text from './text/index.js'; +import numbers from './numbers/index.js'; +import dateTime from './date-time/index.js'; + +export default [text, numbers, dateTime]; diff --git a/packages/backend/src/apps/formatter/actions/index.ts b/packages/backend/src/apps/formatter/actions/index.ts deleted file mode 100644 index 0609b8c9..00000000 --- a/packages/backend/src/apps/formatter/actions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import text from './text'; -import numbers from './numbers'; -import dateTime from './date-time'; - -export default [text, numbers, dateTime]; diff --git a/packages/backend/src/apps/formatter/actions/numbers/index.ts b/packages/backend/src/apps/formatter/actions/numbers/index.js similarity index 80% rename from packages/backend/src/apps/formatter/actions/numbers/index.ts rename to packages/backend/src/apps/formatter/actions/numbers/index.js index c4518b44..94aca22e 100644 --- a/packages/backend/src/apps/formatter/actions/numbers/index.ts +++ b/packages/backend/src/apps/formatter/actions/numbers/index.js @@ -1,9 +1,9 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -import performMathOperation from './transformers/perform-math-operation'; -import randomNumber from './transformers/random-number'; -import formatNumber from './transformers/format-number'; -import formatPhoneNumber from './transformers/format-phone-number'; +import performMathOperation from './transformers/perform-math-operation.js'; +import randomNumber from './transformers/random-number.js'; +import formatNumber from './transformers/format-number.js'; +import formatPhoneNumber from './transformers/format-phone-number.js'; const transformers = { performMathOperation, @@ -21,7 +21,7 @@ export default defineAction({ { label: 'Transform', key: 'transform', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, options: [ @@ -48,8 +48,7 @@ export default defineAction({ ], async run($) { - const transformerName = $.step.parameters - .transform as keyof typeof transformers; + const transformerName = $.step.parameters.transform; const output = transformers[transformerName]($); $.setActionItem({ diff --git a/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts b/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.js similarity index 75% rename from packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts rename to packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.js index 7d03904f..783ad012 100644 --- a/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts +++ b/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.js @@ -1,10 +1,9 @@ -import { IGlobalVariable } from '@automatisch/types'; import accounting from 'accounting'; -const formatNumber = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - const inputDecimalMark = $.step.parameters.inputDecimalMark as string; - const toFormat = $.step.parameters.toFormat as string; +const formatNumber = ($) => { + const input = $.step.parameters.input; + const inputDecimalMark = $.step.parameters.inputDecimalMark; + const toFormat = $.step.parameters.toFormat; const normalizedNumber = accounting.unformat(input, inputDecimalMark); const decimalPart = normalizedNumber.toString().split('.')[1]; diff --git a/packages/backend/src/apps/formatter/actions/numbers/transformers/format-phone-number.ts b/packages/backend/src/apps/formatter/actions/numbers/transformers/format-phone-number.js similarity index 50% rename from packages/backend/src/apps/formatter/actions/numbers/transformers/format-phone-number.ts rename to packages/backend/src/apps/formatter/actions/numbers/transformers/format-phone-number.js index a0a986b7..f9aca9a2 100644 --- a/packages/backend/src/apps/formatter/actions/numbers/transformers/format-phone-number.ts +++ b/packages/backend/src/apps/formatter/actions/numbers/transformers/format-phone-number.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; -import parsePhoneNumber, { CountryCode } from 'libphonenumber-js'; +import parsePhoneNumber from 'libphonenumber-js'; -const formatPhoneNumber = ($: IGlobalVariable) => { - const phoneNumber = $.step.parameters.phoneNumber as string; - const toFormat = $.step.parameters.toFormat as string; - const phoneNumberCountryCode = ($.step.parameters.phoneNumberCountryCode || - 'US') as CountryCode; +const formatPhoneNumber = ($) => { + const phoneNumber = $.step.parameters.phoneNumber; + const toFormat = $.step.parameters.toFormat; + const phoneNumberCountryCode = + $.step.parameters.phoneNumberCountryCode || 'US'; const parsedPhoneNumber = parsePhoneNumber( phoneNumber, diff --git a/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.ts b/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.js similarity index 60% rename from packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.ts rename to packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.js index b4126ce2..e6127b6c 100644 --- a/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.ts +++ b/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.js @@ -1,11 +1,11 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import { add, divide, multiply, subtract } from 'lodash'; +import add from 'lodash/add.js'; +import divide from 'lodash/divide.js'; +import multiply from 'lodash/multiply.js'; +import subtract from 'lodash/subtract.js'; -const mathOperation = ($: IGlobalVariable) => { - const mathOperation = $.step.parameters.mathOperation as string; - const values = ($.step.parameters.values as IJSONObject[]).map((value) => - Number(value.input) - ) as number[]; +const mathOperation = ($) => { + const mathOperation = $.step.parameters.mathOperation; + const values = $.step.parameters.values.map((value) => Number(value.input)); if (mathOperation === 'add') { return values.reduce((acc, curr) => add(acc, curr), 0); diff --git a/packages/backend/src/apps/formatter/actions/numbers/transformers/random-number.ts b/packages/backend/src/apps/formatter/actions/numbers/transformers/random-number.js similarity index 76% rename from packages/backend/src/apps/formatter/actions/numbers/transformers/random-number.ts rename to packages/backend/src/apps/formatter/actions/numbers/transformers/random-number.js index b82ac034..38848246 100644 --- a/packages/backend/src/apps/formatter/actions/numbers/transformers/random-number.ts +++ b/packages/backend/src/apps/formatter/actions/numbers/transformers/random-number.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const randomNumber = ($: IGlobalVariable) => { +const randomNumber = ($) => { const lowerRange = Number($.step.parameters.lowerRange); const upperRange = Number($.step.parameters.upperRange); const decimalPoints = Number($.step.parameters.decimalPoints) || 0; diff --git a/packages/backend/src/apps/formatter/actions/text/index.ts b/packages/backend/src/apps/formatter/actions/text/index.js similarity index 70% rename from packages/backend/src/apps/formatter/actions/text/index.ts rename to packages/backend/src/apps/formatter/actions/text/index.js index 06d8b533..7e63846e 100644 --- a/packages/backend/src/apps/formatter/actions/text/index.ts +++ b/packages/backend/src/apps/formatter/actions/text/index.js @@ -1,15 +1,15 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -import capitalize from './transformers/capitalize'; -import extractEmailAddress from './transformers/extract-email-address'; -import extractNumber from './transformers/extract-number'; -import htmlToMarkdown from './transformers/html-to-markdown'; -import lowercase from './transformers/lowercase'; -import markdownToHtml from './transformers/markdown-to-html'; -import pluralize from './transformers/pluralize'; -import replace from './transformers/replace'; -import trimWhitespace from './transformers/trim-whitespace'; -import useDefaultValue from './transformers/use-default-value'; +import capitalize from './transformers/capitalize.js'; +import extractEmailAddress from './transformers/extract-email-address.js'; +import extractNumber from './transformers/extract-number.js'; +import htmlToMarkdown from './transformers/html-to-markdown.js'; +import lowercase from './transformers/lowercase.js'; +import markdownToHtml from './transformers/markdown-to-html.js'; +import pluralize from './transformers/pluralize.js'; +import replace from './transformers/replace.js'; +import trimWhitespace from './transformers/trim-whitespace.js'; +import useDefaultValue from './transformers/use-default-value.js'; const transformers = { capitalize, @@ -33,7 +33,7 @@ export default defineAction({ { label: 'Transform', key: 'transform', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, options: [ @@ -66,8 +66,7 @@ export default defineAction({ ], async run($) { - const transformerName = $.step.parameters - .transform as keyof typeof transformers; + const transformerName = $.step.parameters.transform; const output = transformers[transformerName]($); $.setActionItem({ diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/capitalize.js b/packages/backend/src/apps/formatter/actions/text/transformers/capitalize.js new file mode 100644 index 00000000..b886806d --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/text/transformers/capitalize.js @@ -0,0 +1,10 @@ +import lodashCapitalize from 'lodash/capitalize.js'; + +const capitalize = ($) => { + const input = $.step.parameters.input; + const capitalizedInput = input.replace(/\w+/g, lodashCapitalize); + + return capitalizedInput; +}; + +export default capitalize; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/capitalize.ts b/packages/backend/src/apps/formatter/actions/text/transformers/capitalize.ts deleted file mode 100644 index e73db203..00000000 --- a/packages/backend/src/apps/formatter/actions/text/transformers/capitalize.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import { capitalize as lodashCapitalize } from 'lodash'; - -const capitalize = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - const capitalizedInput = input.replace(/\w+/g, lodashCapitalize); - - return capitalizedInput; -}; - -export default capitalize; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/extract-email-address.ts b/packages/backend/src/apps/formatter/actions/text/transformers/extract-email-address.js similarity index 63% rename from packages/backend/src/apps/formatter/actions/text/transformers/extract-email-address.ts rename to packages/backend/src/apps/formatter/actions/text/transformers/extract-email-address.js index 14f7fb4f..127c554d 100644 --- a/packages/backend/src/apps/formatter/actions/text/transformers/extract-email-address.ts +++ b/packages/backend/src/apps/formatter/actions/text/transformers/extract-email-address.js @@ -1,7 +1,5 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const extractEmailAddress = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; +const extractEmailAddress = ($) => { + const input = $.step.parameters.input; const emailRegexp = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/extract-number.ts b/packages/backend/src/apps/formatter/actions/text/transformers/extract-number.js similarity index 71% rename from packages/backend/src/apps/formatter/actions/text/transformers/extract-number.ts rename to packages/backend/src/apps/formatter/actions/text/transformers/extract-number.js index ef845169..70abd58f 100644 --- a/packages/backend/src/apps/formatter/actions/text/transformers/extract-number.ts +++ b/packages/backend/src/apps/formatter/actions/text/transformers/extract-number.js @@ -1,7 +1,5 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const extractNumber = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; +const extractNumber = ($) => { + const input = $.step.parameters.input; // Example numbers that's supported: // 123 diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/html-to-markdown.ts b/packages/backend/src/apps/formatter/actions/text/transformers/html-to-markdown.js similarity index 51% rename from packages/backend/src/apps/formatter/actions/text/transformers/html-to-markdown.ts rename to packages/backend/src/apps/formatter/actions/text/transformers/html-to-markdown.js index 89d3a817..adda99f4 100644 --- a/packages/backend/src/apps/formatter/actions/text/transformers/html-to-markdown.ts +++ b/packages/backend/src/apps/formatter/actions/text/transformers/html-to-markdown.js @@ -1,8 +1,7 @@ -import { IGlobalVariable } from '@automatisch/types'; import { NodeHtmlMarkdown } from 'node-html-markdown'; -const htmlToMarkdown = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; +const htmlToMarkdown = ($) => { + const input = $.step.parameters.input; const markdown = NodeHtmlMarkdown.translate(input); return markdown; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/lowercase.js b/packages/backend/src/apps/formatter/actions/text/transformers/lowercase.js new file mode 100644 index 00000000..7d712a59 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/text/transformers/lowercase.js @@ -0,0 +1,6 @@ +const lowercase = ($) => { + const input = $.step.parameters.input; + return input.toLowerCase(); +}; + +export default lowercase; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/lowercase.ts b/packages/backend/src/apps/formatter/actions/text/transformers/lowercase.ts deleted file mode 100644 index e01c1020..00000000 --- a/packages/backend/src/apps/formatter/actions/text/transformers/lowercase.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const lowercase = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - return input.toLowerCase(); -}; - -export default lowercase; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/markdown-to-html.ts b/packages/backend/src/apps/formatter/actions/text/transformers/markdown-to-html.js similarity index 52% rename from packages/backend/src/apps/formatter/actions/text/transformers/markdown-to-html.ts rename to packages/backend/src/apps/formatter/actions/text/transformers/markdown-to-html.js index 42e254aa..47bdaf36 100644 --- a/packages/backend/src/apps/formatter/actions/text/transformers/markdown-to-html.ts +++ b/packages/backend/src/apps/formatter/actions/text/transformers/markdown-to-html.js @@ -1,10 +1,9 @@ -import { IGlobalVariable } from '@automatisch/types'; import showdown from 'showdown'; const converter = new showdown.Converter(); -const markdownToHtml = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; +const markdownToHtml = ($) => { + const input = $.step.parameters.input; const html = converter.makeHtml(input); return html; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/pluralize.js b/packages/backend/src/apps/formatter/actions/text/transformers/pluralize.js new file mode 100644 index 00000000..8ba219e0 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/text/transformers/pluralize.js @@ -0,0 +1,8 @@ +import pluralizeLibrary from 'pluralize'; + +const pluralize = ($) => { + const input = $.step.parameters.input; + return pluralizeLibrary(input); +}; + +export default pluralize; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/pluralize.ts b/packages/backend/src/apps/formatter/actions/text/transformers/pluralize.ts deleted file mode 100644 index f5b3dc9a..00000000 --- a/packages/backend/src/apps/formatter/actions/text/transformers/pluralize.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import pluralizeLibrary from 'pluralize'; - -const pluralize = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - return pluralizeLibrary(input); -}; - -export default pluralize; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/replace.js b/packages/backend/src/apps/formatter/actions/text/transformers/replace.js new file mode 100644 index 00000000..4aa08b7f --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/text/transformers/replace.js @@ -0,0 +1,10 @@ +const replace = ($) => { + const input = $.step.parameters.input; + + const find = $.step.parameters.find; + const replace = $.step.parameters.replace; + + return input.replaceAll(find, replace); +}; + +export default replace; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/replace.ts b/packages/backend/src/apps/formatter/actions/text/transformers/replace.ts deleted file mode 100644 index 2aefeb03..00000000 --- a/packages/backend/src/apps/formatter/actions/text/transformers/replace.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const replace = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - - const find = $.step.parameters.find as string; - const replace = $.step.parameters.replace as string; - - return input.replaceAll(find, replace); -}; - -export default replace; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/trim-whitespace.js b/packages/backend/src/apps/formatter/actions/text/transformers/trim-whitespace.js new file mode 100644 index 00000000..1ee81023 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/text/transformers/trim-whitespace.js @@ -0,0 +1,6 @@ +const trimWhitespace = ($) => { + const input = $.step.parameters.input; + return input.trim(); +}; + +export default trimWhitespace; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/trim-whitespace.ts b/packages/backend/src/apps/formatter/actions/text/transformers/trim-whitespace.ts deleted file mode 100644 index 71b69835..00000000 --- a/packages/backend/src/apps/formatter/actions/text/transformers/trim-whitespace.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const trimWhitespace = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - return input.trim(); -}; - -export default trimWhitespace; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/use-default-value.js b/packages/backend/src/apps/formatter/actions/text/transformers/use-default-value.js new file mode 100644 index 00000000..54bc61ab --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/text/transformers/use-default-value.js @@ -0,0 +1,11 @@ +const useDefaultValue = ($) => { + const input = $.step.parameters.input; + + if (input && input.trim().length > 0) { + return input; + } + + return $.step.parameters.defaultValue; +}; + +export default useDefaultValue; diff --git a/packages/backend/src/apps/formatter/actions/text/transformers/use-default-value.ts b/packages/backend/src/apps/formatter/actions/text/transformers/use-default-value.ts deleted file mode 100644 index 37276152..00000000 --- a/packages/backend/src/apps/formatter/actions/text/transformers/use-default-value.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const useDefaultValue = ($: IGlobalVariable) => { - const input = $.step.parameters.input as string; - - if (input && input.trim().length > 0) { - return input; - } - - return $.step.parameters.defaultValue as string; -}; - -export default useDefaultValue; diff --git a/packages/backend/src/apps/formatter/common/phone-number-country-codes.ts b/packages/backend/src/apps/formatter/common/phone-number-country-codes.js similarity index 100% rename from packages/backend/src/apps/formatter/common/phone-number-country-codes.ts rename to packages/backend/src/apps/formatter/common/phone-number-country-codes.js diff --git a/packages/backend/src/apps/formatter/dynamic-fields/index.js b/packages/backend/src/apps/formatter/dynamic-fields/index.js new file mode 100644 index 00000000..41ca2e37 --- /dev/null +++ b/packages/backend/src/apps/formatter/dynamic-fields/index.js @@ -0,0 +1,3 @@ +import listTransformOptions from './list-transform-options/index.js'; + +export default [listTransformOptions]; diff --git a/packages/backend/src/apps/formatter/dynamic-fields/index.ts b/packages/backend/src/apps/formatter/dynamic-fields/index.ts deleted file mode 100644 index 83a189e9..00000000 --- a/packages/backend/src/apps/formatter/dynamic-fields/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listTransformOptions from './list-transform-options'; - -export default [listTransformOptions]; diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/format-date-time.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/format-date-time.js similarity index 78% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/format-date-time.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/format-date-time.js index 1475ee47..7dc47c07 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/format-date-time.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/format-date-time.js @@ -1,11 +1,11 @@ -import formatOptions from './options/format'; -import timezoneOptions from './options/timezone'; +import formatOptions from './options/format.js'; +import timezoneOptions from './options/timezone.js'; const formatDateTime = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'The datetime you want to format.', variables: true, @@ -13,7 +13,7 @@ const formatDateTime = [ { label: 'From Format', key: 'fromFormat', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The format of the input.', variables: true, @@ -22,7 +22,7 @@ const formatDateTime = [ { label: 'From Timezone', key: 'fromTimezone', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The timezone of the input.', variables: true, @@ -31,7 +31,7 @@ const formatDateTime = [ { label: 'To Format', key: 'toFormat', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The format of the output.', variables: true, @@ -40,7 +40,7 @@ const formatDateTime = [ { label: 'To Timezone', key: 'toTimezone', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The timezone of the output.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/format.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/format.js similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/format.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/format.js diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/timezone.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/timezone.js similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/timezone.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/date-time/options/timezone.js diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.js b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.js new file mode 100644 index 00000000..64ed7d56 --- /dev/null +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.js @@ -0,0 +1,42 @@ +import capitalize from './text/capitalize.js'; +import extractEmailAddress from './text/extract-email-address.js'; +import extractNumber from './text/extract-number.js'; +import htmlToMarkdown from './text/html-to-markdown.js'; +import lowercase from './text/lowercase.js'; +import markdownToHtml from './text/markdown-to-html.js'; +import pluralize from './text/pluralize.js'; +import replace from './text/replace.js'; +import trimWhitespace from './text/trim-whitespace.js'; +import useDefaultValue from './text/use-default-value.js'; +import performMathOperation from './numbers/perform-math-operation.js'; +import randomNumber from './numbers/random-number.js'; +import formatNumber from './numbers/format-number.js'; +import formatPhoneNumber from './numbers/format-phone-number.js'; +import formatDateTime from './date-time/format-date-time.js'; + +const options = { + capitalize, + extractEmailAddress, + extractNumber, + htmlToMarkdown, + lowercase, + markdownToHtml, + pluralize, + replace, + trimWhitespace, + useDefaultValue, + performMathOperation, + randomNumber, + formatNumber, + formatPhoneNumber, + formatDateTime, +}; + +export default { + name: 'List fields after transform', + key: 'listTransformOptions', + + async run($) { + return options[$.step.parameters.transform]; + }, +}; diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts deleted file mode 100644 index 3d143f33..00000000 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import capitalize from './text/capitalize'; -import extractEmailAddress from './text/extract-email-address'; -import extractNumber from './text/extract-number'; -import htmlToMarkdown from './text/html-to-markdown'; -import lowercase from './text/lowercase'; -import markdownToHtml from './text/markdown-to-html'; -import pluralize from './text/pluralize'; -import replace from './text/replace'; -import trimWhitespace from './text/trim-whitespace'; -import useDefaultValue from './text/use-default-value'; -import performMathOperation from './numbers/perform-math-operation'; -import randomNumber from './numbers/random-number'; -import formatNumber from './numbers/format-number'; -import formatPhoneNumber from './numbers/format-phone-number'; -import formatDateTime from './date-time/format-date-time'; - -const options: IJSONObject = { - capitalize, - extractEmailAddress, - extractNumber, - htmlToMarkdown, - lowercase, - markdownToHtml, - pluralize, - replace, - trimWhitespace, - useDefaultValue, - performMathOperation, - randomNumber, - formatNumber, - formatPhoneNumber, - formatDateTime, -}; - -export default { - name: 'List fields after transform', - key: 'listTransformOptions', - - async run($: IGlobalVariable) { - return options[$.step.parameters.transform as string]; - }, -}; diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.js similarity index 91% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.js index 96f1033b..9fca34fd 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.js @@ -2,7 +2,7 @@ const formatNumber = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'The number you want to format.', variables: true, @@ -10,7 +10,7 @@ const formatNumber = [ { label: 'Input Decimal Mark', key: 'inputDecimalMark', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The decimal mark of the input number.', variables: true, @@ -22,7 +22,7 @@ const formatNumber = [ { label: 'To Format', key: 'toFormat', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The format you want to convert the number to.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-phone-number.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-phone-number.js similarity index 89% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-phone-number.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-phone-number.js index fa48d1b1..c96b126e 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-phone-number.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-phone-number.js @@ -1,10 +1,10 @@ -import phoneNumberCountryCodes from '../../../common/phone-number-country-codes'; +import phoneNumberCountryCodes from '../../../common/phone-number-country-codes.js'; const formatPhoneNumber = [ { label: 'Phone Number', key: 'phoneNumber', - type: 'string' as const, + type: 'string', required: true, description: 'The phone number you want to format.', variables: true, @@ -12,7 +12,7 @@ const formatPhoneNumber = [ { label: 'To Format', key: 'toFormat', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The format you want to convert the number to.', variables: true, @@ -25,7 +25,7 @@ const formatPhoneNumber = [ { label: 'Phone Number Country Code', key: 'phoneNumberCountryCode', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The country code of the phone number. The default is US.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.js similarity index 89% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.js index 1d377640..85378bb3 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.js @@ -2,7 +2,7 @@ const performMathOperation = [ { label: 'Math Operation', key: 'mathOperation', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The math operation to perform.', variables: true, @@ -17,14 +17,14 @@ const performMathOperation = [ { label: 'Values', key: 'values', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'Add or remove numbers as needed.', fields: [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'The number to perform the math operation on.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/random-number.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/random-number.js similarity index 86% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/random-number.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/random-number.js index 4a6cb2ac..ba3d7142 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/random-number.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/random-number.js @@ -2,7 +2,7 @@ const randomNumber = [ { label: 'Lower range', key: 'lowerRange', - type: 'string' as const, + type: 'string', required: true, description: 'The lowest number to generate.', variables: true, @@ -10,7 +10,7 @@ const randomNumber = [ { label: 'Upper range', key: 'upperRange', - type: 'string' as const, + type: 'string', required: true, description: 'The highest number to generate.', variables: true, @@ -18,7 +18,7 @@ const randomNumber = [ { label: 'Decimal points', key: 'decimalPoints', - type: 'string' as const, + type: 'string', required: false, description: 'The number of digits after the decimal point. It can be an integer between 0 and 15.', diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.js similarity index 86% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.js index c8b72c08..523d8b09 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.js @@ -2,7 +2,7 @@ const capitalize = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be capitalized.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.js similarity index 88% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.js index 439caa85..9f0f5d82 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.js @@ -2,7 +2,7 @@ const extractEmailAddress = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be searched for an email address.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.js similarity index 87% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.js index cfb62957..2fe0ba63 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.js @@ -2,7 +2,7 @@ const extractNumber = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be searched for a number.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.js similarity index 87% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.js index a9ab3325..77b0ba9e 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.js @@ -2,7 +2,7 @@ const htmlToMarkdown = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'HTML that will be converted to Markdown.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.js similarity index 86% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.js index a3158bf4..d37eb2ec 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.js @@ -2,7 +2,7 @@ const lowercase = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be lowercased.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.js similarity index 88% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.js index 39c013bf..ad17ed73 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.js @@ -2,7 +2,7 @@ const markdownToHtml = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Markdown text that will be converted to HTML.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.js similarity index 86% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.js index d5949462..36e5df3a 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.js @@ -2,7 +2,7 @@ const pluralize = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be pluralized.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.js similarity index 85% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.js index d9452500..dfeb39ae 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.js @@ -2,7 +2,7 @@ const replace = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text that you want to search for and replace values.', variables: true, @@ -10,7 +10,7 @@ const replace = [ { label: 'Find', key: 'find', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be searched for.', variables: true, @@ -18,7 +18,7 @@ const replace = [ { label: 'Replace', key: 'replace', - type: 'string' as const, + type: 'string', required: false, description: 'Text that will replace the found text.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.js similarity index 88% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.js index 3967320b..538cb26a 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.js @@ -2,7 +2,7 @@ const trimWhitespace = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text you want to remove leading and trailing spaces.', variables: true, diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.js similarity index 87% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.js index 2c1f850b..e2edc1f0 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.js @@ -2,7 +2,7 @@ const useDefaultValue = [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Text you want to check whether it is empty or not.', variables: true, @@ -10,7 +10,7 @@ const useDefaultValue = [ { label: 'Default Value', key: 'defaultValue', - type: 'string' as const, + type: 'string', required: true, description: 'Text that will be used as a default value if the input is empty.', diff --git a/packages/backend/src/apps/formatter/index.d.ts b/packages/backend/src/apps/formatter/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/formatter/index.ts b/packages/backend/src/apps/formatter/index.js similarity index 68% rename from packages/backend/src/apps/formatter/index.ts rename to packages/backend/src/apps/formatter/index.js index 300b471d..f257dd48 100644 --- a/packages/backend/src/apps/formatter/index.ts +++ b/packages/backend/src/apps/formatter/index.js @@ -1,6 +1,6 @@ -import defineApp from '../../helpers/define-app'; -import actions from './actions'; -import dynamicFields from './dynamic-fields'; +import defineApp from '../../helpers/define-app.js'; +import actions from './actions/index.js'; +import dynamicFields from './dynamic-fields/index.js'; export default defineApp({ name: 'Formatter', diff --git a/packages/backend/src/apps/ghost/auth/index.ts b/packages/backend/src/apps/ghost/auth/index.js similarity index 74% rename from packages/backend/src/apps/ghost/auth/index.ts rename to packages/backend/src/apps/ghost/auth/index.js index bdb9f338..c9399c0e 100644 --- a/packages/backend/src/apps/ghost/auth/index.ts +++ b/packages/backend/src/apps/ghost/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'instanceUrl', label: 'Instance URL', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -17,7 +17,7 @@ export default { { key: 'apiKey', label: 'Admin API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/ghost/auth/is-still-verified.js b/packages/backend/src/apps/ghost/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/ghost/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/ghost/auth/is-still-verified.ts b/packages/backend/src/apps/ghost/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/ghost/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/ghost/auth/verify-credentials.ts b/packages/backend/src/apps/ghost/auth/verify-credentials.js similarity index 70% rename from packages/backend/src/apps/ghost/auth/verify-credentials.ts rename to packages/backend/src/apps/ghost/auth/verify-credentials.js index a8795d0b..13e46b43 100644 --- a/packages/backend/src/apps/ghost/auth/verify-credentials.ts +++ b/packages/backend/src/apps/ghost/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const site = await $.http.get('/admin/site/'); const screenName = [site.data.site.title, site.data.site.url] .filter(Boolean) diff --git a/packages/backend/src/apps/ghost/common/add-auth-header.ts b/packages/backend/src/apps/ghost/common/add-auth-header.js similarity index 70% rename from packages/backend/src/apps/ghost/common/add-auth-header.ts rename to packages/backend/src/apps/ghost/common/add-auth-header.js index 2a449e13..60b65a2b 100644 --- a/packages/backend/src/apps/ghost/common/add-auth-header.ts +++ b/packages/backend/src/apps/ghost/common/add-auth-header.js @@ -1,8 +1,7 @@ -import { TBeforeRequest } from '@automatisch/types'; import jwt from 'jsonwebtoken'; -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - const key = $.auth.data?.apiKey as string; +const addAuthHeader = ($, requestConfig) => { + const key = $.auth.data?.apiKey; if (key) { const [id, secret] = key.split(':'); diff --git a/packages/backend/src/apps/ghost/common/set-base-url.js b/packages/backend/src/apps/ghost/common/set-base-url.js new file mode 100644 index 00000000..a8f668db --- /dev/null +++ b/packages/backend/src/apps/ghost/common/set-base-url.js @@ -0,0 +1,10 @@ +const setBaseUrl = ($, requestConfig) => { + const instanceUrl = $.auth.data.instanceUrl; + if (instanceUrl) { + requestConfig.baseURL = `${instanceUrl}/ghost/api`; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/ghost/common/set-base-url.ts b/packages/backend/src/apps/ghost/common/set-base-url.ts deleted file mode 100644 index 1a769742..00000000 --- a/packages/backend/src/apps/ghost/common/set-base-url.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - const instanceUrl = $.auth.data.instanceUrl as string; - if (instanceUrl) { - requestConfig.baseURL = `${instanceUrl}/ghost/api`; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/ghost/index.d.ts b/packages/backend/src/apps/ghost/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/ghost/index.ts b/packages/backend/src/apps/ghost/index.js similarity index 59% rename from packages/backend/src/apps/ghost/index.ts rename to packages/backend/src/apps/ghost/index.js index 12a1a07b..76b99c57 100644 --- a/packages/backend/src/apps/ghost/index.ts +++ b/packages/backend/src/apps/ghost/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import setBaseUrl from './common/set-base-url'; -import auth from './auth'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import setBaseUrl from './common/set-base-url.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Ghost', diff --git a/packages/backend/src/apps/ghost/triggers/index.js b/packages/backend/src/apps/ghost/triggers/index.js new file mode 100644 index 00000000..5505ef00 --- /dev/null +++ b/packages/backend/src/apps/ghost/triggers/index.js @@ -0,0 +1,3 @@ +import newPostPublished from './new-post-published/index.js'; + +export default [newPostPublished]; diff --git a/packages/backend/src/apps/ghost/triggers/index.ts b/packages/backend/src/apps/ghost/triggers/index.ts deleted file mode 100644 index 776ed504..00000000 --- a/packages/backend/src/apps/ghost/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newPostPublished from './new-post-published'; - -export default [newPostPublished]; diff --git a/packages/backend/src/apps/ghost/triggers/new-post-published/index.ts b/packages/backend/src/apps/ghost/triggers/new-post-published/index.js similarity index 91% rename from packages/backend/src/apps/ghost/triggers/new-post-published/index.ts rename to packages/backend/src/apps/ghost/triggers/new-post-published/index.js index cba788b2..12ad9d95 100644 --- a/packages/backend/src/apps/ghost/triggers/new-post-published/index.ts +++ b/packages/backend/src/apps/ghost/triggers/new-post-published/index.js @@ -1,6 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New post published', diff --git a/packages/backend/src/apps/github/actions/create-issue/index.ts b/packages/backend/src/apps/github/actions/create-issue/index.js similarity index 76% rename from packages/backend/src/apps/github/actions/create-issue/index.ts rename to packages/backend/src/apps/github/actions/create-issue/index.js index af4fe9eb..f6d97048 100644 --- a/packages/backend/src/apps/github/actions/create-issue/index.ts +++ b/packages/backend/src/apps/github/actions/create-issue/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; +import defineAction from '../../../../helpers/define-action.js'; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo.js'; export default defineAction({ name: 'Create issue', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Repo', key: 'repo', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, source: { @@ -26,23 +26,23 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Body', key: 'body', - type: 'string' as const, + type: 'string', required: true, variables: true, }, ], async run($) { - const repoParameter = $.step.parameters.repo as string; - const title = $.step.parameters.title as string; - const body = $.step.parameters.body as string; + const repoParameter = $.step.parameters.repo; + const title = $.step.parameters.title; + const body = $.step.parameters.body; if (!repoParameter) throw new Error('A repo must be set!'); if (!title) throw new Error('A title must be set!'); diff --git a/packages/backend/src/apps/github/actions/index.js b/packages/backend/src/apps/github/actions/index.js new file mode 100644 index 00000000..095990d0 --- /dev/null +++ b/packages/backend/src/apps/github/actions/index.js @@ -0,0 +1,3 @@ +import createIssue from './create-issue/index.js'; + +export default [createIssue]; diff --git a/packages/backend/src/apps/github/actions/index.ts b/packages/backend/src/apps/github/actions/index.ts deleted file mode 100644 index 06c945f8..00000000 --- a/packages/backend/src/apps/github/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createIssue from './create-issue'; - -export default [createIssue]; diff --git a/packages/backend/src/apps/github/auth/generate-auth-url.js b/packages/backend/src/apps/github/auth/generate-auth-url.js new file mode 100644 index 00000000..3b845369 --- /dev/null +++ b/packages/backend/src/apps/github/auth/generate-auth-url.js @@ -0,0 +1,22 @@ +import { URLSearchParams } from 'url'; + +export default async function generateAuthUrl($) { + const scopes = ['read:org', 'repo', 'user']; + const oauthRedirectUrlField = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ); + const redirectUri = oauthRedirectUrlField.value; + const searchParams = new URLSearchParams({ + client_id: $.auth.data.consumerKey, + redirect_uri: redirectUri, + scope: scopes.join(','), + }); + + const url = `${ + $.app.baseUrl + }/login/oauth/authorize?${searchParams.toString()}`; + + await $.auth.set({ + url, + }); +} diff --git a/packages/backend/src/apps/github/auth/generate-auth-url.ts b/packages/backend/src/apps/github/auth/generate-auth-url.ts deleted file mode 100644 index 0c7ea8ac..00000000 --- a/packages/backend/src/apps/github/auth/generate-auth-url.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import { URLSearchParams } from 'url'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const scopes = ['read:org', 'repo', 'user']; - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const redirectUri = oauthRedirectUrlField.value as string; - const searchParams = new URLSearchParams({ - client_id: $.auth.data.consumerKey as string, - redirect_uri: redirectUri, - scope: scopes.join(','), - }); - - const url = `${$.app.baseUrl - }/login/oauth/authorize?${searchParams.toString()}`; - - await $.auth.set({ - url, - }); -} diff --git a/packages/backend/src/apps/github/auth/index.ts b/packages/backend/src/apps/github/auth/index.js similarity index 81% rename from packages/backend/src/apps/github/auth/index.ts rename to packages/backend/src/apps/github/auth/index.js index 72389a80..59731eb2 100644 --- a/packages/backend/src/apps/github/auth/index.ts +++ b/packages/backend/src/apps/github/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/github/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'consumerKey', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -32,7 +32,7 @@ export default { { key: 'consumerSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/github/auth/is-still-verified.js b/packages/backend/src/apps/github/auth/is-still-verified.js new file mode 100644 index 00000000..1b9d46d0 --- /dev/null +++ b/packages/backend/src/apps/github/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/github/auth/is-still-verified.ts b/packages/backend/src/apps/github/auth/is-still-verified.ts deleted file mode 100644 index befb7694..00000000 --- a/packages/backend/src/apps/github/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/github/auth/verify-credentials.ts b/packages/backend/src/apps/github/auth/verify-credentials.js similarity index 81% rename from packages/backend/src/apps/github/auth/verify-credentials.ts rename to packages/backend/src/apps/github/auth/verify-credentials.js index d6407ed0..b07549b6 100644 --- a/packages/backend/src/apps/github/auth/verify-credentials.ts +++ b/packages/backend/src/apps/github/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const response = await $.http.post( `${$.app.baseUrl}/login/oauth/access_token`, { diff --git a/packages/backend/src/apps/github/common/add-auth-header.ts b/packages/backend/src/apps/github/common/add-auth-header.js similarity index 63% rename from packages/backend/src/apps/github/common/add-auth-header.ts rename to packages/backend/src/apps/github/common/add-auth-header.js index f4f2076f..9d56bd19 100644 --- a/packages/backend/src/apps/github/common/add-auth-header.ts +++ b/packages/backend/src/apps/github/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if (requestConfig.headers && $.auth.data?.accessToken) { requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/github/common/get-current-user.js b/packages/backend/src/apps/github/common/get-current-user.js new file mode 100644 index 00000000..f09b3983 --- /dev/null +++ b/packages/backend/src/apps/github/common/get-current-user.js @@ -0,0 +1,8 @@ +const getCurrentUser = async ($) => { + const response = await $.http.get('/user'); + + const currentUser = response.data; + return currentUser; +}; + +export default getCurrentUser; diff --git a/packages/backend/src/apps/github/common/get-current-user.ts b/packages/backend/src/apps/github/common/get-current-user.ts deleted file mode 100644 index 53f931e5..00000000 --- a/packages/backend/src/apps/github/common/get-current-user.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { - const response = await $.http.get('/user'); - - const currentUser = response.data; - return currentUser; -}; - -export default getCurrentUser; diff --git a/packages/backend/src/apps/github/common/get-repo-owner-and-repo.js b/packages/backend/src/apps/github/common/get-repo-owner-and-repo.js new file mode 100644 index 00000000..ee00b244 --- /dev/null +++ b/packages/backend/src/apps/github/common/get-repo-owner-and-repo.js @@ -0,0 +1,10 @@ +export default function getRepoOwnerAndRepo(repoFullName) { + if (!repoFullName) return {}; + + const [repoOwner, repo] = repoFullName.split('/'); + + return { + repoOwner, + repo, + }; +} diff --git a/packages/backend/src/apps/github/common/get-repo-owner-and-repo.ts b/packages/backend/src/apps/github/common/get-repo-owner-and-repo.ts deleted file mode 100644 index 4f6f9184..00000000 --- a/packages/backend/src/apps/github/common/get-repo-owner-and-repo.ts +++ /dev/null @@ -1,17 +0,0 @@ -type TRepoOwnerAndRepo = { - repoOwner?: string; - repo?: string; -}; - -export default function getRepoOwnerAndRepo( - repoFullName: string -): TRepoOwnerAndRepo { - if (!repoFullName) return {}; - - const [repoOwner, repo] = repoFullName.split('/'); - - return { - repoOwner, - repo, - }; -} diff --git a/packages/backend/src/apps/gitlab/common/paginate-all.ts b/packages/backend/src/apps/github/common/paginate-all.js similarity index 51% rename from packages/backend/src/apps/gitlab/common/paginate-all.ts rename to packages/backend/src/apps/github/common/paginate-all.js index 664489ab..e609b2d3 100644 --- a/packages/backend/src/apps/gitlab/common/paginate-all.ts +++ b/packages/backend/src/apps/github/common/paginate-all.js @@ -1,19 +1,8 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import type { AxiosResponse } from 'axios'; -import parseLinkHeader from '../../../helpers/parse-header-link'; +import parseLinkHeader from '../../../helpers/parse-header-link.js'; -type TResponse = { - data: IJSONObject[]; - error?: IJSONObject; -}; - -export default async function paginateAll( - $: IGlobalVariable, - request: Promise -) { +export default async function paginateAll($, request) { const response = await request; - - const aggregatedResponse: TResponse = { + const aggregatedResponse = { data: [...response.data], }; diff --git a/packages/backend/src/apps/github/dynamic-data/index.js b/packages/backend/src/apps/github/dynamic-data/index.js new file mode 100644 index 00000000..04afcbdd --- /dev/null +++ b/packages/backend/src/apps/github/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listLabels from './list-labels/index.js'; +import listRepos from './list-repos/index.js'; + +export default [listLabels, listRepos]; diff --git a/packages/backend/src/apps/github/dynamic-data/index.ts b/packages/backend/src/apps/github/dynamic-data/index.ts deleted file mode 100644 index 290705da..00000000 --- a/packages/backend/src/apps/github/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listLabels from './list-labels'; -import listRepos from './list-repos'; - -export default [listLabels, listRepos]; diff --git a/packages/backend/src/apps/github/dynamic-data/list-labels/index.ts b/packages/backend/src/apps/github/dynamic-data/list-labels/index.js similarity index 57% rename from packages/backend/src/apps/github/dynamic-data/list-labels/index.ts rename to packages/backend/src/apps/github/dynamic-data/list-labels/index.js index 2e0aacc4..d9ab38bd 100644 --- a/packages/backend/src/apps/github/dynamic-data/list-labels/index.ts +++ b/packages/backend/src/apps/github/dynamic-data/list-labels/index.js @@ -1,22 +1,19 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; -import paginateAll from '../../common/paginate-all'; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo.js'; +import paginateAll from '../../common/paginate-all.js'; export default { name: 'List labels', key: 'listLabels', - async run($: IGlobalVariable) { - const { repoOwner, repo } = getRepoOwnerAndRepo( - $.step.parameters.repo as string - ); + async run($) { + const { repoOwner, repo } = getRepoOwnerAndRepo($.step.parameters.repo); if (!repo) return { data: [] }; const firstPageRequest = $.http.get(`/repos/${repoOwner}/${repo}/labels`); const response = await paginateAll($, firstPageRequest); - response.data = response.data.map((repo: { name: string }) => { + response.data = response.data.map((repo) => { return { value: repo.name, name: repo.name, diff --git a/packages/backend/src/apps/github/dynamic-data/list-repos/index.ts b/packages/backend/src/apps/github/dynamic-data/list-repos/index.js similarity index 58% rename from packages/backend/src/apps/github/dynamic-data/list-repos/index.ts rename to packages/backend/src/apps/github/dynamic-data/list-repos/index.js index 5330f22d..06c5d477 100644 --- a/packages/backend/src/apps/github/dynamic-data/list-repos/index.ts +++ b/packages/backend/src/apps/github/dynamic-data/list-repos/index.js @@ -1,15 +1,14 @@ -import { IGlobalVariable } from '@automatisch/types'; -import paginateAll from '../../common/paginate-all'; +import paginateAll from '../../common/paginate-all.js'; export default { name: 'List repos', key: 'listRepos', - async run($: IGlobalVariable) { + async run($) { const firstPageRequest = $.http.get('/user/repos'); const response = await paginateAll($, firstPageRequest); - response.data = response.data.map((repo: { full_name: string }) => { + response.data = response.data.map((repo) => { return { value: repo.full_name, name: repo.full_name, diff --git a/packages/backend/src/apps/github/index.d.ts b/packages/backend/src/apps/github/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/github/index.ts b/packages/backend/src/apps/github/index.js similarity index 58% rename from packages/backend/src/apps/github/index.ts rename to packages/backend/src/apps/github/index.js index 2186004e..881b4f15 100644 --- a/packages/backend/src/apps/github/index.ts +++ b/packages/backend/src/apps/github/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'GitHub', diff --git a/packages/backend/src/apps/github/triggers/index.js b/packages/backend/src/apps/github/triggers/index.js new file mode 100644 index 00000000..62b86bf1 --- /dev/null +++ b/packages/backend/src/apps/github/triggers/index.js @@ -0,0 +1,6 @@ +import newIssues from './new-issues/index.js'; +import newPullRequests from './new-pull-requests/index.js'; +import newStargazers from './new-stargazers/index.js'; +import newWatchers from './new-watchers/index.js'; + +export default [newIssues, newPullRequests, newStargazers, newWatchers]; diff --git a/packages/backend/src/apps/github/triggers/index.ts b/packages/backend/src/apps/github/triggers/index.ts deleted file mode 100644 index d04d72c8..00000000 --- a/packages/backend/src/apps/github/triggers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import newIssues from './new-issues'; -import newPullRequests from './new-pull-requests'; -import newStargazers from './new-stargazers'; -import newWatchers from './new-watchers'; - -export default [newIssues, newPullRequests, newStargazers, newWatchers]; diff --git a/packages/backend/src/apps/github/triggers/new-issues/index.ts b/packages/backend/src/apps/github/triggers/new-issues/index.js similarity index 89% rename from packages/backend/src/apps/github/triggers/new-issues/index.ts rename to packages/backend/src/apps/github/triggers/new-issues/index.js index ce1356e2..699f8894 100644 --- a/packages/backend/src/apps/github/triggers/new-issues/index.ts +++ b/packages/backend/src/apps/github/triggers/new-issues/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newIssues from './new-issues'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newIssues from './new-issues.js'; export default defineTrigger({ name: 'New issues', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Repo', key: 'repo', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: false, source: { @@ -27,7 +27,7 @@ export default defineTrigger({ { label: 'Which types of issues should this trigger on?', key: 'issueType', - type: 'dropdown' as const, + type: 'dropdown', description: 'Defaults to any issue you can see.', required: true, variables: false, @@ -58,7 +58,7 @@ export default defineTrigger({ { label: 'Label', key: 'label', - type: 'dropdown' as const, + type: 'dropdown', description: 'Only trigger on issues when this label is added.', required: false, variables: false, diff --git a/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts b/packages/backend/src/apps/github/triggers/new-issues/new-issues.js similarity index 78% rename from packages/backend/src/apps/github/triggers/new-issues/new-issues.ts rename to packages/backend/src/apps/github/triggers/new-issues/new-issues.js index 4d1b4978..ee5c17d2 100644 --- a/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts +++ b/packages/backend/src/apps/github/triggers/new-issues/new-issues.js @@ -1,11 +1,8 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; -import parseLinkHeader from '../../../../helpers/parse-header-link'; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo.js'; +import parseLinkHeader from '../../../../helpers/parse-header-link.js'; -function getPathname($: IGlobalVariable) { - const { repoOwner, repo } = getRepoOwnerAndRepo( - $.step.parameters.repo as string - ); +function getPathname($) { + const { repoOwner, repo } = getRepoOwnerAndRepo($.step.parameters.repo); if (repoOwner && repo) { return `/repos/${repoOwner}/${repo}/issues`; @@ -14,7 +11,7 @@ function getPathname($: IGlobalVariable) { return '/issues'; } -const newIssues = async ($: IGlobalVariable) => { +const newIssues = async ($) => { const pathname = getPathname($); const params = { labels: $.step.parameters.label, diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/index.js similarity index 78% rename from packages/backend/src/apps/github/triggers/new-pull-requests/index.ts rename to packages/backend/src/apps/github/triggers/new-pull-requests/index.js index 212023aa..7b7f4b02 100644 --- a/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newPullRequests from './new-pull-requests'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newPullRequests from './new-pull-requests.js'; export default defineTrigger({ name: 'New pull requests', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Repo', key: 'repo', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: false, source: { diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.js similarity index 83% rename from packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts rename to packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.js index a19ef398..bbd6d8e9 100644 --- a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.js @@ -1,9 +1,8 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; -import parseLinkHeader from '../../../../helpers/parse-header-link'; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo.js'; +import parseLinkHeader from '../../../../helpers/parse-header-link.js'; -const newPullRequests = async ($: IGlobalVariable) => { - const repoParameter = $.step.parameters.repo as string; +const newPullRequests = async ($) => { + const repoParameter = $.step.parameters.repo; if (!repoParameter) throw new Error('A repo must be set!'); diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts b/packages/backend/src/apps/github/triggers/new-stargazers/index.js similarity index 78% rename from packages/backend/src/apps/github/triggers/new-stargazers/index.ts rename to packages/backend/src/apps/github/triggers/new-stargazers/index.js index 3ca2882b..0953e557 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/index.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newStargazers from './new-stargazers'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newStargazers from './new-stargazers.js'; export default defineTrigger({ name: 'New stargazers', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Repo', key: 'repo', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: false, source: { diff --git a/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts b/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.js similarity index 70% rename from packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts rename to packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.js index 2dab3f55..f83e0dd2 100644 --- a/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.ts +++ b/packages/backend/src/apps/github/triggers/new-stargazers/new-stargazers.js @@ -1,17 +1,10 @@ import { DateTime } from 'luxon'; -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; -import parseLinkHeader from '../../../../helpers/parse-header-link'; -type TResponseDataItem = { - starred_at: string; - user: IJSONObject; -}; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo.js'; +import parseLinkHeader from '../../../../helpers/parse-header-link.js'; -const newStargazers = async ($: IGlobalVariable) => { - const { repoOwner, repo } = getRepoOwnerAndRepo( - $.step.parameters.repo as string - ); +const newStargazers = async ($) => { + const { repoOwner, repo } = getRepoOwnerAndRepo($.step.parameters.repo); const firstPagePathname = `/repos/${repoOwner}/${repo}/stargazers`; const requestConfig = { params: { @@ -23,20 +16,14 @@ const newStargazers = async ($: IGlobalVariable) => { }, }; - const firstPageResponse = await $.http.get( - firstPagePathname, - requestConfig - ); + const firstPageResponse = await $.http.get(firstPagePathname, requestConfig); const firstPageLinks = parseLinkHeader(firstPageResponse.headers.link); // in case there is only single page to fetch let pathname = firstPageLinks.last?.uri || firstPagePathname; do { - const response = await $.http.get( - pathname, - requestConfig - ); + const response = await $.http.get(pathname, requestConfig); const links = parseLinkHeader(response.headers.link); pathname = links.prev?.uri; diff --git a/packages/backend/src/apps/github/triggers/new-watchers/index.ts b/packages/backend/src/apps/github/triggers/new-watchers/index.js similarity index 79% rename from packages/backend/src/apps/github/triggers/new-watchers/index.ts rename to packages/backend/src/apps/github/triggers/new-watchers/index.js index 89a6a583..62602e94 100644 --- a/packages/backend/src/apps/github/triggers/new-watchers/index.ts +++ b/packages/backend/src/apps/github/triggers/new-watchers/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newWatchers from './new-watchers'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newWatchers from './new-watchers.js'; export default defineTrigger({ name: 'New watchers', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Repo', key: 'repo', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: false, source: { diff --git a/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts b/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.js similarity index 87% rename from packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts rename to packages/backend/src/apps/github/triggers/new-watchers/new-watchers.js index f7e13035..3ccfba43 100644 --- a/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts +++ b/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.js @@ -1,9 +1,8 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; -import parseLinkHeader from '../../../../helpers/parse-header-link'; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo.js'; +import parseLinkHeader from '../../../../helpers/parse-header-link.js'; -const newWatchers = async ($: IGlobalVariable) => { - const repoParameter = $.step.parameters.repo as string; +const newWatchers = async ($) => { + const repoParameter = $.step.parameters.repo; if (!repoParameter) throw new Error('A repo must be set!'); diff --git a/packages/backend/src/apps/gitlab/auth/generate-auth-url.ts b/packages/backend/src/apps/gitlab/auth/generate-auth-url.js similarity index 63% rename from packages/backend/src/apps/gitlab/auth/generate-auth-url.ts rename to packages/backend/src/apps/gitlab/auth/generate-auth-url.js index d53ecce1..f3a7fb7b 100644 --- a/packages/backend/src/apps/gitlab/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/gitlab/auth/generate-auth-url.js @@ -1,15 +1,14 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URL, URLSearchParams } from 'url'; -import getBaseUrl from '../common/get-base-url'; +import getBaseUrl from '../common/get-base-url.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { // ref: https://docs.gitlab.com/ee/api/oauth2.html#authorization-code-flow const scopes = ['api', 'read_user']; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - redirect_uri: $.auth.data.oAuthRedirectUrl as string, + client_id: $.auth.data.clientId, + redirect_uri: $.auth.data.oAuthRedirectUrl, scope: scopes.join(' '), response_type: 'code', state: Date.now().toString(), diff --git a/packages/backend/src/apps/gitlab/auth/index.ts b/packages/backend/src/apps/gitlab/auth/index.js similarity index 81% rename from packages/backend/src/apps/gitlab/auth/index.ts rename to packages/backend/src/apps/gitlab/auth/index.js index b5e27e1e..f9756997 100644 --- a/packages/backend/src/apps/gitlab/auth/index.ts +++ b/packages/backend/src/apps/gitlab/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/gitlab/connections/add', @@ -21,7 +21,7 @@ export default { { key: 'instanceUrl', label: 'Gitlab instance URL', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: 'https://gitlab.com', @@ -33,7 +33,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -45,7 +45,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/gitlab/auth/is-still-verified.js b/packages/backend/src/apps/gitlab/auth/is-still-verified.js new file mode 100644 index 00000000..1b9d46d0 --- /dev/null +++ b/packages/backend/src/apps/gitlab/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/gitlab/auth/is-still-verified.ts b/packages/backend/src/apps/gitlab/auth/is-still-verified.ts deleted file mode 100644 index befb7694..00000000 --- a/packages/backend/src/apps/gitlab/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/gitlab/auth/refresh-token.ts b/packages/backend/src/apps/gitlab/auth/refresh-token.js similarity index 63% rename from packages/backend/src/apps/gitlab/auth/refresh-token.ts rename to packages/backend/src/apps/gitlab/auth/refresh-token.js index b57f292b..09b74b49 100644 --- a/packages/backend/src/apps/gitlab/auth/refresh-token.ts +++ b/packages/backend/src/apps/gitlab/auth/refresh-token.js @@ -1,14 +1,13 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { // ref: https://docs.gitlab.com/ee/api/oauth2.html#authorization-code-flow const params = new URLSearchParams({ grant_type: 'refresh_token', - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - refresh_token: $.auth.data.refreshToken as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post('/oauth/token', params.toString()); diff --git a/packages/backend/src/apps/gitlab/auth/verify-credentials.ts b/packages/backend/src/apps/gitlab/auth/verify-credentials.js similarity index 78% rename from packages/backend/src/apps/gitlab/auth/verify-credentials.ts rename to packages/backend/src/apps/gitlab/auth/verify-credentials.js index dfcbc083..02e794f7 100644 --- a/packages/backend/src/apps/gitlab/auth/verify-credentials.ts +++ b/packages/backend/src/apps/gitlab/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { // ref: https://docs.gitlab.com/ee/api/oauth2.html#authorization-code-flow const response = await $.http.post( @@ -25,10 +24,7 @@ const verifyCredentials = async ($: IGlobalVariable) => { $.auth.data.accessToken = data.access_token; const currentUser = await getCurrentUser($); - const screenName = [ - currentUser.username, - $.auth.data.instanceUrl, - ] + const screenName = [currentUser.username, $.auth.data.instanceUrl] .filter(Boolean) .join(' @ '); diff --git a/packages/backend/src/apps/mattermost/common/add-auth-header.ts b/packages/backend/src/apps/gitlab/common/add-auth-header.js similarity index 66% rename from packages/backend/src/apps/mattermost/common/add-auth-header.ts rename to packages/backend/src/apps/gitlab/common/add-auth-header.js index edbff231..150b2b4e 100644 --- a/packages/backend/src/apps/mattermost/common/add-auth-header.ts +++ b/packages/backend/src/apps/gitlab/common/add-auth-header.js @@ -1,11 +1,8 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { requestConfig.headers = requestConfig.headers || {}; requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`; } - return requestConfig; }; diff --git a/packages/backend/src/apps/gitlab/common/get-base-url.js b/packages/backend/src/apps/gitlab/common/get-base-url.js new file mode 100644 index 00000000..44e82c47 --- /dev/null +++ b/packages/backend/src/apps/gitlab/common/get-base-url.js @@ -0,0 +1,13 @@ +const getBaseUrl = ($) => { + if ($.auth.data.instanceUrl) { + return $.auth.data.instanceUrl; + } + + if ($.app.apiBaseUrl) { + return $.app.apiBaseUrl; + } + + return $.app.baseUrl; +}; + +export default getBaseUrl; diff --git a/packages/backend/src/apps/gitlab/common/get-base-url.ts b/packages/backend/src/apps/gitlab/common/get-base-url.ts deleted file mode 100644 index cbe8614f..00000000 --- a/packages/backend/src/apps/gitlab/common/get-base-url.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getBaseUrl = ($: IGlobalVariable): string => { - if ($.auth.data.instanceUrl) { - return $.auth.data.instanceUrl as string; - } - - if ($.app.apiBaseUrl) { - return $.app.apiBaseUrl; - } - - return $.app.baseUrl; -}; - -export default getBaseUrl; diff --git a/packages/backend/src/apps/gitlab/common/get-current-user.ts b/packages/backend/src/apps/gitlab/common/get-current-user.js similarity index 60% rename from packages/backend/src/apps/gitlab/common/get-current-user.ts rename to packages/backend/src/apps/gitlab/common/get-current-user.js index c7755535..f464d6a6 100644 --- a/packages/backend/src/apps/gitlab/common/get-current-user.ts +++ b/packages/backend/src/apps/gitlab/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { // ref: https://docs.gitlab.com/ee/api/users.html#list-current-user const response = await $.http.get('/api/v4/user'); diff --git a/packages/backend/src/apps/github/common/paginate-all.ts b/packages/backend/src/apps/gitlab/common/paginate-all.js similarity index 51% rename from packages/backend/src/apps/github/common/paginate-all.ts rename to packages/backend/src/apps/gitlab/common/paginate-all.js index 8a6d6d35..060aa2f0 100644 --- a/packages/backend/src/apps/github/common/paginate-all.ts +++ b/packages/backend/src/apps/gitlab/common/paginate-all.js @@ -1,18 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import type { AxiosResponse } from 'axios'; -import parseLinkHeader from '../../../helpers/parse-header-link'; +import parseLinkHeader from '../../../helpers/parse-header-link.js'; -type TResponse = { - data: IJSONObject[]; - error?: IJSONObject; -}; - -export default async function paginateAll( - $: IGlobalVariable, - request: Promise -) { +export default async function paginateAll($, request) { const response = await request; - const aggregatedResponse: TResponse = { + + const aggregatedResponse = { data: [...response.data], }; diff --git a/packages/backend/src/apps/gitlab/common/set-base-url.js b/packages/backend/src/apps/gitlab/common/set-base-url.js new file mode 100644 index 00000000..135149b1 --- /dev/null +++ b/packages/backend/src/apps/gitlab/common/set-base-url.js @@ -0,0 +1,11 @@ +const setBaseUrl = ($, requestConfig) => { + if ($.auth.data.instanceUrl) { + requestConfig.baseURL = $.auth.data.instanceUrl; + } else if ($.app.apiBaseUrl) { + requestConfig.baseURL = $.app.apiBaseUrl; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/gitlab/common/set-base-url.ts b/packages/backend/src/apps/gitlab/common/set-base-url.ts deleted file mode 100644 index 8aef4b23..00000000 --- a/packages/backend/src/apps/gitlab/common/set-base-url.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data.instanceUrl) { - requestConfig.baseURL = $.auth.data.instanceUrl as string; - } else if ($.app.apiBaseUrl) { - requestConfig.baseURL = $.app.apiBaseUrl as string; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/gitlab/dynamic-data/index.js b/packages/backend/src/apps/gitlab/dynamic-data/index.js new file mode 100644 index 00000000..ed07bb05 --- /dev/null +++ b/packages/backend/src/apps/gitlab/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listProjects from './list-projects/index.js'; + +export default [listProjects]; diff --git a/packages/backend/src/apps/gitlab/dynamic-data/index.ts b/packages/backend/src/apps/gitlab/dynamic-data/index.ts deleted file mode 100644 index 27787b4b..00000000 --- a/packages/backend/src/apps/gitlab/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listProjects from './list-projects'; - -export default [listProjects]; diff --git a/packages/backend/src/apps/gitlab/dynamic-data/list-projects/index.ts b/packages/backend/src/apps/gitlab/dynamic-data/list-projects/index.js similarity index 73% rename from packages/backend/src/apps/gitlab/dynamic-data/list-projects/index.ts rename to packages/backend/src/apps/gitlab/dynamic-data/list-projects/index.js index 850a6860..522f7adf 100644 --- a/packages/backend/src/apps/gitlab/dynamic-data/list-projects/index.ts +++ b/packages/backend/src/apps/gitlab/dynamic-data/list-projects/index.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; -import paginateAll from '../../common/paginate-all'; +import paginateAll from '../../common/paginate-all.js'; export default { name: 'List projects', key: 'listProjects', - async run($: IGlobalVariable) { + async run($) { // ref: // - https://docs.gitlab.com/ee/api/projects.html#list-all-projects // - https://docs.gitlab.com/ee/api/rest/index.html#keyset-based-pagination @@ -21,7 +20,7 @@ export default { const response = await paginateAll($, firstPageRequest); - response.data = response.data.map((repo: { name: string; id: number }) => { + response.data = response.data.map((repo) => { return { value: repo.id, name: repo.name, diff --git a/packages/backend/src/apps/gitlab/index.d.ts b/packages/backend/src/apps/gitlab/index.d.ts deleted file mode 100644 index 8b137891..00000000 --- a/packages/backend/src/apps/gitlab/index.d.ts +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/backend/src/apps/gitlab/index.ts b/packages/backend/src/apps/gitlab/index.js similarity index 57% rename from packages/backend/src/apps/gitlab/index.ts rename to packages/backend/src/apps/gitlab/index.js index 81db8389..725f1a1a 100644 --- a/packages/backend/src/apps/gitlab/index.ts +++ b/packages/backend/src/apps/gitlab/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import setBaseUrl from './common/set-base-url'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import setBaseUrl from './common/set-base-url.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'GitLab', diff --git a/packages/backend/src/apps/gitlab/triggers/confidential-issue-event/index.ts b/packages/backend/src/apps/gitlab/triggers/confidential-issue-event/index.js similarity index 75% rename from packages/backend/src/apps/gitlab/triggers/confidential-issue-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/confidential-issue-event/index.js index 72dc6ccc..ec94b320 100644 --- a/packages/backend/src/apps/gitlab/triggers/confidential-issue-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/confidential-issue-event/index.js @@ -1,18 +1,17 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; // confidential_issues_events has the same event data as issues_events -import data from './issue_event'; +import data from './issue_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Confidential issue event', description: 'Confidential issue event (triggered when a new confidential issue is created or an existing issue is updated, closed, or reopened)', diff --git a/packages/backend/src/apps/gitlab/triggers/confidential-issue-event/issue_event.ts b/packages/backend/src/apps/gitlab/triggers/confidential-issue-event/issue_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/confidential-issue-event/issue_event.ts rename to packages/backend/src/apps/gitlab/triggers/confidential-issue-event/issue_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/confidential-note-event/index.ts b/packages/backend/src/apps/gitlab/triggers/confidential-note-event/index.js similarity index 75% rename from packages/backend/src/apps/gitlab/triggers/confidential-note-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/confidential-note-event/index.js index 5f37bb7e..4e4fbd9d 100644 --- a/packages/backend/src/apps/gitlab/triggers/confidential-note-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/confidential-note-event/index.js @@ -1,18 +1,17 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; // confidential_note_events has the same event data as note_events -import data from './note_event'; +import data from './note_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Confidential comment event', description: 'Confidential comment event (triggered when a new confidential comment is made on commits, merge requests, issues, and code snippets)', diff --git a/packages/backend/src/apps/gitlab/triggers/confidential-note-event/note_event.ts b/packages/backend/src/apps/gitlab/triggers/confidential-note-event/note_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/confidential-note-event/note_event.ts rename to packages/backend/src/apps/gitlab/triggers/confidential-note-event/note_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/deployment-event/deployment_event.ts b/packages/backend/src/apps/gitlab/triggers/deployment-event/deployment_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/deployment-event/deployment_event.ts rename to packages/backend/src/apps/gitlab/triggers/deployment-event/deployment_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/deployment-event/index.ts b/packages/backend/src/apps/gitlab/triggers/deployment-event/index.js similarity index 71% rename from packages/backend/src/apps/gitlab/triggers/deployment-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/deployment-event/index.js index 8a5c3ef8..ecf122c3 100644 --- a/packages/backend/src/apps/gitlab/triggers/deployment-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/deployment-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './deployment_event'; +import data from './deployment_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Deployment event', description: 'Deployment event (triggered when a deployment starts, succeeds, fails or is canceled)', diff --git a/packages/backend/src/apps/gitlab/triggers/feature-flag-event/feature_flag_event.ts b/packages/backend/src/apps/gitlab/triggers/feature-flag-event/feature_flag_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/feature-flag-event/feature_flag_event.ts rename to packages/backend/src/apps/gitlab/triggers/feature-flag-event/feature_flag_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/feature-flag-event/index.ts b/packages/backend/src/apps/gitlab/triggers/feature-flag-event/index.js similarity index 70% rename from packages/backend/src/apps/gitlab/triggers/feature-flag-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/feature-flag-event/index.js index 61b1f199..5c2ea037 100644 --- a/packages/backend/src/apps/gitlab/triggers/feature-flag-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/feature-flag-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './feature_flag_event'; +import data from './feature_flag_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Feature flag event', description: 'Feature flag event (triggered when a feature flag is turned on or off)', diff --git a/packages/backend/src/apps/gitlab/triggers/index.js b/packages/backend/src/apps/gitlab/triggers/index.js new file mode 100644 index 00000000..18ffd7d5 --- /dev/null +++ b/packages/backend/src/apps/gitlab/triggers/index.js @@ -0,0 +1,29 @@ +import confidentialIssueEvent from './confidential-issue-event/index.js'; +import confidentialNoteEvent from './confidential-note-event/index.js'; +import deploymentEvent from './deployment-event/index.js'; +import featureFlagEvent from './feature-flag-event/index.js'; +import issueEvent from './issue-event/index.js'; +import jobEvent from './job-event/index.js'; +import mergeRequestEvent from './merge-request-event/index.js'; +import noteEvent from './note-event/index.js'; +import pipelineEvent from './pipeline-event/index.js'; +import pushEvent from './push-event/index.js'; +import releaseEvent from './release-event/index.js'; +import tagPushEvent from './tag-push-event/index.js'; +import wikiPageEvent from './wiki-page-event/index.js'; + +export default [ + confidentialIssueEvent, + confidentialNoteEvent, + deploymentEvent, + featureFlagEvent, + issueEvent, + jobEvent, + mergeRequestEvent, + noteEvent, + pipelineEvent, + pushEvent, + releaseEvent, + tagPushEvent, + wikiPageEvent, +]; diff --git a/packages/backend/src/apps/gitlab/triggers/index.ts b/packages/backend/src/apps/gitlab/triggers/index.ts deleted file mode 100644 index f8621d3b..00000000 --- a/packages/backend/src/apps/gitlab/triggers/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import confidentialIssueEvent from './confidential-issue-event'; -import confidentialNoteEvent from './confidential-note-event'; -import deploymentEvent from './deployment-event'; -import featureFlagEvent from './feature-flag-event'; -import issueEvent from './issue-event'; -import jobEvent from './job-event'; -import mergeRequestEvent from './merge-request-event'; -import noteEvent from './note-event'; -import pipelineEvent from './pipeline-event'; -import pushEvent from './push-event'; -import releaseEvent from './release-event'; -import tagPushEvent from './tag-push-event'; -import wikiPageEvent from './wiki-page-event'; - -export default [ - confidentialIssueEvent, - confidentialNoteEvent, - deploymentEvent, - featureFlagEvent, - issueEvent, - jobEvent, - mergeRequestEvent, - noteEvent, - pipelineEvent, - pushEvent, - releaseEvent, - tagPushEvent, - wikiPageEvent, -]; diff --git a/packages/backend/src/apps/gitlab/triggers/issue-event/index.ts b/packages/backend/src/apps/gitlab/triggers/issue-event/index.js similarity index 71% rename from packages/backend/src/apps/gitlab/triggers/issue-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/issue-event/index.js index 9a9c069b..a273df9b 100644 --- a/packages/backend/src/apps/gitlab/triggers/issue-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/issue-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './issue_event'; +import data from './issue_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Issue event', description: 'Issue event (triggered when a new issue is created or an existing issue is updated, closed, or reopened)', diff --git a/packages/backend/src/apps/gitlab/triggers/issue-event/issue_event.ts b/packages/backend/src/apps/gitlab/triggers/issue-event/issue_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/issue-event/issue_event.ts rename to packages/backend/src/apps/gitlab/triggers/issue-event/issue_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/job-event/index.ts b/packages/backend/src/apps/gitlab/triggers/job-event/index.js similarity index 69% rename from packages/backend/src/apps/gitlab/triggers/job-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/job-event/index.js index 7150d247..f7c4f5af 100644 --- a/packages/backend/src/apps/gitlab/triggers/job-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/job-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './job_event'; +import data from './job_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Job event', description: 'Job event (triggered when the status of a job changes)', // info: 'https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#job-events', diff --git a/packages/backend/src/apps/gitlab/triggers/job-event/job_event.ts b/packages/backend/src/apps/gitlab/triggers/job-event/job_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/job-event/job_event.ts rename to packages/backend/src/apps/gitlab/triggers/job-event/job_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/lib.js b/packages/backend/src/apps/gitlab/triggers/lib.js new file mode 100644 index 00000000..1203722e --- /dev/null +++ b/packages/backend/src/apps/gitlab/triggers/lib.js @@ -0,0 +1,94 @@ +import Crypto from 'crypto'; +import appConfig from '../../../config/app.js'; + +export const projectArgumentDescriptor = { + label: 'Project', + key: 'projectId', + type: 'dropdown', + required: true, + description: 'Pick a project to receive events from', + variables: false, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listProjects', + }, + ], + }, +}; + +export const getRunFn = async ($) => { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); +}; + +export const getTestRunFn = (eventData) => ($) => { + /* + Not fetching actual events from gitlab and using static event data from documentation + as there is no way to filter out events of one category using gitlab event types, + filtering is very limited and uses different grouping than what is applicable when creating a webhook. + + ref: + - https://docs.gitlab.com/ee/api/events.html#target-types + - https://docs.gitlab.com/ee/api/projects.html#add-project-hook + */ + + if (!eventData) { + return; + } + + const dataItem = { + raw: eventData, + meta: { + // there is no distinct id on gitlab event object thus creating it + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + + return Promise.resolve(); +}; + +export const getRegisterHookFn = (eventType) => async ($) => { + // ref: https://docs.gitlab.com/ee/api/projects.html#add-project-hook + + const subscriptionPayload = { + url: $.webhookUrl, + token: appConfig.webhookSecretKey, + enable_ssl_verification: true, + [eventType]: true, + }; + + if ( + ['wildcard', 'regex'].includes($.step.parameters.branch_filter_strategy) + ) { + subscriptionPayload.branch_filter_strategy = + $.step.parameters.branch_filter_strategy; + subscriptionPayload.push_events_branch_filter = + $.step.parameters.push_events_branch_filter; + } + + const { data } = await $.http.post( + `/api/v4/projects/${$.step.parameters.projectId}/hooks`, + subscriptionPayload + ); + + await $.flow.setRemoteWebhookId(data.id.toString()); +}; + +export const unregisterHook = async ($) => { + // ref: https://docs.gitlab.com/ee/api/projects.html#delete-project-hook + await $.http.delete( + `/api/v4/projects/${$.step.parameters.projectId}/hooks/${$.flow.remoteWebhookId}` + ); +}; diff --git a/packages/backend/src/apps/gitlab/triggers/lib.ts b/packages/backend/src/apps/gitlab/triggers/lib.ts deleted file mode 100644 index 29041908..00000000 --- a/packages/backend/src/apps/gitlab/triggers/lib.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import Crypto from 'crypto'; -import { GITLAB_EVENT_TYPE } from './types'; -import appConfig from '../../../config/app'; - -export const projectArgumentDescriptor = { - label: 'Project', - key: 'projectId', - type: 'dropdown' as const, - required: true, - description: 'Pick a project to receive events from', - variables: false, - source: { - type: 'query', - name: 'getDynamicData', - arguments: [ - { - name: 'key', - value: 'listProjects', - }, - ], - }, -}; - -export const getRunFn = async ($: IGlobalVariable) => { - const dataItem = { - raw: $.request.body, - meta: { - internalId: Crypto.randomUUID(), - }, - }; - - $.pushTriggerItem(dataItem); -}; - -export const getTestRunFn = - (eventData: IJSONObject) => ($: IGlobalVariable) => { - /* - Not fetching actual events from gitlab and using static event data from documentation - as there is no way to filter out events of one category using gitlab event types, - filtering is very limited and uses different grouping than what is applicable when creating a webhook. - - ref: - - https://docs.gitlab.com/ee/api/events.html#target-types - - https://docs.gitlab.com/ee/api/projects.html#add-project-hook - */ - - if (!eventData) { - return; - } - - const dataItem = { - raw: eventData, - meta: { - // there is no distinct id on gitlab event object thus creating it - internalId: Crypto.randomUUID(), - }, - }; - - $.pushTriggerItem(dataItem); - - return Promise.resolve(); - }; - -export const getRegisterHookFn = - (eventType: GITLAB_EVENT_TYPE) => async ($: IGlobalVariable) => { - // ref: https://docs.gitlab.com/ee/api/projects.html#add-project-hook - - const subscriptionPayload = { - url: $.webhookUrl, - token: appConfig.webhookSecretKey, - enable_ssl_verification: true, - [eventType]: true, - }; - - if ( - ['wildcard', 'regex'].includes( - $.step.parameters.branch_filter_strategy as string - ) - ) { - subscriptionPayload.branch_filter_strategy = $.step.parameters - .branch_filter_strategy as string; - subscriptionPayload.push_events_branch_filter = $.step.parameters - .push_events_branch_filter as string; - } - - const { data } = await $.http.post( - `/api/v4/projects/${$.step.parameters.projectId}/hooks`, - subscriptionPayload - ); - - await $.flow.setRemoteWebhookId(data.id.toString()); - }; - -export const unregisterHook = async ($: IGlobalVariable) => { - // ref: https://docs.gitlab.com/ee/api/projects.html#delete-project-hook - await $.http.delete( - `/api/v4/projects/${$.step.parameters.projectId}/hooks/${$.flow.remoteWebhookId}` - ); -}; diff --git a/packages/backend/src/apps/gitlab/triggers/merge-request-event/index.ts b/packages/backend/src/apps/gitlab/triggers/merge-request-event/index.js similarity index 71% rename from packages/backend/src/apps/gitlab/triggers/merge-request-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/merge-request-event/index.js index a841ec38..c3ec583d 100644 --- a/packages/backend/src/apps/gitlab/triggers/merge-request-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/merge-request-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './merge_request_event'; +import data from './merge_request_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Merge request event', description: 'Merge request event (triggered when merge request is created, updated, or closed)', diff --git a/packages/backend/src/apps/gitlab/triggers/merge-request-event/merge_request_event.ts b/packages/backend/src/apps/gitlab/triggers/merge-request-event/merge_request_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/merge-request-event/merge_request_event.ts rename to packages/backend/src/apps/gitlab/triggers/merge-request-event/merge_request_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/note-event/index.ts b/packages/backend/src/apps/gitlab/triggers/note-event/index.js similarity index 71% rename from packages/backend/src/apps/gitlab/triggers/note-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/note-event/index.js index 21d68b46..a74490a6 100644 --- a/packages/backend/src/apps/gitlab/triggers/note-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/note-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './note_event'; +import data from './note_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Comment event', description: 'Comment event (triggered when a new comment is made on commits, merge requests, issues, and code snippets)', diff --git a/packages/backend/src/apps/gitlab/triggers/note-event/note_event.ts b/packages/backend/src/apps/gitlab/triggers/note-event/note_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/note-event/note_event.ts rename to packages/backend/src/apps/gitlab/triggers/note-event/note_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/pipeline-event/index.ts b/packages/backend/src/apps/gitlab/triggers/pipeline-event/index.js similarity index 70% rename from packages/backend/src/apps/gitlab/triggers/pipeline-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/pipeline-event/index.js index 10b42739..216ddc5b 100644 --- a/packages/backend/src/apps/gitlab/triggers/pipeline-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/pipeline-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './pipeline_event'; +import data from './pipeline_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Pipeline event', description: 'Pipeline event (triggered when the status of a pipeline changes)', diff --git a/packages/backend/src/apps/gitlab/triggers/pipeline-event/pipeline_event.ts b/packages/backend/src/apps/gitlab/triggers/pipeline-event/pipeline_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/pipeline-event/pipeline_event.ts rename to packages/backend/src/apps/gitlab/triggers/pipeline-event/pipeline_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/push-event/index.ts b/packages/backend/src/apps/gitlab/triggers/push-event/index.js similarity index 82% rename from packages/backend/src/apps/gitlab/triggers/push-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/push-event/index.js index 11532a33..83d3339f 100644 --- a/packages/backend/src/apps/gitlab/triggers/push-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/push-event/index.js @@ -1,20 +1,19 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './push_event'; +import data from './push_event.js'; export const branchFilterStrategyArgumentDescriptor = { label: 'What type of filter to use?', key: 'branch_filter_strategy', - type: 'dropdown' as const, + type: 'dropdown', description: 'Defaults to including all branches', required: true, variables: false, @@ -39,12 +38,12 @@ export const pushEventsBranchFilterArgumentDescriptor = { label: 'Filter value', key: 'push_events_branch_filter', description: 'Leave empty when using "all branches"', - type: 'string' as const, + type: 'string', required: false, variables: false, }; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Push event', description: 'Push event (triggered when you push to the repository)', // info: 'https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#push-events', diff --git a/packages/backend/src/apps/gitlab/triggers/push-event/push_event.ts b/packages/backend/src/apps/gitlab/triggers/push-event/push_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/push-event/push_event.ts rename to packages/backend/src/apps/gitlab/triggers/push-event/push_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/release-event/index.ts b/packages/backend/src/apps/gitlab/triggers/release-event/index.js similarity index 70% rename from packages/backend/src/apps/gitlab/triggers/release-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/release-event/index.js index 718bc7e8..87e7c85c 100644 --- a/packages/backend/src/apps/gitlab/triggers/release-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/release-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './release_event'; +import data from './release_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Release event', description: 'Release event (triggered when a release is created or updated)', // info: 'https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#release-events', diff --git a/packages/backend/src/apps/gitlab/triggers/release-event/release_event.ts b/packages/backend/src/apps/gitlab/triggers/release-event/release_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/release-event/release_event.ts rename to packages/backend/src/apps/gitlab/triggers/release-event/release_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/tag-push-event/index.ts b/packages/backend/src/apps/gitlab/triggers/tag-push-event/index.js similarity index 70% rename from packages/backend/src/apps/gitlab/triggers/tag-push-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/tag-push-event/index.js index 556bc591..a64dfb33 100644 --- a/packages/backend/src/apps/gitlab/triggers/tag-push-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/tag-push-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './tag_push_event'; +import data from './tag_push_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Tag event', description: 'Tag event (triggered when you create or delete tags in the repository)', diff --git a/packages/backend/src/apps/gitlab/triggers/tag-push-event/tag_push_event.ts b/packages/backend/src/apps/gitlab/triggers/tag-push-event/tag_push_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/tag-push-event/tag_push_event.ts rename to packages/backend/src/apps/gitlab/triggers/tag-push-event/tag_push_event.js diff --git a/packages/backend/src/apps/gitlab/triggers/types.js b/packages/backend/src/apps/gitlab/triggers/types.js new file mode 100644 index 00000000..cadc42e1 --- /dev/null +++ b/packages/backend/src/apps/gitlab/triggers/types.js @@ -0,0 +1,15 @@ +export const GITLAB_EVENT_TYPE = { + confidential_issues_events: 'confidential_issues_events', + confidential_note_events: 'confidential_note_events', + deployment_events: 'deployment_events', + feature_flag_events: 'feature_flag_events', + issues_events: 'issues_events', + job_events: 'job_events', + merge_requests_events: 'merge_requests_events', + note_events: 'note_events', + pipeline_events: 'pipeline_events', + push_events: 'push_events', + releases_events: 'releases_events', + tag_push_events: 'tag_push_events', + wiki_page_events: 'wiki_page_events', +}; diff --git a/packages/backend/src/apps/gitlab/triggers/types.ts b/packages/backend/src/apps/gitlab/triggers/types.ts deleted file mode 100644 index 38456fd0..00000000 --- a/packages/backend/src/apps/gitlab/triggers/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -export enum GITLAB_EVENT_TYPE { - // ref: https://docs.gitlab.com/ee/api/projects.html#add-project-hook - confidential_issues_events = 'confidential_issues_events', - confidential_note_events = 'confidential_note_events', - deployment_events = 'deployment_events', - feature_flag_events = 'feature_flag_events', - issues_events = 'issues_events', - job_events = 'job_events', - merge_requests_events = 'merge_requests_events', - note_events = 'note_events', - pipeline_events = 'pipeline_events', - push_events = 'push_events', - releases_events = 'releases_events', - tag_push_events = 'tag_push_events', - wiki_page_events = 'wiki_page_events', -} - -export type EventDescriptor = { - name: string; - description: string; - info?: string; - type: GITLAB_EVENT_TYPE; - data: any; -}; diff --git a/packages/backend/src/apps/gitlab/triggers/wiki-page-event/index.ts b/packages/backend/src/apps/gitlab/triggers/wiki-page-event/index.js similarity index 70% rename from packages/backend/src/apps/gitlab/triggers/wiki-page-event/index.ts rename to packages/backend/src/apps/gitlab/triggers/wiki-page-event/index.js index f2f0f3a3..e92f8caf 100644 --- a/packages/backend/src/apps/gitlab/triggers/wiki-page-event/index.ts +++ b/packages/backend/src/apps/gitlab/triggers/wiki-page-event/index.js @@ -1,17 +1,16 @@ -import { IRawTrigger } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import { GITLAB_EVENT_TYPE } from '../types'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { GITLAB_EVENT_TYPE } from '../types.js'; import { getRegisterHookFn, getRunFn, getTestRunFn, projectArgumentDescriptor, unregisterHook, -} from '../lib'; +} from '../lib.js'; -import data from './wiki_page_event'; +import data from './wiki_page_event.js'; -export const triggerDescriptor: IRawTrigger = { +export const triggerDescriptor = { name: 'Wiki page event', description: 'Wiki page event (triggered when a wiki page is created, updated, or deleted)', diff --git a/packages/backend/src/apps/gitlab/triggers/wiki-page-event/wiki_page_event.ts b/packages/backend/src/apps/gitlab/triggers/wiki-page-event/wiki_page_event.js similarity index 100% rename from packages/backend/src/apps/gitlab/triggers/wiki-page-event/wiki_page_event.ts rename to packages/backend/src/apps/gitlab/triggers/wiki-page-event/wiki_page_event.js diff --git a/packages/backend/src/apps/google-drive/auth/generate-auth-url.ts b/packages/backend/src/apps/google-calendar/auth/generate-auth-url.js similarity index 55% rename from packages/backend/src/apps/google-drive/auth/generate-auth-url.ts rename to packages/backend/src/apps/google-calendar/auth/generate-auth-url.js index ea89f8a4..c972ae16 100644 --- a/packages/backend/src/apps/google-drive/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/google-calendar/auth/generate-auth-url.js @@ -1,14 +1,13 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, prompt: 'select_account', scope: authScope.join(' '), diff --git a/packages/backend/src/apps/google-calendar/auth/index.ts b/packages/backend/src/apps/google-calendar/auth/index.js similarity index 74% rename from packages/backend/src/apps/google-calendar/auth/index.ts rename to packages/backend/src/apps/google-calendar/auth/index.js index 80d63f90..a481e43e 100644 --- a/packages/backend/src/apps/google-calendar/auth/index.ts +++ b/packages/backend/src/apps/google-calendar/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/google-calendar/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/google-calendar/auth/is-still-verified.js b/packages/backend/src/apps/google-calendar/auth/is-still-verified.js new file mode 100644 index 00000000..68f4d7db --- /dev/null +++ b/packages/backend/src/apps/google-calendar/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.resourceName; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/google-calendar/auth/is-still-verified.ts b/packages/backend/src/apps/google-calendar/auth/is-still-verified.ts deleted file mode 100644 index c46fa18b..00000000 --- a/packages/backend/src/apps/google-calendar/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.resourceName; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/google-sheets/auth/refresh-token.ts b/packages/backend/src/apps/google-calendar/auth/refresh-token.js similarity index 57% rename from packages/backend/src/apps/google-sheets/auth/refresh-token.ts rename to packages/backend/src/apps/google-calendar/auth/refresh-token.js index 17d0c4cc..7c5b7020 100644 --- a/packages/backend/src/apps/google-sheets/auth/refresh-token.ts +++ b/packages/backend/src/apps/google-calendar/auth/refresh-token.js @@ -1,13 +1,13 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import authScope from '../common/auth-scope'; -const refreshToken = async ($: IGlobalVariable) => { +import authScope from '../common/auth-scope.js'; + +const refreshToken = async ($) => { const params = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/google-forms/auth/verify-credentials.ts b/packages/backend/src/apps/google-calendar/auth/verify-credentials.js similarity index 62% rename from packages/backend/src/apps/google-forms/auth/verify-credentials.ts rename to packages/backend/src/apps/google-calendar/auth/verify-credentials.js index 124e73c1..a636b72c 100644 --- a/packages/backend/src/apps/google-forms/auth/verify-credentials.ts +++ b/packages/backend/src/apps/google-calendar/auth/verify-credentials.js @@ -1,25 +1,10 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -type TUser = { - displayName: string; - metadata: { - primary: boolean; - }; -}; - -type TEmailAddress = { - value: string; - metadata: { - primary: boolean; - }; -}; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { client_id: $.auth.data.clientId, client_secret: $.auth.data.clientSecret, @@ -36,10 +21,10 @@ const verifyCredentials = async ($: IGlobalVariable) => { const currentUser = await getCurrentUser($); const { displayName } = currentUser.names.find( - (name: TUser) => name.metadata.primary + (name) => name.metadata.primary ); const { value: email } = currentUser.emailAddresses.find( - (emailAddress: TEmailAddress) => emailAddress.metadata.primary + (emailAddress) => emailAddress.metadata.primary ); await $.auth.set({ diff --git a/packages/backend/src/apps/google-drive/common/add-auth-header.ts b/packages/backend/src/apps/google-calendar/common/add-auth-header.js similarity index 62% rename from packages/backend/src/apps/google-drive/common/add-auth-header.ts rename to packages/backend/src/apps/google-calendar/common/add-auth-header.js index 8e7798b8..02477aa4 100644 --- a/packages/backend/src/apps/google-drive/common/add-auth-header.ts +++ b/packages/backend/src/apps/google-calendar/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/google-calendar/common/auth-scope.ts b/packages/backend/src/apps/google-calendar/common/auth-scope.js similarity index 85% rename from packages/backend/src/apps/google-calendar/common/auth-scope.ts rename to packages/backend/src/apps/google-calendar/common/auth-scope.js index e3625b0d..421c26f4 100644 --- a/packages/backend/src/apps/google-calendar/common/auth-scope.ts +++ b/packages/backend/src/apps/google-calendar/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile', diff --git a/packages/backend/src/apps/google-forms/common/get-current-user.ts b/packages/backend/src/apps/google-calendar/common/get-current-user.js similarity index 63% rename from packages/backend/src/apps/google-forms/common/get-current-user.ts rename to packages/backend/src/apps/google-calendar/common/get-current-user.js index 724fe1ac..2663ad20 100644 --- a/packages/backend/src/apps/google-forms/common/get-current-user.ts +++ b/packages/backend/src/apps/google-calendar/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data: currentUser } = await $.http.get( 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' ); diff --git a/packages/backend/src/apps/google-calendar/dynamic-data/index.js b/packages/backend/src/apps/google-calendar/dynamic-data/index.js new file mode 100644 index 00000000..2cf6ba7d --- /dev/null +++ b/packages/backend/src/apps/google-calendar/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listCalendars from './list-calendars/index.js'; + +export default [listCalendars]; diff --git a/packages/backend/src/apps/google-calendar/dynamic-data/index.ts b/packages/backend/src/apps/google-calendar/dynamic-data/index.ts deleted file mode 100644 index ef8fc43a..00000000 --- a/packages/backend/src/apps/google-calendar/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listCalendars from './list-calendars'; - -export default [listCalendars]; diff --git a/packages/backend/src/apps/google-calendar/dynamic-data/list-calendars/index.ts b/packages/backend/src/apps/google-calendar/dynamic-data/list-calendars/index.js similarity index 71% rename from packages/backend/src/apps/google-calendar/dynamic-data/list-calendars/index.ts rename to packages/backend/src/apps/google-calendar/dynamic-data/list-calendars/index.js index 160c3935..afed03f1 100644 --- a/packages/backend/src/apps/google-calendar/dynamic-data/list-calendars/index.ts +++ b/packages/backend/src/apps/google-calendar/dynamic-data/list-calendars/index.js @@ -1,18 +1,14 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List calendars', key: 'listCalendars', - async run($: IGlobalVariable) { - const drives: { - data: IJSONObject[]; - } = { + async run($) { + const drives = { data: [], }; const params = { - pageToken: undefined as unknown as string, + pageToken: undefined, }; do { diff --git a/packages/backend/src/apps/google-calendar/index.d.ts b/packages/backend/src/apps/google-calendar/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/google-calendar/index.ts b/packages/backend/src/apps/google-calendar/index.js similarity index 64% rename from packages/backend/src/apps/google-calendar/index.ts rename to packages/backend/src/apps/google-calendar/index.js index 8192820c..3677a56f 100644 --- a/packages/backend/src/apps/google-calendar/index.ts +++ b/packages/backend/src/apps/google-calendar/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Google Calendar', diff --git a/packages/backend/src/apps/google-calendar/triggers/index.js b/packages/backend/src/apps/google-calendar/triggers/index.js new file mode 100644 index 00000000..bb510663 --- /dev/null +++ b/packages/backend/src/apps/google-calendar/triggers/index.js @@ -0,0 +1,4 @@ +import newCalendar from './new-calendar/index.js'; +import newEvent from './new-event/index.js'; + +export default [newCalendar, newEvent]; diff --git a/packages/backend/src/apps/google-calendar/triggers/index.ts b/packages/backend/src/apps/google-calendar/triggers/index.ts deleted file mode 100644 index 97a3b6f7..00000000 --- a/packages/backend/src/apps/google-calendar/triggers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import newCalendar from './new-calendar'; -import newEvent from './new-event'; - -export default [newCalendar, newEvent]; diff --git a/packages/backend/src/apps/google-calendar/triggers/new-calendar/index.ts b/packages/backend/src/apps/google-calendar/triggers/new-calendar/index.js similarity index 80% rename from packages/backend/src/apps/google-calendar/triggers/new-calendar/index.ts rename to packages/backend/src/apps/google-calendar/triggers/new-calendar/index.js index 421c6cb3..53ea7314 100644 --- a/packages/backend/src/apps/google-calendar/triggers/new-calendar/index.ts +++ b/packages/backend/src/apps/google-calendar/triggers/new-calendar/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New calendar', @@ -8,8 +8,8 @@ export default defineTrigger({ arguments: [], async run($) { - const params: Record = { - pageToken: undefined as unknown as string, + const params = { + pageToken: undefined, maxResults: 250, }; diff --git a/packages/backend/src/apps/google-calendar/triggers/new-event/index.ts b/packages/backend/src/apps/google-calendar/triggers/new-event/index.js similarity index 84% rename from packages/backend/src/apps/google-calendar/triggers/new-event/index.ts rename to packages/backend/src/apps/google-calendar/triggers/new-event/index.js index 2856cec0..1c012191 100644 --- a/packages/backend/src/apps/google-calendar/triggers/new-event/index.ts +++ b/packages/backend/src/apps/google-calendar/triggers/new-event/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New event', @@ -9,7 +9,7 @@ export default defineTrigger({ { label: 'Calendar', key: 'calendarId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: '', variables: false, @@ -29,8 +29,8 @@ export default defineTrigger({ async run($) { const calendarId = $.step.parameters.calendarId; - const params: Record = { - pageToken: undefined as unknown as string, + const params = { + pageToken: undefined, orderBy: 'updated', }; diff --git a/packages/backend/src/apps/google-forms/auth/generate-auth-url.ts b/packages/backend/src/apps/google-drive/auth/generate-auth-url.js similarity index 55% rename from packages/backend/src/apps/google-forms/auth/generate-auth-url.ts rename to packages/backend/src/apps/google-drive/auth/generate-auth-url.js index ea89f8a4..c972ae16 100644 --- a/packages/backend/src/apps/google-forms/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/google-drive/auth/generate-auth-url.js @@ -1,14 +1,13 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, prompt: 'select_account', scope: authScope.join(' '), diff --git a/packages/backend/src/apps/google-drive/auth/index.ts b/packages/backend/src/apps/google-drive/auth/index.js similarity index 74% rename from packages/backend/src/apps/google-drive/auth/index.ts rename to packages/backend/src/apps/google-drive/auth/index.js index 8d826632..9dd54714 100644 --- a/packages/backend/src/apps/google-drive/auth/index.ts +++ b/packages/backend/src/apps/google-drive/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/google-drive/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/google-drive/auth/is-still-verified.js b/packages/backend/src/apps/google-drive/auth/is-still-verified.js new file mode 100644 index 00000000..68f4d7db --- /dev/null +++ b/packages/backend/src/apps/google-drive/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.resourceName; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/google-drive/auth/is-still-verified.ts b/packages/backend/src/apps/google-drive/auth/is-still-verified.ts deleted file mode 100644 index c46fa18b..00000000 --- a/packages/backend/src/apps/google-drive/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.resourceName; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/google-calendar/auth/refresh-token.ts b/packages/backend/src/apps/google-drive/auth/refresh-token.js similarity index 57% rename from packages/backend/src/apps/google-calendar/auth/refresh-token.ts rename to packages/backend/src/apps/google-drive/auth/refresh-token.js index 17d0c4cc..7c5b7020 100644 --- a/packages/backend/src/apps/google-calendar/auth/refresh-token.ts +++ b/packages/backend/src/apps/google-drive/auth/refresh-token.js @@ -1,13 +1,13 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import authScope from '../common/auth-scope'; -const refreshToken = async ($: IGlobalVariable) => { +import authScope from '../common/auth-scope.js'; + +const refreshToken = async ($) => { const params = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/google-sheets/auth/verify-credentials.ts b/packages/backend/src/apps/google-drive/auth/verify-credentials.js similarity index 62% rename from packages/backend/src/apps/google-sheets/auth/verify-credentials.ts rename to packages/backend/src/apps/google-drive/auth/verify-credentials.js index 124e73c1..a636b72c 100644 --- a/packages/backend/src/apps/google-sheets/auth/verify-credentials.ts +++ b/packages/backend/src/apps/google-drive/auth/verify-credentials.js @@ -1,25 +1,10 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -type TUser = { - displayName: string; - metadata: { - primary: boolean; - }; -}; - -type TEmailAddress = { - value: string; - metadata: { - primary: boolean; - }; -}; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { client_id: $.auth.data.clientId, client_secret: $.auth.data.clientSecret, @@ -36,10 +21,10 @@ const verifyCredentials = async ($: IGlobalVariable) => { const currentUser = await getCurrentUser($); const { displayName } = currentUser.names.find( - (name: TUser) => name.metadata.primary + (name) => name.metadata.primary ); const { value: email } = currentUser.emailAddresses.find( - (emailAddress: TEmailAddress) => emailAddress.metadata.primary + (emailAddress) => emailAddress.metadata.primary ); await $.auth.set({ diff --git a/packages/backend/src/apps/google-sheets/common/add-auth-header.ts b/packages/backend/src/apps/google-drive/common/add-auth-header.js similarity index 62% rename from packages/backend/src/apps/google-sheets/common/add-auth-header.ts rename to packages/backend/src/apps/google-drive/common/add-auth-header.js index 8e7798b8..02477aa4 100644 --- a/packages/backend/src/apps/google-sheets/common/add-auth-header.ts +++ b/packages/backend/src/apps/google-drive/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/google-drive/common/auth-scope.ts b/packages/backend/src/apps/google-drive/common/auth-scope.js similarity index 85% rename from packages/backend/src/apps/google-drive/common/auth-scope.ts rename to packages/backend/src/apps/google-drive/common/auth-scope.js index 059f38ea..5bd60537 100644 --- a/packages/backend/src/apps/google-drive/common/auth-scope.ts +++ b/packages/backend/src/apps/google-drive/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile', diff --git a/packages/backend/src/apps/google-calendar/common/get-current-user.ts b/packages/backend/src/apps/google-drive/common/get-current-user.js similarity index 63% rename from packages/backend/src/apps/google-calendar/common/get-current-user.ts rename to packages/backend/src/apps/google-drive/common/get-current-user.js index 724fe1ac..2663ad20 100644 --- a/packages/backend/src/apps/google-calendar/common/get-current-user.ts +++ b/packages/backend/src/apps/google-drive/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data: currentUser } = await $.http.get( 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' ); diff --git a/packages/backend/src/apps/google-drive/dynamic-data/index.js b/packages/backend/src/apps/google-drive/dynamic-data/index.js new file mode 100644 index 00000000..96e1d644 --- /dev/null +++ b/packages/backend/src/apps/google-drive/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listFolders from './list-folders/index.js'; +import listDrives from './list-drives/index.js'; + +export default [listFolders, listDrives]; diff --git a/packages/backend/src/apps/google-drive/dynamic-data/index.ts b/packages/backend/src/apps/google-drive/dynamic-data/index.ts deleted file mode 100644 index 83c7291d..00000000 --- a/packages/backend/src/apps/google-drive/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listFolders from './list-folders'; -import listDrives from './list-drives'; - -export default [listFolders, listDrives]; diff --git a/packages/backend/src/apps/google-drive/dynamic-data/list-drives/index.ts b/packages/backend/src/apps/google-drive/dynamic-data/list-drives/index.js similarity index 72% rename from packages/backend/src/apps/google-drive/dynamic-data/list-drives/index.ts rename to packages/backend/src/apps/google-drive/dynamic-data/list-drives/index.js index 4193dacd..2454433d 100644 --- a/packages/backend/src/apps/google-drive/dynamic-data/list-drives/index.ts +++ b/packages/backend/src/apps/google-drive/dynamic-data/list-drives/index.js @@ -1,19 +1,15 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List drives', key: 'listDrives', - async run($: IGlobalVariable) { - const drives: { - data: IJSONObject[]; - } = { + async run($) { + const drives = { data: [{ value: null, name: 'My Google Drive' }], }; const params = { pageSize: 100, - pageToken: undefined as unknown as string, + pageToken: undefined, }; do { diff --git a/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts b/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.js similarity index 75% rename from packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts rename to packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.js index 99d26e1b..c52817bd 100644 --- a/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts +++ b/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.js @@ -1,20 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List folders', key: 'listFolders', - async run($: IGlobalVariable) { - const folders: { - data: IJSONObject[]; - } = { + async run($) { + const folders = { data: [], }; - const params: Record = { + const params = { q: `mimeType='application/vnd.google-apps.folder'`, orderBy: 'createdTime desc', - pageToken: undefined as unknown as string, + pageToken: undefined, pageSize: 1000, driveId: $.step.parameters.driveId, supportsAllDrives: true, diff --git a/packages/backend/src/apps/google-drive/index.d.ts b/packages/backend/src/apps/google-drive/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/google-drive/index.ts b/packages/backend/src/apps/google-drive/index.js similarity index 63% rename from packages/backend/src/apps/google-drive/index.ts rename to packages/backend/src/apps/google-drive/index.js index be166b40..f91e239b 100644 --- a/packages/backend/src/apps/google-drive/index.ts +++ b/packages/backend/src/apps/google-drive/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Google Drive', diff --git a/packages/backend/src/apps/google-drive/triggers/index.js b/packages/backend/src/apps/google-drive/triggers/index.js new file mode 100644 index 00000000..1f601968 --- /dev/null +++ b/packages/backend/src/apps/google-drive/triggers/index.js @@ -0,0 +1,6 @@ +import newFiles from './new-files/index.js'; +import newFilesInFolder from './new-files-in-folder/index.js'; +import newFolders from './new-folders/index.js'; +import updatedFiles from './updated-files/index.js'; + +export default [newFiles, newFilesInFolder, newFolders, updatedFiles]; diff --git a/packages/backend/src/apps/google-drive/triggers/index.ts b/packages/backend/src/apps/google-drive/triggers/index.ts deleted file mode 100644 index a6aaf4e2..00000000 --- a/packages/backend/src/apps/google-drive/triggers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import newFiles from './new-files'; -import newFilesInFolder from './new-files-in-folder'; -import newFolders from './new-folders'; -import updatedFiles from './updated-files'; - -export default [newFiles, newFilesInFolder, newFolders, updatedFiles]; diff --git a/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.js similarity index 88% rename from packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts rename to packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.js index d19916dc..182a08e1 100644 --- a/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts +++ b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newFilesInFolder from './new-files-in-folder'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newFilesInFolder from './new-files-in-folder.js'; export default defineTrigger({ name: 'New files in folder', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your file resides. If nothing is selected, then your personal Google Drive will be used.', @@ -30,7 +30,7 @@ export default defineTrigger({ { label: 'Folder', key: 'folderId', - type: 'dropdown' as const, + type: 'dropdown', required: false, dependsOn: ['parameters.driveId'], description: diff --git a/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.js similarity index 80% rename from packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts rename to packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.js index 039e27d3..fcad7f81 100644 --- a/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts +++ b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.js @@ -1,14 +1,12 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const newFilesInFolder = async ($: IGlobalVariable) => { +const newFilesInFolder = async ($) => { let q = "mimeType!='application/vnd.google-apps.folder'"; if ($.step.parameters.folderId) { q += ` and '${$.step.parameters.folderId}' in parents`; } else { q += ` and parents in 'root'`; } - const params: Record = { - pageToken: undefined as unknown as string, + const params = { + pageToken: undefined, orderBy: 'createdTime desc', fields: '*', pageSize: 1000, diff --git a/packages/backend/src/apps/google-drive/triggers/new-files/index.ts b/packages/backend/src/apps/google-drive/triggers/new-files/index.js similarity index 83% rename from packages/backend/src/apps/google-drive/triggers/new-files/index.ts rename to packages/backend/src/apps/google-drive/triggers/new-files/index.js index fae2921e..f5533ae4 100644 --- a/packages/backend/src/apps/google-drive/triggers/new-files/index.ts +++ b/packages/backend/src/apps/google-drive/triggers/new-files/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newFiles from './new-files'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newFiles from './new-files.js'; export default defineTrigger({ name: 'New files', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your file resides. If nothing is selected, then your personal Google Drive will be used.', diff --git a/packages/backend/src/apps/google-drive/triggers/new-files/new-files.ts b/packages/backend/src/apps/google-drive/triggers/new-files/new-files.js similarity index 78% rename from packages/backend/src/apps/google-drive/triggers/new-files/new-files.ts rename to packages/backend/src/apps/google-drive/triggers/new-files/new-files.js index 32f40089..dc0fce8d 100644 --- a/packages/backend/src/apps/google-drive/triggers/new-files/new-files.ts +++ b/packages/backend/src/apps/google-drive/triggers/new-files/new-files.js @@ -1,8 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const newFiles = async ($: IGlobalVariable) => { - const params: Record = { - pageToken: undefined as unknown as string, +const newFiles = async ($) => { + const params = { + pageToken: undefined, orderBy: 'createdTime desc', fields: '*', pageSize: 1000, diff --git a/packages/backend/src/apps/google-drive/triggers/new-folders/index.ts b/packages/backend/src/apps/google-drive/triggers/new-folders/index.js similarity index 89% rename from packages/backend/src/apps/google-drive/triggers/new-folders/index.ts rename to packages/backend/src/apps/google-drive/triggers/new-folders/index.js index 24451508..d2b8c7e4 100644 --- a/packages/backend/src/apps/google-drive/triggers/new-folders/index.ts +++ b/packages/backend/src/apps/google-drive/triggers/new-folders/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newFolders from './new-folders'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newFolders from './new-folders.js'; export default defineTrigger({ name: 'New folders', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your file resides. If nothing is selected, then your personal Google Drive will be used.', @@ -30,7 +30,7 @@ export default defineTrigger({ { label: 'Folder', key: 'folderId', - type: 'dropdown' as const, + type: 'dropdown', required: false, dependsOn: ['parameters.driveId'], description: diff --git a/packages/backend/src/apps/google-drive/triggers/new-folders/new-folders.ts b/packages/backend/src/apps/google-drive/triggers/new-folders/new-folders.js similarity index 81% rename from packages/backend/src/apps/google-drive/triggers/new-folders/new-folders.ts rename to packages/backend/src/apps/google-drive/triggers/new-folders/new-folders.js index 226b6834..d371dfe8 100644 --- a/packages/backend/src/apps/google-drive/triggers/new-folders/new-folders.ts +++ b/packages/backend/src/apps/google-drive/triggers/new-folders/new-folders.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const newFolders = async ($: IGlobalVariable) => { +const newFolders = async ($) => { let q = "mimeType='application/vnd.google-apps.folder'"; if ($.step.parameters.folderId) { q += ` and '${$.step.parameters.folderId}' in parents`; @@ -8,8 +6,8 @@ const newFolders = async ($: IGlobalVariable) => { q += ` and parents in 'root'`; } - const params: Record = { - pageToken: undefined as unknown as string, + const params = { + pageToken: undefined, orderBy: 'createdTime desc', fields: '*', pageSize: 1000, diff --git a/packages/backend/src/apps/google-drive/triggers/updated-files/index.ts b/packages/backend/src/apps/google-drive/triggers/updated-files/index.js similarity index 89% rename from packages/backend/src/apps/google-drive/triggers/updated-files/index.ts rename to packages/backend/src/apps/google-drive/triggers/updated-files/index.js index 93490bc4..18d43334 100644 --- a/packages/backend/src/apps/google-drive/triggers/updated-files/index.ts +++ b/packages/backend/src/apps/google-drive/triggers/updated-files/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import updatedFiles from './updated-files'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import updatedFiles from './updated-files.js'; export default defineTrigger({ name: 'Updated files', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your file resides. If nothing is selected, then your personal Google Drive will be used.', @@ -30,7 +30,7 @@ export default defineTrigger({ { label: 'Folder', key: 'folderId', - type: 'dropdown' as const, + type: 'dropdown', required: false, dependsOn: ['parameters.driveId'], description: @@ -53,7 +53,7 @@ export default defineTrigger({ { label: 'Include Deleted', key: 'includeDeleted', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: true, description: 'Should this trigger also on files that are deleted?', diff --git a/packages/backend/src/apps/google-drive/triggers/updated-files/updated-files.ts b/packages/backend/src/apps/google-drive/triggers/updated-files/updated-files.js similarity index 83% rename from packages/backend/src/apps/google-drive/triggers/updated-files/updated-files.ts rename to packages/backend/src/apps/google-drive/triggers/updated-files/updated-files.js index 7c7c80a0..ab5cad1c 100644 --- a/packages/backend/src/apps/google-drive/triggers/updated-files/updated-files.ts +++ b/packages/backend/src/apps/google-drive/triggers/updated-files/updated-files.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const updatedFiles = async ($: IGlobalVariable) => { +const updatedFiles = async ($) => { let q = `mimeType!='application/vnd.google-apps.folder'`; if ($.step.parameters.includeDeleted === false) { q += ` and trashed=${$.step.parameters.includeDeleted}`; @@ -12,8 +10,8 @@ const updatedFiles = async ($: IGlobalVariable) => { q += ` and parents in 'root'`; } - const params: Record = { - pageToken: undefined as unknown as string, + const params = { + pageToken: undefined, orderBy: 'modifiedTime desc', fields: '*', pageSize: 1000, diff --git a/packages/backend/src/apps/google-sheets/auth/generate-auth-url.ts b/packages/backend/src/apps/google-forms/auth/generate-auth-url.js similarity index 55% rename from packages/backend/src/apps/google-sheets/auth/generate-auth-url.ts rename to packages/backend/src/apps/google-forms/auth/generate-auth-url.js index ea89f8a4..c972ae16 100644 --- a/packages/backend/src/apps/google-sheets/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/google-forms/auth/generate-auth-url.js @@ -1,14 +1,13 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, prompt: 'select_account', scope: authScope.join(' '), diff --git a/packages/backend/src/apps/google-forms/auth/index.ts b/packages/backend/src/apps/google-forms/auth/index.js similarity index 74% rename from packages/backend/src/apps/google-forms/auth/index.ts rename to packages/backend/src/apps/google-forms/auth/index.js index 9d457fe0..dc570854 100644 --- a/packages/backend/src/apps/google-forms/auth/index.ts +++ b/packages/backend/src/apps/google-forms/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/google-forms/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/google-forms/auth/is-still-verified.js b/packages/backend/src/apps/google-forms/auth/is-still-verified.js new file mode 100644 index 00000000..68f4d7db --- /dev/null +++ b/packages/backend/src/apps/google-forms/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.resourceName; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/google-forms/auth/is-still-verified.ts b/packages/backend/src/apps/google-forms/auth/is-still-verified.ts deleted file mode 100644 index c46fa18b..00000000 --- a/packages/backend/src/apps/google-forms/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.resourceName; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/google-forms/auth/refresh-token.ts b/packages/backend/src/apps/google-forms/auth/refresh-token.js similarity index 57% rename from packages/backend/src/apps/google-forms/auth/refresh-token.ts rename to packages/backend/src/apps/google-forms/auth/refresh-token.js index 17d0c4cc..7c5b7020 100644 --- a/packages/backend/src/apps/google-forms/auth/refresh-token.ts +++ b/packages/backend/src/apps/google-forms/auth/refresh-token.js @@ -1,13 +1,13 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import authScope from '../common/auth-scope'; -const refreshToken = async ($: IGlobalVariable) => { +import authScope from '../common/auth-scope.js'; + +const refreshToken = async ($) => { const params = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/google-drive/auth/verify-credentials.ts b/packages/backend/src/apps/google-forms/auth/verify-credentials.js similarity index 62% rename from packages/backend/src/apps/google-drive/auth/verify-credentials.ts rename to packages/backend/src/apps/google-forms/auth/verify-credentials.js index 124e73c1..a636b72c 100644 --- a/packages/backend/src/apps/google-drive/auth/verify-credentials.ts +++ b/packages/backend/src/apps/google-forms/auth/verify-credentials.js @@ -1,25 +1,10 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -type TUser = { - displayName: string; - metadata: { - primary: boolean; - }; -}; - -type TEmailAddress = { - value: string; - metadata: { - primary: boolean; - }; -}; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { client_id: $.auth.data.clientId, client_secret: $.auth.data.clientSecret, @@ -36,10 +21,10 @@ const verifyCredentials = async ($: IGlobalVariable) => { const currentUser = await getCurrentUser($); const { displayName } = currentUser.names.find( - (name: TUser) => name.metadata.primary + (name) => name.metadata.primary ); const { value: email } = currentUser.emailAddresses.find( - (emailAddress: TEmailAddress) => emailAddress.metadata.primary + (emailAddress) => emailAddress.metadata.primary ); await $.auth.set({ diff --git a/packages/backend/src/apps/google-forms/common/add-auth-header.ts b/packages/backend/src/apps/google-forms/common/add-auth-header.js similarity index 65% rename from packages/backend/src/apps/google-forms/common/add-auth-header.ts rename to packages/backend/src/apps/google-forms/common/add-auth-header.js index 12bb4a62..6c86424c 100644 --- a/packages/backend/src/apps/google-forms/common/add-auth-header.ts +++ b/packages/backend/src/apps/google-forms/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if (requestConfig.headers && $.auth.data?.accessToken) { requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/google-forms/common/auth-scope.ts b/packages/backend/src/apps/google-forms/common/auth-scope.js similarity index 89% rename from packages/backend/src/apps/google-forms/common/auth-scope.ts rename to packages/backend/src/apps/google-forms/common/auth-scope.js index 397255c3..655ae747 100644 --- a/packages/backend/src/apps/google-forms/common/auth-scope.ts +++ b/packages/backend/src/apps/google-forms/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'https://www.googleapis.com/auth/forms.body.readonly', 'https://www.googleapis.com/auth/forms.responses.readonly', 'https://www.googleapis.com/auth/drive.readonly', diff --git a/packages/backend/src/apps/google-sheets/common/get-current-user.ts b/packages/backend/src/apps/google-forms/common/get-current-user.js similarity index 63% rename from packages/backend/src/apps/google-sheets/common/get-current-user.ts rename to packages/backend/src/apps/google-forms/common/get-current-user.js index 724fe1ac..2663ad20 100644 --- a/packages/backend/src/apps/google-sheets/common/get-current-user.ts +++ b/packages/backend/src/apps/google-forms/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data: currentUser } = await $.http.get( 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' ); diff --git a/packages/backend/src/apps/google-forms/dynamic-data/index.js b/packages/backend/src/apps/google-forms/dynamic-data/index.js new file mode 100644 index 00000000..0a58430e --- /dev/null +++ b/packages/backend/src/apps/google-forms/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listForms from './list-forms/index.js'; + +export default [listForms]; diff --git a/packages/backend/src/apps/google-forms/dynamic-data/index.ts b/packages/backend/src/apps/google-forms/dynamic-data/index.ts deleted file mode 100644 index cb6cd053..00000000 --- a/packages/backend/src/apps/google-forms/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listForms from './list-forms'; - -export default [listForms]; diff --git a/packages/backend/src/apps/google-forms/dynamic-data/list-forms/index.ts b/packages/backend/src/apps/google-forms/dynamic-data/list-forms/index.js similarity index 59% rename from packages/backend/src/apps/google-forms/dynamic-data/list-forms/index.ts rename to packages/backend/src/apps/google-forms/dynamic-data/list-forms/index.js index 8acd0298..00250819 100644 --- a/packages/backend/src/apps/google-forms/dynamic-data/list-forms/index.ts +++ b/packages/backend/src/apps/google-forms/dynamic-data/list-forms/index.js @@ -1,24 +1,23 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List forms', key: 'listForms', - async run($: IGlobalVariable) { - const forms: { - data: IJSONObject[]; - } = { + async run($) { + const forms = { data: [], }; const params = { q: `mimeType='application/vnd.google-apps.form'`, spaces: 'drive', - pageToken: undefined as unknown as string, + pageToken: undefined, }; do { - const { data } = await $.http.get(`https://www.googleapis.com/drive/v3/files`, { params }); + const { data } = await $.http.get( + `https://www.googleapis.com/drive/v3/files`, + { params } + ); params.pageToken = data.nextPageToken; for (const file of data.files) { diff --git a/packages/backend/src/apps/google-forms/index.d.ts b/packages/backend/src/apps/google-forms/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/google-forms/index.ts b/packages/backend/src/apps/google-forms/index.js similarity index 64% rename from packages/backend/src/apps/google-forms/index.ts rename to packages/backend/src/apps/google-forms/index.js index 2114432f..d8170e73 100644 --- a/packages/backend/src/apps/google-forms/index.ts +++ b/packages/backend/src/apps/google-forms/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Google Forms', diff --git a/packages/backend/src/apps/google-forms/triggers/index.js b/packages/backend/src/apps/google-forms/triggers/index.js new file mode 100644 index 00000000..41e90487 --- /dev/null +++ b/packages/backend/src/apps/google-forms/triggers/index.js @@ -0,0 +1,3 @@ +import newFormResponses from './new-form-responses/index.js'; + +export default [newFormResponses]; diff --git a/packages/backend/src/apps/google-forms/triggers/index.ts b/packages/backend/src/apps/google-forms/triggers/index.ts deleted file mode 100644 index 7c035992..00000000 --- a/packages/backend/src/apps/google-forms/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newFormResponses from './new-form-responses'; - -export default [newFormResponses]; diff --git a/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts b/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.js similarity index 80% rename from packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts rename to packages/backend/src/apps/google-forms/triggers/new-form-responses/index.js index bfbb772e..ac16701d 100644 --- a/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts +++ b/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newFormResponses from './new-form-responses'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newFormResponses from './new-form-responses.js'; export default defineTrigger({ name: 'New form responses', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Form', key: 'formId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick a form to receive form responses.', variables: false, diff --git a/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts b/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.js similarity index 78% rename from packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts rename to packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.js index 97c6fae8..26487b41 100644 --- a/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts +++ b/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.js @@ -1,8 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const newResponses = async ($: IGlobalVariable) => { +const newResponses = async ($) => { const params = { - pageToken: undefined as unknown as string, + pageToken: undefined, }; do { diff --git a/packages/backend/src/apps/google-sheets/actions/create-spreadsheet-row/index.ts b/packages/backend/src/apps/google-sheets/actions/create-spreadsheet-row/index.js similarity index 86% rename from packages/backend/src/apps/google-sheets/actions/create-spreadsheet-row/index.ts rename to packages/backend/src/apps/google-sheets/actions/create-spreadsheet-row/index.js index 645d4bbd..be18a160 100644 --- a/packages/backend/src/apps/google-sheets/actions/create-spreadsheet-row/index.ts +++ b/packages/backend/src/apps/google-sheets/actions/create-spreadsheet-row/index.js @@ -1,13 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; - -type TSheetsResponse = { - sheets: { - properties: { - sheetId: string; - title: string; - }; - }[]; -}; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create spreadsheet row', @@ -17,7 +8,7 @@ export default defineAction({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', @@ -36,7 +27,7 @@ export default defineAction({ { label: 'Spreadsheet', key: 'spreadsheetId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.driveId'], description: 'The spreadsheets in your Google Drive.', @@ -59,7 +50,7 @@ export default defineAction({ { label: 'Worksheet', key: 'worksheetId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.spreadsheetId'], description: 'The worksheets in your selected spreadsheet.', @@ -102,9 +93,7 @@ export default defineAction({ async run($) { const { data: { sheets }, - } = await $.http.get( - `/v4/spreadsheets/${$.step.parameters.spreadsheetId}` - ); + } = await $.http.get(`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`); const selectedSheet = sheets.find( (sheet) => sheet.properties.sheetId === $.step.parameters.worksheetId @@ -115,7 +104,7 @@ export default defineAction({ const range = sheetName; const dataValues = Object.entries($.step.parameters) - .filter((entry: [string, string]) => entry[0].startsWith('header-')) + .filter((entry) => entry[0].startsWith('header-')) .map((value) => value[1]); const values = [dataValues]; diff --git a/packages/backend/src/apps/google-sheets/actions/create-spreadsheet/index.ts b/packages/backend/src/apps/google-sheets/actions/create-spreadsheet/index.js similarity index 87% rename from packages/backend/src/apps/google-sheets/actions/create-spreadsheet/index.ts rename to packages/backend/src/apps/google-sheets/actions/create-spreadsheet/index.js index b072cb7a..bf269200 100644 --- a/packages/backend/src/apps/google-sheets/actions/create-spreadsheet/index.ts +++ b/packages/backend/src/apps/google-sheets/actions/create-spreadsheet/index.js @@ -1,9 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; - -type THeaders = { - __id: string; - header: string; -}[]; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create spreadsheet', @@ -14,7 +9,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -22,7 +17,7 @@ export default defineAction({ { label: 'Spreadsheet to copy', key: 'spreadsheetId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Choose a spreadsheet to copy its data.', variables: true, @@ -40,7 +35,7 @@ export default defineAction({ { label: 'Headers', key: 'headers', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'These headers are ignored if "Spreadsheet to Copy" is selected.', @@ -48,7 +43,7 @@ export default defineAction({ { label: 'Header', key: 'header', - type: 'string' as const, + type: 'string', required: true, variables: true, }, @@ -69,7 +64,7 @@ export default defineAction({ raw: data, }); } else { - const headers = $.step.parameters.headers as THeaders; + const headers = $.step.parameters.headers; const values = headers.map((entry) => entry.header); const spreadsheetBody = { diff --git a/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts b/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.js similarity index 83% rename from packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts rename to packages/backend/src/apps/google-sheets/actions/create-worksheet/index.js index 9a1abe81..ceed6f24 100644 --- a/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.ts +++ b/packages/backend/src/apps/google-sheets/actions/create-worksheet/index.js @@ -1,23 +1,4 @@ -import { IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; - -type THeaders = { - __id: string; - header: string; -}[]; - -type TSheetsResponse = { - sheets: { - properties: { - sheetId: string; - title: string; - }; - }[]; -}; - -type TBody = { - requests: IJSONObject[]; -}; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create worksheet', @@ -28,7 +9,7 @@ export default defineAction({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', @@ -47,7 +28,7 @@ export default defineAction({ { label: 'Spreadsheet', key: 'spreadsheetId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.driveId'], variables: true, @@ -69,7 +50,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -77,13 +58,13 @@ export default defineAction({ { label: 'Headers', key: 'headers', - type: 'dynamic' as const, + type: 'dynamic', required: false, fields: [ { label: 'Header', key: 'header', - type: 'string' as const, + type: 'string', required: true, variables: true, }, @@ -92,7 +73,7 @@ export default defineAction({ { label: 'Overwrite', key: 'overwrite', - type: 'dropdown' as const, + type: 'dropdown', required: false, value: false, description: @@ -114,16 +95,15 @@ export default defineAction({ async run($) { const { data: { sheets }, - } = await $.http.get( - `/v4/spreadsheets/${$.step.parameters.spreadsheetId}` - ); + } = await $.http.get(`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`); + const selectedSheet = sheets.find( (sheet) => sheet.properties.title === $.step.parameters.title ); - const headers = $.step.parameters.headers as THeaders; + const headers = $.step.parameters.headers; const values = headers.map((entry) => entry.header); - const body: TBody = { + const body = { requests: [ { addSheet: { diff --git a/packages/backend/src/apps/google-sheets/actions/index.js b/packages/backend/src/apps/google-sheets/actions/index.js new file mode 100644 index 00000000..b5143cc2 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/actions/index.js @@ -0,0 +1,5 @@ +import createSpreadsheet from './create-spreadsheet/index.js'; +import createSpreadsheetRow from './create-spreadsheet-row/index.js'; +import createWorksheet from './create-worksheet/index.js'; + +export default [createSpreadsheet, createSpreadsheetRow, createWorksheet]; diff --git a/packages/backend/src/apps/google-sheets/actions/index.ts b/packages/backend/src/apps/google-sheets/actions/index.ts deleted file mode 100644 index 5608ae22..00000000 --- a/packages/backend/src/apps/google-sheets/actions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import createSpreadsheet from './create-spreadsheet'; -import createSpreadsheetRow from './create-spreadsheet-row'; -import createWorksheet from './create-worksheet'; - -export default [createSpreadsheet, createSpreadsheetRow, createWorksheet]; diff --git a/packages/backend/src/apps/google-calendar/auth/generate-auth-url.ts b/packages/backend/src/apps/google-sheets/auth/generate-auth-url.js similarity index 55% rename from packages/backend/src/apps/google-calendar/auth/generate-auth-url.ts rename to packages/backend/src/apps/google-sheets/auth/generate-auth-url.js index ea89f8a4..c972ae16 100644 --- a/packages/backend/src/apps/google-calendar/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/google-sheets/auth/generate-auth-url.js @@ -1,14 +1,13 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, prompt: 'select_account', scope: authScope.join(' '), diff --git a/packages/backend/src/apps/google-sheets/auth/index.ts b/packages/backend/src/apps/google-sheets/auth/index.js similarity index 74% rename from packages/backend/src/apps/google-sheets/auth/index.ts rename to packages/backend/src/apps/google-sheets/auth/index.js index 5e52e35a..45ea4058 100644 --- a/packages/backend/src/apps/google-sheets/auth/index.ts +++ b/packages/backend/src/apps/google-sheets/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/google-sheets/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/google-sheets/auth/is-still-verified.js b/packages/backend/src/apps/google-sheets/auth/is-still-verified.js new file mode 100644 index 00000000..68f4d7db --- /dev/null +++ b/packages/backend/src/apps/google-sheets/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.resourceName; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/google-sheets/auth/is-still-verified.ts b/packages/backend/src/apps/google-sheets/auth/is-still-verified.ts deleted file mode 100644 index c46fa18b..00000000 --- a/packages/backend/src/apps/google-sheets/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.resourceName; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/google-drive/auth/refresh-token.ts b/packages/backend/src/apps/google-sheets/auth/refresh-token.js similarity index 57% rename from packages/backend/src/apps/google-drive/auth/refresh-token.ts rename to packages/backend/src/apps/google-sheets/auth/refresh-token.js index 17d0c4cc..7c5b7020 100644 --- a/packages/backend/src/apps/google-drive/auth/refresh-token.ts +++ b/packages/backend/src/apps/google-sheets/auth/refresh-token.js @@ -1,13 +1,13 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import authScope from '../common/auth-scope'; -const refreshToken = async ($: IGlobalVariable) => { +import authScope from '../common/auth-scope.js'; + +const refreshToken = async ($) => { const params = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/google-calendar/auth/verify-credentials.ts b/packages/backend/src/apps/google-sheets/auth/verify-credentials.js similarity index 62% rename from packages/backend/src/apps/google-calendar/auth/verify-credentials.ts rename to packages/backend/src/apps/google-sheets/auth/verify-credentials.js index 124e73c1..a636b72c 100644 --- a/packages/backend/src/apps/google-calendar/auth/verify-credentials.ts +++ b/packages/backend/src/apps/google-sheets/auth/verify-credentials.js @@ -1,25 +1,10 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -type TUser = { - displayName: string; - metadata: { - primary: boolean; - }; -}; - -type TEmailAddress = { - value: string; - metadata: { - primary: boolean; - }; -}; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { client_id: $.auth.data.clientId, client_secret: $.auth.data.clientSecret, @@ -36,10 +21,10 @@ const verifyCredentials = async ($: IGlobalVariable) => { const currentUser = await getCurrentUser($); const { displayName } = currentUser.names.find( - (name: TUser) => name.metadata.primary + (name) => name.metadata.primary ); const { value: email } = currentUser.emailAddresses.find( - (emailAddress: TEmailAddress) => emailAddress.metadata.primary + (emailAddress) => emailAddress.metadata.primary ); await $.auth.set({ diff --git a/packages/backend/src/apps/google-calendar/common/add-auth-header.ts b/packages/backend/src/apps/google-sheets/common/add-auth-header.js similarity index 62% rename from packages/backend/src/apps/google-calendar/common/add-auth-header.ts rename to packages/backend/src/apps/google-sheets/common/add-auth-header.js index 8e7798b8..02477aa4 100644 --- a/packages/backend/src/apps/google-calendar/common/add-auth-header.ts +++ b/packages/backend/src/apps/google-sheets/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/google-sheets/common/auth-scope.ts b/packages/backend/src/apps/google-sheets/common/auth-scope.js similarity index 88% rename from packages/backend/src/apps/google-sheets/common/auth-scope.ts rename to packages/backend/src/apps/google-sheets/common/auth-scope.js index b4b8fdb3..6c22818a 100644 --- a/packages/backend/src/apps/google-sheets/common/auth-scope.ts +++ b/packages/backend/src/apps/google-sheets/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/userinfo.email', diff --git a/packages/backend/src/apps/google-drive/common/get-current-user.ts b/packages/backend/src/apps/google-sheets/common/get-current-user.js similarity index 63% rename from packages/backend/src/apps/google-drive/common/get-current-user.ts rename to packages/backend/src/apps/google-sheets/common/get-current-user.js index 724fe1ac..2663ad20 100644 --- a/packages/backend/src/apps/google-drive/common/get-current-user.ts +++ b/packages/backend/src/apps/google-sheets/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data: currentUser } = await $.http.get( 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' ); diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/index.js b/packages/backend/src/apps/google-sheets/dynamic-data/index.js new file mode 100644 index 00000000..e0d6efac --- /dev/null +++ b/packages/backend/src/apps/google-sheets/dynamic-data/index.js @@ -0,0 +1,5 @@ +import listDrives from './list-drives/index.js'; +import listSpreadsheets from './list-spreadsheets/index.js'; +import listWorksheets from './list-worksheets/index.js'; + +export default [listDrives, listSpreadsheets, listWorksheets]; diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/index.ts b/packages/backend/src/apps/google-sheets/dynamic-data/index.ts deleted file mode 100644 index ac008c09..00000000 --- a/packages/backend/src/apps/google-sheets/dynamic-data/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import listDrives from './list-drives'; -import listSpreadsheets from './list-spreadsheets'; -import listWorksheets from './list-worksheets'; - -export default [listDrives, listSpreadsheets, listWorksheets]; diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.ts b/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.js similarity index 74% rename from packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.ts rename to packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.js index ea68c599..6d34bb70 100644 --- a/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.ts +++ b/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.js @@ -1,19 +1,15 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List drives', key: 'listDrives', - async run($: IGlobalVariable) { - const drives: { - data: IJSONObject[]; - } = { + async run($) { + const drives = { data: [{ value: null, name: 'My Google Drive' }], }; const params = { pageSize: 100, - pageToken: undefined as unknown as string, + pageToken: undefined, }; do { diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/list-spreadsheets/index.ts b/packages/backend/src/apps/google-sheets/dynamic-data/list-spreadsheets/index.js similarity index 76% rename from packages/backend/src/apps/google-sheets/dynamic-data/list-spreadsheets/index.ts rename to packages/backend/src/apps/google-sheets/dynamic-data/list-spreadsheets/index.js index e9c7f3cc..97568c89 100644 --- a/packages/backend/src/apps/google-sheets/dynamic-data/list-spreadsheets/index.ts +++ b/packages/backend/src/apps/google-sheets/dynamic-data/list-spreadsheets/index.js @@ -1,20 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List spreadsheets', key: 'listSpreadsheets', - async run($: IGlobalVariable) { - const spreadsheets: { - data: IJSONObject[]; - } = { + async run($) { + const spreadsheets = { data: [], }; - const params: Record = { + const params = { q: `mimeType='application/vnd.google-apps.spreadsheet'`, pageSize: 100, - pageToken: undefined as unknown as string, + pageToken: undefined, orderBy: 'createdTime desc', driveId: $.step.parameters.driveId, supportsAllDrives: true, diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/list-worksheets/index.ts b/packages/backend/src/apps/google-sheets/dynamic-data/list-worksheets/index.js similarity index 65% rename from packages/backend/src/apps/google-sheets/dynamic-data/list-worksheets/index.ts rename to packages/backend/src/apps/google-sheets/dynamic-data/list-worksheets/index.js index b9aa5379..aee56924 100644 --- a/packages/backend/src/apps/google-sheets/dynamic-data/list-worksheets/index.ts +++ b/packages/backend/src/apps/google-sheets/dynamic-data/list-worksheets/index.js @@ -1,15 +1,11 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List worksheets', key: 'listWorksheets', - async run($: IGlobalVariable) { - const spreadsheetId = $.step.parameters.spreadsheetId as string; + async run($) { + const spreadsheetId = $.step.parameters.spreadsheetId; - const worksheets: { - data: IJSONObject[]; - } = { + const worksheets = { data: [], }; @@ -17,8 +13,8 @@ export default { return worksheets; } - const params: Record = { - pageToken: undefined as unknown as string, + const params = { + pageToken: undefined, }; do { diff --git a/packages/backend/src/apps/google-sheets/dynamic-fields/index.js b/packages/backend/src/apps/google-sheets/dynamic-fields/index.js new file mode 100644 index 00000000..0a8bc04b --- /dev/null +++ b/packages/backend/src/apps/google-sheets/dynamic-fields/index.js @@ -0,0 +1,3 @@ +import listSheetHeaders from './list-sheet-headers/index.js'; + +export default [listSheetHeaders]; diff --git a/packages/backend/src/apps/google-sheets/dynamic-fields/index.ts b/packages/backend/src/apps/google-sheets/dynamic-fields/index.ts deleted file mode 100644 index 7f486818..00000000 --- a/packages/backend/src/apps/google-sheets/dynamic-fields/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listSheetHeaders from './list-sheet-headers'; - -export default [listSheetHeaders]; diff --git a/packages/backend/src/apps/google-sheets/dynamic-fields/list-sheet-headers/index.js b/packages/backend/src/apps/google-sheets/dynamic-fields/list-sheet-headers/index.js new file mode 100644 index 00000000..cbae65d0 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/dynamic-fields/list-sheet-headers/index.js @@ -0,0 +1,55 @@ +const hasValue = (value) => value !== null && value !== undefined; + +export default { + name: 'List Sheet Headers', + key: 'listSheetHeaders', + + async run($) { + if ( + !hasValue($.step.parameters.spreadsheetId) || + !hasValue($.step.parameters.worksheetId) + ) { + return; + } + + const { + data: { sheets }, + } = await $.http.get(`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`); + + const selectedSheet = sheets.find( + (sheet) => sheet.properties.sheetId === $.step.parameters.worksheetId + ); + + if (!selectedSheet) return; + + const sheetName = selectedSheet.properties.title; + + const range = `${sheetName}!1:1`; + + const params = { + majorDimension: 'ROWS', + }; + + const { data } = await $.http.get( + `/v4/spreadsheets/${$.step.parameters.spreadsheetId}/values/${range}`, + { + params, + } + ); + + if (!data.values) { + return; + } + + const result = data.values[0].map((item, index) => ({ + label: item, + key: `header-${index}`, + type: 'string', + required: false, + value: item, + variables: true, + })); + + return result; + }, +}; diff --git a/packages/backend/src/apps/google-sheets/dynamic-fields/list-sheet-headers/index.ts b/packages/backend/src/apps/google-sheets/dynamic-fields/list-sheet-headers/index.ts deleted file mode 100644 index 4a3f9854..00000000 --- a/packages/backend/src/apps/google-sheets/dynamic-fields/list-sheet-headers/index.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type TSheetsResponse = { - sheets: { - properties: { - sheetId: string; - title: string; - }; - }[]; -}; - -type TSheetsValueResponse = { - majorDimension: string; - range: string; - values: string[][]; -}; - -const hasValue = (value: any) => value !== null && value !== undefined; - -export default { - name: 'List Sheet Headers', - key: 'listSheetHeaders', - - async run($: IGlobalVariable) { - if (!hasValue($.step.parameters.spreadsheetId) || !hasValue($.step.parameters.worksheetId)) { - return; - } - - const { - data: { sheets }, - } = await $.http.get( - `/v4/spreadsheets/${$.step.parameters.spreadsheetId}` - ); - - const selectedSheet = sheets.find( - (sheet) => sheet.properties.sheetId === $.step.parameters.worksheetId - ); - - if (!selectedSheet) return; - - const sheetName = selectedSheet.properties.title; - - const range = `${sheetName}!1:1`; - - const params: Record = { - majorDimension: 'ROWS', - }; - - const { data } = await $.http.get( - `/v4/spreadsheets/${$.step.parameters.spreadsheetId}/values/${range}`, - { - params, - } - ); - - if (!data.values) { - return; - } - - const result = data.values[0].map((item: string, index: number) => ({ - label: item, - key: `header-${index}`, - type: 'string' as const, - required: false, - value: item, - variables: true, - })); - - return result; - }, -}; diff --git a/packages/backend/src/apps/google-sheets/index.d.ts b/packages/backend/src/apps/google-sheets/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/google-sheets/index.ts b/packages/backend/src/apps/google-sheets/index.js similarity index 58% rename from packages/backend/src/apps/google-sheets/index.ts rename to packages/backend/src/apps/google-sheets/index.js index a8805ffd..90c53132 100644 --- a/packages/backend/src/apps/google-sheets/index.ts +++ b/packages/backend/src/apps/google-sheets/index.js @@ -1,10 +1,10 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; -import dynamicFields from './dynamic-fields'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; +import dynamicFields from './dynamic-fields/index.js'; export default defineApp({ name: 'Google Sheets', diff --git a/packages/backend/src/apps/google-sheets/triggers/index.js b/packages/backend/src/apps/google-sheets/triggers/index.js new file mode 100644 index 00000000..1d0683c7 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/triggers/index.js @@ -0,0 +1,5 @@ +import newSpreadsheets from './new-spreadsheets/index.js'; +import newWorksheets from './new-worksheets/index.js'; +import newSpreadsheetRows from './new-spreadsheet-rows/index.js'; + +export default [newSpreadsheets, newWorksheets, newSpreadsheetRows]; diff --git a/packages/backend/src/apps/google-sheets/triggers/index.ts b/packages/backend/src/apps/google-sheets/triggers/index.ts deleted file mode 100644 index cd9d065a..00000000 --- a/packages/backend/src/apps/google-sheets/triggers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import newSpreadsheets from './new-spreadsheets'; -import newWorksheets from './new-worksheets'; -import newSpreadsheetRows from './new-spreadsheet-rows'; - -export default [newSpreadsheets, newWorksheets, newSpreadsheetRows]; diff --git a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/index.ts b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/index.js similarity index 89% rename from packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/index.ts rename to packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/index.js index 53e06847..164e79fd 100644 --- a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/index.ts +++ b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newSpreadsheetRows from './new-spreadsheet-rows'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newSpreadsheetRows from './new-spreadsheet-rows.js'; export default defineTrigger({ name: 'New spreadsheet rows', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', @@ -30,7 +30,7 @@ export default defineTrigger({ { label: 'Spreadsheet', key: 'spreadsheetId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.driveId'], description: 'The spreadsheets in your Google Drive.', @@ -53,7 +53,7 @@ export default defineTrigger({ { label: 'Worksheet', key: 'worksheetId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.spreadsheetId'], description: diff --git a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/new-spreadsheet-rows.ts b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/new-spreadsheet-rows.js similarity index 67% rename from packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/new-spreadsheet-rows.ts rename to packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/new-spreadsheet-rows.js index ca2f9ced..fd4c2d6c 100644 --- a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/new-spreadsheet-rows.ts +++ b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheet-rows/new-spreadsheet-rows.js @@ -1,20 +1,7 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type TSheetsResponse = { - sheets: { - properties: { - sheetId: string; - title: string; - }; - }[]; -}; - -const newSpreadsheetRows = async ($: IGlobalVariable) => { +const newSpreadsheetRows = async ($) => { const { data: { sheets }, - } = await $.http.get( - `/v4/spreadsheets/${$.step.parameters.spreadsheetId}` - ); + } = await $.http.get(`/v4/spreadsheets/${$.step.parameters.spreadsheetId}`); const selectedSheet = sheets.find( (sheet) => sheet.properties.sheetId === $.step.parameters.worksheetId diff --git a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.ts b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.js similarity index 82% rename from packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.ts rename to packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.js index 5af06fd9..861bdeec 100644 --- a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.ts +++ b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newSpreadsheets from './new-spreadsheets'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newSpreadsheets from './new-spreadsheets.js'; export default defineTrigger({ name: 'New spreadsheets', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', diff --git a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.ts b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.js similarity index 79% rename from packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.ts rename to packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.js index 1a9dff6f..f3d2c4a2 100644 --- a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.ts +++ b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.js @@ -1,8 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const newSpreadsheets = async ($: IGlobalVariable) => { - const params: Record = { - pageToken: undefined as unknown as string, +const newSpreadsheets = async ($) => { + const params = { + pageToken: undefined, orderBy: 'createdTime desc', q: `mimeType='application/vnd.google-apps.spreadsheet'`, fields: '*', diff --git a/packages/backend/src/apps/google-sheets/triggers/new-worksheets/index.ts b/packages/backend/src/apps/google-sheets/triggers/new-worksheets/index.js similarity index 87% rename from packages/backend/src/apps/google-sheets/triggers/new-worksheets/index.ts rename to packages/backend/src/apps/google-sheets/triggers/new-worksheets/index.js index 511eb685..8933ade6 100644 --- a/packages/backend/src/apps/google-sheets/triggers/new-worksheets/index.ts +++ b/packages/backend/src/apps/google-sheets/triggers/new-worksheets/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newWorksheets from './new-worksheets'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newWorksheets from './new-worksheets.js'; export default defineTrigger({ name: 'New worksheets', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Drive', key: 'driveId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', @@ -29,7 +29,7 @@ export default defineTrigger({ { label: 'Spreadsheet', key: 'spreadsheetId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.driveId'], description: 'The spreadsheets in your Google Drive.', diff --git a/packages/backend/src/apps/google-sheets/triggers/new-worksheets/new-worksheets.ts b/packages/backend/src/apps/google-sheets/triggers/new-worksheets/new-worksheets.js similarity index 76% rename from packages/backend/src/apps/google-sheets/triggers/new-worksheets/new-worksheets.ts rename to packages/backend/src/apps/google-sheets/triggers/new-worksheets/new-worksheets.js index e2c7ef76..bfc57cc7 100644 --- a/packages/backend/src/apps/google-sheets/triggers/new-worksheets/new-worksheets.ts +++ b/packages/backend/src/apps/google-sheets/triggers/new-worksheets/new-worksheets.js @@ -1,8 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const newWorksheets = async ($: IGlobalVariable) => { +const newWorksheets = async ($) => { const params = { - pageToken: undefined as unknown as string, + pageToken: undefined, }; do { diff --git a/packages/backend/src/apps/helix/actions/index.js b/packages/backend/src/apps/helix/actions/index.js new file mode 100644 index 00000000..8c1bb49b --- /dev/null +++ b/packages/backend/src/apps/helix/actions/index.js @@ -0,0 +1,3 @@ +import newChat from './new-chat/index.js'; + +export default [newChat]; diff --git a/packages/backend/src/apps/helix/actions/index.ts b/packages/backend/src/apps/helix/actions/index.ts deleted file mode 100644 index 92ff1f82..00000000 --- a/packages/backend/src/apps/helix/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newChat from './new-chat'; - -export default [newChat]; diff --git a/packages/backend/src/apps/helix/actions/new-chat/index.ts b/packages/backend/src/apps/helix/actions/new-chat/index.js similarity index 87% rename from packages/backend/src/apps/helix/actions/new-chat/index.ts rename to packages/backend/src/apps/helix/actions/new-chat/index.js index b33b2325..c9a86ecf 100644 --- a/packages/backend/src/apps/helix/actions/new-chat/index.ts +++ b/packages/backend/src/apps/helix/actions/new-chat/index.js @@ -1,5 +1,5 @@ import FormData from 'form-data'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'New chat', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, description: 'Prompt to start the chat with.', variables: true, @@ -18,7 +18,7 @@ export default defineAction({ async run($) { const formData = new FormData(); - formData.append('input', $.step.parameters.input as string); + formData.append('input', $.step.parameters.input); formData.append('mode', 'inference'); formData.append('type', 'text'); diff --git a/packages/backend/src/apps/helix/auth/index.ts b/packages/backend/src/apps/helix/auth/index.js similarity index 81% rename from packages/backend/src/apps/helix/auth/index.ts rename to packages/backend/src/apps/helix/auth/index.js index bfc045b4..3850ff20 100644 --- a/packages/backend/src/apps/helix/auth/index.ts +++ b/packages/backend/src/apps/helix/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'instanceUrl', label: 'Helix instance URL', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: 'https://app.tryhelix.ai', @@ -30,7 +30,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/helix/auth/is-still-verified.js b/packages/backend/src/apps/helix/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/helix/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/helix/auth/is-still-verified.ts b/packages/backend/src/apps/helix/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/helix/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/helix/auth/verify-credentials.ts b/packages/backend/src/apps/helix/auth/verify-credentials.js similarity index 56% rename from packages/backend/src/apps/helix/auth/verify-credentials.ts rename to packages/backend/src/apps/helix/auth/verify-credentials.js index 63c122ef..c8f53459 100644 --- a/packages/backend/src/apps/helix/auth/verify-credentials.ts +++ b/packages/backend/src/apps/helix/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await $.http.get('/api/v1/sessions'); await $.auth.set({ diff --git a/packages/backend/src/apps/helix/common/add-auth-header.ts b/packages/backend/src/apps/helix/common/add-auth-header.js similarity index 65% rename from packages/backend/src/apps/helix/common/add-auth-header.ts rename to packages/backend/src/apps/helix/common/add-auth-header.js index f4d16fd4..59ecf6b0 100644 --- a/packages/backend/src/apps/helix/common/add-auth-header.ts +++ b/packages/backend/src/apps/helix/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.apiKey) { const authorizationHeader = `Bearer ${$.auth.data.apiKey}`; requestConfig.headers.Authorization = authorizationHeader; diff --git a/packages/backend/src/apps/helix/common/set-base-url.js b/packages/backend/src/apps/helix/common/set-base-url.js new file mode 100644 index 00000000..135149b1 --- /dev/null +++ b/packages/backend/src/apps/helix/common/set-base-url.js @@ -0,0 +1,11 @@ +const setBaseUrl = ($, requestConfig) => { + if ($.auth.data.instanceUrl) { + requestConfig.baseURL = $.auth.data.instanceUrl; + } else if ($.app.apiBaseUrl) { + requestConfig.baseURL = $.app.apiBaseUrl; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/helix/common/set-base-url.ts b/packages/backend/src/apps/helix/common/set-base-url.ts deleted file mode 100644 index 8aef4b23..00000000 --- a/packages/backend/src/apps/helix/common/set-base-url.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data.instanceUrl) { - requestConfig.baseURL = $.auth.data.instanceUrl as string; - } else if ($.app.apiBaseUrl) { - requestConfig.baseURL = $.app.apiBaseUrl as string; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/helix/index.d.ts b/packages/backend/src/apps/helix/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/helix/index.ts b/packages/backend/src/apps/helix/index.js similarity index 61% rename from packages/backend/src/apps/helix/index.ts rename to packages/backend/src/apps/helix/index.js index 727cc56a..17fdb354 100644 --- a/packages/backend/src/apps/helix/index.ts +++ b/packages/backend/src/apps/helix/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import setBaseUrl from './common/set-base-url'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import setBaseUrl from './common/set-base-url.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Helix', diff --git a/packages/backend/src/apps/http-request/actions/custom-request/index.ts b/packages/backend/src/apps/http-request/actions/custom-request/index.js similarity index 67% rename from packages/backend/src/apps/http-request/actions/custom-request/index.ts rename to packages/backend/src/apps/http-request/actions/custom-request/index.js index 25c01d68..684046b7 100644 --- a/packages/backend/src/apps/http-request/actions/custom-request/index.ts +++ b/packages/backend/src/apps/http-request/actions/custom-request/index.js @@ -1,16 +1,6 @@ -import type { AxiosRequestConfig } from 'axios'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -type TMethod = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'; - -type THeaderEntry = { - key: string; - value: string; -}; - -type THeaderEntries = THeaderEntry[]; - -function isPossiblyTextBased(contentType: string) { +function isPossiblyTextBased(contentType) { if (!contentType) return false; return ( @@ -19,7 +9,7 @@ function isPossiblyTextBased(contentType: string) { ); } -function throwIfFileSizeExceedsLimit(contentLength: string) { +function throwIfFileSizeExceedsLimit(contentLength) { const maxFileSize = 25 * 1024 * 1024; // 25MB if (Number(contentLength) > maxFileSize) { @@ -37,7 +27,7 @@ export default defineAction({ { label: 'Method', key: 'method', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: `The HTTP method we'll use to perform the request.`, value: 'GET', @@ -52,7 +42,7 @@ export default defineAction({ { label: 'URL', key: 'url', - type: 'string' as const, + type: 'string', required: true, description: 'Any URL with a querystring will be re-encoded properly.', variables: true, @@ -60,7 +50,7 @@ export default defineAction({ { label: 'Data', key: 'data', - type: 'string' as const, + type: 'string', required: false, description: 'Place raw JSON data here.', variables: true, @@ -68,7 +58,7 @@ export default defineAction({ { label: 'Headers', key: 'headers', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'Add or remove headers as needed', value: [ @@ -81,7 +71,7 @@ export default defineAction({ { label: 'Key', key: 'key', - type: 'string' as const, + type: 'string', required: true, description: 'Header key', variables: true, @@ -89,7 +79,7 @@ export default defineAction({ { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, description: 'Header value', variables: true, @@ -99,27 +89,24 @@ export default defineAction({ ], async run($) { - const method = $.step.parameters.method as TMethod; - const data = $.step.parameters.data as string; - const url = $.step.parameters.url as string; - const headers = $.step.parameters.headers as THeaderEntries; + const method = $.step.parameters.method; + const data = $.step.parameters.data; + const url = $.step.parameters.url; + const headers = $.step.parameters.headers; - const headersObject: Record = headers.reduce( - (result, entry) => { - const key = entry.key?.toLowerCase(); - const value = entry.value; + const headersObject = headers.reduce((result, entry) => { + const key = entry.key?.toLowerCase(); + const value = entry.value; - if (key && value) { - return { - ...result, - [entry.key?.toLowerCase()]: entry.value, - }; - } + if (key && value) { + return { + ...result, + [entry.key?.toLowerCase()]: entry.value, + }; + } - return result; - }, - {} - ); + return result; + }, {}); let contentType = headersObject['content-type']; @@ -132,9 +119,9 @@ export default defineAction({ throwIfFileSizeExceedsLimit(metadataResponse.headers['content-length']); // eslint-disable-next-line no-empty - } catch { } + } catch {} - const requestData: AxiosRequestConfig = { + const requestData = { url, method, data, @@ -152,7 +139,7 @@ export default defineAction({ let responseData = response.data; if (!isPossiblyTextBased(contentType)) { - responseData = Buffer.from(responseData as string).toString('base64'); + responseData = Buffer.from(responseData).toString('base64'); } $.setActionItem({ raw: { data: responseData } }); diff --git a/packages/backend/src/apps/http-request/actions/index.js b/packages/backend/src/apps/http-request/actions/index.js new file mode 100644 index 00000000..0396f241 --- /dev/null +++ b/packages/backend/src/apps/http-request/actions/index.js @@ -0,0 +1,3 @@ +import customRequest from './custom-request/index.js'; + +export default [customRequest]; diff --git a/packages/backend/src/apps/http-request/actions/index.ts b/packages/backend/src/apps/http-request/actions/index.ts deleted file mode 100644 index 2bfac8fc..00000000 --- a/packages/backend/src/apps/http-request/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import customRequest from './custom-request'; - -export default [customRequest]; diff --git a/packages/backend/src/apps/http-request/index.d.ts b/packages/backend/src/apps/http-request/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/http-request/index.ts b/packages/backend/src/apps/http-request/index.js similarity index 76% rename from packages/backend/src/apps/http-request/index.ts rename to packages/backend/src/apps/http-request/index.js index 9b6cc169..f5df4aa0 100644 --- a/packages/backend/src/apps/http-request/index.ts +++ b/packages/backend/src/apps/http-request/index.js @@ -1,5 +1,5 @@ -import defineApp from '../../helpers/define-app'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'HTTP Request', diff --git a/packages/backend/src/apps/hubspot/actions/create-contact/index.ts b/packages/backend/src/apps/hubspot/actions/create-contact/index.js similarity index 64% rename from packages/backend/src/apps/hubspot/actions/create-contact/index.ts rename to packages/backend/src/apps/hubspot/actions/create-contact/index.js index 9d1622c8..790854a1 100644 --- a/packages/backend/src/apps/hubspot/actions/create-contact/index.ts +++ b/packages/backend/src/apps/hubspot/actions/create-contact/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create contact', @@ -8,28 +8,28 @@ export default defineAction({ { label: 'Company name', key: 'company', - type: 'string' as const, + type: 'string', required: false, variables: true, }, { label: 'Email', key: 'email', - type: 'string' as const, + type: 'string', required: false, variables: true, }, { label: 'First name', key: 'firstName', - type: 'string' as const, + type: 'string', required: false, variables: true, }, { label: 'Last name', key: 'lastName', - type: 'string' as const, + type: 'string', required: false, description: 'Last name', variables: true, @@ -37,34 +37,34 @@ export default defineAction({ { label: 'Phone', key: 'phone', - type: 'string' as const, + type: 'string', required: false, variables: true, }, { label: 'Website URL', key: 'website', - type: 'string' as const, + type: 'string', required: false, variables: true, }, { label: 'Owner ID', key: 'hubspotOwnerId', - type: 'string' as const, + type: 'string', required: false, variables: true, }, ], async run($) { - const company = $.step.parameters.company as string; - const email = $.step.parameters.email as string; - const firstName = $.step.parameters.firstName as string; - const lastName = $.step.parameters.lastName as string; - const phone = $.step.parameters.phone as string; - const website = $.step.parameters.website as string; - const hubspotOwnerId = $.step.parameters.hubspotOwnerId as string; + const company = $.step.parameters.company; + const email = $.step.parameters.email; + const firstName = $.step.parameters.firstName; + const lastName = $.step.parameters.lastName; + const phone = $.step.parameters.phone; + const website = $.step.parameters.website; + const hubspotOwnerId = $.step.parameters.hubspotOwnerId; const response = await $.http.post(`crm/v3/objects/contacts`, { properties: { diff --git a/packages/backend/src/apps/hubspot/actions/index.js b/packages/backend/src/apps/hubspot/actions/index.js new file mode 100644 index 00000000..9dbfbd06 --- /dev/null +++ b/packages/backend/src/apps/hubspot/actions/index.js @@ -0,0 +1,3 @@ +import createContact from './create-contact/index.js'; + +export default [createContact]; diff --git a/packages/backend/src/apps/hubspot/actions/index.ts b/packages/backend/src/apps/hubspot/actions/index.ts deleted file mode 100644 index fe753ed8..00000000 --- a/packages/backend/src/apps/hubspot/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createContact from './create-contact'; - -export default [ createContact ]; diff --git a/packages/backend/src/apps/hubspot/auth/generate-auth-url.js b/packages/backend/src/apps/hubspot/auth/generate-auth-url.js new file mode 100644 index 00000000..3b7bf2e8 --- /dev/null +++ b/packages/backend/src/apps/hubspot/auth/generate-auth-url.js @@ -0,0 +1,19 @@ +import { URLSearchParams } from 'url'; +import scopes from '../common/scopes.js'; + +export default async function generateAuthUrl($) { + const oauthRedirectUrlField = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ); + const callbackUrl = oauthRedirectUrlField.value; + + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId, + redirect_uri: callbackUrl, + scope: scopes.join(' '), + }); + + const url = `https://app.hubspot.com/oauth/authorize?${searchParams.toString()}`; + + await $.auth.set({ url }); +} diff --git a/packages/backend/src/apps/hubspot/auth/generate-auth-url.ts b/packages/backend/src/apps/hubspot/auth/generate-auth-url.ts deleted file mode 100644 index d8f33dd4..00000000 --- a/packages/backend/src/apps/hubspot/auth/generate-auth-url.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import { URLSearchParams } from 'url'; -import scopes from '../common/scopes'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const callbackUrl = oauthRedirectUrlField.value as string; - - const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - redirect_uri: callbackUrl, - scope: scopes.join(' '), - }); - - const url = `https://app.hubspot.com/oauth/authorize?${searchParams.toString()}`; - - await $.auth.set({ url }); -} diff --git a/packages/backend/src/apps/hubspot/auth/index.ts b/packages/backend/src/apps/hubspot/auth/index.js similarity index 75% rename from packages/backend/src/apps/hubspot/auth/index.ts rename to packages/backend/src/apps/hubspot/auth/index.js index c7f57dbf..47f75638 100644 --- a/packages/backend/src/apps/hubspot/auth/index.ts +++ b/packages/backend/src/apps/hubspot/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/hubspot/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/hubspot/auth/is-still-verified.js b/packages/backend/src/apps/hubspot/auth/is-still-verified.js new file mode 100644 index 00000000..7927d274 --- /dev/null +++ b/packages/backend/src/apps/hubspot/auth/is-still-verified.js @@ -0,0 +1,9 @@ +import getAccessTokenInfo from '../common/get-access-token-info.js'; + +const isStillVerified = async ($) => { + await getAccessTokenInfo($); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/hubspot/auth/is-still-verified.ts b/packages/backend/src/apps/hubspot/auth/is-still-verified.ts deleted file mode 100644 index cccd73be..00000000 --- a/packages/backend/src/apps/hubspot/auth/is-still-verified.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getAccessTokenInfo from '../common/get-access-token-info'; - -const isStillVerified = async ($: IGlobalVariable) => { - await getAccessTokenInfo($); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/hubspot/auth/refresh-token.ts b/packages/backend/src/apps/hubspot/auth/refresh-token.js similarity index 54% rename from packages/backend/src/apps/hubspot/auth/refresh-token.ts rename to packages/backend/src/apps/hubspot/auth/refresh-token.js index c1fc8a9d..9afea4e1 100644 --- a/packages/backend/src/apps/hubspot/auth/refresh-token.ts +++ b/packages/backend/src/apps/hubspot/auth/refresh-token.js @@ -1,19 +1,18 @@ -import { IGlobalVariable, IField } from '@automatisch/types'; import { URLSearchParams } from 'url'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const callbackUrl = oauthRedirectUrlField.value as string; + const callbackUrl = oauthRedirectUrlField.value; const params = new URLSearchParams({ grant_type: 'refresh_token', - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, redirect_uri: callbackUrl, - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post('/oauth/v1/token', params.toString()); diff --git a/packages/backend/src/apps/hubspot/auth/verify-credentials.ts b/packages/backend/src/apps/hubspot/auth/verify-credentials.js similarity index 72% rename from packages/backend/src/apps/hubspot/auth/verify-credentials.ts rename to packages/backend/src/apps/hubspot/auth/verify-credentials.js index 130bf171..15e44b4e 100644 --- a/packages/backend/src/apps/hubspot/auth/verify-credentials.ts +++ b/packages/backend/src/apps/hubspot/auth/verify-credentials.js @@ -1,18 +1,17 @@ -import { IGlobalVariable, IField } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import getAccessTokenInfo from '../common/get-access-token-info'; +import getAccessTokenInfo from '../common/get-access-token-info.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const callbackUrl = oauthRedirectUrlField.value as string; + const callbackUrl = oauthRedirectUrlField.value; const params = new URLSearchParams({ grant_type: 'authorization_code', - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, redirect_uri: callbackUrl, - code: $.auth.data.code as string, + code: $.auth.data.code, }); const { data: verifiedCredentials } = await $.http.post( diff --git a/packages/backend/src/apps/hubspot/common/add-auth-header.ts b/packages/backend/src/apps/hubspot/common/add-auth-header.js similarity index 53% rename from packages/backend/src/apps/hubspot/common/add-auth-header.ts rename to packages/backend/src/apps/hubspot/common/add-auth-header.js index d16f394f..38e69094 100644 --- a/packages/backend/src/apps/hubspot/common/add-auth-header.ts +++ b/packages/backend/src/apps/hubspot/common/add-auth-header.js @@ -1,7 +1,6 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if (requestConfig.additionalProperties?.skipAddingAuthHeader) return requestConfig; +const addAuthHeader = ($, requestConfig) => { + if (requestConfig.additionalProperties?.skipAddingAuthHeader) + return requestConfig; if ($.auth.data?.accessToken) { const authorizationHeader = `Bearer ${$.auth.data.accessToken}`; diff --git a/packages/backend/src/apps/hubspot/common/get-access-token-info.ts b/packages/backend/src/apps/hubspot/common/get-access-token-info.js similarity index 52% rename from packages/backend/src/apps/hubspot/common/get-access-token-info.ts rename to packages/backend/src/apps/hubspot/common/get-access-token-info.js index 55ed8ff2..fec4f640 100644 --- a/packages/backend/src/apps/hubspot/common/get-access-token-info.ts +++ b/packages/backend/src/apps/hubspot/common/get-access-token-info.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getAccessTokenInfo = async ($: IGlobalVariable): Promise => { +const getAccessTokenInfo = async ($) => { const response = await $.http.get( `/oauth/v1/access-tokens/${$.auth.data.accessToken}` ); diff --git a/packages/backend/src/apps/hubspot/common/scopes.ts b/packages/backend/src/apps/hubspot/common/scopes.js similarity index 100% rename from packages/backend/src/apps/hubspot/common/scopes.ts rename to packages/backend/src/apps/hubspot/common/scopes.js diff --git a/packages/backend/src/apps/hubspot/index.d.ts b/packages/backend/src/apps/hubspot/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/hubspot/index.ts b/packages/backend/src/apps/hubspot/index.js similarity index 66% rename from packages/backend/src/apps/hubspot/index.ts rename to packages/backend/src/apps/hubspot/index.js index 9f35bade..a9eea629 100644 --- a/packages/backend/src/apps/hubspot/index.ts +++ b/packages/backend/src/apps/hubspot/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import actions from './actions'; -import auth from './auth'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import actions from './actions/index.js'; +import auth from './auth/index.js'; export default defineApp({ name: 'HubSpot', diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-client/fields.ts b/packages/backend/src/apps/invoice-ninja/actions/create-client/fields.js similarity index 96% rename from packages/backend/src/apps/invoice-ninja/actions/create-client/fields.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-client/fields.js index 6655f6ac..419e45bc 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-client/fields.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-client/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Client Name', key: 'clientName', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -10,7 +10,7 @@ export const fields = [ { label: 'Contact First Name', key: 'contactFirstName', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -18,7 +18,7 @@ export const fields = [ { label: 'Contact Last Name', key: 'contactLastName', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -26,7 +26,7 @@ export const fields = [ { label: 'Contact Email', key: 'contactEmail', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -34,7 +34,7 @@ export const fields = [ { label: 'Contact Phone', key: 'contactPhone', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -42,7 +42,7 @@ export const fields = [ { label: 'Language Code', key: 'languageCode', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -92,7 +92,7 @@ export const fields = [ { label: 'Currency Code', key: 'currencyCode', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -220,7 +220,7 @@ export const fields = [ { label: 'Id Number', key: 'idNumber', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -228,7 +228,7 @@ export const fields = [ { label: 'Vat Number', key: 'vatNumber', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -236,7 +236,7 @@ export const fields = [ { label: 'Street Address', key: 'streetAddress', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -244,7 +244,7 @@ export const fields = [ { label: 'Apt/Suite', key: 'aptSuite', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -252,7 +252,7 @@ export const fields = [ { label: 'City', key: 'city', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -260,7 +260,7 @@ export const fields = [ { label: 'State/Province', key: 'stateProvince', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -268,7 +268,7 @@ export const fields = [ { label: 'Postal Code', key: 'postalCode', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -276,7 +276,7 @@ export const fields = [ { label: 'Country Code', key: 'countryCode', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -535,7 +535,7 @@ export const fields = [ { label: 'Shipping Street Address', key: 'shippingStreetAddress', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -543,7 +543,7 @@ export const fields = [ { label: 'Shipping Apt/Suite', key: 'shippingAptSuite', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -551,7 +551,7 @@ export const fields = [ { label: 'Shipping City', key: 'shippingCity', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -559,7 +559,7 @@ export const fields = [ { label: 'Shipping State/Province', key: 'shippingStateProvince', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -567,7 +567,7 @@ export const fields = [ { label: 'Shipping Postal Code', key: 'shippingPostalCode', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -575,7 +575,7 @@ export const fields = [ { label: 'Shipping Country Code', key: 'shippingCountryCode', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -583,7 +583,7 @@ export const fields = [ { label: 'Private Notes', key: 'privateNotes', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -591,7 +591,7 @@ export const fields = [ { label: 'Public Notes', key: 'publicNotes', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -599,7 +599,7 @@ export const fields = [ { label: 'Website', key: 'website', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -607,7 +607,7 @@ export const fields = [ { label: 'Custom Value 1', key: 'customValue1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -615,7 +615,7 @@ export const fields = [ { label: 'Custom Value 2', key: 'customValue2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -623,7 +623,7 @@ export const fields = [ { label: 'Custom Value 3', key: 'customValue3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -631,7 +631,7 @@ export const fields = [ { label: 'Custom Value 4', key: 'customValue4', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-client/index.ts b/packages/backend/src/apps/invoice-ninja/actions/create-client/index.js similarity index 94% rename from packages/backend/src/apps/invoice-ninja/actions/create-client/index.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-client/index.js index b32d7adc..47edb573 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-client/index.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-client/index.js @@ -1,6 +1,6 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; -import { fields } from './fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; +import { fields } from './fields.js'; export default defineAction({ name: 'Create client', diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-invoice/fields.ts b/packages/backend/src/apps/invoice-ninja/actions/create-invoice/fields.js similarity index 83% rename from packages/backend/src/apps/invoice-ninja/actions/create-invoice/fields.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-invoice/fields.js index 68f04ced..f2556ea2 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-invoice/fields.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-invoice/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Client ID', key: 'clientId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The ID of the client, not the name or email address.', variables: true, @@ -20,7 +20,7 @@ export const fields = [ { label: 'Send Email', key: 'sendEmail', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -32,7 +32,7 @@ export const fields = [ { label: 'Mark Sent', key: 'markSent', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Setting this to true creates the invoice as sent.', variables: true, @@ -44,7 +44,7 @@ export const fields = [ { label: 'Paid', key: 'paid', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Setting this to true creates the invoice as paid.', variables: true, @@ -56,7 +56,7 @@ export const fields = [ { label: 'Amount Paid', key: 'amountPaid', - type: 'string' as const, + type: 'string', required: false, description: 'If this value is greater than zero a payment will be created along with the invoice.', @@ -65,7 +65,7 @@ export const fields = [ { label: 'Number', key: 'number', - type: 'string' as const, + type: 'string', required: false, description: 'The invoice number - is a unique alpha numeric number per invoice per company', @@ -74,7 +74,7 @@ export const fields = [ { label: 'Discount', key: 'discount', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -82,7 +82,7 @@ export const fields = [ { label: 'PO Number', key: 'poNumber', - type: 'string' as const, + type: 'string', required: false, description: 'The purchase order associated with this invoice', variables: true, @@ -90,7 +90,7 @@ export const fields = [ { label: 'Date', key: 'date', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -98,7 +98,7 @@ export const fields = [ { label: 'Due Date', key: 'dueDate', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -106,7 +106,7 @@ export const fields = [ { label: 'Tax Rate 1', key: 'taxRate1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -114,7 +114,7 @@ export const fields = [ { label: 'Tax Name 1', key: 'taxName1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -122,7 +122,7 @@ export const fields = [ { label: 'Tax Rate 2', key: 'taxRate2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -130,7 +130,7 @@ export const fields = [ { label: 'Tax Name 2', key: 'taxName2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -138,7 +138,7 @@ export const fields = [ { label: 'Tax Rate 3', key: 'taxRate3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -146,7 +146,7 @@ export const fields = [ { label: 'Tax Name 3', key: 'taxName3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -154,7 +154,7 @@ export const fields = [ { label: 'Custom Field 1', key: 'customField1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -162,7 +162,7 @@ export const fields = [ { label: 'Custom Field 2', key: 'customField2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -170,7 +170,7 @@ export const fields = [ { label: 'Custom Field 3', key: 'customField3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -178,7 +178,7 @@ export const fields = [ { label: 'Custom Field 4', key: 'customField4', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -186,7 +186,7 @@ export const fields = [ { label: 'Custom Surcharge 1', key: 'customSurcharge1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -194,7 +194,7 @@ export const fields = [ { label: 'Custom Surcharge 2', key: 'customSurcharge2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -202,7 +202,7 @@ export const fields = [ { label: 'Custom Surcharge 3', key: 'customSurcharge3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -210,7 +210,7 @@ export const fields = [ { label: 'Custom Surcharge 4', key: 'customSurcharge4', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -218,7 +218,7 @@ export const fields = [ { label: 'Is Amount Discount', key: 'isAmountDiscount', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'By default the discount is applied as a percentage, enabling this applies the discount as a fixed amount.', @@ -231,7 +231,7 @@ export const fields = [ { label: 'Partial/Deposit', key: 'partialDeposit', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -239,7 +239,7 @@ export const fields = [ { label: 'Partial Due Date', key: 'partialDueDate', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -247,7 +247,7 @@ export const fields = [ { label: 'Line Item Cost', key: 'lineItemCost', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -255,7 +255,7 @@ export const fields = [ { label: 'Line Item Quatity', key: 'lineItemQuantity', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -263,7 +263,7 @@ export const fields = [ { label: 'Line Item Product', key: 'lineItemProduct', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -271,7 +271,7 @@ export const fields = [ { label: 'Line Item Discount', key: 'lineItemDiscount', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -279,7 +279,7 @@ export const fields = [ { label: 'Line Item Description', key: 'lineItemDescription', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -287,7 +287,7 @@ export const fields = [ { label: 'Line Item Tax Rate 1', key: 'lineItemTaxRate1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -295,7 +295,7 @@ export const fields = [ { label: 'Line Item Tax Name 1', key: 'lineItemTaxName1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -303,7 +303,7 @@ export const fields = [ { label: 'Line Item Tax Rate 2', key: 'lineItemTaxRate2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -311,7 +311,7 @@ export const fields = [ { label: 'Line Item Tax Name 2', key: 'lineItemTaxName2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -319,7 +319,7 @@ export const fields = [ { label: 'Line Item Tax Rate 3', key: 'lineItemTaxRate3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -327,7 +327,7 @@ export const fields = [ { label: 'Line Item Tax Name 3', key: 'lineItemTaxName3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -335,7 +335,7 @@ export const fields = [ { label: 'Line Item Custom Field 1', key: 'lineItemCustomField1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -343,7 +343,7 @@ export const fields = [ { label: 'Line Item Custom Field 2', key: 'lineItemCustomField2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -351,7 +351,7 @@ export const fields = [ { label: 'Line Item Custom Field 3', key: 'lineItemCustomField3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -359,7 +359,7 @@ export const fields = [ { label: 'Line Item Custom Field 4', key: 'lineItemCustomField4', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -367,7 +367,7 @@ export const fields = [ { label: 'Line Item Product Cost', key: 'lineItemProductCost', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -375,7 +375,7 @@ export const fields = [ { label: 'Public Notes', key: 'publicNotes', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -383,7 +383,7 @@ export const fields = [ { label: 'Private Notes', key: 'privateNotes', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -391,7 +391,7 @@ export const fields = [ { label: 'Terms', key: 'terms', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -399,7 +399,7 @@ export const fields = [ { label: 'Footer', key: 'footer', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-invoice/index.ts b/packages/backend/src/apps/invoice-ninja/actions/create-invoice/index.js similarity index 96% rename from packages/backend/src/apps/invoice-ninja/actions/create-invoice/index.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-invoice/index.js index b357d440..7915ebfc 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-invoice/index.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-invoice/index.js @@ -1,6 +1,6 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; -import { fields } from './fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; +import { fields } from './fields.js'; export default defineAction({ name: 'Create invoice', diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-payment/fields.ts b/packages/backend/src/apps/invoice-ninja/actions/create-payment/fields.js similarity index 92% rename from packages/backend/src/apps/invoice-ninja/actions/create-payment/fields.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-payment/fields.js index ba9ec5f6..608b89fd 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-payment/fields.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-payment/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Client ID', key: 'clientId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The ID of the client, not the name or email address.', variables: true, @@ -20,7 +20,7 @@ export const fields = [ { label: 'Payment Date', key: 'paymentDate', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -28,7 +28,7 @@ export const fields = [ { label: 'Invoice', key: 'invoiceId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -46,7 +46,7 @@ export const fields = [ { label: 'Invoice Amount', key: 'invoiceAmount', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -54,7 +54,7 @@ export const fields = [ { label: 'Payment Type', key: 'paymentType', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -95,7 +95,7 @@ export const fields = [ { label: 'Transfer Reference', key: 'transferReference', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -103,7 +103,7 @@ export const fields = [ { label: 'Private Notes', key: 'privateNotes', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-payment/index.ts b/packages/backend/src/apps/invoice-ninja/actions/create-payment/index.js similarity index 88% rename from packages/backend/src/apps/invoice-ninja/actions/create-payment/index.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-payment/index.js index 54a87eef..4d4ea080 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-payment/index.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-payment/index.js @@ -1,6 +1,6 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; -import { fields } from './fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; +import { fields } from './fields.js'; export default defineAction({ name: 'Create payment', diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-product/fields.ts b/packages/backend/src/apps/invoice-ninja/actions/create-product/fields.js similarity index 80% rename from packages/backend/src/apps/invoice-ninja/actions/create-product/fields.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-product/fields.js index 0c76196d..87b5fecc 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-product/fields.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-product/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Product Key', key: 'productKey', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -10,7 +10,7 @@ export const fields = [ { label: 'Notes', key: 'notes', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -18,7 +18,7 @@ export const fields = [ { label: 'Price', key: 'price', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -26,7 +26,7 @@ export const fields = [ { label: 'Quantity', key: 'quantity', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -34,7 +34,7 @@ export const fields = [ { label: 'Tax Rate 1', key: 'taxRate1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -42,7 +42,7 @@ export const fields = [ { label: 'Tax Name 1', key: 'taxName1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -50,7 +50,7 @@ export const fields = [ { label: 'Tax Rate 2', key: 'taxRate2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -58,7 +58,7 @@ export const fields = [ { label: 'Tax Name 2', key: 'taxName2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -66,7 +66,7 @@ export const fields = [ { label: 'Tax Rate 3', key: 'taxRate3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -74,7 +74,7 @@ export const fields = [ { label: 'Tax Name 3', key: 'taxName3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -82,7 +82,7 @@ export const fields = [ { label: 'Custom Value 1', key: 'customValue1', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -90,7 +90,7 @@ export const fields = [ { label: 'Custom Value 2', key: 'customValue2', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -98,7 +98,7 @@ export const fields = [ { label: 'Custom Value 3', key: 'customValue3', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -106,7 +106,7 @@ export const fields = [ { label: 'Custom Value 4', key: 'customValue4', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, diff --git a/packages/backend/src/apps/invoice-ninja/actions/create-product/index.ts b/packages/backend/src/apps/invoice-ninja/actions/create-product/index.js similarity index 90% rename from packages/backend/src/apps/invoice-ninja/actions/create-product/index.ts rename to packages/backend/src/apps/invoice-ninja/actions/create-product/index.js index d84d8232..5fa6dd6a 100644 --- a/packages/backend/src/apps/invoice-ninja/actions/create-product/index.ts +++ b/packages/backend/src/apps/invoice-ninja/actions/create-product/index.js @@ -1,6 +1,6 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; -import { fields } from './fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; +import { fields } from './fields.js'; export default defineAction({ name: 'Create product', diff --git a/packages/backend/src/apps/invoice-ninja/actions/index.js b/packages/backend/src/apps/invoice-ninja/actions/index.js new file mode 100644 index 00000000..36d38214 --- /dev/null +++ b/packages/backend/src/apps/invoice-ninja/actions/index.js @@ -0,0 +1,6 @@ +import createClient from './create-client/index.js'; +import createInvoice from './create-invoice/index.js'; +import createPayment from './create-payment/index.js'; +import createProduct from './create-product/index.js'; + +export default [createClient, createInvoice, createPayment, createProduct]; diff --git a/packages/backend/src/apps/invoice-ninja/actions/index.ts b/packages/backend/src/apps/invoice-ninja/actions/index.ts deleted file mode 100644 index 8a1bff38..00000000 --- a/packages/backend/src/apps/invoice-ninja/actions/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import createClient from './create-client'; -import createInvoice from './create-invoice'; -import createPayment from './create-payment'; -import createProduct from './create-product'; - -export default [createClient, createInvoice, createPayment, createProduct]; diff --git a/packages/backend/src/apps/invoice-ninja/auth/index.ts b/packages/backend/src/apps/invoice-ninja/auth/index.js similarity index 79% rename from packages/backend/src/apps/invoice-ninja/auth/index.ts rename to packages/backend/src/apps/invoice-ninja/auth/index.js index 7b86fb5e..4e9a78ca 100644 --- a/packages/backend/src/apps/invoice-ninja/auth/index.ts +++ b/packages/backend/src/apps/invoice-ninja/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'apiToken', label: 'API Token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'instanceUrl', label: 'Invoice Ninja instance URL (optional)', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: null, diff --git a/packages/backend/src/apps/invoice-ninja/auth/is-still-verified.js b/packages/backend/src/apps/invoice-ninja/auth/is-still-verified.js new file mode 100644 index 00000000..270d415b --- /dev/null +++ b/packages/backend/src/apps/invoice-ninja/auth/is-still-verified.js @@ -0,0 +1,9 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/invoice-ninja/auth/is-still-verified.ts b/packages/backend/src/apps/invoice-ninja/auth/is-still-verified.ts deleted file mode 100644 index 5a2fe2ae..00000000 --- a/packages/backend/src/apps/invoice-ninja/auth/is-still-verified.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/invoice-ninja/auth/verify-credentials.ts b/packages/backend/src/apps/invoice-ninja/auth/verify-credentials.js similarity index 66% rename from packages/backend/src/apps/invoice-ninja/auth/verify-credentials.ts rename to packages/backend/src/apps/invoice-ninja/auth/verify-credentials.js index cba2c60f..371876cb 100644 --- a/packages/backend/src/apps/invoice-ninja/auth/verify-credentials.ts +++ b/packages/backend/src/apps/invoice-ninja/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const { data } = await $.http.get('/v1/ping'); const screenName = [data.user_name, data.company_name] diff --git a/packages/backend/src/apps/invoice-ninja/common/add-auth-header.ts b/packages/backend/src/apps/invoice-ninja/common/add-auth-header.js similarity index 55% rename from packages/backend/src/apps/invoice-ninja/common/add-auth-header.ts rename to packages/backend/src/apps/invoice-ninja/common/add-auth-header.js index ca5ca292..a9bb7341 100644 --- a/packages/backend/src/apps/invoice-ninja/common/add-auth-header.ts +++ b/packages/backend/src/apps/invoice-ninja/common/add-auth-header.js @@ -1,13 +1,11 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { instanceUrl } = $.auth.data; if (instanceUrl) { - requestConfig.baseURL = instanceUrl as string; + requestConfig.baseURL = instanceUrl; } - requestConfig.headers['X-API-TOKEN'] = $.auth.data.apiToken as string; + requestConfig.headers['X-API-TOKEN'] = $.auth.data.apiToken; requestConfig.headers['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/packages/backend/src/apps/invoice-ninja/common/filter-provided-fields.js b/packages/backend/src/apps/invoice-ninja/common/filter-provided-fields.js new file mode 100644 index 00000000..ceff6e22 --- /dev/null +++ b/packages/backend/src/apps/invoice-ninja/common/filter-provided-fields.js @@ -0,0 +1,18 @@ +import isObject from 'lodash/isObject.js'; + +export function filterProvidedFields(body) { + return Object.keys(body).reduce((result, key) => { + const value = body[key]; + + if (isObject(value)) { + const filteredNestedObj = filterProvidedFields(value); + if (Object.keys(filteredNestedObj).length > 0) { + result[key] = filteredNestedObj; + } + } else if (body[key]) { + result[key] = value; + } + + return result; + }, {}); +} diff --git a/packages/backend/src/apps/invoice-ninja/common/filter-provided-fields.ts b/packages/backend/src/apps/invoice-ninja/common/filter-provided-fields.ts deleted file mode 100644 index fa88c8ee..00000000 --- a/packages/backend/src/apps/invoice-ninja/common/filter-provided-fields.ts +++ /dev/null @@ -1,18 +0,0 @@ -import isObject from 'lodash/isObject'; - -export function filterProvidedFields(body: Record) { - return Object.keys(body).reduce>((result, key) => { - const value = body[key]; - if (isObject(value)) { - const filteredNestedObj = filterProvidedFields( - value as Record - ); - if (Object.keys(filteredNestedObj).length > 0) { - result[key] = filteredNestedObj; - } - } else if (body[key]) { - result[key] = value; - } - return result; - }, {}); -} diff --git a/packages/backend/src/apps/invoice-ninja/common/set-base-url.js b/packages/backend/src/apps/invoice-ninja/common/set-base-url.js new file mode 100644 index 00000000..fc3252af --- /dev/null +++ b/packages/backend/src/apps/invoice-ninja/common/set-base-url.js @@ -0,0 +1,11 @@ +const setBaseUrl = ($, requestConfig) => { + const instanceUrl = $.auth.data.instanceUrl; + + if (instanceUrl) { + requestConfig.baseURL = instanceUrl; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/invoice-ninja/common/set-base-url.ts b/packages/backend/src/apps/invoice-ninja/common/set-base-url.ts deleted file mode 100644 index 8bf8cd9e..00000000 --- a/packages/backend/src/apps/invoice-ninja/common/set-base-url.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - const instanceUrl = $.auth.data.instanceUrl as string; - - if (instanceUrl) { - requestConfig.baseURL = instanceUrl; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/invoice-ninja/dynamic-data/index.js b/packages/backend/src/apps/invoice-ninja/dynamic-data/index.js new file mode 100644 index 00000000..b3ef2269 --- /dev/null +++ b/packages/backend/src/apps/invoice-ninja/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listClients from './list-clients/index.js'; +import listInvoices from './list-invoices/index.js'; + +export default [listClients, listInvoices]; diff --git a/packages/backend/src/apps/invoice-ninja/dynamic-data/index.ts b/packages/backend/src/apps/invoice-ninja/dynamic-data/index.ts deleted file mode 100644 index 172f6d24..00000000 --- a/packages/backend/src/apps/invoice-ninja/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listClients from './list-clients'; -import listInvoices from './list-invoices'; - -export default [listClients, listInvoices]; diff --git a/packages/backend/src/apps/invoice-ninja/dynamic-data/list-clients/index.ts b/packages/backend/src/apps/invoice-ninja/dynamic-data/list-clients/index.js similarity index 73% rename from packages/backend/src/apps/invoice-ninja/dynamic-data/list-clients/index.ts rename to packages/backend/src/apps/invoice-ninja/dynamic-data/list-clients/index.js index 2e3402ff..512ebda1 100644 --- a/packages/backend/src/apps/invoice-ninja/dynamic-data/list-clients/index.ts +++ b/packages/backend/src/apps/invoice-ninja/dynamic-data/list-clients/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List clients', key: 'listClients', - async run($: IGlobalVariable) { - const clients: { - data: IJSONObject[]; - } = { + async run($) { + const clients = { data: [], }; diff --git a/packages/backend/src/apps/invoice-ninja/dynamic-data/list-invoices/index.ts b/packages/backend/src/apps/invoice-ninja/dynamic-data/list-invoices/index.js similarity index 73% rename from packages/backend/src/apps/invoice-ninja/dynamic-data/list-invoices/index.ts rename to packages/backend/src/apps/invoice-ninja/dynamic-data/list-invoices/index.js index ac7b5107..15b6d062 100644 --- a/packages/backend/src/apps/invoice-ninja/dynamic-data/list-invoices/index.ts +++ b/packages/backend/src/apps/invoice-ninja/dynamic-data/list-invoices/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List invoices', key: 'listInvoices', - async run($: IGlobalVariable) { - const invoices: { - data: IJSONObject[]; - } = { + async run($) { + const invoices = { data: [], }; diff --git a/packages/backend/src/apps/invoice-ninja/index.d.ts b/packages/backend/src/apps/invoice-ninja/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/invoice-ninja/index.ts b/packages/backend/src/apps/invoice-ninja/index.js similarity index 57% rename from packages/backend/src/apps/invoice-ninja/index.ts rename to packages/backend/src/apps/invoice-ninja/index.js index c0797909..ecf1e5e4 100644 --- a/packages/backend/src/apps/invoice-ninja/index.ts +++ b/packages/backend/src/apps/invoice-ninja/index.js @@ -1,10 +1,10 @@ -import defineApp from '../../helpers/define-app'; -import setBaseUrl from './common/set-base-url'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import setBaseUrl from './common/set-base-url.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Invoice Ninja', diff --git a/packages/backend/src/apps/invoice-ninja/triggers/index.js b/packages/backend/src/apps/invoice-ninja/triggers/index.js new file mode 100644 index 00000000..8293af88 --- /dev/null +++ b/packages/backend/src/apps/invoice-ninja/triggers/index.js @@ -0,0 +1,15 @@ +import newClients from './new-clients/index.js'; +import newCredits from './new-credits/index.js'; +import newInvoices from './new-invoices/index.js'; +import newPayments from './new-payments/index.js'; +import newProjects from './new-projects/index.js'; +import newQuotes from './new-quotes/index.js'; + +export default [ + newClients, + newCredits, + newInvoices, + newPayments, + newProjects, + newQuotes, +]; diff --git a/packages/backend/src/apps/invoice-ninja/triggers/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/index.ts deleted file mode 100644 index e3b58716..00000000 --- a/packages/backend/src/apps/invoice-ninja/triggers/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import newClients from './new-clients'; -import newCredits from './new-credits'; -import newInvoices from './new-invoices'; -import newPayments from './new-payments'; -import newProjects from './new-projects'; -import newQuotes from './new-quotes'; - -export default [ - newClients, - newCredits, - newInvoices, - newPayments, - newProjects, - newQuotes, -]; diff --git a/packages/backend/src/apps/invoice-ninja/triggers/new-clients/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/new-clients/index.js similarity index 76% rename from packages/backend/src/apps/invoice-ninja/triggers/new-clients/index.ts rename to packages/backend/src/apps/invoice-ninja/triggers/new-clients/index.js index 72944212..608541d5 100644 --- a/packages/backend/src/apps/invoice-ninja/triggers/new-clients/index.ts +++ b/packages/backend/src/apps/invoice-ninja/triggers/new-clients/index.js @@ -1,17 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; - -type Response = { - data: { - data: { - id: string; - event_id: string; - target_url: string; - format: string; - }; - }; -}; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New clients', @@ -54,7 +43,7 @@ export default defineTrigger({ rest_method: 'post', }; - const response: Response = await $.http.post('/v1/webhooks', payload); + const response = await $.http.post('/v1/webhooks', payload); await $.flow.setRemoteWebhookId(response.data.data.id); }, diff --git a/packages/backend/src/apps/invoice-ninja/triggers/new-credits/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/new-credits/index.js similarity index 76% rename from packages/backend/src/apps/invoice-ninja/triggers/new-credits/index.ts rename to packages/backend/src/apps/invoice-ninja/triggers/new-credits/index.js index ee8891f1..13af3438 100644 --- a/packages/backend/src/apps/invoice-ninja/triggers/new-credits/index.ts +++ b/packages/backend/src/apps/invoice-ninja/triggers/new-credits/index.js @@ -1,17 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; - -type Response = { - data: { - data: { - id: string; - event_id: string; - target_url: string; - format: string; - }; - }; -}; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New credits', @@ -54,7 +43,7 @@ export default defineTrigger({ rest_method: 'post', }; - const response: Response = await $.http.post('/v1/webhooks', payload); + const response = await $.http.post('/v1/webhooks', payload); await $.flow.setRemoteWebhookId(response.data.data.id); }, diff --git a/packages/backend/src/apps/invoice-ninja/triggers/new-invoices/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/new-invoices/index.js similarity index 76% rename from packages/backend/src/apps/invoice-ninja/triggers/new-invoices/index.ts rename to packages/backend/src/apps/invoice-ninja/triggers/new-invoices/index.js index 427567b9..92e130f9 100644 --- a/packages/backend/src/apps/invoice-ninja/triggers/new-invoices/index.ts +++ b/packages/backend/src/apps/invoice-ninja/triggers/new-invoices/index.js @@ -1,17 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; - -type Response = { - data: { - data: { - id: string; - event_id: string; - target_url: string; - format: string; - }; - }; -}; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New invoices', @@ -54,7 +43,7 @@ export default defineTrigger({ rest_method: 'post', }; - const response: Response = await $.http.post('/v1/webhooks', payload); + const response = await $.http.post('/v1/webhooks', payload); await $.flow.setRemoteWebhookId(response.data.data.id); }, diff --git a/packages/backend/src/apps/invoice-ninja/triggers/new-payments/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/new-payments/index.js similarity index 76% rename from packages/backend/src/apps/invoice-ninja/triggers/new-payments/index.ts rename to packages/backend/src/apps/invoice-ninja/triggers/new-payments/index.js index 0ac897d7..c5058673 100644 --- a/packages/backend/src/apps/invoice-ninja/triggers/new-payments/index.ts +++ b/packages/backend/src/apps/invoice-ninja/triggers/new-payments/index.js @@ -1,17 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; - -type Response = { - data: { - data: { - id: string; - event_id: string; - target_url: string; - format: string; - }; - }; -}; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New payments', @@ -54,7 +43,7 @@ export default defineTrigger({ rest_method: 'post', }; - const response: Response = await $.http.post('/v1/webhooks', payload); + const response = await $.http.post('/v1/webhooks', payload); await $.flow.setRemoteWebhookId(response.data.data.id); }, diff --git a/packages/backend/src/apps/invoice-ninja/triggers/new-projects/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/new-projects/index.js similarity index 76% rename from packages/backend/src/apps/invoice-ninja/triggers/new-projects/index.ts rename to packages/backend/src/apps/invoice-ninja/triggers/new-projects/index.js index 1130ff3f..5f6b64d8 100644 --- a/packages/backend/src/apps/invoice-ninja/triggers/new-projects/index.ts +++ b/packages/backend/src/apps/invoice-ninja/triggers/new-projects/index.js @@ -1,17 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; - -type Response = { - data: { - data: { - id: string; - event_id: string; - target_url: string; - format: string; - }; - }; -}; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New projects', @@ -54,7 +43,7 @@ export default defineTrigger({ rest_method: 'post', }; - const response: Response = await $.http.post('/v1/webhooks', payload); + const response = await $.http.post('/v1/webhooks', payload); await $.flow.setRemoteWebhookId(response.data.data.id); }, diff --git a/packages/backend/src/apps/invoice-ninja/triggers/new-quotes/index.ts b/packages/backend/src/apps/invoice-ninja/triggers/new-quotes/index.js similarity index 76% rename from packages/backend/src/apps/invoice-ninja/triggers/new-quotes/index.ts rename to packages/backend/src/apps/invoice-ninja/triggers/new-quotes/index.js index 531264bf..d2398d45 100644 --- a/packages/backend/src/apps/invoice-ninja/triggers/new-quotes/index.ts +++ b/packages/backend/src/apps/invoice-ninja/triggers/new-quotes/index.js @@ -1,17 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; - -type Response = { - data: { - data: { - id: string; - event_id: string; - target_url: string; - format: string; - }; - }; -}; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New quotes', @@ -54,7 +43,7 @@ export default defineTrigger({ rest_method: 'post', }; - const response: Response = await $.http.post('/v1/webhooks', payload); + const response = await $.http.post('/v1/webhooks', payload); await $.flow.setRemoteWebhookId(response.data.data.id); }, diff --git a/packages/backend/src/apps/mattermost/actions/index.js b/packages/backend/src/apps/mattermost/actions/index.js new file mode 100644 index 00000000..93ee03b1 --- /dev/null +++ b/packages/backend/src/apps/mattermost/actions/index.js @@ -0,0 +1,3 @@ +import sendMessageToChannel from './send-a-message-to-channel/index.js'; + +export default [sendMessageToChannel]; diff --git a/packages/backend/src/apps/mattermost/actions/index.ts b/packages/backend/src/apps/mattermost/actions/index.ts deleted file mode 100644 index d28a6432..00000000 --- a/packages/backend/src/apps/mattermost/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendMessageToChannel from './send-a-message-to-channel'; - -export default [sendMessageToChannel]; diff --git a/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/index.ts b/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/index.js similarity index 82% rename from packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/index.ts rename to packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/index.js index 39734a99..30cdc4be 100644 --- a/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/index.ts +++ b/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import postMessage from './post-message'; +import defineAction from '../../../../helpers/define-action.js'; +import postMessage from './post-message.js'; export default defineAction({ name: 'Send a message to channel', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Channel', key: 'channel', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick a channel to send the message to.', variables: true, @@ -27,7 +27,7 @@ export default defineAction({ { label: 'Message text', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The content of your new message.', variables: true, diff --git a/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/post-message.js b/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/post-message.js new file mode 100644 index 00000000..e4a915de --- /dev/null +++ b/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/post-message.js @@ -0,0 +1,20 @@ +const postMessage = async ($) => { + const { parameters } = $.step; + const channel_id = parameters.channel; + const message = parameters.message; + + const data = { + channel_id, + message, + }; + + const response = await $.http.post('/api/v4/posts', data); + + const actionData = { + raw: response?.data, + }; + + $.setActionItem(actionData); +}; + +export default postMessage; diff --git a/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/post-message.ts b/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/post-message.ts deleted file mode 100644 index 86bb7586..00000000 --- a/packages/backend/src/apps/mattermost/actions/send-a-message-to-channel/post-message.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type TData = { - channel_id: string; - message: string; -}; - -const postMessage = async ($: IGlobalVariable) => { - const { parameters } = $.step; - const channel_id = parameters.channel as string; - const message = parameters.message as string; - - const data: TData = { - channel_id, - message, - }; - - const response = await $.http.post('/api/v4/posts', data); - - const actionData = { - raw: response?.data, - }; - - $.setActionItem(actionData); -}; - -export default postMessage; diff --git a/packages/backend/src/apps/mattermost/auth/generate-auth-url.ts b/packages/backend/src/apps/mattermost/auth/generate-auth-url.js similarity index 51% rename from packages/backend/src/apps/mattermost/auth/generate-auth-url.ts rename to packages/backend/src/apps/mattermost/auth/generate-auth-url.js index a497e54a..ba9b1ac6 100644 --- a/packages/backend/src/apps/mattermost/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/mattermost/auth/generate-auth-url.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URL, URLSearchParams } from 'url'; -import getBaseUrl from '../common/get-base-url'; +import getBaseUrl from '../common/get-base-url.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - redirect_uri: $.auth.data.oAuthRedirectUrl as string, + client_id: $.auth.data.clientId, + redirect_uri: $.auth.data.oAuthRedirectUrl, response_type: 'code', }); diff --git a/packages/backend/src/apps/mattermost/auth/index.ts b/packages/backend/src/apps/mattermost/auth/index.js similarity index 79% rename from packages/backend/src/apps/mattermost/auth/index.ts rename to packages/backend/src/apps/mattermost/auth/index.js index 853cf1eb..4dd50ae0 100644 --- a/packages/backend/src/apps/mattermost/auth/index.ts +++ b/packages/backend/src/apps/mattermost/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/mattermost/connections/add', @@ -19,7 +19,7 @@ export default { { key: 'instanceUrl', label: 'Mattermost instance URL', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: null, @@ -30,7 +30,7 @@ export default { { key: 'clientId', label: 'Client id', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -41,7 +41,7 @@ export default { { key: 'clientSecret', label: 'Client secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/mattermost/auth/is-still-verified.js b/packages/backend/src/apps/mattermost/auth/is-still-verified.js new file mode 100644 index 00000000..1b9d46d0 --- /dev/null +++ b/packages/backend/src/apps/mattermost/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/mattermost/auth/is-still-verified.ts b/packages/backend/src/apps/mattermost/auth/is-still-verified.ts deleted file mode 100644 index befb7694..00000000 --- a/packages/backend/src/apps/mattermost/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/mattermost/auth/verify-credentials.ts b/packages/backend/src/apps/mattermost/auth/verify-credentials.js similarity index 81% rename from packages/backend/src/apps/mattermost/auth/verify-credentials.ts rename to packages/backend/src/apps/mattermost/auth/verify-credentials.js index da0538ea..e5c8396f 100644 --- a/packages/backend/src/apps/mattermost/auth/verify-credentials.ts +++ b/packages/backend/src/apps/mattermost/auth/verify-credentials.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const params = { client_id: $.auth.data.clientId, client_secret: $.auth.data.clientSecret, diff --git a/packages/backend/src/apps/gitlab/common/add-auth-header.ts b/packages/backend/src/apps/mattermost/common/add-auth-header.js similarity index 66% rename from packages/backend/src/apps/gitlab/common/add-auth-header.ts rename to packages/backend/src/apps/mattermost/common/add-auth-header.js index 9b8e2ab3..b44932c5 100644 --- a/packages/backend/src/apps/gitlab/common/add-auth-header.ts +++ b/packages/backend/src/apps/mattermost/common/add-auth-header.js @@ -1,10 +1,9 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { requestConfig.headers = requestConfig.headers || {}; requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`; } + return requestConfig; }; diff --git a/packages/backend/src/apps/mattermost/common/add-x-requested-with-header.ts b/packages/backend/src/apps/mattermost/common/add-x-requested-with-header.js similarity index 72% rename from packages/backend/src/apps/mattermost/common/add-x-requested-with-header.ts rename to packages/backend/src/apps/mattermost/common/add-x-requested-with-header.js index 65d89643..2e232874 100644 --- a/packages/backend/src/apps/mattermost/common/add-x-requested-with-header.ts +++ b/packages/backend/src/apps/mattermost/common/add-x-requested-with-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addXRequestedWithHeader: TBeforeRequest = ($, requestConfig) => { +const addXRequestedWithHeader = ($, requestConfig) => { // This is not documented yet required // ref. https://forum.mattermost.com/t/solved-invalid-or-expired-session-please-login-again/6772 requestConfig.headers = requestConfig.headers || {}; diff --git a/packages/backend/src/apps/mattermost/common/get-base-url.js b/packages/backend/src/apps/mattermost/common/get-base-url.js new file mode 100644 index 00000000..8ba13c4d --- /dev/null +++ b/packages/backend/src/apps/mattermost/common/get-base-url.js @@ -0,0 +1,5 @@ +const getBaseUrl = ($) => { + return $.auth.data.instanceUrl; +}; + +export default getBaseUrl; diff --git a/packages/backend/src/apps/mattermost/common/get-base-url.ts b/packages/backend/src/apps/mattermost/common/get-base-url.ts deleted file mode 100644 index 77538eca..00000000 --- a/packages/backend/src/apps/mattermost/common/get-base-url.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getBaseUrl = ($: IGlobalVariable): string => { - return $.auth.data.instanceUrl as string; -}; - -export default getBaseUrl; diff --git a/packages/backend/src/apps/mattermost/common/get-current-user.ts b/packages/backend/src/apps/mattermost/common/get-current-user.js similarity index 51% rename from packages/backend/src/apps/mattermost/common/get-current-user.ts rename to packages/backend/src/apps/mattermost/common/get-current-user.js index c6f42624..84286c28 100644 --- a/packages/backend/src/apps/mattermost/common/get-current-user.ts +++ b/packages/backend/src/apps/mattermost/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/api/v4/users/me'); const currentUser = response.data; return currentUser; diff --git a/packages/backend/src/apps/mattermost/common/set-base-url.js b/packages/backend/src/apps/mattermost/common/set-base-url.js new file mode 100644 index 00000000..af904f7d --- /dev/null +++ b/packages/backend/src/apps/mattermost/common/set-base-url.js @@ -0,0 +1,7 @@ +const setBaseUrl = ($, requestConfig) => { + requestConfig.baseURL = $.auth.data.instanceUrl; + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/mattermost/common/set-base-url.ts b/packages/backend/src/apps/mattermost/common/set-base-url.ts deleted file mode 100644 index 8f3aab56..00000000 --- a/packages/backend/src/apps/mattermost/common/set-base-url.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - requestConfig.baseURL = $.auth.data.instanceUrl as string; - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/mattermost/dynamic-data/index.js b/packages/backend/src/apps/mattermost/dynamic-data/index.js new file mode 100644 index 00000000..4305d611 --- /dev/null +++ b/packages/backend/src/apps/mattermost/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listChannels from './list-channels/index.js'; + +export default [listChannels]; diff --git a/packages/backend/src/apps/mattermost/dynamic-data/index.ts b/packages/backend/src/apps/mattermost/dynamic-data/index.ts deleted file mode 100644 index fae496fc..00000000 --- a/packages/backend/src/apps/mattermost/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listChannels from './list-channels'; - -export default [listChannels]; diff --git a/packages/backend/src/apps/mattermost/dynamic-data/list-channels/index.js b/packages/backend/src/apps/mattermost/dynamic-data/list-channels/index.js new file mode 100644 index 00000000..ab904c9e --- /dev/null +++ b/packages/backend/src/apps/mattermost/dynamic-data/list-channels/index.js @@ -0,0 +1,22 @@ +export default { + name: 'List channels', + key: 'listChannels', + + async run($) { + const channels = { + data: [], + error: null, + }; + + const response = await $.http.get('/api/v4/users/me/channels'); // this endpoint will return only channels user joined, there is no endpoint to list all channels available for user + + for (const channel of response.data) { + channels.data.push({ + value: channel.id, + name: channel.display_name || channel.id, // it's possible for channel to not have any name thus falling back to using id + }); + } + + return channels; + }, +}; diff --git a/packages/backend/src/apps/mattermost/dynamic-data/list-channels/index.ts b/packages/backend/src/apps/mattermost/dynamic-data/list-channels/index.ts deleted file mode 100644 index 35cde864..00000000 --- a/packages/backend/src/apps/mattermost/dynamic-data/list-channels/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type TChannel = { - id: string; - display_name: string; -}; - -type TResponse = { - data: TChannel[]; -}; - -export default { - name: 'List channels', - key: 'listChannels', - - async run($: IGlobalVariable) { - const channels: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { - data: [], - error: null, - }; - - const response: TResponse = await $.http.get('/api/v4/users/me/channels'); // this endpoint will return only channels user joined, there is no endpoint to list all channels available for user - - for (const channel of response.data) { - channels.data.push({ - value: channel.id as string, - name: (channel.display_name as string) || (channel.id as string), // it's possible for channel to not have any name thus falling back to using id - }); - } - - return channels; - }, -}; diff --git a/packages/backend/src/apps/mattermost/index.d.ts b/packages/backend/src/apps/mattermost/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/mattermost/index.ts b/packages/backend/src/apps/mattermost/index.js similarity index 66% rename from packages/backend/src/apps/mattermost/index.ts rename to packages/backend/src/apps/mattermost/index.js index 91a75b8e..309ff0b4 100644 --- a/packages/backend/src/apps/mattermost/index.ts +++ b/packages/backend/src/apps/mattermost/index.js @@ -1,10 +1,10 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import addXRequestedWithHeader from './common/add-x-requested-with-header'; -import setBaseUrl from './common/set-base-url'; -import auth from './auth'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import addXRequestedWithHeader from './common/add-x-requested-with-header.js'; +import setBaseUrl from './common/set-base-url.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Mattermost', diff --git a/packages/backend/src/apps/miro/actions/copy-board/index.ts b/packages/backend/src/apps/miro/actions/copy-board/index.js similarity index 92% rename from packages/backend/src/apps/miro/actions/copy-board/index.ts rename to packages/backend/src/apps/miro/actions/copy-board/index.js index c88942d4..201a4255 100644 --- a/packages/backend/src/apps/miro/actions/copy-board/index.ts +++ b/packages/backend/src/apps/miro/actions/copy-board/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Copy board', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Original board', key: 'originalBoard', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The board that you want to copy.', variables: true, @@ -26,7 +26,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: 'Title for the board.', variables: true, @@ -34,7 +34,7 @@ export default defineAction({ { label: 'Description', key: 'description', - type: 'string' as const, + type: 'string', required: false, description: 'Description of the board.', variables: true, @@ -42,7 +42,7 @@ export default defineAction({ { label: 'Team Access', key: 'teamAccess', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Team access to the board. Can be private, view, comment or edit. Default: private.', @@ -69,7 +69,7 @@ export default defineAction({ { label: 'Access Via Link', key: 'accessViaLink', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Access to the board by link. Can be private, view, comment. Default: private.', diff --git a/packages/backend/src/apps/miro/actions/create-board/index.ts b/packages/backend/src/apps/miro/actions/create-board/index.js similarity index 92% rename from packages/backend/src/apps/miro/actions/create-board/index.ts rename to packages/backend/src/apps/miro/actions/create-board/index.js index 435139b5..6633c6d3 100644 --- a/packages/backend/src/apps/miro/actions/create-board/index.ts +++ b/packages/backend/src/apps/miro/actions/create-board/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create board', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: 'Title for the board.', variables: true, @@ -16,7 +16,7 @@ export default defineAction({ { label: 'Description', key: 'description', - type: 'string' as const, + type: 'string', required: false, description: 'Description of the board.', variables: true, @@ -24,7 +24,7 @@ export default defineAction({ { label: 'Team Access', key: 'teamAccess', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Team access to the board. Can be private, view, comment or edit. Default: private.', @@ -51,7 +51,7 @@ export default defineAction({ { label: 'Access Via Link', key: 'accessViaLink', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Access to the board by link. Can be private, view, comment. Default: private.', diff --git a/packages/backend/src/apps/miro/actions/create-card-widget/index.ts b/packages/backend/src/apps/miro/actions/create-card-widget/index.js similarity index 82% rename from packages/backend/src/apps/miro/actions/create-card-widget/index.ts rename to packages/backend/src/apps/miro/actions/create-card-widget/index.js index c1cb4746..b319694c 100644 --- a/packages/backend/src/apps/miro/actions/create-card-widget/index.ts +++ b/packages/backend/src/apps/miro/actions/create-card-widget/index.js @@ -1,18 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; - -type Body = { - data: { - title: string; - description?: string; - dueDate?: string; - }; - style?: { - cardTheme?: string; - }; - parent: { - id: string; - }; -}; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create card widget', @@ -22,7 +8,7 @@ export default defineAction({ { label: 'Board', key: 'boardId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: '', variables: true, @@ -40,7 +26,7 @@ export default defineAction({ { label: 'Frame', key: 'frameId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.boardId'], description: @@ -64,7 +50,7 @@ export default defineAction({ { label: 'Card Title', key: 'cardTitle', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -72,7 +58,7 @@ export default defineAction({ { label: 'Card Title Link', key: 'cardTitleLink', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -80,7 +66,7 @@ export default defineAction({ { label: 'Card Description', key: 'cardDescription', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -88,7 +74,7 @@ export default defineAction({ { label: 'Card Due Date', key: 'cardDueDate', - type: 'string' as const, + type: 'string', required: false, description: 'format: date-time. Example value: 2023-10-12 22:00:55+00:00', @@ -97,7 +83,7 @@ export default defineAction({ { label: 'Card Border Color', key: 'cardBorderColor', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'In hex format. Default is blue (#2399F3).', variables: true, @@ -140,23 +126,23 @@ export default defineAction({ title = cardTitle; } - const body: Body = { + const body = { data: { - title: title as string, - description: cardDescription as string, + title: title, + description: cardDescription, }, style: {}, parent: { - id: frameId as string, + id: frameId, }, }; if (cardBorderColor) { - body.style.cardTheme = cardBorderColor as string; + body.style.cardTheme = cardBorderColor; } if (cardDueDate) { - body.data.dueDate = cardDueDate as string; + body.data.dueDate = cardDueDate; } const response = await $.http.post(`/v2/boards/${boardId}/cards`, body); diff --git a/packages/backend/src/apps/miro/actions/index.js b/packages/backend/src/apps/miro/actions/index.js new file mode 100644 index 00000000..c200553e --- /dev/null +++ b/packages/backend/src/apps/miro/actions/index.js @@ -0,0 +1,5 @@ +import copyBoard from './copy-board/index.js'; +import createBoard from './create-board/index.js'; +import createCardWidget from './create-card-widget/index.js'; + +export default [copyBoard, createBoard, createCardWidget]; diff --git a/packages/backend/src/apps/miro/actions/index.ts b/packages/backend/src/apps/miro/actions/index.ts deleted file mode 100644 index 896dd73f..00000000 --- a/packages/backend/src/apps/miro/actions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import copyBoard from './copy-board'; -import createBoard from './create-board'; -import createCardWidget from './create-card-widget'; - -export default [copyBoard, createBoard, createCardWidget]; diff --git a/packages/backend/src/apps/miro/auth/generate-auth-url.ts b/packages/backend/src/apps/miro/auth/generate-auth-url.js similarity index 52% rename from packages/backend/src/apps/miro/auth/generate-auth-url.ts rename to packages/backend/src/apps/miro/auth/generate-auth-url.js index 0b84ef03..cb70ad36 100644 --- a/packages/backend/src/apps/miro/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/miro/auth/generate-auth-url.js @@ -1,14 +1,13 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ response_type: 'code', - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, }); diff --git a/packages/backend/src/apps/miro/auth/index.ts b/packages/backend/src/apps/miro/auth/index.js similarity index 74% rename from packages/backend/src/apps/miro/auth/index.ts rename to packages/backend/src/apps/miro/auth/index.js index 6193716a..e971a702 100644 --- a/packages/backend/src/apps/miro/auth/index.ts +++ b/packages/backend/src/apps/miro/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/miro/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/miro/auth/is-still-verified.js b/packages/backend/src/apps/miro/auth/is-still-verified.js new file mode 100644 index 00000000..6d792b12 --- /dev/null +++ b/packages/backend/src/apps/miro/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/miro/auth/is-still-verified.ts b/packages/backend/src/apps/miro/auth/is-still-verified.ts deleted file mode 100644 index 93a01099..00000000 --- a/packages/backend/src/apps/miro/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/miro/auth/refresh-token.ts b/packages/backend/src/apps/miro/auth/refresh-token.js similarity index 61% rename from packages/backend/src/apps/miro/auth/refresh-token.ts rename to packages/backend/src/apps/miro/auth/refresh-token.js index 8c160b73..62be5d2a 100644 --- a/packages/backend/src/apps/miro/auth/refresh-token.ts +++ b/packages/backend/src/apps/miro/auth/refresh-token.js @@ -1,12 +1,11 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const params = new URLSearchParams({ grant_type: 'refresh_token', - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - refresh_token: $.auth.data.refreshToken as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post('/v1/oauth/token', params.toString()); diff --git a/packages/backend/src/apps/miro/auth/verify-credentials.ts b/packages/backend/src/apps/miro/auth/verify-credentials.js similarity index 73% rename from packages/backend/src/apps/miro/auth/verify-credentials.ts rename to packages/backend/src/apps/miro/auth/verify-credentials.js index 9fe3915e..d6d862c2 100644 --- a/packages/backend/src/apps/miro/auth/verify-credentials.ts +++ b/packages/backend/src/apps/miro/auth/verify-credentials.js @@ -1,11 +1,10 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const params = { grant_type: 'authorization_code', client_id: $.auth.data.clientId, diff --git a/packages/backend/src/apps/miro/common/add-auth-header.ts b/packages/backend/src/apps/miro/common/add-auth-header.js similarity index 62% rename from packages/backend/src/apps/miro/common/add-auth-header.ts rename to packages/backend/src/apps/miro/common/add-auth-header.js index 8e7798b8..02477aa4 100644 --- a/packages/backend/src/apps/miro/common/add-auth-header.ts +++ b/packages/backend/src/apps/miro/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/miro/common/get-current-user.ts b/packages/backend/src/apps/miro/common/get-current-user.js similarity index 61% rename from packages/backend/src/apps/miro/common/get-current-user.ts rename to packages/backend/src/apps/miro/common/get-current-user.js index 913da3a6..2c09552f 100644 --- a/packages/backend/src/apps/miro/common/get-current-user.ts +++ b/packages/backend/src/apps/miro/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data } = await $.http.get( `https://api.miro.com/v1/oauth-token?access_token=${$.auth.data.accessToken}` ); diff --git a/packages/backend/src/apps/miro/dynamic-data/index.js b/packages/backend/src/apps/miro/dynamic-data/index.js new file mode 100644 index 00000000..fd8026f8 --- /dev/null +++ b/packages/backend/src/apps/miro/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listBoards from './list-boards/index.js'; +import listFrames from './list-frames/index.js'; + +export default [listBoards, listFrames]; diff --git a/packages/backend/src/apps/miro/dynamic-data/index.ts b/packages/backend/src/apps/miro/dynamic-data/index.ts deleted file mode 100644 index ade1d40a..00000000 --- a/packages/backend/src/apps/miro/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listBoards from './list-boards'; -import listFrames from './list-frames'; - -export default [listBoards, listFrames]; diff --git a/packages/backend/src/apps/miro/dynamic-data/list-boards/index.ts b/packages/backend/src/apps/miro/dynamic-data/list-boards/index.js similarity index 53% rename from packages/backend/src/apps/miro/dynamic-data/list-boards/index.ts rename to packages/backend/src/apps/miro/dynamic-data/list-boards/index.js index 9ef3f55d..849ebc5d 100644 --- a/packages/backend/src/apps/miro/dynamic-data/list-boards/index.ts +++ b/packages/backend/src/apps/miro/dynamic-data/list-boards/index.js @@ -1,25 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type ResponseBody = { - data: { - data: { - id: number; - name: string; - }[]; - links: { - next: string; - }; - }; -}; - export default { name: 'List boards', key: 'listBoards', - async run($: IGlobalVariable) { - const boards: { - data: IJSONObject[]; - } = { + async run($) { + const boards = { data: [], }; @@ -27,7 +11,7 @@ export default { do { const { data: { data, links }, - }: ResponseBody = await $.http.get('/v2/boards'); + } = await $.http.get('/v2/boards'); next = links?.next; diff --git a/packages/backend/src/apps/miro/dynamic-data/list-frames/index.ts b/packages/backend/src/apps/miro/dynamic-data/list-frames/index.js similarity index 69% rename from packages/backend/src/apps/miro/dynamic-data/list-frames/index.ts rename to packages/backend/src/apps/miro/dynamic-data/list-frames/index.js index 8a234c1a..2cbafd3a 100644 --- a/packages/backend/src/apps/miro/dynamic-data/list-frames/index.ts +++ b/packages/backend/src/apps/miro/dynamic-data/list-frames/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List frames', key: 'listFrames', - async run($: IGlobalVariable) { - const frames: { - data: IJSONObject[]; - } = { + async run($) { + const frames = { data: [], }; @@ -25,9 +21,7 @@ export default { next = links?.next; - const allFrames = data.filter( - (item: IJSONObject) => item.type === 'frame' - ); + const allFrames = data.filter((item) => item.type === 'frame'); if (allFrames.length) { for (const frame of allFrames) { diff --git a/packages/backend/src/apps/miro/index.d.ts b/packages/backend/src/apps/miro/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/miro/index.ts b/packages/backend/src/apps/miro/index.js similarity index 61% rename from packages/backend/src/apps/miro/index.ts rename to packages/backend/src/apps/miro/index.js index 685bca28..9aac2e01 100644 --- a/packages/backend/src/apps/miro/index.ts +++ b/packages/backend/src/apps/miro/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Miro', diff --git a/packages/backend/src/apps/notion/actions/create-database-item/index.ts b/packages/backend/src/apps/notion/actions/create-database-item/index.js similarity index 80% rename from packages/backend/src/apps/notion/actions/create-database-item/index.ts rename to packages/backend/src/apps/notion/actions/create-database-item/index.js index 334bc511..c9c4a4e7 100644 --- a/packages/backend/src/apps/notion/actions/create-database-item/index.ts +++ b/packages/backend/src/apps/notion/actions/create-database-item/index.js @@ -1,11 +1,4 @@ -import { IJSONArray, IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; - -type TBody = { - parent: IJSONObject; - properties: IJSONObject; - children: IJSONArray; -}; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create database item', @@ -15,7 +8,7 @@ export default defineAction({ { label: 'Database', key: 'databaseId', - type: 'dropdown' as const, + type: 'dropdown', required: true, source: { type: 'query', @@ -31,7 +24,7 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: false, description: 'This field has a 2000 character limit. Any characters beyond 2000 will not be included.', @@ -40,7 +33,7 @@ export default defineAction({ { label: 'Content', key: 'content', - type: 'string' as const, + type: 'string', required: false, description: 'The text to add to the page body. The max length for this field is 2000 characters. Any characters beyond 2000 will not be included.', @@ -49,12 +42,12 @@ export default defineAction({ ], async run($) { - const name = $.step.parameters.name as string; + const name = $.step.parameters.name; const truncatedName = name.slice(0, 2000); - const content = $.step.parameters.content as string; + const content = $.step.parameters.content; const truncatedContent = content.slice(0, 2000); - const body: TBody = { + const body = { parent: { database_id: $.step.parameters.databaseId, }, diff --git a/packages/backend/src/apps/notion/actions/create-page/index.ts b/packages/backend/src/apps/notion/actions/create-page/index.js similarity index 78% rename from packages/backend/src/apps/notion/actions/create-page/index.ts rename to packages/backend/src/apps/notion/actions/create-page/index.js index a2590d21..37546302 100644 --- a/packages/backend/src/apps/notion/actions/create-page/index.ts +++ b/packages/backend/src/apps/notion/actions/create-page/index.js @@ -1,11 +1,4 @@ -import { IJSONArray, IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; - -type TBody = { - parent: IJSONObject; - properties: IJSONObject; - children: IJSONArray; -}; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create page', @@ -15,7 +8,7 @@ export default defineAction({ { label: 'Parent page', key: 'parentPageId', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -32,7 +25,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: false, description: 'This field has a 2000 character limit. Any characters beyond 2000 will not be included.', @@ -41,7 +34,7 @@ export default defineAction({ { label: 'Content', key: 'content', - type: 'string' as const, + type: 'string', required: false, description: 'The text to add to the page body. The max length for this field is 2000 characters. Any characters beyond 2000 will not be included.', @@ -50,13 +43,13 @@ export default defineAction({ ], async run($) { - const parentPageId = $.step.parameters.parentPageId as string; - const title = $.step.parameters.title as string; + const parentPageId = $.step.parameters.parentPageId; + const title = $.step.parameters.title; const truncatedTitle = title.slice(0, 2000); - const content = $.step.parameters.content as string; + const content = $.step.parameters.content; const truncatedContent = content.slice(0, 2000); - const body: TBody = { + const body = { parent: { page_id: parentPageId, }, diff --git a/packages/backend/src/apps/notion/actions/find-database-item/index.ts b/packages/backend/src/apps/notion/actions/find-database-item/index.js similarity index 74% rename from packages/backend/src/apps/notion/actions/find-database-item/index.ts rename to packages/backend/src/apps/notion/actions/find-database-item/index.js index fbd2c056..44f9fea1 100644 --- a/packages/backend/src/apps/notion/actions/find-database-item/index.ts +++ b/packages/backend/src/apps/notion/actions/find-database-item/index.js @@ -1,10 +1,4 @@ -import { IJSONArray, IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; - -type TBody = { - filter: IJSONObject; - sorts: IJSONArray; -}; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Find database item', @@ -14,7 +8,7 @@ export default defineAction({ { label: 'Database', key: 'databaseId', - type: 'dropdown' as const, + type: 'dropdown', required: true, source: { type: 'query', @@ -30,7 +24,7 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: false, description: 'This field has a 2000 character limit. Any characters beyond 2000 will not be included.', @@ -39,11 +33,11 @@ export default defineAction({ ], async run($) { - const databaseId = $.step.parameters.databaseId as string; - const name = $.step.parameters.name as string; + const databaseId = $.step.parameters.databaseId; + const name = $.step.parameters.name; const truncatedName = name.slice(0, 2000); - const body: TBody = { + const body = { filter: { property: 'Name', rich_text: { diff --git a/packages/backend/src/apps/notion/actions/index.js b/packages/backend/src/apps/notion/actions/index.js new file mode 100644 index 00000000..0b1629e1 --- /dev/null +++ b/packages/backend/src/apps/notion/actions/index.js @@ -0,0 +1,5 @@ +import createDatabaseItem from './create-database-item/index.js'; +import createPage from './create-page/index.js'; +import findDatabaseItem from './find-database-item/index.js'; + +export default [createDatabaseItem, createPage, findDatabaseItem]; diff --git a/packages/backend/src/apps/notion/actions/index.ts b/packages/backend/src/apps/notion/actions/index.ts deleted file mode 100644 index 00f0bed3..00000000 --- a/packages/backend/src/apps/notion/actions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import createDatabaseItem from './create-database-item'; -import createPage from './create-page'; -import findDatabaseItem from './find-database-item'; - -export default [createDatabaseItem, createPage, findDatabaseItem]; diff --git a/packages/backend/src/apps/notion/auth/generate-auth-url.js b/packages/backend/src/apps/notion/auth/generate-auth-url.js new file mode 100644 index 00000000..5547ec12 --- /dev/null +++ b/packages/backend/src/apps/notion/auth/generate-auth-url.js @@ -0,0 +1,23 @@ +import { URL, URLSearchParams } from 'url'; + +export default async function generateAuthUrl($) { + const oauthRedirectUrlField = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ); + const redirectUri = oauthRedirectUrlField.value; + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId, + redirect_uri: redirectUri, + response_type: 'code', + owner: 'user', + }); + + const url = new URL( + `/v1/oauth/authorize?${searchParams}`, + $.app.apiBaseUrl + ).toString(); + + await $.auth.set({ + url, + }); +} diff --git a/packages/backend/src/apps/notion/auth/generate-auth-url.ts b/packages/backend/src/apps/notion/auth/generate-auth-url.ts deleted file mode 100644 index e34c1ead..00000000 --- a/packages/backend/src/apps/notion/auth/generate-auth-url.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import { URL, URLSearchParams } from 'url'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const redirectUri = oauthRedirectUrlField.value as string; - const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - redirect_uri: redirectUri, - response_type: 'code', - owner: 'user', - }); - - const url = new URL(`/v1/oauth/authorize?${searchParams}`, $.app.apiBaseUrl).toString(); - - await $.auth.set({ - url, - }); -} diff --git a/packages/backend/src/apps/notion/auth/index.ts b/packages/backend/src/apps/notion/auth/index.js similarity index 80% rename from packages/backend/src/apps/notion/auth/index.ts rename to packages/backend/src/apps/notion/auth/index.js index 8c9d1aa6..5dba7507 100644 --- a/packages/backend/src/apps/notion/auth/index.ts +++ b/packages/backend/src/apps/notion/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/notion/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -32,7 +32,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/notion/auth/is-still-verified.js b/packages/backend/src/apps/notion/auth/is-still-verified.js new file mode 100644 index 00000000..1b9d46d0 --- /dev/null +++ b/packages/backend/src/apps/notion/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/notion/auth/is-still-verified.ts b/packages/backend/src/apps/notion/auth/is-still-verified.ts deleted file mode 100644 index befb7694..00000000 --- a/packages/backend/src/apps/notion/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/notion/auth/verify-credentials.ts b/packages/backend/src/apps/notion/auth/verify-credentials.js similarity index 77% rename from packages/backend/src/apps/notion/auth/verify-credentials.ts rename to packages/backend/src/apps/notion/auth/verify-credentials.js index f3104eca..5bed76f4 100644 --- a/packages/backend/src/apps/notion/auth/verify-credentials.ts +++ b/packages/backend/src/apps/notion/auth/verify-credentials.js @@ -1,11 +1,10 @@ -import { IGlobalVariable, IField } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const response = await $.http.post( `${$.app.apiBaseUrl}/v1/oauth/token`, { @@ -20,8 +19,8 @@ const verifyCredentials = async ($: IGlobalVariable) => { ).toString('base64')}`, }, additionalProperties: { - skipAddingAuthHeader: true - } + skipAddingAuthHeader: true, + }, } ); diff --git a/packages/backend/src/apps/spotify/common/add-auth-header.ts b/packages/backend/src/apps/notion/common/add-auth-header.js similarity index 53% rename from packages/backend/src/apps/spotify/common/add-auth-header.ts rename to packages/backend/src/apps/notion/common/add-auth-header.js index d16f394f..38e69094 100644 --- a/packages/backend/src/apps/spotify/common/add-auth-header.ts +++ b/packages/backend/src/apps/notion/common/add-auth-header.js @@ -1,7 +1,6 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if (requestConfig.additionalProperties?.skipAddingAuthHeader) return requestConfig; +const addAuthHeader = ($, requestConfig) => { + if (requestConfig.additionalProperties?.skipAddingAuthHeader) + return requestConfig; if ($.auth.data?.accessToken) { const authorizationHeader = `Bearer ${$.auth.data.accessToken}`; diff --git a/packages/backend/src/apps/notion/common/add-notion-version-header.ts b/packages/backend/src/apps/notion/common/add-notion-version-header.js similarity index 50% rename from packages/backend/src/apps/notion/common/add-notion-version-header.ts rename to packages/backend/src/apps/notion/common/add-notion-version-header.js index 0c6197a4..08b2f903 100644 --- a/packages/backend/src/apps/notion/common/add-notion-version-header.ts +++ b/packages/backend/src/apps/notion/common/add-notion-version-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addNotionVersionHeader: TBeforeRequest = ($, requestConfig) => { +const addNotionVersionHeader = ($, requestConfig) => { requestConfig.headers['Notion-Version'] = '2022-06-28'; return requestConfig; diff --git a/packages/backend/src/apps/notion/common/get-current-user.js b/packages/backend/src/apps/notion/common/get-current-user.js new file mode 100644 index 00000000..8147d1ff --- /dev/null +++ b/packages/backend/src/apps/notion/common/get-current-user.js @@ -0,0 +1,9 @@ +const getCurrentUser = async ($) => { + const userId = $.auth.data.owner.user.id; + const response = await $.http.get(`/v1/users/${userId}`); + + const currentUser = response.data; + return currentUser; +}; + +export default getCurrentUser; diff --git a/packages/backend/src/apps/notion/common/get-current-user.ts b/packages/backend/src/apps/notion/common/get-current-user.ts deleted file mode 100644 index 1110d23b..00000000 --- a/packages/backend/src/apps/notion/common/get-current-user.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type Owner = { - user: { - id: string - } -} - -const getCurrentUser = async ($: IGlobalVariable): Promise => { - const userId = ($.auth.data.owner as Owner).user.id; - const response = await $.http.get(`/v1/users/${userId}`); - - const currentUser = response.data; - return currentUser; -}; - -export default getCurrentUser; diff --git a/packages/backend/src/apps/notion/dynamic-data/index.js b/packages/backend/src/apps/notion/dynamic-data/index.js new file mode 100644 index 00000000..3811a7c3 --- /dev/null +++ b/packages/backend/src/apps/notion/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listDatabases from './list-databases/index.js'; +import listParentPages from './list-parent-pages/index.js'; + +export default [listDatabases, listParentPages]; diff --git a/packages/backend/src/apps/notion/dynamic-data/index.ts b/packages/backend/src/apps/notion/dynamic-data/index.ts deleted file mode 100644 index d9d69c68..00000000 --- a/packages/backend/src/apps/notion/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listDatabases from './list-databases'; -import listParentPages from './list-parent-pages'; - -export default [listDatabases, listParentPages]; diff --git a/packages/backend/src/apps/notion/dynamic-data/list-databases/index.js b/packages/backend/src/apps/notion/dynamic-data/list-databases/index.js new file mode 100644 index 00000000..da8f27d8 --- /dev/null +++ b/packages/backend/src/apps/notion/dynamic-data/list-databases/index.js @@ -0,0 +1,32 @@ +export default { + name: 'List databases', + key: 'listDatabases', + + async run($) { + const databases = { + data: [], + error: null, + }; + const payload = { + filter: { + value: 'database', + property: 'object', + }, + }; + + do { + const response = await $.http.post('/v1/search', payload); + + payload.start_cursor = response.data.next_cursor; + + for (const database of response.data.results) { + databases.data.push({ + value: database.id, + name: database.title[0].plain_text, + }); + } + } while (payload.start_cursor); + + return databases; + }, +}; diff --git a/packages/backend/src/apps/notion/dynamic-data/list-databases/index.ts b/packages/backend/src/apps/notion/dynamic-data/list-databases/index.ts deleted file mode 100644 index ca16aaa2..00000000 --- a/packages/backend/src/apps/notion/dynamic-data/list-databases/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type Database = { - id: string; - name: string; - title: [ - { - plain_text: string; - } - ]; -} - -type ResponseData = { - results: Database[]; - next_cursor?: string; -} - -type Payload = { - filter: { - value: 'database'; - property: 'object'; - }; - start_cursor?: string; -}; - -export default { - name: 'List databases', - key: 'listDatabases', - - async run($: IGlobalVariable) { - const databases: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { - data: [], - error: null, - }; - const payload: Payload = { - filter: { - value: 'database', - property: 'object' - }, - }; - - do { - const response = await $.http.post('/v1/search', payload); - - payload.start_cursor = response.data.next_cursor; - - for (const database of response.data.results) { - databases.data.push({ - value: database.id as string, - name: database.title[0].plain_text as string, - }); - } - } while (payload.start_cursor); - - return databases; - }, -}; diff --git a/packages/backend/src/apps/notion/dynamic-data/list-parent-pages/index.js b/packages/backend/src/apps/notion/dynamic-data/list-parent-pages/index.js new file mode 100644 index 00000000..9212e9b4 --- /dev/null +++ b/packages/backend/src/apps/notion/dynamic-data/list-parent-pages/index.js @@ -0,0 +1,36 @@ +export default { + name: 'List parent pages', + key: 'listParentPages', + + async run($) { + const parentPages = { + data: [], + error: null, + }; + const payload = { + filter: { + value: 'page', + property: 'object', + }, + }; + + do { + const response = await $.http.post('/v1/search', payload); + + payload.start_cursor = response.data.next_cursor; + + const topLevelPages = response.data.results.filter( + (page) => page.parent.workspace + ); + + for (const pages of topLevelPages) { + parentPages.data.push({ + value: pages.id, + name: pages.properties.title.title[0].plain_text, + }); + } + } while (payload.start_cursor); + + return parentPages; + }, +}; diff --git a/packages/backend/src/apps/notion/dynamic-data/list-parent-pages/index.ts b/packages/backend/src/apps/notion/dynamic-data/list-parent-pages/index.ts deleted file mode 100644 index f752f587..00000000 --- a/packages/backend/src/apps/notion/dynamic-data/list-parent-pages/index.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type Page = { - id: string; - properties: { - title: { - title: [ - { - plain_text: string; - } - ]; - }; - }; - parent: { - workspace: boolean; - }; -}; - -type ResponseData = { - results: Page[]; - next_cursor?: string; -}; - -type Payload = { - filter: { - value: 'page'; - property: 'object'; - }; - start_cursor?: string; -}; - -export default { - name: 'List parent pages', - key: 'listParentPages', - - async run($: IGlobalVariable) { - const parentPages: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { - data: [], - error: null, - }; - const payload: Payload = { - filter: { - value: 'page', - property: 'object', - }, - }; - - do { - const response = await $.http.post('/v1/search', payload); - - payload.start_cursor = response.data.next_cursor; - - const topLevelPages = response.data.results.filter( - (page) => page.parent.workspace - ); - - for (const pages of topLevelPages) { - parentPages.data.push({ - value: pages.id as string, - name: pages.properties.title.title[0].plain_text as string, - }); - } - } while (payload.start_cursor); - - return parentPages; - }, -}; diff --git a/packages/backend/src/apps/notion/index.d.ts b/packages/backend/src/apps/notion/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/notion/index.ts b/packages/backend/src/apps/notion/index.js similarity index 62% rename from packages/backend/src/apps/notion/index.ts rename to packages/backend/src/apps/notion/index.js index d9d6ef4f..2c04923c 100644 --- a/packages/backend/src/apps/notion/index.ts +++ b/packages/backend/src/apps/notion/index.js @@ -1,10 +1,10 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import addNotionVersionHeader from './common/add-notion-version-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import addNotionVersionHeader from './common/add-notion-version-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Notion', diff --git a/packages/backend/src/apps/notion/triggers/index.js b/packages/backend/src/apps/notion/triggers/index.js new file mode 100644 index 00000000..85d33809 --- /dev/null +++ b/packages/backend/src/apps/notion/triggers/index.js @@ -0,0 +1,4 @@ +import newDatabaseItems from './new-database-items/index.js'; +import updatedDatabaseItems from './updated-database-items/index.js'; + +export default [newDatabaseItems, updatedDatabaseItems]; diff --git a/packages/backend/src/apps/notion/triggers/index.ts b/packages/backend/src/apps/notion/triggers/index.ts deleted file mode 100644 index 0914477b..00000000 --- a/packages/backend/src/apps/notion/triggers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import newDatabaseItems from './new-database-items'; -import updatedDatabaseItems from './updated-database-items'; - -export default [newDatabaseItems, updatedDatabaseItems]; diff --git a/packages/backend/src/apps/notion/triggers/new-database-items/index.ts b/packages/backend/src/apps/notion/triggers/new-database-items/index.js similarity index 78% rename from packages/backend/src/apps/notion/triggers/new-database-items/index.ts rename to packages/backend/src/apps/notion/triggers/new-database-items/index.js index 989c97f7..8ed8ccd5 100644 --- a/packages/backend/src/apps/notion/triggers/new-database-items/index.ts +++ b/packages/backend/src/apps/notion/triggers/new-database-items/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newDatabaseItems from './new-database-items'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newDatabaseItems from './new-database-items.js'; export default defineTrigger({ name: 'New database items', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Database', key: 'databaseId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: false, source: { diff --git a/packages/backend/src/apps/notion/triggers/new-database-items/new-database-items.js b/packages/backend/src/apps/notion/triggers/new-database-items/new-database-items.js new file mode 100644 index 00000000..1d134f58 --- /dev/null +++ b/packages/backend/src/apps/notion/triggers/new-database-items/new-database-items.js @@ -0,0 +1,29 @@ +const newDatabaseItems = async ($) => { + const payload = { + sorts: [ + { + timestamp: 'created_time', + direction: 'descending', + }, + ], + }; + + const databaseId = $.step.parameters.databaseId; + const path = `/v1/databases/${databaseId}/query`; + do { + const response = await $.http.post(path, payload); + + payload.start_cursor = response.data.next_cursor; + + for (const databaseItem of response.data.results) { + $.pushTriggerItem({ + raw: databaseItem, + meta: { + internalId: databaseItem.id, + }, + }); + } + } while (payload.start_cursor); +}; + +export default newDatabaseItems; diff --git a/packages/backend/src/apps/notion/triggers/new-database-items/new-database-items.ts b/packages/backend/src/apps/notion/triggers/new-database-items/new-database-items.ts deleted file mode 100644 index 90b619c8..00000000 --- a/packages/backend/src/apps/notion/triggers/new-database-items/new-database-items.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type DatabaseItem = { - id: string; -} - -type ResponseData = { - results: DatabaseItem[]; - next_cursor?: string; -} - -type Payload = { - sorts: [ - { - timestamp: 'created_time' | 'last_edited_time'; - direction: 'ascending' | 'descending'; - } - ]; - start_cursor?: string; -}; - -const newDatabaseItems = async ($: IGlobalVariable) => { - const payload: Payload = { - sorts: [ - { - timestamp: 'created_time', - direction: 'descending' - } - ], - }; - - const databaseId = $.step.parameters.databaseId as string; - const path = `/v1/databases/${databaseId}/query`; - do { - const response = await $.http.post(path, payload); - - payload.start_cursor = response.data.next_cursor; - - for (const databaseItem of response.data.results) { - $.pushTriggerItem({ - raw: databaseItem, - meta: { - internalId: databaseItem.id, - } - }) - } - } while (payload.start_cursor); -}; - -export default newDatabaseItems; diff --git a/packages/backend/src/apps/notion/triggers/updated-database-items/index.ts b/packages/backend/src/apps/notion/triggers/updated-database-items/index.js similarity index 78% rename from packages/backend/src/apps/notion/triggers/updated-database-items/index.ts rename to packages/backend/src/apps/notion/triggers/updated-database-items/index.js index 82c493a3..a08ced6f 100644 --- a/packages/backend/src/apps/notion/triggers/updated-database-items/index.ts +++ b/packages/backend/src/apps/notion/triggers/updated-database-items/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import updatedDatabaseItems from './updated-database-items'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import updatedDatabaseItems from './updated-database-items.js'; export default defineTrigger({ name: 'Updated database items', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Database', key: 'databaseId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: false, source: { diff --git a/packages/backend/src/apps/notion/triggers/updated-database-items/updated-database-items.js b/packages/backend/src/apps/notion/triggers/updated-database-items/updated-database-items.js new file mode 100644 index 00000000..282aaf9f --- /dev/null +++ b/packages/backend/src/apps/notion/triggers/updated-database-items/updated-database-items.js @@ -0,0 +1,29 @@ +const updatedDatabaseItems = async ($) => { + const payload = { + sorts: [ + { + timestamp: 'last_edited_time', + direction: 'descending', + }, + ], + }; + + const databaseId = $.step.parameters.databaseId; + const path = `/v1/databases/${databaseId}/query`; + do { + const response = await $.http.post(path, payload); + + payload.start_cursor = response.data.next_cursor; + + for (const databaseItem of response.data.results) { + $.pushTriggerItem({ + raw: databaseItem, + meta: { + internalId: `${databaseItem.id}-${databaseItem.last_edited_time}`, + }, + }); + } + } while (payload.start_cursor); +}; + +export default updatedDatabaseItems; diff --git a/packages/backend/src/apps/notion/triggers/updated-database-items/updated-database-items.ts b/packages/backend/src/apps/notion/triggers/updated-database-items/updated-database-items.ts deleted file mode 100644 index d63f2f11..00000000 --- a/packages/backend/src/apps/notion/triggers/updated-database-items/updated-database-items.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type DatabaseItem = { - id: string; - last_edited_time: string; -}; - -type ResponseData = { - results: DatabaseItem[]; - next_cursor?: string; -}; - -type Payload = { - sorts: [ - { - timestamp: 'created_time' | 'last_edited_time'; - direction: 'ascending' | 'descending'; - } - ]; - start_cursor?: string; -}; - -const updatedDatabaseItems = async ($: IGlobalVariable) => { - const payload: Payload = { - sorts: [ - { - timestamp: 'last_edited_time', - direction: 'descending', - }, - ], - }; - - const databaseId = $.step.parameters.databaseId as string; - const path = `/v1/databases/${databaseId}/query`; - do { - const response = await $.http.post(path, payload); - - payload.start_cursor = response.data.next_cursor; - - for (const databaseItem of response.data.results) { - $.pushTriggerItem({ - raw: databaseItem, - meta: { - internalId: `${databaseItem.id}-${databaseItem.last_edited_time}`, - }, - }); - } - } while (payload.start_cursor); -}; - -export default updatedDatabaseItems; diff --git a/packages/backend/src/apps/ntfy/actions/index.js b/packages/backend/src/apps/ntfy/actions/index.js new file mode 100644 index 00000000..92d67c2c --- /dev/null +++ b/packages/backend/src/apps/ntfy/actions/index.js @@ -0,0 +1,3 @@ +import sendMessage from './send-message/index.js'; + +export default [sendMessage]; diff --git a/packages/backend/src/apps/ntfy/actions/index.ts b/packages/backend/src/apps/ntfy/actions/index.ts deleted file mode 100644 index 37aeb338..00000000 --- a/packages/backend/src/apps/ntfy/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendMessage from './send-message'; - -export default [sendMessage]; diff --git a/packages/backend/src/apps/ntfy/actions/send-message/index.ts b/packages/backend/src/apps/ntfy/actions/send-message/index.js similarity index 69% rename from packages/backend/src/apps/ntfy/actions/send-message/index.ts rename to packages/backend/src/apps/ntfy/actions/send-message/index.js index 8cc91584..a25db4ac 100644 --- a/packages/backend/src/apps/ntfy/actions/send-message/index.ts +++ b/packages/backend/src/apps/ntfy/actions/send-message/index.js @@ -1,5 +1,4 @@ -import qs from 'qs'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Send message', @@ -9,7 +8,7 @@ export default defineAction({ { label: 'Topic', key: 'topic', - type: 'string' as const, + type: 'string', required: true, description: 'Target topic name.', variables: true, @@ -17,15 +16,16 @@ export default defineAction({ { label: 'Message body', key: 'message', - type: 'string' as const, + type: 'string', required: true, - description: 'Message body to be sent, set to triggered if empty or not passed.', + description: + 'Message body to be sent, set to triggered if empty or not passed.', variables: true, }, { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: false, description: 'Message title.', variables: true, @@ -33,7 +33,7 @@ export default defineAction({ { label: 'Email', key: 'email', - type: 'string' as const, + type: 'string', required: false, description: 'E-mail address for e-mail notifications.', variables: true, @@ -41,7 +41,7 @@ export default defineAction({ { label: 'Click URL', key: 'click', - type: 'string' as const, + type: 'string', required: false, description: 'Website opened when notification is clicked.', variables: true, @@ -49,7 +49,7 @@ export default defineAction({ { label: 'Attach file by URL', key: 'attach', - type: 'string' as const, + type: 'string', required: false, description: 'URL of an attachment.', variables: true, @@ -57,7 +57,7 @@ export default defineAction({ { label: 'Filename', key: 'filename', - type: 'string' as const, + type: 'string', required: false, description: 'File name of the attachment.', variables: true, @@ -65,24 +65,17 @@ export default defineAction({ { label: 'Delay', key: 'delay', - type: 'string' as const, + type: 'string', required: false, - description: 'Timestamp or duration for delayed delivery. For example, 30min or 9am.', + description: + 'Timestamp or duration for delayed delivery. For example, 30min or 9am.', variables: true, }, ], async run($) { - const { - topic, - message, - title, - email, - click, - attach, - filename, - delay - } = $.step.parameters; + const { topic, message, title, email, click, attach, filename, delay } = + $.step.parameters; const payload = { topic, message, @@ -91,7 +84,7 @@ export default defineAction({ click, attach, filename, - delay + delay, }; const response = await $.http.post('/', payload); diff --git a/packages/backend/src/apps/ntfy/auth/index.ts b/packages/backend/src/apps/ntfy/auth/index.js similarity index 60% rename from packages/backend/src/apps/ntfy/auth/index.ts rename to packages/backend/src/apps/ntfy/auth/index.js index f783c907..f8eaed35 100644 --- a/packages/backend/src/apps/ntfy/auth/index.ts +++ b/packages/backend/src/apps/ntfy/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'serverUrl', label: 'Server URL', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: 'https://ntfy.sh', @@ -17,22 +17,24 @@ export default { { key: 'username', label: 'Username', - type: 'string' as const, + type: 'string', required: false, readOnly: false, placeholder: null, clickToCopy: false, - description: 'You may need to provide your username if your installation requires authentication.', + description: + 'You may need to provide your username if your installation requires authentication.', }, { key: 'password', label: 'Password', - type: 'string' as const, + type: 'string', required: false, readOnly: false, placeholder: null, clickToCopy: false, - description: 'You may need to provide your password if your installation requires authentication.', + description: + 'You may need to provide your password if your installation requires authentication.', }, ], diff --git a/packages/backend/src/apps/ntfy/auth/is-still-verified.js b/packages/backend/src/apps/ntfy/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/ntfy/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/ntfy/auth/is-still-verified.ts b/packages/backend/src/apps/ntfy/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/ntfy/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/ntfy/auth/verify-credentials.ts b/packages/backend/src/apps/ntfy/auth/verify-credentials.js similarity index 55% rename from packages/backend/src/apps/ntfy/auth/verify-credentials.ts rename to packages/backend/src/apps/ntfy/auth/verify-credentials.js index 84d1d623..4a1aed22 100644 --- a/packages/backend/src/apps/ntfy/auth/verify-credentials.ts +++ b/packages/backend/src/apps/ntfy/auth/verify-credentials.js @@ -1,11 +1,9 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await $.http.post('/', { topic: 'automatisch' }); let screenName = $.auth.data.serverUrl; if ($.auth.data.username) { - screenName = `${$.auth.data.username} @ ${screenName}` + screenName = `${$.auth.data.username} @ ${screenName}`; } await $.auth.set({ diff --git a/packages/backend/src/apps/ntfy/common/add-auth-header.js b/packages/backend/src/apps/ntfy/common/add-auth-header.js new file mode 100644 index 00000000..0c533682 --- /dev/null +++ b/packages/backend/src/apps/ntfy/common/add-auth-header.js @@ -0,0 +1,16 @@ +const addAuthHeader = ($, requestConfig) => { + if ($.auth.data.serverUrl) { + requestConfig.baseURL = $.auth.data.serverUrl; + } + + if ($.auth.data?.username && $.auth.data?.password) { + requestConfig.auth = { + username: $.auth.data.username, + password: $.auth.data.password, + }; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/ntfy/common/add-auth-header.ts b/packages/backend/src/apps/ntfy/common/add-auth-header.ts deleted file mode 100644 index 86518583..00000000 --- a/packages/backend/src/apps/ntfy/common/add-auth-header.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data.serverUrl) { - requestConfig.baseURL = $.auth.data.serverUrl as string; - } - - if ($.auth.data?.username && $.auth.data?.password) { - requestConfig.auth = { - username: $.auth.data.username as string, - password: $.auth.data.password as string, - } - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/ntfy/index.d.ts b/packages/backend/src/apps/ntfy/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/ntfy/index.ts b/packages/backend/src/apps/ntfy/index.js similarity index 65% rename from packages/backend/src/apps/ntfy/index.ts rename to packages/backend/src/apps/ntfy/index.js index 1ba23966..1e0e9f93 100644 --- a/packages/backend/src/apps/ntfy/index.ts +++ b/packages/backend/src/apps/ntfy/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Ntfy', diff --git a/packages/backend/src/apps/odoo/actions/create-lead/index.js b/packages/backend/src/apps/odoo/actions/create-lead/index.js new file mode 100644 index 00000000..1e0861d3 --- /dev/null +++ b/packages/backend/src/apps/odoo/actions/create-lead/index.js @@ -0,0 +1,98 @@ +import defineAction from '../../../../helpers/define-action.js'; +import { authenticate, asyncMethodCall } from '../../common/xmlrpc-client.js'; + +export default defineAction({ + name: 'Create Lead', + key: 'createLead', + description: '', + arguments: [ + { + label: 'Name', + key: 'name', + type: 'string', + required: true, + description: 'Lead name', + variables: true, + }, + { + label: 'Type', + key: 'type', + type: 'dropdown', + required: true, + variables: true, + options: [ + { + label: 'Lead', + value: 'lead', + }, + { + label: 'Opportunity', + value: 'opportunity', + }, + ], + }, + { + label: 'Email', + key: 'email', + type: 'string', + required: false, + description: 'Email of lead contact', + variables: true, + }, + { + label: 'Contact Name', + key: 'contactName', + type: 'string', + required: false, + description: 'Name of lead contact', + variables: true, + }, + { + label: 'Phone Number', + key: 'phoneNumber', + type: 'string', + required: false, + description: 'Phone number of lead contact', + variables: true, + }, + { + label: 'Mobile Number', + key: 'mobileNumber', + type: 'string', + required: false, + description: 'Mobile number of lead contact', + variables: true, + }, + ], + + async run($) { + const uid = await authenticate($); + const id = await asyncMethodCall($, { + method: 'execute_kw', + params: [ + $.auth.data.databaseName, + uid, + $.auth.data.apiKey, + 'crm.lead', + 'create', + [ + { + name: $.step.parameters.name, + type: $.step.parameters.type, + email_from: $.step.parameters.email, + contact_name: $.step.parameters.contactName, + phone: $.step.parameters.phoneNumber, + mobile: $.step.parameters.mobileNumber, + }, + ], + ], + path: 'object', + }); + + $.setActionItem({ + raw: { + id: id, + }, + }); + }, +}); diff --git a/packages/backend/src/apps/odoo/actions/create-lead/index.ts b/packages/backend/src/apps/odoo/actions/create-lead/index.ts deleted file mode 100644 index a5935000..00000000 --- a/packages/backend/src/apps/odoo/actions/create-lead/index.ts +++ /dev/null @@ -1,103 +0,0 @@ -import defineAction from '../../../../helpers/define-action'; -import { authenticate, asyncMethodCall } from '../../common/xmlrpc-client'; - -export default defineAction({ - name: 'Create Lead', - key: 'createLead', - description: '', - arguments: [ - { - label: 'Name', - key: 'name', - type: 'string' as const, - required: true, - description: 'Lead name', - variables: true, - }, - { - label: 'Type', - key: 'type', - type: 'dropdown' as const, - required: true, - variables: true, - options: [ - { - label: 'Lead', - value: 'lead' - }, - { - label: 'Opportunity', - value: 'opportunity' - } - ] - }, - { - label: "Email", - key: 'email', - type: 'string' as const, - required: false, - description: 'Email of lead contact', - variables: true, - }, - { - label: "Contact Name", - key: 'contactName', - type: 'string' as const, - required: false, - description: 'Name of lead contact', - variables: true - }, - { - label: 'Phone Number', - key: 'phoneNumber', - type: 'string' as const, - required: false, - description: 'Phone number of lead contact', - variables: true - }, - { - label: 'Mobile Number', - key: 'mobileNumber', - type: 'string' as const, - required: false, - description: 'Mobile number of lead contact', - variables: true - } - ], - - async run($) { - const uid = await authenticate($); - const id = await asyncMethodCall( - $, - { - method: 'execute_kw', - params: [ - $.auth.data.databaseName, - uid, - $.auth.data.apiKey, - 'crm.lead', - 'create', - [ - { - name: $.step.parameters.name, - type: $.step.parameters.type, - email_from: $.step.parameters.email, - contact_name: $.step.parameters.contactName, - phone: $.step.parameters.phoneNumber, - mobile: $.step.parameters.mobileNumber - } - ] - ], - path: 'object', - }, - ); - - $.setActionItem( - { - raw: { - id: id - } - } - ) - } -}); diff --git a/packages/backend/src/apps/odoo/actions/index.js b/packages/backend/src/apps/odoo/actions/index.js new file mode 100644 index 00000000..5fb0747f --- /dev/null +++ b/packages/backend/src/apps/odoo/actions/index.js @@ -0,0 +1,3 @@ +import createLead from './create-lead/index.js'; + +export default [createLead]; diff --git a/packages/backend/src/apps/odoo/actions/index.ts b/packages/backend/src/apps/odoo/actions/index.ts deleted file mode 100644 index 70a23831..00000000 --- a/packages/backend/src/apps/odoo/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createLead from './create-lead'; - -export default [createLead]; diff --git a/packages/backend/src/apps/odoo/auth/index.ts b/packages/backend/src/apps/odoo/auth/index.js similarity index 72% rename from packages/backend/src/apps/odoo/auth/index.ts rename to packages/backend/src/apps/odoo/auth/index.js index 2362e232..55366638 100644 --- a/packages/backend/src/apps/odoo/auth/index.ts +++ b/packages/backend/src/apps/odoo/auth/index.js @@ -1,23 +1,24 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'host', label: 'Host Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, placeholder: null, - description: 'Host name of your Odoo Server (e.g. sub.domain.com without the protocol)', + description: + 'Host name of your Odoo Server (e.g. sub.domain.com without the protocol)', clickToCopy: false, }, { key: 'port', label: 'Port', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: '443', @@ -28,7 +29,7 @@ export default { { key: 'secure', label: 'Secure', - type: 'dropdown' as const, + type: 'dropdown', required: true, readOnly: false, value: 'true', @@ -49,7 +50,7 @@ export default { { key: 'databaseName', label: 'Database Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -60,27 +61,28 @@ export default { { key: 'email', label: 'Email Address', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, placeholder: null, - description: 'Email Address of the account that will be interacting with the database', - clickToCopy: false + description: + 'Email Address of the account that will be interacting with the database', + clickToCopy: false, }, { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, placeholder: null, description: 'API Key for your Odoo account', - clickToCopy: false - } + clickToCopy: false, + }, ], verifyCredentials, - isStillVerified + isStillVerified, }; diff --git a/packages/backend/src/apps/odoo/auth/is-still-verified.js b/packages/backend/src/apps/odoo/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/odoo/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/odoo/auth/is-still-verified.ts b/packages/backend/src/apps/odoo/auth/is-still-verified.ts deleted file mode 100644 index f676c026..00000000 --- a/packages/backend/src/apps/odoo/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {IGlobalVariable} from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -} - -export default isStillVerified; diff --git a/packages/backend/src/apps/odoo/auth/verify-credentials.ts b/packages/backend/src/apps/odoo/auth/verify-credentials.js similarity index 61% rename from packages/backend/src/apps/odoo/auth/verify-credentials.ts rename to packages/backend/src/apps/odoo/auth/verify-credentials.js index 64dfbeae..30aec786 100644 --- a/packages/backend/src/apps/odoo/auth/verify-credentials.ts +++ b/packages/backend/src/apps/odoo/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; -import { authenticate } from '../common/xmlrpc-client'; +import { authenticate } from '../common/xmlrpc-client.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { try { await authenticate($); @@ -11,6 +10,6 @@ const verifyCredentials = async ($: IGlobalVariable) => { } catch (error) { throw new Error('Failed while authorizing!'); } -} +}; export default verifyCredentials; diff --git a/packages/backend/src/apps/odoo/common/xmlrpc-client.js b/packages/backend/src/apps/odoo/common/xmlrpc-client.js new file mode 100644 index 00000000..d45cb9be --- /dev/null +++ b/packages/backend/src/apps/odoo/common/xmlrpc-client.js @@ -0,0 +1,53 @@ +import { join } from 'node:path'; +import xmlrpc from 'xmlrpc'; + +export const asyncMethodCall = async ($, { method, params, path }) => { + return new Promise((resolve, reject) => { + const client = getClient($, { path }); + + client.methodCall(method, params, (error, response) => { + if (error != null) { + // something went wrong on the server side, display the error returned by Odoo + reject(error); + } + + resolve(response); + }); + }); +}; + +export const getClient = ($, { path = 'common' }) => { + const host = $.auth.data.host; + const port = Number($.auth.data.port); + const secure = $.auth.data.secure === 'true'; + const createClientFunction = secure + ? xmlrpc.createSecureClient + : xmlrpc.createClient; + + return createClientFunction({ + host, + port, + path: join('/xmlrpc/2', path), + }); +}; + +export const authenticate = async ($) => { + const uid = await asyncMethodCall($, { + method: 'authenticate', + params: [ + $.auth.data.databaseName, + $.auth.data.email, + $.auth.data.apiKey, + [], + ], + }); + + if (!Number.isInteger(uid)) { + // failed to authenticate + throw new Error( + 'Failed to connect to the Odoo server. Please, check the credentials!' + ); + } + + return uid; +}; diff --git a/packages/backend/src/apps/odoo/common/xmlrpc-client.ts b/packages/backend/src/apps/odoo/common/xmlrpc-client.ts deleted file mode 100644 index 595dce53..00000000 --- a/packages/backend/src/apps/odoo/common/xmlrpc-client.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { join } from 'node:path'; -import xmlrpc from 'xmlrpc'; -import { IGlobalVariable } from "@automatisch/types"; - -type AsyncMethodCallPayload = { - method: string; - params: any[]; - path?: string; -} - -export const asyncMethodCall = async ($: IGlobalVariable, { method, params, path }: AsyncMethodCallPayload): Promise => { - return new Promise( - (resolve, reject) => { - const client = getClient($, { path }); - - client.methodCall( - method, - params, - (error, response) => { - if (error != null) { - // something went wrong on the server side, display the error returned by Odoo - reject(error); - } - - resolve(response); - } - ) - } - ); -} - -export const getClient = ($: IGlobalVariable, { path = 'common' }) => { - const host = $.auth.data.host as string; - const port = Number($.auth.data.port as string); - const secure = $.auth.data.secure === 'true'; - const createClientFunction = secure ? xmlrpc.createSecureClient : xmlrpc.createClient; - - return createClientFunction( - { - host, - port, - path: join('/xmlrpc/2', path), - } - ); -} - -export const authenticate = async ($: IGlobalVariable) => { - const uid = await asyncMethodCall( - $, - { - method: 'authenticate', - params: [ - $.auth.data.databaseName, - $.auth.data.email, - $.auth.data.apiKey, - [] - ] - } - ); - - if (!Number.isInteger(uid)) { - // failed to authenticate - throw new Error( - 'Failed to connect to the Odoo server. Please, check the credentials!' - ); - } - - return uid; -} diff --git a/packages/backend/src/apps/odoo/index.d.ts b/packages/backend/src/apps/odoo/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/odoo/index.ts b/packages/backend/src/apps/odoo/index.js similarity index 67% rename from packages/backend/src/apps/odoo/index.ts rename to packages/backend/src/apps/odoo/index.js index 3502708b..2e424746 100644 --- a/packages/backend/src/apps/odoo/index.ts +++ b/packages/backend/src/apps/odoo/index.js @@ -1,6 +1,6 @@ -import defineApp from '../../helpers/define-app'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Odoo', @@ -12,5 +12,5 @@ export default defineApp({ apiBaseUrl: '', primaryColor: '9c5789', auth, - actions + actions, }); diff --git a/packages/backend/src/apps/openai/actions/check-moderation/index.ts b/packages/backend/src/apps/openai/actions/check-moderation/index.js similarity index 54% rename from packages/backend/src/apps/openai/actions/check-moderation/index.ts rename to packages/backend/src/apps/openai/actions/check-moderation/index.js index af5a84f7..331acc7f 100644 --- a/packages/backend/src/apps/openai/actions/check-moderation/index.ts +++ b/packages/backend/src/apps/openai/actions/check-moderation/index.js @@ -1,23 +1,24 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Check moderation', key: 'checkModeration', - description: 'Checks for hate, hate/threatening, self-harm, sexual, sexual/minors, violence, or violence/graphic content in the given text.', + description: + 'Checks for hate, hate/threatening, self-harm, sexual, sexual/minors, violence, or violence/graphic content in the given text.', arguments: [ { label: 'Input', key: 'input', - type: 'string' as const, + type: 'string', required: true, variables: true, - description: 'The text to analyze.' + description: 'The text to analyze.', }, ], async run($) { const { data } = await $.http.post('/v1/moderations', { - input: $.step.parameters.input as string, + input: $.step.parameters.input, }); const result = data?.results[0]; diff --git a/packages/backend/src/apps/openai/actions/index.js b/packages/backend/src/apps/openai/actions/index.js new file mode 100644 index 00000000..45dbad51 --- /dev/null +++ b/packages/backend/src/apps/openai/actions/index.js @@ -0,0 +1,5 @@ +import checkModeration from './check-moderation/index.js'; +import sendPrompt from './send-prompt/index.js'; +import sendChatPrompt from './send-chat-prompt/index.js'; + +export default [checkModeration, sendChatPrompt, sendPrompt]; diff --git a/packages/backend/src/apps/openai/actions/index.ts b/packages/backend/src/apps/openai/actions/index.ts deleted file mode 100644 index 9c2ddf6c..00000000 --- a/packages/backend/src/apps/openai/actions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import checkModeration from './check-moderation'; -import sendPrompt from './send-prompt'; -import sendChatPrompt from './send-chat-prompt'; - -export default [checkModeration, sendChatPrompt, sendPrompt]; diff --git a/packages/backend/src/apps/openai/actions/send-chat-prompt/index.ts b/packages/backend/src/apps/openai/actions/send-chat-prompt/index.js similarity index 61% rename from packages/backend/src/apps/openai/actions/send-chat-prompt/index.ts rename to packages/backend/src/apps/openai/actions/send-chat-prompt/index.js index ea239036..2865a69a 100644 --- a/packages/backend/src/apps/openai/actions/send-chat-prompt/index.ts +++ b/packages/backend/src/apps/openai/actions/send-chat-prompt/index.js @@ -1,13 +1,8 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -type TMessage = { - role: string; - content: string; -} - -const castFloatOrUndefined = (value: string | null) => { +const castFloatOrUndefined = (value) => { return value === '' ? undefined : parseFloat(value); -} +}; export default defineAction({ name: 'Send chat prompt', @@ -17,7 +12,7 @@ export default defineAction({ { label: 'Model', key: 'model', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -34,7 +29,7 @@ export default defineAction({ { label: 'Messages', key: 'messages', - type: 'dynamic' as const, + type: 'dynamic', required: true, description: 'Add or remove messages as needed', value: [{ role: 'system', body: '' }], @@ -42,7 +37,7 @@ export default defineAction({ { label: 'Role', key: 'role', - type: 'dropdown' as const, + type: 'dropdown', required: true, options: [ { @@ -52,78 +47,84 @@ export default defineAction({ { label: 'User', value: 'user', - } + }, ], }, { label: 'Content', key: 'content', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], }, { label: 'Temperature', key: 'temperature', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.' + description: + 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.', }, { label: 'Maximum tokens', key: 'maxTokens', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'The maximum number of tokens to generate in the completion.' + description: + 'The maximum number of tokens to generate in the completion.', }, { label: 'Stop Sequence', key: 'stopSequence', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.' + description: + 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.', }, { label: 'Top P', key: 'topP', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.' + description: + 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.', }, { label: 'Frequency Penalty', key: 'frequencyPenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.`, }, { label: 'Presence Penalty', key: 'presencePenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.`, }, ], async run($) { const payload = { - model: $.step.parameters.model as string, - temperature: castFloatOrUndefined($.step.parameters.temperature as string), - max_tokens: castFloatOrUndefined($.step.parameters.maxTokens as string), - stop: ($.step.parameters.stopSequence as string || null), - top_p: castFloatOrUndefined($.step.parameters.topP as string), - frequency_penalty: castFloatOrUndefined($.step.parameters.frequencyPenalty as string), - presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty as string), - messages: ($.step.parameters.messages as TMessage[]).map(message => ({ + model: $.step.parameters.model, + temperature: castFloatOrUndefined($.step.parameters.temperature), + max_tokens: castFloatOrUndefined($.step.parameters.maxTokens), + stop: $.step.parameters.stopSequence || null, + top_p: castFloatOrUndefined($.step.parameters.topP), + frequency_penalty: castFloatOrUndefined( + $.step.parameters.frequencyPenalty + ), + presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty), + messages: $.step.parameters.messages.map((message) => ({ role: message.role, content: message.content, })), diff --git a/packages/backend/src/apps/openai/actions/send-prompt/index.ts b/packages/backend/src/apps/openai/actions/send-prompt/index.js similarity index 57% rename from packages/backend/src/apps/openai/actions/send-prompt/index.ts rename to packages/backend/src/apps/openai/actions/send-prompt/index.js index cff0ae8f..786b81e1 100644 --- a/packages/backend/src/apps/openai/actions/send-prompt/index.ts +++ b/packages/backend/src/apps/openai/actions/send-prompt/index.js @@ -1,8 +1,8 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -const castFloatOrUndefined = (value: string | null) => { +const castFloatOrUndefined = (value) => { return value === '' ? undefined : parseFloat(value); -} +}; export default defineAction({ name: 'Send prompt', @@ -12,7 +12,7 @@ export default defineAction({ { label: 'Model', key: 'model', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -29,71 +29,77 @@ export default defineAction({ { label: 'Prompt', key: 'prompt', - type: 'string' as const, + type: 'string', required: true, variables: true, - description: 'The text to analyze.' + description: 'The text to analyze.', }, { label: 'Temperature', key: 'temperature', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.' + description: + 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.', }, { label: 'Maximum tokens', key: 'maxTokens', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'The maximum number of tokens to generate in the completion.' + description: + 'The maximum number of tokens to generate in the completion.', }, { label: 'Stop Sequence', key: 'stopSequence', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.' + description: + 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.', }, { label: 'Top P', key: 'topP', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.' + description: + 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.', }, { label: 'Frequency Penalty', key: 'frequencyPenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.`, }, { label: 'Presence Penalty', key: 'presencePenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.`, }, ], async run($) { const payload = { - model: $.step.parameters.model as string, - prompt: $.step.parameters.prompt as string, - temperature: castFloatOrUndefined($.step.parameters.temperature as string), - max_tokens: castFloatOrUndefined($.step.parameters.maxTokens as string), - stop: ($.step.parameters.stopSequence as string || null), - top_p: castFloatOrUndefined($.step.parameters.topP as string), - frequency_penalty: castFloatOrUndefined($.step.parameters.frequencyPenalty as string), - presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty as string), + model: $.step.parameters.model, + prompt: $.step.parameters.prompt, + temperature: castFloatOrUndefined($.step.parameters.temperature), + max_tokens: castFloatOrUndefined($.step.parameters.maxTokens), + stop: $.step.parameters.stopSequence || null, + top_p: castFloatOrUndefined($.step.parameters.topP), + frequency_penalty: castFloatOrUndefined( + $.step.parameters.frequencyPenalty + ), + presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty), }; const { data } = await $.http.post('/v1/completions', payload); diff --git a/packages/backend/src/apps/openai/auth/index.ts b/packages/backend/src/apps/openai/auth/index.js similarity index 79% rename from packages/backend/src/apps/openai/auth/index.ts rename to packages/backend/src/apps/openai/auth/index.js index 78d9e38f..cd9c891d 100644 --- a/packages/backend/src/apps/openai/auth/index.ts +++ b/packages/backend/src/apps/openai/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/openai/auth/is-still-verified.js b/packages/backend/src/apps/openai/auth/is-still-verified.js new file mode 100644 index 00000000..3e6c9095 --- /dev/null +++ b/packages/backend/src/apps/openai/auth/is-still-verified.js @@ -0,0 +1,6 @@ +const isStillVerified = async ($) => { + await $.http.get('/v1/models'); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/openai/auth/is-still-verified.ts b/packages/backend/src/apps/openai/auth/is-still-verified.ts deleted file mode 100644 index 9f5895f0..00000000 --- a/packages/backend/src/apps/openai/auth/is-still-verified.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { - await $.http.get('/v1/models'); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/openai/auth/verify-credentials.js b/packages/backend/src/apps/openai/auth/verify-credentials.js new file mode 100644 index 00000000..7f43f884 --- /dev/null +++ b/packages/backend/src/apps/openai/auth/verify-credentials.js @@ -0,0 +1,5 @@ +const verifyCredentials = async ($) => { + await $.http.get('/v1/models'); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/openai/auth/verify-credentials.ts b/packages/backend/src/apps/openai/auth/verify-credentials.ts deleted file mode 100644 index e9fb2540..00000000 --- a/packages/backend/src/apps/openai/auth/verify-credentials.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - await $.http.get('/v1/models'); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/self-hosted-llm/common/add-auth-header.ts b/packages/backend/src/apps/openai/common/add-auth-header.js similarity index 58% rename from packages/backend/src/apps/self-hosted-llm/common/add-auth-header.ts rename to packages/backend/src/apps/openai/common/add-auth-header.js index 2b0de0ce..f9f5acba 100644 --- a/packages/backend/src/apps/self-hosted-llm/common/add-auth-header.ts +++ b/packages/backend/src/apps/openai/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.apiKey) { requestConfig.headers.Authorization = `Bearer ${$.auth.data.apiKey}`; } diff --git a/packages/backend/src/apps/openai/dynamic-data/index.js b/packages/backend/src/apps/openai/dynamic-data/index.js new file mode 100644 index 00000000..6db48046 --- /dev/null +++ b/packages/backend/src/apps/openai/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listModels from './list-models/index.js'; + +export default [listModels]; diff --git a/packages/backend/src/apps/openai/dynamic-data/index.ts b/packages/backend/src/apps/openai/dynamic-data/index.ts deleted file mode 100644 index 4072dcdd..00000000 --- a/packages/backend/src/apps/openai/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listModels from './list-models'; - -export default [listModels]; diff --git a/packages/backend/src/apps/openai/dynamic-data/list-models/index.ts b/packages/backend/src/apps/openai/dynamic-data/list-models/index.js similarity index 59% rename from packages/backend/src/apps/openai/dynamic-data/list-models/index.ts rename to packages/backend/src/apps/openai/dynamic-data/list-models/index.js index 645b9f1e..a8e81538 100644 --- a/packages/backend/src/apps/openai/dynamic-data/list-models/index.ts +++ b/packages/backend/src/apps/openai/dynamic-data/list-models/index.js @@ -1,13 +1,11 @@ -import { IGlobalVariable } from '@automatisch/types'; - export default { name: 'List models', key: 'listModels', - async run($: IGlobalVariable) { + async run($) { const response = await $.http.get('/v1/models'); - const models = response.data.data.map((model: { id: string }) => { + const models = response.data.data.map((model) => { return { value: model.id, name: model.id, diff --git a/packages/backend/src/apps/openai/index.d.ts b/packages/backend/src/apps/openai/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/openai/index.ts b/packages/backend/src/apps/openai/index.js similarity index 61% rename from packages/backend/src/apps/openai/index.ts rename to packages/backend/src/apps/openai/index.js index 5be0b394..be973de0 100644 --- a/packages/backend/src/apps/openai/index.ts +++ b/packages/backend/src/apps/openai/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'OpenAI', diff --git a/packages/backend/src/apps/pipedrive/actions/create-activity/index.ts b/packages/backend/src/apps/pipedrive/actions/create-activity/index.js similarity index 80% rename from packages/backend/src/apps/pipedrive/actions/create-activity/index.ts rename to packages/backend/src/apps/pipedrive/actions/create-activity/index.js index 5860e4ab..ca2a42bf 100644 --- a/packages/backend/src/apps/pipedrive/actions/create-activity/index.ts +++ b/packages/backend/src/apps/pipedrive/actions/create-activity/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; export default defineAction({ name: 'Create activity', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Subject', key: 'subject', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -17,7 +17,7 @@ export default defineAction({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -35,7 +35,7 @@ export default defineAction({ { label: 'Assigned To', key: 'userId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'If omitted, the activity will be assigned to the user of the connected account.', @@ -54,7 +54,7 @@ export default defineAction({ { label: 'Person', key: 'personId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -72,7 +72,7 @@ export default defineAction({ { label: 'Deal', key: 'dealId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -90,7 +90,7 @@ export default defineAction({ { label: 'Is done?', key: 'isDone', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', options: [ @@ -107,7 +107,7 @@ export default defineAction({ { label: 'Type', key: 'type', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -125,7 +125,7 @@ export default defineAction({ { label: 'Due Date', key: 'dueDate', - type: 'string' as const, + type: 'string', required: false, description: 'Format must be YYYY-MM-DD', variables: true, @@ -133,7 +133,7 @@ export default defineAction({ { label: 'Due Time', key: 'dueTime', - type: 'string' as const, + type: 'string', required: false, description: 'Format must be HH:MM', variables: true, @@ -141,7 +141,7 @@ export default defineAction({ { label: 'Duration', key: 'duration', - type: 'string' as const, + type: 'string', required: false, description: 'Format must be HH:MM', variables: true, @@ -149,7 +149,7 @@ export default defineAction({ { label: 'Note', key: 'note', - type: 'string' as const, + type: 'string', required: false, description: 'Accepts HTML format', variables: true, @@ -172,17 +172,17 @@ export default defineAction({ } = $.step.parameters; const fields = { - subject: subject as string, - org_id: organizationId as number, - user_id: userId as number, - person_id: personId as number, - deal_id: dealId as number, - done: isDone as number, - type: type as string, - due_time: dueTime as string, - due_date: dueDate as string, - duration: duration as string, - note: note as string, + subject: subject, + org_id: organizationId, + user_id: userId, + person_id: personId, + deal_id: dealId, + done: isDone, + type: type, + due_time: dueTime, + due_date: dueDate, + duration: duration, + note: note, }; const body = filterProvidedFields(fields); diff --git a/packages/backend/src/apps/pipedrive/actions/create-deal/index.ts b/packages/backend/src/apps/pipedrive/actions/create-deal/index.js similarity index 83% rename from packages/backend/src/apps/pipedrive/actions/create-deal/index.ts rename to packages/backend/src/apps/pipedrive/actions/create-deal/index.js index 8f6472bb..ad1430df 100644 --- a/packages/backend/src/apps/pipedrive/actions/create-deal/index.ts +++ b/packages/backend/src/apps/pipedrive/actions/create-deal/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; export default defineAction({ name: 'Create deal', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -17,7 +17,7 @@ export default defineAction({ { label: 'Creation Date', key: 'addTime', - type: 'string' as const, + type: 'string', required: false, description: 'Requires admin access to Pipedrive account. Format: YYYY-MM-DD HH:MM:SS', @@ -26,7 +26,7 @@ export default defineAction({ { label: 'Status', key: 'status', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', options: [ @@ -51,7 +51,7 @@ export default defineAction({ { label: 'Lost Reason', key: 'lostReason', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -59,7 +59,7 @@ export default defineAction({ { label: 'Stage', key: 'stageId', - type: 'dropdown' as const, + type: 'dropdown', required: false, value: '1', description: @@ -94,7 +94,7 @@ export default defineAction({ { label: 'Owner', key: 'userId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Select user who will be marked as the owner of this deal. If omitted, the authorized user will be used.', @@ -113,7 +113,7 @@ export default defineAction({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Organization this deal will be associated with.', variables: true, @@ -131,7 +131,7 @@ export default defineAction({ { label: 'Person', key: 'personId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Person this deal will be associated with.', variables: true, @@ -149,7 +149,7 @@ export default defineAction({ { label: 'Probability', key: 'probability', - type: 'string' as const, + type: 'string', required: false, description: 'The success probability percentage of the deal. Used/shown only when deal_probability for the pipeline of the deal is enabled.', @@ -158,7 +158,7 @@ export default defineAction({ { label: 'Expected Close Date', key: 'expectedCloseDate', - type: 'string' as const, + type: 'string', required: false, description: 'The expected close date of the deal. In ISO 8601 format: YYYY-MM-DD.', @@ -167,7 +167,7 @@ export default defineAction({ { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: false, description: 'The value of the deal. If omitted, value will be set to 0.', variables: true, @@ -175,7 +175,7 @@ export default defineAction({ { label: 'Currency', key: 'currency', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'The currency of the deal. Accepts a 3-character currency code. If omitted, currency will be set to the default currency of the authorized user.', @@ -210,18 +210,18 @@ export default defineAction({ } = $.step.parameters; const fields = { - title: title as string, - value: value as string, - add_time: addTime as string, - status: status as string, - lost_reason: lostReason as string, - stage_id: stageId as number, - user_id: userId as number, - org_id: organizationId as number, - person_id: personId as number, - probability: probability as number, - expected_close_date: expectedCloseDate as string, - currency: currency as string, + title: title, + value: value, + add_time: addTime, + status: status, + lost_reason: lostReason, + stage_id: stageId, + user_id: userId, + org_id: organizationId, + person_id: personId, + probability: probability, + expected_close_date: expectedCloseDate, + currency: currency, }; const body = filterProvidedFields(fields); diff --git a/packages/backend/src/apps/pipedrive/actions/create-lead/index.ts b/packages/backend/src/apps/pipedrive/actions/create-lead/index.js similarity index 83% rename from packages/backend/src/apps/pipedrive/actions/create-lead/index.ts rename to packages/backend/src/apps/pipedrive/actions/create-lead/index.js index 2cc5a922..b17129e1 100644 --- a/packages/backend/src/apps/pipedrive/actions/create-lead/index.ts +++ b/packages/backend/src/apps/pipedrive/actions/create-lead/index.js @@ -1,9 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; - -type LabelIds = { __id: string; leadLabelId: string }[]; - -type LabelValue = { amount?: number; currency?: string }; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; export default defineAction({ name: 'Create lead', @@ -13,7 +9,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -21,7 +17,7 @@ export default defineAction({ { label: 'Person', key: 'personId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Lead must be associated with at least one person or organization.', @@ -40,7 +36,7 @@ export default defineAction({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Lead must be associated with at least one person or organization.', @@ -59,7 +55,7 @@ export default defineAction({ { label: 'Owner', key: 'ownerId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Select user who will be marked as the owner of this lead. If omitted, the authorized user will be used.', @@ -78,14 +74,14 @@ export default defineAction({ { label: 'Lead Labels', key: 'labelIds', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Label', key: 'leadLabelId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, source: { @@ -104,7 +100,7 @@ export default defineAction({ { label: 'Expected Close Date', key: 'expectedCloseDate', - type: 'string' as const, + type: 'string', required: false, description: 'E.g. 2023-10-23', variables: true, @@ -112,7 +108,7 @@ export default defineAction({ { label: 'Lead Value', key: 'value', - type: 'string' as const, + type: 'string', required: false, description: 'E.g. 150', variables: true, @@ -120,7 +116,7 @@ export default defineAction({ { label: 'Lead Value Currency', key: 'currency', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'This field is required if a Lead Value amount is provided.', variables: true, @@ -149,25 +145,25 @@ export default defineAction({ currency, } = $.step.parameters; - const onlyLabelIds = (labelIds as LabelIds) + const onlyLabelIds = labelIds .map((labelId) => labelId.leadLabelId) .filter(Boolean); - const labelValue: LabelValue = {}; + const labelValue = {}; if (value) { labelValue.amount = Number(value); } if (currency) { - labelValue.currency = currency as string; + labelValue.currency = currency; } const fields = { - title: title as string, + title: title, person_id: Number(personId), organization_id: Number(organizationId), owner_id: Number(ownerId), - expected_close_date: expectedCloseDate as string, + expected_close_date: expectedCloseDate, label_ids: onlyLabelIds, value: labelValue, }; diff --git a/packages/backend/src/apps/pipedrive/actions/create-note/index.ts b/packages/backend/src/apps/pipedrive/actions/create-note/index.js similarity index 82% rename from packages/backend/src/apps/pipedrive/actions/create-note/index.ts rename to packages/backend/src/apps/pipedrive/actions/create-note/index.js index caaaaacf..781d87b5 100644 --- a/packages/backend/src/apps/pipedrive/actions/create-note/index.ts +++ b/packages/backend/src/apps/pipedrive/actions/create-note/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; export default defineAction({ name: 'Create note', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Content', key: 'content', - type: 'string' as const, + type: 'string', required: true, description: 'Supports some HTML formatting.', variables: true, @@ -17,7 +17,7 @@ export default defineAction({ { label: 'Deal', key: 'dealId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Note must be associated with at least one deal, person, organization, or lead.', @@ -36,7 +36,7 @@ export default defineAction({ { label: 'Pin note on specified deal?', key: 'pinnedDeal', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', options: [ @@ -53,7 +53,7 @@ export default defineAction({ { label: 'Person', key: 'personId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Note must be associated with at least one deal, person, organization, or lead.', @@ -72,7 +72,7 @@ export default defineAction({ { label: 'Pin note on specified person?', key: 'pinnedPerson', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', options: [ @@ -89,7 +89,7 @@ export default defineAction({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Note must be associated with at least one deal, person, organization, or lead.', @@ -108,7 +108,7 @@ export default defineAction({ { label: 'Pin note on specified organization?', key: 'pinnedOrganization', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', options: [ @@ -125,7 +125,7 @@ export default defineAction({ { label: 'Lead', key: 'leadId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Note must be associated with at least one deal, person, organization, or lead.', @@ -144,7 +144,7 @@ export default defineAction({ { label: 'Pin note on specified lead?', key: 'pinnedLead', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', options: [ @@ -174,15 +174,15 @@ export default defineAction({ } = $.step.parameters; const fields = { - content: content as string, - deal_id: dealId as number, - pinned_to_deal_flag: pinnedDeal as number, - person_id: personId as number, - pinned_to_person_flag: pinnedPerson as number, - org_id: organizationId as number, - pinned_to_organization_flag: pinnedOrganization as number, - lead_id: leadId as string, - pinned_to_lead_flag: pinnedLead as number, + content: content, + deal_id: dealId, + pinned_to_deal_flag: pinnedDeal, + person_id: personId, + pinned_to_person_flag: pinnedPerson, + org_id: organizationId, + pinned_to_organization_flag: pinnedOrganization, + lead_id: leadId, + pinned_to_lead_flag: pinnedLead, }; const body = filterProvidedFields(fields); diff --git a/packages/backend/src/apps/pipedrive/actions/create-organization/index.ts b/packages/backend/src/apps/pipedrive/actions/create-organization/index.js similarity index 88% rename from packages/backend/src/apps/pipedrive/actions/create-organization/index.ts rename to packages/backend/src/apps/pipedrive/actions/create-organization/index.js index 3a43bda3..4f8d4950 100644 --- a/packages/backend/src/apps/pipedrive/actions/create-organization/index.ts +++ b/packages/backend/src/apps/pipedrive/actions/create-organization/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; export default defineAction({ name: 'Create organization', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -17,7 +17,7 @@ export default defineAction({ { label: 'Owner', key: 'ownerId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -35,7 +35,7 @@ export default defineAction({ { label: 'Label', key: 'labelId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, diff --git a/packages/backend/src/apps/pipedrive/actions/create-person/index.ts b/packages/backend/src/apps/pipedrive/actions/create-person/index.js similarity index 81% rename from packages/backend/src/apps/pipedrive/actions/create-person/index.ts rename to packages/backend/src/apps/pipedrive/actions/create-person/index.js index 171780ad..fa96da26 100644 --- a/packages/backend/src/apps/pipedrive/actions/create-person/index.ts +++ b/packages/backend/src/apps/pipedrive/actions/create-person/index.js @@ -1,15 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import { filterProvidedFields } from '../../common/filter-provided-fields'; - -type TEmail = { - __id: string; - email: string; -}[]; - -type TPhone = { - __id: string; - phone: string; -}[]; +import defineAction from '../../../../helpers/define-action.js'; +import { filterProvidedFields } from '../../common/filter-provided-fields.js'; export default defineAction({ name: 'Create person', @@ -19,7 +9,7 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -27,7 +17,7 @@ export default defineAction({ { label: 'Owner', key: 'ownerId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -45,7 +35,7 @@ export default defineAction({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -63,14 +53,14 @@ export default defineAction({ { label: 'Emails', key: 'emails', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Email', key: 'email', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -80,14 +70,14 @@ export default defineAction({ { label: 'Phones', key: 'phones', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Phone', key: 'phone', - type: 'string' as const, + type: 'string', required: false, description: '', variables: true, @@ -97,7 +87,7 @@ export default defineAction({ { label: 'Label', key: 'labelId', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -116,9 +106,9 @@ export default defineAction({ async run($) { const { name, ownerId, organizationId, labelId } = $.step.parameters; - const emails = $.step.parameters.emails as TEmail; + const emails = $.step.parameters.emails; const emailValues = emails.map((entry) => entry.email); - const phones = $.step.parameters.phones as TPhone; + const phones = $.step.parameters.phones; const phoneValues = phones.map((entry) => entry.phone); const fields = { diff --git a/packages/backend/src/apps/pipedrive/actions/index.js b/packages/backend/src/apps/pipedrive/actions/index.js new file mode 100644 index 00000000..81460de6 --- /dev/null +++ b/packages/backend/src/apps/pipedrive/actions/index.js @@ -0,0 +1,15 @@ +import createActivity from './create-activity/index.js'; +import createDeal from './create-deal/index.js'; +import createLead from './create-lead/index.js'; +import createNote from './create-note/index.js'; +import createOrganization from './create-organization/index.js'; +import createPerson from './create-person/index.js'; + +export default [ + createActivity, + createDeal, + createLead, + createNote, + createOrganization, + createPerson, +]; diff --git a/packages/backend/src/apps/pipedrive/actions/index.ts b/packages/backend/src/apps/pipedrive/actions/index.ts deleted file mode 100644 index ffabeaa5..00000000 --- a/packages/backend/src/apps/pipedrive/actions/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import createActivity from './create-activity'; -import createDeal from './create-deal'; -import createLead from './create-lead'; -import createNote from './create-note'; -import createOrganization from './create-organization'; -import createPerson from './create-person'; - -export default [ - createActivity, - createDeal, - createLead, - createNote, - createOrganization, - createPerson, -]; diff --git a/packages/backend/src/apps/pipedrive/auth/generate-auth-url.ts b/packages/backend/src/apps/pipedrive/auth/generate-auth-url.js similarity index 51% rename from packages/backend/src/apps/pipedrive/auth/generate-auth-url.ts rename to packages/backend/src/apps/pipedrive/auth/generate-auth-url.js index 1e35bada..90790108 100644 --- a/packages/backend/src/apps/pipedrive/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/pipedrive/auth/generate-auth-url.js @@ -1,13 +1,12 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, }); diff --git a/packages/backend/src/apps/pipedrive/auth/index.ts b/packages/backend/src/apps/pipedrive/auth/index.js similarity index 74% rename from packages/backend/src/apps/pipedrive/auth/index.ts rename to packages/backend/src/apps/pipedrive/auth/index.js index 5e0ee567..732ed018 100644 --- a/packages/backend/src/apps/pipedrive/auth/index.ts +++ b/packages/backend/src/apps/pipedrive/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/pipedrive/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/pipedrive/auth/is-still-verified.js b/packages/backend/src/apps/pipedrive/auth/is-still-verified.js new file mode 100644 index 00000000..6d792b12 --- /dev/null +++ b/packages/backend/src/apps/pipedrive/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/pipedrive/auth/is-still-verified.ts b/packages/backend/src/apps/pipedrive/auth/is-still-verified.ts deleted file mode 100644 index 93a01099..00000000 --- a/packages/backend/src/apps/pipedrive/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/pipedrive/auth/refresh-token.ts b/packages/backend/src/apps/pipedrive/auth/refresh-token.js similarity index 82% rename from packages/backend/src/apps/pipedrive/auth/refresh-token.ts rename to packages/backend/src/apps/pipedrive/auth/refresh-token.js index 4be1185d..c0d84f6a 100644 --- a/packages/backend/src/apps/pipedrive/auth/refresh-token.ts +++ b/packages/backend/src/apps/pipedrive/auth/refresh-token.js @@ -1,10 +1,9 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const params = new URLSearchParams({ grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const headers = { diff --git a/packages/backend/src/apps/pipedrive/auth/verify-credentials.ts b/packages/backend/src/apps/pipedrive/auth/verify-credentials.js similarity index 77% rename from packages/backend/src/apps/pipedrive/auth/verify-credentials.ts rename to packages/backend/src/apps/pipedrive/auth/verify-credentials.js index 40d11f9d..2cb1b508 100644 --- a/packages/backend/src/apps/pipedrive/auth/verify-credentials.ts +++ b/packages/backend/src/apps/pipedrive/auth/verify-credentials.js @@ -1,15 +1,14 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const params = new URLSearchParams({ grant_type: 'authorization_code', - code: $.auth.data.code as string, + code: $.auth.data.code, redirect_uri: redirectUri, }); diff --git a/packages/backend/src/apps/pipedrive/common/add-auth-header.ts b/packages/backend/src/apps/pipedrive/common/add-auth-header.js similarity index 71% rename from packages/backend/src/apps/pipedrive/common/add-auth-header.ts rename to packages/backend/src/apps/pipedrive/common/add-auth-header.js index d15b043e..679ef605 100644 --- a/packages/backend/src/apps/pipedrive/common/add-auth-header.ts +++ b/packages/backend/src/apps/pipedrive/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if (requestConfig.additionalProperties?.skipAddingAuthHeader) return requestConfig; diff --git a/packages/backend/src/apps/pipedrive/common/filter-provided-fields.js b/packages/backend/src/apps/pipedrive/common/filter-provided-fields.js new file mode 100644 index 00000000..1da42951 --- /dev/null +++ b/packages/backend/src/apps/pipedrive/common/filter-provided-fields.js @@ -0,0 +1,16 @@ +import isObject from 'lodash/isObject.js'; + +export function filterProvidedFields(body) { + return Object.keys(body).reduce((result, key) => { + const value = body[key]; + if (isObject(value)) { + const filteredNestedObj = filterProvidedFields(value); + if (Object.keys(filteredNestedObj).length > 0) { + result[key] = filteredNestedObj; + } + } else if (body[key]) { + result[key] = value; + } + return result; + }, {}); +} diff --git a/packages/backend/src/apps/pipedrive/common/filter-provided-fields.ts b/packages/backend/src/apps/pipedrive/common/filter-provided-fields.ts deleted file mode 100644 index fa88c8ee..00000000 --- a/packages/backend/src/apps/pipedrive/common/filter-provided-fields.ts +++ /dev/null @@ -1,18 +0,0 @@ -import isObject from 'lodash/isObject'; - -export function filterProvidedFields(body: Record) { - return Object.keys(body).reduce>((result, key) => { - const value = body[key]; - if (isObject(value)) { - const filteredNestedObj = filterProvidedFields( - value as Record - ); - if (Object.keys(filteredNestedObj).length > 0) { - result[key] = filteredNestedObj; - } - } else if (body[key]) { - result[key] = value; - } - return result; - }, {}); -} diff --git a/packages/backend/src/apps/pipedrive/common/get-current-user.ts b/packages/backend/src/apps/pipedrive/common/get-current-user.js similarity index 55% rename from packages/backend/src/apps/pipedrive/common/get-current-user.ts rename to packages/backend/src/apps/pipedrive/common/get-current-user.js index 024ede73..469245b6 100644 --- a/packages/backend/src/apps/pipedrive/common/get-current-user.ts +++ b/packages/backend/src/apps/pipedrive/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get(`${$.auth.data.apiDomain}/api/v1/users/me`); const currentUser = response.data.data; diff --git a/packages/backend/src/apps/pipedrive/common/set-base-url.js b/packages/backend/src/apps/pipedrive/common/set-base-url.js new file mode 100644 index 00000000..3e814068 --- /dev/null +++ b/packages/backend/src/apps/pipedrive/common/set-base-url.js @@ -0,0 +1,10 @@ +const setBaseUrl = ($, requestConfig) => { + const { apiDomain } = $.auth.data; + + if (apiDomain) { + requestConfig.baseURL = apiDomain; + } + + return requestConfig; +}; +export default setBaseUrl; diff --git a/packages/backend/src/apps/pipedrive/common/set-base-url.ts b/packages/backend/src/apps/pipedrive/common/set-base-url.ts deleted file mode 100644 index f9900b90..00000000 --- a/packages/backend/src/apps/pipedrive/common/set-base-url.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - const { apiDomain } = $.auth.data; - - if (apiDomain) { - requestConfig.baseURL = apiDomain as string; - } - - return requestConfig; -}; -export default setBaseUrl; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/index.js b/packages/backend/src/apps/pipedrive/dynamic-data/index.js new file mode 100644 index 00000000..a914406a --- /dev/null +++ b/packages/backend/src/apps/pipedrive/dynamic-data/index.js @@ -0,0 +1,23 @@ +import listActivityTypes from './list-activity-types/index.js'; +import listCurrencies from './list-currencies/index.js'; +import listDeals from './list-deals/index.js'; +import listLeads from './list-leads/index.js'; +import listLeadLabels from './list-lead-labels/index.js'; +import listOrganizations from './list-organizations/index.js'; +import listOrganizationLabelField from './list-organization-label-field/index.js'; +import listPersonLabelField from './list-person-label-field/index.js'; +import listPersons from './list-persons/index.js'; +import listUsers from './list-users/index.js'; + +export default [ + listActivityTypes, + listCurrencies, + listDeals, + listLeads, + listLeadLabels, + listOrganizations, + listOrganizationLabelField, + listPersonLabelField, + listPersons, + listUsers, +]; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/index.ts deleted file mode 100644 index dfc4118a..00000000 --- a/packages/backend/src/apps/pipedrive/dynamic-data/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import listActivityTypes from './list-activity-types'; -import listCurrencies from './list-currencies'; -import listDeals from './list-deals'; -import listLeads from './list-leads'; -import listLeadLabels from './list-lead-labels'; -import listOrganizations from './list-organizations'; -import listOrganizationLabelField from './list-organization-label-field'; -import listPersonLabelField from './list-person-label-field'; -import listPersons from './list-persons'; -import listUsers from './list-users'; - -export default [ - listActivityTypes, - listCurrencies, - listDeals, - listLeads, - listLeadLabels, - listOrganizations, - listOrganizationLabelField, - listPersonLabelField, - listPersons, - listUsers, -]; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-activity-types/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-activity-types/index.js similarity index 73% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-activity-types/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-activity-types/index.js index 7867a609..ad54e913 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-activity-types/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-activity-types/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List activity types', key: 'listActivityTypes', - async run($: IGlobalVariable) { - const activityTypes: { - data: IJSONObject[]; - } = { + async run($) { + const activityTypes = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-currencies/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-currencies/index.js similarity index 71% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-currencies/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-currencies/index.js index c3d12592..9a00e7dd 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-currencies/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-currencies/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List currencies', key: 'listCurrencies', - async run($: IGlobalVariable) { - const currencies: { - data: IJSONObject[]; - } = { + async run($) { + const currencies = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-deals/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-deals/index.js similarity index 73% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-deals/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-deals/index.js index 2ac3e4c8..901ec228 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-deals/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-deals/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List deals', key: 'listDeals', - async run($: IGlobalVariable) { - const deals: { - data: IJSONObject[]; - } = { + async run($) { + const deals = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-lead-labels/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-lead-labels/index.js similarity index 74% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-lead-labels/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-lead-labels/index.js index cc22454a..b75c3c7a 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-lead-labels/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-lead-labels/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List lead labels', key: 'listLeadLabels', - async run($: IGlobalVariable) { - const leadLabels: { - data: IJSONObject[]; - } = { + async run($) { + const leadLabels = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-leads/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-leads/index.js similarity index 73% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-leads/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-leads/index.js index f493b843..e92bda65 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-leads/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-leads/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List leads', key: 'listLeads', - async run($: IGlobalVariable) { - const leads: { - data: IJSONObject[]; - } = { + async run($) { + const leads = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-organization-label-field/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-organization-label-field/index.js similarity index 65% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-organization-label-field/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-organization-label-field/index.js index b0d401ef..1cd84ef6 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-organization-label-field/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-organization-label-field/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List organization label field', key: 'listOrganizationLabelField', - async run($: IGlobalVariable) { - const labelFields: { - data: IJSONObject[]; - } = { + async run($) { + const labelFields = { data: [], }; @@ -15,9 +11,7 @@ export default { `${$.auth.data.apiDomain}/api/v1/organizationFields` ); - const labelField = data.data.filter( - (field: IJSONObject) => field.key === 'label' - ); + const labelField = data.data.filter((field) => field.key === 'label'); const labelOptions = labelField[0].options; if (labelOptions?.length) { diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-organizations/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-organizations/index.js similarity index 72% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-organizations/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-organizations/index.js index b24f176e..597d95ce 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-organizations/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-organizations/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List organizations', key: 'listOrganizations', - async run($: IGlobalVariable) { - const organizations: { - data: IJSONObject[]; - } = { + async run($) { + const organizations = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-person-label-field/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-person-label-field/index.js similarity index 76% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-person-label-field/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-person-label-field/index.js index f162eefe..ce1dfffb 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-person-label-field/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-person-label-field/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List person label field', key: 'listPersonLabelField', - async run($: IGlobalVariable) { - const personFields: { - data: IJSONObject[]; - } = { + async run($) { + const personFields = { data: [], }; @@ -24,7 +20,7 @@ export default { params.start = data.additional_data?.pagination?.next_start; const labelField = data.data?.filter( - (personField: IJSONObject) => personField.key === 'label' + (personField) => personField.key === 'label' ); const labelOptions = labelField[0].options; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-persons/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-persons/index.js similarity index 78% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-persons/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-persons/index.js index a790aa6d..dadd841c 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-persons/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-persons/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List persons', key: 'listPersons', - async run($: IGlobalVariable) { - const persons: { - data: IJSONObject[]; - } = { + async run($) { + const persons = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/dynamic-data/list-users/index.ts b/packages/backend/src/apps/pipedrive/dynamic-data/list-users/index.js similarity index 69% rename from packages/backend/src/apps/pipedrive/dynamic-data/list-users/index.ts rename to packages/backend/src/apps/pipedrive/dynamic-data/list-users/index.js index d35c7cd1..b07433bf 100644 --- a/packages/backend/src/apps/pipedrive/dynamic-data/list-users/index.ts +++ b/packages/backend/src/apps/pipedrive/dynamic-data/list-users/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List users', key: 'listUsers', - async run($: IGlobalVariable) { - const users: { - data: IJSONObject[]; - } = { + async run($) { + const users = { data: [], }; diff --git a/packages/backend/src/apps/pipedrive/index.d.ts b/packages/backend/src/apps/pipedrive/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/pipedrive/index.ts b/packages/backend/src/apps/pipedrive/index.js similarity index 53% rename from packages/backend/src/apps/pipedrive/index.ts rename to packages/backend/src/apps/pipedrive/index.js index e2092db1..3fc14508 100644 --- a/packages/backend/src/apps/pipedrive/index.ts +++ b/packages/backend/src/apps/pipedrive/index.js @@ -1,10 +1,10 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import setBaseUrl from './common/set-base-url'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import setBaseUrl from './common/set-base-url.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Pipedrive', diff --git a/packages/backend/src/apps/pipedrive/triggers/index.js b/packages/backend/src/apps/pipedrive/triggers/index.js new file mode 100644 index 00000000..e2e3b9f2 --- /dev/null +++ b/packages/backend/src/apps/pipedrive/triggers/index.js @@ -0,0 +1,6 @@ +import newActivities from './new-activities/index.js'; +import newDeals from './new-deals/index.js'; +import newLeads from './new-leads/index.js'; +import newNotes from './new-notes/index.js'; + +export default [newActivities, newDeals, newLeads, newNotes]; diff --git a/packages/backend/src/apps/pipedrive/triggers/index.ts b/packages/backend/src/apps/pipedrive/triggers/index.ts deleted file mode 100644 index 40668868..00000000 --- a/packages/backend/src/apps/pipedrive/triggers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import newActivities from './new-activities'; -import newDeals from './new-deals'; -import newLeads from './new-leads'; -import newNotes from './new-notes'; - -export default [newActivities, newDeals, newLeads, newNotes]; diff --git a/packages/backend/src/apps/pipedrive/triggers/new-activities/index.ts b/packages/backend/src/apps/pipedrive/triggers/new-activities/index.js similarity index 63% rename from packages/backend/src/apps/pipedrive/triggers/new-activities/index.ts rename to packages/backend/src/apps/pipedrive/triggers/new-activities/index.js index 1224320d..b8edd6e5 100644 --- a/packages/backend/src/apps/pipedrive/triggers/new-activities/index.ts +++ b/packages/backend/src/apps/pipedrive/triggers/new-activities/index.js @@ -1,21 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; - -type Payload = { - start: number; - limit: number; - sort: string; -}; - -type ResponseData = { - data: { - id: number; - }[]; - additional_data: { - pagination: { - next_start: number; - }; - }; -}; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New activities', @@ -25,14 +8,14 @@ export default defineTrigger({ arguments: [], async run($) { - const params: Payload = { + const params = { start: 0, limit: 100, sort: 'add_time DESC', }; do { - const { data } = await $.http.get('/api/v1/activities', { + const { data } = await $.http.get('/api/v1/activities', { params, }); diff --git a/packages/backend/src/apps/pipedrive/triggers/new-deals/index.ts b/packages/backend/src/apps/pipedrive/triggers/new-deals/index.js similarity index 62% rename from packages/backend/src/apps/pipedrive/triggers/new-deals/index.ts rename to packages/backend/src/apps/pipedrive/triggers/new-deals/index.js index 3ee2439f..33abde67 100644 --- a/packages/backend/src/apps/pipedrive/triggers/new-deals/index.ts +++ b/packages/backend/src/apps/pipedrive/triggers/new-deals/index.js @@ -1,21 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; - -type Payload = { - start: number; - limit: number; - sort: string; -}; - -type ResponseData = { - data: { - id: number; - }[]; - additional_data: { - pagination: { - next_start: number; - }; - }; -}; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New deals', @@ -25,14 +8,14 @@ export default defineTrigger({ arguments: [], async run($) { - const params: Payload = { + const params = { start: 0, limit: 100, sort: 'add_time DESC', }; do { - const { data } = await $.http.get('/api/v1/deals', { + const { data } = await $.http.get('/api/v1/deals', { params, }); diff --git a/packages/backend/src/apps/pipedrive/triggers/new-leads/index.ts b/packages/backend/src/apps/pipedrive/triggers/new-leads/index.js similarity index 62% rename from packages/backend/src/apps/pipedrive/triggers/new-leads/index.ts rename to packages/backend/src/apps/pipedrive/triggers/new-leads/index.js index f09933e0..b29e3fb5 100644 --- a/packages/backend/src/apps/pipedrive/triggers/new-leads/index.ts +++ b/packages/backend/src/apps/pipedrive/triggers/new-leads/index.js @@ -1,21 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; - -type Payload = { - start: number; - limit: number; - sort: string; -}; - -type ResponseData = { - data: { - id: number; - }[]; - additional_data: { - pagination: { - next_start: number; - }; - }; -}; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New leads', @@ -25,14 +8,14 @@ export default defineTrigger({ arguments: [], async run($) { - const params: Payload = { + const params = { start: 0, limit: 100, sort: 'add_time DESC', }; do { - const { data } = await $.http.get('/api/v1/leads', { + const { data } = await $.http.get('/api/v1/leads', { params, }); diff --git a/packages/backend/src/apps/pipedrive/triggers/new-notes/index.ts b/packages/backend/src/apps/pipedrive/triggers/new-notes/index.js similarity index 62% rename from packages/backend/src/apps/pipedrive/triggers/new-notes/index.ts rename to packages/backend/src/apps/pipedrive/triggers/new-notes/index.js index 155dabca..18388313 100644 --- a/packages/backend/src/apps/pipedrive/triggers/new-notes/index.ts +++ b/packages/backend/src/apps/pipedrive/triggers/new-notes/index.js @@ -1,21 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; - -type Payload = { - start: number; - limit: number; - sort: string; -}; - -type ResponseData = { - data: { - id: number; - }[]; - additional_data: { - pagination: { - next_start: number; - }; - }; -}; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New notes', @@ -25,14 +8,14 @@ export default defineTrigger({ arguments: [], async run($) { - const params: Payload = { + const params = { start: 0, limit: 100, sort: 'add_time DESC', }; do { - const { data } = await $.http.get('/api/v1/notes', { + const { data } = await $.http.get('/api/v1/notes', { params, }); diff --git a/packages/backend/src/apps/placetel/auth/index.ts b/packages/backend/src/apps/placetel/auth/index.js similarity index 69% rename from packages/backend/src/apps/placetel/auth/index.ts rename to packages/backend/src/apps/placetel/auth/index.js index 6ce142f0..85181dbe 100644 --- a/packages/backend/src/apps/placetel/auth/index.ts +++ b/packages/backend/src/apps/placetel/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'apiToken', label: 'API Token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/placetel/auth/is-still-verified.js b/packages/backend/src/apps/placetel/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/placetel/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/placetel/auth/is-still-verified.ts b/packages/backend/src/apps/placetel/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/placetel/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/placetel/auth/verify-credentials.ts b/packages/backend/src/apps/placetel/auth/verify-credentials.js similarity index 59% rename from packages/backend/src/apps/placetel/auth/verify-credentials.ts rename to packages/backend/src/apps/placetel/auth/verify-credentials.js index 7fab269f..0475497c 100644 --- a/packages/backend/src/apps/placetel/auth/verify-credentials.ts +++ b/packages/backend/src/apps/placetel/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const { data } = await $.http.get('/v2/me'); await $.auth.set({ diff --git a/packages/backend/src/apps/placetel/common/add-auth-header.ts b/packages/backend/src/apps/placetel/common/add-auth-header.js similarity index 59% rename from packages/backend/src/apps/placetel/common/add-auth-header.ts rename to packages/backend/src/apps/placetel/common/add-auth-header.js index 8a77a497..92ac3313 100644 --- a/packages/backend/src/apps/placetel/common/add-auth-header.ts +++ b/packages/backend/src/apps/placetel/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.apiToken) { requestConfig.headers.Authorization = `Bearer ${$.auth.data.apiToken}`; } diff --git a/packages/backend/src/apps/placetel/dynamic-data/index.js b/packages/backend/src/apps/placetel/dynamic-data/index.js new file mode 100644 index 00000000..1c3e14e4 --- /dev/null +++ b/packages/backend/src/apps/placetel/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listNumbers from './list-numbers/index.js'; + +export default [listNumbers]; diff --git a/packages/backend/src/apps/placetel/dynamic-data/index.ts b/packages/backend/src/apps/placetel/dynamic-data/index.ts deleted file mode 100644 index 819a758d..00000000 --- a/packages/backend/src/apps/placetel/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listNumbers from './list-numbers'; - -export default [listNumbers]; diff --git a/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts b/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.js similarity index 71% rename from packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts rename to packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.js index c3dff3a7..eeccca33 100644 --- a/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts +++ b/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List numbers', key: 'listNumbers', - async run($: IGlobalVariable) { - const numbers: { - data: IJSONObject[]; - } = { + async run($) { + const numbers = { data: [], }; diff --git a/packages/backend/src/apps/placetel/index.d.ts b/packages/backend/src/apps/placetel/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/placetel/index.ts b/packages/backend/src/apps/placetel/index.js similarity index 62% rename from packages/backend/src/apps/placetel/index.ts rename to packages/backend/src/apps/placetel/index.js index f682ea26..4c478e17 100644 --- a/packages/backend/src/apps/placetel/index.ts +++ b/packages/backend/src/apps/placetel/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Placetel', diff --git a/packages/backend/src/apps/placetel/triggers/hungup-call/index.ts b/packages/backend/src/apps/placetel/triggers/hungup-call/index.js similarity index 85% rename from packages/backend/src/apps/placetel/triggers/hungup-call/index.ts rename to packages/backend/src/apps/placetel/triggers/hungup-call/index.js index 07ad324a..f0f0fba5 100644 --- a/packages/backend/src/apps/placetel/triggers/hungup-call/index.ts +++ b/packages/backend/src/apps/placetel/triggers/hungup-call/index.js @@ -1,6 +1,6 @@ import Crypto from 'crypto'; -import { IJSONObject } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; + +import defineTrigger from '../../../../helpers/define-trigger.js'; import getRawBody from 'raw-body'; export default defineTrigger({ @@ -12,14 +12,14 @@ export default defineTrigger({ { label: 'Types', key: 'types', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Type', key: 'type', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Filter events by type. If the types are not specified, all types will be notified.', @@ -41,14 +41,14 @@ export default defineTrigger({ { label: 'Numbers', key: 'numbers', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Number', key: 'number', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Filter events by number. If the numbers are not specified, all numbers will be notified.', @@ -76,9 +76,7 @@ export default defineTrigger({ const jsonRequestBody = JSON.parse(stringBody); - let types = ($.step.parameters.types as IJSONObject[]).map( - (type) => type.type - ); + let types = $.step.parameters.types.map((type) => type.type); if (types.length === 0) { types = ['all']; @@ -97,9 +95,7 @@ export default defineTrigger({ }, async testRun($) { - const types = ($.step.parameters.types as IJSONObject[]).map( - (type) => type.type - ); + const types = $.step.parameters.types.map((type) => type.type); const sampleEventData = { type: types[0] || 'missed', @@ -123,8 +119,8 @@ export default defineTrigger({ }, async registerHook($) { - const numbers = ($.step.parameters.numbers as IJSONObject[]) - .map((number: IJSONObject) => number.number) + const numbers = $.step.parameters.numbers + .map((number) => number.number) .filter(Boolean); const subscriptionPayload = { diff --git a/packages/backend/src/apps/placetel/triggers/index.js b/packages/backend/src/apps/placetel/triggers/index.js new file mode 100644 index 00000000..8bb892fb --- /dev/null +++ b/packages/backend/src/apps/placetel/triggers/index.js @@ -0,0 +1,3 @@ +import hungupCall from './hungup-call/index.js'; + +export default [hungupCall]; diff --git a/packages/backend/src/apps/placetel/triggers/index.ts b/packages/backend/src/apps/placetel/triggers/index.ts deleted file mode 100644 index 9a8974d8..00000000 --- a/packages/backend/src/apps/placetel/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import hungupCall from './hungup-call'; - -export default [hungupCall]; diff --git a/packages/backend/src/apps/postgresql/actions/delete/index.ts b/packages/backend/src/apps/postgresql/actions/delete/index.js similarity index 67% rename from packages/backend/src/apps/postgresql/actions/delete/index.ts rename to packages/backend/src/apps/postgresql/actions/delete/index.js index 4a79477c..1f78160b 100644 --- a/packages/backend/src/apps/postgresql/actions/delete/index.ts +++ b/packages/backend/src/apps/postgresql/actions/delete/index.js @@ -1,11 +1,7 @@ -import { IJSONArray } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; -import getClient from '../../common/postgres-client'; -import setParams from '../../common/set-run-time-parameters'; -import whereClauseOperators from '../../common/where-clause-operators'; - -type TWhereClauseEntry = { columnName: string, value: string, operator: string }; -type TWhereClauseEntries = TWhereClauseEntry[]; +import defineAction from '../../../../helpers/define-action.js'; +import getClient from '../../common/postgres-client.js'; +import setParams from '../../common/set-run-time-parameters.js'; +import whereClauseOperators from '../../common/where-clause-operators.js'; export default defineAction({ name: 'Delete', @@ -15,7 +11,7 @@ export default defineAction({ { label: 'Schema name', key: 'schema', - type: 'string' as const, + type: 'string', value: 'public', required: true, variables: true, @@ -23,73 +19,73 @@ export default defineAction({ { label: 'Table name', key: 'table', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Where clause entries', key: 'whereClauseEntries', - type: 'dynamic' as const, + type: 'dynamic', required: true, fields: [ { label: 'Column name', key: 'columnName', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Operator', key: 'operator', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, - options: whereClauseOperators + options: whereClauseOperators, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } - ] + }, + ], }, { label: 'Run-time parameters', key: 'params', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'Change run-time configuration parameters with SET command', fields: [ { label: 'Parameter name', key: 'parameter', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], - } + }, ], async run($) { const client = getClient($); await setParams(client, $.step.parameters.params); - const whereClauseEntries = $.step.parameters.whereClauseEntries as TWhereClauseEntries; + const whereClauseEntries = $.step.parameters.whereClauseEntries; - const response = await client($.step.parameters.table as string) - .withSchema($.step.parameters.schema as string) + const response = await client($.step.parameters.table) + .withSchema($.step.parameters.schema) .returning('*') .where((builder) => { for (const whereClauseEntry of whereClauseEntries) { @@ -100,14 +96,14 @@ export default defineAction({ } } }) - .del() as IJSONArray; + .del(); client.destroy(); $.setActionItem({ raw: { - rows: response - } + rows: response, + }, }); }, }); diff --git a/packages/backend/src/apps/postgresql/actions/index.js b/packages/backend/src/apps/postgresql/actions/index.js new file mode 100644 index 00000000..b3cbbb15 --- /dev/null +++ b/packages/backend/src/apps/postgresql/actions/index.js @@ -0,0 +1,6 @@ +import insertAction from './insert/index.js'; +import updateAction from './update/index.js'; +import deleteAction from './delete/index.js'; +import SQLQuery from './sql-query/index.js'; + +export default [insertAction, updateAction, deleteAction, SQLQuery]; diff --git a/packages/backend/src/apps/postgresql/actions/index.ts b/packages/backend/src/apps/postgresql/actions/index.ts deleted file mode 100644 index b882cf42..00000000 --- a/packages/backend/src/apps/postgresql/actions/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import insertAction from './insert'; -import updateAction from './update'; -import deleteAction from './delete'; -import SQLQuery from './sql-query' - -export default [insertAction, updateAction, deleteAction, SQLQuery]; diff --git a/packages/backend/src/apps/postgresql/actions/insert/index.ts b/packages/backend/src/apps/postgresql/actions/insert/index.js similarity index 58% rename from packages/backend/src/apps/postgresql/actions/insert/index.ts rename to packages/backend/src/apps/postgresql/actions/insert/index.js index 37471fb3..ecf0efb7 100644 --- a/packages/backend/src/apps/postgresql/actions/insert/index.ts +++ b/packages/backend/src/apps/postgresql/actions/insert/index.js @@ -1,9 +1,6 @@ -import { IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; -import getClient from '../../common/postgres-client'; -import setParams from '../../common/set-run-time-parameters'; - -type TColumnValueEntries = { columnName: string, value: string }[]; +import defineAction from '../../../../helpers/define-action.js'; +import getClient from '../../common/postgres-client.js'; +import setParams from '../../common/set-run-time-parameters.js'; export default defineAction({ name: 'Insert', @@ -13,7 +10,7 @@ export default defineAction({ { label: 'Schema name', key: 'schema', - type: 'string' as const, + type: 'string', value: 'public', required: true, variables: true, @@ -21,75 +18,78 @@ export default defineAction({ { label: 'Table name', key: 'table', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Column - value entries', key: 'columnValueEntries', - type: 'dynamic' as const, + type: 'dynamic', required: true, description: 'Table columns with values', fields: [ { label: 'Column name', key: 'columnName', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], }, { label: 'Run-time parameters', key: 'params', - type: 'dynamic' as const, + type: 'dynamic', required: true, description: 'Change run-time configuration parameters with SET command', fields: [ { label: 'Parameter name', key: 'parameter', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], - } + }, ], async run($) { const client = getClient($); await setParams(client, $.step.parameters.params); - const fields = $.step.parameters.columnValueEntries as TColumnValueEntries; - const data = fields.reduce((result, { columnName, value }) => ({ - ...result, - [columnName]: value, - }), {}); + const fields = $.step.parameters.columnValueEntries; + const data = fields.reduce( + (result, { columnName, value }) => ({ + ...result, + [columnName]: value, + }), + {} + ); - const response = await client($.step.parameters.table as string) - .withSchema($.step.parameters.schema as string) + const response = await client($.step.parameters.table) + .withSchema($.step.parameters.schema) .returning('*') - .insert(data) as IJSONObject; + .insert(data); client.destroy(); - $.setActionItem({ raw: response[0] as IJSONObject }); + $.setActionItem({ raw: response[0] }); }, }); diff --git a/packages/backend/src/apps/postgresql/actions/sql-query/index.ts b/packages/backend/src/apps/postgresql/actions/sql-query/index.js similarity index 74% rename from packages/backend/src/apps/postgresql/actions/sql-query/index.ts rename to packages/backend/src/apps/postgresql/actions/sql-query/index.js index 9cfd0e6f..221259d5 100644 --- a/packages/backend/src/apps/postgresql/actions/sql-query/index.ts +++ b/packages/backend/src/apps/postgresql/actions/sql-query/index.js @@ -1,6 +1,6 @@ -import defineAction from '../../../../helpers/define-action'; -import getClient from '../../common/postgres-client'; -import setParams from '../../common/set-run-time-parameters'; +import defineAction from '../../../../helpers/define-action.js'; +import getClient from '../../common/postgres-client.js'; +import setParams from '../../common/set-run-time-parameters.js'; export default defineAction({ name: 'SQL query', @@ -10,7 +10,7 @@ export default defineAction({ { label: 'SQL statement', key: 'queryStatement', - type: 'string' as const, + type: 'string', value: 'public', required: true, variables: true, @@ -18,26 +18,26 @@ export default defineAction({ { label: 'Run-time parameters', key: 'params', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'Change run-time configuration parameters with SET command', fields: [ { label: 'Parameter name', key: 'parameter', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], - } + }, ], async run($) { @@ -50,8 +50,8 @@ export default defineAction({ $.setActionItem({ raw: { - rows - } + rows, + }, }); }, }); diff --git a/packages/backend/src/apps/postgresql/actions/update/index.ts b/packages/backend/src/apps/postgresql/actions/update/index.js similarity index 63% rename from packages/backend/src/apps/postgresql/actions/update/index.ts rename to packages/backend/src/apps/postgresql/actions/update/index.js index 798e3593..5f9cc361 100644 --- a/packages/backend/src/apps/postgresql/actions/update/index.ts +++ b/packages/backend/src/apps/postgresql/actions/update/index.js @@ -1,12 +1,7 @@ -import { IJSONArray } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; -import getClient from '../../common/postgres-client'; -import setParams from '../../common/set-run-time-parameters'; -import whereClauseOperators from '../../common/where-clause-operators'; - -type TColumnValueEntries = { columnName: string, value: string }[]; -type TWhereClauseEntry = { columnName: string, value: string, operator: string }; -type TWhereClauseEntries = TWhereClauseEntry[]; +import defineAction from '../../../../helpers/define-action.js'; +import getClient from '../../common/postgres-client.js'; +import setParams from '../../common/set-run-time-parameters.js'; +import whereClauseOperators from '../../common/where-clause-operators.js'; export default defineAction({ name: 'Update', @@ -16,7 +11,7 @@ export default defineAction({ { label: 'Schema name', key: 'schema', - type: 'string' as const, + type: 'string', value: 'public', required: true, variables: true, @@ -24,102 +19,105 @@ export default defineAction({ { label: 'Table name', key: 'table', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Where clause entries', key: 'whereClauseEntries', - type: 'dynamic' as const, + type: 'dynamic', required: true, fields: [ { label: 'Column name', key: 'columnName', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Operator', key: 'operator', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, - options: whereClauseOperators + options: whereClauseOperators, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } - ] + }, + ], }, { label: 'Column - value entries', key: 'columnValueEntries', - type: 'dynamic' as const, + type: 'dynamic', required: true, description: 'Table columns with values', fields: [ { label: 'Column name', key: 'columnName', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], }, { label: 'Run-time parameters', key: 'params', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'Change run-time configuration parameters with SET command', fields: [ { label: 'Parameter name', key: 'parameter', - type: 'string' as const, + type: 'string', required: true, variables: true, }, { label: 'Value', key: 'value', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], - } + }, ], async run($) { const client = getClient($); await setParams(client, $.step.parameters.params); - const whereClauseEntries = $.step.parameters.whereClauseEntries as TWhereClauseEntries; + const whereClauseEntries = $.step.parameters.whereClauseEntries; - const fields = $.step.parameters.columnValueEntries as TColumnValueEntries; - const data: Record = fields.reduce((result, { columnName, value }) => ({ - ...result, - [columnName]: value, - }), {}); + const fields = $.step.parameters.columnValueEntries; + const data = fields.reduce( + (result, { columnName, value }) => ({ + ...result, + [columnName]: value, + }), + {} + ); - const response = await client($.step.parameters.table as string) - .withSchema($.step.parameters.schema as string) + const response = await client($.step.parameters.table) + .withSchema($.step.parameters.schema) .returning('*') .where((builder) => { for (const whereClauseEntry of whereClauseEntries) { @@ -130,14 +128,14 @@ export default defineAction({ } } }) - .update(data) as IJSONArray; + .update(data); client.destroy(); $.setActionItem({ raw: { - rows: response - } + rows: response, + }, }); }, }); diff --git a/packages/backend/src/apps/postgresql/auth/index.ts b/packages/backend/src/apps/postgresql/auth/index.js similarity index 85% rename from packages/backend/src/apps/postgresql/auth/index.ts rename to packages/backend/src/apps/postgresql/auth/index.js index 2df0425e..e839ac23 100644 --- a/packages/backend/src/apps/postgresql/auth/index.ts +++ b/packages/backend/src/apps/postgresql/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'version', label: 'PostgreSQL version', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'host', label: 'Host', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: '127.0.0.1', @@ -29,7 +29,7 @@ export default { { key: 'port', label: 'Port', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: '5432', @@ -40,7 +40,7 @@ export default { { key: 'enableSsl', label: 'Enable SSL', - type: 'dropdown' as const, + type: 'dropdown', required: true, readOnly: false, value: 'false', @@ -61,7 +61,7 @@ export default { { key: 'database', label: 'Database name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -72,7 +72,7 @@ export default { { key: 'user', label: 'Database username', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -83,7 +83,7 @@ export default { { key: 'password', label: 'Password', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/postgresql/auth/is-still-verified.js b/packages/backend/src/apps/postgresql/auth/is-still-verified.js new file mode 100644 index 00000000..270d415b --- /dev/null +++ b/packages/backend/src/apps/postgresql/auth/is-still-verified.js @@ -0,0 +1,9 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/postgresql/auth/is-still-verified.ts b/packages/backend/src/apps/postgresql/auth/is-still-verified.ts deleted file mode 100644 index 5a2fe2ae..00000000 --- a/packages/backend/src/apps/postgresql/auth/is-still-verified.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/postgresql/auth/verify-credentials.ts b/packages/backend/src/apps/postgresql/auth/verify-credentials.js similarity index 74% rename from packages/backend/src/apps/postgresql/auth/verify-credentials.ts rename to packages/backend/src/apps/postgresql/auth/verify-credentials.js index 4815fb45..2249e600 100644 --- a/packages/backend/src/apps/postgresql/auth/verify-credentials.ts +++ b/packages/backend/src/apps/postgresql/auth/verify-credentials.js @@ -1,8 +1,7 @@ -import { IGlobalVariable } from '@automatisch/types'; -import logger from '../../../helpers/logger'; -import getClient from '../common/postgres-client'; +import logger from '../../../helpers/logger.js'; +import getClient from '../common/postgres-client.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const client = getClient($); const checkConnection = await client.raw('SELECT 1'); client.destroy(); diff --git a/packages/backend/src/apps/postgresql/common/postgres-client.js b/packages/backend/src/apps/postgresql/common/postgres-client.js new file mode 100644 index 00000000..e91e0455 --- /dev/null +++ b/packages/backend/src/apps/postgresql/common/postgres-client.js @@ -0,0 +1,20 @@ +import knex from 'knex'; + +const getClient = ($) => { + const client = knex({ + client: 'pg', + version: $.auth.data.version, + connection: { + host: $.auth.data.host, + port: Number($.auth.data.port), + ssl: $.auth.data.enableSsl === 'true' || $.auth.data.enableSsl === true, + user: $.auth.data.user, + password: $.auth.data.password, + database: $.auth.data.database, + }, + }); + + return client; +}; + +export default getClient; diff --git a/packages/backend/src/apps/postgresql/common/postgres-client.ts b/packages/backend/src/apps/postgresql/common/postgres-client.ts deleted file mode 100644 index 40cf06b3..00000000 --- a/packages/backend/src/apps/postgresql/common/postgres-client.ts +++ /dev/null @@ -1,22 +0,0 @@ -import knex, { Knex } from 'knex'; -import { IGlobalVariable } from '@automatisch/types'; - -const getClient = ($: IGlobalVariable): Knex => { - const client = knex({ - client: 'pg', - version: $.auth.data.version as string, - connection: { - host: $.auth.data.host as string, - port: Number($.auth.data.port), - ssl: ($.auth.data.enableSsl === 'true' || - $.auth.data.enableSsl === true) as boolean, - user: $.auth.data.user as string, - password: $.auth.data.password as string, - database: $.auth.data.database as string, - }, - }); - - return client; -}; - -export default getClient; diff --git a/packages/backend/src/apps/postgresql/common/set-run-time-parameters.js b/packages/backend/src/apps/postgresql/common/set-run-time-parameters.js new file mode 100644 index 00000000..bf9a1b79 --- /dev/null +++ b/packages/backend/src/apps/postgresql/common/set-run-time-parameters.js @@ -0,0 +1,14 @@ +const setParams = async (client, params) => { + for (const { parameter, value } of params) { + if (parameter) { + const bindings = { + parameter, + value, + }; + + await client.raw('SET :parameter: = :value:', bindings); + } + } +}; + +export default setParams; diff --git a/packages/backend/src/apps/postgresql/common/set-run-time-parameters.ts b/packages/backend/src/apps/postgresql/common/set-run-time-parameters.ts deleted file mode 100644 index 49c1555b..00000000 --- a/packages/backend/src/apps/postgresql/common/set-run-time-parameters.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Knex } from 'knex'; -import { type IJSONValue } from '@automatisch/types'; - -type TParams = { parameter: string; value: string; }[]; - -const setParams = async (client: Knex, params: IJSONValue = []): Promise => { - for (const { parameter, value } of (params as TParams)) { - if (parameter) { - const bindings = { - parameter, - value, - }; - - await client.raw('SET :parameter: = :value:', bindings); - } - } -}; - -export default setParams; diff --git a/packages/backend/src/apps/postgresql/common/where-clause-operators.ts b/packages/backend/src/apps/postgresql/common/where-clause-operators.js similarity index 100% rename from packages/backend/src/apps/postgresql/common/where-clause-operators.ts rename to packages/backend/src/apps/postgresql/common/where-clause-operators.js diff --git a/packages/backend/src/apps/postgresql/index.d.ts b/packages/backend/src/apps/postgresql/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/postgresql/index.ts b/packages/backend/src/apps/postgresql/index.js similarity index 70% rename from packages/backend/src/apps/postgresql/index.ts rename to packages/backend/src/apps/postgresql/index.js index b39e24fc..f0ca34fb 100644 --- a/packages/backend/src/apps/postgresql/index.ts +++ b/packages/backend/src/apps/postgresql/index.js @@ -1,6 +1,6 @@ -import defineApp from '../../helpers/define-app'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'PostgreSQL', diff --git a/packages/backend/src/apps/pushover/actions/index.ts b/packages/backend/src/apps/pushover/actions/index.js similarity index 86% rename from packages/backend/src/apps/pushover/actions/index.ts rename to packages/backend/src/apps/pushover/actions/index.js index 8b423a8a..ba1bd4b5 100644 --- a/packages/backend/src/apps/pushover/actions/index.ts +++ b/packages/backend/src/apps/pushover/actions/index.js @@ -1,3 +1,3 @@ -import sendAPushoverNotification from './send-a-pushover-notification'; +import sendAPushoverNotification from './send-a-pushover-notification/index.js'; export default [sendAPushoverNotification]; diff --git a/packages/backend/src/apps/pushover/actions/send-a-pushover-notification/index.ts b/packages/backend/src/apps/pushover/actions/send-a-pushover-notification/index.js similarity index 83% rename from packages/backend/src/apps/pushover/actions/send-a-pushover-notification/index.ts rename to packages/backend/src/apps/pushover/actions/send-a-pushover-notification/index.js index 504f7375..59232982 100644 --- a/packages/backend/src/apps/pushover/actions/send-a-pushover-notification/index.ts +++ b/packages/backend/src/apps/pushover/actions/send-a-pushover-notification/index.js @@ -1,5 +1,4 @@ -import { IJSONArray, IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Send a Pushover Notification', @@ -10,7 +9,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: false, description: 'An optional title displayed with the message.', variables: true, @@ -18,7 +17,7 @@ export default defineAction({ { label: 'Message', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The main message text of your notification.', variables: true, @@ -26,7 +25,7 @@ export default defineAction({ { label: 'Priority', key: 'priority', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -44,7 +43,7 @@ export default defineAction({ { label: 'Sound', key: 'sound', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Optional sound to override your default.', variables: true, @@ -62,7 +61,7 @@ export default defineAction({ { label: 'URL', key: 'url', - type: 'string' as const, + type: 'string', required: false, description: 'URL to display with message.', variables: true, @@ -70,7 +69,7 @@ export default defineAction({ { label: 'URL Title', key: 'urlTitle', - type: 'string' as const, + type: 'string', required: false, description: 'Title of URL to display, otherwise URL itself will be displayed.', @@ -79,14 +78,14 @@ export default defineAction({ { label: 'Devices', key: 'devices', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Device', key: 'device', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: 'Restrict sending to just these devices on your account.', @@ -110,10 +109,8 @@ export default defineAction({ const { title, message, priority, sound, url, urlTitle } = $.step.parameters; - const devices = $.step.parameters.devices as IJSONArray; - const allDevices = devices - .map((device: IJSONObject) => device.device) - .join(','); + const devices = $.step.parameters.devices; + const allDevices = devices.map((device) => device.device).join(','); const payload = { token: $.auth.data.apiToken, diff --git a/packages/backend/src/apps/pushover/auth/index.ts b/packages/backend/src/apps/pushover/auth/index.js similarity index 79% rename from packages/backend/src/apps/pushover/auth/index.ts rename to packages/backend/src/apps/pushover/auth/index.js index 217bee14..06c90ab1 100644 --- a/packages/backend/src/apps/pushover/auth/index.ts +++ b/packages/backend/src/apps/pushover/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'userKey', label: 'User Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -29,7 +29,7 @@ export default { { key: 'apiToken', label: 'API Token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/pushover/auth/is-still-verified.js b/packages/backend/src/apps/pushover/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/pushover/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/pushover/auth/is-still-verified.ts b/packages/backend/src/apps/pushover/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/pushover/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/pushover/auth/verify-credentials.ts b/packages/backend/src/apps/pushover/auth/verify-credentials.js similarity index 63% rename from packages/backend/src/apps/pushover/auth/verify-credentials.ts rename to packages/backend/src/apps/pushover/auth/verify-credentials.js index 3dd9440d..27b5ec29 100644 --- a/packages/backend/src/apps/pushover/auth/verify-credentials.ts +++ b/packages/backend/src/apps/pushover/auth/verify-credentials.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; -import HttpError from '../../../errors/http'; +import HttpError from '../../../errors/http.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { try { await $.http.post(`/1/users/validate.json`, { - token: $.auth.data.apiToken as string, - user: $.auth.data.userKey as string, + token: $.auth.data.apiToken, + user: $.auth.data.userKey, }); } catch (error) { const noDeviceError = 'user is valid but has no active devices'; diff --git a/packages/backend/src/apps/pushover/dynamic-data/index.js b/packages/backend/src/apps/pushover/dynamic-data/index.js new file mode 100644 index 00000000..1faccbbb --- /dev/null +++ b/packages/backend/src/apps/pushover/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listDevices from './list-devices/index.js'; +import listSounds from './list-sounds/index.js'; + +export default [listDevices, listSounds]; diff --git a/packages/backend/src/apps/pushover/dynamic-data/index.ts b/packages/backend/src/apps/pushover/dynamic-data/index.ts deleted file mode 100644 index 28aececc..00000000 --- a/packages/backend/src/apps/pushover/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listDevices from './list-devices'; -import listSounds from './list-sounds'; - -export default [listDevices, listSounds]; diff --git a/packages/backend/src/apps/pushover/dynamic-data/list-devices/index.ts b/packages/backend/src/apps/pushover/dynamic-data/list-devices/index.js similarity index 73% rename from packages/backend/src/apps/pushover/dynamic-data/list-devices/index.ts rename to packages/backend/src/apps/pushover/dynamic-data/list-devices/index.js index ef5d6180..3b3f74c5 100644 --- a/packages/backend/src/apps/pushover/dynamic-data/list-devices/index.ts +++ b/packages/backend/src/apps/pushover/dynamic-data/list-devices/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List devices', key: 'listDevices', - async run($: IGlobalVariable) { - const devices: { - data: IJSONObject[]; - } = { + async run($) { + const devices = { data: [], }; diff --git a/packages/backend/src/apps/pushover/dynamic-data/list-sounds/index.ts b/packages/backend/src/apps/pushover/dynamic-data/list-sounds/index.js similarity index 68% rename from packages/backend/src/apps/pushover/dynamic-data/list-sounds/index.ts rename to packages/backend/src/apps/pushover/dynamic-data/list-sounds/index.js index c45f1fe0..f089479f 100644 --- a/packages/backend/src/apps/pushover/dynamic-data/list-sounds/index.ts +++ b/packages/backend/src/apps/pushover/dynamic-data/list-sounds/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List sounds', key: 'listSounds', - async run($: IGlobalVariable) { - const sounds: { - data: IJSONObject[]; - } = { + async run($) { + const sounds = { data: [], }; @@ -21,7 +17,7 @@ export default { for (const [key, value] of soundEntries) { sounds.data.push({ value: key, - name: value as string, + name: value, }); } diff --git a/packages/backend/src/apps/pushover/index.d.ts b/packages/backend/src/apps/pushover/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/pushover/index.ts b/packages/backend/src/apps/pushover/index.js similarity index 66% rename from packages/backend/src/apps/pushover/index.ts rename to packages/backend/src/apps/pushover/index.js index 6a88e23d..d5679e56 100644 --- a/packages/backend/src/apps/pushover/index.ts +++ b/packages/backend/src/apps/pushover/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import auth from './auth'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Pushover', diff --git a/packages/backend/src/apps/reddit/actions/create-link-post/index.ts b/packages/backend/src/apps/reddit/actions/create-link-post/index.js similarity index 80% rename from packages/backend/src/apps/reddit/actions/create-link-post/index.ts rename to packages/backend/src/apps/reddit/actions/create-link-post/index.js index b69af808..92770237 100644 --- a/packages/backend/src/apps/reddit/actions/create-link-post/index.ts +++ b/packages/backend/src/apps/reddit/actions/create-link-post/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; import { URLSearchParams } from 'url'; export default defineAction({ @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Title', key: 'title', - type: 'string' as const, + type: 'string', required: true, description: 'Heading for the recent post. Limited to 300 characters or less.', @@ -18,7 +18,7 @@ export default defineAction({ { label: 'Subreddit', key: 'subreddit', - type: 'string' as const, + type: 'string', required: true, description: 'The subreddit for posting. Note: Exclude /r/.', variables: true, @@ -26,7 +26,7 @@ export default defineAction({ { label: 'Url', key: 'url', - type: 'string' as const, + type: 'string', required: true, description: '', variables: true, @@ -39,9 +39,9 @@ export default defineAction({ const params = new URLSearchParams({ kind: 'link', api_type: 'json', - title: title as string, - sr: subreddit as string, - url: url as string, + title: title, + sr: subreddit, + url: url, }); const { data } = await $.http.post('/api/submit', params.toString()); diff --git a/packages/backend/src/apps/reddit/actions/index.js b/packages/backend/src/apps/reddit/actions/index.js new file mode 100644 index 00000000..3570d528 --- /dev/null +++ b/packages/backend/src/apps/reddit/actions/index.js @@ -0,0 +1,3 @@ +import createLinkPost from './create-link-post/index.js'; + +export default [createLinkPost]; diff --git a/packages/backend/src/apps/reddit/actions/index.ts b/packages/backend/src/apps/reddit/actions/index.ts deleted file mode 100644 index 832217db..00000000 --- a/packages/backend/src/apps/reddit/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createLinkPost from './create-link-post'; - -export default [createLinkPost]; diff --git a/packages/backend/src/apps/reddit/auth/generate-auth-url.ts b/packages/backend/src/apps/reddit/auth/generate-auth-url.js similarity index 52% rename from packages/backend/src/apps/reddit/auth/generate-auth-url.ts rename to packages/backend/src/apps/reddit/auth/generate-auth-url.js index b24fb404..ccbcda5a 100644 --- a/packages/backend/src/apps/reddit/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/reddit/auth/generate-auth-url.js @@ -1,15 +1,14 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; - const state = Math.random().toString() as string; + const redirectUri = oauthRedirectUrlField.value; + const state = Math.random().toString(); const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, response_type: 'code', redirect_uri: redirectUri, duration: 'permanent', diff --git a/packages/backend/src/apps/reddit/auth/index.ts b/packages/backend/src/apps/reddit/auth/index.js similarity index 74% rename from packages/backend/src/apps/reddit/auth/index.ts rename to packages/backend/src/apps/reddit/auth/index.js index c98d7565..bd8b8112 100644 --- a/packages/backend/src/apps/reddit/auth/index.ts +++ b/packages/backend/src/apps/reddit/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/reddit/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/reddit/auth/is-still-verified.js b/packages/backend/src/apps/reddit/auth/is-still-verified.js new file mode 100644 index 00000000..08962895 --- /dev/null +++ b/packages/backend/src/apps/reddit/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/reddit/auth/is-still-verified.ts b/packages/backend/src/apps/reddit/auth/is-still-verified.ts deleted file mode 100644 index 50107400..00000000 --- a/packages/backend/src/apps/reddit/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/reddit/auth/refresh-token.ts b/packages/backend/src/apps/reddit/auth/refresh-token.js similarity index 78% rename from packages/backend/src/apps/reddit/auth/refresh-token.ts rename to packages/backend/src/apps/reddit/auth/refresh-token.js index c88fdfff..c36e5f50 100644 --- a/packages/backend/src/apps/reddit/auth/refresh-token.ts +++ b/packages/backend/src/apps/reddit/auth/refresh-token.js @@ -1,7 +1,6 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const headers = { Authorization: `Basic ${Buffer.from( $.auth.data.clientId + ':' + $.auth.data.clientSecret @@ -9,7 +8,7 @@ const refreshToken = async ($: IGlobalVariable) => { }; const params = new URLSearchParams({ grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/reddit/auth/verify-credentials.ts b/packages/backend/src/apps/reddit/auth/verify-credentials.js similarity index 76% rename from packages/backend/src/apps/reddit/auth/verify-credentials.ts rename to packages/backend/src/apps/reddit/auth/verify-credentials.js index dd44de54..c39dea60 100644 --- a/packages/backend/src/apps/reddit/auth/verify-credentials.ts +++ b/packages/backend/src/apps/reddit/auth/verify-credentials.js @@ -1,15 +1,14 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; import { URLSearchParams } from 'url'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { if ($.auth.data.originalState !== $.auth.data.state) { throw new Error(`The 'state' parameter does not match.`); } const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const headers = { Authorization: `Basic ${Buffer.from( $.auth.data.clientId + ':' + $.auth.data.clientSecret @@ -17,7 +16,7 @@ const verifyCredentials = async ($: IGlobalVariable) => { }; const params = new URLSearchParams({ grant_type: 'authorization_code', - code: $.auth.data.code as string, + code: $.auth.data.code, redirect_uri: redirectUri, }); diff --git a/packages/backend/src/apps/reddit/common/add-auth-header.ts b/packages/backend/src/apps/reddit/common/add-auth-header.js similarity index 67% rename from packages/backend/src/apps/reddit/common/add-auth-header.ts rename to packages/backend/src/apps/reddit/common/add-auth-header.js index 147e5dd4..79f97022 100644 --- a/packages/backend/src/apps/reddit/common/add-auth-header.ts +++ b/packages/backend/src/apps/reddit/common/add-auth-header.js @@ -1,8 +1,7 @@ -import { TBeforeRequest } from '@automatisch/types'; -import appConfig from '../../../config/app'; +import appConfig from '../../../config/app.js'; -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - const screenName = $.auth.data?.screenName as string; +const addAuthHeader = ($, requestConfig) => { + const screenName = $.auth.data?.screenName; if ($.auth.data?.accessToken) { requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; } diff --git a/packages/backend/src/apps/reddit/common/auth-scope.js b/packages/backend/src/apps/reddit/common/auth-scope.js new file mode 100644 index 00000000..612bf475 --- /dev/null +++ b/packages/backend/src/apps/reddit/common/auth-scope.js @@ -0,0 +1,3 @@ +const authScope = ['identity', 'read', 'account', 'submit']; + +export default authScope; diff --git a/packages/backend/src/apps/reddit/common/auth-scope.ts b/packages/backend/src/apps/reddit/common/auth-scope.ts deleted file mode 100644 index d1010b4a..00000000 --- a/packages/backend/src/apps/reddit/common/auth-scope.ts +++ /dev/null @@ -1,3 +0,0 @@ -const authScope: string[] = ['identity', 'read', 'account', 'submit']; - -export default authScope; diff --git a/packages/backend/src/apps/reddit/common/get-current-user.ts b/packages/backend/src/apps/reddit/common/get-current-user.js similarity index 52% rename from packages/backend/src/apps/reddit/common/get-current-user.ts rename to packages/backend/src/apps/reddit/common/get-current-user.js index 05fe143a..f76851c1 100644 --- a/packages/backend/src/apps/reddit/common/get-current-user.ts +++ b/packages/backend/src/apps/reddit/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data: currentUser } = await $.http.get('/api/v1/me'); return currentUser; }; diff --git a/packages/backend/src/apps/reddit/index.d.ts b/packages/backend/src/apps/reddit/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/reddit/index.ts b/packages/backend/src/apps/reddit/index.js similarity index 62% rename from packages/backend/src/apps/reddit/index.ts rename to packages/backend/src/apps/reddit/index.js index f2e43446..50f15307 100644 --- a/packages/backend/src/apps/reddit/index.ts +++ b/packages/backend/src/apps/reddit/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Reddit', diff --git a/packages/backend/src/apps/reddit/triggers/index.js b/packages/backend/src/apps/reddit/triggers/index.js new file mode 100644 index 00000000..c8a159db --- /dev/null +++ b/packages/backend/src/apps/reddit/triggers/index.js @@ -0,0 +1,3 @@ +import newPostsMatchingSearch from './new-posts-matching-search/index.js'; + +export default [newPostsMatchingSearch]; diff --git a/packages/backend/src/apps/reddit/triggers/index.ts b/packages/backend/src/apps/reddit/triggers/index.ts deleted file mode 100644 index b8846874..00000000 --- a/packages/backend/src/apps/reddit/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newPostsMatchingSearch from './new-posts-matching-search'; - -export default [newPostsMatchingSearch]; diff --git a/packages/backend/src/apps/reddit/triggers/new-posts-matching-search/index.ts b/packages/backend/src/apps/reddit/triggers/new-posts-matching-search/index.js similarity index 88% rename from packages/backend/src/apps/reddit/triggers/new-posts-matching-search/index.ts rename to packages/backend/src/apps/reddit/triggers/new-posts-matching-search/index.js index f22e3a57..6c586949 100644 --- a/packages/backend/src/apps/reddit/triggers/new-posts-matching-search/index.ts +++ b/packages/backend/src/apps/reddit/triggers/new-posts-matching-search/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New posts matching search', @@ -9,7 +9,7 @@ export default defineTrigger({ { label: 'Search Query', key: 'searchQuery', - type: 'string' as const, + type: 'string', required: true, description: 'The term or expression to look for, restricted to 512 characters. If your query contains periods (e.g., automatisch.io), ensure it is enclosed in quotes ("automatisch.io").', @@ -24,7 +24,7 @@ export default defineTrigger({ type: 'link', sort: 'new', limit: 100, - after: undefined as unknown as string, + after: undefined, }; do { diff --git a/packages/backend/src/apps/removebg/actions/index.js b/packages/backend/src/apps/removebg/actions/index.js new file mode 100644 index 00000000..f99cc566 --- /dev/null +++ b/packages/backend/src/apps/removebg/actions/index.js @@ -0,0 +1,3 @@ +import removeImageBackground from './remove-image-background/index.js'; + +export default [removeImageBackground]; diff --git a/packages/backend/src/apps/removebg/actions/index.ts b/packages/backend/src/apps/removebg/actions/index.ts deleted file mode 100644 index ce680432..00000000 --- a/packages/backend/src/apps/removebg/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import removeImageBackground from './remove-image-background'; - -export default [removeImageBackground]; \ No newline at end of file diff --git a/packages/backend/src/apps/removebg/actions/remove-image-background/index.ts b/packages/backend/src/apps/removebg/actions/remove-image-background/index.js similarity index 60% rename from packages/backend/src/apps/removebg/actions/remove-image-background/index.ts rename to packages/backend/src/apps/removebg/actions/remove-image-background/index.js index 2c66c891..c0808223 100644 --- a/packages/backend/src/apps/removebg/actions/remove-image-background/index.ts +++ b/packages/backend/src/apps/removebg/actions/remove-image-background/index.js @@ -1,49 +1,50 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Remove image background', key: 'removeImageBackground', - description: - 'Removes the background of an image.', + description: 'Removes the background of an image.', arguments: [ { label: 'Image file', key: 'imageFileB64', - type: 'string' as const, + type: 'string', required: true, variables: true, - description: 'Provide a JPG or PNG file in Base64 format, up to 12 MB (see remove.bg/supported-images)', + description: + 'Provide a JPG or PNG file in Base64 format, up to 12 MB (see remove.bg/supported-images)', }, { label: 'Size', key: 'size', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: 'auto', options: [ { label: 'Auto', value: 'auto' }, { label: 'Preview (up to 0.25 megapixels)', value: 'preview' }, { label: 'Full (up to 10 megapixels)', value: 'full' }, - ] + ], }, { label: 'Background color', key: 'bgColor', - type: 'string' as const, - description: 'Adds a solid color background. Can be a hex color code (e.g. 81d4fa, fff) or a color name (e.g. green)', + type: 'string', + description: + 'Adds a solid color background. Can be a hex color code (e.g. 81d4fa, fff) or a color name (e.g. green)', required: false, }, { label: 'Background image URL', key: 'bgImageUrl', - type: 'string' as const, + type: 'string', description: 'Adds a background image from a URL.', required: false, }, { label: 'Output image format', key: 'outputFormat', - type: 'dropdown' as const, + type: 'dropdown', description: 'Note: Use PNG to preserve transparency', required: true, value: 'auto', @@ -51,32 +52,32 @@ export default defineAction({ { label: 'Auto', value: 'auto' }, { label: 'PNG', value: 'png' }, { label: 'JPG', value: 'jpg' }, - { label: 'ZIP', value: 'zip' } - ] - } + { label: 'ZIP', value: 'zip' }, + ], + }, ], async run($) { - const imageFileB64 = $.step.parameters.imageFileB64 as string; - const size = $.step.parameters.size as string; - const bgColor = $.step.parameters.bgColor as string; - const bgImageUrl = $.step.parameters.bgImageUrl as string; - const outputFormat = $.step.parameters.outputFormat as string; + const imageFileB64 = $.step.parameters.imageFileB64; + const size = $.step.parameters.size; + const bgColor = $.step.parameters.bgColor; + const bgImageUrl = $.step.parameters.bgImageUrl; + const outputFormat = $.step.parameters.outputFormat; const body = JSON.stringify({ image_file_b64: imageFileB64, size: size, bg_color: bgColor, bg_image_url: bgImageUrl, - format: outputFormat + format: outputFormat, }); const response = await $.http.post('/removebg', body, { headers: { 'Content-Type': 'application/json', - 'Accept': 'application/json', + Accept: 'application/json', }, }); $.setActionItem({ raw: response.data }); - } + }, }); diff --git a/packages/backend/src/apps/removebg/auth/index.ts b/packages/backend/src/apps/removebg/auth/index.js similarity index 77% rename from packages/backend/src/apps/removebg/auth/index.ts rename to packages/backend/src/apps/removebg/auth/index.js index 91afb0e5..f007aaa6 100644 --- a/packages/backend/src/apps/removebg/auth/index.ts +++ b/packages/backend/src/apps/removebg/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/removebg/auth/is-still-verified.js b/packages/backend/src/apps/removebg/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/removebg/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/removebg/auth/is-still-verified.ts b/packages/backend/src/apps/removebg/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/removebg/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/removebg/auth/verify-credentials.ts b/packages/backend/src/apps/removebg/auth/verify-credentials.js similarity index 60% rename from packages/backend/src/apps/removebg/auth/verify-credentials.ts rename to packages/backend/src/apps/removebg/auth/verify-credentials.js index 7b9451d7..98441bb8 100644 --- a/packages/backend/src/apps/removebg/auth/verify-credentials.ts +++ b/packages/backend/src/apps/removebg/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await $.http.get('/account'); await $.auth.set({ diff --git a/packages/backend/src/apps/removebg/common/add-auth-header.js b/packages/backend/src/apps/removebg/common/add-auth-header.js new file mode 100644 index 00000000..c5018c36 --- /dev/null +++ b/packages/backend/src/apps/removebg/common/add-auth-header.js @@ -0,0 +1,9 @@ +const addAuthHeader = ($, requestConfig) => { + if ($.auth.data?.apiKey) { + requestConfig.headers['X-API-Key'] = `${$.auth.data.apiKey}`; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/removebg/common/add-auth-header.ts b/packages/backend/src/apps/removebg/common/add-auth-header.ts deleted file mode 100644 index 0b59c5c5..00000000 --- a/packages/backend/src/apps/removebg/common/add-auth-header.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data?.apiKey) { - requestConfig.headers['X-API-Key'] = `${$.auth.data.apiKey}`; - } - - return requestConfig; -}; - -export default addAuthHeader; \ No newline at end of file diff --git a/packages/backend/src/apps/removebg/index.d.ts b/packages/backend/src/apps/removebg/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/removebg/index.ts b/packages/backend/src/apps/removebg/index.js similarity index 67% rename from packages/backend/src/apps/removebg/index.ts rename to packages/backend/src/apps/removebg/index.js index 4ac8f5e7..60dde18d 100644 --- a/packages/backend/src/apps/removebg/index.ts +++ b/packages/backend/src/apps/removebg/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Remove.bg', diff --git a/packages/backend/src/apps/rss/index.d.ts b/packages/backend/src/apps/rss/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/rss/index.ts b/packages/backend/src/apps/rss/index.js similarity index 74% rename from packages/backend/src/apps/rss/index.ts rename to packages/backend/src/apps/rss/index.js index 0f13d0ee..c773dc30 100644 --- a/packages/backend/src/apps/rss/index.ts +++ b/packages/backend/src/apps/rss/index.js @@ -1,5 +1,5 @@ -import defineApp from '../../helpers/define-app'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'RSS', diff --git a/packages/backend/src/apps/rss/triggers/index.js b/packages/backend/src/apps/rss/triggers/index.js new file mode 100644 index 00000000..229deea4 --- /dev/null +++ b/packages/backend/src/apps/rss/triggers/index.js @@ -0,0 +1,3 @@ +import newItemsInFeed from './new-items-in-feed/index.js'; + +export default [newItemsInFeed]; diff --git a/packages/backend/src/apps/rss/triggers/index.ts b/packages/backend/src/apps/rss/triggers/index.ts deleted file mode 100644 index 6d882c22..00000000 --- a/packages/backend/src/apps/rss/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newItemsInFeed from './new-items-in-feed'; - -export default [newItemsInFeed]; diff --git a/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.ts b/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.js similarity index 73% rename from packages/backend/src/apps/rss/triggers/new-items-in-feed/index.ts rename to packages/backend/src/apps/rss/triggers/new-items-in-feed/index.js index 7682cf8e..f4a6baa1 100644 --- a/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.ts +++ b/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import newItemsInFeed from './new-items-in-feed'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import newItemsInFeed from './new-items-in-feed.js'; export default defineTrigger({ name: 'New items in feed', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Feed URL', key: 'feedUrl', - type: 'string' as const, + type: 'string', required: true, description: 'Paste your publicly accessible RSS URL here.', variables: false, diff --git a/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.ts b/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.js similarity index 66% rename from packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.ts rename to packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.js index 7014f7c9..3ce458d2 100644 --- a/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.ts +++ b/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.js @@ -1,27 +1,26 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import { XMLParser } from 'fast-xml-parser'; import bcrypt from 'bcrypt'; -const getInternalId = async (item: IJSONObject): Promise => { +const getInternalId = async (item) => { if (item.guid) { return typeof item.guid === 'object' - ? (item.guid as IJSONObject)['#text'].toString() + ? item.guid['#text'].toString() : item.guid.toString(); } else if (item.id) { return typeof item.id === 'object' - ? (item.id as IJSONObject)['#text'].toString() + ? item.id['#text'].toString() : item.id.toString(); } return await hashItem(JSON.stringify(item)); }; -const hashItem = async (value: string) => { +const hashItem = async (value) => { return await bcrypt.hash(value, 1); }; -const newItemsInFeed = async ($: IGlobalVariable) => { - const { data } = await $.http.get($.step.parameters.feedUrl as string); +const newItemsInFeed = async ($) => { + const { data } = await $.http.get($.step.parameters.feedUrl); const parser = new XMLParser({ ignoreAttributes: false, }); diff --git a/packages/backend/src/apps/salesforce/actions/create-attachment/index.ts b/packages/backend/src/apps/salesforce/actions/create-attachment/index.js similarity index 88% rename from packages/backend/src/apps/salesforce/actions/create-attachment/index.ts rename to packages/backend/src/apps/salesforce/actions/create-attachment/index.js index 8c266e8e..8a79704c 100644 --- a/packages/backend/src/apps/salesforce/actions/create-attachment/index.ts +++ b/packages/backend/src/apps/salesforce/actions/create-attachment/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create attachment', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Parent ID', key: 'parentId', - type: 'string' as const, + type: 'string', required: true, variables: true, description: @@ -18,7 +18,7 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: true, variables: true, description: 'Name of the attached file. Maximum size is 255 characters.', @@ -26,7 +26,7 @@ export default defineAction({ { label: 'Body', key: 'body', - type: 'string' as const, + type: 'string', required: true, variables: true, description: 'File data. (Max size is 25MB)', diff --git a/packages/backend/src/apps/salesforce/actions/execute-query/index.ts b/packages/backend/src/apps/salesforce/actions/execute-query/index.js similarity index 79% rename from packages/backend/src/apps/salesforce/actions/execute-query/index.ts rename to packages/backend/src/apps/salesforce/actions/execute-query/index.js index 8d0a6780..98842321 100644 --- a/packages/backend/src/apps/salesforce/actions/execute-query/index.ts +++ b/packages/backend/src/apps/salesforce/actions/execute-query/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Execute query', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Query', key: 'query', - type: 'string' as const, + type: 'string', required: true, description: 'Salesforce query string. For example: SELECT Id, Name FROM Account', @@ -17,7 +17,7 @@ export default defineAction({ ], async run($) { - const query = $.step.parameters.query as string; + const query = $.step.parameters.query; const options = { params: { diff --git a/packages/backend/src/apps/salesforce/actions/find-record/index.ts b/packages/backend/src/apps/salesforce/actions/find-record/index.js similarity index 90% rename from packages/backend/src/apps/salesforce/actions/find-record/index.ts rename to packages/backend/src/apps/salesforce/actions/find-record/index.js index a1105352..e696e626 100644 --- a/packages/backend/src/apps/salesforce/actions/find-record/index.ts +++ b/packages/backend/src/apps/salesforce/actions/find-record/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Find record', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Object', key: 'object', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, description: 'Pick which type of object you want to search for.', @@ -26,7 +26,7 @@ export default defineAction({ { label: 'Field', key: 'field', - type: 'dropdown' as const, + type: 'dropdown', description: 'Pick which field to search by', required: true, variables: true, @@ -49,7 +49,7 @@ export default defineAction({ { label: 'Search value', key: 'searchValue', - type: 'string' as const, + type: 'string', required: true, variables: true, }, diff --git a/packages/backend/src/apps/salesforce/actions/index.js b/packages/backend/src/apps/salesforce/actions/index.js new file mode 100644 index 00000000..b4de1984 --- /dev/null +++ b/packages/backend/src/apps/salesforce/actions/index.js @@ -0,0 +1,5 @@ +import createAttachment from './create-attachment/index.js'; +import executeQuery from './execute-query/index.js'; +import findRecord from './find-record/index.js'; + +export default [findRecord, createAttachment, executeQuery]; diff --git a/packages/backend/src/apps/salesforce/actions/index.ts b/packages/backend/src/apps/salesforce/actions/index.ts deleted file mode 100644 index 58ec0b70..00000000 --- a/packages/backend/src/apps/salesforce/actions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import createAttachment from './create-attachment'; -import executeQuery from './execute-query'; -import findRecord from './find-record'; - -export default [findRecord, createAttachment, executeQuery]; diff --git a/packages/backend/src/apps/salesforce/auth/generate-auth-url.ts b/packages/backend/src/apps/salesforce/auth/generate-auth-url.js similarity index 58% rename from packages/backend/src/apps/salesforce/auth/generate-auth-url.ts rename to packages/backend/src/apps/salesforce/auth/generate-auth-url.js index a798dbef..cb21c14e 100644 --- a/packages/backend/src/apps/salesforce/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/salesforce/auth/generate-auth-url.js @@ -1,13 +1,12 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import qs from 'qs'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); const redirectUri = oauthRedirectUrlField.value; const searchParams = qs.stringify({ - client_id: $.auth.data.consumerKey as string, + client_id: $.auth.data.consumerKey, redirect_uri: redirectUri, response_type: 'code', }); diff --git a/packages/backend/src/apps/salesforce/auth/index.ts b/packages/backend/src/apps/salesforce/auth/index.js similarity index 81% rename from packages/backend/src/apps/salesforce/auth/index.ts rename to packages/backend/src/apps/salesforce/auth/index.js index c9d6f7a4..06d344d1 100644 --- a/packages/backend/src/apps/salesforce/auth/index.ts +++ b/packages/backend/src/apps/salesforce/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/salesforce/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'oauth2Url', label: 'Salesforce Environment', - type: 'dropdown' as const, + type: 'dropdown', required: true, readOnly: false, value: 'https://login.salesforce.com/services/oauth2', @@ -41,7 +41,7 @@ export default { { key: 'consumerKey', label: 'Consumer Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -52,7 +52,7 @@ export default { { key: 'consumerSecret', label: 'Consumer Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/salesforce/auth/is-still-verified.js b/packages/backend/src/apps/salesforce/auth/is-still-verified.js new file mode 100644 index 00000000..f59ee3b4 --- /dev/null +++ b/packages/backend/src/apps/salesforce/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/salesforce/auth/is-still-verified.ts b/packages/backend/src/apps/salesforce/auth/is-still-verified.ts deleted file mode 100644 index d36919f2..00000000 --- a/packages/backend/src/apps/salesforce/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/salesforce/auth/refresh-token.ts b/packages/backend/src/apps/salesforce/auth/refresh-token.js similarity index 61% rename from packages/backend/src/apps/salesforce/auth/refresh-token.ts rename to packages/backend/src/apps/salesforce/auth/refresh-token.js index 2ae82a10..07ae487a 100644 --- a/packages/backend/src/apps/salesforce/auth/refresh-token.ts +++ b/packages/backend/src/apps/salesforce/auth/refresh-token.js @@ -1,12 +1,11 @@ -import { IGlobalVariable } from '@automatisch/types'; import qs from 'querystring'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const searchParams = qs.stringify({ grant_type: 'refresh_token', - client_id: $.auth.data.consumerKey as string, - client_secret: $.auth.data.consumerSecret as string, - refresh_token: $.auth.data.refreshToken as string, + client_id: $.auth.data.consumerKey, + client_secret: $.auth.data.consumerSecret, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/salesforce/auth/verify-credentials.ts b/packages/backend/src/apps/salesforce/auth/verify-credentials.js similarity index 76% rename from packages/backend/src/apps/salesforce/auth/verify-credentials.ts rename to packages/backend/src/apps/salesforce/auth/verify-credentials.js index 2eabad46..ce65ecad 100644 --- a/packages/backend/src/apps/salesforce/auth/verify-credentials.ts +++ b/packages/backend/src/apps/salesforce/auth/verify-credentials.js @@ -1,8 +1,7 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; import qs from 'qs'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( (field) => field.key == 'oAuthRedirectUrl' ); @@ -10,8 +9,8 @@ const verifyCredentials = async ($: IGlobalVariable) => { const searchParams = qs.stringify({ code: $.auth.data.code, grant_type: 'authorization_code', - client_id: $.auth.data.consumerKey as string, - client_secret: $.auth.data.consumerSecret as string, + client_id: $.auth.data.consumerKey, + client_secret: $.auth.data.consumerSecret, redirect_uri: redirectUri, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/salesforce/common/add-auth-header.ts b/packages/backend/src/apps/salesforce/common/add-auth-header.js similarity index 60% rename from packages/backend/src/apps/salesforce/common/add-auth-header.ts rename to packages/backend/src/apps/salesforce/common/add-auth-header.js index 3a9848da..453863d0 100644 --- a/packages/backend/src/apps/salesforce/common/add-auth-header.ts +++ b/packages/backend/src/apps/salesforce/common/add-auth-header.js @@ -1,10 +1,8 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { instanceUrl, tokenType, accessToken } = $.auth.data; if (instanceUrl) { - requestConfig.baseURL = instanceUrl as string; + requestConfig.baseURL = instanceUrl; } if (tokenType && accessToken) { diff --git a/packages/backend/src/apps/salesforce/common/get-current-user.ts b/packages/backend/src/apps/salesforce/common/get-current-user.js similarity index 54% rename from packages/backend/src/apps/salesforce/common/get-current-user.ts rename to packages/backend/src/apps/salesforce/common/get-current-user.js index cc82e4a2..02d57b54 100644 --- a/packages/backend/src/apps/salesforce/common/get-current-user.ts +++ b/packages/backend/src/apps/salesforce/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/services/data/v55.0/chatter/users/me'); const currentUser = response.data; diff --git a/packages/backend/src/apps/salesforce/dynamic-data/index.js b/packages/backend/src/apps/salesforce/dynamic-data/index.js new file mode 100644 index 00000000..a5e46e45 --- /dev/null +++ b/packages/backend/src/apps/salesforce/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listObjects from './list-objects/index.js'; +import listFields from './list-fields/index.js'; + +export default [listObjects, listFields]; diff --git a/packages/backend/src/apps/salesforce/dynamic-data/index.ts b/packages/backend/src/apps/salesforce/dynamic-data/index.ts deleted file mode 100644 index b477b472..00000000 --- a/packages/backend/src/apps/salesforce/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listObjects from './list-objects'; -import listFields from './list-fields'; - -export default [listObjects, listFields]; diff --git a/packages/backend/src/apps/salesforce/dynamic-data/list-fields/index.ts b/packages/backend/src/apps/salesforce/dynamic-data/list-fields/index.js similarity index 62% rename from packages/backend/src/apps/salesforce/dynamic-data/list-fields/index.ts rename to packages/backend/src/apps/salesforce/dynamic-data/list-fields/index.js index 00a61889..c4f20dcb 100644 --- a/packages/backend/src/apps/salesforce/dynamic-data/list-fields/index.ts +++ b/packages/backend/src/apps/salesforce/dynamic-data/list-fields/index.js @@ -1,24 +1,13 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type TResponse = { - fields: TField[]; -}; - -type TField = { - name: string; - label: string; -}; - export default { name: 'List fields', key: 'listFields', - async run($: IGlobalVariable) { + async run($) { const { object } = $.step.parameters; if (!object) return { data: [] }; - const response = await $.http.get( + const response = await $.http.get( `/services/data/v56.0/sobjects/${object}/describe` ); diff --git a/packages/backend/src/apps/salesforce/dynamic-data/list-objects/index.js b/packages/backend/src/apps/salesforce/dynamic-data/list-objects/index.js new file mode 100644 index 00000000..dc670cfd --- /dev/null +++ b/packages/backend/src/apps/salesforce/dynamic-data/list-objects/index.js @@ -0,0 +1,17 @@ +export default { + name: 'List objects', + key: 'listObjects', + + async run($) { + const response = await $.http.get('/services/data/v56.0/sobjects'); + + const objects = response.data.sobjects.map((object) => { + return { + value: object.name, + name: object.label, + }; + }); + + return { data: objects }; + }, +}; diff --git a/packages/backend/src/apps/salesforce/dynamic-data/list-objects/index.ts b/packages/backend/src/apps/salesforce/dynamic-data/list-objects/index.ts deleted file mode 100644 index e02d9839..00000000 --- a/packages/backend/src/apps/salesforce/dynamic-data/list-objects/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type TResponse = { - sobjects: TObject[]; -}; - -type TObject = { - name: string; - label: string; -}; - -export default { - name: 'List objects', - key: 'listObjects', - - async run($: IGlobalVariable) { - const response = await $.http.get( - '/services/data/v56.0/sobjects' - ); - - const objects = response.data.sobjects.map((object) => { - return { - value: object.name, - name: object.label, - }; - }); - - return { data: objects }; - }, -}; diff --git a/packages/backend/src/apps/salesforce/index.d.ts b/packages/backend/src/apps/salesforce/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/salesforce/index.ts b/packages/backend/src/apps/salesforce/index.js similarity index 58% rename from packages/backend/src/apps/salesforce/index.ts rename to packages/backend/src/apps/salesforce/index.js index a6773046..f2ee434d 100644 --- a/packages/backend/src/apps/salesforce/index.ts +++ b/packages/backend/src/apps/salesforce/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Salesforce', diff --git a/packages/backend/src/apps/salesforce/triggers/index.js b/packages/backend/src/apps/salesforce/triggers/index.js new file mode 100644 index 00000000..66fb62c9 --- /dev/null +++ b/packages/backend/src/apps/salesforce/triggers/index.js @@ -0,0 +1,3 @@ +import updatedFieldInRecords from './updated-field-in-records/index.js'; + +export default [updatedFieldInRecords]; diff --git a/packages/backend/src/apps/salesforce/triggers/index.ts b/packages/backend/src/apps/salesforce/triggers/index.ts deleted file mode 100644 index 1cfa329f..00000000 --- a/packages/backend/src/apps/salesforce/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import updatedFieldInRecords from './updated-field-in-records'; - -export default [updatedFieldInRecords]; diff --git a/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/index.ts b/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/index.js similarity index 84% rename from packages/backend/src/apps/salesforce/triggers/updated-field-in-records/index.ts rename to packages/backend/src/apps/salesforce/triggers/updated-field-in-records/index.js index 112839ef..9f948a7b 100644 --- a/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/index.ts +++ b/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import updatedFieldInRecords from './updated-field-in-records'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import updatedFieldInRecords from './updated-field-in-records.js'; export default defineTrigger({ name: 'Updated field in records', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Object', key: 'object', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: false, source: { @@ -27,7 +27,7 @@ export default defineTrigger({ { label: 'Field', key: 'field', - type: 'dropdown' as const, + type: 'dropdown', description: 'Track updates by this field', required: true, variables: false, diff --git a/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/updated-field-in-records.ts b/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/updated-field-in-records.js similarity index 70% rename from packages/backend/src/apps/salesforce/triggers/updated-field-in-records/updated-field-in-records.ts rename to packages/backend/src/apps/salesforce/triggers/updated-field-in-records/updated-field-in-records.js index 6d2480df..b451d00d 100644 --- a/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/updated-field-in-records.ts +++ b/packages/backend/src/apps/salesforce/triggers/updated-field-in-records/updated-field-in-records.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -function getQuery(object: string, limit: number, offset: number) { +function getQuery(object, limit, offset) { return ` SELECT FIELDS(ALL) @@ -12,10 +10,10 @@ function getQuery(object: string, limit: number, offset: number) { `; } -const updatedFieldInRecord = async ($: IGlobalVariable): Promise => { +const updatedFieldInRecord = async ($) => { const limit = 200; - const field = $.step.parameters.field as string; - const object = $.step.parameters.object as string; + const field = $.step.parameters.field; + const object = $.step.parameters.object; let response; let offset = 0; diff --git a/packages/backend/src/apps/scheduler/common/cron-times.js b/packages/backend/src/apps/scheduler/common/cron-times.js new file mode 100644 index 00000000..8682a65c --- /dev/null +++ b/packages/backend/src/apps/scheduler/common/cron-times.js @@ -0,0 +1,10 @@ +const cronTimes = { + everyHour: '0 * * * *', + everyHourExcludingWeekends: '0 * * * 1-5', + everyDayAt: (hour) => `0 ${hour} * * *`, + everyDayExcludingWeekendsAt: (hour) => `0 ${hour} * * 1-5`, + everyWeekOnAndAt: (weekday, hour) => `0 ${hour} * * ${weekday}`, + everyMonthOnAndAt: (day, hour) => `0 ${hour} ${day} * *`, +}; + +export default cronTimes; diff --git a/packages/backend/src/apps/scheduler/common/cron-times.ts b/packages/backend/src/apps/scheduler/common/cron-times.ts deleted file mode 100644 index 51483b25..00000000 --- a/packages/backend/src/apps/scheduler/common/cron-times.ts +++ /dev/null @@ -1,11 +0,0 @@ -const cronTimes = { - everyHour: '0 * * * *', - everyHourExcludingWeekends: '0 * * * 1-5', - everyDayAt: (hour: number) => `0 ${hour} * * *`, - everyDayExcludingWeekendsAt: (hour: number) => `0 ${hour} * * 1-5`, - everyWeekOnAndAt: (weekday: number, hour: number) => - `0 ${hour} * * ${weekday}`, - everyMonthOnAndAt: (day: number, hour: number) => `0 ${hour} ${day} * *`, -}; - -export default cronTimes; diff --git a/packages/backend/src/apps/scheduler/common/get-date-time-object.ts b/packages/backend/src/apps/scheduler/common/get-date-time-object.js similarity index 83% rename from packages/backend/src/apps/scheduler/common/get-date-time-object.ts rename to packages/backend/src/apps/scheduler/common/get-date-time-object.js index f4bae73e..f0d46358 100644 --- a/packages/backend/src/apps/scheduler/common/get-date-time-object.ts +++ b/packages/backend/src/apps/scheduler/common/get-date-time-object.js @@ -1,7 +1,6 @@ import { DateTime } from 'luxon'; -import { IJSONObject } from '@automatisch/types'; -export default function getDateTimeObjectRepresentation(dateTime: DateTime) { +export default function getDateTimeObjectRepresentation(dateTime) { const defaults = dateTime.toObject(); return { @@ -11,5 +10,5 @@ export default function getDateTimeObjectRepresentation(dateTime: DateTime) { pretty_time: dateTime.toLocaleString(DateTime.TIME_WITH_SECONDS), pretty_day_of_week: dateTime.toFormat('cccc'), day_of_week: dateTime.weekday, - } as IJSONObject; + }; } diff --git a/packages/backend/src/apps/scheduler/common/get-next-cron-date-time.ts b/packages/backend/src/apps/scheduler/common/get-next-cron-date-time.js similarity index 82% rename from packages/backend/src/apps/scheduler/common/get-next-cron-date-time.ts rename to packages/backend/src/apps/scheduler/common/get-next-cron-date-time.js index 8ee435bf..0c0a77ab 100644 --- a/packages/backend/src/apps/scheduler/common/get-next-cron-date-time.ts +++ b/packages/backend/src/apps/scheduler/common/get-next-cron-date-time.js @@ -1,7 +1,7 @@ import { DateTime } from 'luxon'; import cronParser from 'cron-parser'; -export default function getNextCronDateTime(cronString: string) { +export default function getNextCronDateTime(cronString) { const cronDate = cronParser.parseExpression(cronString); const matchingNextCronDateTime = cronDate.next(); const matchingNextDateTime = DateTime.fromJSDate( diff --git a/packages/backend/src/apps/scheduler/index.d.ts b/packages/backend/src/apps/scheduler/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/scheduler/index.ts b/packages/backend/src/apps/scheduler/index.js similarity index 78% rename from packages/backend/src/apps/scheduler/index.ts rename to packages/backend/src/apps/scheduler/index.js index 9f81f8fd..73727486 100644 --- a/packages/backend/src/apps/scheduler/index.ts +++ b/packages/backend/src/apps/scheduler/index.js @@ -1,5 +1,5 @@ -import defineApp from '../../helpers/define-app'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Scheduler', diff --git a/packages/backend/src/apps/scheduler/triggers/every-day/index.ts b/packages/backend/src/apps/scheduler/triggers/every-day/index.js similarity index 86% rename from packages/backend/src/apps/scheduler/triggers/every-day/index.ts rename to packages/backend/src/apps/scheduler/triggers/every-day/index.js index 5a6fc3de..7e151645 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-day/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-day/index.js @@ -1,9 +1,9 @@ import { DateTime } from 'luxon'; -import { IGlobalVariable } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import cronTimes from '../../common/cron-times'; -import getNextCronDateTime from '../../common/get-next-cron-date-time'; -import getDateTimeObjectRepresentation from '../../common/get-date-time-object'; + +import defineTrigger from '../../../../helpers/define-trigger.js'; +import cronTimes from '../../common/cron-times.js'; +import getNextCronDateTime from '../../common/get-next-cron-date-time.js'; +import getDateTimeObjectRepresentation from '../../common/get-date-time-object.js'; export default defineTrigger({ name: 'Every day', @@ -13,7 +13,7 @@ export default defineTrigger({ { label: 'Trigger on weekends?', key: 'triggersOnWeekend', - type: 'dropdown' as const, + type: 'dropdown', description: 'Should this flow trigger on Saturday and Sunday?', required: true, value: true, @@ -32,7 +32,7 @@ export default defineTrigger({ { label: 'Time of day', key: 'hour', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: null, variables: false, @@ -137,12 +137,12 @@ export default defineTrigger({ }, ], - getInterval(parameters: IGlobalVariable['step']['parameters']) { - if (parameters.triggersOnWeekend as boolean) { - return cronTimes.everyDayAt(parameters.hour as number); + getInterval(parameters) { + if (parameters.triggersOnWeekend) { + return cronTimes.everyDayAt(parameters.hour); } - return cronTimes.everyDayExcludingWeekendsAt(parameters.hour as number); + return cronTimes.everyDayExcludingWeekendsAt(parameters.hour); }, async run($) { diff --git a/packages/backend/src/apps/scheduler/triggers/every-hour/index.ts b/packages/backend/src/apps/scheduler/triggers/every-hour/index.js similarity index 81% rename from packages/backend/src/apps/scheduler/triggers/every-hour/index.ts rename to packages/backend/src/apps/scheduler/triggers/every-hour/index.js index bb05a0b1..a3dd9178 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-hour/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-hour/index.js @@ -1,9 +1,9 @@ import { DateTime } from 'luxon'; -import { IGlobalVariable } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import cronTimes from '../../common/cron-times'; -import getNextCronDateTime from '../../common/get-next-cron-date-time'; -import getDateTimeObjectRepresentation from '../../common/get-date-time-object'; + +import defineTrigger from '../../../../helpers/define-trigger.js'; +import cronTimes from '../../common/cron-times.js'; +import getNextCronDateTime from '../../common/get-next-cron-date-time.js'; +import getDateTimeObjectRepresentation from '../../common/get-date-time-object.js'; export default defineTrigger({ name: 'Every hour', @@ -13,7 +13,7 @@ export default defineTrigger({ { label: 'Trigger on weekends?', key: 'triggersOnWeekend', - type: 'dropdown' as const, + type: 'dropdown', description: 'Should this flow trigger on Saturday and Sunday?', required: true, value: true, @@ -31,7 +31,7 @@ export default defineTrigger({ }, ], - getInterval(parameters: IGlobalVariable['step']['parameters']) { + getInterval(parameters) { if (parameters.triggersOnWeekend) { return cronTimes.everyHour; } diff --git a/packages/backend/src/apps/scheduler/triggers/every-month/index.ts b/packages/backend/src/apps/scheduler/triggers/every-month/index.js similarity index 92% rename from packages/backend/src/apps/scheduler/triggers/every-month/index.ts rename to packages/backend/src/apps/scheduler/triggers/every-month/index.js index 5476a8b8..36a78d67 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-month/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-month/index.js @@ -1,9 +1,9 @@ import { DateTime } from 'luxon'; -import { IGlobalVariable } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import cronTimes from '../../common/cron-times'; -import getNextCronDateTime from '../../common/get-next-cron-date-time'; -import getDateTimeObjectRepresentation from '../../common/get-date-time-object'; + +import defineTrigger from '../../../../helpers/define-trigger.js'; +import cronTimes from '../../common/cron-times.js'; +import getNextCronDateTime from '../../common/get-next-cron-date-time.js'; +import getDateTimeObjectRepresentation from '../../common/get-date-time-object.js'; export default defineTrigger({ name: 'Every month', @@ -13,7 +13,7 @@ export default defineTrigger({ { label: 'Day of the month', key: 'day', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: null, variables: false, @@ -147,7 +147,7 @@ export default defineTrigger({ { label: 'Time of day', key: 'hour', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: null, variables: false, @@ -252,10 +252,10 @@ export default defineTrigger({ }, ], - getInterval(parameters: IGlobalVariable['step']['parameters']) { + getInterval(parameters) { const interval = cronTimes.everyMonthOnAndAt( - parameters.day as number, - parameters.hour as number + parameters.day, + parameters.hour ); return interval; diff --git a/packages/backend/src/apps/scheduler/triggers/every-week/index.ts b/packages/backend/src/apps/scheduler/triggers/every-week/index.js similarity index 89% rename from packages/backend/src/apps/scheduler/triggers/every-week/index.ts rename to packages/backend/src/apps/scheduler/triggers/every-week/index.js index 93331440..9ee925ab 100644 --- a/packages/backend/src/apps/scheduler/triggers/every-week/index.ts +++ b/packages/backend/src/apps/scheduler/triggers/every-week/index.js @@ -1,9 +1,9 @@ import { DateTime } from 'luxon'; -import { IGlobalVariable } from '@automatisch/types'; -import defineTrigger from '../../../../helpers/define-trigger'; -import cronTimes from '../../common/cron-times'; -import getNextCronDateTime from '../../common/get-next-cron-date-time'; -import getDateTimeObjectRepresentation from '../../common/get-date-time-object'; + +import defineTrigger from '../../../../helpers/define-trigger.js'; +import cronTimes from '../../common/cron-times.js'; +import getNextCronDateTime from '../../common/get-next-cron-date-time.js'; +import getDateTimeObjectRepresentation from '../../common/get-date-time-object.js'; export default defineTrigger({ name: 'Every week', @@ -13,7 +13,7 @@ export default defineTrigger({ { label: 'Day of the week', key: 'weekday', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: null, variables: false, @@ -51,7 +51,7 @@ export default defineTrigger({ { label: 'Time of day', key: 'hour', - type: 'dropdown' as const, + type: 'dropdown', required: true, value: null, variables: false, @@ -156,10 +156,10 @@ export default defineTrigger({ }, ], - getInterval(parameters: IGlobalVariable['step']['parameters']) { + getInterval(parameters) { const interval = cronTimes.everyWeekOnAndAt( - parameters.weekday as number, - parameters.hour as number + parameters.weekday, + parameters.hour ); return interval; diff --git a/packages/backend/src/apps/scheduler/triggers/index.js b/packages/backend/src/apps/scheduler/triggers/index.js new file mode 100644 index 00000000..3239a453 --- /dev/null +++ b/packages/backend/src/apps/scheduler/triggers/index.js @@ -0,0 +1,6 @@ +import everyHour from './every-hour/index.js'; +import everyDay from './every-day/index.js'; +import everyWeek from './every-week/index.js'; +import everyMonth from './every-month/index.js'; + +export default [everyHour, everyDay, everyWeek, everyMonth]; diff --git a/packages/backend/src/apps/scheduler/triggers/index.ts b/packages/backend/src/apps/scheduler/triggers/index.ts deleted file mode 100644 index 94064465..00000000 --- a/packages/backend/src/apps/scheduler/triggers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import everyHour from './every-hour'; -import everyDay from './every-day'; -import everyWeek from './every-week'; -import everyMonth from './every-month'; - -export default [everyHour, everyDay, everyWeek, everyMonth]; diff --git a/packages/backend/src/apps/self-hosted-llm/actions/index.js b/packages/backend/src/apps/self-hosted-llm/actions/index.js new file mode 100644 index 00000000..42d0ac87 --- /dev/null +++ b/packages/backend/src/apps/self-hosted-llm/actions/index.js @@ -0,0 +1,4 @@ +import sendPrompt from './send-prompt/index.js'; +import sendChatPrompt from './send-chat-prompt/index.js'; + +export default [sendChatPrompt, sendPrompt]; diff --git a/packages/backend/src/apps/self-hosted-llm/actions/index.ts b/packages/backend/src/apps/self-hosted-llm/actions/index.ts deleted file mode 100644 index f4e1ffcb..00000000 --- a/packages/backend/src/apps/self-hosted-llm/actions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import sendPrompt from './send-prompt'; -import sendChatPrompt from './send-chat-prompt'; - -export default [sendChatPrompt, sendPrompt]; diff --git a/packages/backend/src/apps/self-hosted-llm/actions/send-chat-prompt/index.ts b/packages/backend/src/apps/self-hosted-llm/actions/send-chat-prompt/index.js similarity index 61% rename from packages/backend/src/apps/self-hosted-llm/actions/send-chat-prompt/index.ts rename to packages/backend/src/apps/self-hosted-llm/actions/send-chat-prompt/index.js index ea239036..2865a69a 100644 --- a/packages/backend/src/apps/self-hosted-llm/actions/send-chat-prompt/index.ts +++ b/packages/backend/src/apps/self-hosted-llm/actions/send-chat-prompt/index.js @@ -1,13 +1,8 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -type TMessage = { - role: string; - content: string; -} - -const castFloatOrUndefined = (value: string | null) => { +const castFloatOrUndefined = (value) => { return value === '' ? undefined : parseFloat(value); -} +}; export default defineAction({ name: 'Send chat prompt', @@ -17,7 +12,7 @@ export default defineAction({ { label: 'Model', key: 'model', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -34,7 +29,7 @@ export default defineAction({ { label: 'Messages', key: 'messages', - type: 'dynamic' as const, + type: 'dynamic', required: true, description: 'Add or remove messages as needed', value: [{ role: 'system', body: '' }], @@ -42,7 +37,7 @@ export default defineAction({ { label: 'Role', key: 'role', - type: 'dropdown' as const, + type: 'dropdown', required: true, options: [ { @@ -52,78 +47,84 @@ export default defineAction({ { label: 'User', value: 'user', - } + }, ], }, { label: 'Content', key: 'content', - type: 'string' as const, + type: 'string', required: true, variables: true, - } + }, ], }, { label: 'Temperature', key: 'temperature', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.' + description: + 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.', }, { label: 'Maximum tokens', key: 'maxTokens', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'The maximum number of tokens to generate in the completion.' + description: + 'The maximum number of tokens to generate in the completion.', }, { label: 'Stop Sequence', key: 'stopSequence', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.' + description: + 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.', }, { label: 'Top P', key: 'topP', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.' + description: + 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.', }, { label: 'Frequency Penalty', key: 'frequencyPenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.`, }, { label: 'Presence Penalty', key: 'presencePenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.`, }, ], async run($) { const payload = { - model: $.step.parameters.model as string, - temperature: castFloatOrUndefined($.step.parameters.temperature as string), - max_tokens: castFloatOrUndefined($.step.parameters.maxTokens as string), - stop: ($.step.parameters.stopSequence as string || null), - top_p: castFloatOrUndefined($.step.parameters.topP as string), - frequency_penalty: castFloatOrUndefined($.step.parameters.frequencyPenalty as string), - presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty as string), - messages: ($.step.parameters.messages as TMessage[]).map(message => ({ + model: $.step.parameters.model, + temperature: castFloatOrUndefined($.step.parameters.temperature), + max_tokens: castFloatOrUndefined($.step.parameters.maxTokens), + stop: $.step.parameters.stopSequence || null, + top_p: castFloatOrUndefined($.step.parameters.topP), + frequency_penalty: castFloatOrUndefined( + $.step.parameters.frequencyPenalty + ), + presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty), + messages: $.step.parameters.messages.map((message) => ({ role: message.role, content: message.content, })), diff --git a/packages/backend/src/apps/self-hosted-llm/actions/send-prompt/index.ts b/packages/backend/src/apps/self-hosted-llm/actions/send-prompt/index.js similarity index 57% rename from packages/backend/src/apps/self-hosted-llm/actions/send-prompt/index.ts rename to packages/backend/src/apps/self-hosted-llm/actions/send-prompt/index.js index cff0ae8f..786b81e1 100644 --- a/packages/backend/src/apps/self-hosted-llm/actions/send-prompt/index.ts +++ b/packages/backend/src/apps/self-hosted-llm/actions/send-prompt/index.js @@ -1,8 +1,8 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; -const castFloatOrUndefined = (value: string | null) => { +const castFloatOrUndefined = (value) => { return value === '' ? undefined : parseFloat(value); -} +}; export default defineAction({ name: 'Send prompt', @@ -12,7 +12,7 @@ export default defineAction({ { label: 'Model', key: 'model', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -29,71 +29,77 @@ export default defineAction({ { label: 'Prompt', key: 'prompt', - type: 'string' as const, + type: 'string', required: true, variables: true, - description: 'The text to analyze.' + description: 'The text to analyze.', }, { label: 'Temperature', key: 'temperature', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.' + description: + 'What sampling temperature to use. Higher values mean the model will take more risk. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. We generally recommend altering this or Top P but not both.', }, { label: 'Maximum tokens', key: 'maxTokens', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'The maximum number of tokens to generate in the completion.' + description: + 'The maximum number of tokens to generate in the completion.', }, { label: 'Stop Sequence', key: 'stopSequence', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.' + description: + 'Single stop sequence where the API will stop generating further tokens. The returned text will not contain the stop sequence.', }, { label: 'Top P', key: 'topP', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.' + description: + 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with Top P probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.', }, { label: 'Frequency Penalty', key: 'frequencyPenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim.`, }, { label: 'Presence Penalty', key: 'presencePenalty', - type: 'string' as const, + type: 'string', required: false, variables: true, - description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.` + description: `Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.`, }, ], async run($) { const payload = { - model: $.step.parameters.model as string, - prompt: $.step.parameters.prompt as string, - temperature: castFloatOrUndefined($.step.parameters.temperature as string), - max_tokens: castFloatOrUndefined($.step.parameters.maxTokens as string), - stop: ($.step.parameters.stopSequence as string || null), - top_p: castFloatOrUndefined($.step.parameters.topP as string), - frequency_penalty: castFloatOrUndefined($.step.parameters.frequencyPenalty as string), - presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty as string), + model: $.step.parameters.model, + prompt: $.step.parameters.prompt, + temperature: castFloatOrUndefined($.step.parameters.temperature), + max_tokens: castFloatOrUndefined($.step.parameters.maxTokens), + stop: $.step.parameters.stopSequence || null, + top_p: castFloatOrUndefined($.step.parameters.topP), + frequency_penalty: castFloatOrUndefined( + $.step.parameters.frequencyPenalty + ), + presence_penalty: castFloatOrUndefined($.step.parameters.presencePenalty), }; const { data } = await $.http.post('/v1/completions', payload); diff --git a/packages/backend/src/apps/self-hosted-llm/auth/index.ts b/packages/backend/src/apps/self-hosted-llm/auth/index.js similarity index 80% rename from packages/backend/src/apps/self-hosted-llm/auth/index.ts rename to packages/backend/src/apps/self-hosted-llm/auth/index.js index 29bd90c8..9d480537 100644 --- a/packages/backend/src/apps/self-hosted-llm/auth/index.ts +++ b/packages/backend/src/apps/self-hosted-llm/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'apiUrl', label: 'API URL', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -29,7 +29,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/self-hosted-llm/auth/is-still-verified.js b/packages/backend/src/apps/self-hosted-llm/auth/is-still-verified.js new file mode 100644 index 00000000..3e6c9095 --- /dev/null +++ b/packages/backend/src/apps/self-hosted-llm/auth/is-still-verified.js @@ -0,0 +1,6 @@ +const isStillVerified = async ($) => { + await $.http.get('/v1/models'); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/self-hosted-llm/auth/is-still-verified.ts b/packages/backend/src/apps/self-hosted-llm/auth/is-still-verified.ts deleted file mode 100644 index da69d50c..00000000 --- a/packages/backend/src/apps/self-hosted-llm/auth/is-still-verified.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { - const r = await $.http.get('/v1/models'); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/self-hosted-llm/auth/verify-credentials.js b/packages/backend/src/apps/self-hosted-llm/auth/verify-credentials.js new file mode 100644 index 00000000..7f43f884 --- /dev/null +++ b/packages/backend/src/apps/self-hosted-llm/auth/verify-credentials.js @@ -0,0 +1,5 @@ +const verifyCredentials = async ($) => { + await $.http.get('/v1/models'); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/self-hosted-llm/auth/verify-credentials.ts b/packages/backend/src/apps/self-hosted-llm/auth/verify-credentials.ts deleted file mode 100644 index e9fb2540..00000000 --- a/packages/backend/src/apps/self-hosted-llm/auth/verify-credentials.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - await $.http.get('/v1/models'); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/openai/common/add-auth-header.ts b/packages/backend/src/apps/self-hosted-llm/common/add-auth-header.js similarity index 58% rename from packages/backend/src/apps/openai/common/add-auth-header.ts rename to packages/backend/src/apps/self-hosted-llm/common/add-auth-header.js index 2b0de0ce..f9f5acba 100644 --- a/packages/backend/src/apps/openai/common/add-auth-header.ts +++ b/packages/backend/src/apps/self-hosted-llm/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.apiKey) { requestConfig.headers.Authorization = `Bearer ${$.auth.data.apiKey}`; } diff --git a/packages/backend/src/apps/self-hosted-llm/common/set-base-url.js b/packages/backend/src/apps/self-hosted-llm/common/set-base-url.js new file mode 100644 index 00000000..4dd124ad --- /dev/null +++ b/packages/backend/src/apps/self-hosted-llm/common/set-base-url.js @@ -0,0 +1,9 @@ +const setBaseUrl = ($, requestConfig) => { + if ($.auth.data.apiUrl) { + requestConfig.baseURL = $.auth.data.apiUrl; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/self-hosted-llm/common/set-base-url.ts b/packages/backend/src/apps/self-hosted-llm/common/set-base-url.ts deleted file mode 100644 index 5dcade86..00000000 --- a/packages/backend/src/apps/self-hosted-llm/common/set-base-url.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data.apiUrl) { - requestConfig.baseURL = $.auth.data.apiUrl as string; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/self-hosted-llm/dynamic-data/index.js b/packages/backend/src/apps/self-hosted-llm/dynamic-data/index.js new file mode 100644 index 00000000..6db48046 --- /dev/null +++ b/packages/backend/src/apps/self-hosted-llm/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listModels from './list-models/index.js'; + +export default [listModels]; diff --git a/packages/backend/src/apps/self-hosted-llm/dynamic-data/index.ts b/packages/backend/src/apps/self-hosted-llm/dynamic-data/index.ts deleted file mode 100644 index 4072dcdd..00000000 --- a/packages/backend/src/apps/self-hosted-llm/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listModels from './list-models'; - -export default [listModels]; diff --git a/packages/backend/src/apps/self-hosted-llm/dynamic-data/list-models/index.ts b/packages/backend/src/apps/self-hosted-llm/dynamic-data/list-models/index.js similarity index 59% rename from packages/backend/src/apps/self-hosted-llm/dynamic-data/list-models/index.ts rename to packages/backend/src/apps/self-hosted-llm/dynamic-data/list-models/index.js index 645b9f1e..a8e81538 100644 --- a/packages/backend/src/apps/self-hosted-llm/dynamic-data/list-models/index.ts +++ b/packages/backend/src/apps/self-hosted-llm/dynamic-data/list-models/index.js @@ -1,13 +1,11 @@ -import { IGlobalVariable } from '@automatisch/types'; - export default { name: 'List models', key: 'listModels', - async run($: IGlobalVariable) { + async run($) { const response = await $.http.get('/v1/models'); - const models = response.data.data.map((model: { id: string }) => { + const models = response.data.data.map((model) => { return { value: model.id, name: model.id, diff --git a/packages/backend/src/apps/self-hosted-llm/index.d.ts b/packages/backend/src/apps/self-hosted-llm/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/self-hosted-llm/index.ts b/packages/backend/src/apps/self-hosted-llm/index.js similarity index 57% rename from packages/backend/src/apps/self-hosted-llm/index.ts rename to packages/backend/src/apps/self-hosted-llm/index.js index 2f2fd5e3..1998fc9f 100644 --- a/packages/backend/src/apps/self-hosted-llm/index.ts +++ b/packages/backend/src/apps/self-hosted-llm/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import setBaseUrl from './common/set-base-url'; -import auth from './auth'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import setBaseUrl from './common/set-base-url.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Self-hosted LLM', diff --git a/packages/backend/src/apps/signalwire/actions/index.js b/packages/backend/src/apps/signalwire/actions/index.js new file mode 100644 index 00000000..18a261f9 --- /dev/null +++ b/packages/backend/src/apps/signalwire/actions/index.js @@ -0,0 +1,3 @@ +import sendSms from './send-sms/index.js'; + +export default [sendSms]; diff --git a/packages/backend/src/apps/signalwire/actions/index.ts b/packages/backend/src/apps/signalwire/actions/index.ts deleted file mode 100644 index d1723dc2..00000000 --- a/packages/backend/src/apps/signalwire/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendSms from './send-sms'; - -export default [sendSms]; diff --git a/packages/backend/src/apps/signalwire/actions/send-sms/index.ts b/packages/backend/src/apps/signalwire/actions/send-sms/index.js similarity index 84% rename from packages/backend/src/apps/signalwire/actions/send-sms/index.ts rename to packages/backend/src/apps/signalwire/actions/send-sms/index.js index fee65fbf..152ab8d2 100644 --- a/packages/backend/src/apps/signalwire/actions/send-sms/index.ts +++ b/packages/backend/src/apps/signalwire/actions/send-sms/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Send an SMS', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'From Number', key: 'fromNumber', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The number to send the SMS from. Include only country code. Example: 491234567890', @@ -27,7 +27,7 @@ export default defineAction({ { label: 'To Number', key: 'toNumber', - type: 'string' as const, + type: 'string', required: true, description: 'The number to send the SMS to. Include only country code. Example: 491234567890', @@ -36,7 +36,7 @@ export default defineAction({ { label: 'Message', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The content of the message.', variables: true, @@ -48,14 +48,14 @@ export default defineAction({ const Body = $.step.parameters.message; const From = $.step.parameters.fromNumber; - const To = '+' + ($.step.parameters.toNumber as string).trim(); + const To = '+' + $.step.parameters.toNumber.trim(); const response = await $.http.post(requestPath, null, { params: { Body, From, To, - } + }, }); $.setActionItem({ raw: response.data }); diff --git a/packages/backend/src/apps/signalwire/auth/index.ts b/packages/backend/src/apps/signalwire/auth/index.js similarity index 78% rename from packages/backend/src/apps/signalwire/auth/index.ts rename to packages/backend/src/apps/signalwire/auth/index.js index 32f9c922..59a32bee 100644 --- a/packages/backend/src/apps/signalwire/auth/index.ts +++ b/packages/backend/src/apps/signalwire/auth/index.js @@ -1,24 +1,23 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'accountSid', label: 'Project ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, placeholder: null, - description: - 'Log into your SignalWire account and find the Project ID', + description: 'Log into your SignalWire account and find the Project ID', clickToCopy: false, }, { key: 'authToken', label: 'API Token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -29,7 +28,7 @@ export default { { key: 'spaceRegion', label: 'SignalWire Region', - type: 'dropdown' as const, + type: 'dropdown', required: true, readOnly: false, value: '', @@ -50,7 +49,7 @@ export default { { key: 'spaceName', label: 'Space Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/signalwire/auth/is-still-verified.js b/packages/backend/src/apps/signalwire/auth/is-still-verified.js new file mode 100644 index 00000000..270d415b --- /dev/null +++ b/packages/backend/src/apps/signalwire/auth/is-still-verified.js @@ -0,0 +1,9 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/signalwire/auth/is-still-verified.ts b/packages/backend/src/apps/signalwire/auth/is-still-verified.ts deleted file mode 100644 index 5a2fe2ae..00000000 --- a/packages/backend/src/apps/signalwire/auth/is-still-verified.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/signalwire/auth/verify-credentials.js b/packages/backend/src/apps/signalwire/auth/verify-credentials.js new file mode 100644 index 00000000..4b87b86c --- /dev/null +++ b/packages/backend/src/apps/signalwire/auth/verify-credentials.js @@ -0,0 +1,11 @@ +const verifyCredentials = async ($) => { + const { data } = await $.http.get( + `/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}` + ); + + await $.auth.set({ + screenName: `${data.friendly_name} (${$.auth.data.accountSid})`, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/signalwire/auth/verify-credentials.ts b/packages/backend/src/apps/signalwire/auth/verify-credentials.ts deleted file mode 100644 index fbbf5ddc..00000000 --- a/packages/backend/src/apps/signalwire/auth/verify-credentials.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - const { data } = await $.http.get(`/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}`); - - await $.auth.set({ - screenName: `${data.friendly_name} (${$.auth.data.accountSid})`, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/signalwire/common/add-auth-header.ts b/packages/backend/src/apps/signalwire/common/add-auth-header.js similarity index 51% rename from packages/backend/src/apps/signalwire/common/add-auth-header.ts rename to packages/backend/src/apps/signalwire/common/add-auth-header.js index f26c2af2..7059a8c8 100644 --- a/packages/backend/src/apps/signalwire/common/add-auth-header.ts +++ b/packages/backend/src/apps/signalwire/common/add-auth-header.js @@ -1,24 +1,19 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const authData = $.auth.data || {}; requestConfig.headers['Content-Type'] = 'application/x-www-form-urlencoded'; - if ( - authData.accountSid && - authData.authToken - ) { + if (authData.accountSid && authData.authToken) { requestConfig.auth = { - username: authData.accountSid as string, - password: authData.authToken as string, + username: authData.accountSid, + password: authData.authToken, }; } if (authData.spaceName) { const serverUrl = `https://${authData.spaceName}.${authData.spaceRegion}signalwire.com`; - requestConfig.baseURL = serverUrl as string; + requestConfig.baseURL = serverUrl; } return requestConfig; diff --git a/packages/backend/src/apps/signalwire/dynamic-data/index.ts b/packages/backend/src/apps/signalwire/dynamic-data/index.js similarity index 87% rename from packages/backend/src/apps/signalwire/dynamic-data/index.ts rename to packages/backend/src/apps/signalwire/dynamic-data/index.js index d20d4347..758d4abe 100644 --- a/packages/backend/src/apps/signalwire/dynamic-data/index.ts +++ b/packages/backend/src/apps/signalwire/dynamic-data/index.js @@ -1,3 +1,3 @@ -import listIncomingPhoneNumbers from './list-incoming-phone-numbers'; +import listIncomingPhoneNumbers from './list-incoming-phone-numbers/index.js'; export default [listIncomingPhoneNumbers]; diff --git a/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.ts b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.js similarity index 62% rename from packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.ts rename to packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.js index 969d2e45..72fa66a2 100644 --- a/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.ts +++ b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.js @@ -1,37 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type TAggregatedResponse = { - data: IJSONObject[]; - error?: IJSONObject; -}; - -type TResponse = { - incoming_phone_numbers: TIncomingPhoneNumber[]; - next_page_uri: string; -}; - -type TIncomingPhoneNumber = { - capabilities: { - sms: boolean; - }; - sid: string; - friendly_name: string; - phone_number: string; -}; - export default { name: 'List incoming phone numbers', key: 'listIncomingPhoneNumbers', - async run($: IGlobalVariable) { + async run($) { let requestPath = `/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers`; - const aggregatedResponse: TAggregatedResponse = { + const aggregatedResponse = { data: [], }; do { - const { data } = await $.http.get(requestPath); + const { data } = await $.http.get(requestPath); const smsCapableIncomingPhoneNumbers = data.incoming_phone_numbers .filter((incomingPhoneNumber) => { @@ -46,8 +25,8 @@ export default { value: phoneNumber, name, }; - }) - aggregatedResponse.data.push(...smsCapableIncomingPhoneNumbers) + }); + aggregatedResponse.data.push(...smsCapableIncomingPhoneNumbers); requestPath = data.next_page_uri; } while (requestPath); diff --git a/packages/backend/src/apps/signalwire/index.d.ts b/packages/backend/src/apps/signalwire/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/signalwire/index.ts b/packages/backend/src/apps/signalwire/index.js similarity index 58% rename from packages/backend/src/apps/signalwire/index.ts rename to packages/backend/src/apps/signalwire/index.js index 658a9a90..13a434cb 100644 --- a/packages/backend/src/apps/signalwire/index.ts +++ b/packages/backend/src/apps/signalwire/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'SignalWire', diff --git a/packages/backend/src/apps/signalwire/triggers/index.js b/packages/backend/src/apps/signalwire/triggers/index.js new file mode 100644 index 00000000..c7219e50 --- /dev/null +++ b/packages/backend/src/apps/signalwire/triggers/index.js @@ -0,0 +1,3 @@ +import receiveSms from './receive-sms/index.js'; + +export default [receiveSms]; diff --git a/packages/backend/src/apps/signalwire/triggers/index.ts b/packages/backend/src/apps/signalwire/triggers/index.ts deleted file mode 100644 index 04e1504d..00000000 --- a/packages/backend/src/apps/signalwire/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import receiveSms from './receive-sms'; - -export default [receiveSms]; diff --git a/packages/backend/src/apps/signalwire/triggers/receive-sms/fetch-messages.ts b/packages/backend/src/apps/signalwire/triggers/receive-sms/fetch-messages.js similarity index 58% rename from packages/backend/src/apps/signalwire/triggers/receive-sms/fetch-messages.ts rename to packages/backend/src/apps/signalwire/triggers/receive-sms/fetch-messages.js index 425c5b20..ab3a6d4e 100644 --- a/packages/backend/src/apps/signalwire/triggers/receive-sms/fetch-messages.ts +++ b/packages/backend/src/apps/signalwire/triggers/receive-sms/fetch-messages.js @@ -1,7 +1,5 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const fetchMessages = async ($: IGlobalVariable) => { - const toNumber = $.step.parameters.toNumber as string; +const fetchMessages = async ($) => { + const toNumber = $.step.parameters.toNumber; let response; let requestPath = `/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}/Messages?To=${toNumber}`; @@ -9,11 +7,11 @@ const fetchMessages = async ($: IGlobalVariable) => { do { response = await $.http.get(requestPath); - response.data.messages.forEach((message: IJSONObject) => { + response.data.messages.forEach((message) => { const dataItem = { raw: message, meta: { - internalId: message.date_sent as string, + internalId: message.date_sent, }, }; diff --git a/packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts b/packages/backend/src/apps/signalwire/triggers/receive-sms/index.js similarity index 84% rename from packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts rename to packages/backend/src/apps/signalwire/triggers/receive-sms/index.js index 896244fa..d71ab762 100644 --- a/packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts +++ b/packages/backend/src/apps/signalwire/triggers/receive-sms/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import fetchMessages from './fetch-messages'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import fetchMessages from './fetch-messages.js'; export default defineTrigger({ name: 'Receive SMS', diff --git a/packages/backend/src/apps/slack/actions/find-message/find-message.ts b/packages/backend/src/apps/slack/actions/find-message/find-message.js similarity index 63% rename from packages/backend/src/apps/slack/actions/find-message/find-message.ts rename to packages/backend/src/apps/slack/actions/find-message/find-message.js index b910e01b..44de43bc 100644 --- a/packages/backend/src/apps/slack/actions/find-message/find-message.ts +++ b/packages/backend/src/apps/slack/actions/find-message/find-message.js @@ -1,13 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -type FindMessageOptions = { - query: string; - sortBy: string; - sortDirection: string; - count: number; -}; - -const findMessage = async ($: IGlobalVariable, options: FindMessageOptions) => { +const findMessage = async ($, options) => { const params = { query: options.query, sort: options.sortBy, diff --git a/packages/backend/src/apps/slack/actions/find-message/index.ts b/packages/backend/src/apps/slack/actions/find-message/index.js similarity index 81% rename from packages/backend/src/apps/slack/actions/find-message/index.ts rename to packages/backend/src/apps/slack/actions/find-message/index.js index 48007c2d..3a5c06a4 100644 --- a/packages/backend/src/apps/slack/actions/find-message/index.ts +++ b/packages/backend/src/apps/slack/actions/find-message/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import findMessage from './find-message'; +import defineAction from '../../../../helpers/define-action.js'; +import findMessage from './find-message.js'; export default defineAction({ name: 'Find a message', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Search Query', key: 'query', - type: 'string' as const, + type: 'string', required: true, description: 'Search query to use for finding matching messages. See the Slack Search Documentation for more information on constructing a query.', @@ -18,7 +18,7 @@ export default defineAction({ { label: 'Sort by', key: 'sortBy', - type: 'dropdown' as const, + type: 'dropdown', description: 'Sort messages by their match strength or by their date. Default is score.', required: true, @@ -38,7 +38,7 @@ export default defineAction({ { label: 'Sort direction', key: 'sortDirection', - type: 'dropdown' as const, + type: 'dropdown', description: 'Sort matching messages in ascending or descending order. Default is descending.', required: true, @@ -59,9 +59,9 @@ export default defineAction({ async run($) { const parameters = $.step.parameters; - const query = parameters.query as string; - const sortBy = parameters.sortBy as string; - const sortDirection = parameters.sortDirection as string; + const query = parameters.query; + const sortBy = parameters.sortBy; + const sortDirection = parameters.sortDirection; const count = 1; const messages = await findMessage($, { diff --git a/packages/backend/src/apps/slack/actions/find-user-by-email/index.ts b/packages/backend/src/apps/slack/actions/find-user-by-email/index.js similarity index 74% rename from packages/backend/src/apps/slack/actions/find-user-by-email/index.ts rename to packages/backend/src/apps/slack/actions/find-user-by-email/index.js index 85e138bc..10b99cae 100644 --- a/packages/backend/src/apps/slack/actions/find-user-by-email/index.ts +++ b/packages/backend/src/apps/slack/actions/find-user-by-email/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Find user by email', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Email', key: 'email', - type: 'string' as const, + type: 'string', required: true, variables: true, }, @@ -16,11 +16,11 @@ export default defineAction({ async run($) { const params = { - email: $.step.parameters.email as string, + email: $.step.parameters.email, }; const { data } = await $.http.get('/users.lookupByEmail', { - params + params, }); if (data.ok) { diff --git a/packages/backend/src/apps/slack/actions/index.js b/packages/backend/src/apps/slack/actions/index.js new file mode 100644 index 00000000..f10776f6 --- /dev/null +++ b/packages/backend/src/apps/slack/actions/index.js @@ -0,0 +1,11 @@ +import findMessage from './find-message/index.js'; +import findUserByEmail from './find-user-by-email/index.js'; +import sendMessageToChannel from './send-a-message-to-channel/index.js'; +import sendDirectMessage from './send-a-direct-message/index.js'; + +export default [ + findMessage, + findUserByEmail, + sendMessageToChannel, + sendDirectMessage, +]; diff --git a/packages/backend/src/apps/slack/actions/index.ts b/packages/backend/src/apps/slack/actions/index.ts deleted file mode 100644 index a5e3be8f..00000000 --- a/packages/backend/src/apps/slack/actions/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import findMessage from './find-message'; -import findUserByEmail from './find-user-by-email'; -import sendMessageToChannel from './send-a-message-to-channel'; -import sendDirectMessage from './send-a-direct-message'; - -export default [findMessage, findUserByEmail, sendMessageToChannel, sendDirectMessage]; diff --git a/packages/backend/src/apps/slack/actions/send-a-direct-message/index.ts b/packages/backend/src/apps/slack/actions/send-a-direct-message/index.js similarity index 84% rename from packages/backend/src/apps/slack/actions/send-a-direct-message/index.ts rename to packages/backend/src/apps/slack/actions/send-a-direct-message/index.js index 481150bf..0d6fa916 100644 --- a/packages/backend/src/apps/slack/actions/send-a-direct-message/index.ts +++ b/packages/backend/src/apps/slack/actions/send-a-direct-message/index.js @@ -1,15 +1,16 @@ -import defineAction from '../../../../helpers/define-action'; -import postMessage from './post-message'; +import defineAction from '../../../../helpers/define-action.js'; +import postMessage from './post-message.js'; export default defineAction({ name: 'Send a direct message', key: 'sendDirectMessage', - description: 'Sends a direct message to a user or yourself from the Slackbot.', + description: + 'Sends a direct message to a user or yourself from the Slackbot.', arguments: [ { label: 'To username', key: 'toUsername', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick a user to send the message to.', variables: true, @@ -27,7 +28,7 @@ export default defineAction({ { label: 'Message text', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The content of your new message.', variables: true, @@ -35,7 +36,7 @@ export default defineAction({ { label: 'Send as a bot?', key: 'sendAsBot', - type: 'dropdown' as const, + type: 'dropdown', required: false, value: false, description: diff --git a/packages/backend/src/apps/slack/actions/send-a-direct-message/post-message.ts b/packages/backend/src/apps/slack/actions/send-a-direct-message/post-message.js similarity index 58% rename from packages/backend/src/apps/slack/actions/send-a-direct-message/post-message.ts rename to packages/backend/src/apps/slack/actions/send-a-direct-message/post-message.js index c918f9b6..0045cfcd 100644 --- a/packages/backend/src/apps/slack/actions/send-a-direct-message/post-message.ts +++ b/packages/backend/src/apps/slack/actions/send-a-direct-message/post-message.js @@ -1,23 +1,14 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URL } from 'url'; -type TData = { - channel: string; - text: string; - username?: string; - icon_url?: string; - icon_emoji?: string; -}; - -const postMessage = async ($: IGlobalVariable) => { +const postMessage = async ($) => { const { parameters } = $.step; - const toUsername = parameters.toUsername as string; - const text = parameters.message as string; - const sendAsBot = parameters.sendAsBot as boolean; - const botName = parameters.botName as string; - const botIcon = parameters.botIcon as string; + const toUsername = parameters.toUsername; + const text = parameters.message; + const sendAsBot = parameters.sendAsBot; + const botName = parameters.botName; + const botIcon = parameters.botIcon; - const data: TData = { + const data = { channel: toUsername, text, }; diff --git a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/index.ts b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/index.js similarity index 88% rename from packages/backend/src/apps/slack/actions/send-a-message-to-channel/index.ts rename to packages/backend/src/apps/slack/actions/send-a-message-to-channel/index.js index 6b42cc6c..5a25e86a 100644 --- a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/index.ts +++ b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/index.js @@ -1,5 +1,5 @@ -import defineAction from '../../../../helpers/define-action'; -import postMessage from './post-message'; +import defineAction from '../../../../helpers/define-action.js'; +import postMessage from './post-message.js'; export default defineAction({ name: 'Send a message to channel', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'Channel', key: 'channel', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick a channel to send the message to.', variables: true, @@ -27,7 +27,7 @@ export default defineAction({ { label: 'Message text', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The content of your new message.', variables: true, @@ -35,7 +35,7 @@ export default defineAction({ { label: 'Send as a bot?', key: 'sendAsBot', - type: 'dropdown' as const, + type: 'dropdown', required: false, value: false, description: diff --git a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.js similarity index 58% rename from packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts rename to packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.js index 8e5376b8..3b466795 100644 --- a/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.ts +++ b/packages/backend/src/apps/slack/actions/send-a-message-to-channel/post-message.js @@ -1,23 +1,14 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URL } from 'url'; -type TData = { - channel: string; - text: string; - username?: string; - icon_url?: string; - icon_emoji?: string; -}; - -const postMessage = async ($: IGlobalVariable) => { +const postMessage = async ($) => { const { parameters } = $.step; - const channelId = parameters.channel as string; - const text = parameters.message as string; - const sendAsBot = parameters.sendAsBot as boolean; - const botName = parameters.botName as string; - const botIcon = parameters.botIcon as string; + const channelId = parameters.channel; + const text = parameters.message; + const sendAsBot = parameters.sendAsBot; + const botName = parameters.botName; + const botIcon = parameters.botIcon; - const data: TData = { + const data = { channel: channelId, text, }; diff --git a/packages/backend/src/apps/slack/auth/generate-auth-url.ts b/packages/backend/src/apps/slack/auth/generate-auth-url.js similarity index 78% rename from packages/backend/src/apps/slack/auth/generate-auth-url.ts rename to packages/backend/src/apps/slack/auth/generate-auth-url.js index 72e6ec03..58f225cc 100644 --- a/packages/backend/src/apps/slack/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/slack/auth/generate-auth-url.js @@ -1,4 +1,3 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import qs from 'qs'; const scopes = [ @@ -43,13 +42,13 @@ const userScopes = [ 'users:read.email', ]; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = qs.stringify({ - client_id: $.auth.data.consumerKey as string, + client_id: $.auth.data.consumerKey, redirect_uri: redirectUri, scope: scopes.join(','), user_scope: userScopes.join(','), diff --git a/packages/backend/src/apps/slack/auth/index.ts b/packages/backend/src/apps/slack/auth/index.js similarity index 77% rename from packages/backend/src/apps/slack/auth/index.ts rename to packages/backend/src/apps/slack/auth/index.js index b5430c86..48adcf82 100644 --- a/packages/backend/src/apps/slack/auth/index.ts +++ b/packages/backend/src/apps/slack/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/slack/connections/add', @@ -19,7 +19,7 @@ export default { { key: 'consumerKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -30,7 +30,7 @@ export default { { key: 'consumerSecret', label: 'API Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/slack/auth/is-still-verified.js b/packages/backend/src/apps/slack/auth/is-still-verified.js new file mode 100644 index 00000000..1b9d46d0 --- /dev/null +++ b/packages/backend/src/apps/slack/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/slack/auth/is-still-verified.ts b/packages/backend/src/apps/slack/auth/is-still-verified.ts deleted file mode 100644 index befb7694..00000000 --- a/packages/backend/src/apps/slack/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/slack/auth/verify-credentials.ts b/packages/backend/src/apps/slack/auth/verify-credentials.js similarity index 82% rename from packages/backend/src/apps/slack/auth/verify-credentials.ts rename to packages/backend/src/apps/slack/auth/verify-credentials.js index 5450d124..c00f7d8b 100644 --- a/packages/backend/src/apps/slack/auth/verify-credentials.ts +++ b/packages/backend/src/apps/slack/auth/verify-credentials.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const params = { code: $.auth.data.code, client_id: $.auth.data.consumerKey, diff --git a/packages/backend/src/apps/slack/common/add-auth-header.ts b/packages/backend/src/apps/slack/common/add-auth-header.js similarity index 82% rename from packages/backend/src/apps/slack/common/add-auth-header.ts rename to packages/backend/src/apps/slack/common/add-auth-header.js index 24feca73..bd650e45 100644 --- a/packages/backend/src/apps/slack/common/add-auth-header.ts +++ b/packages/backend/src/apps/slack/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const authData = $.auth.data; if ( requestConfig.headers && diff --git a/packages/backend/src/apps/slack/common/get-current-user.ts b/packages/backend/src/apps/slack/common/get-current-user.js similarity index 50% rename from packages/backend/src/apps/slack/common/get-current-user.ts rename to packages/backend/src/apps/slack/common/get-current-user.js index 9d9b4fba..7b874868 100644 --- a/packages/backend/src/apps/slack/common/get-current-user.ts +++ b/packages/backend/src/apps/slack/common/get-current-user.js @@ -1,8 +1,6 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const params = { - user: $.auth.data.userId as string, + user: $.auth.data.userId, }; const response = await $.http.get('/users.info', { params }); const currentUser = response.data.user; diff --git a/packages/backend/src/apps/slack/dynamic-data/index.js b/packages/backend/src/apps/slack/dynamic-data/index.js new file mode 100644 index 00000000..e0044a49 --- /dev/null +++ b/packages/backend/src/apps/slack/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listChannels from './list-channels/index.js'; +import listUsers from './list-users/index.js'; + +export default [listChannels, listUsers]; diff --git a/packages/backend/src/apps/slack/dynamic-data/index.ts b/packages/backend/src/apps/slack/dynamic-data/index.ts deleted file mode 100644 index 6963b403..00000000 --- a/packages/backend/src/apps/slack/dynamic-data/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import listChannels from './list-channels'; -import listUsers from './list-users'; - -export default [listChannels, listUsers]; diff --git a/packages/backend/src/apps/slack/dynamic-data/list-channels/index.js b/packages/backend/src/apps/slack/dynamic-data/list-channels/index.js new file mode 100644 index 00000000..fe0310ca --- /dev/null +++ b/packages/backend/src/apps/slack/dynamic-data/list-channels/index.js @@ -0,0 +1,43 @@ +export default { + name: 'List channels', + key: 'listChannels', + + async run($) { + const channels = { + data: [], + error: null, + }; + + let nextCursor; + do { + const response = await $.http.get('/conversations.list', { + params: { + types: 'public_channel,private_channel', + cursor: nextCursor, + limit: 1000, + }, + }); + + nextCursor = response.data.response_metadata?.next_cursor; + + if (response.data.error === 'missing_scope') { + throw new Error( + `Missing "${response.data.needed}" scope while authorizing. Please, reconnect your connection!` + ); + } + + if (response.data.ok === false) { + throw new Error(JSON.stringify(response.data, null, 2)); + } + + for (const channel of response.data.channels) { + channels.data.push({ + value: channel.id, + name: channel.name, + }); + } + } while (nextCursor); + + return channels; + }, +}; diff --git a/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts b/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts deleted file mode 100644 index a851903c..00000000 --- a/packages/backend/src/apps/slack/dynamic-data/list-channels/index.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type TChannel = { - id: string; - name: string; -} - -type TConversationListResponseData = { - channels: TChannel[], - response_metadata?: { - next_cursor: string - }; - needed?: string; - error?: string; - ok: boolean; -} - -type TResponse = { - data: TConversationListResponseData; -} - -export default { - name: 'List channels', - key: 'listChannels', - - async run($: IGlobalVariable) { - const channels: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { - data: [], - error: null, - }; - - let nextCursor; - do { - const response: TResponse = await $.http.get('/conversations.list', { - params: { - types: 'public_channel,private_channel', - cursor: nextCursor, - limit: 1000, - } - }); - - nextCursor = response.data.response_metadata?.next_cursor; - - if (response.data.error === 'missing_scope') { - throw new Error(`Missing "${response.data.needed}" scope while authorizing. Please, reconnect your connection!`); - } - - if (response.data.ok === false) { - throw new Error(JSON.stringify(response.data, null, 2)); - } - - for (const channel of response.data.channels) { - channels.data.push({ - value: channel.id as string, - name: channel.name as string, - }); - } - } while (nextCursor); - - return channels; - }, -}; diff --git a/packages/backend/src/apps/slack/dynamic-data/list-users/index.js b/packages/backend/src/apps/slack/dynamic-data/list-users/index.js new file mode 100644 index 00000000..49935bc1 --- /dev/null +++ b/packages/backend/src/apps/slack/dynamic-data/list-users/index.js @@ -0,0 +1,43 @@ +export default { + name: 'List users', + key: 'listUsers', + + async run($) { + const users = { + data: [], + error: null, + }; + + let nextCursor; + + do { + const response = await $.http.get('/users.list', { + params: { + cursor: nextCursor, + limit: 1000, + }, + }); + + nextCursor = response.data.response_metadata?.next_cursor; + + if (response.data.error === 'missing_scope') { + throw new Error( + `Missing "${response.data.needed}" scope while authorizing. Please, reconnect your connection!` + ); + } + + if (response.data.ok === false) { + throw new Error(JSON.stringify(response.data, null, 2)); + } + + for (const member of response.data.members) { + users.data.push({ + value: member.id, + name: member.profile.real_name_normalized, + }); + } + } while (nextCursor); + + return users; + }, +}; diff --git a/packages/backend/src/apps/slack/dynamic-data/list-users/index.ts b/packages/backend/src/apps/slack/dynamic-data/list-users/index.ts deleted file mode 100644 index 5264667b..00000000 --- a/packages/backend/src/apps/slack/dynamic-data/list-users/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type TMember = { - id: string; - profile: { - real_name_normalized: string; - }; -} - -type TUserListResponseData = { - members: TMember[], - response_metadata?: { - next_cursor: string - }; - needed?: string; - error?: string; - ok: boolean; -} - -type TResponse = { - data: TUserListResponseData; -} - -export default { - name: 'List users', - key: 'listUsers', - - async run($: IGlobalVariable) { - const users: { - data: IJSONObject[]; - error: IJSONObject | null; - } = { - data: [], - error: null, - }; - - let nextCursor; - do { - const response: TResponse = await $.http.get('/users.list', { - params: { - cursor: nextCursor, - limit: 1000, - } - }); - - nextCursor = response.data.response_metadata?.next_cursor; - - if (response.data.error === 'missing_scope') { - throw new Error(`Missing "${response.data.needed}" scope while authorizing. Please, reconnect your connection!`); - } - - if (response.data.ok === false) { - throw new Error(JSON.stringify(response.data, null, 2)); - } - - for (const member of response.data.members) { - users.data.push({ - value: member.id as string, - name: member.profile.real_name_normalized as string, - }); - } - } while (nextCursor); - - return users; - }, -}; diff --git a/packages/backend/src/apps/slack/dynamic-fields/index.js b/packages/backend/src/apps/slack/dynamic-fields/index.js new file mode 100644 index 00000000..05098366 --- /dev/null +++ b/packages/backend/src/apps/slack/dynamic-fields/index.js @@ -0,0 +1,3 @@ +import listFieldsAfterSendAsBot from './send-as-bot/index.js'; + +export default [listFieldsAfterSendAsBot]; diff --git a/packages/backend/src/apps/slack/dynamic-fields/index.ts b/packages/backend/src/apps/slack/dynamic-fields/index.ts deleted file mode 100644 index 220e3ef3..00000000 --- a/packages/backend/src/apps/slack/dynamic-fields/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listFieldsAfterSendAsBot from './send-as-bot'; - -export default [listFieldsAfterSendAsBot]; diff --git a/packages/backend/src/apps/slack/dynamic-fields/send-as-bot/index.ts b/packages/backend/src/apps/slack/dynamic-fields/send-as-bot/index.js similarity index 83% rename from packages/backend/src/apps/slack/dynamic-fields/send-as-bot/index.ts rename to packages/backend/src/apps/slack/dynamic-fields/send-as-bot/index.js index 75c6c5e0..a7a23a75 100644 --- a/packages/backend/src/apps/slack/dynamic-fields/send-as-bot/index.ts +++ b/packages/backend/src/apps/slack/dynamic-fields/send-as-bot/index.js @@ -1,16 +1,14 @@ -import { IGlobalVariable } from '@automatisch/types'; - export default { name: 'List fields after send as bot', key: 'listFieldsAfterSendAsBot', - async run($: IGlobalVariable) { + async run($) { if ($.step.parameters.sendAsBot) { return [ { label: 'Bot name', key: 'botName', - type: 'string' as const, + type: 'string', required: true, value: 'Automatisch', description: @@ -20,7 +18,7 @@ export default { { label: 'Bot icon', key: 'botIcon', - type: 'string' as const, + type: 'string', required: false, description: 'Either an image url or an emoji available to your team (surrounded by :). For example, https://example.com/icon_256.png or :robot_face:', diff --git a/packages/backend/src/apps/slack/index.d.ts b/packages/backend/src/apps/slack/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/slack/index.ts b/packages/backend/src/apps/slack/index.js similarity index 57% rename from packages/backend/src/apps/slack/index.ts rename to packages/backend/src/apps/slack/index.js index 1f2570b7..0535524a 100644 --- a/packages/backend/src/apps/slack/index.ts +++ b/packages/backend/src/apps/slack/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import actions from './actions'; -import auth from './auth'; -import dynamicData from './dynamic-data'; -import dynamicFields from './dynamic-fields'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import actions from './actions/index.js'; +import auth from './auth/index.js'; +import dynamicData from './dynamic-data/index.js'; +import dynamicFields from './dynamic-fields/index.js'; export default defineApp({ name: 'Slack', diff --git a/packages/backend/src/apps/smtp/actions/index.js b/packages/backend/src/apps/smtp/actions/index.js new file mode 100644 index 00000000..e1d8a996 --- /dev/null +++ b/packages/backend/src/apps/smtp/actions/index.js @@ -0,0 +1,3 @@ +import sendEmail from './send-email/index.js'; + +export default [sendEmail]; diff --git a/packages/backend/src/apps/smtp/actions/index.ts b/packages/backend/src/apps/smtp/actions/index.ts deleted file mode 100644 index e688be4d..00000000 --- a/packages/backend/src/apps/smtp/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendEmail from './send-email'; - -export default [sendEmail]; diff --git a/packages/backend/src/apps/smtp/actions/send-email/index.ts b/packages/backend/src/apps/smtp/actions/send-email/index.js similarity index 67% rename from packages/backend/src/apps/smtp/actions/send-email/index.ts rename to packages/backend/src/apps/smtp/actions/send-email/index.js index 68e525fa..44985de2 100644 --- a/packages/backend/src/apps/smtp/actions/send-email/index.ts +++ b/packages/backend/src/apps/smtp/actions/send-email/index.js @@ -1,6 +1,5 @@ -import { IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; -import transporter from '../../common/transporter'; +import defineAction from '../../../../helpers/define-action.js'; +import transporter from '../../common/transporter.js'; export default defineAction({ name: 'Send an email', @@ -10,7 +9,7 @@ export default defineAction({ { label: 'From name', key: 'fromName', - type: 'string' as const, + type: 'string', required: false, description: 'Display name of the sender.', variables: true, @@ -18,7 +17,7 @@ export default defineAction({ { label: 'From email', key: 'fromEmail', - type: 'string' as const, + type: 'string', required: true, description: 'Email address of the sender.', variables: true, @@ -26,7 +25,7 @@ export default defineAction({ { label: 'Reply to', key: 'replyTo', - type: 'string' as const, + type: 'string', required: false, description: 'Email address to reply to. Defaults to the from email address.', @@ -35,7 +34,7 @@ export default defineAction({ { label: 'To', key: 'to', - type: 'string' as const, + type: 'string', required: true, description: 'Comma seperated list of email addresses to send the email to.', @@ -44,7 +43,7 @@ export default defineAction({ { label: 'Cc', key: 'cc', - type: 'string' as const, + type: 'string', required: false, description: 'Comma seperated list of email addresses.', variables: true, @@ -52,7 +51,7 @@ export default defineAction({ { label: 'Bcc', key: 'bcc', - type: 'string' as const, + type: 'string', required: false, description: 'Comma seperated list of email addresses.', variables: true, @@ -60,7 +59,7 @@ export default defineAction({ { label: 'Subject', key: 'subject', - type: 'string' as const, + type: 'string', required: true, description: 'Subject of the email.', variables: true, @@ -68,7 +67,7 @@ export default defineAction({ { label: 'Body', key: 'body', - type: 'string' as const, + type: 'string', required: true, description: 'Body of the email.', variables: true, @@ -78,14 +77,14 @@ export default defineAction({ async run($) { const info = await transporter($).sendMail({ from: `${$.step.parameters.fromName} <${$.step.parameters.fromEmail}>`, - to: ($.step.parameters.to as string).split(','), - replyTo: $.step.parameters.replyTo as string, - cc: ($.step.parameters.cc as string).split(','), - bcc: ($.step.parameters.bcc as string).split(','), - subject: $.step.parameters.subject as string, - text: $.step.parameters.body as string, + to: $.step.parameters.to.split(','), + replyTo: $.step.parameters.replyTo, + cc: $.step.parameters.cc.split(','), + bcc: $.step.parameters.bcc.split(','), + subject: $.step.parameters.subject, + text: $.step.parameters.body, }); - $.setActionItem({ raw: info as IJSONObject }); + $.setActionItem({ raw: info }); }, }); diff --git a/packages/backend/src/apps/smtp/auth/index.ts b/packages/backend/src/apps/smtp/auth/index.js similarity index 86% rename from packages/backend/src/apps/smtp/auth/index.ts rename to packages/backend/src/apps/smtp/auth/index.js index 369aa411..090e691f 100644 --- a/packages/backend/src/apps/smtp/auth/index.ts +++ b/packages/backend/src/apps/smtp/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'host', label: 'Host', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'username', label: 'Email/Username', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -30,7 +30,7 @@ export default { { key: 'password', label: 'Password', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -42,7 +42,7 @@ export default { { key: 'useTls', label: 'Use TLS?', - type: 'dropdown' as const, + type: 'dropdown', required: false, readOnly: false, value: false, @@ -64,7 +64,7 @@ export default { { key: 'port', label: 'Port', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: '25', @@ -76,7 +76,7 @@ export default { { key: 'fromEmail', label: 'From Email', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: null, diff --git a/packages/backend/src/apps/smtp/auth/is-still-verified.js b/packages/backend/src/apps/smtp/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/smtp/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/smtp/auth/is-still-verified.ts b/packages/backend/src/apps/smtp/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/smtp/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/smtp/auth/verify-credentials.js b/packages/backend/src/apps/smtp/auth/verify-credentials.js new file mode 100644 index 00000000..ef4218e0 --- /dev/null +++ b/packages/backend/src/apps/smtp/auth/verify-credentials.js @@ -0,0 +1,11 @@ +import transporter from '../common/transporter.js'; + +const verifyCredentials = async ($) => { + await transporter($).verify(); + + await $.auth.set({ + screenName: $.auth.data.username, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/smtp/auth/verify-credentials.ts b/packages/backend/src/apps/smtp/auth/verify-credentials.ts deleted file mode 100644 index 73891a7f..00000000 --- a/packages/backend/src/apps/smtp/auth/verify-credentials.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import transporter from '../common/transporter'; - -const verifyCredentials = async ($: IGlobalVariable) => { - await transporter($).verify(); - - await $.auth.set({ - screenName: $.auth.data.username, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/smtp/common/transporter.ts b/packages/backend/src/apps/smtp/common/transporter.js similarity index 57% rename from packages/backend/src/apps/smtp/common/transporter.ts rename to packages/backend/src/apps/smtp/common/transporter.js index 2a975415..50718058 100644 --- a/packages/backend/src/apps/smtp/common/transporter.ts +++ b/packages/backend/src/apps/smtp/common/transporter.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; -import nodemailer, { TransportOptions } from 'nodemailer'; +import nodemailer from 'nodemailer'; -const transporter = ($: IGlobalVariable) => { +const transporter = ($) => { return nodemailer.createTransport({ host: $.auth.data.host, port: $.auth.data.port, @@ -10,7 +9,7 @@ const transporter = ($: IGlobalVariable) => { user: $.auth.data.username, pass: $.auth.data.password, }, - } as TransportOptions); + }); }; export default transporter; diff --git a/packages/backend/src/apps/smtp/index.d.ts b/packages/backend/src/apps/smtp/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/smtp/index.ts b/packages/backend/src/apps/smtp/index.js similarity index 68% rename from packages/backend/src/apps/smtp/index.ts rename to packages/backend/src/apps/smtp/index.js index 3eb833d2..dd9db758 100644 --- a/packages/backend/src/apps/smtp/index.ts +++ b/packages/backend/src/apps/smtp/index.js @@ -1,6 +1,6 @@ -import defineApp from '../../helpers/define-app'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'SMTP', diff --git a/packages/backend/src/apps/spotify/actions/create-playlist/index.ts b/packages/backend/src/apps/spotify/actions/create-playlist/index.js similarity index 77% rename from packages/backend/src/apps/spotify/actions/create-playlist/index.ts rename to packages/backend/src/apps/spotify/actions/create-playlist/index.js index 51dbee13..85766949 100644 --- a/packages/backend/src/apps/spotify/actions/create-playlist/index.ts +++ b/packages/backend/src/apps/spotify/actions/create-playlist/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create playlist', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Playlist name', key: 'playlistName', - type: 'string' as const, + type: 'string', required: true, description: 'Playlist name', variables: true, @@ -16,7 +16,7 @@ export default defineAction({ { label: 'Playlist visibility', key: 'playlistVisibility', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Playlist visibility', variables: true, @@ -28,7 +28,7 @@ export default defineAction({ { label: 'Playlist description', key: 'playlistDescription', - type: 'string' as const, + type: 'string', required: false, description: 'Playlist description', variables: true, @@ -36,12 +36,10 @@ export default defineAction({ ], async run($) { - const playlistName = $.step.parameters.playlistName as string; - const playlistDescription = $.step.parameters.playlistDescription as string; + const playlistName = $.step.parameters.playlistName; + const playlistDescription = $.step.parameters.playlistDescription; const playlistVisibility = - $.step.parameters.playlistVisibility === 'public' - ? true - : (false as boolean); + $.step.parameters.playlistVisibility === 'public' ? true : false; const response = await $.http.post( `v1/users/${$.auth.data.userId}/playlists`, diff --git a/packages/backend/src/apps/spotify/actions/index.js b/packages/backend/src/apps/spotify/actions/index.js new file mode 100644 index 00000000..a520f0d7 --- /dev/null +++ b/packages/backend/src/apps/spotify/actions/index.js @@ -0,0 +1,3 @@ +import cratePlaylist from './create-playlist/index.js'; + +export default [cratePlaylist]; diff --git a/packages/backend/src/apps/spotify/actions/index.ts b/packages/backend/src/apps/spotify/actions/index.ts deleted file mode 100644 index b6f07255..00000000 --- a/packages/backend/src/apps/spotify/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import cratePlaylist from './create-playlist'; - -export default [cratePlaylist]; diff --git a/packages/backend/src/apps/spotify/auth/generate-auth-url.js b/packages/backend/src/apps/spotify/auth/generate-auth-url.js new file mode 100644 index 00000000..ed70fc01 --- /dev/null +++ b/packages/backend/src/apps/spotify/auth/generate-auth-url.js @@ -0,0 +1,26 @@ +import { URLSearchParams } from 'url'; +import scopes from '../common/scopes.js'; + +export default async function generateAuthUrl($) { + const oauthRedirectUrlField = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ); + const redirectUri = oauthRedirectUrlField.value; + const state = Math.random().toString(); + + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + grant_type: 'client_credentials', + redirect_uri: redirectUri, + response_type: 'code', + scope: scopes.join(','), + state: state, + }); + + const url = `https://accounts.spotify.com/authorize?${searchParams}`; + + await $.auth.set({ + url, + }); +} diff --git a/packages/backend/src/apps/spotify/auth/generate-auth-url.ts b/packages/backend/src/apps/spotify/auth/generate-auth-url.ts deleted file mode 100644 index 022e063e..00000000 --- a/packages/backend/src/apps/spotify/auth/generate-auth-url.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import { URLSearchParams } from 'url'; -import scopes from '../common/scopes'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const redirectUri = oauthRedirectUrlField.value as string; - const state = Math.random().toString() as string; - - const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - grant_type: 'client_credentials', - redirect_uri: redirectUri, - response_type: 'code', - scope: scopes.join(','), - state: state, - }); - - const url = `https://accounts.spotify.com/authorize?${searchParams}`; - - await $.auth.set({ - url, - }); -} diff --git a/packages/backend/src/apps/spotify/auth/index.ts b/packages/backend/src/apps/spotify/auth/index.js similarity index 75% rename from packages/backend/src/apps/spotify/auth/index.ts rename to packages/backend/src/apps/spotify/auth/index.js index 289e4a72..1db348c4 100644 --- a/packages/backend/src/apps/spotify/auth/index.ts +++ b/packages/backend/src/apps/spotify/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/spotify/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client Id', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/spotify/auth/is-still-verified.js b/packages/backend/src/apps/spotify/auth/is-still-verified.js new file mode 100644 index 00000000..1b9d46d0 --- /dev/null +++ b/packages/backend/src/apps/spotify/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user.id; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/spotify/auth/is-still-verified.ts b/packages/backend/src/apps/spotify/auth/is-still-verified.ts deleted file mode 100644 index befb7694..00000000 --- a/packages/backend/src/apps/spotify/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user.id; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/spotify/auth/refresh-token.ts b/packages/backend/src/apps/spotify/auth/refresh-token.js similarity index 75% rename from packages/backend/src/apps/spotify/auth/refresh-token.ts rename to packages/backend/src/apps/spotify/auth/refresh-token.js index b748f658..b3ea8c56 100644 --- a/packages/backend/src/apps/spotify/auth/refresh-token.ts +++ b/packages/backend/src/apps/spotify/auth/refresh-token.js @@ -1,7 +1,6 @@ import { Buffer } from 'node:buffer'; -import { IGlobalVariable } from '@automatisch/types'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const response = await $.http.post( 'https://accounts.spotify.com/api/token', null, @@ -13,12 +12,12 @@ const refreshToken = async ($: IGlobalVariable) => { 'Content-Type': 'application/x-www-form-urlencoded', }, params: { - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, grant_type: 'refresh_token', }, additionalProperties: { - skipAddingAuthHeader: true - } + skipAddingAuthHeader: true, + }, } ); diff --git a/packages/backend/src/apps/spotify/auth/verify-credentials.ts b/packages/backend/src/apps/spotify/auth/verify-credentials.js similarity index 79% rename from packages/backend/src/apps/spotify/auth/verify-credentials.ts rename to packages/backend/src/apps/spotify/auth/verify-credentials.js index 079c472d..9f37fa78 100644 --- a/packages/backend/src/apps/spotify/auth/verify-credentials.ts +++ b/packages/backend/src/apps/spotify/auth/verify-credentials.js @@ -1,14 +1,13 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; import { URLSearchParams } from 'url'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const params = new URLSearchParams({ - code: $.auth.data.code as string, + code: $.auth.data.code, redirect_uri: redirectUri, grant_type: 'authorization_code', }); diff --git a/packages/backend/src/apps/notion/common/add-auth-header.ts b/packages/backend/src/apps/spotify/common/add-auth-header.js similarity index 53% rename from packages/backend/src/apps/notion/common/add-auth-header.ts rename to packages/backend/src/apps/spotify/common/add-auth-header.js index d16f394f..38e69094 100644 --- a/packages/backend/src/apps/notion/common/add-auth-header.ts +++ b/packages/backend/src/apps/spotify/common/add-auth-header.js @@ -1,7 +1,6 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if (requestConfig.additionalProperties?.skipAddingAuthHeader) return requestConfig; +const addAuthHeader = ($, requestConfig) => { + if (requestConfig.additionalProperties?.skipAddingAuthHeader) + return requestConfig; if ($.auth.data?.accessToken) { const authorizationHeader = `Bearer ${$.auth.data.accessToken}`; diff --git a/packages/backend/src/apps/spotify/common/get-current-user.js b/packages/backend/src/apps/spotify/common/get-current-user.js new file mode 100644 index 00000000..170b252d --- /dev/null +++ b/packages/backend/src/apps/spotify/common/get-current-user.js @@ -0,0 +1,8 @@ +const getCurrentUser = async ($) => { + const response = await $.http.get('/v1/me'); + const currentUser = response.data; + + return currentUser; +}; + +export default getCurrentUser; diff --git a/packages/backend/src/apps/spotify/common/get-current-user.ts b/packages/backend/src/apps/spotify/common/get-current-user.ts deleted file mode 100644 index 0ccdf282..00000000 --- a/packages/backend/src/apps/spotify/common/get-current-user.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { - const response = await $.http.get('/v1/me'); - const currentUser = response.data; - - return currentUser; -}; - -export default getCurrentUser; diff --git a/packages/backend/src/apps/spotify/common/scopes.ts b/packages/backend/src/apps/spotify/common/scopes.js similarity index 100% rename from packages/backend/src/apps/spotify/common/scopes.ts rename to packages/backend/src/apps/spotify/common/scopes.js diff --git a/packages/backend/src/apps/spotify/index.d.ts b/packages/backend/src/apps/spotify/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/spotify/index.ts b/packages/backend/src/apps/spotify/index.js similarity index 66% rename from packages/backend/src/apps/spotify/index.ts rename to packages/backend/src/apps/spotify/index.js index e4b335de..777887a3 100644 --- a/packages/backend/src/apps/spotify/index.ts +++ b/packages/backend/src/apps/spotify/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import actions from './actions'; -import auth from './auth'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import actions from './actions/index.js'; +import auth from './auth/index.js'; export default defineApp({ name: 'Spotify', diff --git a/packages/backend/src/apps/strava/actions/create-totals-and-stats-report/index.js b/packages/backend/src/apps/strava/actions/create-totals-and-stats-report/index.js new file mode 100644 index 00000000..be3fa623 --- /dev/null +++ b/packages/backend/src/apps/strava/actions/create-totals-and-stats-report/index.js @@ -0,0 +1,18 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Create totals and stats report', + key: 'createTotalsAndStatsReport', + description: + 'Create a report with recent, year to date, and all time stats of your activities', + + async run($) { + const { data } = await $.http.get( + `/v3/athletes/${$.auth.data.athleteId}/stats` + ); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/strava/actions/create-totals-and-stats-report/index.ts b/packages/backend/src/apps/strava/actions/create-totals-and-stats-report/index.ts deleted file mode 100644 index dd755fce..00000000 --- a/packages/backend/src/apps/strava/actions/create-totals-and-stats-report/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import defineAction from '../../../../helpers/define-action'; - -export default defineAction({ - name: 'Create totals and stats report', - key: 'createTotalsAndStatsReport', - description: 'Create a report with recent, year to date, and all time stats of your activities', - - async run($) { - const { data } = await $.http.get(`/v3/athletes/${$.auth.data.athleteId}/stats`); - - $.setActionItem({ - raw: data, - }); - }, -}); diff --git a/packages/backend/src/apps/strava/actions/index.js b/packages/backend/src/apps/strava/actions/index.js new file mode 100644 index 00000000..7474a614 --- /dev/null +++ b/packages/backend/src/apps/strava/actions/index.js @@ -0,0 +1,3 @@ +import createTotalsAndStatsReport from './create-totals-and-stats-report/index.js'; + +export default [createTotalsAndStatsReport]; diff --git a/packages/backend/src/apps/strava/actions/index.ts b/packages/backend/src/apps/strava/actions/index.ts deleted file mode 100644 index df9e1d5c..00000000 --- a/packages/backend/src/apps/strava/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createTotalsAndStatsReport from "./create-totals-and-stats-report"; - -export default [createTotalsAndStatsReport]; diff --git a/packages/backend/src/apps/strava/auth/generate-auth-url.ts b/packages/backend/src/apps/strava/auth/generate-auth-url.js similarity index 58% rename from packages/backend/src/apps/strava/auth/generate-auth-url.ts rename to packages/backend/src/apps/strava/auth/generate-auth-url.js index 185a1ad1..e9542fc6 100644 --- a/packages/backend/src/apps/strava/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/strava/auth/generate-auth-url.js @@ -1,13 +1,12 @@ import { URLSearchParams } from 'node:url'; -import { IField, IGlobalVariable } from '@automatisch/types'; -export default async function createAuthData($: IGlobalVariable) { +export default async function createAuthData($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, redirect_uri: redirectUri, approval_prompt: 'force', response_type: 'code', diff --git a/packages/backend/src/apps/strava/auth/index.ts b/packages/backend/src/apps/strava/auth/index.js similarity index 74% rename from packages/backend/src/apps/strava/auth/index.ts rename to packages/backend/src/apps/strava/auth/index.js index df7d9b0d..2488ca85 100644 --- a/packages/backend/src/apps/strava/auth/index.ts +++ b/packages/backend/src/apps/strava/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/strava/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/strava/auth/is-still-verified.js b/packages/backend/src/apps/strava/auth/is-still-verified.js new file mode 100644 index 00000000..f59ee3b4 --- /dev/null +++ b/packages/backend/src/apps/strava/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/strava/auth/is-still-verified.ts b/packages/backend/src/apps/strava/auth/is-still-verified.ts deleted file mode 100644 index d36919f2..00000000 --- a/packages/backend/src/apps/strava/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/strava/auth/refresh-token.js b/packages/backend/src/apps/strava/auth/refresh-token.js new file mode 100644 index 00000000..9e7f2dab --- /dev/null +++ b/packages/backend/src/apps/strava/auth/refresh-token.js @@ -0,0 +1,20 @@ +const refreshToken = async ($) => { + const params = { + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + grant_type: 'refresh_token', + refresh_token: $.auth.data.refreshToken, + }; + + const { data } = await $.http.post('/v3/oauth/token', null, { params }); + + await $.auth.set({ + accessToken: data.access_token, + expiresIn: data.expires_in, + expiresAt: data.expires_at, + tokenType: data.token_type, + refreshToken: data.refresh_token, + }); +}; + +export default refreshToken; diff --git a/packages/backend/src/apps/strava/auth/refresh-token.ts b/packages/backend/src/apps/strava/auth/refresh-token.ts deleted file mode 100644 index 6f5b623f..00000000 --- a/packages/backend/src/apps/strava/auth/refresh-token.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const refreshToken = async ($: IGlobalVariable) => { - const params = { - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, - }; - - const { data } = await $.http.post( - '/v3/oauth/token', - null, - { params } - ); - - await $.auth.set({ - accessToken: data.access_token, - expiresIn: data.expires_in, - expiresAt: data.expires_at, - tokenType: data.token_type, - refreshToken: data.refresh_token, - }); -}; - -export default refreshToken; diff --git a/packages/backend/src/apps/strava/auth/verify-credentials.js b/packages/backend/src/apps/strava/auth/verify-credentials.js new file mode 100644 index 00000000..4e61da49 --- /dev/null +++ b/packages/backend/src/apps/strava/auth/verify-credentials.js @@ -0,0 +1,19 @@ +const verifyCredentials = async ($) => { + const params = { + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + code: $.auth.data.code, + grant_type: 'authorization_code', + }; + const { data } = await $.http.post('/v3/oauth/token', null, { params }); + + await $.auth.set({ + accessToken: data.access_token, + refreshToken: data.refresh_token, + tokenType: data.token_type, + athleteId: data.athlete.id, + screenName: `${data.athlete.firstname} ${data.athlete.lastname}`, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/strava/auth/verify-credentials.ts b/packages/backend/src/apps/strava/auth/verify-credentials.ts deleted file mode 100644 index ea539036..00000000 --- a/packages/backend/src/apps/strava/auth/verify-credentials.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - const params = { - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - code: $.auth.data.code as string, - grant_type: 'authorization_code', - }; - const { data } = await $.http.post( - '/v3/oauth/token', - null, - { params } - ); - - await $.auth.set({ - accessToken: data.access_token, - refreshToken: data.refresh_token, - tokenType: data.token_type, - athleteId: data.athlete.id, - screenName: `${data.athlete.firstname} ${data.athlete.lastname}`, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/strava/common/add-auth-header.ts b/packages/backend/src/apps/strava/common/add-auth-header.js similarity index 65% rename from packages/backend/src/apps/strava/common/add-auth-header.ts rename to packages/backend/src/apps/strava/common/add-auth-header.js index 2420110a..e8347e51 100644 --- a/packages/backend/src/apps/strava/common/add-auth-header.ts +++ b/packages/backend/src/apps/strava/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { accessToken, tokenType } = $.auth.data; if (accessToken && tokenType) { diff --git a/packages/backend/src/apps/strava/common/get-current-user.ts b/packages/backend/src/apps/strava/common/get-current-user.js similarity index 50% rename from packages/backend/src/apps/strava/common/get-current-user.ts rename to packages/backend/src/apps/strava/common/get-current-user.js index 0765be96..db93f1f6 100644 --- a/packages/backend/src/apps/strava/common/get-current-user.ts +++ b/packages/backend/src/apps/strava/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/v3/athlete'); const currentUser = response.data; diff --git a/packages/backend/src/apps/strava/index.d.ts b/packages/backend/src/apps/strava/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/strava/index.ts b/packages/backend/src/apps/strava/index.js similarity index 66% rename from packages/backend/src/apps/strava/index.ts rename to packages/backend/src/apps/strava/index.js index 83706fbb..3de696ed 100644 --- a/packages/backend/src/apps/strava/index.ts +++ b/packages/backend/src/apps/strava/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import actions from './actions'; -import auth from './auth'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import actions from './actions/index.js'; +import auth from './auth/index.js'; export default defineApp({ name: 'Strava', diff --git a/packages/backend/src/apps/stripe/auth/index.ts b/packages/backend/src/apps/stripe/auth/index.js similarity index 59% rename from packages/backend/src/apps/stripe/auth/index.ts rename to packages/backend/src/apps/stripe/auth/index.js index f25205f1..e6da3efe 100644 --- a/packages/backend/src/apps/stripe/auth/index.ts +++ b/packages/backend/src/apps/stripe/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from "./verify-credentials"; -import isStillVerified from "./is-still-verified"; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'secretKey', label: 'Secret Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -17,15 +17,16 @@ export default { { key: 'displayName', label: 'Account Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, placeholder: null, - description: 'The display name that identifies this stripe connection - most likely the associated account name', + description: + 'The display name that identifies this stripe connection - most likely the associated account name', clickToCopy: false, }, ], verifyCredentials, - isStillVerified -}; \ No newline at end of file + isStillVerified, +}; diff --git a/packages/backend/src/apps/stripe/auth/is-still-verified.js b/packages/backend/src/apps/stripe/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/stripe/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/stripe/auth/is-still-verified.ts b/packages/backend/src/apps/stripe/auth/is-still-verified.ts deleted file mode 100644 index 4470a643..00000000 --- a/packages/backend/src/apps/stripe/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from "./verify-credentials"; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/stripe/auth/verify-credentials.js b/packages/backend/src/apps/stripe/auth/verify-credentials.js new file mode 100644 index 00000000..fab0a866 --- /dev/null +++ b/packages/backend/src/apps/stripe/auth/verify-credentials.js @@ -0,0 +1,8 @@ +const verifyCredentials = async ($) => { + await $.http.get(`/v1/events`); + await $.auth.set({ + screenName: $.auth.data?.displayName, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/stripe/auth/verify-credentials.ts b/packages/backend/src/apps/stripe/auth/verify-credentials.ts deleted file mode 100644 index 1297d9df..00000000 --- a/packages/backend/src/apps/stripe/auth/verify-credentials.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - await $.http.get( - `/v1/events`, - ); - await $.auth.set({ - screenName: $.auth.data?.displayName, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/stripe/common/add-auth-header.js b/packages/backend/src/apps/stripe/common/add-auth-header.js new file mode 100644 index 00000000..7299246f --- /dev/null +++ b/packages/backend/src/apps/stripe/common/add-auth-header.js @@ -0,0 +1,6 @@ +const addAuthHeader = ($, requestConfig) => { + requestConfig.headers['Authorization'] = `Bearer ${$.auth.data?.secretKey}`; + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/stripe/common/add-auth-header.ts b/packages/backend/src/apps/stripe/common/add-auth-header.ts deleted file mode 100644 index 2e393e9c..00000000 --- a/packages/backend/src/apps/stripe/common/add-auth-header.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {TBeforeRequest} from "@automatisch/types"; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - requestConfig.headers['Authorization'] = `Bearer ${$.auth.data?.secretKey}` - return requestConfig -} - -export default addAuthHeader; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/index.d.ts b/packages/backend/src/apps/stripe/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/stripe/index.ts b/packages/backend/src/apps/stripe/index.js similarity index 66% rename from packages/backend/src/apps/stripe/index.ts rename to packages/backend/src/apps/stripe/index.js index 505f13bf..9fb1b877 100644 --- a/packages/backend/src/apps/stripe/index.ts +++ b/packages/backend/src/apps/stripe/index.js @@ -1,7 +1,7 @@ -import defineApp from "../../helpers/define-app"; -import addAuthHeader from "./common/add-auth-header"; -import auth from "./auth" -import triggers from "./triggers" +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Stripe', @@ -16,4 +16,4 @@ export default defineApp({ auth, triggers, actions: [], -}) \ No newline at end of file +}); diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.js b/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.js new file mode 100644 index 00000000..e28c261b --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.js @@ -0,0 +1,32 @@ +import { URLSearchParams } from 'url'; +import isEmpty from 'lodash/isEmpty.js'; +import omitBy from 'lodash/omitBy.js'; + +const getBalanceTransactions = async ($) => { + let response; + let lastId = undefined; + + do { + const params = { + starting_after: lastId, + ending_before: $.flow.lastInternalId, + }; + const queryParams = new URLSearchParams(omitBy(params, isEmpty)); + const requestPath = `/v1/balance_transactions${ + queryParams.toString() ? `?${queryParams.toString()}` : '' + }`; + + response = (await $.http.get(requestPath)).data; + for (const entry of response.data) { + $.pushTriggerItem({ + raw: entry, + meta: { + internalId: entry.id, + }, + }); + lastId = entry.id; + } + } while (response.has_more); +}; + +export default getBalanceTransactions; diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts b/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts deleted file mode 100644 index d70f1bfe..00000000 --- a/packages/backend/src/apps/stripe/triggers/balance-transaction/get-balance-transactions.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {IGlobalVariable, IJSONObject} from "@automatisch/types"; -import {URLSearchParams} from "url"; -import {isEmpty, omitBy} from "lodash"; - -const getBalanceTransactions = async ($: IGlobalVariable) => { - let response; - let lastId = undefined; - - do { - const params: IJSONObject = { - starting_after: lastId, - ending_before: $.flow.lastInternalId - } - const queryParams = new URLSearchParams(omitBy(params, isEmpty)) - const requestPath = `/v1/balance_transactions${ - queryParams.toString() ? `?${queryParams.toString()}` : '' - }`; - - response = (await $.http.get(requestPath)).data - for (const entry of response.data) { - $.pushTriggerItem({ - raw: entry, - meta: { - internalId: entry.id as string - } - }) - lastId = entry.id - } - } while (response.has_more) -}; - -export default getBalanceTransactions; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.js similarity index 67% rename from packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts rename to packages/backend/src/apps/stripe/triggers/balance-transaction/index.js index d36d5b05..ecdf0520 100644 --- a/packages/backend/src/apps/stripe/triggers/balance-transaction/index.ts +++ b/packages/backend/src/apps/stripe/triggers/balance-transaction/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import getBalanceTransactions from './get-balance-transactions'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import getBalanceTransactions from './get-balance-transactions.js'; export default defineTrigger({ name: 'New balance transactions', diff --git a/packages/backend/src/apps/stripe/triggers/index.js b/packages/backend/src/apps/stripe/triggers/index.js new file mode 100644 index 00000000..aa6b7552 --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/index.js @@ -0,0 +1,4 @@ +import balanceTransaction from './balance-transaction/index.js'; +import payouts from './payouts/index.js'; + +export default [balanceTransaction, payouts]; diff --git a/packages/backend/src/apps/stripe/triggers/index.ts b/packages/backend/src/apps/stripe/triggers/index.ts deleted file mode 100644 index f1a9d0c8..00000000 --- a/packages/backend/src/apps/stripe/triggers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import balanceTransaction from "./balance-transaction"; -import payouts from "./payouts"; - -export default [balanceTransaction, payouts]; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.js b/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.js new file mode 100644 index 00000000..fbc6f7bb --- /dev/null +++ b/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.js @@ -0,0 +1,32 @@ +import { URLSearchParams } from 'url'; +import isEmpty from 'lodash/isEmpty.js'; +import omitBy from 'lodash/omitBy.js'; + +const getPayouts = async ($) => { + let response; + let lastId = undefined; + + do { + const params = { + starting_after: lastId, + ending_before: $.flow.lastInternalId, + }; + const queryParams = new URLSearchParams(omitBy(params, isEmpty)); + const requestPath = `/v1/payouts${ + queryParams.toString() ? `?${queryParams.toString()}` : '' + }`; + + response = (await $.http.get(requestPath)).data; + for (const entry of response.data) { + $.pushTriggerItem({ + raw: entry, + meta: { + internalId: entry.id, + }, + }); + lastId = entry.id; + } + } while (response.has_more); +}; + +export default getPayouts; diff --git a/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts b/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts deleted file mode 100644 index 8791f89a..00000000 --- a/packages/backend/src/apps/stripe/triggers/payouts/get-payouts.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {IGlobalVariable, IJSONObject} from "@automatisch/types"; -import {URLSearchParams} from "url"; -import {isEmpty, omitBy} from "lodash"; - -const getPayouts = async ($: IGlobalVariable) => { - let response; - let lastId = undefined; - - do { - const params: IJSONObject = { - starting_after: lastId, - ending_before: $.flow.lastInternalId - } - const queryParams = new URLSearchParams(omitBy(params, isEmpty)) - const requestPath = `/v1/payouts${ - queryParams.toString() ? `?${queryParams.toString()}` : '' - }`; - - response = (await $.http.get(requestPath)).data - for (const entry of response.data) { - $.pushTriggerItem({ - raw: entry, - meta: { - internalId: entry.id as string - } - }) - lastId = entry.id - } - } while (response.has_more) -}; - -export default getPayouts; \ No newline at end of file diff --git a/packages/backend/src/apps/stripe/triggers/payouts/index.ts b/packages/backend/src/apps/stripe/triggers/payouts/index.js similarity index 68% rename from packages/backend/src/apps/stripe/triggers/payouts/index.ts rename to packages/backend/src/apps/stripe/triggers/payouts/index.js index c613f341..9a5a0afc 100644 --- a/packages/backend/src/apps/stripe/triggers/payouts/index.ts +++ b/packages/backend/src/apps/stripe/triggers/payouts/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import getPayouts from './get-payouts'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import getPayouts from './get-payouts.js'; export default defineTrigger({ name: 'New payouts', diff --git a/packages/backend/src/apps/telegram-bot/actions/index.js b/packages/backend/src/apps/telegram-bot/actions/index.js new file mode 100644 index 00000000..92d67c2c --- /dev/null +++ b/packages/backend/src/apps/telegram-bot/actions/index.js @@ -0,0 +1,3 @@ +import sendMessage from './send-message/index.js'; + +export default [sendMessage]; diff --git a/packages/backend/src/apps/telegram-bot/actions/index.ts b/packages/backend/src/apps/telegram-bot/actions/index.ts deleted file mode 100644 index 37aeb338..00000000 --- a/packages/backend/src/apps/telegram-bot/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendMessage from './send-message'; - -export default [sendMessage]; diff --git a/packages/backend/src/apps/telegram-bot/actions/send-message/index.ts b/packages/backend/src/apps/telegram-bot/actions/send-message/index.js similarity index 72% rename from packages/backend/src/apps/telegram-bot/actions/send-message/index.ts rename to packages/backend/src/apps/telegram-bot/actions/send-message/index.js index 6399d9bc..f4ec95db 100644 --- a/packages/backend/src/apps/telegram-bot/actions/send-message/index.ts +++ b/packages/backend/src/apps/telegram-bot/actions/send-message/index.js @@ -1,5 +1,4 @@ -import qs from 'qs'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Send message', @@ -9,15 +8,16 @@ export default defineAction({ { label: 'Chat ID', key: 'chatId', - type: 'string' as const, + type: 'string', required: true, - description: 'Unique identifier for the target chat or username of the target channel (in the format @channelusername).', + description: + 'Unique identifier for the target chat or username of the target channel (in the format @channelusername).', variables: true, }, { label: 'Message text', key: 'text', - type: 'string' as const, + type: 'string', required: true, description: 'Text of the message to be sent, 1-4096 characters.', variables: true, @@ -25,10 +25,11 @@ export default defineAction({ { label: 'Disable notification?', key: 'disableNotification', - type: 'dropdown' as const, + type: 'dropdown', required: false, value: false, - description: 'Sends the message silently. Users will receive a notification with no sound.', + description: + 'Sends the message silently. Users will receive a notification with no sound.', variables: true, options: [ { diff --git a/packages/backend/src/apps/telegram-bot/auth/index.ts b/packages/backend/src/apps/telegram-bot/auth/index.js similarity index 70% rename from packages/backend/src/apps/telegram-bot/auth/index.ts rename to packages/backend/src/apps/telegram-bot/auth/index.js index 01e68c2f..c8a7aaa3 100644 --- a/packages/backend/src/apps/telegram-bot/auth/index.ts +++ b/packages/backend/src/apps/telegram-bot/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'token', label: 'Bot token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/telegram-bot/auth/is-still-verified.js b/packages/backend/src/apps/telegram-bot/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/telegram-bot/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/telegram-bot/auth/is-still-verified.ts b/packages/backend/src/apps/telegram-bot/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/telegram-bot/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/telegram-bot/auth/verify-credentials.ts b/packages/backend/src/apps/telegram-bot/auth/verify-credentials.js similarity index 60% rename from packages/backend/src/apps/telegram-bot/auth/verify-credentials.ts rename to packages/backend/src/apps/telegram-bot/auth/verify-credentials.js index 17bbfa94..594fc1a8 100644 --- a/packages/backend/src/apps/telegram-bot/auth/verify-credentials.ts +++ b/packages/backend/src/apps/telegram-bot/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const { data } = await $.http.get('/getMe'); const { result: me } = data; diff --git a/packages/backend/src/apps/telegram-bot/common/add-auth-header.js b/packages/backend/src/apps/telegram-bot/common/add-auth-header.js new file mode 100644 index 00000000..0c0228dc --- /dev/null +++ b/packages/backend/src/apps/telegram-bot/common/add-auth-header.js @@ -0,0 +1,15 @@ +import { URL } from 'node:url'; + +const addAuthHeader = ($, requestConfig) => { + if ($.auth.data?.token) { + const token = $.auth.data.token; + requestConfig.baseURL = new URL( + `/bot${token}`, + requestConfig.baseURL + ).toString(); + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/telegram-bot/common/add-auth-header.ts b/packages/backend/src/apps/telegram-bot/common/add-auth-header.ts deleted file mode 100644 index aa17b14f..00000000 --- a/packages/backend/src/apps/telegram-bot/common/add-auth-header.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; -import { URL } from 'node:url'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data?.token) { - const token = $.auth.data.token as string; - requestConfig.baseURL = (new URL(`/bot${token}`, requestConfig.baseURL)).toString(); - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/telegram-bot/index.d.ts b/packages/backend/src/apps/telegram-bot/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/telegram-bot/index.ts b/packages/backend/src/apps/telegram-bot/index.js similarity index 67% rename from packages/backend/src/apps/telegram-bot/index.ts rename to packages/backend/src/apps/telegram-bot/index.js index 364e01d0..79aab075 100644 --- a/packages/backend/src/apps/telegram-bot/index.ts +++ b/packages/backend/src/apps/telegram-bot/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Telegram', diff --git a/packages/backend/src/apps/todoist/actions/create-task/index.ts b/packages/backend/src/apps/todoist/actions/create-task/index.js similarity index 87% rename from packages/backend/src/apps/todoist/actions/create-task/index.ts rename to packages/backend/src/apps/todoist/actions/create-task/index.js index a3924486..239e2ed1 100644 --- a/packages/backend/src/apps/todoist/actions/create-task/index.ts +++ b/packages/backend/src/apps/todoist/actions/create-task/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create task', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Project ID', key: 'projectId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, source: { @@ -25,7 +25,7 @@ export default defineAction({ { label: 'Section ID', key: 'sectionId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, dependsOn: ['parameters.projectId'], @@ -47,7 +47,7 @@ export default defineAction({ { label: 'Labels', key: 'labels', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -56,7 +56,7 @@ export default defineAction({ { label: 'Content', key: 'content', - type: 'string' as const, + type: 'string', required: true, variables: true, description: 'Task content, may be markdown. Example: "Foo"', @@ -64,7 +64,7 @@ export default defineAction({ { label: 'Description', key: 'description', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'Task description, may be markdown. Example: "Foo"', @@ -76,7 +76,7 @@ export default defineAction({ const { projectId, sectionId, labels, content, description } = $.step.parameters; - const labelsArray = (labels as string).split(','); + const labelsArray = labels.split(','); const payload = { content, diff --git a/packages/backend/src/apps/todoist/actions/index.js b/packages/backend/src/apps/todoist/actions/index.js new file mode 100644 index 00000000..dc3e333a --- /dev/null +++ b/packages/backend/src/apps/todoist/actions/index.js @@ -0,0 +1,3 @@ +import createTask from './create-task/index.js'; + +export default [createTask]; diff --git a/packages/backend/src/apps/todoist/actions/index.ts b/packages/backend/src/apps/todoist/actions/index.ts deleted file mode 100644 index 14f24a09..00000000 --- a/packages/backend/src/apps/todoist/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createTask from './create-task'; - -export default [createTask]; diff --git a/packages/backend/src/apps/todoist/auth/generate-auth-url.js b/packages/backend/src/apps/todoist/auth/generate-auth-url.js new file mode 100644 index 00000000..6c9cb2af --- /dev/null +++ b/packages/backend/src/apps/todoist/auth/generate-auth-url.js @@ -0,0 +1,15 @@ +import { URLSearchParams } from 'url'; + +export default async function generateAuthUrl($) { + const scopes = ['data:read_write']; + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId, + scope: scopes.join(','), + }); + + const url = `${$.app.baseUrl}/oauth/authorize?${searchParams.toString()}`; + + await $.auth.set({ + url, + }); +} diff --git a/packages/backend/src/apps/todoist/auth/generate-auth-url.ts b/packages/backend/src/apps/todoist/auth/generate-auth-url.ts deleted file mode 100644 index fb945f00..00000000 --- a/packages/backend/src/apps/todoist/auth/generate-auth-url.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import { URLSearchParams } from 'url'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const scopes = ['data:read_write']; - const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - scope: scopes.join(','), - }); - - const url = `${$.app.baseUrl - }/oauth/authorize?${searchParams.toString()}`; - - await $.auth.set({ - url, - }); -} diff --git a/packages/backend/src/apps/todoist/auth/index.ts b/packages/backend/src/apps/todoist/auth/index.js similarity index 80% rename from packages/backend/src/apps/todoist/auth/index.ts rename to packages/backend/src/apps/todoist/auth/index.js index a7265738..3c9037ab 100644 --- a/packages/backend/src/apps/todoist/auth/index.ts +++ b/packages/backend/src/apps/todoist/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/todoist/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'screenName', label: 'Screen Name', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -42,7 +42,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/todoist/auth/is-still-verified.js b/packages/backend/src/apps/todoist/auth/is-still-verified.js new file mode 100644 index 00000000..367cf917 --- /dev/null +++ b/packages/backend/src/apps/todoist/auth/is-still-verified.js @@ -0,0 +1,6 @@ +const isStillVerified = async ($) => { + await $.http.get('/projects'); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/todoist/auth/is-still-verified.ts b/packages/backend/src/apps/todoist/auth/is-still-verified.ts deleted file mode 100644 index 70e9a473..00000000 --- a/packages/backend/src/apps/todoist/auth/is-still-verified.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { - await $.http.get('/projects'); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/todoist/auth/verify-credentials.js b/packages/backend/src/apps/todoist/auth/verify-credentials.js new file mode 100644 index 00000000..92d0a40a --- /dev/null +++ b/packages/backend/src/apps/todoist/auth/verify-credentials.js @@ -0,0 +1,14 @@ +const verifyCredentials = async ($) => { + const { data } = await $.http.post(`${$.app.baseUrl}/oauth/access_token`, { + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + code: $.auth.data.code, + }); + + await $.auth.set({ + tokenType: data.token_type, + accessToken: data.access_token, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/todoist/auth/verify-credentials.ts b/packages/backend/src/apps/todoist/auth/verify-credentials.ts deleted file mode 100644 index 3765a897..00000000 --- a/packages/backend/src/apps/todoist/auth/verify-credentials.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - const { data } = await $.http.post( - `${$.app.baseUrl}/oauth/access_token`, - { - client_id: $.auth.data.clientId, - client_secret: $.auth.data.clientSecret, - code: $.auth.data.code, - }, - ); - - await $.auth.set({ - tokenType: data.token_type, - accessToken: data.access_token, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/todoist/common/add-auth-header.ts b/packages/backend/src/apps/todoist/common/add-auth-header.js similarity index 71% rename from packages/backend/src/apps/todoist/common/add-auth-header.ts rename to packages/backend/src/apps/todoist/common/add-auth-header.js index aafa214b..2730feea 100644 --- a/packages/backend/src/apps/todoist/common/add-auth-header.ts +++ b/packages/backend/src/apps/todoist/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const authData = $.auth.data; if (authData?.accessToken && authData?.tokenType) { const authorizationHeader = `${authData.tokenType} ${authData.accessToken}`; diff --git a/packages/backend/src/apps/todoist/dynamic-data/index.js b/packages/backend/src/apps/todoist/dynamic-data/index.js new file mode 100644 index 00000000..31040d19 --- /dev/null +++ b/packages/backend/src/apps/todoist/dynamic-data/index.js @@ -0,0 +1,5 @@ +import listProjects from './list-projects/index.js'; +import listSections from './list-sections/index.js'; +import listLabels from './list-labels/index.js'; + +export default [listProjects, listSections, listLabels]; diff --git a/packages/backend/src/apps/todoist/dynamic-data/index.ts b/packages/backend/src/apps/todoist/dynamic-data/index.ts deleted file mode 100644 index cc6c6000..00000000 --- a/packages/backend/src/apps/todoist/dynamic-data/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import listProjects from './list-projects'; -import listSections from './list-sections'; -import listLabels from './list-labels'; - -export default [listProjects, listSections, listLabels]; diff --git a/packages/backend/src/apps/todoist/dynamic-data/list-labels/index.ts b/packages/backend/src/apps/todoist/dynamic-data/list-labels/index.js similarity index 59% rename from packages/backend/src/apps/todoist/dynamic-data/list-labels/index.ts rename to packages/backend/src/apps/todoist/dynamic-data/list-labels/index.js index 46fb5257..bee03fa6 100644 --- a/packages/backend/src/apps/todoist/dynamic-data/list-labels/index.ts +++ b/packages/backend/src/apps/todoist/dynamic-data/list-labels/index.js @@ -1,13 +1,11 @@ -import { IGlobalVariable } from '@automatisch/types'; - export default { name: 'List labels', key: 'listLabels', - async run($: IGlobalVariable) { + async run($) { const response = await $.http.get('/labels'); - response.data = response.data.map((label: { name: string }) => { + response.data = response.data.map((label) => { return { value: label.name, name: label.name, diff --git a/packages/backend/src/apps/todoist/dynamic-data/list-projects/index.ts b/packages/backend/src/apps/todoist/dynamic-data/list-projects/index.js similarity index 57% rename from packages/backend/src/apps/todoist/dynamic-data/list-projects/index.ts rename to packages/backend/src/apps/todoist/dynamic-data/list-projects/index.js index ca10bf72..ad131739 100644 --- a/packages/backend/src/apps/todoist/dynamic-data/list-projects/index.ts +++ b/packages/backend/src/apps/todoist/dynamic-data/list-projects/index.js @@ -1,13 +1,11 @@ -import { IGlobalVariable } from '@automatisch/types'; - export default { name: 'List projects', key: 'listProjects', - async run($: IGlobalVariable) { + async run($) { const response = await $.http.get('/projects'); - response.data = response.data.map((project: { id: string, name: string }) => { + response.data = response.data.map((project) => { return { value: project.id, name: project.name, diff --git a/packages/backend/src/apps/todoist/dynamic-data/list-sections/index.js b/packages/backend/src/apps/todoist/dynamic-data/list-sections/index.js new file mode 100644 index 00000000..c4ea1d65 --- /dev/null +++ b/packages/backend/src/apps/todoist/dynamic-data/list-sections/index.js @@ -0,0 +1,21 @@ +export default { + name: 'List sections', + key: 'listSections', + + async run($) { + const params = { + project_id: $.step.parameters.projectId, + }; + + const response = await $.http.get('/sections', { params }); + + response.data = response.data.map((section) => { + return { + value: section.id, + name: section.name, + }; + }); + + return response; + }, +}; diff --git a/packages/backend/src/apps/todoist/dynamic-data/list-sections/index.ts b/packages/backend/src/apps/todoist/dynamic-data/list-sections/index.ts deleted file mode 100644 index cb4c23d9..00000000 --- a/packages/backend/src/apps/todoist/dynamic-data/list-sections/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -export default { - name: 'List sections', - key: 'listSections', - - async run($: IGlobalVariable) { - const params = { - project_id: ($.step.parameters.projectId as string), - }; - - const response = await $.http.get('/sections', {params}); - - response.data = response.data.map((section: { id: string, name: string }) => { - return { - value: section.id, - name: section.name, - }; - }); - - return response; - }, -}; diff --git a/packages/backend/src/apps/todoist/index.d.ts b/packages/backend/src/apps/todoist/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/todoist/index.ts b/packages/backend/src/apps/todoist/index.js similarity index 59% rename from packages/backend/src/apps/todoist/index.ts rename to packages/backend/src/apps/todoist/index.js index a1850597..bfc15109 100644 --- a/packages/backend/src/apps/todoist/index.ts +++ b/packages/backend/src/apps/todoist/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Todoist', diff --git a/packages/backend/src/apps/todoist/triggers/get-tasks/get-tasks.js b/packages/backend/src/apps/todoist/triggers/get-tasks/get-tasks.js new file mode 100644 index 00000000..b4b0b893 --- /dev/null +++ b/packages/backend/src/apps/todoist/triggers/get-tasks/get-tasks.js @@ -0,0 +1,26 @@ +const getActiveTasks = async ($) => { + const params = { + project_id: $.step.parameters.projectId?.trim(), + section_id: $.step.parameters.sectionId?.trim(), + label: $.step.parameters.label?.trim(), + filter: $.step.parameters.filter?.trim(), + }; + + const response = await $.http.get('/tasks', { params }); + + // todoist api doesn't offer sorting, so we inverse sort on id here + response.data.sort((a, b) => { + return b.id - a.id; + }); + + for (const task of response.data) { + $.pushTriggerItem({ + raw: task, + meta: { + internalId: task.id, + }, + }); + } +}; + +export default getActiveTasks; diff --git a/packages/backend/src/apps/todoist/triggers/get-tasks/get-tasks.ts b/packages/backend/src/apps/todoist/triggers/get-tasks/get-tasks.ts deleted file mode 100644 index 089d02fe..00000000 --- a/packages/backend/src/apps/todoist/triggers/get-tasks/get-tasks.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getActiveTasks = async ($: IGlobalVariable) => { - - const params = { - project_id: ($.step.parameters.projectId as string)?.trim(), - section_id: ($.step.parameters.sectionId as string)?.trim(), - label: ($.step.parameters.label as string)?.trim(), - filter: ($.step.parameters.filter as string)?.trim(), - }; - - const response = await $.http.get('/tasks', { params }); - - // todoist api doesn't offer sorting, so we inverse sort on id here - response.data.sort((a: { id: number; }, b: { id: number; }) => { - return b.id - a.id; - }) - - for (const task of response.data) { - $.pushTriggerItem({ - raw: task, - meta:{ - internalId: task.id as string, - } - }); - } -}; - - -export default getActiveTasks; diff --git a/packages/backend/src/apps/todoist/triggers/get-tasks/index.ts b/packages/backend/src/apps/todoist/triggers/get-tasks/index.js similarity index 86% rename from packages/backend/src/apps/todoist/triggers/get-tasks/index.ts rename to packages/backend/src/apps/todoist/triggers/get-tasks/index.js index cf3d7242..74dedd13 100644 --- a/packages/backend/src/apps/todoist/triggers/get-tasks/index.ts +++ b/packages/backend/src/apps/todoist/triggers/get-tasks/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import getActiveTasks from './get-tasks'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import getActiveTasks from './get-tasks.js'; export default defineTrigger({ name: 'Get active tasks', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Project ID', key: 'projectId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: false, source: { @@ -27,7 +27,7 @@ export default defineTrigger({ { label: 'Section ID', key: 'sectionId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: false, dependsOn: ['parameters.projectId'], @@ -49,7 +49,7 @@ export default defineTrigger({ { label: 'Label', key: 'label', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: false, source: { @@ -66,7 +66,7 @@ export default defineTrigger({ { label: 'Filter', key: 'filter', - type: 'string' as const, + type: 'string', required: false, variables: false, description: diff --git a/packages/backend/src/apps/todoist/triggers/index.js b/packages/backend/src/apps/todoist/triggers/index.js new file mode 100644 index 00000000..deac848d --- /dev/null +++ b/packages/backend/src/apps/todoist/triggers/index.js @@ -0,0 +1,3 @@ +import getTasks from './get-tasks/index.js'; + +export default [getTasks]; diff --git a/packages/backend/src/apps/todoist/triggers/index.ts b/packages/backend/src/apps/todoist/triggers/index.ts deleted file mode 100644 index a52a15d7..00000000 --- a/packages/backend/src/apps/todoist/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import getTasks from './get-tasks'; - -export default [getTasks]; diff --git a/packages/backend/src/apps/trello/actions/create-card/index.ts b/packages/backend/src/apps/trello/actions/create-card/index.js similarity index 85% rename from packages/backend/src/apps/trello/actions/create-card/index.ts rename to packages/backend/src/apps/trello/actions/create-card/index.js index fbd1ab81..a407bd7f 100644 --- a/packages/backend/src/apps/trello/actions/create-card/index.ts +++ b/packages/backend/src/apps/trello/actions/create-card/index.js @@ -1,5 +1,4 @@ -import { IJSONArray, IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create card', @@ -9,7 +8,7 @@ export default defineAction({ { label: 'Board', key: 'boardId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: '', variables: true, @@ -27,7 +26,7 @@ export default defineAction({ { label: 'List', key: 'listId', - type: 'dropdown' as const, + type: 'dropdown', required: true, dependsOn: ['parameters.boardId'], description: '', @@ -50,7 +49,7 @@ export default defineAction({ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: true, variables: true, description: '', @@ -58,7 +57,7 @@ export default defineAction({ { label: 'Description', key: 'description', - type: 'string' as const, + type: 'string', required: false, variables: true, description: '', @@ -67,7 +66,7 @@ export default defineAction({ { label: 'Label', key: 'label', - type: 'dropdown' as const, + type: 'dropdown', required: false, dependsOn: ['parameters.boardId'], description: 'Select a color tag to attach to the card.', @@ -90,7 +89,7 @@ export default defineAction({ { label: 'Card Position', key: 'cardPosition', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -108,14 +107,14 @@ export default defineAction({ { label: 'Members', key: 'memberIds', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Member', key: 'memberId', - type: 'dropdown' as const, + type: 'dropdown', required: false, dependsOn: ['parameters.boardId'], description: '', @@ -140,7 +139,7 @@ export default defineAction({ { label: 'Due Date', key: 'dueDate', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'Format: mm-dd-yyyy HH:mm:ss or yyyy-MM-dd HH:mm:ss.', @@ -148,7 +147,7 @@ export default defineAction({ { label: 'URL Attachment', key: 'urlSource', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'A URL to attach to the card.', @@ -166,10 +165,8 @@ export default defineAction({ urlSource, } = $.step.parameters; - const memberIds = $.step.parameters.memberIds as IJSONArray; - const idMembers = memberIds.map( - (memberId: IJSONObject) => memberId.memberId - ); + const memberIds = $.step.parameters.memberIds; + const idMembers = memberIds.map((memberId) => memberId.memberId); const fields = { name, diff --git a/packages/backend/src/apps/trello/actions/index.js b/packages/backend/src/apps/trello/actions/index.js new file mode 100644 index 00000000..a44a1bf9 --- /dev/null +++ b/packages/backend/src/apps/trello/actions/index.js @@ -0,0 +1,3 @@ +import createCard from './create-card/index.js'; + +export default [createCard]; diff --git a/packages/backend/src/apps/trello/actions/index.ts b/packages/backend/src/apps/trello/actions/index.ts deleted file mode 100644 index 90c37fb0..00000000 --- a/packages/backend/src/apps/trello/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import createCard from './create-card'; - -export default [createCard]; diff --git a/packages/backend/src/apps/trello/auth/generate-auth-url.ts b/packages/backend/src/apps/trello/auth/generate-auth-url.js similarity index 53% rename from packages/backend/src/apps/trello/auth/generate-auth-url.ts rename to packages/backend/src/apps/trello/auth/generate-auth-url.js index 9443c608..80bd2ea2 100644 --- a/packages/backend/src/apps/trello/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/trello/auth/generate-auth-url.js @@ -1,17 +1,16 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ return_url: redirectUri, scope: authScope.join(','), expiration: 'never', - key: $.auth.data.apiKey as string, + key: $.auth.data.apiKey, response_type: 'token', }); diff --git a/packages/backend/src/apps/trello/auth/index.ts b/packages/backend/src/apps/trello/auth/index.js similarity index 72% rename from packages/backend/src/apps/trello/auth/index.ts rename to packages/backend/src/apps/trello/auth/index.js index e5dd68d3..cf7b881a 100644 --- a/packages/backend/src/apps/trello/auth/index.ts +++ b/packages/backend/src/apps/trello/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/trello/connections/add', @@ -18,7 +18,7 @@ export default { { key: 'apiKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/trello/auth/is-still-verified.js b/packages/backend/src/apps/trello/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/trello/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/trello/auth/is-still-verified.ts b/packages/backend/src/apps/trello/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/trello/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/trello/auth/verify-credentials.ts b/packages/backend/src/apps/trello/auth/verify-credentials.js similarity index 57% rename from packages/backend/src/apps/trello/auth/verify-credentials.ts rename to packages/backend/src/apps/trello/auth/verify-credentials.js index eb463523..ebf87d9b 100644 --- a/packages/backend/src/apps/trello/auth/verify-credentials.ts +++ b/packages/backend/src/apps/trello/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const currentUser = await getCurrentUser($); const screenName = [currentUser.username, currentUser.email] .filter(Boolean) diff --git a/packages/backend/src/apps/trello/common/add-auth-header.ts b/packages/backend/src/apps/trello/common/add-auth-header.js similarity index 70% rename from packages/backend/src/apps/trello/common/add-auth-header.ts rename to packages/backend/src/apps/trello/common/add-auth-header.js index 22e2c540..c82490b9 100644 --- a/packages/backend/src/apps/trello/common/add-auth-header.ts +++ b/packages/backend/src/apps/trello/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.token) { requestConfig.headers.Authorization = `OAuth oauth_consumer_key="${$.auth.data.apiKey}", oauth_token="${$.auth.data.token}"`; } diff --git a/packages/backend/src/apps/trello/common/auth-scope.js b/packages/backend/src/apps/trello/common/auth-scope.js new file mode 100644 index 00000000..805e5b7f --- /dev/null +++ b/packages/backend/src/apps/trello/common/auth-scope.js @@ -0,0 +1,3 @@ +const authScope = ['read', 'write', 'account']; + +export default authScope; diff --git a/packages/backend/src/apps/trello/common/auth-scope.ts b/packages/backend/src/apps/trello/common/auth-scope.ts deleted file mode 100644 index 785ad4ea..00000000 --- a/packages/backend/src/apps/trello/common/auth-scope.ts +++ /dev/null @@ -1,3 +0,0 @@ -const authScope: string[] = ['read', 'write', 'account']; - -export default authScope; diff --git a/packages/backend/src/apps/trello/common/get-current-user.ts b/packages/backend/src/apps/trello/common/get-current-user.js similarity index 50% rename from packages/backend/src/apps/trello/common/get-current-user.ts rename to packages/backend/src/apps/trello/common/get-current-user.js index 64b0daa1..a2657cbf 100644 --- a/packages/backend/src/apps/trello/common/get-current-user.ts +++ b/packages/backend/src/apps/trello/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/1/members/me/'); const currentUser = response.data; diff --git a/packages/backend/src/apps/trello/dynamic-data/index.js b/packages/backend/src/apps/trello/dynamic-data/index.js new file mode 100644 index 00000000..2cc30ab9 --- /dev/null +++ b/packages/backend/src/apps/trello/dynamic-data/index.js @@ -0,0 +1,6 @@ +import listBoardLabels from './list-board-labels/index.js'; +import listBoardLists from './list-board-lists/index.js'; +import listBoards from './list-boards/index.js'; +import listMembers from './listMembers/index.js'; + +export default [listBoardLabels, listBoardLists, listBoards, listMembers]; diff --git a/packages/backend/src/apps/trello/dynamic-data/index.ts b/packages/backend/src/apps/trello/dynamic-data/index.ts deleted file mode 100644 index 232aa556..00000000 --- a/packages/backend/src/apps/trello/dynamic-data/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import listBoardLabels from './list-board-labels'; -import listBoardLists from './list-board-lists'; -import listBoards from './list-boards'; -import listMembers from './listMembers'; - -export default [listBoardLabels, listBoardLists, listBoards, listMembers]; diff --git a/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.ts b/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.js similarity index 77% rename from packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.ts rename to packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.js index a6cac58d..981d62d9 100644 --- a/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.ts +++ b/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List board labels', key: 'listBoardLabels', - async run($: IGlobalVariable) { - const boardLabels: { - data: IJSONObject[]; - } = { + async run($) { + const boardLabels = { data: [], }; diff --git a/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.ts b/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.js similarity index 73% rename from packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.ts rename to packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.js index fe22c10c..ea46115f 100644 --- a/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.ts +++ b/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List board lists', key: 'listBoardLists', - async run($: IGlobalVariable) { - const boards: { - data: IJSONObject[]; - } = { + async run($) { + const boards = { data: [], }; diff --git a/packages/backend/src/apps/trello/dynamic-data/list-boards/index.ts b/packages/backend/src/apps/trello/dynamic-data/list-boards/index.js similarity index 68% rename from packages/backend/src/apps/trello/dynamic-data/list-boards/index.ts rename to packages/backend/src/apps/trello/dynamic-data/list-boards/index.js index 83749839..2cf198ae 100644 --- a/packages/backend/src/apps/trello/dynamic-data/list-boards/index.ts +++ b/packages/backend/src/apps/trello/dynamic-data/list-boards/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List boards', key: 'listBoards', - async run($: IGlobalVariable) { - const boards: { - data: IJSONObject[]; - } = { + async run($) { + const boards = { data: [], }; diff --git a/packages/backend/src/apps/trello/dynamic-data/listMembers/index.ts b/packages/backend/src/apps/trello/dynamic-data/listMembers/index.js similarity index 74% rename from packages/backend/src/apps/trello/dynamic-data/listMembers/index.ts rename to packages/backend/src/apps/trello/dynamic-data/listMembers/index.js index 3070f542..4f007020 100644 --- a/packages/backend/src/apps/trello/dynamic-data/listMembers/index.ts +++ b/packages/backend/src/apps/trello/dynamic-data/listMembers/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List members', key: 'listMembers', - async run($: IGlobalVariable) { - const members: { - data: IJSONObject[]; - } = { + async run($) { + const members = { data: [], }; diff --git a/packages/backend/src/apps/trello/index.d.ts b/packages/backend/src/apps/trello/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/trello/index.ts b/packages/backend/src/apps/trello/index.js similarity index 61% rename from packages/backend/src/apps/trello/index.ts rename to packages/backend/src/apps/trello/index.js index 93552675..f98f7958 100644 --- a/packages/backend/src/apps/trello/index.ts +++ b/packages/backend/src/apps/trello/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Trello', diff --git a/packages/backend/src/apps/twilio/actions/index.js b/packages/backend/src/apps/twilio/actions/index.js new file mode 100644 index 00000000..18a261f9 --- /dev/null +++ b/packages/backend/src/apps/twilio/actions/index.js @@ -0,0 +1,3 @@ +import sendSms from './send-sms/index.js'; + +export default [sendSms]; diff --git a/packages/backend/src/apps/twilio/actions/index.ts b/packages/backend/src/apps/twilio/actions/index.ts deleted file mode 100644 index d1723dc2..00000000 --- a/packages/backend/src/apps/twilio/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import sendSms from './send-sms'; - -export default [sendSms]; diff --git a/packages/backend/src/apps/twilio/actions/send-sms/index.ts b/packages/backend/src/apps/twilio/actions/send-sms/index.js similarity index 73% rename from packages/backend/src/apps/twilio/actions/send-sms/index.ts rename to packages/backend/src/apps/twilio/actions/send-sms/index.js index f983c5bd..0e0c394e 100644 --- a/packages/backend/src/apps/twilio/actions/send-sms/index.ts +++ b/packages/backend/src/apps/twilio/actions/send-sms/index.js @@ -1,5 +1,5 @@ import { URLSearchParams } from 'node:url'; -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Send an SMS', @@ -9,7 +9,7 @@ export default defineAction({ { label: 'From Number', key: 'fromNumber', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The number to send the SMS from. Include country code. Example: 15551234567', @@ -28,7 +28,7 @@ export default defineAction({ { label: 'To Number', key: 'toNumber', - type: 'string' as const, + type: 'string', required: true, description: 'The number to send the SMS to. Include country code. Example: 15551234567', @@ -37,7 +37,7 @@ export default defineAction({ { label: 'Message', key: 'message', - type: 'string' as const, + type: 'string', required: true, description: 'The message to send.', variables: true, @@ -46,10 +46,10 @@ export default defineAction({ async run($) { const requestPath = `/2010-04-01/Accounts/${$.auth.data.accountSid}/Messages.json`; - const messageBody = $.step.parameters.message as string; + const messageBody = $.step.parameters.message; - const fromNumber = ($.step.parameters.fromNumber as string).trim(); - const toNumber = ($.step.parameters.toNumber as string).trim(); + const fromNumber = $.step.parameters.fromNumber.trim(); + const toNumber = $.step.parameters.toNumber.trim(); const payload = new URLSearchParams({ Body: messageBody, @@ -57,10 +57,7 @@ export default defineAction({ To: toNumber, }).toString(); - const response = await $.http.post( - requestPath, - payload, - ); + const response = await $.http.post(requestPath, payload); $.setActionItem({ raw: response.data }); }, diff --git a/packages/backend/src/apps/twilio/auth/index.ts b/packages/backend/src/apps/twilio/auth/index.js similarity index 79% rename from packages/backend/src/apps/twilio/auth/index.ts rename to packages/backend/src/apps/twilio/auth/index.js index 645e8874..d71192da 100644 --- a/packages/backend/src/apps/twilio/auth/index.ts +++ b/packages/backend/src/apps/twilio/auth/index.js @@ -1,12 +1,12 @@ -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'accountSid', label: 'Account SID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -18,7 +18,7 @@ export default { { key: 'authToken', label: 'Auth Token', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/twilio/auth/is-still-verified.js b/packages/backend/src/apps/twilio/auth/is-still-verified.js new file mode 100644 index 00000000..6663679a --- /dev/null +++ b/packages/backend/src/apps/twilio/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import verifyCredentials from './verify-credentials.js'; + +const isStillVerified = async ($) => { + await verifyCredentials($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/twilio/auth/is-still-verified.ts b/packages/backend/src/apps/twilio/auth/is-still-verified.ts deleted file mode 100644 index 66bb963e..00000000 --- a/packages/backend/src/apps/twilio/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import verifyCredentials from './verify-credentials'; - -const isStillVerified = async ($: IGlobalVariable) => { - await verifyCredentials($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/twilio/auth/verify-credentials.ts b/packages/backend/src/apps/twilio/auth/verify-credentials.js similarity index 59% rename from packages/backend/src/apps/twilio/auth/verify-credentials.ts rename to packages/backend/src/apps/twilio/auth/verify-credentials.js index df68bb88..89f36920 100644 --- a/packages/backend/src/apps/twilio/auth/verify-credentials.ts +++ b/packages/backend/src/apps/twilio/auth/verify-credentials.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await $.http.get('/2010-04-01/Accounts.json?PageSize=1'); await $.auth.set({ diff --git a/packages/backend/src/apps/twilio/common/add-auth-header.ts b/packages/backend/src/apps/twilio/common/add-auth-header.js similarity index 56% rename from packages/backend/src/apps/twilio/common/add-auth-header.ts rename to packages/backend/src/apps/twilio/common/add-auth-header.js index f5f47f85..097edf0a 100644 --- a/packages/backend/src/apps/twilio/common/add-auth-header.ts +++ b/packages/backend/src/apps/twilio/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ( requestConfig.headers && $.auth.data?.accountSid && @@ -9,8 +7,8 @@ const addAuthHeader: TBeforeRequest = ($, requestConfig) => { requestConfig.headers['Content-Type'] = 'application/x-www-form-urlencoded'; requestConfig.auth = { - username: $.auth.data.accountSid as string, - password: $.auth.data.authToken as string, + username: $.auth.data.accountSid, + password: $.auth.data.authToken, }; } diff --git a/packages/backend/src/apps/twilio/common/get-incoming-phone-number.js b/packages/backend/src/apps/twilio/common/get-incoming-phone-number.js new file mode 100644 index 00000000..cb2cdff0 --- /dev/null +++ b/packages/backend/src/apps/twilio/common/get-incoming-phone-number.js @@ -0,0 +1,7 @@ +export default async function getIncomingPhoneNumber($) { + const phoneNumberSid = $.step.parameters.phoneNumberSid; + const path = `/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers/${phoneNumberSid}.json`; + const response = await $.http.get(path); + + return response.data; +} diff --git a/packages/backend/src/apps/twilio/common/get-incoming-phone-number.ts b/packages/backend/src/apps/twilio/common/get-incoming-phone-number.ts deleted file mode 100644 index 53abbe09..00000000 --- a/packages/backend/src/apps/twilio/common/get-incoming-phone-number.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IGlobalVariable } from "@automatisch/types"; - -type Response = { - sid: string; - phone_number: string; -}; - -export default async function getIncomingPhoneNumber($: IGlobalVariable) { - const phoneNumberSid = $.step.parameters.phoneNumberSid as string; - const path = `/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers/${phoneNumberSid}.json`; - const response = await $.http.get(path); - - return response.data; -}; diff --git a/packages/backend/src/apps/twilio/dynamic-data/index.ts b/packages/backend/src/apps/twilio/dynamic-data/index.js similarity index 87% rename from packages/backend/src/apps/twilio/dynamic-data/index.ts rename to packages/backend/src/apps/twilio/dynamic-data/index.js index d20d4347..758d4abe 100644 --- a/packages/backend/src/apps/twilio/dynamic-data/index.ts +++ b/packages/backend/src/apps/twilio/dynamic-data/index.js @@ -1,3 +1,3 @@ -import listIncomingPhoneNumbers from './list-incoming-phone-numbers'; +import listIncomingPhoneNumbers from './list-incoming-phone-numbers/index.js'; export default [listIncomingPhoneNumbers]; diff --git a/packages/backend/src/apps/twilio/dynamic-data/list-incoming-phone-numbers/index.ts b/packages/backend/src/apps/twilio/dynamic-data/list-incoming-phone-numbers/index.js similarity index 59% rename from packages/backend/src/apps/twilio/dynamic-data/list-incoming-phone-numbers/index.ts rename to packages/backend/src/apps/twilio/dynamic-data/list-incoming-phone-numbers/index.js index 0e36af65..f71806b0 100644 --- a/packages/backend/src/apps/twilio/dynamic-data/list-incoming-phone-numbers/index.ts +++ b/packages/backend/src/apps/twilio/dynamic-data/list-incoming-phone-numbers/index.js @@ -1,37 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type TResponse = { - data: IJSONObject[]; - error?: IJSONObject; -}; - -type TIncomingPhoneNumber = { - phone_number: string; - friendly_name: string; - sid: string; - capabilities: { - sms: boolean; - }; -}; - -type TResponseData = { - incoming_phone_numbers: TIncomingPhoneNumber[]; - next_page_uri: string; -}; - export default { name: 'List incoming phone numbers', key: 'listIncomingPhoneNumbers', - async run($: IGlobalVariable) { - const valueType = $.step.parameters.valueType as string; + async run($) { + const valueType = $.step.parameters.valueType; const isSid = valueType === 'sid'; - const aggregatedResponse: TResponse = { data: [] }; + const aggregatedResponse = { data: [] }; let pathname = `/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers.json`; do { - const response = await $.http.get(pathname); + const response = await $.http.get(pathname); for (const incomingPhoneNumber of response.data.incoming_phone_numbers) { if (incomingPhoneNumber.capabilities.sms === false) { diff --git a/packages/backend/src/apps/twilio/index.d.ts b/packages/backend/src/apps/twilio/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/twilio/index.ts b/packages/backend/src/apps/twilio/index.js similarity index 58% rename from packages/backend/src/apps/twilio/index.ts rename to packages/backend/src/apps/twilio/index.js index f1684dd5..ad883ecb 100644 --- a/packages/backend/src/apps/twilio/index.ts +++ b/packages/backend/src/apps/twilio/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Twilio', diff --git a/packages/backend/src/apps/twilio/triggers/index.js b/packages/backend/src/apps/twilio/triggers/index.js new file mode 100644 index 00000000..c7219e50 --- /dev/null +++ b/packages/backend/src/apps/twilio/triggers/index.js @@ -0,0 +1,3 @@ +import receiveSms from './receive-sms/index.js'; + +export default [receiveSms]; diff --git a/packages/backend/src/apps/twilio/triggers/index.ts b/packages/backend/src/apps/twilio/triggers/index.ts deleted file mode 100644 index 04e1504d..00000000 --- a/packages/backend/src/apps/twilio/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import receiveSms from './receive-sms'; - -export default [receiveSms]; diff --git a/packages/backend/src/apps/twilio/triggers/receive-sms/fetch-messages.ts b/packages/backend/src/apps/twilio/triggers/receive-sms/fetch-messages.js similarity index 78% rename from packages/backend/src/apps/twilio/triggers/receive-sms/fetch-messages.ts rename to packages/backend/src/apps/twilio/triggers/receive-sms/fetch-messages.js index fdf8a488..7445cedd 100644 --- a/packages/backend/src/apps/twilio/triggers/receive-sms/fetch-messages.ts +++ b/packages/backend/src/apps/twilio/triggers/receive-sms/fetch-messages.js @@ -1,7 +1,6 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import getIncomingPhoneNumber from '../../common/get-incoming-phone-number'; +import getIncomingPhoneNumber from '../../common/get-incoming-phone-number.js'; -const fetchMessages = async ($: IGlobalVariable) => { +const fetchMessages = async ($) => { const incomingPhoneNumber = await getIncomingPhoneNumber($); let response; @@ -10,7 +9,7 @@ const fetchMessages = async ($: IGlobalVariable) => { do { response = await $.http.get(requestPath); - response.data.messages.forEach((message: IJSONObject) => { + response.data.messages.forEach((message) => { const computedMessage = { To: message.to, Body: message.body, @@ -26,7 +25,7 @@ const fetchMessages = async ($: IGlobalVariable) => { const dataItem = { raw: computedMessage, meta: { - internalId: message.date_sent as string, + internalId: message.date_sent, }, }; diff --git a/packages/backend/src/apps/twilio/triggers/receive-sms/index.ts b/packages/backend/src/apps/twilio/triggers/receive-sms/index.js similarity index 85% rename from packages/backend/src/apps/twilio/triggers/receive-sms/index.ts rename to packages/backend/src/apps/twilio/triggers/receive-sms/index.js index a0259ed4..d5224ca1 100644 --- a/packages/backend/src/apps/twilio/triggers/receive-sms/index.ts +++ b/packages/backend/src/apps/twilio/triggers/receive-sms/index.js @@ -1,8 +1,8 @@ import { URLSearchParams } from 'node:url'; import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; -import fetchMessages from './fetch-messages'; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import fetchMessages from './fetch-messages.js'; export default defineTrigger({ name: 'Receive SMS', @@ -13,7 +13,7 @@ export default defineTrigger({ { label: 'To Number', key: 'phoneNumberSid', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'The number to receive the SMS on. It should be a Twilio number.', @@ -65,7 +65,7 @@ export default defineTrigger({ }, async registerHook($) { - const phoneNumberSid = $.step.parameters.phoneNumberSid as string; + const phoneNumberSid = $.step.parameters.phoneNumberSid; const payload = new URLSearchParams({ SmsUrl: $.webhookUrl, }).toString(); @@ -77,7 +77,7 @@ export default defineTrigger({ }, async unregisterHook($) { - const phoneNumberSid = $.step.parameters.phoneNumberSid as string; + const phoneNumberSid = $.step.parameters.phoneNumberSid; const payload = new URLSearchParams({ SmsUrl: '', }).toString(); diff --git a/packages/backend/src/apps/twitter/actions/create-tweet/index.ts b/packages/backend/src/apps/twitter/actions/create-tweet/index.js similarity index 83% rename from packages/backend/src/apps/twitter/actions/create-tweet/index.ts rename to packages/backend/src/apps/twitter/actions/create-tweet/index.js index d7f795f6..f3f6d14f 100644 --- a/packages/backend/src/apps/twitter/actions/create-tweet/index.ts +++ b/packages/backend/src/apps/twitter/actions/create-tweet/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Create tweet', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Tweet body', key: 'tweet', - type: 'string' as const, + type: 'string', required: true, description: 'The content of your new tweet.', variables: true, diff --git a/packages/backend/src/apps/twitter/actions/index.js b/packages/backend/src/apps/twitter/actions/index.js new file mode 100644 index 00000000..b090ea04 --- /dev/null +++ b/packages/backend/src/apps/twitter/actions/index.js @@ -0,0 +1,4 @@ +import createTweet from './create-tweet/index.js'; +import searchUser from './search-user/index.js'; + +export default [createTweet, searchUser]; diff --git a/packages/backend/src/apps/twitter/actions/index.ts b/packages/backend/src/apps/twitter/actions/index.ts deleted file mode 100644 index 60053584..00000000 --- a/packages/backend/src/apps/twitter/actions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import createTweet from './create-tweet'; -import searchUser from './search-user'; - -export default [createTweet, searchUser]; diff --git a/packages/backend/src/apps/twitter/actions/search-user/index.js b/packages/backend/src/apps/twitter/actions/search-user/index.js new file mode 100644 index 00000000..a535e0e3 --- /dev/null +++ b/packages/backend/src/apps/twitter/actions/search-user/index.js @@ -0,0 +1,35 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Search user', + key: 'searchUser', + description: 'Search a user on Twitter', + arguments: [ + { + label: 'Username', + key: 'username', + type: 'string', + required: true, + description: 'The username of the Twitter user you want to search for', + variables: true, + }, + ], + + async run($) { + const { data } = await $.http.get( + `/2/users/by/username/${$.step.parameters.username}`, + { + params: { + expansions: 'pinned_tweet_id', + 'tweet.fields': + 'attachments,author_id,context_annotations,conversation_id,created_at,edit_controls,entities,geo,id,in_reply_to_user_id,lang,non_public_metrics,public_metrics,organic_metrics,promoted_metrics,possibly_sensitive,referenced_tweets,reply_settings,source,text,withheld', + 'user.fields': + 'created_at,description,entities,id,location,name,pinned_tweet_id,profile_image_url,protected,public_metrics,url,username,verified,verified_type,withheld', + }, + } + ); + $.setActionItem({ + raw: data.data, + }); + }, +}); diff --git a/packages/backend/src/apps/twitter/actions/search-user/index.ts b/packages/backend/src/apps/twitter/actions/search-user/index.ts deleted file mode 100644 index e2a498e6..00000000 --- a/packages/backend/src/apps/twitter/actions/search-user/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import defineAction from '../../../../helpers/define-action'; - -export default defineAction({ - name: 'Search user', - key: 'searchUser', - description: 'Search a user on Twitter', - arguments: [ - { - label: 'Username', - key: 'username', - type: 'string' as const, - required: true, - description: 'The username of the Twitter user you want to search for', - variables: true, - }, - ], - - async run($) { - const { data } = await $.http.get(`/2/users/by/username/${$.step.parameters.username}`, { - params: { - expansions: 'pinned_tweet_id', - 'tweet.fields': 'attachments,author_id,context_annotations,conversation_id,created_at,edit_controls,entities,geo,id,in_reply_to_user_id,lang,non_public_metrics,public_metrics,organic_metrics,promoted_metrics,possibly_sensitive,referenced_tweets,reply_settings,source,text,withheld', - 'user.fields': 'created_at,description,entities,id,location,name,pinned_tweet_id,profile_image_url,protected,public_metrics,url,username,verified,verified_type,withheld' - } - }); - $.setActionItem({ - raw: data.data - }); - }, -}); diff --git a/packages/backend/src/apps/twitter/auth/generate-auth-url.ts b/packages/backend/src/apps/twitter/auth/generate-auth-url.js similarity index 76% rename from packages/backend/src/apps/twitter/auth/generate-auth-url.ts rename to packages/backend/src/apps/twitter/auth/generate-auth-url.js index dfe2a58f..f1e0db81 100644 --- a/packages/backend/src/apps/twitter/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/twitter/auth/generate-auth-url.js @@ -1,9 +1,8 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); const callbackUrl = oauthRedirectUrlField.value; diff --git a/packages/backend/src/apps/twitter/auth/index.ts b/packages/backend/src/apps/twitter/auth/index.js similarity index 77% rename from packages/backend/src/apps/twitter/auth/index.ts rename to packages/backend/src/apps/twitter/auth/index.js index bdea0b6f..78135f81 100644 --- a/packages/backend/src/apps/twitter/auth/index.ts +++ b/packages/backend/src/apps/twitter/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/twitter/connections/add', @@ -19,7 +19,7 @@ export default { { key: 'consumerKey', label: 'API Key', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -30,7 +30,7 @@ export default { { key: 'consumerSecret', label: 'API Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/twitter/auth/is-still-verified.js b/packages/backend/src/apps/twitter/auth/is-still-verified.js new file mode 100644 index 00000000..f59ee3b4 --- /dev/null +++ b/packages/backend/src/apps/twitter/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const user = await getCurrentUser($); + return !!user; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/twitter/auth/is-still-verified.ts b/packages/backend/src/apps/twitter/auth/is-still-verified.ts deleted file mode 100644 index d36919f2..00000000 --- a/packages/backend/src/apps/twitter/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const user = await getCurrentUser($); - return !!user; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/twitter/auth/verify-credentials.ts b/packages/backend/src/apps/twitter/auth/verify-credentials.js similarity index 82% rename from packages/backend/src/apps/twitter/auth/verify-credentials.ts rename to packages/backend/src/apps/twitter/auth/verify-credentials.js index 6be0ed25..26208834 100644 --- a/packages/backend/src/apps/twitter/auth/verify-credentials.ts +++ b/packages/backend/src/apps/twitter/auth/verify-credentials.js @@ -1,7 +1,6 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const response = await $.http.post( `/oauth/access_token?oauth_verifier=${$.auth.data.oauth_verifier}&oauth_token=${$.auth.data.accessToken}`, null diff --git a/packages/backend/src/apps/twitter/common/add-auth-header.ts b/packages/backend/src/apps/twitter/common/add-auth-header.js similarity index 61% rename from packages/backend/src/apps/twitter/common/add-auth-header.ts rename to packages/backend/src/apps/twitter/common/add-auth-header.js index 993c0530..824181ce 100644 --- a/packages/backend/src/apps/twitter/common/add-auth-header.ts +++ b/packages/backend/src/apps/twitter/common/add-auth-header.js @@ -1,20 +1,12 @@ -import { Token } from 'oauth-1.0a'; import { URLSearchParams } from 'node:url'; -import { IJSONObject, TBeforeRequest } from '@automatisch/types'; -import oauthClient from './oauth-client'; +import oauthClient from './oauth-client.js'; -type RequestDataType = { - url: string; - method: string; - data?: IJSONObject; -}; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { baseURL, url, method, data, params } = requestConfig; - const token: Token = { - key: $.auth.data?.accessToken as string, - secret: $.auth.data?.accessSecret as string, + const token = { + key: $.auth.data?.accessToken, + secret: $.auth.data?.accessSecret, }; const searchParams = new URLSearchParams(params); @@ -26,7 +18,7 @@ const addAuthHeader: TBeforeRequest = ($, requestConfig) => { fullUrl = `${fullUrl}?${stringifiedParams}`; } - const requestData: RequestDataType = { + const requestData = { url: fullUrl, method, }; diff --git a/packages/backend/src/apps/twitter/common/get-current-user.ts b/packages/backend/src/apps/twitter/common/get-current-user.js similarity index 51% rename from packages/backend/src/apps/twitter/common/get-current-user.ts rename to packages/backend/src/apps/twitter/common/get-current-user.js index 3ce130a0..5dd99b4d 100644 --- a/packages/backend/src/apps/twitter/common/get-current-user.ts +++ b/packages/backend/src/apps/twitter/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/2/users/me'); const currentUser = response.data.data; diff --git a/packages/backend/src/apps/twitter/common/get-user-by-username.ts b/packages/backend/src/apps/twitter/common/get-user-by-username.js similarity index 64% rename from packages/backend/src/apps/twitter/common/get-user-by-username.ts rename to packages/backend/src/apps/twitter/common/get-user-by-username.js index 4240fff4..0e4b9654 100644 --- a/packages/backend/src/apps/twitter/common/get-user-by-username.ts +++ b/packages/backend/src/apps/twitter/common/get-user-by-username.js @@ -1,11 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getUserByUsername = async ($: IGlobalVariable, username: string) => { +const getUserByUsername = async ($, username) => { const response = await $.http.get(`/2/users/by/username/${username}`); if (response.data.errors) { const errorMessages = response.data.errors - .map((error: IJSONObject) => error.detail) + .map((error) => error.detail) .join(' '); throw new Error(`Error occured while fetching user data: ${errorMessages}`); diff --git a/packages/backend/src/apps/twitter/common/get-user-followers.ts b/packages/backend/src/apps/twitter/common/get-user-followers.js similarity index 67% rename from packages/backend/src/apps/twitter/common/get-user-followers.ts rename to packages/backend/src/apps/twitter/common/get-user-followers.js index 406ee8b6..9b339f97 100644 --- a/packages/backend/src/apps/twitter/common/get-user-followers.ts +++ b/packages/backend/src/apps/twitter/common/get-user-followers.js @@ -1,19 +1,12 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import { omitBy, isEmpty } from 'lodash'; +import omitBy from 'lodash/omitBy.js'; +import isEmpty from 'lodash/isEmpty.js'; -type GetUserFollowersOptions = { - userId: string; -}; - -const getUserFollowers = async ( - $: IGlobalVariable, - options: GetUserFollowersOptions -) => { +const getUserFollowers = async ($, options) => { let response; do { - const params: IJSONObject = { + const params = { pagination_token: response?.data?.meta?.next_token, }; @@ -33,7 +26,7 @@ const getUserFollowers = async ( for (const follower of response.data.data) { $.pushTriggerItem({ raw: follower, - meta: { internalId: follower.id as string }, + meta: { internalId: follower.id }, }); } } diff --git a/packages/backend/src/apps/twitter/common/get-user-tweets.ts b/packages/backend/src/apps/twitter/common/get-user-tweets.js similarity index 55% rename from packages/backend/src/apps/twitter/common/get-user-tweets.ts rename to packages/backend/src/apps/twitter/common/get-user-tweets.js index 2eb2aa11..c63727aa 100644 --- a/packages/backend/src/apps/twitter/common/get-user-tweets.ts +++ b/packages/backend/src/apps/twitter/common/get-user-tweets.js @@ -1,21 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import omitBy from 'lodash/omitBy'; -import isEmpty from 'lodash/isEmpty'; -import getCurrentUser from './get-current-user'; -import getUserByUsername from './get-user-by-username'; +import omitBy from 'lodash/omitBy.js'; +import isEmpty from 'lodash/isEmpty.js'; +import getCurrentUser from './get-current-user.js'; +import getUserByUsername from './get-user-by-username.js'; -type IGetUserTweetsOptions = { - currentUser: boolean; -}; - -const fetchTweets = async ($: IGlobalVariable, username: string) => { +const fetchTweets = async ($, username) => { const user = await getUserByUsername($, username); let response; do { - const params: IJSONObject = { + const params = { since_id: $.flow.lastInternalId, pagination_token: response?.data?.meta?.next_token, }; @@ -29,11 +24,11 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { response = await $.http.get(requestPath); if (response.data.meta.result_count > 0) { - response.data.data.forEach((tweet: IJSONObject) => { + response.data.data.forEach((tweet) => { const dataItem = { raw: tweet, meta: { - internalId: tweet.id as string, + internalId: tweet.id, }, }; @@ -45,17 +40,14 @@ const fetchTweets = async ($: IGlobalVariable, username: string) => { return $.triggerOutput; }; -const getUserTweets = async ( - $: IGlobalVariable, - options: IGetUserTweetsOptions -) => { - let username: string; +const getUserTweets = async ($, options) => { + let username; if (options.currentUser) { const currentUser = await getCurrentUser($); - username = currentUser.username as string; + username = currentUser.username; } else { - username = $.step.parameters.username as string; + username = $.step.parameters.username; } await fetchTweets($, username); diff --git a/packages/backend/src/apps/twitter/common/oauth-client.ts b/packages/backend/src/apps/twitter/common/oauth-client.js similarity index 65% rename from packages/backend/src/apps/twitter/common/oauth-client.ts rename to packages/backend/src/apps/twitter/common/oauth-client.js index c29f6a0a..d89c4889 100644 --- a/packages/backend/src/apps/twitter/common/oauth-client.ts +++ b/packages/backend/src/apps/twitter/common/oauth-client.js @@ -1,11 +1,10 @@ -import { IGlobalVariable } from '@automatisch/types'; import crypto from 'crypto'; import OAuth from 'oauth-1.0a'; -const oauthClient = ($: IGlobalVariable) => { +const oauthClient = ($) => { const consumerData = { - key: $.auth.data.consumerKey as string, - secret: $.auth.data.consumerSecret as string, + key: $.auth.data.consumerKey, + secret: $.auth.data.consumerSecret, }; return new OAuth({ diff --git a/packages/backend/src/apps/twitter/index.d.ts b/packages/backend/src/apps/twitter/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/twitter/index.ts b/packages/backend/src/apps/twitter/index.js similarity index 62% rename from packages/backend/src/apps/twitter/index.ts rename to packages/backend/src/apps/twitter/index.js index 5213206f..18e454bd 100644 --- a/packages/backend/src/apps/twitter/index.ts +++ b/packages/backend/src/apps/twitter/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import actions from './actions'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import actions from './actions/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Twitter', diff --git a/packages/backend/src/apps/twitter/triggers/index.js b/packages/backend/src/apps/twitter/triggers/index.js new file mode 100644 index 00000000..9e36c62a --- /dev/null +++ b/packages/backend/src/apps/twitter/triggers/index.js @@ -0,0 +1,6 @@ +import myTweets from './my-tweets/index.js'; +import newFollowerOfMe from './new-follower-of-me/index.js'; +import searchTweets from './search-tweets/index.js'; +import userTweets from './user-tweets/index.js'; + +export default [myTweets, newFollowerOfMe, searchTweets, userTweets]; diff --git a/packages/backend/src/apps/twitter/triggers/index.ts b/packages/backend/src/apps/twitter/triggers/index.ts deleted file mode 100644 index 3f75a856..00000000 --- a/packages/backend/src/apps/twitter/triggers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import myTweets from './my-tweets'; -import newFollowerOfMe from './new-follower-of-me'; -import searchTweets from './search-tweets'; -import userTweets from './user-tweets'; - -export default [myTweets, newFollowerOfMe, searchTweets, userTweets]; diff --git a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/my-tweets/index.js similarity index 63% rename from packages/backend/src/apps/twitter/triggers/my-tweets/index.ts rename to packages/backend/src/apps/twitter/triggers/my-tweets/index.js index 56cb3d56..756e43b1 100644 --- a/packages/backend/src/apps/twitter/triggers/my-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/my-tweets/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import getUserTweets from '../../common/get-user-tweets'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import getUserTweets from '../../common/get-user-tweets.js'; export default defineTrigger({ name: 'My tweets', diff --git a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.js similarity index 66% rename from packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts rename to packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.js index f96afae4..9a3c06b8 100644 --- a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.ts +++ b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import myFollowers from './my-followers'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import myFollowers from './my-followers.js'; export default defineTrigger({ name: 'New follower of me', diff --git a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/my-followers.js b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/my-followers.js new file mode 100644 index 00000000..41eb952e --- /dev/null +++ b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/my-followers.js @@ -0,0 +1,15 @@ +import getCurrentUser from '../../common/get-current-user.js'; +import getUserByUsername from '../../common/get-user-by-username.js'; +import getUserFollowers from '../../common/get-user-followers.js'; + +const myFollowers = async ($) => { + const { username } = await getCurrentUser($); + const user = await getUserByUsername($, username); + + const tweets = await getUserFollowers($, { + userId: user.id, + }); + return tweets; +}; + +export default myFollowers; diff --git a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/my-followers.ts b/packages/backend/src/apps/twitter/triggers/new-follower-of-me/my-followers.ts deleted file mode 100644 index 69185bf7..00000000 --- a/packages/backend/src/apps/twitter/triggers/new-follower-of-me/my-followers.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../../common/get-current-user'; -import getUserByUsername from '../../common/get-user-by-username'; -import getUserFollowers from '../../common/get-user-followers'; - -const myFollowers = async ($: IGlobalVariable) => { - const { username } = await getCurrentUser($); - const user = await getUserByUsername($, username as string); - - const tweets = await getUserFollowers($, { - userId: user.id, - }); - return tweets; -}; - -export default myFollowers; diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/index.js similarity index 73% rename from packages/backend/src/apps/twitter/triggers/search-tweets/index.ts rename to packages/backend/src/apps/twitter/triggers/search-tweets/index.js index a3bbae6e..16372908 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import searchTweets from './search-tweets'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import searchTweets from './search-tweets.js'; export default defineTrigger({ name: 'Search tweets', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Search Term', key: 'searchTerm', - type: 'string' as const, + type: 'string', required: true, }, ], diff --git a/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts b/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.js similarity index 68% rename from packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts rename to packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.js index 929bfac3..ddedda2e 100644 --- a/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.ts +++ b/packages/backend/src/apps/twitter/triggers/search-tweets/search-tweets.js @@ -1,14 +1,14 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import qs from 'qs'; -import { omitBy, isEmpty } from 'lodash'; +import omitBy from 'lodash/omitBy.js'; +import isEmpty from 'lodash/isEmpty.js'; -const searchTweets = async ($: IGlobalVariable) => { - const searchTerm = $.step.parameters.searchTerm as string; +const searchTweets = async ($) => { + const searchTerm = $.step.parameters.searchTerm; let response; do { - const params: IJSONObject = { + const params = { query: searchTerm, since_id: $.flow.lastInternalId, pagination_token: response?.data?.meta?.next_token, @@ -27,11 +27,11 @@ const searchTweets = async ($: IGlobalVariable) => { } if (response.data.meta.result_count > 0) { - response.data.data.forEach((tweet: IJSONObject) => { + response.data.data.forEach((tweet) => { const dataItem = { raw: tweet, meta: { - internalId: tweet.id as string, + internalId: tweet.id, }, }; diff --git a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts b/packages/backend/src/apps/twitter/triggers/user-tweets/index.js similarity index 69% rename from packages/backend/src/apps/twitter/triggers/user-tweets/index.ts rename to packages/backend/src/apps/twitter/triggers/user-tweets/index.js index 1b6de95a..c14c5a25 100644 --- a/packages/backend/src/apps/twitter/triggers/user-tweets/index.ts +++ b/packages/backend/src/apps/twitter/triggers/user-tweets/index.js @@ -1,5 +1,5 @@ -import defineTrigger from '../../../../helpers/define-trigger'; -import getUserTweets from '../../common/get-user-tweets'; +import defineTrigger from '../../../../helpers/define-trigger.js'; +import getUserTweets from '../../common/get-user-tweets.js'; export default defineTrigger({ name: 'User tweets', @@ -10,7 +10,7 @@ export default defineTrigger({ { label: 'Username', key: 'username', - type: 'string' as const, + type: 'string', required: true, }, ], diff --git a/packages/backend/src/apps/typeform/auth/generate-auth-url.js b/packages/backend/src/apps/typeform/auth/generate-auth-url.js new file mode 100644 index 00000000..4012e5ec --- /dev/null +++ b/packages/backend/src/apps/typeform/auth/generate-auth-url.js @@ -0,0 +1,20 @@ +import { URLSearchParams } from 'url'; +import authScope from '../common/auth-scope.js'; + +export default async function generateAuthUrl($) { + const oauthRedirectUrl = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ).value; + + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId, + redirect_uri: oauthRedirectUrl, + scope: authScope.join(' '), + }); + + const url = `${$.app.apiBaseUrl}/oauth/authorize?${searchParams.toString()}`; + + await $.auth.set({ + url, + }); +} diff --git a/packages/backend/src/apps/typeform/auth/generate-auth-url.ts b/packages/backend/src/apps/typeform/auth/generate-auth-url.ts deleted file mode 100644 index 14ca84b8..00000000 --- a/packages/backend/src/apps/typeform/auth/generate-auth-url.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const oauthRedirectUrl = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ).value; - - const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - redirect_uri: oauthRedirectUrl as string, - scope: authScope.join(' '), - }); - - const url = `${$.app.apiBaseUrl}/oauth/authorize?${searchParams.toString()}`; - - await $.auth.set({ - url, - }); -} diff --git a/packages/backend/src/apps/typeform/auth/index.ts b/packages/backend/src/apps/typeform/auth/index.js similarity index 72% rename from packages/backend/src/apps/typeform/auth/index.ts rename to packages/backend/src/apps/typeform/auth/index.js index 0aa070f2..81e6906d 100644 --- a/packages/backend/src/apps/typeform/auth/index.ts +++ b/packages/backend/src/apps/typeform/auth/index.js @@ -1,15 +1,15 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; -import refreshToken from './refresh-token'; -import verifyWebhook from './verify-webhook'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; +import refreshToken from './refresh-token.js'; +import verifyWebhook from './verify-webhook.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/typeform/connections/add', @@ -21,7 +21,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -32,7 +32,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/typeform/auth/is-still-verified.js b/packages/backend/src/apps/typeform/auth/is-still-verified.js new file mode 100644 index 00000000..5f5c85ed --- /dev/null +++ b/packages/backend/src/apps/typeform/auth/is-still-verified.js @@ -0,0 +1,7 @@ +const isStillVerified = async ($) => { + await $.http.get('/me'); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/typeform/auth/is-still-verified.ts b/packages/backend/src/apps/typeform/auth/is-still-verified.ts deleted file mode 100644 index 4fb0c3e3..00000000 --- a/packages/backend/src/apps/typeform/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { - await $.http.get('/me'); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/typeform/auth/refresh-token.ts b/packages/backend/src/apps/typeform/auth/refresh-token.js similarity index 57% rename from packages/backend/src/apps/typeform/auth/refresh-token.ts rename to packages/backend/src/apps/typeform/auth/refresh-token.js index 7da4e118..a2d7a256 100644 --- a/packages/backend/src/apps/typeform/auth/refresh-token.ts +++ b/packages/backend/src/apps/typeform/auth/refresh-token.js @@ -1,13 +1,12 @@ -import { IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -const refreshToken = async ($: IGlobalVariable) => { +const refreshToken = async ($) => { const params = new URLSearchParams({ grant_type: 'refresh_token', - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - refresh_token: $.auth.data.refreshToken as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + refresh_token: $.auth.data.refreshToken, scope: authScope.join(' '), }); diff --git a/packages/backend/src/apps/typeform/auth/verify-credentials.ts b/packages/backend/src/apps/typeform/auth/verify-credentials.js similarity index 68% rename from packages/backend/src/apps/typeform/auth/verify-credentials.ts rename to packages/backend/src/apps/typeform/auth/verify-credentials.js index 2d1e55ea..87ee6bde 100644 --- a/packages/backend/src/apps/typeform/auth/verify-credentials.ts +++ b/packages/backend/src/apps/typeform/auth/verify-credentials.js @@ -1,17 +1,16 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrl = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ).value; const params = new URLSearchParams({ grant_type: 'authorization_code', - code: $.auth.data.code as string, - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - redirect_uri: oauthRedirectUrl as string, + code: $.auth.data.code, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + redirect_uri: oauthRedirectUrl, }); const { data: verifiedCredentials } = await $.http.post( diff --git a/packages/backend/src/apps/typeform/auth/verify-webhook.ts b/packages/backend/src/apps/typeform/auth/verify-webhook.js similarity index 52% rename from packages/backend/src/apps/typeform/auth/verify-webhook.ts rename to packages/backend/src/apps/typeform/auth/verify-webhook.js index 19dd8806..a1672ea3 100644 --- a/packages/backend/src/apps/typeform/auth/verify-webhook.ts +++ b/packages/backend/src/apps/typeform/auth/verify-webhook.js @@ -1,15 +1,15 @@ import crypto from 'crypto'; -import { IGlobalVariable } from '@automatisch/types'; -import appConfig from '../../../config/app'; -const verifyWebhook = async ($: IGlobalVariable) => { - const signature = $.request.headers['typeform-signature'] as string; +import appConfig from '../../../config/app.js'; + +const verifyWebhook = async ($) => { + const signature = $.request.headers['typeform-signature']; const isValid = verifySignature(signature, $.request.rawBody.toString()); return isValid; }; -const verifySignature = function (receivedSignature: string, payload: string) { +const verifySignature = function (receivedSignature, payload) { const hash = crypto .createHmac('sha256', appConfig.webhookSecretKey) .update(payload) diff --git a/packages/backend/src/apps/typeform/common/add-auth-header.ts b/packages/backend/src/apps/typeform/common/add-auth-header.js similarity index 66% rename from packages/backend/src/apps/typeform/common/add-auth-header.ts rename to packages/backend/src/apps/typeform/common/add-auth-header.js index d650c915..bf9ea772 100644 --- a/packages/backend/src/apps/typeform/common/add-auth-header.ts +++ b/packages/backend/src/apps/typeform/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if ($.auth.data?.accessToken) { const authorizationHeader = `Bearer ${$.auth.data.accessToken}`; requestConfig.headers.Authorization = authorizationHeader; diff --git a/packages/backend/src/apps/typeform/common/auth-scope.ts b/packages/backend/src/apps/typeform/common/auth-scope.js similarity index 85% rename from packages/backend/src/apps/typeform/common/auth-scope.ts rename to packages/backend/src/apps/typeform/common/auth-scope.js index 7b3154c8..1063656c 100644 --- a/packages/backend/src/apps/typeform/common/auth-scope.ts +++ b/packages/backend/src/apps/typeform/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'forms:read', 'forms:write', 'webhooks:read', diff --git a/packages/backend/src/apps/typeform/dynamic-data/index.js b/packages/backend/src/apps/typeform/dynamic-data/index.js new file mode 100644 index 00000000..0a58430e --- /dev/null +++ b/packages/backend/src/apps/typeform/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listForms from './list-forms/index.js'; + +export default [listForms]; diff --git a/packages/backend/src/apps/typeform/dynamic-data/index.ts b/packages/backend/src/apps/typeform/dynamic-data/index.ts deleted file mode 100644 index cb6cd053..00000000 --- a/packages/backend/src/apps/typeform/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listForms from './list-forms'; - -export default [listForms]; diff --git a/packages/backend/src/apps/typeform/dynamic-data/list-forms/index.ts b/packages/backend/src/apps/typeform/dynamic-data/list-forms/index.js similarity index 52% rename from packages/backend/src/apps/typeform/dynamic-data/list-forms/index.ts rename to packages/backend/src/apps/typeform/dynamic-data/list-forms/index.js index 409ec1a3..93e56f5a 100644 --- a/packages/backend/src/apps/typeform/dynamic-data/list-forms/index.ts +++ b/packages/backend/src/apps/typeform/dynamic-data/list-forms/index.js @@ -1,19 +1,15 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List forms', key: 'listForms', - async run($: IGlobalVariable) { - const forms: { - data: IJSONObject[]; - } = { + async run($) { + const forms = { data: [], }; const response = await $.http.get('/forms'); - forms.data = response.data.items.map((form: IJSONObject) => { + forms.data = response.data.items.map((form) => { return { value: form.id, name: form.title, diff --git a/packages/backend/src/apps/typeform/index.d.ts b/packages/backend/src/apps/typeform/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/typeform/index.ts b/packages/backend/src/apps/typeform/index.js similarity index 62% rename from packages/backend/src/apps/typeform/index.ts rename to packages/backend/src/apps/typeform/index.js index f0f6ffcb..0d277927 100644 --- a/packages/backend/src/apps/typeform/index.ts +++ b/packages/backend/src/apps/typeform/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Typeform', diff --git a/packages/backend/src/apps/typeform/triggers/index.js b/packages/backend/src/apps/typeform/triggers/index.js new file mode 100644 index 00000000..38b6a209 --- /dev/null +++ b/packages/backend/src/apps/typeform/triggers/index.js @@ -0,0 +1,3 @@ +import newEntry from './new-entry/index.js'; + +export default [newEntry]; diff --git a/packages/backend/src/apps/typeform/triggers/index.ts b/packages/backend/src/apps/typeform/triggers/index.ts deleted file mode 100644 index c49828b1..00000000 --- a/packages/backend/src/apps/typeform/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import newEntry from './new-entry'; - -export default [newEntry]; diff --git a/packages/backend/src/apps/typeform/triggers/new-entry/index.ts b/packages/backend/src/apps/typeform/triggers/new-entry/index.js similarity index 93% rename from packages/backend/src/apps/typeform/triggers/new-entry/index.ts rename to packages/backend/src/apps/typeform/triggers/new-entry/index.js index 8ef73a41..2b666eef 100644 --- a/packages/backend/src/apps/typeform/triggers/new-entry/index.ts +++ b/packages/backend/src/apps/typeform/triggers/new-entry/index.js @@ -1,6 +1,6 @@ import Crypto from 'crypto'; -import appConfig from '../../../../config/app'; -import defineTrigger from '../../../../helpers/define-trigger'; +import appConfig from '../../../../config/app.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New entry', @@ -11,7 +11,7 @@ export default defineTrigger({ { label: 'Form', key: 'formId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: 'Pick a form to receive submissions.', variables: false, diff --git a/packages/backend/src/apps/webhook/index.d.ts b/packages/backend/src/apps/webhook/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/webhook/index.ts b/packages/backend/src/apps/webhook/index.js similarity index 75% rename from packages/backend/src/apps/webhook/index.ts rename to packages/backend/src/apps/webhook/index.js index 107ee47a..f378e98b 100644 --- a/packages/backend/src/apps/webhook/index.ts +++ b/packages/backend/src/apps/webhook/index.js @@ -1,5 +1,5 @@ -import defineApp from '../../helpers/define-app'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Webhook', diff --git a/packages/backend/src/apps/webhook/triggers/catch-raw-webhook/index.ts b/packages/backend/src/apps/webhook/triggers/catch-raw-webhook/index.js similarity index 87% rename from packages/backend/src/apps/webhook/triggers/catch-raw-webhook/index.ts rename to packages/backend/src/apps/webhook/triggers/catch-raw-webhook/index.js index 46873370..88bbb0a5 100644 --- a/packages/backend/src/apps/webhook/triggers/catch-raw-webhook/index.ts +++ b/packages/backend/src/apps/webhook/triggers/catch-raw-webhook/index.js @@ -1,6 +1,6 @@ import Crypto from 'crypto'; -import isEmpty from 'lodash/isEmpty'; -import defineTrigger from '../../../../helpers/define-trigger'; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'Catch raw webhook', diff --git a/packages/backend/src/apps/webhook/triggers/index.js b/packages/backend/src/apps/webhook/triggers/index.js new file mode 100644 index 00000000..166d4275 --- /dev/null +++ b/packages/backend/src/apps/webhook/triggers/index.js @@ -0,0 +1,3 @@ +import catchRawWebhook from './catch-raw-webhook/index.js'; + +export default [catchRawWebhook]; diff --git a/packages/backend/src/apps/webhook/triggers/index.ts b/packages/backend/src/apps/webhook/triggers/index.ts deleted file mode 100644 index 49159004..00000000 --- a/packages/backend/src/apps/webhook/triggers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import catchRawWebhook from './catch-raw-webhook'; - -export default [catchRawWebhook]; diff --git a/packages/backend/src/apps/wordpress/auth/generate-auth-url.ts b/packages/backend/src/apps/wordpress/auth/generate-auth-url.js similarity index 51% rename from packages/backend/src/apps/wordpress/auth/generate-auth-url.ts rename to packages/backend/src/apps/wordpress/auth/generate-auth-url.js index ef4e0b84..d7eeb961 100644 --- a/packages/backend/src/apps/wordpress/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/wordpress/auth/generate-auth-url.js @@ -1,10 +1,9 @@ import { URL, URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import appConfig from '../../../config/app'; -import getInstanceUrl from '../common/get-instance-url'; +import appConfig from '../../../config/app.js'; +import getInstanceUrl from '../common/get-instance-url.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const successUrl = new URL( '/app/wordpress/connections/add', appConfig.webAppUrl @@ -16,7 +15,10 @@ export default async function generateAuthUrl($: IGlobalVariable) { success_url: successUrl, }); - const url = new URL(`/wp-admin/authorize-application.php?${searchParams}`, baseUrl).toString(); + const url = new URL( + `/wp-admin/authorize-application.php?${searchParams}`, + baseUrl + ).toString(); await $.auth.set({ url, diff --git a/packages/backend/src/apps/wordpress/auth/index.ts b/packages/backend/src/apps/wordpress/auth/index.js similarity index 68% rename from packages/backend/src/apps/wordpress/auth/index.ts rename to packages/backend/src/apps/wordpress/auth/index.js index e4883f11..d906621e 100644 --- a/packages/backend/src/apps/wordpress/auth/index.ts +++ b/packages/backend/src/apps/wordpress/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import isStillVerified from './is-still-verified'; -import verifyCredentials from './verify-credentials'; +import generateAuthUrl from './generate-auth-url.js'; +import isStillVerified from './is-still-verified.js'; +import verifyCredentials from './verify-credentials.js'; export default { fields: [ { key: 'instanceUrl', label: 'WordPress instance URL', - type: 'string' as const, + type: 'string', required: false, readOnly: false, value: null, diff --git a/packages/backend/src/apps/wordpress/auth/is-still-verified.js b/packages/backend/src/apps/wordpress/auth/is-still-verified.js new file mode 100644 index 00000000..d77bac26 --- /dev/null +++ b/packages/backend/src/apps/wordpress/auth/is-still-verified.js @@ -0,0 +1,7 @@ +const isStillVerified = async ($) => { + await $.http.get('?rest_route=/wp/v2/settings'); + + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/wordpress/auth/is-still-verified.ts b/packages/backend/src/apps/wordpress/auth/is-still-verified.ts deleted file mode 100644 index 9cc179ed..00000000 --- a/packages/backend/src/apps/wordpress/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const isStillVerified = async ($: IGlobalVariable) => { - await $.http.get('?rest_route=/wp/v2/settings'); - - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/wordpress/auth/verify-credentials.js b/packages/backend/src/apps/wordpress/auth/verify-credentials.js new file mode 100644 index 00000000..b1cf86ba --- /dev/null +++ b/packages/backend/src/apps/wordpress/auth/verify-credentials.js @@ -0,0 +1,22 @@ +const verifyCredentials = async ($) => { + const instanceUrl = $.auth.data.instanceUrl; + const password = $.auth.data.password; + const siteUrl = $.auth.data.site_url; + const url = $.auth.data.url; + const userLogin = $.auth.data.user_login; + + if (!password) { + throw new Error('Failed while authorizing!'); + } + + await $.auth.set({ + screenName: `${userLogin} @ ${siteUrl}`, + instanceUrl, + password, + siteUrl, + url, + userLogin, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/wordpress/auth/verify-credentials.ts b/packages/backend/src/apps/wordpress/auth/verify-credentials.ts deleted file mode 100644 index 0c9f4f73..00000000 --- a/packages/backend/src/apps/wordpress/auth/verify-credentials.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const verifyCredentials = async ($: IGlobalVariable) => { - const instanceUrl = $.auth.data.instanceUrl as string; - const password = $.auth.data.password as string; - const siteUrl = $.auth.data.site_url as string; - const url = $.auth.data.url as string; - const userLogin = $.auth.data.user_login as string; - - if (!password) { - throw new Error('Failed while authorizing!'); - } - - await $.auth.set({ - screenName: `${userLogin} @ ${siteUrl}`, - instanceUrl, - password, - siteUrl, - url, - userLogin, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/wordpress/common/add-auth-header.js b/packages/backend/src/apps/wordpress/common/add-auth-header.js new file mode 100644 index 00000000..e3a668c6 --- /dev/null +++ b/packages/backend/src/apps/wordpress/common/add-auth-header.js @@ -0,0 +1,15 @@ +const addAuthHeader = ($, requestConfig) => { + const userLogin = $.auth.data.userLogin; + const password = $.auth.data.password; + + if (userLogin && password) { + requestConfig.auth = { + username: userLogin, + password, + }; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/wordpress/common/add-auth-header.ts b/packages/backend/src/apps/wordpress/common/add-auth-header.ts deleted file mode 100644 index af5f1237..00000000 --- a/packages/backend/src/apps/wordpress/common/add-auth-header.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - const userLogin = $.auth.data.userLogin as string; - const password = $.auth.data.password as string; - - if (userLogin && password) { - requestConfig.auth = { - username: userLogin, - password, - }; - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/wordpress/common/get-instance-url.js b/packages/backend/src/apps/wordpress/common/get-instance-url.js new file mode 100644 index 00000000..0d7125a3 --- /dev/null +++ b/packages/backend/src/apps/wordpress/common/get-instance-url.js @@ -0,0 +1,5 @@ +const getInstanceUrl = ($) => { + return $.auth.data.instanceUrl; +}; + +export default getInstanceUrl; diff --git a/packages/backend/src/apps/wordpress/common/get-instance-url.ts b/packages/backend/src/apps/wordpress/common/get-instance-url.ts deleted file mode 100644 index 72b9bc73..00000000 --- a/packages/backend/src/apps/wordpress/common/get-instance-url.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getInstanceUrl = ($: IGlobalVariable): string => { - return $.auth.data.instanceUrl as string; -}; - -export default getInstanceUrl; diff --git a/packages/backend/src/apps/wordpress/common/set-base-url.js b/packages/backend/src/apps/wordpress/common/set-base-url.js new file mode 100644 index 00000000..def1330c --- /dev/null +++ b/packages/backend/src/apps/wordpress/common/set-base-url.js @@ -0,0 +1,10 @@ +const setBaseUrl = ($, requestConfig) => { + const instanceUrl = $.auth.data.instanceUrl; + if (instanceUrl) { + requestConfig.baseURL = instanceUrl; + } + + return requestConfig; +}; + +export default setBaseUrl; diff --git a/packages/backend/src/apps/wordpress/common/set-base-url.ts b/packages/backend/src/apps/wordpress/common/set-base-url.ts deleted file mode 100644 index f02c49e9..00000000 --- a/packages/backend/src/apps/wordpress/common/set-base-url.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const setBaseUrl: TBeforeRequest = ($, requestConfig) => { - const instanceUrl = $.auth.data.instanceUrl as string; - if (instanceUrl) { - requestConfig.baseURL = instanceUrl; - } - - return requestConfig; -}; - -export default setBaseUrl; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/index.js b/packages/backend/src/apps/wordpress/dynamic-data/index.js new file mode 100644 index 00000000..ce289b38 --- /dev/null +++ b/packages/backend/src/apps/wordpress/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listStatuses from './list-statuses/index.js'; + +export default [listStatuses]; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/index.ts b/packages/backend/src/apps/wordpress/dynamic-data/index.ts deleted file mode 100644 index 640a00f3..00000000 --- a/packages/backend/src/apps/wordpress/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listStatuses from './list-statuses'; - -export default [listStatuses]; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-statuses/index.ts b/packages/backend/src/apps/wordpress/dynamic-data/list-statuses/index.js similarity index 52% rename from packages/backend/src/apps/wordpress/dynamic-data/list-statuses/index.ts rename to packages/backend/src/apps/wordpress/dynamic-data/list-statuses/index.js index 658c7461..f457228b 100644 --- a/packages/backend/src/apps/wordpress/dynamic-data/list-statuses/index.ts +++ b/packages/backend/src/apps/wordpress/dynamic-data/list-statuses/index.js @@ -1,23 +1,13 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -type Status = { - slug: string; - name: string; -}; -type Statuses = Record; - export default { name: 'List statuses', key: 'listStatuses', - async run($: IGlobalVariable) { - const statuses: { - data: IJSONObject[]; - } = { + async run($) { + const statuses = { data: [], }; - const { data } = await $.http.get('?rest_route=/wp/v2/statuses'); + const { data } = await $.http.get('?rest_route=/wp/v2/statuses'); if (!data) return statuses; diff --git a/packages/backend/src/apps/wordpress/index.d.ts b/packages/backend/src/apps/wordpress/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/wordpress/index.ts b/packages/backend/src/apps/wordpress/index.js similarity index 57% rename from packages/backend/src/apps/wordpress/index.ts rename to packages/backend/src/apps/wordpress/index.js index 521f7e93..f0c48b94 100644 --- a/packages/backend/src/apps/wordpress/index.ts +++ b/packages/backend/src/apps/wordpress/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import setBaseUrl from './common/set-base-url'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import setBaseUrl from './common/set-base-url.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'WordPress', diff --git a/packages/backend/src/apps/wordpress/triggers/index.js b/packages/backend/src/apps/wordpress/triggers/index.js new file mode 100644 index 00000000..619c8ca1 --- /dev/null +++ b/packages/backend/src/apps/wordpress/triggers/index.js @@ -0,0 +1,5 @@ +import newComment from './new-comment/index.js'; +import newPage from './new-page/index.js'; +import newPost from './new-post/index.js'; + +export default [newComment, newPage, newPost]; diff --git a/packages/backend/src/apps/wordpress/triggers/index.ts b/packages/backend/src/apps/wordpress/triggers/index.ts deleted file mode 100644 index 3abd95e0..00000000 --- a/packages/backend/src/apps/wordpress/triggers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import newComment from './new-comment'; -import newPage from './new-page'; -import newPost from './new-post'; - -export default [newComment, newPage, newPost]; diff --git a/packages/backend/src/apps/wordpress/triggers/new-comment/index.ts b/packages/backend/src/apps/wordpress/triggers/new-comment/index.js similarity index 92% rename from packages/backend/src/apps/wordpress/triggers/new-comment/index.ts rename to packages/backend/src/apps/wordpress/triggers/new-comment/index.js index 694453b2..3ab2423e 100644 --- a/packages/backend/src/apps/wordpress/triggers/new-comment/index.ts +++ b/packages/backend/src/apps/wordpress/triggers/new-comment/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New comment', @@ -8,7 +8,7 @@ export default defineTrigger({ { label: 'Status', key: 'status', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, options: [ diff --git a/packages/backend/src/apps/wordpress/triggers/new-page/index.ts b/packages/backend/src/apps/wordpress/triggers/new-page/index.js similarity index 92% rename from packages/backend/src/apps/wordpress/triggers/new-page/index.ts rename to packages/backend/src/apps/wordpress/triggers/new-page/index.js index 5eaa6d5d..3fb5086e 100644 --- a/packages/backend/src/apps/wordpress/triggers/new-page/index.ts +++ b/packages/backend/src/apps/wordpress/triggers/new-page/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New page', @@ -8,7 +8,7 @@ export default defineTrigger({ { label: 'Status', key: 'status', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { diff --git a/packages/backend/src/apps/wordpress/triggers/new-post/index.ts b/packages/backend/src/apps/wordpress/triggers/new-post/index.js similarity index 83% rename from packages/backend/src/apps/wordpress/triggers/new-post/index.ts rename to packages/backend/src/apps/wordpress/triggers/new-post/index.js index 5d481980..8b8dec79 100644 --- a/packages/backend/src/apps/wordpress/triggers/new-post/index.ts +++ b/packages/backend/src/apps/wordpress/triggers/new-post/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New post', @@ -8,7 +8,7 @@ export default defineTrigger({ { label: 'Status', key: 'status', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -35,10 +35,9 @@ export default defineTrigger({ let totalPages = 1; do { - const { - data, - headers - } = await $.http.get('?rest_route=/wp/v2/posts', { params }); + const { data, headers } = await $.http.get('?rest_route=/wp/v2/posts', { + params, + }); params.page = params.page + 1; totalPages = Number(headers['x-wp-totalpages']); diff --git a/packages/backend/src/apps/xero/auth/generate-auth-url.ts b/packages/backend/src/apps/xero/auth/generate-auth-url.js similarity index 52% rename from packages/backend/src/apps/xero/auth/generate-auth-url.ts rename to packages/backend/src/apps/xero/auth/generate-auth-url.js index aafd873e..e535dce5 100644 --- a/packages/backend/src/apps/xero/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/xero/auth/generate-auth-url.js @@ -1,15 +1,14 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ response_type: 'code', - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, scope: authScope.join(' '), redirect_uri: redirectUri, }); diff --git a/packages/backend/src/apps/xero/auth/index.ts b/packages/backend/src/apps/xero/auth/index.js similarity index 74% rename from packages/backend/src/apps/xero/auth/index.ts rename to packages/backend/src/apps/xero/auth/index.js index fe93971d..d84c9a7b 100644 --- a/packages/backend/src/apps/xero/auth/index.ts +++ b/packages/backend/src/apps/xero/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/xero/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/xero/auth/is-still-verified.js b/packages/backend/src/apps/xero/auth/is-still-verified.js new file mode 100644 index 00000000..45b89a69 --- /dev/null +++ b/packages/backend/src/apps/xero/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.tenantName; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/xero/auth/is-still-verified.ts b/packages/backend/src/apps/xero/auth/is-still-verified.ts deleted file mode 100644 index f49edd77..00000000 --- a/packages/backend/src/apps/xero/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.tenantName; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/xero/auth/refresh-token.ts b/packages/backend/src/apps/xero/auth/refresh-token.js similarity index 79% rename from packages/backend/src/apps/xero/auth/refresh-token.ts rename to packages/backend/src/apps/xero/auth/refresh-token.js index da36261f..75d1c21c 100644 --- a/packages/backend/src/apps/xero/auth/refresh-token.ts +++ b/packages/backend/src/apps/xero/auth/refresh-token.js @@ -1,8 +1,8 @@ import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import authScope from '../common/auth-scope'; -const refreshToken = async ($: IGlobalVariable) => { +import authScope from '../common/auth-scope.js'; + +const refreshToken = async ($) => { const headers = { Authorization: `Basic ${Buffer.from( $.auth.data.clientId + ':' + $.auth.data.clientSecret @@ -12,7 +12,7 @@ const refreshToken = async ($: IGlobalVariable) => { const params = new URLSearchParams({ grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, + refresh_token: $.auth.data.refreshToken, }); const { data } = await $.http.post( diff --git a/packages/backend/src/apps/xero/auth/verify-credentials.ts b/packages/backend/src/apps/xero/auth/verify-credentials.js similarity index 77% rename from packages/backend/src/apps/xero/auth/verify-credentials.ts rename to packages/backend/src/apps/xero/auth/verify-credentials.js index 2b5770fe..61170d1a 100644 --- a/packages/backend/src/apps/xero/auth/verify-credentials.ts +++ b/packages/backend/src/apps/xero/auth/verify-credentials.js @@ -1,12 +1,11 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; +import getCurrentUser from '../common/get-current-user.js'; import { URLSearchParams } from 'url'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const headers = { Authorization: `Basic ${Buffer.from( $.auth.data.clientId + ':' + $.auth.data.clientSecret @@ -15,7 +14,7 @@ const verifyCredentials = async ($: IGlobalVariable) => { }; const params = new URLSearchParams({ grant_type: 'authorization_code', - code: $.auth.data.code as string, + code: $.auth.data.code, redirect_uri: redirectUri, }); diff --git a/packages/backend/src/apps/xero/common/add-auth-header.ts b/packages/backend/src/apps/xero/common/add-auth-header.js similarity index 74% rename from packages/backend/src/apps/xero/common/add-auth-header.ts rename to packages/backend/src/apps/xero/common/add-auth-header.js index 36e42e0f..045e4d21 100644 --- a/packages/backend/src/apps/xero/common/add-auth-header.ts +++ b/packages/backend/src/apps/xero/common/add-auth-header.js @@ -1,6 +1,4 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { if (requestConfig.additionalProperties?.skipAddingAuthHeader) return requestConfig; @@ -9,7 +7,7 @@ const addAuthHeader: TBeforeRequest = ($, requestConfig) => { } if ($.auth.data?.tenantId) { - requestConfig.headers['Xero-tenant-id'] = $.auth.data.tenantId as string; + requestConfig.headers['Xero-tenant-id'] = $.auth.data.tenantId; } return requestConfig; diff --git a/packages/backend/src/apps/xero/common/auth-scope.ts b/packages/backend/src/apps/xero/common/auth-scope.js similarity index 82% rename from packages/backend/src/apps/xero/common/auth-scope.ts rename to packages/backend/src/apps/xero/common/auth-scope.js index 85ae1d3c..6a4b5483 100644 --- a/packages/backend/src/apps/xero/common/auth-scope.ts +++ b/packages/backend/src/apps/xero/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'offline_access', 'openid', 'profile', diff --git a/packages/backend/src/apps/xero/common/get-current-user.ts b/packages/backend/src/apps/xero/common/get-current-user.js similarity index 53% rename from packages/backend/src/apps/xero/common/get-current-user.ts rename to packages/backend/src/apps/xero/common/get-current-user.js index 2eb6b308..0bc69161 100644 --- a/packages/backend/src/apps/xero/common/get-current-user.ts +++ b/packages/backend/src/apps/xero/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { +const getCurrentUser = async ($) => { const { data: currentUser } = await $.http.get('/connections'); return currentUser[0]; }; diff --git a/packages/backend/src/apps/xero/dynamic-data/index.js b/packages/backend/src/apps/xero/dynamic-data/index.js new file mode 100644 index 00000000..de48bc3f --- /dev/null +++ b/packages/backend/src/apps/xero/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listOrganizations from './list-organizations/index.js'; + +export default [listOrganizations]; diff --git a/packages/backend/src/apps/xero/dynamic-data/index.ts b/packages/backend/src/apps/xero/dynamic-data/index.ts deleted file mode 100644 index 8d8bd601..00000000 --- a/packages/backend/src/apps/xero/dynamic-data/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import listOrganizations from './list-organizations'; - -export default [listOrganizations]; diff --git a/packages/backend/src/apps/xero/dynamic-data/list-organizations/index.ts b/packages/backend/src/apps/xero/dynamic-data/list-organizations/index.js similarity index 72% rename from packages/backend/src/apps/xero/dynamic-data/list-organizations/index.ts rename to packages/backend/src/apps/xero/dynamic-data/list-organizations/index.js index a8bc6406..ea16b5a2 100644 --- a/packages/backend/src/apps/xero/dynamic-data/list-organizations/index.ts +++ b/packages/backend/src/apps/xero/dynamic-data/list-organizations/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List organizations', key: 'listOrganizations', - async run($: IGlobalVariable) { - const organizations: { - data: IJSONObject[]; - } = { + async run($) { + const organizations = { data: [], }; diff --git a/packages/backend/src/apps/xero/index.d.ts b/packages/backend/src/apps/xero/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/xero/index.ts b/packages/backend/src/apps/xero/index.js similarity index 61% rename from packages/backend/src/apps/xero/index.ts rename to packages/backend/src/apps/xero/index.js index b8915616..987c12e0 100644 --- a/packages/backend/src/apps/xero/index.ts +++ b/packages/backend/src/apps/xero/index.js @@ -1,8 +1,8 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Xero', diff --git a/packages/backend/src/apps/xero/triggers/index.js b/packages/backend/src/apps/xero/triggers/index.js new file mode 100644 index 00000000..e4b774bf --- /dev/null +++ b/packages/backend/src/apps/xero/triggers/index.js @@ -0,0 +1,4 @@ +import newBankTransactions from './new-bank-transactions/index.js'; +import newPayments from './new-payments/index.js'; + +export default [newBankTransactions, newPayments]; diff --git a/packages/backend/src/apps/xero/triggers/index.ts b/packages/backend/src/apps/xero/triggers/index.ts deleted file mode 100644 index 49909def..00000000 --- a/packages/backend/src/apps/xero/triggers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import newBankTransactions from './new-bank-transactions'; -import newPayments from './new-payments'; - -export default [newBankTransactions, newPayments]; diff --git a/packages/backend/src/apps/xero/triggers/new-bank-transactions/index.ts b/packages/backend/src/apps/xero/triggers/new-bank-transactions/index.js similarity index 92% rename from packages/backend/src/apps/xero/triggers/new-bank-transactions/index.ts rename to packages/backend/src/apps/xero/triggers/new-bank-transactions/index.js index aaf8080d..b1f012e1 100644 --- a/packages/backend/src/apps/xero/triggers/new-bank-transactions/index.ts +++ b/packages/backend/src/apps/xero/triggers/new-bank-transactions/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New bank transactions', @@ -9,7 +9,7 @@ export default defineTrigger({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: '', variables: true, diff --git a/packages/backend/src/apps/xero/triggers/new-payments/index.ts b/packages/backend/src/apps/xero/triggers/new-payments/index.js similarity index 90% rename from packages/backend/src/apps/xero/triggers/new-payments/index.ts rename to packages/backend/src/apps/xero/triggers/new-payments/index.js index 2ca90173..fbd8bd72 100644 --- a/packages/backend/src/apps/xero/triggers/new-payments/index.ts +++ b/packages/backend/src/apps/xero/triggers/new-payments/index.js @@ -1,10 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; - -type Params = { - page: number; - order: string; - where?: string; -}; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New payments', @@ -15,7 +9,7 @@ export default defineTrigger({ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: true, description: '', variables: true, @@ -33,7 +27,7 @@ export default defineTrigger({ { label: 'Payment Type', key: 'paymentType', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: '', variables: true, @@ -72,7 +66,7 @@ export default defineTrigger({ async run($) { const paymentType = $.step.parameters.paymentType; - const params: Params = { + const params = { page: 1, order: 'Date DESC', }; diff --git a/packages/backend/src/apps/youtube/auth/generate-auth-url.js b/packages/backend/src/apps/youtube/auth/generate-auth-url.js new file mode 100644 index 00000000..093f34b7 --- /dev/null +++ b/packages/backend/src/apps/youtube/auth/generate-auth-url.js @@ -0,0 +1,23 @@ +import { URLSearchParams } from 'url'; +import authScope from '../common/auth-scope.js'; + +export default async function generateAuthUrl($) { + const oauthRedirectUrlField = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ); + const redirectUri = oauthRedirectUrlField.value; + const searchParams = new URLSearchParams({ + client_id: $.auth.data.clientId, + redirect_uri: redirectUri, + response_type: 'code', + scope: authScope.join(' '), + access_type: 'offline', + prompt: 'select_account', + }); + + const url = `https://accounts.google.com/o/oauth2/v2/auth?${searchParams.toString()}`; + + await $.auth.set({ + url, + }); +} diff --git a/packages/backend/src/apps/youtube/auth/generate-auth-url.ts b/packages/backend/src/apps/youtube/auth/generate-auth-url.ts deleted file mode 100644 index ba34918c..00000000 --- a/packages/backend/src/apps/youtube/auth/generate-auth-url.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; - -export default async function generateAuthUrl($: IGlobalVariable) { - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const redirectUri = oauthRedirectUrlField.value as string; - const searchParams = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - redirect_uri: redirectUri, - response_type: 'code', - scope: authScope.join(' '), - access_type: 'offline', - prompt: 'select_account', - }); - - const url = `https://accounts.google.com/o/oauth2/v2/auth?${searchParams.toString()}`; - - await $.auth.set({ - url, - }); -} diff --git a/packages/backend/src/apps/youtube/auth/index.ts b/packages/backend/src/apps/youtube/auth/index.js similarity index 74% rename from packages/backend/src/apps/youtube/auth/index.ts rename to packages/backend/src/apps/youtube/auth/index.js index f560270b..0504b1df 100644 --- a/packages/backend/src/apps/youtube/auth/index.ts +++ b/packages/backend/src/apps/youtube/auth/index.js @@ -1,14 +1,14 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import refreshToken from './refresh-token'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import refreshToken from './refresh-token.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/youtube/connections/add', @@ -20,7 +20,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -31,7 +31,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/youtube/auth/is-still-verified.js b/packages/backend/src/apps/youtube/auth/is-still-verified.js new file mode 100644 index 00000000..68f4d7db --- /dev/null +++ b/packages/backend/src/apps/youtube/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + const currentUser = await getCurrentUser($); + return !!currentUser.resourceName; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/youtube/auth/is-still-verified.ts b/packages/backend/src/apps/youtube/auth/is-still-verified.ts deleted file mode 100644 index c46fa18b..00000000 --- a/packages/backend/src/apps/youtube/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - const currentUser = await getCurrentUser($); - return !!currentUser.resourceName; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/youtube/auth/refresh-token.js b/packages/backend/src/apps/youtube/auth/refresh-token.js new file mode 100644 index 00000000..7c5b7020 --- /dev/null +++ b/packages/backend/src/apps/youtube/auth/refresh-token.js @@ -0,0 +1,26 @@ +import { URLSearchParams } from 'node:url'; + +import authScope from '../common/auth-scope.js'; + +const refreshToken = async ($) => { + const params = new URLSearchParams({ + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + grant_type: 'refresh_token', + refresh_token: $.auth.data.refreshToken, + }); + + const { data } = await $.http.post( + 'https://oauth2.googleapis.com/token', + params.toString() + ); + + await $.auth.set({ + accessToken: data.access_token, + expiresIn: data.expires_in, + scope: authScope.join(' '), + tokenType: data.token_type, + }); +}; + +export default refreshToken; diff --git a/packages/backend/src/apps/youtube/auth/refresh-token.ts b/packages/backend/src/apps/youtube/auth/refresh-token.ts deleted file mode 100644 index 17d0c4cc..00000000 --- a/packages/backend/src/apps/youtube/auth/refresh-token.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { URLSearchParams } from 'node:url'; -import { IGlobalVariable } from '@automatisch/types'; -import authScope from '../common/auth-scope'; - -const refreshToken = async ($: IGlobalVariable) => { - const params = new URLSearchParams({ - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, - grant_type: 'refresh_token', - refresh_token: $.auth.data.refreshToken as string, - }); - - const { data } = await $.http.post( - 'https://oauth2.googleapis.com/token', - params.toString() - ); - - await $.auth.set({ - accessToken: data.access_token, - expiresIn: data.expires_in, - scope: authScope.join(' '), - tokenType: data.token_type, - }); -}; - -export default refreshToken; diff --git a/packages/backend/src/apps/youtube/auth/verify-credentials.js b/packages/backend/src/apps/youtube/auth/verify-credentials.js new file mode 100644 index 00000000..a636b72c --- /dev/null +++ b/packages/backend/src/apps/youtube/auth/verify-credentials.js @@ -0,0 +1,42 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const verifyCredentials = async ($) => { + const oauthRedirectUrlField = $.app.auth.fields.find( + (field) => field.key == 'oAuthRedirectUrl' + ); + const redirectUri = oauthRedirectUrlField.value; + const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, + code: $.auth.data.code, + grant_type: 'authorization_code', + redirect_uri: redirectUri, + }); + + await $.auth.set({ + accessToken: data.access_token, + tokenType: data.token_type, + }); + + const currentUser = await getCurrentUser($); + + const { displayName } = currentUser.names.find( + (name) => name.metadata.primary + ); + const { value: email } = currentUser.emailAddresses.find( + (emailAddress) => emailAddress.metadata.primary + ); + + await $.auth.set({ + clientId: $.auth.data.clientId, + clientSecret: $.auth.data.clientSecret, + scope: $.auth.data.scope, + idToken: data.id_token, + expiresIn: data.expires_in, + refreshToken: data.refresh_token, + resourceName: currentUser.resourceName, + screenName: `${displayName} - ${email}`, + }); +}; + +export default verifyCredentials; diff --git a/packages/backend/src/apps/youtube/auth/verify-credentials.ts b/packages/backend/src/apps/youtube/auth/verify-credentials.ts deleted file mode 100644 index 124e73c1..00000000 --- a/packages/backend/src/apps/youtube/auth/verify-credentials.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -type TUser = { - displayName: string; - metadata: { - primary: boolean; - }; -}; - -type TEmailAddress = { - value: string; - metadata: { - primary: boolean; - }; -}; - -const verifyCredentials = async ($: IGlobalVariable) => { - const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' - ); - const redirectUri = oauthRedirectUrlField.value as string; - const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, { - client_id: $.auth.data.clientId, - client_secret: $.auth.data.clientSecret, - code: $.auth.data.code, - grant_type: 'authorization_code', - redirect_uri: redirectUri, - }); - - await $.auth.set({ - accessToken: data.access_token, - tokenType: data.token_type, - }); - - const currentUser = await getCurrentUser($); - - const { displayName } = currentUser.names.find( - (name: TUser) => name.metadata.primary - ); - const { value: email } = currentUser.emailAddresses.find( - (emailAddress: TEmailAddress) => emailAddress.metadata.primary - ); - - await $.auth.set({ - clientId: $.auth.data.clientId, - clientSecret: $.auth.data.clientSecret, - scope: $.auth.data.scope, - idToken: data.id_token, - expiresIn: data.expires_in, - refreshToken: data.refresh_token, - resourceName: currentUser.resourceName, - screenName: `${displayName} - ${email}`, - }); -}; - -export default verifyCredentials; diff --git a/packages/backend/src/apps/youtube/common/add-auth-header.js b/packages/backend/src/apps/youtube/common/add-auth-header.js new file mode 100644 index 00000000..02477aa4 --- /dev/null +++ b/packages/backend/src/apps/youtube/common/add-auth-header.js @@ -0,0 +1,9 @@ +const addAuthHeader = ($, requestConfig) => { + if ($.auth.data?.accessToken) { + requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; + } + + return requestConfig; +}; + +export default addAuthHeader; diff --git a/packages/backend/src/apps/youtube/common/add-auth-header.ts b/packages/backend/src/apps/youtube/common/add-auth-header.ts deleted file mode 100644 index 8e7798b8..00000000 --- a/packages/backend/src/apps/youtube/common/add-auth-header.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { - if ($.auth.data?.accessToken) { - requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; - } - - return requestConfig; -}; - -export default addAuthHeader; diff --git a/packages/backend/src/apps/youtube/common/auth-scope.ts b/packages/backend/src/apps/youtube/common/auth-scope.js similarity index 90% rename from packages/backend/src/apps/youtube/common/auth-scope.ts rename to packages/backend/src/apps/youtube/common/auth-scope.js index c04b848b..fdee5490 100644 --- a/packages/backend/src/apps/youtube/common/auth-scope.ts +++ b/packages/backend/src/apps/youtube/common/auth-scope.js @@ -1,4 +1,4 @@ -const authScope: string[] = [ +const authScope = [ 'https://www.googleapis.com/auth/youtube', 'https://www.googleapis.com/auth/youtube.readonly', 'https://www.googleapis.com/auth/youtube.upload', diff --git a/packages/backend/src/apps/youtube/common/get-current-user.js b/packages/backend/src/apps/youtube/common/get-current-user.js new file mode 100644 index 00000000..2663ad20 --- /dev/null +++ b/packages/backend/src/apps/youtube/common/get-current-user.js @@ -0,0 +1,8 @@ +const getCurrentUser = async ($) => { + const { data: currentUser } = await $.http.get( + 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' + ); + return currentUser; +}; + +export default getCurrentUser; diff --git a/packages/backend/src/apps/youtube/common/get-current-user.ts b/packages/backend/src/apps/youtube/common/get-current-user.ts deleted file mode 100644 index 724fe1ac..00000000 --- a/packages/backend/src/apps/youtube/common/get-current-user.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable) => { - const { data: currentUser } = await $.http.get( - 'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses' - ); - return currentUser; -}; - -export default getCurrentUser; diff --git a/packages/backend/src/apps/youtube/index.d.ts b/packages/backend/src/apps/youtube/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/youtube/index.ts b/packages/backend/src/apps/youtube/index.js similarity index 67% rename from packages/backend/src/apps/youtube/index.ts rename to packages/backend/src/apps/youtube/index.js index 0f9a0ef4..ebcaaaf7 100644 --- a/packages/backend/src/apps/youtube/index.ts +++ b/packages/backend/src/apps/youtube/index.js @@ -1,7 +1,7 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-header'; -import auth from './auth'; -import triggers from './triggers'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-header.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Youtube', diff --git a/packages/backend/src/apps/youtube/triggers/index.js b/packages/backend/src/apps/youtube/triggers/index.js new file mode 100644 index 00000000..e5b4e02a --- /dev/null +++ b/packages/backend/src/apps/youtube/triggers/index.js @@ -0,0 +1,4 @@ +import newVideoInChannel from './new-video-in-channel/index.js'; +import newVideoBySearch from './new-video-by-search/index.js'; + +export default [newVideoBySearch, newVideoInChannel]; diff --git a/packages/backend/src/apps/youtube/triggers/index.ts b/packages/backend/src/apps/youtube/triggers/index.ts deleted file mode 100644 index 21aad966..00000000 --- a/packages/backend/src/apps/youtube/triggers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import newVideoInChannel from './new-video-in-channel'; -import newVideoBySearch from './new-video-by-search'; - -export default [newVideoBySearch, newVideoInChannel]; diff --git a/packages/backend/src/apps/youtube/triggers/new-video-by-search/index.ts b/packages/backend/src/apps/youtube/triggers/new-video-by-search/index.js similarity index 86% rename from packages/backend/src/apps/youtube/triggers/new-video-by-search/index.ts rename to packages/backend/src/apps/youtube/triggers/new-video-by-search/index.js index c61cb6fe..13ed2733 100644 --- a/packages/backend/src/apps/youtube/triggers/new-video-by-search/index.ts +++ b/packages/backend/src/apps/youtube/triggers/new-video-by-search/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New video by search', @@ -9,7 +9,7 @@ export default defineTrigger({ { label: 'Query', key: 'query', - type: 'string' as const, + type: 'string', required: true, description: 'Search for videos that match this query.', variables: true, @@ -20,7 +20,7 @@ export default defineTrigger({ const query = $.step.parameters.query; const params = { - pageToken: undefined as unknown as string, + pageToken: undefined, part: 'snippet', q: query, maxResults: 50, diff --git a/packages/backend/src/apps/youtube/triggers/new-video-in-channel/index.ts b/packages/backend/src/apps/youtube/triggers/new-video-in-channel/index.js similarity index 84% rename from packages/backend/src/apps/youtube/triggers/new-video-in-channel/index.ts rename to packages/backend/src/apps/youtube/triggers/new-video-in-channel/index.js index 440a0972..2bcc51a5 100644 --- a/packages/backend/src/apps/youtube/triggers/new-video-in-channel/index.ts +++ b/packages/backend/src/apps/youtube/triggers/new-video-in-channel/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New video in channel', @@ -9,7 +9,7 @@ export default defineTrigger({ { label: 'Channel', key: 'channelId', - type: 'string' as const, + type: 'string', required: true, description: 'Get the new videos uploaded to this channel. If the URL of the youtube channel looks like this www.youtube.com/channel/UCbxb2fqe9oNgglAoYqsYOtQ then you must use UCbxb2fqe9oNgglAoYqsYOtQ as a value in this field.', @@ -18,10 +18,10 @@ export default defineTrigger({ ], async run($) { - const channelId = $.step.parameters.channelId as string; + const channelId = $.step.parameters.channelId; const params = { - pageToken: undefined as unknown as string, + pageToken: undefined, part: 'snippet', channelId: channelId, maxResults: 50, diff --git a/packages/backend/src/apps/zendesk/actions/create-ticket/fields.ts b/packages/backend/src/apps/zendesk/actions/create-ticket/fields.js similarity index 90% rename from packages/backend/src/apps/zendesk/actions/create-ticket/fields.ts rename to packages/backend/src/apps/zendesk/actions/create-ticket/fields.js index 390f5f3e..e40da2be 100644 --- a/packages/backend/src/apps/zendesk/actions/create-ticket/fields.ts +++ b/packages/backend/src/apps/zendesk/actions/create-ticket/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Subject', key: 'subject', - type: 'string' as const, + type: 'string', required: true, variables: true, description: '', @@ -10,7 +10,7 @@ export const fields = [ { label: 'Assignee', key: 'assigneeId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: @@ -37,14 +37,14 @@ export const fields = [ { label: 'Collaborators', key: 'collaborators', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Collaborator', key: 'collaborator', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -68,7 +68,7 @@ export const fields = [ { label: 'Collaborator Emails', key: 'collaboratorEmails', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: 'You have the option to include individuals who are not Zendesk users as Collaborators by adding their email addresses here.', @@ -76,7 +76,7 @@ export const fields = [ { label: 'Collaborator Email', key: 'collaboratorEmail', - type: 'string' as const, + type: 'string', required: false, variables: true, description: '', @@ -86,7 +86,7 @@ export const fields = [ { label: 'Group', key: 'groupId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: 'Allocate this ticket to a specific group.', @@ -104,7 +104,7 @@ export const fields = [ { label: 'Requester Name', key: 'requesterName', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -113,7 +113,7 @@ export const fields = [ { label: 'Requester Email', key: 'requesterEmail', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -122,7 +122,7 @@ export const fields = [ { label: 'First Comment/Description Format', key: 'format', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -134,7 +134,7 @@ export const fields = [ { label: 'First Comment/Description', key: 'comment', - type: 'string' as const, + type: 'string', required: true, variables: true, description: '', @@ -142,7 +142,7 @@ export const fields = [ { label: 'Should the first comment be public?', key: 'publicOrNot', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -154,7 +154,7 @@ export const fields = [ { label: 'Tags', key: 'tags', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'A comma separated list of tags.', @@ -162,7 +162,7 @@ export const fields = [ { label: 'Status', key: 'status', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -178,7 +178,7 @@ export const fields = [ { label: 'Type', key: 'type', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -192,7 +192,7 @@ export const fields = [ { label: 'Due At', key: 'dueAt', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'Limited to tickets typed as "task".', @@ -200,7 +200,7 @@ export const fields = [ { label: 'Priority', key: 'priority', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -214,7 +214,7 @@ export const fields = [ { label: 'Submitter', key: 'submitterId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -236,7 +236,7 @@ export const fields = [ { label: 'Ticket Form', key: 'ticketForm', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: @@ -255,14 +255,14 @@ export const fields = [ { label: 'Sharing Agreements', key: 'sharingAgreements', - type: 'dynamic' as const, + type: 'dynamic', required: false, description: '', fields: [ { label: 'Sharing Agreement', key: 'sharingAgreement', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -282,7 +282,7 @@ export const fields = [ { label: 'Brand', key: 'brandId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: diff --git a/packages/backend/src/apps/zendesk/actions/create-ticket/index.ts b/packages/backend/src/apps/zendesk/actions/create-ticket/index.js similarity index 70% rename from packages/backend/src/apps/zendesk/actions/create-ticket/index.ts rename to packages/backend/src/apps/zendesk/actions/create-ticket/index.js index 942b54a5..05e737eb 100644 --- a/packages/backend/src/apps/zendesk/actions/create-ticket/index.ts +++ b/packages/backend/src/apps/zendesk/actions/create-ticket/index.js @@ -1,11 +1,6 @@ -import { IJSONArray, IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; -import { fields } from './fields'; -import isEmpty from 'lodash/isEmpty'; - -type Payload = { - ticket: IJSONObject; -}; +import defineAction from '../../../../helpers/define-action.js'; +import { fields } from './fields.js'; +import isEmpty from 'lodash/isEmpty.js'; export default defineAction({ name: 'Create ticket', @@ -32,15 +27,14 @@ export default defineAction({ brandId, } = $.step.parameters; - const collaborators = $.step.parameters.collaborators as IJSONArray; + const collaborators = $.step.parameters.collaborators; const collaboratorIds = collaborators?.map( - (collaborator: IJSONObject) => collaborator.collaborator + (collaborator) => collaborator.collaborator ); - const collaboratorEmails = $.step.parameters - .collaboratorEmails as IJSONArray; + const collaboratorEmails = $.step.parameters.collaboratorEmails; const formattedCollaboratorEmails = collaboratorEmails?.map( - (collaboratorEmail: IJSONObject) => collaboratorEmail.collaboratorEmail + (collaboratorEmail) => collaboratorEmail.collaboratorEmail ); const formattedCollaborators = [ @@ -48,17 +42,15 @@ export default defineAction({ ...formattedCollaboratorEmails, ]; - const sharingAgreements = $.step.parameters.sharingAgreements as IJSONArray; + const sharingAgreements = $.step.parameters.sharingAgreements; const sharingAgreementIds = sharingAgreements ?.filter(isEmpty) - .map((sharingAgreement: IJSONObject) => - Number(sharingAgreement.sharingAgreement) - ); + .map((sharingAgreement) => Number(sharingAgreement.sharingAgreement)); - const tags = $.step.parameters.tags as string; + const tags = $.step.parameters.tags; const formattedTags = tags.split(','); - const payload: Payload = { + const payload = { ticket: { subject, assignee_id: assigneeId, diff --git a/packages/backend/src/apps/zendesk/actions/create-user/fields.ts b/packages/backend/src/apps/zendesk/actions/create-user/fields.js similarity index 88% rename from packages/backend/src/apps/zendesk/actions/create-user/fields.ts rename to packages/backend/src/apps/zendesk/actions/create-user/fields.js index 8bbfa026..1629a860 100644 --- a/packages/backend/src/apps/zendesk/actions/create-user/fields.ts +++ b/packages/backend/src/apps/zendesk/actions/create-user/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Name', key: 'name', - type: 'string' as const, + type: 'string', required: true, variables: true, description: '', @@ -10,7 +10,7 @@ export const fields = [ { label: 'Email', key: 'email', - type: 'string' as const, + type: 'string', required: true, variables: true, description: @@ -19,7 +19,7 @@ export const fields = [ { label: 'Details', key: 'details', - type: 'string' as const, + type: 'string', required: false, variables: true, description: '', @@ -27,7 +27,7 @@ export const fields = [ { label: 'Notes', key: 'notes', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -36,7 +36,7 @@ export const fields = [ { label: 'Phone', key: 'phone', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -45,7 +45,7 @@ export const fields = [ { label: 'Tags', key: 'tags', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'A comma separated list of tags.', @@ -53,7 +53,7 @@ export const fields = [ { label: 'Role', key: 'role', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -62,7 +62,7 @@ export const fields = [ { label: 'Organization', key: 'organizationId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: 'Assign this user to a specific organization.', @@ -80,7 +80,7 @@ export const fields = [ { label: 'External Id', key: 'externalId', - type: 'string' as const, + type: 'string', required: false, variables: true, description: @@ -89,7 +89,7 @@ export const fields = [ { label: 'Verified', key: 'verified', - type: 'dropdown' as const, + type: 'dropdown', required: false, description: "Specify if you can verify that the user's assertion of their identity is accurate.", diff --git a/packages/backend/src/apps/zendesk/actions/create-user/index.ts b/packages/backend/src/apps/zendesk/actions/create-user/index.js similarity index 74% rename from packages/backend/src/apps/zendesk/actions/create-user/index.ts rename to packages/backend/src/apps/zendesk/actions/create-user/index.js index 44cfc5c4..3a02ddf9 100644 --- a/packages/backend/src/apps/zendesk/actions/create-user/index.ts +++ b/packages/backend/src/apps/zendesk/actions/create-user/index.js @@ -1,10 +1,5 @@ -import { IJSONObject } from '@automatisch/types'; -import defineAction from '../../../../helpers/define-action'; -import { fields } from './fields'; - -type Payload = { - user: IJSONObject; -}; +import defineAction from '../../../../helpers/define-action.js'; +import { fields } from './fields.js'; export default defineAction({ name: 'Create user', @@ -25,10 +20,10 @@ export default defineAction({ verified, } = $.step.parameters; - const tags = $.step.parameters.tags as string; + const tags = $.step.parameters.tags; const formattedTags = tags.split(','); - const payload: Payload = { + const payload = { user: { name, email, diff --git a/packages/backend/src/apps/zendesk/actions/delete-ticket/index.ts b/packages/backend/src/apps/zendesk/actions/delete-ticket/index.js similarity index 88% rename from packages/backend/src/apps/zendesk/actions/delete-ticket/index.ts rename to packages/backend/src/apps/zendesk/actions/delete-ticket/index.js index e82d2524..52ebeb9f 100644 --- a/packages/backend/src/apps/zendesk/actions/delete-ticket/index.ts +++ b/packages/backend/src/apps/zendesk/actions/delete-ticket/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Delete ticket', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Ticket', key: 'ticketId', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, description: 'Select the ticket you want to delete.', diff --git a/packages/backend/src/apps/zendesk/actions/delete-user/index.ts b/packages/backend/src/apps/zendesk/actions/delete-user/index.js similarity index 90% rename from packages/backend/src/apps/zendesk/actions/delete-user/index.ts rename to packages/backend/src/apps/zendesk/actions/delete-user/index.js index d85ac519..8e4fbfd6 100644 --- a/packages/backend/src/apps/zendesk/actions/delete-user/index.ts +++ b/packages/backend/src/apps/zendesk/actions/delete-user/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Delete user', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'User', key: 'userId', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, description: 'Select the user you want to modify.', diff --git a/packages/backend/src/apps/zendesk/actions/find-ticket/index.ts b/packages/backend/src/apps/zendesk/actions/find-ticket/index.js similarity index 87% rename from packages/backend/src/apps/zendesk/actions/find-ticket/index.ts rename to packages/backend/src/apps/zendesk/actions/find-ticket/index.js index efbc3aec..40f6eec3 100644 --- a/packages/backend/src/apps/zendesk/actions/find-ticket/index.ts +++ b/packages/backend/src/apps/zendesk/actions/find-ticket/index.js @@ -1,4 +1,4 @@ -import defineAction from '../../../../helpers/define-action'; +import defineAction from '../../../../helpers/define-action.js'; export default defineAction({ name: 'Find ticket', @@ -8,7 +8,7 @@ export default defineAction({ { label: 'Query', key: 'query', - type: 'string' as const, + type: 'string', required: true, variables: true, description: diff --git a/packages/backend/src/apps/zendesk/actions/index.js b/packages/backend/src/apps/zendesk/actions/index.js new file mode 100644 index 00000000..23079139 --- /dev/null +++ b/packages/backend/src/apps/zendesk/actions/index.js @@ -0,0 +1,15 @@ +import createTicket from './create-ticket/index.js'; +import createUser from './create-user/index.js'; +import deleteTicket from './delete-ticket/index.js'; +import deleteUser from './delete-user/index.js'; +import findTicket from './find-ticket/index.js'; +import updateTicket from './update-ticket/index.js'; + +export default [ + createTicket, + createUser, + deleteTicket, + deleteUser, + findTicket, + updateTicket, +]; diff --git a/packages/backend/src/apps/zendesk/actions/index.ts b/packages/backend/src/apps/zendesk/actions/index.ts deleted file mode 100644 index 99dc7fda..00000000 --- a/packages/backend/src/apps/zendesk/actions/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import createTicket from './create-ticket'; -import createUser from './create-user'; -import deleteTicket from './delete-ticket'; -import deleteUser from './delete-user'; -import findTicket from './find-ticket'; -import updateTicket from './update-ticket'; - -export default [ - createTicket, - createUser, - deleteTicket, - deleteUser, - findTicket, - updateTicket, -]; diff --git a/packages/backend/src/apps/zendesk/actions/update-ticket/fields.ts b/packages/backend/src/apps/zendesk/actions/update-ticket/fields.js similarity index 90% rename from packages/backend/src/apps/zendesk/actions/update-ticket/fields.ts rename to packages/backend/src/apps/zendesk/actions/update-ticket/fields.js index e12a995a..29f646c7 100644 --- a/packages/backend/src/apps/zendesk/actions/update-ticket/fields.ts +++ b/packages/backend/src/apps/zendesk/actions/update-ticket/fields.js @@ -2,7 +2,7 @@ export const fields = [ { label: 'Ticket', key: 'ticketId', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, description: 'Select the ticket you want to change.', @@ -20,7 +20,7 @@ export const fields = [ { label: 'Subject', key: 'subject', - type: 'string' as const, + type: 'string', required: false, variables: true, description: '', @@ -28,7 +28,7 @@ export const fields = [ { label: 'Assignee', key: 'assigneeId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: @@ -55,7 +55,7 @@ export const fields = [ { label: 'Group', key: 'groupId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: 'Allocate this ticket to a specific group.', @@ -73,7 +73,7 @@ export const fields = [ { label: 'New Status', key: 'status', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -89,7 +89,7 @@ export const fields = [ { label: 'New comment to add to the ticket', key: 'comment', - type: 'string' as const, + type: 'string', required: false, variables: true, description: '', @@ -97,7 +97,7 @@ export const fields = [ { label: 'Should the first comment be public?', key: 'publicOrNot', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -109,7 +109,7 @@ export const fields = [ { label: 'Tags', key: 'tags', - type: 'string' as const, + type: 'string', required: false, variables: true, description: 'A comma separated list of tags.', @@ -117,7 +117,7 @@ export const fields = [ { label: 'Type', key: 'type', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -131,7 +131,7 @@ export const fields = [ { label: 'Priority', key: 'priority', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', @@ -145,7 +145,7 @@ export const fields = [ { label: 'Submitter', key: 'submitterId', - type: 'dropdown' as const, + type: 'dropdown', required: false, variables: true, description: '', diff --git a/packages/backend/src/apps/zendesk/actions/update-ticket/index.ts b/packages/backend/src/apps/zendesk/actions/update-ticket/index.js similarity index 83% rename from packages/backend/src/apps/zendesk/actions/update-ticket/index.ts rename to packages/backend/src/apps/zendesk/actions/update-ticket/index.js index 02e01886..cff7e0ee 100644 --- a/packages/backend/src/apps/zendesk/actions/update-ticket/index.ts +++ b/packages/backend/src/apps/zendesk/actions/update-ticket/index.js @@ -1,7 +1,7 @@ -import defineAction from '../../../../helpers/define-action'; -import { fields } from './fields'; -import isEmpty from 'lodash/isEmpty'; -import omitBy from 'lodash/omitBy'; +import defineAction from '../../../../helpers/define-action.js'; +import { fields } from './fields.js'; +import isEmpty from 'lodash/isEmpty.js'; +import omitBy from 'lodash/omitBy.js'; export default defineAction({ name: 'Update ticket', @@ -23,7 +23,7 @@ export default defineAction({ submitterId, } = $.step.parameters; - const tags = $.step.parameters.tags as string; + const tags = $.step.parameters.tags; const formattedTags = tags.split(','); const payload = { diff --git a/packages/backend/src/apps/zendesk/auth/generate-auth-url.ts b/packages/backend/src/apps/zendesk/auth/generate-auth-url.js similarity index 52% rename from packages/backend/src/apps/zendesk/auth/generate-auth-url.ts rename to packages/backend/src/apps/zendesk/auth/generate-auth-url.js index 8432bc8f..9e93282d 100644 --- a/packages/backend/src/apps/zendesk/auth/generate-auth-url.ts +++ b/packages/backend/src/apps/zendesk/auth/generate-auth-url.js @@ -1,17 +1,16 @@ -import { IField, IGlobalVariable } from '@automatisch/types'; import { URLSearchParams } from 'url'; -import authScope from '../common/auth-scope'; +import authScope from '../common/auth-scope.js'; -export default async function generateAuthUrl($: IGlobalVariable) { +export default async function generateAuthUrl($) { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const searchParams = new URLSearchParams({ response_type: 'code', redirect_uri: redirectUri, - client_id: $.auth.data.clientId as string, + client_id: $.auth.data.clientId, scope: authScope.join(' '), }); diff --git a/packages/backend/src/apps/zendesk/auth/index.ts b/packages/backend/src/apps/zendesk/auth/index.js similarity index 77% rename from packages/backend/src/apps/zendesk/auth/index.ts rename to packages/backend/src/apps/zendesk/auth/index.js index d4ac580c..67df59a9 100644 --- a/packages/backend/src/apps/zendesk/auth/index.ts +++ b/packages/backend/src/apps/zendesk/auth/index.js @@ -1,13 +1,13 @@ -import generateAuthUrl from './generate-auth-url'; -import verifyCredentials from './verify-credentials'; -import isStillVerified from './is-still-verified'; +import generateAuthUrl from './generate-auth-url.js'; +import verifyCredentials from './verify-credentials.js'; +import isStillVerified from './is-still-verified.js'; export default { fields: [ { key: 'oAuthRedirectUrl', label: 'OAuth Redirect URL', - type: 'string' as const, + type: 'string', required: true, readOnly: true, value: '{WEB_APP_URL}/app/zendesk/connections/add', @@ -18,7 +18,7 @@ export default { { key: 'instanceUrl', label: 'Zendesk Subdomain Url', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -28,7 +28,7 @@ export default { { key: 'clientId', label: 'Client ID', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, @@ -39,7 +39,7 @@ export default { { key: 'clientSecret', label: 'Client Secret', - type: 'string' as const, + type: 'string', required: true, readOnly: false, value: null, diff --git a/packages/backend/src/apps/zendesk/auth/is-still-verified.js b/packages/backend/src/apps/zendesk/auth/is-still-verified.js new file mode 100644 index 00000000..54001579 --- /dev/null +++ b/packages/backend/src/apps/zendesk/auth/is-still-verified.js @@ -0,0 +1,8 @@ +import getCurrentUser from '../common/get-current-user.js'; + +const isStillVerified = async ($) => { + await getCurrentUser($); + return true; +}; + +export default isStillVerified; diff --git a/packages/backend/src/apps/zendesk/auth/is-still-verified.ts b/packages/backend/src/apps/zendesk/auth/is-still-verified.ts deleted file mode 100644 index 86199fd2..00000000 --- a/packages/backend/src/apps/zendesk/auth/is-still-verified.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { IGlobalVariable } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; - -const isStillVerified = async ($: IGlobalVariable) => { - await getCurrentUser($); - return true; -}; - -export default isStillVerified; diff --git a/packages/backend/src/apps/zendesk/auth/verify-credentials.ts b/packages/backend/src/apps/zendesk/auth/verify-credentials.js similarity index 59% rename from packages/backend/src/apps/zendesk/auth/verify-credentials.ts rename to packages/backend/src/apps/zendesk/auth/verify-credentials.js index a2d3750b..3a416a69 100644 --- a/packages/backend/src/apps/zendesk/auth/verify-credentials.ts +++ b/packages/backend/src/apps/zendesk/auth/verify-credentials.js @@ -1,13 +1,12 @@ -import { IGlobalVariable, IJSONValue, IField } from '@automatisch/types'; -import getCurrentUser from '../common/get-current-user'; -import scopes from '../common/auth-scope'; +import getCurrentUser from '../common/get-current-user.js'; +import scopes from '../common/auth-scope.js'; -const verifyCredentials = async ($: IGlobalVariable) => { +const verifyCredentials = async ($) => { await getAccessToken($); const user = await getCurrentUser($); const subdomain = extractSubdomain($.auth.data.instanceUrl); - const name = user.name as string; + const name = user.name; const screenName = [name, subdomain].filter(Boolean).join(' @ '); await $.auth.set({ @@ -18,19 +17,19 @@ const verifyCredentials = async ($: IGlobalVariable) => { }); }; -const getAccessToken = async ($: IGlobalVariable) => { +const getAccessToken = async ($) => { const oauthRedirectUrlField = $.app.auth.fields.find( - (field: IField) => field.key == 'oAuthRedirectUrl' + (field) => field.key == 'oAuthRedirectUrl' ); - const redirectUri = oauthRedirectUrlField.value as string; + const redirectUri = oauthRedirectUrlField.value; const response = await $.http.post(`/oauth/tokens`, { redirect_uri: redirectUri, code: $.auth.data.code, grant_type: 'authorization_code', scope: scopes.join(' '), - client_id: $.auth.data.clientId as string, - client_secret: $.auth.data.clientSecret as string, + client_id: $.auth.data.clientId, + client_secret: $.auth.data.clientSecret, }); const data = response.data; @@ -45,8 +44,8 @@ const getAccessToken = async ($: IGlobalVariable) => { }); }; -function extractSubdomain(url: IJSONValue) { - const match = (url as string).match(/https:\/\/(.*?)\.zendesk\.com/); +function extractSubdomain(url) { + const match = url.match(/https:\/\/(.*?)\.zendesk\.com/); if (match && match[1]) { return match[1]; } diff --git a/packages/backend/src/apps/zendesk/common/add-auth-headers.ts b/packages/backend/src/apps/zendesk/common/add-auth-headers.js similarity index 61% rename from packages/backend/src/apps/zendesk/common/add-auth-headers.ts rename to packages/backend/src/apps/zendesk/common/add-auth-headers.js index 68e9b5e6..96a0e04c 100644 --- a/packages/backend/src/apps/zendesk/common/add-auth-headers.ts +++ b/packages/backend/src/apps/zendesk/common/add-auth-headers.js @@ -1,10 +1,8 @@ -import { TBeforeRequest } from '@automatisch/types'; - -const addAuthHeader: TBeforeRequest = ($, requestConfig) => { +const addAuthHeader = ($, requestConfig) => { const { instanceUrl, tokenType, accessToken } = $.auth.data; if (instanceUrl) { - requestConfig.baseURL = instanceUrl as string; + requestConfig.baseURL = instanceUrl; } if (tokenType && accessToken) { diff --git a/packages/backend/src/apps/zendesk/common/auth-scope.js b/packages/backend/src/apps/zendesk/common/auth-scope.js new file mode 100644 index 00000000..855e337b --- /dev/null +++ b/packages/backend/src/apps/zendesk/common/auth-scope.js @@ -0,0 +1,3 @@ +const authScope = ['read', 'write']; + +export default authScope; diff --git a/packages/backend/src/apps/zendesk/common/auth-scope.ts b/packages/backend/src/apps/zendesk/common/auth-scope.ts deleted file mode 100644 index c0dd438f..00000000 --- a/packages/backend/src/apps/zendesk/common/auth-scope.ts +++ /dev/null @@ -1,3 +0,0 @@ -const authScope: string[] = ['read', 'write']; - -export default authScope; diff --git a/packages/backend/src/apps/zendesk/common/get-current-user.ts b/packages/backend/src/apps/zendesk/common/get-current-user.js similarity index 51% rename from packages/backend/src/apps/zendesk/common/get-current-user.ts rename to packages/backend/src/apps/zendesk/common/get-current-user.js index 90f9abb2..5741b02c 100644 --- a/packages/backend/src/apps/zendesk/common/get-current-user.ts +++ b/packages/backend/src/apps/zendesk/common/get-current-user.js @@ -1,6 +1,4 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - -const getCurrentUser = async ($: IGlobalVariable): Promise => { +const getCurrentUser = async ($) => { const response = await $.http.get('/api/v2/users/me'); const currentUser = response.data.user; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/index.js b/packages/backend/src/apps/zendesk/dynamic-data/index.js new file mode 100644 index 00000000..d32b6fb3 --- /dev/null +++ b/packages/backend/src/apps/zendesk/dynamic-data/index.js @@ -0,0 +1,20 @@ +import listUsers from './list-users/index.js'; +import listBrands from './list-brands/index.js'; +import listFirstPageOfTickets from './list-first-page-of-tickets/index.js'; +import listGroups from './list-groups/index.js'; +import listOrganizations from './list-organizations/index.js'; +import listSharingAgreements from './list-sharing-agreements/index.js'; +import listTicketForms from './list-ticket-forms/index.js'; +import listViews from './list-views/index.js'; + +export default [ + listUsers, + listBrands, + listFirstPageOfTickets, + listGroups, + listOrganizations, + listSharingAgreements, + listFirstPageOfTickets, + listTicketForms, + listViews, +]; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/index.ts deleted file mode 100644 index f5755bc4..00000000 --- a/packages/backend/src/apps/zendesk/dynamic-data/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import listUsers from './list-users'; -import listBrands from './list-brands'; -import listFirstPageOfTickets from './list-first-page-of-tickets'; -import listGroups from './list-groups'; -import listOrganizations from './list-organizations'; -import listSharingAgreements from './list-sharing-agreements'; -import listTicketForms from './list-ticket-forms'; -import listViews from './list-views'; - -export default [ - listUsers, - listBrands, - listFirstPageOfTickets, - listGroups, - listOrganizations, - listSharingAgreements, - listFirstPageOfTickets, - listTicketForms, - listViews, -]; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-brands/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-brands/index.js similarity index 79% rename from packages/backend/src/apps/zendesk/dynamic-data/list-brands/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-brands/index.js index 3b6f43d8..a5a170c6 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-brands/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-brands/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List brands', key: 'listBrands', - async run($: IGlobalVariable) { - const brands: { - data: IJSONObject[]; - } = { + async run($) { + const brands = { data: [], }; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-first-page-of-tickets/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-first-page-of-tickets/index.js similarity index 76% rename from packages/backend/src/apps/zendesk/dynamic-data/list-first-page-of-tickets/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-first-page-of-tickets/index.js index 66a127b6..bf065a5b 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-first-page-of-tickets/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-first-page-of-tickets/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List first page of tickets', key: 'listFirstPageOfTickets', - async run($: IGlobalVariable) { - const tickets: { - data: IJSONObject[]; - } = { + async run($) { + const tickets = { data: [], }; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-groups/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-groups/index.js similarity index 75% rename from packages/backend/src/apps/zendesk/dynamic-data/list-groups/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-groups/index.js index c59999ec..9fda32d8 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-groups/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-groups/index.js @@ -1,20 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List groups', key: 'listGroups', - async run($: IGlobalVariable) { - const groups: { - data: IJSONObject[]; - } = { + async run($) { + const groups = { data: [], }; let hasMore; const params = { 'page[size]': 100, - 'page[after]': undefined as unknown as string, + 'page[after]': undefined, }; do { diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-organizations/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-organizations/index.js similarity index 76% rename from packages/backend/src/apps/zendesk/dynamic-data/list-organizations/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-organizations/index.js index c86ac91c..a6c7a4db 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-organizations/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-organizations/index.js @@ -1,20 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List organizations', key: 'listOrganizations', - async run($: IGlobalVariable) { - const organizations: { - data: IJSONObject[]; - } = { + async run($) { + const organizations = { data: [], }; let hasMore; const params = { 'page[size]': 100, - 'page[after]': undefined as unknown as string, + 'page[after]': undefined, }; do { diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-sharing-agreements/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-sharing-agreements/index.js similarity index 81% rename from packages/backend/src/apps/zendesk/dynamic-data/list-sharing-agreements/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-sharing-agreements/index.js index 81c49835..690f46e1 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-sharing-agreements/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-sharing-agreements/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List sharing agreements', key: 'listSharingAgreements', - async run($: IGlobalVariable) { - const sharingAgreements: { - data: IJSONObject[]; - } = { + async run($) { + const sharingAgreements = { data: [], }; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-ticket-forms/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-ticket-forms/index.js similarity index 80% rename from packages/backend/src/apps/zendesk/dynamic-data/list-ticket-forms/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-ticket-forms/index.js index 1ec08ddf..ad102b93 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-ticket-forms/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-ticket-forms/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List ticket forms', key: 'listTicketForms', - async run($: IGlobalVariable) { - const ticketForms: { - data: IJSONObject[]; - } = { + async run($) { + const ticketForms = { data: [], }; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-users/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-users/index.js similarity index 81% rename from packages/backend/src/apps/zendesk/dynamic-data/list-users/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-users/index.js index 9f2fdf8d..efcafbbd 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-users/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-users/index.js @@ -1,13 +1,9 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List users', key: 'listUsers', - async run($: IGlobalVariable) { - const users: { - data: IJSONObject[]; - } = { + async run($) { + const users = { data: [], }; let hasMore; @@ -18,7 +14,7 @@ export default { const params = { 'page[size]': 100, role, - 'page[after]': undefined as unknown as string, + 'page[after]': undefined, }; do { diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.js similarity index 74% rename from packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts rename to packages/backend/src/apps/zendesk/dynamic-data/list-views/index.js index 3c7d94b7..fd7066ae 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.js @@ -1,20 +1,16 @@ -import { IGlobalVariable, IJSONObject } from '@automatisch/types'; - export default { name: 'List views', key: 'listViews', - async run($: IGlobalVariable) { - const views: { - data: IJSONObject[]; - } = { + async run($) { + const views = { data: [], }; let hasMore; const params = { 'page[size]': 100, - 'page[after]': undefined as unknown as string, + 'page[after]': undefined, }; do { diff --git a/packages/backend/src/apps/zendesk/index.d.ts b/packages/backend/src/apps/zendesk/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/backend/src/apps/zendesk/index.ts b/packages/backend/src/apps/zendesk/index.js similarity index 57% rename from packages/backend/src/apps/zendesk/index.ts rename to packages/backend/src/apps/zendesk/index.js index a0e5e6a7..2f1228db 100644 --- a/packages/backend/src/apps/zendesk/index.ts +++ b/packages/backend/src/apps/zendesk/index.js @@ -1,9 +1,9 @@ -import defineApp from '../../helpers/define-app'; -import addAuthHeader from './common/add-auth-headers'; -import auth from './auth'; -import triggers from './triggers'; -import actions from './actions'; -import dynamicData from './dynamic-data'; +import defineApp from '../../helpers/define-app.js'; +import addAuthHeader from './common/add-auth-headers.js'; +import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import actions from './actions/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Zendesk', diff --git a/packages/backend/src/apps/zendesk/triggers/index.js b/packages/backend/src/apps/zendesk/triggers/index.js new file mode 100644 index 00000000..0006b367 --- /dev/null +++ b/packages/backend/src/apps/zendesk/triggers/index.js @@ -0,0 +1,4 @@ +import newTickets from './new-tickets/index.js'; +import newUsers from './new-users/index.js'; + +export default [newTickets, newUsers]; diff --git a/packages/backend/src/apps/zendesk/triggers/index.ts b/packages/backend/src/apps/zendesk/triggers/index.ts deleted file mode 100644 index 883357c1..00000000 --- a/packages/backend/src/apps/zendesk/triggers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import newTickets from './new-tickets'; -import newUsers from './new-users'; - -export default [newTickets, newUsers]; diff --git a/packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts b/packages/backend/src/apps/zendesk/triggers/new-tickets/index.js similarity index 89% rename from packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts rename to packages/backend/src/apps/zendesk/triggers/new-tickets/index.js index 9a7d1a63..31156a16 100644 --- a/packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts +++ b/packages/backend/src/apps/zendesk/triggers/new-tickets/index.js @@ -1,4 +1,4 @@ -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New tickets', @@ -9,7 +9,7 @@ export default defineTrigger({ { label: 'View', key: 'viewId', - type: 'dropdown' as const, + type: 'dropdown', required: true, variables: true, source: { @@ -30,7 +30,7 @@ export default defineTrigger({ const params = { 'page[size]': 100, - 'page[after]': undefined as unknown as string, + 'page[after]': undefined, sort_by: 'nice_id', sort_order: 'desc', }; diff --git a/packages/backend/src/apps/zendesk/triggers/new-users/index.ts b/packages/backend/src/apps/zendesk/triggers/new-users/index.js similarity index 96% rename from packages/backend/src/apps/zendesk/triggers/new-users/index.ts rename to packages/backend/src/apps/zendesk/triggers/new-users/index.js index 85b16fa4..8610fed0 100644 --- a/packages/backend/src/apps/zendesk/triggers/new-users/index.ts +++ b/packages/backend/src/apps/zendesk/triggers/new-users/index.js @@ -1,5 +1,5 @@ import Crypto from 'crypto'; -import defineTrigger from '../../../../helpers/define-trigger'; +import defineTrigger from '../../../../helpers/define-trigger.js'; export default defineTrigger({ name: 'New users', diff --git a/packages/backend/src/config/app.js b/packages/backend/src/config/app.js index 15397bf8..dd3a7c58 100644 --- a/packages/backend/src/config/app.js +++ b/packages/backend/src/config/app.js @@ -2,6 +2,9 @@ import { URL } from 'node:url'; import * as dotenv from 'dotenv'; import path from 'path'; import process from 'node:process'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); if (process.env.APP_ENV === 'test') { dotenv.config({ path: path.resolve(__dirname, '../../.env.test') }); diff --git a/packages/backend/src/config/cors-options.js b/packages/backend/src/config/cors-options.js index bff4b542..c96a2d4a 100644 --- a/packages/backend/src/config/cors-options.js +++ b/packages/backend/src/config/cors-options.js @@ -1,4 +1,4 @@ -import appConfig from './app'; +import appConfig from './app.js'; const corsOptions = { origin: appConfig.webAppUrl, diff --git a/packages/backend/src/config/database.js b/packages/backend/src/config/database.js index f6b15e61..55713b9f 100644 --- a/packages/backend/src/config/database.js +++ b/packages/backend/src/config/database.js @@ -4,8 +4,8 @@ import process from 'process'; import pg from 'pg'; pg.types.setTypeParser(20, 'text', parseInt); import knex from 'knex'; -import knexConfig from '../../knexfile'; -import logger from '../helpers/logger'; +import knexConfig from '../../knexfile.js'; +import logger from '../helpers/logger.js'; export const client = knex(knexConfig); diff --git a/packages/backend/src/config/orm.js b/packages/backend/src/config/orm.js index 77126e91..a2576e71 100644 --- a/packages/backend/src/config/orm.js +++ b/packages/backend/src/config/orm.js @@ -1,4 +1,4 @@ import { Model } from 'objection'; -import { client } from './database'; +import { client } from './database.js'; Model.knex(client); diff --git a/packages/backend/src/config/redis.js b/packages/backend/src/config/redis.js index 4371b911..45d007ea 100644 --- a/packages/backend/src/config/redis.js +++ b/packages/backend/src/config/redis.js @@ -1,4 +1,4 @@ -import appConfig from './app'; +import appConfig from './app.js'; const redisConfig = { host: appConfig.redisHost, diff --git a/packages/backend/src/controllers/paddle/webhooks.ee.js b/packages/backend/src/controllers/paddle/webhooks.ee.js index 62c27d23..b2d3e509 100644 --- a/packages/backend/src/controllers/paddle/webhooks.ee.js +++ b/packages/backend/src/controllers/paddle/webhooks.ee.js @@ -1,7 +1,7 @@ import crypto from 'crypto'; import { serialize } from 'php-serialize'; -import Billing from '../../helpers/billing/index.ee'; -import appConfig from '../../config/app'; +import Billing from '../../helpers/billing/index.ee.js'; +import appConfig from '../../config/app.js'; export default async (request, response) => { if (!verifyWebhook(request)) { diff --git a/packages/backend/src/controllers/webhooks/handler-by-connection-id-and-ref-value.js b/packages/backend/src/controllers/webhooks/handler-by-connection-id-and-ref-value.js index 3e21bb03..2f5c611f 100644 --- a/packages/backend/src/controllers/webhooks/handler-by-connection-id-and-ref-value.js +++ b/packages/backend/src/controllers/webhooks/handler-by-connection-id-and-ref-value.js @@ -1,8 +1,8 @@ import path from 'node:path'; -import Connection from '../../models/connection'; -import logger from '../../helpers/logger'; -import handler from '../../helpers/webhook-handler'; +import Connection from '../../models/connection.js'; +import logger from '../../helpers/logger.js'; +import handler from '../../helpers/webhook-handler.js'; export default async (request, response) => { const computedRequestPayload = { diff --git a/packages/backend/src/controllers/webhooks/handler-by-flow-id.js b/packages/backend/src/controllers/webhooks/handler-by-flow-id.js index c262c857..5ed0fd67 100644 --- a/packages/backend/src/controllers/webhooks/handler-by-flow-id.js +++ b/packages/backend/src/controllers/webhooks/handler-by-flow-id.js @@ -1,6 +1,6 @@ -import Flow from '../../models/flow'; -import logger from '../../helpers/logger'; -import handler from '../../helpers/webhook-handler'; +import Flow from '../../models/flow.js'; +import logger from '../../helpers/logger.js'; +import handler from '../../helpers/webhook-handler.js'; export default async (request, response) => { const computedRequestPayload = { diff --git a/packages/backend/src/db/migrations/20211005151457_create_users.ts b/packages/backend/src/db/migrations/20211005151457_create_users.js similarity index 68% rename from packages/backend/src/db/migrations/20211005151457_create_users.ts rename to packages/backend/src/db/migrations/20211005151457_create_users.js index 6177f4d4..b1699c9d 100644 --- a/packages/backend/src/db/migrations/20211005151457_create_users.ts +++ b/packages/backend/src/db/migrations/20211005151457_create_users.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('users', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('email').unique().notNullable(); @@ -10,6 +8,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('users'); } diff --git a/packages/backend/src/db/migrations/20211011120732_create_credentials.ts b/packages/backend/src/db/migrations/20211011120732_create_credentials.js similarity index 76% rename from packages/backend/src/db/migrations/20211011120732_create_credentials.ts rename to packages/backend/src/db/migrations/20211011120732_create_credentials.js index c24d61e2..842f5ea7 100644 --- a/packages/backend/src/db/migrations/20211011120732_create_credentials.ts +++ b/packages/backend/src/db/migrations/20211011120732_create_credentials.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('credentials', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('key').notNullable(); @@ -13,6 +11,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('credentials'); } diff --git a/packages/backend/src/db/migrations/20211014144855_remove_display_name_from_credentials.ts b/packages/backend/src/db/migrations/20211014144855_remove_display_name_from_credentials.js similarity index 58% rename from packages/backend/src/db/migrations/20211014144855_remove_display_name_from_credentials.ts rename to packages/backend/src/db/migrations/20211014144855_remove_display_name_from_credentials.js index f37d5373..5e746dee 100644 --- a/packages/backend/src/db/migrations/20211014144855_remove_display_name_from_credentials.ts +++ b/packages/backend/src/db/migrations/20211014144855_remove_display_name_from_credentials.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('credentials', (table) => { table.dropColumn('display_name'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('credentials', (table) => { table.string('display_name'); }); diff --git a/packages/backend/src/db/migrations/20211017104154_rename_credentials_as_connections.js b/packages/backend/src/db/migrations/20211017104154_rename_credentials_as_connections.js new file mode 100644 index 00000000..78f07407 --- /dev/null +++ b/packages/backend/src/db/migrations/20211017104154_rename_credentials_as_connections.js @@ -0,0 +1,7 @@ +export async function up(knex) { + return knex.schema.renameTable('credentials', 'connections'); +} + +export async function down(knex) { + return knex.schema.renameTable('connections', 'credentials'); +} diff --git a/packages/backend/src/db/migrations/20211017104154_rename_credentials_as_connections.ts b/packages/backend/src/db/migrations/20211017104154_rename_credentials_as_connections.ts deleted file mode 100644 index d9dac102..00000000 --- a/packages/backend/src/db/migrations/20211017104154_rename_credentials_as_connections.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { - return knex.schema.renameTable('credentials', 'connections'); -} - -export async function down(knex: Knex): Promise { - return knex.schema.renameTable('connections', 'credentials'); -} diff --git a/packages/backend/src/db/migrations/20211106214730_create_steps.ts b/packages/backend/src/db/migrations/20211106214730_create_steps.js similarity index 75% rename from packages/backend/src/db/migrations/20211106214730_create_steps.ts rename to packages/backend/src/db/migrations/20211106214730_create_steps.js index e478fcd9..c84a1d3c 100644 --- a/packages/backend/src/db/migrations/20211106214730_create_steps.ts +++ b/packages/backend/src/db/migrations/20211106214730_create_steps.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('steps', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('key').notNullable(); @@ -13,6 +11,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('steps'); } diff --git a/packages/backend/src/db/migrations/20211122140336_create_flows.ts b/packages/backend/src/db/migrations/20211122140336_create_flows.js similarity index 68% rename from packages/backend/src/db/migrations/20211122140336_create_flows.ts rename to packages/backend/src/db/migrations/20211122140336_create_flows.js index 2b2b018b..00e81c9c 100644 --- a/packages/backend/src/db/migrations/20211122140336_create_flows.ts +++ b/packages/backend/src/db/migrations/20211122140336_create_flows.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('flows', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('name'); @@ -10,6 +8,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('flows'); } diff --git a/packages/backend/src/db/migrations/20211122140612_add_flow_id_to_steps.ts b/packages/backend/src/db/migrations/20211122140612_add_flow_id_to_steps.js similarity index 59% rename from packages/backend/src/db/migrations/20211122140612_add_flow_id_to_steps.ts rename to packages/backend/src/db/migrations/20211122140612_add_flow_id_to_steps.js index 44fabcb4..e1326ccf 100644 --- a/packages/backend/src/db/migrations/20211122140612_add_flow_id_to_steps.ts +++ b/packages/backend/src/db/migrations/20211122140612_add_flow_id_to_steps.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('steps', (table) => { table.uuid('flow_id').references('id').inTable('flows'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('steps', (table) => { table.dropColumn('flow_id'); }); diff --git a/packages/backend/src/db/migrations/20220105151725_remove_constraints_from_steps.ts b/packages/backend/src/db/migrations/20220105151725_remove_constraints_from_steps.js similarity index 69% rename from packages/backend/src/db/migrations/20220105151725_remove_constraints_from_steps.ts rename to packages/backend/src/db/migrations/20220105151725_remove_constraints_from_steps.js index 24fa418d..f4812f22 100644 --- a/packages/backend/src/db/migrations/20220105151725_remove_constraints_from_steps.ts +++ b/packages/backend/src/db/migrations/20220105151725_remove_constraints_from_steps.js @@ -1,13 +1,11 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.alterTable('steps', (table) => { table.string('key').nullable().alter(); table.string('app_key').nullable().alter(); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.alterTable('steps', (table) => { table.string('key').notNullable().alter(); table.string('app_key').notNullable().alter(); diff --git a/packages/backend/src/db/migrations/20220108141045_add_active_column_to_flows.ts b/packages/backend/src/db/migrations/20220108141045_add_active_column_to_flows.js similarity index 57% rename from packages/backend/src/db/migrations/20220108141045_add_active_column_to_flows.ts rename to packages/backend/src/db/migrations/20220108141045_add_active_column_to_flows.js index 84ddc5fc..5da6273e 100644 --- a/packages/backend/src/db/migrations/20220108141045_add_active_column_to_flows.ts +++ b/packages/backend/src/db/migrations/20220108141045_add_active_column_to_flows.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('flows', (table) => { table.boolean('active').defaultTo(false); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('flows', (table) => { table.dropColumn('active'); }); diff --git a/packages/backend/src/db/migrations/20220127141941_add_position_to_steps.ts b/packages/backend/src/db/migrations/20220127141941_add_position_to_steps.js similarity index 58% rename from packages/backend/src/db/migrations/20220127141941_add_position_to_steps.ts rename to packages/backend/src/db/migrations/20220127141941_add_position_to_steps.js index fac88acb..bf1f567f 100644 --- a/packages/backend/src/db/migrations/20220127141941_add_position_to_steps.ts +++ b/packages/backend/src/db/migrations/20220127141941_add_position_to_steps.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('steps', (table) => { table.integer('position').notNullable(); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('steps', (table) => { table.dropColumn('position'); }); diff --git a/packages/backend/src/db/migrations/20220205145128_add_status_to_steps.ts b/packages/backend/src/db/migrations/20220205145128_add_status_to_steps.js similarity index 60% rename from packages/backend/src/db/migrations/20220205145128_add_status_to_steps.ts rename to packages/backend/src/db/migrations/20220205145128_add_status_to_steps.js index 25c16e38..b7629f76 100644 --- a/packages/backend/src/db/migrations/20220205145128_add_status_to_steps.ts +++ b/packages/backend/src/db/migrations/20220205145128_add_status_to_steps.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('steps', (table) => { table.string('status').notNullable().defaultTo('incomplete'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('steps', (table) => { table.dropColumn('status'); }); diff --git a/packages/backend/src/db/migrations/20220219093113_create_executions.ts b/packages/backend/src/db/migrations/20220219093113_create_executions.js similarity index 71% rename from packages/backend/src/db/migrations/20220219093113_create_executions.ts rename to packages/backend/src/db/migrations/20220219093113_create_executions.js index 2f5bbf81..1ce2e5c0 100644 --- a/packages/backend/src/db/migrations/20220219093113_create_executions.ts +++ b/packages/backend/src/db/migrations/20220219093113_create_executions.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('executions', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.uuid('flow_id').references('id').inTable('flows'); @@ -10,6 +8,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('executions'); } diff --git a/packages/backend/src/db/migrations/20220219100800_create_execution_steps.ts b/packages/backend/src/db/migrations/20220219100800_create_execution_steps.js similarity index 76% rename from packages/backend/src/db/migrations/20220219100800_create_execution_steps.ts rename to packages/backend/src/db/migrations/20220219100800_create_execution_steps.js index 8c8bf77b..9fe45206 100644 --- a/packages/backend/src/db/migrations/20220219100800_create_execution_steps.ts +++ b/packages/backend/src/db/migrations/20220219100800_create_execution_steps.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('execution_steps', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.uuid('execution_id').references('id').inTable('executions'); @@ -13,6 +11,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('execution_steps'); } diff --git a/packages/backend/src/db/migrations/20220221225128_alter_columns_of_execution_steps.ts b/packages/backend/src/db/migrations/20220221225128_alter_columns_of_execution_steps.js similarity index 67% rename from packages/backend/src/db/migrations/20220221225128_alter_columns_of_execution_steps.ts rename to packages/backend/src/db/migrations/20220221225128_alter_columns_of_execution_steps.js index 7574a5d7..04bc60df 100644 --- a/packages/backend/src/db/migrations/20220221225128_alter_columns_of_execution_steps.ts +++ b/packages/backend/src/db/migrations/20220221225128_alter_columns_of_execution_steps.js @@ -1,13 +1,11 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.alterTable('execution_steps', (table) => { table.jsonb('data_in').alter(); table.jsonb('data_out').alter(); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.alterTable('execution_steps', (table) => { table.text('data_in').alter(); table.text('data_out').alter(); diff --git a/packages/backend/src/db/migrations/20220221225537_alter_parameters_column_of_steps.ts b/packages/backend/src/db/migrations/20220221225537_alter_parameters_column_of_steps.js similarity index 60% rename from packages/backend/src/db/migrations/20220221225537_alter_parameters_column_of_steps.ts rename to packages/backend/src/db/migrations/20220221225537_alter_parameters_column_of_steps.js index aaeb8d84..6bfd231b 100644 --- a/packages/backend/src/db/migrations/20220221225537_alter_parameters_column_of_steps.ts +++ b/packages/backend/src/db/migrations/20220221225537_alter_parameters_column_of_steps.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.alterTable('steps', (table) => { table.jsonb('parameters').defaultTo('{}').alter(); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.alterTable('steps', (table) => { table.text('parameters').alter(); }); diff --git a/packages/backend/src/db/migrations/20220727104324_add_draft_column_to_connections.ts b/packages/backend/src/db/migrations/20220727104324_add_draft_column_to_connections.js similarity index 59% rename from packages/backend/src/db/migrations/20220727104324_add_draft_column_to_connections.ts rename to packages/backend/src/db/migrations/20220727104324_add_draft_column_to_connections.js index 7f425779..12f8e8d5 100644 --- a/packages/backend/src/db/migrations/20220727104324_add_draft_column_to_connections.ts +++ b/packages/backend/src/db/migrations/20220727104324_add_draft_column_to_connections.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('connections', (table) => { table.boolean('draft').defaultTo(true); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('connections', (table) => { table.dropColumn('draft'); }); diff --git a/packages/backend/src/db/migrations/20220817121241_add_published_at_column_to_flows.ts b/packages/backend/src/db/migrations/20220817121241_add_published_at_column_to_flows.js similarity index 58% rename from packages/backend/src/db/migrations/20220817121241_add_published_at_column_to_flows.ts rename to packages/backend/src/db/migrations/20220817121241_add_published_at_column_to_flows.js index d20ce715..fd436f35 100644 --- a/packages/backend/src/db/migrations/20220817121241_add_published_at_column_to_flows.ts +++ b/packages/backend/src/db/migrations/20220817121241_add_published_at_column_to_flows.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('flows', (table) => { table.timestamp('published_at').nullable(); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('flows', (table) => { table.dropColumn('published_at'); }); diff --git a/packages/backend/src/db/migrations/20220823171017_add_internal_id_to_executions.ts b/packages/backend/src/db/migrations/20220823171017_add_internal_id_to_executions.js similarity index 58% rename from packages/backend/src/db/migrations/20220823171017_add_internal_id_to_executions.ts rename to packages/backend/src/db/migrations/20220823171017_add_internal_id_to_executions.js index 7dacb7c6..a833571c 100644 --- a/packages/backend/src/db/migrations/20220823171017_add_internal_id_to_executions.ts +++ b/packages/backend/src/db/migrations/20220823171017_add_internal_id_to_executions.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('executions', (table) => { table.string('internal_id'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('executions', (table) => { table.dropColumn('internal_id'); }); diff --git a/packages/backend/src/db/migrations/20220904160521_add_raw_error_to_execution_steps.ts b/packages/backend/src/db/migrations/20220904160521_add_raw_error_to_execution_steps.js similarity index 59% rename from packages/backend/src/db/migrations/20220904160521_add_raw_error_to_execution_steps.ts rename to packages/backend/src/db/migrations/20220904160521_add_raw_error_to_execution_steps.js index 55eb25c2..ccef7ec7 100644 --- a/packages/backend/src/db/migrations/20220904160521_add_raw_error_to_execution_steps.ts +++ b/packages/backend/src/db/migrations/20220904160521_add_raw_error_to_execution_steps.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('execution_steps', (table) => { table.jsonb('error_details'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('execution_steps', (table) => { table.dropColumn('error_details'); }); diff --git a/packages/backend/src/db/migrations/20220928162525_soft-delete-base-model.ts b/packages/backend/src/db/migrations/20220928162525_soft-delete-base-model.js similarity index 73% rename from packages/backend/src/db/migrations/20220928162525_soft-delete-base-model.ts rename to packages/backend/src/db/migrations/20220928162525_soft-delete-base-model.js index b1162d6e..b584d6a2 100644 --- a/packages/backend/src/db/migrations/20220928162525_soft-delete-base-model.ts +++ b/packages/backend/src/db/migrations/20220928162525_soft-delete-base-model.js @@ -1,18 +1,16 @@ -import { Knex } from 'knex'; - -async function addDeletedColumn(knex: Knex, tableName: string) { +async function addDeletedColumn(knex, tableName) { return await knex.schema.table(tableName, (table) => { table.timestamp('deleted_at').nullable(); }); } -async function dropDeletedColumn(knex: Knex, tableName: string) { +async function dropDeletedColumn(knex, tableName) { return await knex.schema.table(tableName, (table) => { table.dropColumn('deleted_at'); }); } -export async function up(knex: Knex): Promise { +export async function up(knex) { await addDeletedColumn(knex, 'steps'); await addDeletedColumn(knex, 'flows'); await addDeletedColumn(knex, 'executions'); @@ -21,7 +19,7 @@ export async function up(knex: Knex): Promise { await addDeletedColumn(knex, 'connections'); } -export async function down(knex: Knex): Promise { +export async function down(knex) { await dropDeletedColumn(knex, 'steps'); await dropDeletedColumn(knex, 'flows'); await dropDeletedColumn(knex, 'executions'); diff --git a/packages/backend/src/db/migrations/20221214184855_add_remote_webhook_id_in_flow.ts b/packages/backend/src/db/migrations/20221214184855_add_remote_webhook_id_in_flow.js similarity index 58% rename from packages/backend/src/db/migrations/20221214184855_add_remote_webhook_id_in_flow.ts rename to packages/backend/src/db/migrations/20221214184855_add_remote_webhook_id_in_flow.js index 67a086a9..3a39da2d 100644 --- a/packages/backend/src/db/migrations/20221214184855_add_remote_webhook_id_in_flow.ts +++ b/packages/backend/src/db/migrations/20221214184855_add_remote_webhook_id_in_flow.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('flows', (table) => { table.string('remote_webhook_id'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('flows', (table) => { table.dropColumn('remote_webhook_id'); }); diff --git a/packages/backend/src/db/migrations/20230218110748_add_role_to_users.ts b/packages/backend/src/db/migrations/20230218110748_add_role_to_users.js similarity index 62% rename from packages/backend/src/db/migrations/20230218110748_add_role_to_users.ts rename to packages/backend/src/db/migrations/20230218110748_add_role_to_users.js index 66f75456..c4b1af63 100644 --- a/packages/backend/src/db/migrations/20230218110748_add_role_to_users.ts +++ b/packages/backend/src/db/migrations/20230218110748_add_role_to_users.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('users', async (table) => { table.string('role'); @@ -8,7 +6,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('users', (table) => { table.dropColumn('role'); }); diff --git a/packages/backend/src/db/migrations/20230218131824_alter_role_to_not_nullable_for_users.ts b/packages/backend/src/db/migrations/20230218131824_alter_role_to_not_nullable_for_users.js similarity index 60% rename from packages/backend/src/db/migrations/20230218131824_alter_role_to_not_nullable_for_users.ts rename to packages/backend/src/db/migrations/20230218131824_alter_role_to_not_nullable_for_users.js index 505d18a4..90e4e30a 100644 --- a/packages/backend/src/db/migrations/20230218131824_alter_role_to_not_nullable_for_users.ts +++ b/packages/backend/src/db/migrations/20230218131824_alter_role_to_not_nullable_for_users.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.alterTable('users', (table) => { table.string('role').notNullable().alter(); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.alterTable('users', (table) => { table.string('role').nullable().alter(); }); diff --git a/packages/backend/src/db/migrations/20230218150517_add_reset_password_token_to_users.ts b/packages/backend/src/db/migrations/20230218150517_add_reset_password_token_to_users.js similarity index 59% rename from packages/backend/src/db/migrations/20230218150517_add_reset_password_token_to_users.ts rename to packages/backend/src/db/migrations/20230218150517_add_reset_password_token_to_users.js index 7d6cc518..ddd5bbc3 100644 --- a/packages/backend/src/db/migrations/20230218150517_add_reset_password_token_to_users.ts +++ b/packages/backend/src/db/migrations/20230218150517_add_reset_password_token_to_users.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('users', (table) => { table.string('reset_password_token'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('users', (table) => { table.dropColumn('reset_password_token'); }); diff --git a/packages/backend/src/db/migrations/20230218150758_add_reset_password_token_sent_at_to_users.ts b/packages/backend/src/db/migrations/20230218150758_add_reset_password_token_sent_at_to_users.js similarity index 61% rename from packages/backend/src/db/migrations/20230218150758_add_reset_password_token_sent_at_to_users.ts rename to packages/backend/src/db/migrations/20230218150758_add_reset_password_token_sent_at_to_users.js index 0371d30f..7373517c 100644 --- a/packages/backend/src/db/migrations/20230218150758_add_reset_password_token_sent_at_to_users.ts +++ b/packages/backend/src/db/migrations/20230218150758_add_reset_password_token_sent_at_to_users.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('users', (table) => { table.timestamp('reset_password_token_sent_at'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('users', (table) => { table.dropColumn('reset_password_token_sent_at'); }); diff --git a/packages/backend/src/db/migrations/20230301211751_add_full_name_to_users.ts b/packages/backend/src/db/migrations/20230301211751_add_full_name_to_users.js similarity index 64% rename from packages/backend/src/db/migrations/20230301211751_add_full_name_to_users.ts rename to packages/backend/src/db/migrations/20230301211751_add_full_name_to_users.js index 6795d02d..277e6817 100644 --- a/packages/backend/src/db/migrations/20230301211751_add_full_name_to_users.ts +++ b/packages/backend/src/db/migrations/20230301211751_add_full_name_to_users.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('users', async (table) => { table.string('full_name'); @@ -8,7 +6,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('users', (table) => { table.dropColumn('full_name'); }); diff --git a/packages/backend/src/db/migrations/20230303134548_create_payment_plans.ts b/packages/backend/src/db/migrations/20230303134548_create_payment_plans.js similarity index 79% rename from packages/backend/src/db/migrations/20230303134548_create_payment_plans.ts rename to packages/backend/src/db/migrations/20230303134548_create_payment_plans.js index 068b35a8..4ebe181f 100644 --- a/packages/backend/src/db/migrations/20230303134548_create_payment_plans.ts +++ b/packages/backend/src/db/migrations/20230303134548_create_payment_plans.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.createTable('payment_plans', (table) => { @@ -18,7 +17,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.dropTable('payment_plans'); } diff --git a/packages/backend/src/db/migrations/20230303180902_create_usage_data.ts b/packages/backend/src/db/migrations/20230303180902_create_usage_data.js similarity index 73% rename from packages/backend/src/db/migrations/20230303180902_create_usage_data.ts rename to packages/backend/src/db/migrations/20230303180902_create_usage_data.js index 31bfbb7e..953423d3 100644 --- a/packages/backend/src/db/migrations/20230303180902_create_usage_data.ts +++ b/packages/backend/src/db/migrations/20230303180902_create_usage_data.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.createTable('usage_data', (table) => { @@ -14,7 +13,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.dropTable('usage_data'); } diff --git a/packages/backend/src/db/migrations/20230306103149_alter_consumed_task_count_of_usage_data.ts b/packages/backend/src/db/migrations/20230306103149_alter_consumed_task_count_of_usage_data.js similarity index 64% rename from packages/backend/src/db/migrations/20230306103149_alter_consumed_task_count_of_usage_data.ts rename to packages/backend/src/db/migrations/20230306103149_alter_consumed_task_count_of_usage_data.js index dfc7c520..7a402b3d 100644 --- a/packages/backend/src/db/migrations/20230306103149_alter_consumed_task_count_of_usage_data.ts +++ b/packages/backend/src/db/migrations/20230306103149_alter_consumed_task_count_of_usage_data.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.alterTable('usage_data', (table) => { @@ -9,7 +8,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.alterTable('usage_data', (table) => { diff --git a/packages/backend/src/db/migrations/20230318220822_add_trial_expiry_date_to_users.ts b/packages/backend/src/db/migrations/20230318220822_add_trial_expiry_date_to_users.js similarity index 59% rename from packages/backend/src/db/migrations/20230318220822_add_trial_expiry_date_to_users.ts rename to packages/backend/src/db/migrations/20230318220822_add_trial_expiry_date_to_users.js index e3fa8799..0fb35e1d 100644 --- a/packages/backend/src/db/migrations/20230318220822_add_trial_expiry_date_to_users.ts +++ b/packages/backend/src/db/migrations/20230318220822_add_trial_expiry_date_to_users.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.table('users', (table) => { @@ -9,7 +8,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.table('users', (table) => { diff --git a/packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts b/packages/backend/src/db/migrations/20230323145809_create_subscriptions.js similarity index 80% rename from packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts rename to packages/backend/src/db/migrations/20230323145809_create_subscriptions.js index 5fa0663c..1d8ce06f 100644 --- a/packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts +++ b/packages/backend/src/db/migrations/20230323145809_create_subscriptions.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.createTable('subscriptions', (table) => { @@ -20,7 +19,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.dropTable('subscriptions'); diff --git a/packages/backend/src/db/migrations/20230324210051_add_deleted_at_to_subscriptions.ts b/packages/backend/src/db/migrations/20230324210051_add_deleted_at_to_subscriptions.js similarity index 61% rename from packages/backend/src/db/migrations/20230324210051_add_deleted_at_to_subscriptions.ts rename to packages/backend/src/db/migrations/20230324210051_add_deleted_at_to_subscriptions.js index 1252b94c..28a7d263 100644 --- a/packages/backend/src/db/migrations/20230324210051_add_deleted_at_to_subscriptions.ts +++ b/packages/backend/src/db/migrations/20230324210051_add_deleted_at_to_subscriptions.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.alterTable('subscriptions', (table) => { @@ -9,7 +8,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.alterTable('subscriptions', (table) => { diff --git a/packages/backend/src/db/migrations/20230402183738_add_subscription_id_in_usage_data.ts b/packages/backend/src/db/migrations/20230402183738_add_subscription_id_in_usage_data.js similarity index 63% rename from packages/backend/src/db/migrations/20230402183738_add_subscription_id_in_usage_data.ts rename to packages/backend/src/db/migrations/20230402183738_add_subscription_id_in_usage_data.js index e2018caf..d0ba0cb2 100644 --- a/packages/backend/src/db/migrations/20230402183738_add_subscription_id_in_usage_data.ts +++ b/packages/backend/src/db/migrations/20230402183738_add_subscription_id_in_usage_data.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.table('usage_data', (table) => { @@ -9,7 +8,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.table('usage_data', (table) => { diff --git a/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.ts b/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.js similarity index 62% rename from packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.ts rename to packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.js index dc9ee247..f7457b82 100644 --- a/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.ts +++ b/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.js @@ -1,7 +1,6 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.table('subscriptions', (table) => { @@ -9,7 +8,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.table('subscriptions', (table) => { diff --git a/packages/backend/src/db/migrations/20230415134138_drop_payment_plans.ts b/packages/backend/src/db/migrations/20230415134138_drop_payment_plans.js similarity index 79% rename from packages/backend/src/db/migrations/20230415134138_drop_payment_plans.ts rename to packages/backend/src/db/migrations/20230415134138_drop_payment_plans.js index b4a1b45c..51dbc3b0 100644 --- a/packages/backend/src/db/migrations/20230415134138_drop_payment_plans.ts +++ b/packages/backend/src/db/migrations/20230415134138_drop_payment_plans.js @@ -1,13 +1,12 @@ -import { Knex } from 'knex'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { if (!appConfig.isCloud) return; return knex.schema.dropTable('payment_plans'); } -export async function down(knex: Knex): Promise { +export async function down(knex) { if (!appConfig.isCloud) return; return knex.schema.createTable('payment_plans', (table) => { diff --git a/packages/backend/src/db/migrations/20230609201228_add_webhook_path_in_step.ts b/packages/backend/src/db/migrations/20230609201228_add_webhook_path_in_step.js similarity index 57% rename from packages/backend/src/db/migrations/20230609201228_add_webhook_path_in_step.ts rename to packages/backend/src/db/migrations/20230609201228_add_webhook_path_in_step.js index ecf264eb..361e7119 100644 --- a/packages/backend/src/db/migrations/20230609201228_add_webhook_path_in_step.ts +++ b/packages/backend/src/db/migrations/20230609201228_add_webhook_path_in_step.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.table('steps', (table) => { table.string('webhook_path'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.table('steps', (table) => { table.dropColumn('webhook_path'); }); diff --git a/packages/backend/src/db/migrations/20230609201909_populate_data_in_webhook_path_in_step.js b/packages/backend/src/db/migrations/20230609201909_populate_data_in_webhook_path_in_step.js new file mode 100644 index 00000000..37a23c01 --- /dev/null +++ b/packages/backend/src/db/migrations/20230609201909_populate_data_in_webhook_path_in_step.js @@ -0,0 +1,23 @@ +export async function up(knex) { + return await knex('steps') + .where('type', 'trigger') + .whereIn('app_key', [ + 'gitlab', + 'typeform', + 'twilio', + 'flowers-software', + 'webhook', + ]) + .update({ + webhook_path: knex.raw('? || ??', [ + '/webhooks/flows/', + knex.ref('flow_id'), + ]), + }); +} + +export async function down(knex) { + return await knex('steps').update({ + webhook_path: null, + }); +} diff --git a/packages/backend/src/db/migrations/20230609201909_populate_data_in_webhook_path_in_step.ts b/packages/backend/src/db/migrations/20230609201909_populate_data_in_webhook_path_in_step.ts deleted file mode 100644 index 83b414e2..00000000 --- a/packages/backend/src/db/migrations/20230609201909_populate_data_in_webhook_path_in_step.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { - return await knex('steps') - .where('type', 'trigger') - .whereIn('app_key', ['gitlab', 'typeform', 'twilio', 'flowers-software', 'webhook']) - .update({ - webhook_path: knex.raw('? || ??', ['/webhooks/flows/', knex.ref('flow_id')]), - }); -} - -export async function down(knex: Knex): Promise { - return await knex('steps').update({ - webhook_path: null - }); -} diff --git a/packages/backend/src/db/migrations/20230615200200_create_roles.ts b/packages/backend/src/db/migrations/20230615200200_create_roles.js similarity index 71% rename from packages/backend/src/db/migrations/20230615200200_create_roles.ts rename to packages/backend/src/db/migrations/20230615200200_create_roles.js index 85441512..5593b6c9 100644 --- a/packages/backend/src/db/migrations/20230615200200_create_roles.ts +++ b/packages/backend/src/db/migrations/20230615200200_create_roles.js @@ -1,8 +1,7 @@ -import { Knex } from 'knex'; -import capitalize from 'lodash/capitalize'; -import lowerCase from 'lodash/lowerCase'; +import capitalize from 'lodash/capitalize.js'; +import lowerCase from 'lodash/lowerCase.js'; -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex.schema.createTable('roles', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('name').notNullable(); @@ -12,9 +11,7 @@ export async function up(knex: Knex): Promise { table.timestamps(true, true); }); - const uniqueUserRoles = await knex('users') - .select('role') - .groupBy('role'); + const uniqueUserRoles = await knex('users').select('role').groupBy('role'); let shouldCreateAdminRole = true; for (const { role } of uniqueUserRoles) { @@ -41,6 +38,6 @@ export async function up(knex: Knex): Promise { } } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('roles'); } diff --git a/packages/backend/src/db/migrations/20230615205857_create_permissions.ts b/packages/backend/src/db/migrations/20230615205857_create_permissions.js similarity index 54% rename from packages/backend/src/db/migrations/20230615205857_create_permissions.ts rename to packages/backend/src/db/migrations/20230615205857_create_permissions.js index eb2462b5..598d16db 100644 --- a/packages/backend/src/db/migrations/20230615205857_create_permissions.ts +++ b/packages/backend/src/db/migrations/20230615205857_create_permissions.js @@ -1,14 +1,12 @@ -import { Knex } from 'knex'; - -const getPermissionForRole = (roleId: string, subject: string, actions: string[], conditions: string[] = []) => actions - .map(action => ({ +const getPermissionForRole = (roleId, subject, actions, conditions = []) => + actions.map((action) => ({ role_id: roleId, subject, action, conditions, })); -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex.schema.createTable('permissions', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.uuid('role_id').references('id').inTable('roles'); @@ -19,7 +17,7 @@ export async function up(knex: Knex): Promise { table.timestamps(true, true); }); - const roles = await knex('roles').select(['id', 'key']) as { id: string, key: string }[]; + const roles = await knex('roles').select(['id', 'key']); for (const role of roles) { // `admin` role should have no conditions unlike others by default @@ -28,21 +26,41 @@ export async function up(knex: Knex): Promise { // default permissions await knex('permissions').insert([ - ...getPermissionForRole(role.id, 'Connection', ['create', 'read', 'delete', 'update'], roleConditions), + ...getPermissionForRole( + role.id, + 'Connection', + ['create', 'read', 'delete', 'update'], + roleConditions + ), ...getPermissionForRole(role.id, 'Execution', ['read'], roleConditions), - ...getPermissionForRole(role.id, 'Flow', ['create', 'delete', 'publish', 'read', 'update'], roleConditions), + ...getPermissionForRole( + role.id, + 'Flow', + ['create', 'delete', 'publish', 'read', 'update'], + roleConditions + ), ]); // admin specific permission if (isAdmin) { await knex('permissions').insert([ - ...getPermissionForRole(role.id, 'User', ['create', 'read', 'delete', 'update']), - ...getPermissionForRole(role.id, 'Role', ['create', 'read', 'delete', 'update']), + ...getPermissionForRole(role.id, 'User', [ + 'create', + 'read', + 'delete', + 'update', + ]), + ...getPermissionForRole(role.id, 'Role', [ + 'create', + 'read', + 'delete', + 'update', + ]), ]); } } } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('permissions'); } diff --git a/packages/backend/src/db/migrations/20230615215004_add_role_id_to_users.ts b/packages/backend/src/db/migrations/20230615215004_add_role_id_to_users.js similarity index 74% rename from packages/backend/src/db/migrations/20230615215004_add_role_id_to_users.ts rename to packages/backend/src/db/migrations/20230615215004_add_role_id_to_users.js index e16000d7..f3fba1d4 100644 --- a/packages/backend/src/db/migrations/20230615215004_add_role_id_to_users.ts +++ b/packages/backend/src/db/migrations/20230615215004_add_role_id_to_users.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex.schema.table('users', async (table) => { table.uuid('role_id').references('id').inTable('roles'); }); @@ -11,10 +9,10 @@ export async function up(knex: Knex): Promise { for (const role of roles) { await knex('users') .where({ - role: role.key + role: role.key, }) .update({ - role_id: role.id + role_id: role.id, }); } @@ -22,7 +20,7 @@ export async function up(knex: Knex): Promise { await knex('users').whereNull('role_id').update({ role_id: theRole.id }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return await knex.schema.table('users', (table) => { table.dropColumn('role_id'); }); diff --git a/packages/backend/src/db/migrations/20230623115503_remove_role_column_in_users.ts b/packages/backend/src/db/migrations/20230623115503_remove_role_column_in_users.js similarity index 58% rename from packages/backend/src/db/migrations/20230623115503_remove_role_column_in_users.ts rename to packages/backend/src/db/migrations/20230623115503_remove_role_column_in_users.js index 5da0d486..56003257 100644 --- a/packages/backend/src/db/migrations/20230623115503_remove_role_column_in_users.ts +++ b/packages/backend/src/db/migrations/20230623115503_remove_role_column_in_users.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex.schema.table('users', async (table) => { table.dropColumn('role'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return await knex.schema.table('users', (table) => { table.string('role').defaultTo('user'); }); diff --git a/packages/backend/src/db/migrations/20230702210636_create_saml_auth_providers.ts b/packages/backend/src/db/migrations/20230702210636_create_saml_auth_providers.js similarity index 85% rename from packages/backend/src/db/migrations/20230702210636_create_saml_auth_providers.ts rename to packages/backend/src/db/migrations/20230702210636_create_saml_auth_providers.js index 63d72128..41cb01df 100644 --- a/packages/backend/src/db/migrations/20230702210636_create_saml_auth_providers.ts +++ b/packages/backend/src/db/migrations/20230702210636_create_saml_auth_providers.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('saml_auth_providers', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('name').notNullable(); @@ -19,6 +17,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('saml_auth_providers'); } diff --git a/packages/backend/src/db/migrations/20230707094923_create_identities.ts b/packages/backend/src/db/migrations/20230707094923_create_identities.js similarity index 75% rename from packages/backend/src/db/migrations/20230707094923_create_identities.ts rename to packages/backend/src/db/migrations/20230707094923_create_identities.js index 2e63f296..99be1f39 100644 --- a/packages/backend/src/db/migrations/20230707094923_create_identities.ts +++ b/packages/backend/src/db/migrations/20230707094923_create_identities.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('identities', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.uuid('user_id').references('id').inTable('users'); @@ -12,6 +10,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('identities'); } diff --git a/packages/backend/src/db/migrations/20230715214424_make_user_password_nullable.ts b/packages/backend/src/db/migrations/20230715214424_make_user_password_nullable.js similarity index 50% rename from packages/backend/src/db/migrations/20230715214424_make_user_password_nullable.ts rename to packages/backend/src/db/migrations/20230715214424_make_user_password_nullable.js index 4e73a3fa..7779d8e7 100644 --- a/packages/backend/src/db/migrations/20230715214424_make_user_password_nullable.ts +++ b/packages/backend/src/db/migrations/20230715214424_make_user_password_nullable.js @@ -1,11 +1,9 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return await knex.schema.alterTable('users', (table) => { table.string('password').nullable().alter(); }); } -export async function down(): Promise { +export async function down() { // void } diff --git a/packages/backend/src/db/migrations/20230807114158_seed_saml_permissions_to_admin.ts b/packages/backend/src/db/migrations/20230807114158_seed_saml_permissions_to_admin.js similarity index 56% rename from packages/backend/src/db/migrations/20230807114158_seed_saml_permissions_to_admin.ts rename to packages/backend/src/db/migrations/20230807114158_seed_saml_permissions_to_admin.js index 584127ce..16ff8681 100644 --- a/packages/backend/src/db/migrations/20230807114158_seed_saml_permissions_to_admin.ts +++ b/packages/backend/src/db/migrations/20230807114158_seed_saml_permissions_to_admin.js @@ -1,10 +1,4 @@ -import { Knex } from 'knex'; - -const getPermissionForRole = ( - roleId: string, - subject: string, - actions: string[] -) => +const getPermissionForRole = (roleId, subject, actions) => actions.map((action) => ({ role_id: roleId, subject, @@ -12,11 +6,11 @@ const getPermissionForRole = ( conditions: [], })); -export async function up(knex: Knex): Promise { - const role = (await knex('roles') +export async function up(knex) { + const role = await knex('roles') .first(['id', 'key']) .where({ key: 'admin' }) - .limit(1)) as { id: string; key: string }; + .limit(1); await knex('permissions').insert( getPermissionForRole(role.id, 'SamlAuthProvider', [ @@ -28,6 +22,6 @@ export async function up(knex: Knex): Promise { ); } -export async function down(knex: Knex): Promise { +export async function down(knex) { await knex('permissions').where({ subject: 'SamlAuthProvider' }).delete(); } diff --git a/packages/backend/src/db/migrations/20230810124730_create_config.ts b/packages/backend/src/db/migrations/20230810124730_create_config.js similarity index 69% rename from packages/backend/src/db/migrations/20230810124730_create_config.ts rename to packages/backend/src/db/migrations/20230810124730_create_config.js index 76bc914e..9b0ef170 100644 --- a/packages/backend/src/db/migrations/20230810124730_create_config.ts +++ b/packages/backend/src/db/migrations/20230810124730_create_config.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('config', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('key').unique().notNullable(); @@ -10,6 +8,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('config'); } diff --git a/packages/backend/src/db/migrations/20230810134714_seed_update_config_permissions_to_admin.js b/packages/backend/src/db/migrations/20230810134714_seed_update_config_permissions_to_admin.js new file mode 100644 index 00000000..63c7da6d --- /dev/null +++ b/packages/backend/src/db/migrations/20230810134714_seed_update_config_permissions_to_admin.js @@ -0,0 +1,22 @@ +const getPermissionForRole = (roleId, subject, actions) => + actions.map((action) => ({ + role_id: roleId, + subject, + action, + conditions: [], + })); + +export async function up(knex) { + const role = await knex('roles') + .first(['id', 'key']) + .where({ key: 'admin' }) + .limit(1); + + await knex('permissions').insert( + getPermissionForRole(role.id, 'Config', ['update']) + ); +} + +export async function down(knex) { + await knex('permissions').where({ subject: 'Config' }).delete(); +} diff --git a/packages/backend/src/db/migrations/20230810134714_seed_update_config_permissions_to_admin.ts b/packages/backend/src/db/migrations/20230810134714_seed_update_config_permissions_to_admin.ts deleted file mode 100644 index e953a085..00000000 --- a/packages/backend/src/db/migrations/20230810134714_seed_update_config_permissions_to_admin.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Knex } from 'knex'; - -const getPermissionForRole = ( - roleId: string, - subject: string, - actions: string[] -) => - actions.map((action) => ({ - role_id: roleId, - subject, - action, - conditions: [], - })); - -export async function up(knex: Knex): Promise { - const role = (await knex('roles') - .first(['id', 'key']) - .where({ key: 'admin' }) - .limit(1)) as { id: string; key: string }; - - await knex('permissions').insert( - getPermissionForRole(role.id, 'Config', [ - 'update', - ]) - ); -} - -export async function down(knex: Knex): Promise { - await knex('permissions').where({ subject: 'Config' }).delete(); -} diff --git a/packages/backend/src/db/migrations/20230811142340_create_saml_auth_providers_role_mappings.ts b/packages/backend/src/db/migrations/20230811142340_create_saml_auth_providers_role_mappings.js similarity index 80% rename from packages/backend/src/db/migrations/20230811142340_create_saml_auth_providers_role_mappings.ts rename to packages/backend/src/db/migrations/20230811142340_create_saml_auth_providers_role_mappings.js index 36949f5f..0f310797 100644 --- a/packages/backend/src/db/migrations/20230811142340_create_saml_auth_providers_role_mappings.ts +++ b/packages/backend/src/db/migrations/20230811142340_create_saml_auth_providers_role_mappings.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable( 'saml_auth_providers_role_mappings', (table) => { @@ -19,6 +17,6 @@ export async function up(knex: Knex): Promise { ); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('saml_auth_providers_role_mappings'); } diff --git a/packages/backend/src/db/migrations/20230812132005_create_app_configs.ts b/packages/backend/src/db/migrations/20230812132005_create_app_configs.js similarity index 77% rename from packages/backend/src/db/migrations/20230812132005_create_app_configs.ts rename to packages/backend/src/db/migrations/20230812132005_create_app_configs.js index 18d7c79c..028ebbe5 100644 --- a/packages/backend/src/db/migrations/20230812132005_create_app_configs.ts +++ b/packages/backend/src/db/migrations/20230812132005_create_app_configs.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('app_configs', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('key').unique().notNullable(); @@ -12,6 +10,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('app_configs'); } diff --git a/packages/backend/src/db/migrations/20230813172729_create_app_auth_clients.ts b/packages/backend/src/db/migrations/20230813172729_create_app_auth_clients.js similarity index 63% rename from packages/backend/src/db/migrations/20230813172729_create_app_auth_clients.ts rename to packages/backend/src/db/migrations/20230813172729_create_app_auth_clients.js index 4a47a167..4d690e80 100644 --- a/packages/backend/src/db/migrations/20230813172729_create_app_auth_clients.ts +++ b/packages/backend/src/db/migrations/20230813172729_create_app_auth_clients.js @@ -1,10 +1,12 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { return knex.schema.createTable('app_auth_clients', (table) => { table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); table.string('name').unique().notNullable(); - table.uuid('app_config_id').notNullable().references('id').inTable('app_configs'); + table + .uuid('app_config_id') + .notNullable() + .references('id') + .inTable('app_configs'); table.text('auth_defaults').notNullable(); table.boolean('active').notNullable().defaultTo(false); @@ -12,6 +14,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return knex.schema.dropTable('app_auth_clients'); } diff --git a/packages/backend/src/db/migrations/20230815161102_add_app_auth_client_id_in_connections.js b/packages/backend/src/db/migrations/20230815161102_add_app_auth_client_id_in_connections.js new file mode 100644 index 00000000..c5210926 --- /dev/null +++ b/packages/backend/src/db/migrations/20230815161102_add_app_auth_client_id_in_connections.js @@ -0,0 +1,14 @@ +export async function up(knex) { + await knex.schema.table('connections', async (table) => { + table + .uuid('app_auth_client_id') + .references('id') + .inTable('app_auth_clients'); + }); +} + +export async function down(knex) { + return await knex.schema.table('connections', (table) => { + table.dropColumn('app_auth_client_id'); + }); +} diff --git a/packages/backend/src/db/migrations/20230815161102_add_app_auth_client_id_in_connections.ts b/packages/backend/src/db/migrations/20230815161102_add_app_auth_client_id_in_connections.ts deleted file mode 100644 index c2da6a55..00000000 --- a/packages/backend/src/db/migrations/20230815161102_add_app_auth_client_id_in_connections.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { - await knex.schema.table('connections', async (table) => { - table.uuid('app_auth_client_id').references('id').inTable('app_auth_clients'); - }); -} - -export async function down(knex: Knex): Promise { - return await knex.schema.table('connections', (table) => { - table.dropColumn('app_auth_client_id'); - }); -} diff --git a/packages/backend/src/db/migrations/20230816121044_seed_update_app_permissions_to_admin.js b/packages/backend/src/db/migrations/20230816121044_seed_update_app_permissions_to_admin.js new file mode 100644 index 00000000..ae990450 --- /dev/null +++ b/packages/backend/src/db/migrations/20230816121044_seed_update_app_permissions_to_admin.js @@ -0,0 +1,22 @@ +const getPermissionForRole = (roleId, subject, actions) => + actions.map((action) => ({ + role_id: roleId, + subject, + action, + conditions: [], + })); + +export async function up(knex) { + const role = await knex('roles') + .first(['id', 'key']) + .where({ key: 'admin' }) + .limit(1); + + await knex('permissions').insert( + getPermissionForRole(role.id, 'App', ['create', 'read', 'delete', 'update']) + ); +} + +export async function down(knex) { + await knex('permissions').where({ subject: 'App' }).delete(); +} diff --git a/packages/backend/src/db/migrations/20230816121044_seed_update_app_permissions_to_admin.ts b/packages/backend/src/db/migrations/20230816121044_seed_update_app_permissions_to_admin.ts deleted file mode 100644 index 0117ed09..00000000 --- a/packages/backend/src/db/migrations/20230816121044_seed_update_app_permissions_to_admin.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Knex } from 'knex'; - -const getPermissionForRole = ( - roleId: string, - subject: string, - actions: string[] -) => - actions.map((action) => ({ - role_id: roleId, - subject, - action, - conditions: [], - })); - -export async function up(knex: Knex): Promise { - const role = (await knex('roles') - .first(['id', 'key']) - .where({ key: 'admin' }) - .limit(1)) as { id: string; key: string }; - - await knex('permissions').insert( - getPermissionForRole(role.id, 'App', [ - 'create', - 'read', - 'delete', - 'update', - ]) - ); -} - -export async function down(knex: Knex): Promise { - await knex('permissions').where({ subject: 'App' }).delete(); -} diff --git a/packages/backend/src/db/migrations/20230816173027_make_role_id_not_nullable_in_users.ts b/packages/backend/src/db/migrations/20230816173027_make_role_id_not_nullable_in_users.js similarity index 78% rename from packages/backend/src/db/migrations/20230816173027_make_role_id_not_nullable_in_users.ts rename to packages/backend/src/db/migrations/20230816173027_make_role_id_not_nullable_in_users.js index 41b9bd93..e39f3878 100644 --- a/packages/backend/src/db/migrations/20230816173027_make_role_id_not_nullable_in_users.ts +++ b/packages/backend/src/db/migrations/20230816173027_make_role_id_not_nullable_in_users.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { const role = await knex('roles') .select('id') .whereIn('key', ['user', 'admin']) @@ -18,7 +16,7 @@ export async function up(knex: Knex): Promise { }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { return await knex.schema.alterTable('users', (table) => { table.uuid('role_id').nullable().alter(); }); diff --git a/packages/backend/src/db/migrations/20230824105813_soft_delete_soft_deleted_user_associations.ts b/packages/backend/src/db/migrations/20230824105813_soft_delete_soft_deleted_user_associations.js similarity index 87% rename from packages/backend/src/db/migrations/20230824105813_soft_delete_soft_deleted_user_associations.ts rename to packages/backend/src/db/migrations/20230824105813_soft_delete_soft_deleted_user_associations.js index dd69a3d8..fdd1b6ce 100644 --- a/packages/backend/src/db/migrations/20230824105813_soft_delete_soft_deleted_user_associations.ts +++ b/packages/backend/src/db/migrations/20230824105813_soft_delete_soft_deleted_user_associations.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { const users = await knex('users').whereNotNull('deleted_at'); const userIds = users.map((user) => user.id); @@ -30,6 +28,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(): Promise { +export async function down() { // void } diff --git a/packages/backend/src/db/migrations/20230828134734_convert_permission_conditions_to_array.ts b/packages/backend/src/db/migrations/20230828134734_convert_permission_conditions_to_array.js similarity index 55% rename from packages/backend/src/db/migrations/20230828134734_convert_permission_conditions_to_array.ts rename to packages/backend/src/db/migrations/20230828134734_convert_permission_conditions_to_array.js index 509532f7..c6056cf1 100644 --- a/packages/backend/src/db/migrations/20230828134734_convert_permission_conditions_to_array.ts +++ b/packages/backend/src/db/migrations/20230828134734_convert_permission_conditions_to_array.js @@ -1,11 +1,9 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex('permissions') .where(knex.raw('conditions::text'), '=', knex.raw("'{}'::text")) .update('conditions', JSON.stringify([])); } -export async function down(): Promise { +export async function down() { // void } diff --git a/packages/backend/src/db/migrations/20231013094544_convert_user_emails_to_lowercase.ts b/packages/backend/src/db/migrations/20231013094544_convert_user_emails_to_lowercase.js similarity index 51% rename from packages/backend/src/db/migrations/20231013094544_convert_user_emails_to_lowercase.ts rename to packages/backend/src/db/migrations/20231013094544_convert_user_emails_to_lowercase.js index 623bfc75..e179ff45 100644 --- a/packages/backend/src/db/migrations/20231013094544_convert_user_emails_to_lowercase.ts +++ b/packages/backend/src/db/migrations/20231013094544_convert_user_emails_to_lowercase.js @@ -1,6 +1,4 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex('users') .whereRaw('email != LOWER(email)') .update({ @@ -8,6 +6,6 @@ export async function up(knex: Knex): Promise { }); } -export async function down(): Promise { +export async function down() { // void } diff --git a/packages/backend/src/db/migrations/20231025101146_add_flow_id_index_in_executions.ts b/packages/backend/src/db/migrations/20231025101146_add_flow_id_index_in_executions.js similarity index 56% rename from packages/backend/src/db/migrations/20231025101146_add_flow_id_index_in_executions.ts rename to packages/backend/src/db/migrations/20231025101146_add_flow_id_index_in_executions.js index ea98e45f..be9c1135 100644 --- a/packages/backend/src/db/migrations/20231025101146_add_flow_id_index_in_executions.ts +++ b/packages/backend/src/db/migrations/20231025101146_add_flow_id_index_in_executions.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex.schema.table('executions', (table) => { table.index('flow_id'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { await knex.schema.table('executions', (table) => { table.dropIndex('flow_id'); }); diff --git a/packages/backend/src/db/migrations/20231025101923_add_updated_at_index_in_executions.ts b/packages/backend/src/db/migrations/20231025101923_add_updated_at_index_in_executions.js similarity index 57% rename from packages/backend/src/db/migrations/20231025101923_add_updated_at_index_in_executions.ts rename to packages/backend/src/db/migrations/20231025101923_add_updated_at_index_in_executions.js index 6dc51bb6..43d95dd5 100644 --- a/packages/backend/src/db/migrations/20231025101923_add_updated_at_index_in_executions.ts +++ b/packages/backend/src/db/migrations/20231025101923_add_updated_at_index_in_executions.js @@ -1,12 +1,10 @@ -import { Knex } from 'knex'; - -export async function up(knex: Knex): Promise { +export async function up(knex) { await knex.schema.table('executions', (table) => { table.index('updated_at'); }); } -export async function down(knex: Knex): Promise { +export async function down(knex) { await knex.schema.table('executions', (table) => { table.dropIndex('updated_at'); }); diff --git a/packages/backend/src/errors/already-processed.js b/packages/backend/src/errors/already-processed.js index 2f3ef6a8..d38b0ea3 100644 --- a/packages/backend/src/errors/already-processed.js +++ b/packages/backend/src/errors/already-processed.js @@ -1,3 +1,3 @@ -import BaseError from './base'; +import BaseError from './base.js'; -export default class AlreadyProcessedError extends BaseError { } +export default class AlreadyProcessedError extends BaseError {} diff --git a/packages/backend/src/errors/early-exit.js b/packages/backend/src/errors/early-exit.js index c0d92d2c..5e8a2451 100644 --- a/packages/backend/src/errors/early-exit.js +++ b/packages/backend/src/errors/early-exit.js @@ -1,3 +1,3 @@ -import BaseError from './base'; +import BaseError from './base.js'; export default class EarlyExitError extends BaseError {} diff --git a/packages/backend/src/errors/http.js b/packages/backend/src/errors/http.js index 0a3ac8f1..1d0af01e 100644 --- a/packages/backend/src/errors/http.js +++ b/packages/backend/src/errors/http.js @@ -1,4 +1,4 @@ -import BaseError from './base'; +import BaseError from './base.js'; export default class HttpError extends BaseError { constructor(error) { diff --git a/packages/backend/src/errors/quote-exceeded.js b/packages/backend/src/errors/quote-exceeded.js index 6a3239d0..7ca48d3c 100644 --- a/packages/backend/src/errors/quote-exceeded.js +++ b/packages/backend/src/errors/quote-exceeded.js @@ -1,4 +1,4 @@ -import BaseError from './base'; +import BaseError from './base.js'; export default class QuotaExceededError extends BaseError { constructor(error = 'The allowed task quota has been exhausted!') { diff --git a/packages/backend/src/graphql/mutation-resolvers.js b/packages/backend/src/graphql/mutation-resolvers.js index 1dc619e5..5d90f137 100644 --- a/packages/backend/src/graphql/mutation-resolvers.js +++ b/packages/backend/src/graphql/mutation-resolvers.js @@ -1,37 +1,37 @@ -import createAppAuthClient from './mutations/create-app-auth-client.ee'; -import createAppConfig from './mutations/create-app-config.ee'; -import createConnection from './mutations/create-connection'; -import createFlow from './mutations/create-flow'; -import createRole from './mutations/create-role.ee'; -import createStep from './mutations/create-step'; -import createUser from './mutations/create-user.ee'; -import deleteConnection from './mutations/delete-connection'; -import deleteCurrentUser from './mutations/delete-current-user.ee'; -import deleteFlow from './mutations/delete-flow'; -import deleteRole from './mutations/delete-role.ee'; -import deleteStep from './mutations/delete-step'; -import deleteUser from './mutations/delete-user.ee'; -import duplicateFlow from './mutations/duplicate-flow'; -import executeFlow from './mutations/execute-flow'; -import forgotPassword from './mutations/forgot-password.ee'; -import generateAuthUrl from './mutations/generate-auth-url'; -import login from './mutations/login'; -import registerUser from './mutations/register-user.ee'; -import resetConnection from './mutations/reset-connection'; -import resetPassword from './mutations/reset-password.ee'; -import updateAppAuthClient from './mutations/update-app-auth-client.ee'; -import updateAppConfig from './mutations/update-app-config.ee'; -import updateConfig from './mutations/update-config.ee'; -import updateConnection from './mutations/update-connection'; -import updateCurrentUser from './mutations/update-current-user'; -import updateFlow from './mutations/update-flow'; -import updateFlowStatus from './mutations/update-flow-status'; -import updateRole from './mutations/update-role.ee'; -import updateStep from './mutations/update-step'; -import updateUser from './mutations/update-user.ee'; -import upsertSamlAuthProvider from './mutations/upsert-saml-auth-provider.ee'; -import upsertSamlAuthProvidersRoleMappings from './mutations/upsert-saml-auth-providers-role-mappings.ee'; -import verifyConnection from './mutations/verify-connection'; +import createAppAuthClient from './mutations/create-app-auth-client.ee.js'; +import createAppConfig from './mutations/create-app-config.ee.js'; +import createConnection from './mutations/create-connection.js'; +import createFlow from './mutations/create-flow.js'; +import createRole from './mutations/create-role.ee.js'; +import createStep from './mutations/create-step.js'; +import createUser from './mutations/create-user.ee.js'; +import deleteConnection from './mutations/delete-connection.js'; +import deleteCurrentUser from './mutations/delete-current-user.ee.js'; +import deleteFlow from './mutations/delete-flow.js'; +import deleteRole from './mutations/delete-role.ee.js'; +import deleteStep from './mutations/delete-step.js'; +import deleteUser from './mutations/delete-user.ee.js'; +import duplicateFlow from './mutations/duplicate-flow.js'; +import executeFlow from './mutations/execute-flow.js'; +import forgotPassword from './mutations/forgot-password.ee.js'; +import generateAuthUrl from './mutations/generate-auth-url.js'; +import login from './mutations/login.js'; +import registerUser from './mutations/register-user.ee.js'; +import resetConnection from './mutations/reset-connection.js'; +import resetPassword from './mutations/reset-password.ee.js'; +import updateAppAuthClient from './mutations/update-app-auth-client.ee.js'; +import updateAppConfig from './mutations/update-app-config.ee.js'; +import updateConfig from './mutations/update-config.ee.js'; +import updateConnection from './mutations/update-connection.js'; +import updateCurrentUser from './mutations/update-current-user.js'; +import updateFlow from './mutations/update-flow.js'; +import updateFlowStatus from './mutations/update-flow-status.js'; +import updateRole from './mutations/update-role.ee.js'; +import updateStep from './mutations/update-step.js'; +import updateUser from './mutations/update-user.ee.js'; +import upsertSamlAuthProvider from './mutations/upsert-saml-auth-provider.ee.js'; +import upsertSamlAuthProvidersRoleMappings from './mutations/upsert-saml-auth-providers-role-mappings.ee.js'; +import verifyConnection from './mutations/verify-connection.js'; const mutationResolvers = { createAppAuthClient, diff --git a/packages/backend/src/graphql/mutations/create-app-auth-client.ee.js b/packages/backend/src/graphql/mutations/create-app-auth-client.ee.js index d0536cc1..6af40984 100644 --- a/packages/backend/src/graphql/mutations/create-app-auth-client.ee.js +++ b/packages/backend/src/graphql/mutations/create-app-auth-client.ee.js @@ -1,4 +1,4 @@ -import AppConfig from '../../models/app-config'; +import AppConfig from '../../models/app-config.js'; const createAppAuthClient = async (_parent, params, context) => { context.currentUser.can('update', 'App'); diff --git a/packages/backend/src/graphql/mutations/create-app-config.ee.js b/packages/backend/src/graphql/mutations/create-app-config.ee.js index 4a699b25..32b1debc 100644 --- a/packages/backend/src/graphql/mutations/create-app-config.ee.js +++ b/packages/backend/src/graphql/mutations/create-app-config.ee.js @@ -1,5 +1,5 @@ -import App from '../../models/app'; -import AppConfig from '../../models/app-config'; +import App from '../../models/app.js'; +import AppConfig from '../../models/app-config.js'; const createAppConfig = async (_parent, params, context) => { context.currentUser.can('update', 'App'); diff --git a/packages/backend/src/graphql/mutations/create-connection.js b/packages/backend/src/graphql/mutations/create-connection.js index f2498e91..2378a0eb 100644 --- a/packages/backend/src/graphql/mutations/create-connection.js +++ b/packages/backend/src/graphql/mutations/create-connection.js @@ -1,5 +1,5 @@ -import App from '../../models/app'; -import AppConfig from '../../models/app-config'; +import App from '../../models/app.js'; +import AppConfig from '../../models/app-config.js'; const createConnection = async (_parent, params, context) => { context.currentUser.can('create', 'Connection'); diff --git a/packages/backend/src/graphql/mutations/create-flow.js b/packages/backend/src/graphql/mutations/create-flow.js index 3cd11aa1..c16166d9 100644 --- a/packages/backend/src/graphql/mutations/create-flow.js +++ b/packages/backend/src/graphql/mutations/create-flow.js @@ -1,5 +1,5 @@ -import App from '../../models/app'; -import Step from '../../models/step'; +import App from '../../models/app.js'; +import Step from '../../models/step.js'; const createFlow = async (_parent, params, context) => { context.currentUser.can('create', 'Flow'); diff --git a/packages/backend/src/graphql/mutations/create-role.ee.js b/packages/backend/src/graphql/mutations/create-role.ee.js index 1a0b08c0..7e85207b 100644 --- a/packages/backend/src/graphql/mutations/create-role.ee.js +++ b/packages/backend/src/graphql/mutations/create-role.ee.js @@ -1,5 +1,5 @@ -import kebabCase from 'lodash/kebabCase'; -import Role from '../../models/role'; +import kebabCase from 'lodash/kebabCase.js'; +import Role from '../../models/role.js'; const createRole = async (_parent, params, context) => { context.currentUser.can('create', 'Role'); diff --git a/packages/backend/src/graphql/mutations/create-step.js b/packages/backend/src/graphql/mutations/create-step.js index d037e8fc..05b8d364 100644 --- a/packages/backend/src/graphql/mutations/create-step.js +++ b/packages/backend/src/graphql/mutations/create-step.js @@ -1,5 +1,5 @@ -import App from '../../models/app'; -import Flow from '../../models/flow'; +import App from '../../models/app.js'; +import Flow from '../../models/flow.js'; const createStep = async (_parent, params, context) => { const conditions = context.currentUser.can('update', 'Flow'); diff --git a/packages/backend/src/graphql/mutations/create-user.ee.js b/packages/backend/src/graphql/mutations/create-user.ee.js index 2f7d616f..2bd732a1 100644 --- a/packages/backend/src/graphql/mutations/create-user.ee.js +++ b/packages/backend/src/graphql/mutations/create-user.ee.js @@ -1,5 +1,5 @@ -import User from '../../models/user'; -import Role from '../../models/role'; +import User from '../../models/user.js'; +import Role from '../../models/role.js'; const createUser = async (_parent, params, context) => { context.currentUser.can('create', 'User'); diff --git a/packages/backend/src/graphql/mutations/delete-current-user.ee.js b/packages/backend/src/graphql/mutations/delete-current-user.ee.js index 8483d407..273b4ce2 100644 --- a/packages/backend/src/graphql/mutations/delete-current-user.ee.js +++ b/packages/backend/src/graphql/mutations/delete-current-user.ee.js @@ -1,9 +1,9 @@ import { Duration } from 'luxon'; -import deleteUserQueue from '../../queues/delete-user.ee'; -import flowQueue from '../../queues/flow'; -import Flow from '../../models/flow'; -import ExecutionStep from '../../models/execution-step'; -import appConfig from '../../config/app'; +import deleteUserQueue from '../../queues/delete-user.ee.js'; +import flowQueue from '../../queues/flow.js'; +import Flow from '../../models/flow.js'; +import ExecutionStep from '../../models/execution-step.js'; +import appConfig from '../../config/app.js'; const deleteCurrentUser = async (_parent, params, context) => { const id = context.currentUser.id; diff --git a/packages/backend/src/graphql/mutations/delete-flow.js b/packages/backend/src/graphql/mutations/delete-flow.js index 1a122df7..484e09c9 100644 --- a/packages/backend/src/graphql/mutations/delete-flow.js +++ b/packages/backend/src/graphql/mutations/delete-flow.js @@ -1,7 +1,7 @@ -import Flow from '../../models/flow'; -import ExecutionStep from '../../models/execution-step'; -import globalVariable from '../../helpers/global-variable'; -import logger from '../../helpers/logger'; +import Flow from '../../models/flow.js'; +import ExecutionStep from '../../models/execution-step.js'; +import globalVariable from '../../helpers/global-variable.js'; +import logger from '../../helpers/logger.js'; const deleteFlow = async (_parent, params, context) => { const conditions = context.currentUser.can('delete', 'Flow'); diff --git a/packages/backend/src/graphql/mutations/delete-role.ee.js b/packages/backend/src/graphql/mutations/delete-role.ee.js index f653df43..9b0249a2 100644 --- a/packages/backend/src/graphql/mutations/delete-role.ee.js +++ b/packages/backend/src/graphql/mutations/delete-role.ee.js @@ -1,5 +1,5 @@ -import Role from '../../models/role'; -import SamlAuthProvider from '../../models/saml-auth-provider.ee'; +import Role from '../../models/role.js'; +import SamlAuthProvider from '../../models/saml-auth-provider.ee.js'; const deleteRole = async (_parent, params, context) => { context.currentUser.can('delete', 'Role'); diff --git a/packages/backend/src/graphql/mutations/delete-user.ee.js b/packages/backend/src/graphql/mutations/delete-user.ee.js index cd83eacb..7b66dd05 100644 --- a/packages/backend/src/graphql/mutations/delete-user.ee.js +++ b/packages/backend/src/graphql/mutations/delete-user.ee.js @@ -1,6 +1,6 @@ import { Duration } from 'luxon'; -import User from '../../models/user'; -import deleteUserQueue from '../../queues/delete-user.ee'; +import User from '../../models/user.js'; +import deleteUserQueue from '../../queues/delete-user.ee.js'; const deleteUser = async (_parent, params, context) => { context.currentUser.can('delete', 'User'); diff --git a/packages/backend/src/graphql/mutations/execute-flow.js b/packages/backend/src/graphql/mutations/execute-flow.js index a7d9c327..501b723b 100644 --- a/packages/backend/src/graphql/mutations/execute-flow.js +++ b/packages/backend/src/graphql/mutations/execute-flow.js @@ -1,5 +1,5 @@ -import testRun from '../../services/test-run'; -import Step from '../../models/step'; +import testRun from '../../services/test-run.js'; +import Step from '../../models/step.js'; const executeFlow = async (_parent, params, context) => { const conditions = context.currentUser.can('update', 'Flow'); diff --git a/packages/backend/src/graphql/mutations/forgot-password.ee.js b/packages/backend/src/graphql/mutations/forgot-password.ee.js index 94e6b5ee..da5446d9 100644 --- a/packages/backend/src/graphql/mutations/forgot-password.ee.js +++ b/packages/backend/src/graphql/mutations/forgot-password.ee.js @@ -1,10 +1,10 @@ -import appConfig from '../../config/app'; -import User from '../../models/user'; -import emailQueue from '../../queues/email'; +import appConfig from '../../config/app.js'; +import User from '../../models/user.js'; +import emailQueue from '../../queues/email.js'; import { REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from '../../helpers/remove-job-configuration'; +} from '../../helpers/remove-job-configuration.js'; const forgotPassword = async (_parent, params) => { const { email } = params.input; diff --git a/packages/backend/src/graphql/mutations/generate-auth-url.js b/packages/backend/src/graphql/mutations/generate-auth-url.js index 60d0581c..17948c14 100644 --- a/packages/backend/src/graphql/mutations/generate-auth-url.js +++ b/packages/backend/src/graphql/mutations/generate-auth-url.js @@ -1,5 +1,5 @@ -import globalVariable from '../../helpers/global-variable'; -import App from '../../models/app'; +import globalVariable from '../../helpers/global-variable.js'; +import App from '../../models/app.js'; const generateAuthUrl = async (_parent, params, context) => { context.currentUser.can('create', 'Connection'); @@ -15,8 +15,10 @@ const generateAuthUrl = async (_parent, params, context) => { return null; } - const authInstance = (await import(`../../apps/${connection.key}/auth`)) - .default; + const authInstance = ( + await import(`../../apps/${connection.key}/auth/index.js`) + ).default; + const app = await App.findOneByKey(connection.key); const $ = await globalVariable({ connection, app }); diff --git a/packages/backend/src/graphql/mutations/login.js b/packages/backend/src/graphql/mutations/login.js index a00d5af8..de9d036d 100644 --- a/packages/backend/src/graphql/mutations/login.js +++ b/packages/backend/src/graphql/mutations/login.js @@ -1,5 +1,5 @@ -import User from '../../models/user'; -import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; +import User from '../../models/user.js'; +import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id.js'; const login = async (_parent, params) => { const user = await User.query().findOne({ diff --git a/packages/backend/src/graphql/mutations/register-user.ee.js b/packages/backend/src/graphql/mutations/register-user.ee.js index 860258f0..c24d1922 100644 --- a/packages/backend/src/graphql/mutations/register-user.ee.js +++ b/packages/backend/src/graphql/mutations/register-user.ee.js @@ -1,5 +1,5 @@ -import User from '../../models/user'; -import Role from '../../models/role'; +import User from '../../models/user.js'; +import Role from '../../models/role.js'; const registerUser = async (_parent, params) => { const { fullName, email, password } = params.input; diff --git a/packages/backend/src/graphql/mutations/reset-password.ee.js b/packages/backend/src/graphql/mutations/reset-password.ee.js index 15177b17..309b006a 100644 --- a/packages/backend/src/graphql/mutations/reset-password.ee.js +++ b/packages/backend/src/graphql/mutations/reset-password.ee.js @@ -1,4 +1,4 @@ -import User from '../../models/user'; +import User from '../../models/user.js'; const resetPassword = async (_parent, params) => { const { token, password } = params.input; diff --git a/packages/backend/src/graphql/mutations/update-app-auth-client.ee.js b/packages/backend/src/graphql/mutations/update-app-auth-client.ee.js index b373a282..bbd0380c 100644 --- a/packages/backend/src/graphql/mutations/update-app-auth-client.ee.js +++ b/packages/backend/src/graphql/mutations/update-app-auth-client.ee.js @@ -1,4 +1,4 @@ -import AppAuthClient from '../../models/app-auth-client'; +import AppAuthClient from '../../models/app-auth-client.js'; const updateAppAuthClient = async (_parent, params, context) => { context.currentUser.can('update', 'App'); diff --git a/packages/backend/src/graphql/mutations/update-app-config.ee.js b/packages/backend/src/graphql/mutations/update-app-config.ee.js index ce95cc5d..1187aee7 100644 --- a/packages/backend/src/graphql/mutations/update-app-config.ee.js +++ b/packages/backend/src/graphql/mutations/update-app-config.ee.js @@ -1,4 +1,4 @@ -import AppConfig from '../../models/app-config'; +import AppConfig from '../../models/app-config.js'; const updateAppConfig = async (_parent, params, context) => { context.currentUser.can('update', 'App'); diff --git a/packages/backend/src/graphql/mutations/update-config.ee.js b/packages/backend/src/graphql/mutations/update-config.ee.js index 02371f89..ad216d64 100644 --- a/packages/backend/src/graphql/mutations/update-config.ee.js +++ b/packages/backend/src/graphql/mutations/update-config.ee.js @@ -1,4 +1,4 @@ -import Config from '../../models/config'; +import Config from '../../models/config.js'; const updateConfig = async (_parent, params, context) => { context.currentUser.can('update', 'Config'); diff --git a/packages/backend/src/graphql/mutations/update-connection.js b/packages/backend/src/graphql/mutations/update-connection.js index 49e81f05..bc8cdc58 100644 --- a/packages/backend/src/graphql/mutations/update-connection.js +++ b/packages/backend/src/graphql/mutations/update-connection.js @@ -1,4 +1,4 @@ -import AppAuthClient from '../../models/app-auth-client'; +import AppAuthClient from '../../models/app-auth-client.js'; const updateConnection = async (_parent, params, context) => { context.currentUser.can('create', 'Connection'); diff --git a/packages/backend/src/graphql/mutations/update-flow-status.js b/packages/backend/src/graphql/mutations/update-flow-status.js index f94fca0b..169996f2 100644 --- a/packages/backend/src/graphql/mutations/update-flow-status.js +++ b/packages/backend/src/graphql/mutations/update-flow-status.js @@ -1,10 +1,10 @@ -import Flow from '../../models/flow'; -import flowQueue from '../../queues/flow'; +import Flow from '../../models/flow.js'; +import flowQueue from '../../queues/flow.js'; import { REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from '../../helpers/remove-job-configuration'; -import globalVariable from '../../helpers/global-variable'; +} from '../../helpers/remove-job-configuration.js'; +import globalVariable from '../../helpers/global-variable.js'; const JOB_NAME = 'flow'; const EVERY_15_MINUTES_CRON = '*/15 * * * *'; diff --git a/packages/backend/src/graphql/mutations/update-role.ee.js b/packages/backend/src/graphql/mutations/update-role.ee.js index 5d00456a..2566dc40 100644 --- a/packages/backend/src/graphql/mutations/update-role.ee.js +++ b/packages/backend/src/graphql/mutations/update-role.ee.js @@ -1,6 +1,6 @@ -import Role from '../../models/role'; -import Permission from '../../models/permission'; -import permissionCatalog from '../../helpers/permission-catalog.ee'; +import Role from '../../models/role.js'; +import Permission from '../../models/permission.js'; +import permissionCatalog from '../../helpers/permission-catalog.ee.js'; const updateRole = async (_parent, params, context) => { context.currentUser.can('update', 'Role'); diff --git a/packages/backend/src/graphql/mutations/update-step.js b/packages/backend/src/graphql/mutations/update-step.js index 061ffebf..3d87bb53 100644 --- a/packages/backend/src/graphql/mutations/update-step.js +++ b/packages/backend/src/graphql/mutations/update-step.js @@ -1,6 +1,6 @@ -import App from '../../models/app'; -import Step from '../../models/step'; -import Connection from '../../models/connection'; +import App from '../../models/app.js'; +import Step from '../../models/step.js'; +import Connection from '../../models/connection.js'; const updateStep = async (_parent, params, context) => { const { isCreator } = context.currentUser.can('update', 'Flow'); diff --git a/packages/backend/src/graphql/mutations/update-user.ee.js b/packages/backend/src/graphql/mutations/update-user.ee.js index a2417a7c..0e27eedb 100644 --- a/packages/backend/src/graphql/mutations/update-user.ee.js +++ b/packages/backend/src/graphql/mutations/update-user.ee.js @@ -1,4 +1,4 @@ -import User from '../../models/user'; +import User from '../../models/user.js'; const updateUser = async (_parent, params, context) => { context.currentUser.can('update', 'User'); diff --git a/packages/backend/src/graphql/mutations/upsert-saml-auth-provider.ee.js b/packages/backend/src/graphql/mutations/upsert-saml-auth-provider.ee.js index 0d2b3a69..382945b4 100644 --- a/packages/backend/src/graphql/mutations/upsert-saml-auth-provider.ee.js +++ b/packages/backend/src/graphql/mutations/upsert-saml-auth-provider.ee.js @@ -1,4 +1,4 @@ -import SamlAuthProvider from '../../models/saml-auth-provider.ee'; +import SamlAuthProvider from '../../models/saml-auth-provider.ee.js'; const upsertSamlAuthProvider = async (_parent, params, context) => { context.currentUser.can('create', 'SamlAuthProvider'); diff --git a/packages/backend/src/graphql/mutations/upsert-saml-auth-providers-role-mappings.ee.js b/packages/backend/src/graphql/mutations/upsert-saml-auth-providers-role-mappings.ee.js index 18030dda..0040d48e 100644 --- a/packages/backend/src/graphql/mutations/upsert-saml-auth-providers-role-mappings.ee.js +++ b/packages/backend/src/graphql/mutations/upsert-saml-auth-providers-role-mappings.ee.js @@ -1,6 +1,6 @@ -import SamlAuthProvider from '../../models/saml-auth-provider.ee'; -import SamlAuthProvidersRoleMapping from '../../models/saml-auth-providers-role-mapping.ee'; -import isEmpty from 'lodash/isEmpty'; +import SamlAuthProvider from '../../models/saml-auth-provider.ee.js'; +import SamlAuthProvidersRoleMapping from '../../models/saml-auth-providers-role-mapping.ee.js'; +import isEmpty from 'lodash/isEmpty.js'; const upsertSamlAuthProvidersRoleMappings = async ( _parent, diff --git a/packages/backend/src/graphql/mutations/verify-connection.js b/packages/backend/src/graphql/mutations/verify-connection.js index f15e1844..fdd95764 100644 --- a/packages/backend/src/graphql/mutations/verify-connection.js +++ b/packages/backend/src/graphql/mutations/verify-connection.js @@ -1,5 +1,5 @@ -import App from '../../models/app'; -import globalVariable from '../../helpers/global-variable'; +import App from '../../models/app.js'; +import globalVariable from '../../helpers/global-variable.js'; const verifyConnection = async (_parent, params, context) => { context.currentUser.can('create', 'Connection'); diff --git a/packages/backend/src/graphql/queries/get-app-auth-client.ee.js b/packages/backend/src/graphql/queries/get-app-auth-client.ee.js index b88fd782..7ddf6328 100644 --- a/packages/backend/src/graphql/queries/get-app-auth-client.ee.js +++ b/packages/backend/src/graphql/queries/get-app-auth-client.ee.js @@ -1,4 +1,4 @@ -import AppAuthClient from '../../models/app-auth-client'; +import AppAuthClient from '../../models/app-auth-client.js'; const getAppAuthClient = async (_parent, params, context) => { let canSeeAllClients = false; diff --git a/packages/backend/src/graphql/queries/get-app-auth-clients.ee.js b/packages/backend/src/graphql/queries/get-app-auth-clients.ee.js index a9123fbf..544aaa7e 100644 --- a/packages/backend/src/graphql/queries/get-app-auth-clients.ee.js +++ b/packages/backend/src/graphql/queries/get-app-auth-clients.ee.js @@ -1,4 +1,4 @@ -import AppConfig from '../../models/app-config'; +import AppConfig from '../../models/app-config.js'; const getAppAuthClients = async (_parent, params, context) => { let canSeeAllClients = false; diff --git a/packages/backend/src/graphql/queries/get-app-config.ee.js b/packages/backend/src/graphql/queries/get-app-config.ee.js index b759ae8b..513191f5 100644 --- a/packages/backend/src/graphql/queries/get-app-config.ee.js +++ b/packages/backend/src/graphql/queries/get-app-config.ee.js @@ -1,4 +1,4 @@ -import AppConfig from '../../models/app-config'; +import AppConfig from '../../models/app-config.js'; const getAppConfig = async (_parent, params, context) => { context.currentUser.can('create', 'Connection'); diff --git a/packages/backend/src/graphql/queries/get-app.js b/packages/backend/src/graphql/queries/get-app.js index 14139670..0f9dd4b5 100644 --- a/packages/backend/src/graphql/queries/get-app.js +++ b/packages/backend/src/graphql/queries/get-app.js @@ -1,5 +1,5 @@ -import App from '../../models/app'; -import Connection from '../../models/connection'; +import App from '../../models/app.js'; +import Connection from '../../models/connection.js'; const getApp = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Connection'); diff --git a/packages/backend/src/graphql/queries/get-apps.js b/packages/backend/src/graphql/queries/get-apps.js index 6ba0dd3f..2c3a78a0 100644 --- a/packages/backend/src/graphql/queries/get-apps.js +++ b/packages/backend/src/graphql/queries/get-apps.js @@ -1,4 +1,4 @@ -import App from '../../models/app'; +import App from '../../models/app.js'; const getApps = async (_parent, params) => { const apps = await App.findAll(params.name); diff --git a/packages/backend/src/graphql/queries/get-automatisch-info.js b/packages/backend/src/graphql/queries/get-automatisch-info.js index dd89d273..63d444a2 100644 --- a/packages/backend/src/graphql/queries/get-automatisch-info.js +++ b/packages/backend/src/graphql/queries/get-automatisch-info.js @@ -1,5 +1,5 @@ -import appConfig from '../../config/app'; -import { getLicense } from '../../helpers/license.ee'; +import appConfig from '../../config/app.js'; +import { getLicense } from '../../helpers/license.ee.js'; const getAutomatischInfo = async () => { const license = await getLicense(); diff --git a/packages/backend/src/graphql/queries/get-automatisch-info.test.ts b/packages/backend/src/graphql/queries/get-automatisch-info.test.js similarity index 85% rename from packages/backend/src/graphql/queries/get-automatisch-info.test.ts rename to packages/backend/src/graphql/queries/get-automatisch-info.test.js index e5c0b244..eaa5477a 100644 --- a/packages/backend/src/graphql/queries/get-automatisch-info.test.ts +++ b/packages/backend/src/graphql/queries/get-automatisch-info.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { vi, describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import * as license from '../../helpers/license.ee'; @@ -22,10 +22,10 @@ describe('graphQL getAutomatischInfo query', () => { describe('and without valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'getLicense').mockResolvedValue(false); + vi.spyOn(license, 'getLicense').mockResolvedValue(false); - jest.replaceProperty(appConfig, 'isCloud', false); - jest.replaceProperty(appConfig, 'isMation', false); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false); + vi.spyOn(appConfig, 'isMation', 'get').mockReturnValue(false); }); it('should return empty license data', async () => { @@ -62,12 +62,12 @@ describe('graphQL getAutomatischInfo query', () => { verified: true, }; - jest.spyOn(license, 'getLicense').mockResolvedValue(mockedLicense); + vi.spyOn(license, 'getLicense').mockResolvedValue(mockedLicense); }); describe('and with cloud flag enabled', () => { beforeEach(async () => { - jest.replaceProperty(appConfig, 'isCloud', true); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true); }); it('should return all license data', async () => { @@ -97,7 +97,7 @@ describe('graphQL getAutomatischInfo query', () => { describe('and with cloud flag disabled', () => { beforeEach(async () => { - jest.replaceProperty(appConfig, 'isCloud', false); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false); }); it('should return all license data', async () => { @@ -127,8 +127,8 @@ describe('graphQL getAutomatischInfo query', () => { describe('and with mation flag enabled', () => { beforeEach(async () => { - jest.replaceProperty(appConfig, 'isCloud', false); - jest.replaceProperty(appConfig, 'isMation', true); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false); + vi.spyOn(appConfig, 'isMation', 'get').mockReturnValue(true); }); it('should return all license data', async () => { @@ -158,8 +158,8 @@ describe('graphQL getAutomatischInfo query', () => { describe('and with mation flag disabled', () => { beforeEach(async () => { - jest.replaceProperty(appConfig, 'isCloud', false); - jest.replaceProperty(appConfig, 'isMation', false); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false); + vi.spyOn(appConfig, 'isMation', 'get').mockReturnValue(false); }); it('should return all license data', async () => { diff --git a/packages/backend/src/graphql/queries/get-billing-and-usage.ee.js b/packages/backend/src/graphql/queries/get-billing-and-usage.ee.js index ccc63df6..d23a44e5 100644 --- a/packages/backend/src/graphql/queries/get-billing-and-usage.ee.js +++ b/packages/backend/src/graphql/queries/get-billing-and-usage.ee.js @@ -1,6 +1,6 @@ import { DateTime } from 'luxon'; -import Billing from '../../helpers/billing/index.ee'; -import ExecutionStep from '../../models/execution-step'; +import Billing from '../../helpers/billing/index.ee.js'; +import ExecutionStep from '../../models/execution-step.js'; const getBillingAndUsage = async (_parent, _params, context) => { const persistedSubscription = await context.currentUser.$relatedQuery( diff --git a/packages/backend/src/graphql/queries/get-config.ee.js b/packages/backend/src/graphql/queries/get-config.ee.js index f1cad6ce..4844be88 100644 --- a/packages/backend/src/graphql/queries/get-config.ee.js +++ b/packages/backend/src/graphql/queries/get-config.ee.js @@ -1,5 +1,5 @@ -import { hasValidLicense } from '../../helpers/license.ee'; -import Config from '../../models/config'; +import { hasValidLicense } from '../../helpers/license.ee.js'; +import Config from '../../models/config.js'; const getConfig = async (_parent, params) => { if (!(await hasValidLicense())) return {}; diff --git a/packages/backend/src/graphql/queries/get-config.ee.test.ts b/packages/backend/src/graphql/queries/get-config.ee.test.js similarity index 89% rename from packages/backend/src/graphql/queries/get-config.ee.test.ts rename to packages/backend/src/graphql/queries/get-config.ee.test.js index 5f36e6e6..dd82e532 100644 --- a/packages/backend/src/graphql/queries/get-config.ee.test.ts +++ b/packages/backend/src/graphql/queries/get-config.ee.test.js @@ -1,14 +1,11 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import { createConfig } from '../../../test/factories/config'; -import { IConfig } from '@automatisch/types'; import * as license from '../../helpers/license.ee'; describe('graphQL getConfig query', () => { - let configOne: IConfig, - configTwo: IConfig, - configThree: IConfig, - query: string; + let configOne, configTwo, configThree, query; beforeEach(async () => { configOne = await createConfig({ key: 'configOne' }); @@ -24,7 +21,7 @@ describe('graphQL getConfig query', () => { describe('and without valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'hasValidLicense').mockResolvedValue(false); + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(false); }); describe('and correct permissions', () => { @@ -43,7 +40,7 @@ describe('graphQL getConfig query', () => { describe('and with valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); }); describe('and without providing specific keys', () => { diff --git a/packages/backend/src/graphql/queries/get-connected-apps.js b/packages/backend/src/graphql/queries/get-connected-apps.js index 32235ca7..3826c746 100644 --- a/packages/backend/src/graphql/queries/get-connected-apps.js +++ b/packages/backend/src/graphql/queries/get-connected-apps.js @@ -1,6 +1,6 @@ -import App from '../../models/app'; -import Flow from '../../models/flow'; -import Connection from '../../models/connection'; +import App from '../../models/app.js'; +import Flow from '../../models/flow.js'; +import Connection from '../../models/connection.js'; const getConnectedApps = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Connection'); diff --git a/packages/backend/src/graphql/queries/get-current-user.test.ts b/packages/backend/src/graphql/queries/get-current-user.test.js similarity index 97% rename from packages/backend/src/graphql/queries/get-current-user.test.ts rename to packages/backend/src/graphql/queries/get-current-user.test.js index b47e5587..366bab8e 100644 --- a/packages/backend/src/graphql/queries/get-current-user.test.ts +++ b/packages/backend/src/graphql/queries/get-current-user.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; diff --git a/packages/backend/src/graphql/queries/get-dynamic-data.js b/packages/backend/src/graphql/queries/get-dynamic-data.js index 29f89bfe..731b7d5d 100644 --- a/packages/backend/src/graphql/queries/get-dynamic-data.js +++ b/packages/backend/src/graphql/queries/get-dynamic-data.js @@ -1,8 +1,8 @@ -import App from '../../models/app'; -import Step from '../../models/step'; -import ExecutionStep from '../../models/execution-step'; -import globalVariable from '../../helpers/global-variable'; -import computeParameters from '../../helpers/compute-parameters'; +import App from '../../models/app.js'; +import Step from '../../models/step.js'; +import ExecutionStep from '../../models/execution-step.js'; +import globalVariable from '../../helpers/global-variable.js'; +import computeParameters from '../../helpers/compute-parameters.js'; const getDynamicData = async (_parent, params, context) => { const conditions = context.currentUser.can('update', 'Flow'); diff --git a/packages/backend/src/graphql/queries/get-dynamic-fields.js b/packages/backend/src/graphql/queries/get-dynamic-fields.js index c3571cf1..2d7d18db 100644 --- a/packages/backend/src/graphql/queries/get-dynamic-fields.js +++ b/packages/backend/src/graphql/queries/get-dynamic-fields.js @@ -1,6 +1,6 @@ -import App from '../../models/app'; -import Step from '../../models/step'; -import globalVariable from '../../helpers/global-variable'; +import App from '../../models/app.js'; +import Step from '../../models/step.js'; +import globalVariable from '../../helpers/global-variable.js'; const getDynamicFields = async (_parent, params, context) => { const conditions = context.currentUser.can('update', 'Flow'); diff --git a/packages/backend/src/graphql/queries/get-execution-steps.js b/packages/backend/src/graphql/queries/get-execution-steps.js index a69c8e2c..61eab6ac 100644 --- a/packages/backend/src/graphql/queries/get-execution-steps.js +++ b/packages/backend/src/graphql/queries/get-execution-steps.js @@ -1,5 +1,5 @@ -import paginate from '../../helpers/pagination'; -import Execution from '../../models/execution'; +import paginate from '../../helpers/pagination.js'; +import Execution from '../../models/execution.js'; const getExecutionSteps = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Execution'); diff --git a/packages/backend/src/graphql/queries/get-execution.js b/packages/backend/src/graphql/queries/get-execution.js index b14409c0..37659ffb 100644 --- a/packages/backend/src/graphql/queries/get-execution.js +++ b/packages/backend/src/graphql/queries/get-execution.js @@ -1,4 +1,4 @@ -import Execution from '../../models/execution'; +import Execution from '../../models/execution.js'; const getExecution = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Execution'); diff --git a/packages/backend/src/graphql/queries/get-executions.js b/packages/backend/src/graphql/queries/get-executions.js index 20ca0cec..d19e6420 100644 --- a/packages/backend/src/graphql/queries/get-executions.js +++ b/packages/backend/src/graphql/queries/get-executions.js @@ -1,7 +1,7 @@ import { raw } from 'objection'; import { DateTime } from 'luxon'; -import Execution from '../../models/execution'; -import paginate from '../../helpers/pagination'; +import Execution from '../../models/execution.js'; +import paginate from '../../helpers/pagination.js'; const getExecutions = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Execution'); diff --git a/packages/backend/src/graphql/queries/get-executions.test.ts b/packages/backend/src/graphql/queries/get-executions.test.js similarity index 99% rename from packages/backend/src/graphql/queries/get-executions.test.ts rename to packages/backend/src/graphql/queries/get-executions.test.js index 01f0b95f..6940fd56 100644 --- a/packages/backend/src/graphql/queries/get-executions.test.ts +++ b/packages/backend/src/graphql/queries/get-executions.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import appConfig from '../../config/app'; diff --git a/packages/backend/src/graphql/queries/get-flow.js b/packages/backend/src/graphql/queries/get-flow.js index 935f852a..3c1b750b 100644 --- a/packages/backend/src/graphql/queries/get-flow.js +++ b/packages/backend/src/graphql/queries/get-flow.js @@ -1,4 +1,4 @@ -import Flow from '../../models/flow'; +import Flow from '../../models/flow.js'; const getFlow = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Flow'); diff --git a/packages/backend/src/graphql/queries/get-flow.test.ts b/packages/backend/src/graphql/queries/get-flow.test.js similarity index 99% rename from packages/backend/src/graphql/queries/get-flow.test.ts rename to packages/backend/src/graphql/queries/get-flow.test.js index 5bed4aac..d364a592 100644 --- a/packages/backend/src/graphql/queries/get-flow.test.ts +++ b/packages/backend/src/graphql/queries/get-flow.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import appConfig from '../../config/app'; diff --git a/packages/backend/src/graphql/queries/get-flows.js b/packages/backend/src/graphql/queries/get-flows.js index 66c120f2..6f3899e8 100644 --- a/packages/backend/src/graphql/queries/get-flows.js +++ b/packages/backend/src/graphql/queries/get-flows.js @@ -1,5 +1,5 @@ -import Flow from '../../models/flow'; -import paginate from '../../helpers/pagination'; +import Flow from '../../models/flow.js'; +import paginate from '../../helpers/pagination.js'; const getFlows = async (_parent, params, context) => { const conditions = context.currentUser.can('read', 'Flow'); diff --git a/packages/backend/src/graphql/queries/get-invoices.ee.js b/packages/backend/src/graphql/queries/get-invoices.ee.js index 9183f62d..afb7d031 100644 --- a/packages/backend/src/graphql/queries/get-invoices.ee.js +++ b/packages/backend/src/graphql/queries/get-invoices.ee.js @@ -1,4 +1,4 @@ -import Billing from '../../helpers/billing/index.ee'; +import Billing from '../../helpers/billing/index.ee.js'; const getInvoices = async (_parent, _params, context) => { const subscription = await context.currentUser.$relatedQuery( diff --git a/packages/backend/src/graphql/queries/get-notifications.js b/packages/backend/src/graphql/queries/get-notifications.js index 39da69b1..c36eb442 100644 --- a/packages/backend/src/graphql/queries/get-notifications.js +++ b/packages/backend/src/graphql/queries/get-notifications.js @@ -1,6 +1,7 @@ -import axios from '../../helpers/axios-with-proxy'; +import axios from '../../helpers/axios-with-proxy.js'; -const NOTIFICATIONS_URL = 'https://notifications.automatisch.io/notifications.json'; +const NOTIFICATIONS_URL = + 'https://notifications.automatisch.io/notifications.json'; const getNotifications = async () => { try { diff --git a/packages/backend/src/graphql/queries/get-paddle-info.ee.js b/packages/backend/src/graphql/queries/get-paddle-info.ee.js index 35fc3c64..a07df777 100644 --- a/packages/backend/src/graphql/queries/get-paddle-info.ee.js +++ b/packages/backend/src/graphql/queries/get-paddle-info.ee.js @@ -1,5 +1,5 @@ -import appConfig from '../../config/app'; -import Billing from '../../helpers/billing/index.ee'; +import appConfig from '../../config/app.js'; +import Billing from '../../helpers/billing/index.ee.js'; const getPaddleInfo = async () => { if (!appConfig.isCloud) return; diff --git a/packages/backend/src/graphql/queries/get-payment-plans.ee.js b/packages/backend/src/graphql/queries/get-payment-plans.ee.js index 47fa7d91..49c4f7e2 100644 --- a/packages/backend/src/graphql/queries/get-payment-plans.ee.js +++ b/packages/backend/src/graphql/queries/get-payment-plans.ee.js @@ -1,5 +1,5 @@ -import appConfig from '../../config/app'; -import Billing from '../../helpers/billing/index.ee'; +import appConfig from '../../config/app.js'; +import Billing from '../../helpers/billing/index.ee.js'; const getPaymentPlans = async () => { if (!appConfig.isCloud) return; diff --git a/packages/backend/src/graphql/queries/get-permission-catalog.ee.js b/packages/backend/src/graphql/queries/get-permission-catalog.ee.js index 92f8cdc6..b902315b 100644 --- a/packages/backend/src/graphql/queries/get-permission-catalog.ee.js +++ b/packages/backend/src/graphql/queries/get-permission-catalog.ee.js @@ -1,4 +1,4 @@ -import permissionCatalog from '../../helpers/permission-catalog.ee'; +import permissionCatalog from '../../helpers/permission-catalog.ee.js'; const getPermissionCatalog = async () => { return permissionCatalog; diff --git a/packages/backend/src/graphql/queries/get-role.ee.js b/packages/backend/src/graphql/queries/get-role.ee.js index 23db99dc..906535b3 100644 --- a/packages/backend/src/graphql/queries/get-role.ee.js +++ b/packages/backend/src/graphql/queries/get-role.ee.js @@ -1,4 +1,4 @@ -import Role from '../../models/role'; +import Role from '../../models/role.js'; const getRole = async (_parent, params, context) => { context.currentUser.can('read', 'Role'); diff --git a/packages/backend/src/graphql/queries/get-role.ee.test.ts b/packages/backend/src/graphql/queries/get-role.ee.test.js similarity index 96% rename from packages/backend/src/graphql/queries/get-role.ee.test.ts rename to packages/backend/src/graphql/queries/get-role.ee.test.js index 00d09d56..548f3fdb 100644 --- a/packages/backend/src/graphql/queries/get-role.ee.test.ts +++ b/packages/backend/src/graphql/queries/get-role.ee.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { vi, describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; @@ -94,7 +94,7 @@ describe('graphQL getRole query', () => { describe('with authenticated user', () => { describe('and with valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); }); describe('and without permissions', () => { @@ -162,7 +162,7 @@ describe('graphQL getRole query', () => { describe('and without valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'hasValidLicense').mockResolvedValue(false); + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(false); }); describe('and correct permissions', () => { diff --git a/packages/backend/src/graphql/queries/get-roles.ee.js b/packages/backend/src/graphql/queries/get-roles.ee.js index 4c5cc25f..900af081 100644 --- a/packages/backend/src/graphql/queries/get-roles.ee.js +++ b/packages/backend/src/graphql/queries/get-roles.ee.js @@ -1,4 +1,4 @@ -import Role from '../../models/role'; +import Role from '../../models/role.js'; const getRoles = async (_parent, params, context) => { context.currentUser.can('read', 'Role'); diff --git a/packages/backend/src/graphql/queries/get-roles.ee.test.ts b/packages/backend/src/graphql/queries/get-roles.ee.test.js similarity index 95% rename from packages/backend/src/graphql/queries/get-roles.ee.test.ts rename to packages/backend/src/graphql/queries/get-roles.ee.test.js index c809c938..108f4107 100644 --- a/packages/backend/src/graphql/queries/get-roles.ee.test.ts +++ b/packages/backend/src/graphql/queries/get-roles.ee.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { vi, describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; @@ -73,7 +73,7 @@ describe('graphQL getRoles query', () => { describe('with authenticated user', () => { describe('and with valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); }); describe('and without permissions', () => { @@ -132,7 +132,7 @@ describe('graphQL getRoles query', () => { describe('and without valid license', () => { beforeEach(async () => { - jest.spyOn(license, 'hasValidLicense').mockResolvedValue(false); + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(false); }); describe('and correct permissions', () => { diff --git a/packages/backend/src/graphql/queries/get-saml-auth-provider-role-mappings.ee.js b/packages/backend/src/graphql/queries/get-saml-auth-provider-role-mappings.ee.js index e339d88d..b6e4246e 100644 --- a/packages/backend/src/graphql/queries/get-saml-auth-provider-role-mappings.ee.js +++ b/packages/backend/src/graphql/queries/get-saml-auth-provider-role-mappings.ee.js @@ -1,4 +1,4 @@ -import SamlAuthProvider from '../../models/saml-auth-provider.ee'; +import SamlAuthProvider from '../../models/saml-auth-provider.ee.js'; const getSamlAuthProviderRoleMappings = async (_parent, params, context) => { context.currentUser.can('read', 'SamlAuthProvider'); diff --git a/packages/backend/src/graphql/queries/get-saml-auth-provider.ee.js b/packages/backend/src/graphql/queries/get-saml-auth-provider.ee.js index b12353c2..b95233b8 100644 --- a/packages/backend/src/graphql/queries/get-saml-auth-provider.ee.js +++ b/packages/backend/src/graphql/queries/get-saml-auth-provider.ee.js @@ -1,4 +1,4 @@ -import SamlAuthProvider from '../../models/saml-auth-provider.ee'; +import SamlAuthProvider from '../../models/saml-auth-provider.ee.js'; const getSamlAuthProvider = async (_parent, params, context) => { context.currentUser.can('read', 'SamlAuthProvider'); diff --git a/packages/backend/src/graphql/queries/get-step-with-test-executions.js b/packages/backend/src/graphql/queries/get-step-with-test-executions.js index 21462594..5ec088b0 100644 --- a/packages/backend/src/graphql/queries/get-step-with-test-executions.js +++ b/packages/backend/src/graphql/queries/get-step-with-test-executions.js @@ -1,6 +1,6 @@ import { ref } from 'objection'; -import ExecutionStep from '../../models/execution-step'; -import Step from '../../models/step'; +import ExecutionStep from '../../models/execution-step.js'; +import Step from '../../models/step.js'; const getStepWithTestExecutions = async (_parent, params, context) => { const conditions = context.currentUser.can('update', 'Flow'); diff --git a/packages/backend/src/graphql/queries/get-subscription-status.ee.js b/packages/backend/src/graphql/queries/get-subscription-status.ee.js index b8669456..28df51eb 100644 --- a/packages/backend/src/graphql/queries/get-subscription-status.ee.js +++ b/packages/backend/src/graphql/queries/get-subscription-status.ee.js @@ -1,4 +1,4 @@ -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; const getSubscriptionStatus = async (_parent, _params, context) => { if (!appConfig.isCloud) return; diff --git a/packages/backend/src/graphql/queries/get-trial-status.ee.js b/packages/backend/src/graphql/queries/get-trial-status.ee.js index d824ef94..1980ccb7 100644 --- a/packages/backend/src/graphql/queries/get-trial-status.ee.js +++ b/packages/backend/src/graphql/queries/get-trial-status.ee.js @@ -1,4 +1,4 @@ -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; const getTrialStatus = async (_parent, _params, context) => { if (!appConfig.isCloud) return; diff --git a/packages/backend/src/graphql/queries/get-trial-status.ee.test.ts b/packages/backend/src/graphql/queries/get-trial-status.ee.test.js similarity index 86% rename from packages/backend/src/graphql/queries/get-trial-status.ee.test.ts rename to packages/backend/src/graphql/queries/get-trial-status.ee.test.js index 2683ee53..54a95d69 100644 --- a/packages/backend/src/graphql/queries/get-trial-status.ee.test.ts +++ b/packages/backend/src/graphql/queries/get-trial-status.ee.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { vi, describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import User from '../../models/user'; @@ -43,7 +43,7 @@ describe('graphQL getTrialStatus query', () => { describe('and with cloud flag disabled', () => { beforeEach(async () => { - jest.replaceProperty(appConfig, 'isCloud', false); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(false); }); it('should return null', async () => { @@ -63,15 +63,15 @@ describe('graphQL getTrialStatus query', () => { describe('and with cloud flag enabled', () => { beforeEach(async () => { - jest.replaceProperty(appConfig, 'isCloud', true); + vi.spyOn(appConfig, 'isCloud', 'get').mockReturnValue(true); }); describe('and not in trial and has active subscription', () => { beforeEach(async () => { - jest.spyOn(User.prototype, 'inTrial').mockResolvedValue(false); - jest - .spyOn(User.prototype, 'hasActiveSubscription') - .mockResolvedValue(true); + vi.spyOn(User.prototype, 'inTrial').mockResolvedValue(false); + vi.spyOn(User.prototype, 'hasActiveSubscription').mockResolvedValue( + true + ); }); it('should return null', async () => { @@ -91,7 +91,7 @@ describe('graphQL getTrialStatus query', () => { describe('and in trial period', () => { beforeEach(async () => { - jest.spyOn(User.prototype, 'inTrial').mockResolvedValue(true); + vi.spyOn(User.prototype, 'inTrial').mockResolvedValue(true); }); it('should return null', async () => { diff --git a/packages/backend/src/graphql/queries/get-user.js b/packages/backend/src/graphql/queries/get-user.js index 77389e2c..61b0e753 100644 --- a/packages/backend/src/graphql/queries/get-user.js +++ b/packages/backend/src/graphql/queries/get-user.js @@ -1,4 +1,4 @@ -import User from '../../models/user'; +import User from '../../models/user.js'; const getUser = async (_parent, params, context) => { context.currentUser.can('read', 'User'); diff --git a/packages/backend/src/graphql/queries/get-user.test.ts b/packages/backend/src/graphql/queries/get-user.test.js similarity index 98% rename from packages/backend/src/graphql/queries/get-user.test.ts rename to packages/backend/src/graphql/queries/get-user.test.js index 917866fb..547aef82 100644 --- a/packages/backend/src/graphql/queries/get-user.test.ts +++ b/packages/backend/src/graphql/queries/get-user.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; diff --git a/packages/backend/src/graphql/queries/get-users.js b/packages/backend/src/graphql/queries/get-users.js index a16722ba..6bff6c29 100644 --- a/packages/backend/src/graphql/queries/get-users.js +++ b/packages/backend/src/graphql/queries/get-users.js @@ -1,5 +1,5 @@ -import paginate from '../../helpers/pagination'; -import User from '../../models/user'; +import paginate from '../../helpers/pagination.js'; +import User from '../../models/user.js'; const getUsers = async (_parent, params, context) => { context.currentUser.can('read', 'User'); diff --git a/packages/backend/src/graphql/queries/get-users.test.ts b/packages/backend/src/graphql/queries/get-users.test.js similarity index 98% rename from packages/backend/src/graphql/queries/get-users.test.ts rename to packages/backend/src/graphql/queries/get-users.test.js index 7c5445de..b830266d 100644 --- a/packages/backend/src/graphql/queries/get-users.test.ts +++ b/packages/backend/src/graphql/queries/get-users.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { describe, it, expect, beforeEach } from 'vitest'; import request from 'supertest'; import app from '../../app'; import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; diff --git a/packages/backend/src/graphql/queries/healthcheck.js b/packages/backend/src/graphql/queries/healthcheck.js index e4126d08..68bbeea0 100644 --- a/packages/backend/src/graphql/queries/healthcheck.js +++ b/packages/backend/src/graphql/queries/healthcheck.js @@ -1,4 +1,4 @@ -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; const healthcheck = () => { return { diff --git a/packages/backend/src/graphql/queries/healthcheck.test.ts b/packages/backend/src/graphql/queries/healthcheck.test.js similarity index 92% rename from packages/backend/src/graphql/queries/healthcheck.test.ts rename to packages/backend/src/graphql/queries/healthcheck.test.js index 2124634f..e590fa21 100644 --- a/packages/backend/src/graphql/queries/healthcheck.test.ts +++ b/packages/backend/src/graphql/queries/healthcheck.test.js @@ -1,4 +1,4 @@ -// @ts-nocheck +import { describe, it, expect } from 'vitest'; import request from 'supertest'; import app from '../../app'; import appConfig from '../../config/app'; diff --git a/packages/backend/src/graphql/queries/list-saml-auth-providers.ee.js b/packages/backend/src/graphql/queries/list-saml-auth-providers.ee.js index 313dd8e4..1e2ee21e 100644 --- a/packages/backend/src/graphql/queries/list-saml-auth-providers.ee.js +++ b/packages/backend/src/graphql/queries/list-saml-auth-providers.ee.js @@ -1,4 +1,4 @@ -import SamlAuthProvider from '../../models/saml-auth-provider.ee'; +import SamlAuthProvider from '../../models/saml-auth-provider.ee.js'; const listSamlAuthProviders = async () => { const providers = await SamlAuthProvider.query().where({ active: true }); diff --git a/packages/backend/src/graphql/queries/test-connection.js b/packages/backend/src/graphql/queries/test-connection.js index 8d4efb08..6d8e3489 100644 --- a/packages/backend/src/graphql/queries/test-connection.js +++ b/packages/backend/src/graphql/queries/test-connection.js @@ -1,6 +1,6 @@ -import App from '../../models/app'; -import Connection from '../../models/connection'; -import globalVariable from '../../helpers/global-variable'; +import App from '../../models/app.js'; +import Connection from '../../models/connection.js'; +import globalVariable from '../../helpers/global-variable.js'; const testConnection = async (_parent, params, context) => { const conditions = context.currentUser.can('update', 'Connection'); diff --git a/packages/backend/src/graphql/query-resolvers.js b/packages/backend/src/graphql/query-resolvers.js index 20bb6bcb..f4bf2916 100644 --- a/packages/backend/src/graphql/query-resolvers.js +++ b/packages/backend/src/graphql/query-resolvers.js @@ -1,37 +1,37 @@ -import getApp from './queries/get-app'; -import getAppAuthClient from './queries/get-app-auth-client.ee'; -import getAppAuthClients from './queries/get-app-auth-clients.ee'; -import getAppConfig from './queries/get-app-config.ee'; -import getApps from './queries/get-apps'; -import getAutomatischInfo from './queries/get-automatisch-info'; -import getBillingAndUsage from './queries/get-billing-and-usage.ee'; -import getConfig from './queries/get-config.ee'; -import getConnectedApps from './queries/get-connected-apps'; -import getCurrentUser from './queries/get-current-user'; -import getDynamicData from './queries/get-dynamic-data'; -import getDynamicFields from './queries/get-dynamic-fields'; -import getExecution from './queries/get-execution'; -import getExecutionSteps from './queries/get-execution-steps'; -import getExecutions from './queries/get-executions'; -import getFlow from './queries/get-flow'; -import getFlows from './queries/get-flows'; -import getInvoices from './queries/get-invoices.ee'; -import getNotifications from './queries/get-notifications'; -import getPaddleInfo from './queries/get-paddle-info.ee'; -import getPaymentPlans from './queries/get-payment-plans.ee'; -import getPermissionCatalog from './queries/get-permission-catalog.ee'; -import getRole from './queries/get-role.ee'; -import getRoles from './queries/get-roles.ee'; -import getSamlAuthProviderRoleMappings from './queries/get-saml-auth-provider-role-mappings.ee'; -import getSamlAuthProvider from './queries/get-saml-auth-provider.ee'; -import getStepWithTestExecutions from './queries/get-step-with-test-executions'; -import getSubscriptionStatus from './queries/get-subscription-status.ee'; -import getTrialStatus from './queries/get-trial-status.ee'; -import getUser from './queries/get-user'; -import getUsers from './queries/get-users'; -import healthcheck from './queries/healthcheck'; -import listSamlAuthProviders from './queries/list-saml-auth-providers.ee'; -import testConnection from './queries/test-connection'; +import getApp from './queries/get-app.js'; +import getAppAuthClient from './queries/get-app-auth-client.ee.js'; +import getAppAuthClients from './queries/get-app-auth-clients.ee.js'; +import getAppConfig from './queries/get-app-config.ee.js'; +import getApps from './queries/get-apps.js'; +import getAutomatischInfo from './queries/get-automatisch-info.js'; +import getBillingAndUsage from './queries/get-billing-and-usage.ee.js'; +import getConfig from './queries/get-config.ee.js'; +import getConnectedApps from './queries/get-connected-apps.js'; +import getCurrentUser from './queries/get-current-user.js'; +import getDynamicData from './queries/get-dynamic-data.js'; +import getDynamicFields from './queries/get-dynamic-fields.js'; +import getExecution from './queries/get-execution.js'; +import getExecutionSteps from './queries/get-execution-steps.js'; +import getExecutions from './queries/get-executions.js'; +import getFlow from './queries/get-flow.js'; +import getFlows from './queries/get-flows.js'; +import getInvoices from './queries/get-invoices.ee.js'; +import getNotifications from './queries/get-notifications.js'; +import getPaddleInfo from './queries/get-paddle-info.ee.js'; +import getPaymentPlans from './queries/get-payment-plans.ee.js'; +import getPermissionCatalog from './queries/get-permission-catalog.ee.js'; +import getRole from './queries/get-role.ee.js'; +import getRoles from './queries/get-roles.ee.js'; +import getSamlAuthProviderRoleMappings from './queries/get-saml-auth-provider-role-mappings.ee.js'; +import getSamlAuthProvider from './queries/get-saml-auth-provider.ee.js'; +import getStepWithTestExecutions from './queries/get-step-with-test-executions.js'; +import getSubscriptionStatus from './queries/get-subscription-status.ee.js'; +import getTrialStatus from './queries/get-trial-status.ee.js'; +import getUser from './queries/get-user.js'; +import getUsers from './queries/get-users.js'; +import healthcheck from './queries/healthcheck.js'; +import listSamlAuthProviders from './queries/list-saml-auth-providers.ee.js'; +import testConnection from './queries/test-connection.js'; const queryResolvers = { getApp, diff --git a/packages/backend/src/graphql/resolvers.js b/packages/backend/src/graphql/resolvers.js index 8087332f..344c0416 100644 --- a/packages/backend/src/graphql/resolvers.js +++ b/packages/backend/src/graphql/resolvers.js @@ -1,5 +1,5 @@ -import mutationResolvers from './mutation-resolvers'; -import queryResolvers from './query-resolvers'; +import mutationResolvers from './mutation-resolvers.js'; +import queryResolvers from './query-resolvers.js'; const resolvers = { Query: queryResolvers, diff --git a/packages/backend/src/helpers/add-authentication-steps.ts b/packages/backend/src/helpers/add-authentication-steps.js similarity index 84% rename from packages/backend/src/helpers/add-authentication-steps.ts rename to packages/backend/src/helpers/add-authentication-steps.js index 0728ec8c..631e6055 100644 --- a/packages/backend/src/helpers/add-authentication-steps.ts +++ b/packages/backend/src/helpers/add-authentication-steps.js @@ -1,6 +1,4 @@ -import { IApp } from '@automatisch/types'; - -function addAuthenticationSteps(app: IApp): IApp { +function addAuthenticationSteps(app) { if (app.auth.generateAuthUrl) { app.auth.authenticationSteps = authenticationStepsWithAuthUrl; app.auth.sharedAuthenticationSteps = sharedAuthenticationStepsWithAuthUrl; @@ -13,7 +11,7 @@ function addAuthenticationSteps(app: IApp): IApp { const authenticationStepsWithoutAuthUrl = [ { - type: 'mutation' as const, + type: 'mutation', name: 'createConnection', arguments: [ { @@ -27,7 +25,7 @@ const authenticationStepsWithoutAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'verifyConnection', arguments: [ { @@ -40,7 +38,7 @@ const authenticationStepsWithoutAuthUrl = [ const authenticationStepsWithAuthUrl = [ { - type: 'mutation' as const, + type: 'mutation', name: 'createConnection', arguments: [ { @@ -54,7 +52,7 @@ const authenticationStepsWithAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'generateAuthUrl', arguments: [ { @@ -64,7 +62,7 @@ const authenticationStepsWithAuthUrl = [ ], }, { - type: 'openWithPopup' as const, + type: 'openWithPopup', name: 'openAuthPopup', arguments: [ { @@ -74,7 +72,7 @@ const authenticationStepsWithAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'updateConnection', arguments: [ { @@ -88,7 +86,7 @@ const authenticationStepsWithAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'verifyConnection', arguments: [ { @@ -101,7 +99,7 @@ const authenticationStepsWithAuthUrl = [ const sharedAuthenticationStepsWithAuthUrl = [ { - type: 'mutation' as const, + type: 'mutation', name: 'createConnection', arguments: [ { @@ -115,7 +113,7 @@ const sharedAuthenticationStepsWithAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'generateAuthUrl', arguments: [ { @@ -125,7 +123,7 @@ const sharedAuthenticationStepsWithAuthUrl = [ ], }, { - type: 'openWithPopup' as const, + type: 'openWithPopup', name: 'openAuthPopup', arguments: [ { @@ -135,7 +133,7 @@ const sharedAuthenticationStepsWithAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'updateConnection', arguments: [ { @@ -149,7 +147,7 @@ const sharedAuthenticationStepsWithAuthUrl = [ ], }, { - type: 'mutation' as const, + type: 'mutation', name: 'verifyConnection', arguments: [ { diff --git a/packages/backend/src/helpers/add-reconnection-steps.ts b/packages/backend/src/helpers/add-reconnection-steps.js similarity index 75% rename from packages/backend/src/helpers/add-reconnection-steps.ts rename to packages/backend/src/helpers/add-reconnection-steps.js index 38ec9e49..58b2a530 100644 --- a/packages/backend/src/helpers/add-reconnection-steps.ts +++ b/packages/backend/src/helpers/add-reconnection-steps.js @@ -1,9 +1,4 @@ -import { - IApp, - IAuthenticationStep, - IAuthenticationStepField, -} from '@automatisch/types'; -import cloneDeep from 'lodash/cloneDeep'; +import cloneDeep from 'lodash/cloneDeep.js'; const connectionIdArgument = { name: 'id', @@ -11,20 +6,20 @@ const connectionIdArgument = { }; const resetConnectionStep = { - type: 'mutation' as const, + type: 'mutation', name: 'resetConnection', arguments: [connectionIdArgument], }; -function replaceCreateConnection(string: string) { +function replaceCreateConnection(string) { return string.replace('{createConnection.id}', '{connection.id}'); } -function removeAppKeyArgument(args: IAuthenticationStepField[]) { +function removeAppKeyArgument(args) { return args.filter((argument) => argument.name !== 'key'); } -function addConnectionId(step: IAuthenticationStep) { +function addConnectionId(step) { step.arguments = step.arguments.map((argument) => { if (typeof argument.value === 'string') { argument.value = replaceCreateConnection(argument.value); @@ -45,7 +40,7 @@ function addConnectionId(step: IAuthenticationStep) { return step; } -function replaceCreateConnectionsWithUpdate(steps: IAuthenticationStep[]) { +function replaceCreateConnectionsWithUpdate(steps) { const updatedSteps = cloneDeep(steps); return updatedSteps.map((step) => { const updatedStep = addConnectionId(step); @@ -62,7 +57,7 @@ function replaceCreateConnectionsWithUpdate(steps: IAuthenticationStep[]) { }); } -function addReconnectionSteps(app: IApp): IApp { +function addReconnectionSteps(app) { const hasReconnectionSteps = app.auth.reconnectionSteps; if (hasReconnectionSteps) return app; @@ -80,7 +75,10 @@ function addReconnectionSteps(app: IApp): IApp { app.auth.sharedAuthenticationSteps ); - app.auth.sharedReconnectionSteps = [resetConnectionStep, ...updatedStepsWithEmbeddedDefaults]; + app.auth.sharedReconnectionSteps = [ + resetConnectionStep, + ...updatedStepsWithEmbeddedDefaults, + ]; } return app; diff --git a/packages/backend/src/helpers/app-assets-handler.ts b/packages/backend/src/helpers/app-assets-handler.js similarity index 73% rename from packages/backend/src/helpers/app-assets-handler.ts rename to packages/backend/src/helpers/app-assets-handler.js index e537b7c1..778ad25b 100644 --- a/packages/backend/src/helpers/app-assets-handler.ts +++ b/packages/backend/src/helpers/app-assets-handler.js @@ -1,6 +1,10 @@ -import express, { Application } from 'express'; +import express from 'express'; +import path from 'path'; +import { fileURLToPath } from 'url'; -const appAssetsHandler = async (app: Application) => { +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const appAssetsHandler = async (app) => { app.use('/apps/:appKey/assets/favicon.svg', (req, res, next) => { const { appKey } = req.params; const svgPath = `${__dirname}/../apps/${appKey}/assets/favicon.svg`; diff --git a/packages/backend/src/helpers/app-info-converter.ts b/packages/backend/src/helpers/app-info-converter.js similarity index 78% rename from packages/backend/src/helpers/app-info-converter.ts rename to packages/backend/src/helpers/app-info-converter.js index c5e4aa26..6142e2c5 100644 --- a/packages/backend/src/helpers/app-info-converter.ts +++ b/packages/backend/src/helpers/app-info-converter.js @@ -1,7 +1,6 @@ -import type { IApp } from '@automatisch/types'; -import appConfig from '../config/app'; +import appConfig from '../config/app.js'; -const appInfoConverter = (rawAppData: IApp) => { +const appInfoConverter = (rawAppData) => { rawAppData.iconUrl = rawAppData.iconUrl.replace( '{BASE_URL}', appConfig.baseUrl diff --git a/packages/backend/src/helpers/authentication.ts b/packages/backend/src/helpers/authentication.js similarity index 90% rename from packages/backend/src/helpers/authentication.ts rename to packages/backend/src/helpers/authentication.js index 83a5d060..90b99c35 100644 --- a/packages/backend/src/helpers/authentication.ts +++ b/packages/backend/src/helpers/authentication.js @@ -1,7 +1,7 @@ import { allow, rule, shield } from 'graphql-shield'; import jwt from 'jsonwebtoken'; -import appConfig from '../config/app'; -import User from '../models/user'; +import appConfig from '../config/app.js'; +import User from '../models/user.js'; const isAuthenticated = rule()(async (_parent, _args, req) => { const token = req.headers['authorization']; @@ -9,9 +9,8 @@ const isAuthenticated = rule()(async (_parent, _args, req) => { if (token == null) return false; try { - const { userId } = jwt.verify(token, appConfig.appSecretKey) as { - userId: string; - }; + const { userId } = jwt.verify(token, appConfig.appSecretKey); + req.currentUser = await User.query() .findById(userId) .leftJoinRelated({ diff --git a/packages/backend/src/helpers/axios-with-proxy.ts b/packages/backend/src/helpers/axios-with-proxy.js similarity index 86% rename from packages/backend/src/helpers/axios-with-proxy.ts rename to packages/backend/src/helpers/axios-with-proxy.js index c280b534..7754fd43 100644 --- a/packages/backend/src/helpers/axios-with-proxy.ts +++ b/packages/backend/src/helpers/axios-with-proxy.js @@ -1,8 +1,8 @@ -import axios, { AxiosRequestConfig } from 'axios'; +import axios from 'axios'; import { HttpsProxyAgent } from 'https-proxy-agent'; import { HttpProxyAgent } from 'http-proxy-agent'; -const config: AxiosRequestConfig = {}; +const config = {}; const httpProxyUrl = process.env.http_proxy; const httpsProxyUrl = process.env.https_proxy; const supportsProxy = httpProxyUrl || httpsProxyUrl; diff --git a/packages/backend/src/helpers/billing/index.ee.ts b/packages/backend/src/helpers/billing/index.ee.js similarity index 55% rename from packages/backend/src/helpers/billing/index.ee.ts rename to packages/backend/src/helpers/billing/index.ee.js index 899d28e6..091598af 100644 --- a/packages/backend/src/helpers/billing/index.ee.ts +++ b/packages/backend/src/helpers/billing/index.ee.js @@ -1,7 +1,7 @@ -import appConfig from '../../config/app'; -import paddleClient from './paddle.ee'; -import paddlePlans from './plans.ee'; -import webhooks from './webhooks.ee'; +import appConfig from '../../config/app.js'; +import paddleClient from './paddle.ee.js'; +import paddlePlans from './plans.ee.js'; +import webhooks from './webhooks.ee.js'; const paddleInfo = { sandbox: appConfig.isProd ? false : true, diff --git a/packages/backend/src/helpers/billing/paddle.ee.ts b/packages/backend/src/helpers/billing/paddle.ee.js similarity index 88% rename from packages/backend/src/helpers/billing/paddle.ee.ts rename to packages/backend/src/helpers/billing/paddle.ee.js index aef02129..e4bed3fa 100644 --- a/packages/backend/src/helpers/billing/paddle.ee.ts +++ b/packages/backend/src/helpers/billing/paddle.ee.js @@ -1,6 +1,6 @@ // TODO: replace with axios-with-proxy when needed import axios from 'axios'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; import { DateTime } from 'luxon'; const PADDLE_VENDOR_URL = appConfig.isDev @@ -9,7 +9,7 @@ const PADDLE_VENDOR_URL = appConfig.isDev const axiosInstance = axios.create({ baseURL: PADDLE_VENDOR_URL }); -const getSubscription = async (subscriptionId: number) => { +const getSubscription = async (subscriptionId) => { const data = { vendor_id: appConfig.paddleVendorId, vendor_auth_code: appConfig.paddleVendorAuthCode, @@ -24,7 +24,7 @@ const getSubscription = async (subscriptionId: number) => { return subscription; }; -const getInvoices = async (subscriptionId: number) => { +const getInvoices = async (subscriptionId) => { // TODO: iterate over previous subscriptions and include their invoices const data = { vendor_id: appConfig.paddleVendorId, diff --git a/packages/backend/src/helpers/billing/plans.ee.ts b/packages/backend/src/helpers/billing/plans.ee.js similarity index 83% rename from packages/backend/src/helpers/billing/plans.ee.ts rename to packages/backend/src/helpers/billing/plans.ee.js index 284243c8..41046984 100644 --- a/packages/backend/src/helpers/billing/plans.ee.ts +++ b/packages/backend/src/helpers/billing/plans.ee.js @@ -1,4 +1,4 @@ -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; const testPlans = [ { @@ -22,7 +22,7 @@ const prodPlans = [ const plans = appConfig.isProd ? prodPlans : testPlans; -export function getPlanById(id: string) { +export function getPlanById(id) { return plans.find((plan) => plan.productId === id); } diff --git a/packages/backend/src/helpers/billing/webhooks.ee.ts b/packages/backend/src/helpers/billing/webhooks.ee.js similarity index 79% rename from packages/backend/src/helpers/billing/webhooks.ee.ts rename to packages/backend/src/helpers/billing/webhooks.ee.js index 8390153e..19cc194c 100644 --- a/packages/backend/src/helpers/billing/webhooks.ee.ts +++ b/packages/backend/src/helpers/billing/webhooks.ee.js @@ -1,8 +1,7 @@ -import { IRequest } from '@automatisch/types'; -import Subscription from '../../models/subscription.ee'; -import Billing from './index.ee'; +import Subscription from '../../models/subscription.ee.js'; +import Billing from './index.ee.js'; -const handleSubscriptionCreated = async (request: IRequest) => { +const handleSubscriptionCreated = async (request) => { const subscription = await Subscription.query().insertAndFetch( formatSubscription(request) ); @@ -11,7 +10,7 @@ const handleSubscriptionCreated = async (request: IRequest) => { .insert(formatUsageData(request)); }; -const handleSubscriptionUpdated = async (request: IRequest) => { +const handleSubscriptionUpdated = async (request) => { await Subscription.query() .findOne({ paddle_subscription_id: request.body.subscription_id, @@ -19,7 +18,7 @@ const handleSubscriptionUpdated = async (request: IRequest) => { .patch(formatSubscription(request)); }; -const handleSubscriptionCancelled = async (request: IRequest) => { +const handleSubscriptionCancelled = async (request) => { const subscription = await Subscription.query().findOne({ paddle_subscription_id: request.body.subscription_id, }); @@ -27,7 +26,7 @@ const handleSubscriptionCancelled = async (request: IRequest) => { await subscription.$query().patchAndFetch(formatSubscription(request)); }; -const handleSubscriptionPaymentSucceeded = async (request: IRequest) => { +const handleSubscriptionPaymentSucceeded = async (request) => { const subscription = await Subscription.query() .findOne({ paddle_subscription_id: request.body.subscription_id, @@ -49,7 +48,7 @@ const handleSubscriptionPaymentSucceeded = async (request: IRequest) => { .insert(formatUsageData(request)); }; -const formatSubscription = (request: IRequest) => { +const formatSubscription = (request) => { return { userId: JSON.parse(request.body.passthrough).id, paddleSubscriptionId: request.body.subscription_id, @@ -63,7 +62,7 @@ const formatSubscription = (request: IRequest) => { }; }; -const formatUsageData = (request: IRequest) => { +const formatUsageData = (request) => { return { userId: JSON.parse(request.body.passthrough).id, consumedTaskCount: 0, diff --git a/packages/backend/src/helpers/check-worker-readiness.ts b/packages/backend/src/helpers/check-worker-readiness.js similarity index 68% rename from packages/backend/src/helpers/check-worker-readiness.ts rename to packages/backend/src/helpers/check-worker-readiness.js index 81011927..e1ae0a79 100644 --- a/packages/backend/src/helpers/check-worker-readiness.ts +++ b/packages/backend/src/helpers/check-worker-readiness.js @@ -1,6 +1,6 @@ import Redis from 'ioredis'; -import logger from './logger'; -import redisConfig from '../config/redis'; +import logger from './logger.js'; +import redisConfig from '../config/redis.js'; const redisClient = new Redis(redisConfig); diff --git a/packages/backend/src/helpers/compile-email.ee.ts b/packages/backend/src/helpers/compile-email.ee.js similarity index 81% rename from packages/backend/src/helpers/compile-email.ee.ts rename to packages/backend/src/helpers/compile-email.ee.js index 297b48e8..3fd7fb4e 100644 --- a/packages/backend/src/helpers/compile-email.ee.ts +++ b/packages/backend/src/helpers/compile-email.ee.js @@ -2,7 +2,7 @@ import * as path from 'path'; import * as fs from 'fs'; import * as handlebars from 'handlebars'; -const compileEmail = (emailPath: string, replacements: object = {}): string => { +const compileEmail = (emailPath, replacements = {}) => { const filePath = path.join(__dirname, `../views/emails/${emailPath}.ee.hbs`); const source = fs.readFileSync(filePath, 'utf-8').toString(); const template = handlebars.compile(source); diff --git a/packages/backend/src/helpers/compute-parameters.ts b/packages/backend/src/helpers/compute-parameters.js similarity index 77% rename from packages/backend/src/helpers/compute-parameters.ts rename to packages/backend/src/helpers/compute-parameters.js index 93ef9dd3..d29252b6 100644 --- a/packages/backend/src/helpers/compute-parameters.ts +++ b/packages/backend/src/helpers/compute-parameters.js @@ -1,23 +1,18 @@ -import Step from '../models/step'; -import ExecutionStep from '../models/execution-step'; import get from 'lodash.get'; const variableRegExp = /({{step\.[\da-zA-Z-]+(?:\.[^.}{]+)+}})/g; -export default function computeParameters( - parameters: Step['parameters'], - executionSteps: ExecutionStep[] -): Step['parameters'] { +export default function computeParameters(parameters, executionSteps) { const entries = Object.entries(parameters); - return entries.reduce((result, [key, value]: [string, unknown]) => { + return entries.reduce((result, [key, value]) => { if (typeof value === 'string') { const parts = value.split(variableRegExp); const computedValue = parts - .map((part: string) => { + .map((part) => { const isVariable = part.match(variableRegExp); if (isVariable) { - const stepIdAndKeyPath = part.replace(/{{step.|}}/g, '') as string; + const stepIdAndKeyPath = part.replace(/{{step.|}}/g, ''); const [stepId, ...keyPaths] = stepIdAndKeyPath.split('.'); const keyPath = keyPaths.join('.'); const executionStep = executionSteps.find((executionStep) => { diff --git a/packages/backend/src/helpers/create-auth-token-by-user-id.ts b/packages/backend/src/helpers/create-auth-token-by-user-id.js similarity index 71% rename from packages/backend/src/helpers/create-auth-token-by-user-id.ts rename to packages/backend/src/helpers/create-auth-token-by-user-id.js index afc3fe19..d70382d9 100644 --- a/packages/backend/src/helpers/create-auth-token-by-user-id.ts +++ b/packages/backend/src/helpers/create-auth-token-by-user-id.js @@ -1,9 +1,9 @@ import jwt from 'jsonwebtoken'; -import appConfig from '../config/app'; +import appConfig from '../config/app.js'; const TOKEN_EXPIRES_IN = '14d'; -const createAuthTokenByUserId = (userId: string) => { +const createAuthTokenByUserId = (userId) => { const token = jwt.sign({ userId }, appConfig.appSecretKey, { expiresIn: TOKEN_EXPIRES_IN, }); diff --git a/packages/backend/src/helpers/create-bull-board-handler.ts b/packages/backend/src/helpers/create-bull-board-handler.js similarity index 65% rename from packages/backend/src/helpers/create-bull-board-handler.ts rename to packages/backend/src/helpers/create-bull-board-handler.js index 6b16467d..03f949b6 100644 --- a/packages/backend/src/helpers/create-bull-board-handler.ts +++ b/packages/backend/src/helpers/create-bull-board-handler.js @@ -1,13 +1,13 @@ import { ExpressAdapter } from '@bull-board/express'; import { createBullBoard } from '@bull-board/api'; -import { BullMQAdapter } from '@bull-board/api/bullMQAdapter'; -import flowQueue from '../queues/flow'; -import triggerQueue from '../queues/trigger'; -import actionQueue from '../queues/action'; -import emailQueue from '../queues/email'; -import deleteUserQueue from '../queues/delete-user.ee'; -import removeCancelledSubscriptionsQueue from '../queues/remove-cancelled-subscriptions.ee'; -import appConfig from '../config/app'; +import { BullMQAdapter } from '@bull-board/api/bullMQAdapter.js'; +import flowQueue from '../queues/flow.js'; +import triggerQueue from '../queues/trigger.js'; +import actionQueue from '../queues/action.js'; +import emailQueue from '../queues/email.js'; +import deleteUserQueue from '../queues/delete-user.ee.js'; +import removeCancelledSubscriptionsQueue from '../queues/remove-cancelled-subscriptions.ee.js'; +import appConfig from '../config/app.js'; const serverAdapter = new ExpressAdapter(); @@ -31,7 +31,7 @@ const shouldEnableBullDashboard = () => { ); }; -const createBullBoardHandler = async (serverAdapter: ExpressAdapter) => { +const createBullBoardHandler = async (serverAdapter) => { if (!shouldEnableBullDashboard) return; createBullBoard({ diff --git a/packages/backend/src/helpers/define-action.js b/packages/backend/src/helpers/define-action.js new file mode 100644 index 00000000..fc3b45ef --- /dev/null +++ b/packages/backend/src/helpers/define-action.js @@ -0,0 +1,3 @@ +export default function defineAction(actionDefinition) { + return actionDefinition; +} diff --git a/packages/backend/src/helpers/define-action.ts b/packages/backend/src/helpers/define-action.ts deleted file mode 100644 index 6d8bf92c..00000000 --- a/packages/backend/src/helpers/define-action.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IRawAction } from '@automatisch/types'; - -export default function defineAction(actionDefinition: IRawAction): IRawAction { - return actionDefinition; -} diff --git a/packages/backend/src/helpers/define-app.js b/packages/backend/src/helpers/define-app.js new file mode 100644 index 00000000..3630f474 --- /dev/null +++ b/packages/backend/src/helpers/define-app.js @@ -0,0 +1,3 @@ +export default function defineApp(appDefinition) { + return appDefinition; +} diff --git a/packages/backend/src/helpers/define-app.ts b/packages/backend/src/helpers/define-app.ts deleted file mode 100644 index a8ca6b44..00000000 --- a/packages/backend/src/helpers/define-app.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IApp } from '@automatisch/types'; - -export default function defineApp(appDefinition: IApp): IApp { - return appDefinition; -} diff --git a/packages/backend/src/helpers/define-trigger.js b/packages/backend/src/helpers/define-trigger.js new file mode 100644 index 00000000..008bdf18 --- /dev/null +++ b/packages/backend/src/helpers/define-trigger.js @@ -0,0 +1,3 @@ +export default function defineTrigger(triggerDefinition) { + return triggerDefinition; +} diff --git a/packages/backend/src/helpers/define-trigger.ts b/packages/backend/src/helpers/define-trigger.ts deleted file mode 100644 index 19b5c39d..00000000 --- a/packages/backend/src/helpers/define-trigger.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IRawTrigger } from '@automatisch/types'; - -export default function defineTrigger( - triggerDefinition: IRawTrigger -): IRawTrigger { - return triggerDefinition; -} diff --git a/packages/backend/src/helpers/delay-as-milliseconds.js b/packages/backend/src/helpers/delay-as-milliseconds.js new file mode 100644 index 00000000..c657647f --- /dev/null +++ b/packages/backend/src/helpers/delay-as-milliseconds.js @@ -0,0 +1,19 @@ +import delayForAsMilliseconds from './delay-for-as-milliseconds.js'; +import delayUntilAsMilliseconds from './delay-until-as-milliseconds.js'; + +const delayAsMilliseconds = (eventKey, computedParameters) => { + let delayDuration = 0; + + if (eventKey === 'delayFor') { + const { delayForUnit, delayForValue } = computedParameters; + + delayDuration = delayForAsMilliseconds(delayForUnit, Number(delayForValue)); + } else if (eventKey === 'delayUntil') { + const { delayUntil } = computedParameters; + delayDuration = delayUntilAsMilliseconds(delayUntil); + } + + return delayDuration; +}; + +export default delayAsMilliseconds; diff --git a/packages/backend/src/helpers/delay-as-milliseconds.ts b/packages/backend/src/helpers/delay-as-milliseconds.ts deleted file mode 100644 index 8f60dd03..00000000 --- a/packages/backend/src/helpers/delay-as-milliseconds.ts +++ /dev/null @@ -1,25 +0,0 @@ -import Step from '../models/step'; -import delayForAsMilliseconds, { - TDelayForUnit, -} from './delay-for-as-milliseconds'; -import delayUntilAsMilliseconds from './delay-until-as-milliseconds'; - -const delayAsMilliseconds = (eventKey: Step["key"], computedParameters: Step["parameters"]) => { - let delayDuration = 0; - - if (eventKey === 'delayFor') { - const { delayForUnit, delayForValue } = computedParameters; - - delayDuration = delayForAsMilliseconds( - delayForUnit as TDelayForUnit, - Number(delayForValue) - ); - } else if (eventKey === 'delayUntil') { - const { delayUntil } = computedParameters; - delayDuration = delayUntilAsMilliseconds(delayUntil as string); - } - - return delayDuration; -}; - -export default delayAsMilliseconds; diff --git a/packages/backend/src/helpers/delay-for-as-milliseconds.ts b/packages/backend/src/helpers/delay-for-as-milliseconds.js similarity index 69% rename from packages/backend/src/helpers/delay-for-as-milliseconds.ts rename to packages/backend/src/helpers/delay-for-as-milliseconds.js index 582d1b13..e3ae5862 100644 --- a/packages/backend/src/helpers/delay-for-as-milliseconds.ts +++ b/packages/backend/src/helpers/delay-for-as-milliseconds.js @@ -1,9 +1,4 @@ -export type TDelayForUnit = 'minutes' | 'hours' | 'days' | 'weeks'; - -const delayAsMilliseconds = ( - delayForUnit: TDelayForUnit, - delayForValue: number -) => { +const delayAsMilliseconds = (delayForUnit, delayForValue) => { switch (delayForUnit) { case 'minutes': return delayForValue * 60 * 1000; diff --git a/packages/backend/src/helpers/delay-until-as-milliseconds.ts b/packages/backend/src/helpers/delay-until-as-milliseconds.js similarity index 74% rename from packages/backend/src/helpers/delay-until-as-milliseconds.ts rename to packages/backend/src/helpers/delay-until-as-milliseconds.js index 4c1da96c..4508fa88 100644 --- a/packages/backend/src/helpers/delay-until-as-milliseconds.ts +++ b/packages/backend/src/helpers/delay-until-as-milliseconds.js @@ -1,4 +1,4 @@ -const delayUntilAsMilliseconds = (delayUntil: string) => { +const delayUntilAsMilliseconds = (delayUntil) => { const delayUntilDate = new Date(delayUntil); const now = new Date(); diff --git a/packages/backend/src/helpers/error-handler.js b/packages/backend/src/helpers/error-handler.js index 910e92e5..a4a738a7 100644 --- a/packages/backend/src/helpers/error-handler.js +++ b/packages/backend/src/helpers/error-handler.js @@ -1,6 +1,7 @@ -import logger from './logger'; +import logger from './logger.js'; // Do not remove `next` argument as the function signature will not fit for an error handler middleware +// eslint-disable-next-line no-unused-vars const errorHandler = (err, req, res, next) => { if (err.message === 'Not Found') { res.status(404).end(); diff --git a/packages/backend/src/helpers/find-or-create-user-by-saml-identity.ee.ts b/packages/backend/src/helpers/find-or-create-user-by-saml-identity.ee.js similarity index 70% rename from packages/backend/src/helpers/find-or-create-user-by-saml-identity.ee.ts rename to packages/backend/src/helpers/find-or-create-user-by-saml-identity.ee.js index 2a0372ad..daeb1206 100644 --- a/packages/backend/src/helpers/find-or-create-user-by-saml-identity.ee.ts +++ b/packages/backend/src/helpers/find-or-create-user-by-saml-identity.ee.js @@ -1,22 +1,17 @@ -import SamlAuthProvider from '../models/saml-auth-provider.ee'; -import User from '../models/user'; -import Identity from '../models/identity.ee'; -import SamlAuthProvidersRoleMapping from '../models/saml-auth-providers-role-mapping.ee'; +import User from '../models/user.js'; +import Identity from '../models/identity.ee.js'; -const getUser = ( - user: Record, - providerConfig: SamlAuthProvider -) => ({ +const getUser = (user, providerConfig) => ({ name: user[providerConfig.firstnameAttributeName], surname: user[providerConfig.surnameAttributeName], id: user.nameID, email: user[providerConfig.emailAttributeName], - role: user[providerConfig.roleAttributeName] as string | string[], + role: user[providerConfig.roleAttributeName], }); const findOrCreateUserBySamlIdentity = async ( - userIdentity: Record, - samlAuthProvider: SamlAuthProvider + userIdentity, + samlAuthProvider ) => { const mappedUser = getUser(userIdentity, samlAuthProvider); const identity = await Identity.query().findOne({ @@ -46,12 +41,12 @@ const findOrCreateUserBySamlIdentity = async ( fullName: [mappedUser.name, mappedUser.surname] .filter(Boolean) .join(' '), - email: mappedUser.email as string, + email: mappedUser.email, roleId: samlAuthProviderRoleMapping?.roleId || samlAuthProvider.defaultRoleId, identities: [ { - remoteId: mappedUser.id as string, + remoteId: mappedUser.id, providerId: samlAuthProvider.id, providerType: 'saml', }, diff --git a/packages/backend/src/helpers/get-app.ts b/packages/backend/src/helpers/get-app.js similarity index 55% rename from packages/backend/src/helpers/get-app.ts rename to packages/backend/src/helpers/get-app.js index 436965d4..7d186977 100644 --- a/packages/backend/src/helpers/get-app.ts +++ b/packages/backend/src/helpers/get-app.js @@ -1,52 +1,52 @@ import path from 'node:path'; import fs from 'node:fs'; -import { - IAction, - IApp, - IRawAction, - IRawTrigger, - ITrigger, -} from '@automatisch/types'; -import { omit, cloneDeep } from 'lodash'; -import addAuthenticationSteps from './add-authentication-steps'; -import addReconnectionSteps from './add-reconnection-steps'; +import omit from 'lodash/omit.js'; +import cloneDeep from 'lodash/cloneDeep.js'; +import addAuthenticationSteps from './add-authentication-steps.js'; +import addReconnectionSteps from './add-reconnection-steps.js'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); -type TApps = Record>; const apps = fs .readdirSync(path.resolve(__dirname, `../apps/`), { withFileTypes: true }) .reduce((apps, dirent) => { if (!dirent.isDirectory()) return apps; - apps[dirent.name] = import(path.resolve(__dirname, '../apps', dirent.name)); + apps[dirent.name] = import( + path.resolve(__dirname, '../apps', dirent.name, 'index.js') + ); return apps; - }, {} as TApps); + }, {}); -async function getAppDefaultExport(appKey: string) { +async function getAppDefaultExport(appKey) { if (!Object.prototype.hasOwnProperty.call(apps, appKey)) { - throw new Error(`An application with the "${appKey}" key couldn't be found.`); + throw new Error( + `An application with the "${appKey}" key couldn't be found.` + ); } return (await apps[appKey]).default; } -function stripFunctions(data: C): C { +function stripFunctions(data) { return JSON.parse(JSON.stringify(data)); } -const getApp = async (appKey: string, stripFuncs = true) => { - let appData: IApp = cloneDeep(await getAppDefaultExport(appKey)); +const getApp = async (appKey, stripFuncs = true) => { + let appData = cloneDeep(await getAppDefaultExport(appKey)); if (appData.auth) { appData = addAuthenticationSteps(appData); appData = addReconnectionSteps(appData); } - appData.triggers = appData?.triggers?.map((trigger: IRawTrigger) => { + appData.triggers = appData?.triggers?.map((trigger) => { return addStaticSubsteps('trigger', appData, trigger); }); - appData.actions = appData?.actions?.map((action: IRawAction) => { + appData.actions = appData?.actions?.map((action) => { return addStaticSubsteps('action', appData, action); }); @@ -62,19 +62,15 @@ const chooseConnectionStep = { name: 'Choose connection', }; -const testStep = (stepType: 'trigger' | 'action') => { +const testStep = (stepType) => { return { key: 'testStep', name: stepType === 'trigger' ? 'Test trigger' : 'Test action', }; }; -const addStaticSubsteps = ( - stepType: 'trigger' | 'action', - appData: IApp, - step: IRawTrigger | IRawAction -) => { - const computedStep: ITrigger | IAction = omit(step, ['arguments']); +const addStaticSubsteps = (stepType, appData, step) => { + const computedStep = omit(step, ['arguments']); computedStep.substeps = []; diff --git a/packages/backend/src/helpers/global-variable.ts b/packages/backend/src/helpers/global-variable.js similarity index 74% rename from packages/backend/src/helpers/global-variable.ts rename to packages/backend/src/helpers/global-variable.js index db3c8d85..168be47c 100644 --- a/packages/backend/src/helpers/global-variable.ts +++ b/packages/backend/src/helpers/global-variable.js @@ -1,32 +1,8 @@ -import createHttpClient from './http-client'; -import Connection from '../models/connection'; -import Flow from '../models/flow'; -import Step from '../models/step'; -import Execution from '../models/execution'; -import { - IJSONObject, - IApp, - IGlobalVariable, - ITriggerItem, - IActionItem, - IRequest, -} from '@automatisch/types'; -import EarlyExitError from '../errors/early-exit'; -import AlreadyProcessedError from '../errors/already-processed'; +import createHttpClient from './http-client/index.js'; +import EarlyExitError from '../errors/early-exit.js'; +import AlreadyProcessedError from '../errors/already-processed.js'; -type GlobalVariableOptions = { - connection?: Connection; - app?: IApp; - flow?: Flow; - step?: Step; - execution?: Execution; - testRun?: boolean; - request?: IRequest; -}; - -const globalVariable = async ( - options: GlobalVariableOptions -): Promise => { +const globalVariable = async (options) => { const { connection, app, @@ -41,9 +17,9 @@ const globalVariable = async ( const lastInternalId = testRun ? undefined : await flow?.lastInternalId(); const nextStep = await step?.getNextStep(); - const $: IGlobalVariable = { + const $ = { auth: { - set: async (args: IJSONObject) => { + set: async (args) => { if (connection) { await connection.$query().patchAndFetch({ formattedData: { @@ -91,7 +67,7 @@ const globalVariable = async ( raw: null, }, }, - pushTriggerItem: (triggerItem: ITriggerItem) => { + pushTriggerItem: (triggerItem) => { if ( isAlreadyProcessed(triggerItem.meta.internalId) && !$.execution.testRun @@ -109,7 +85,7 @@ const globalVariable = async ( throw new EarlyExitError(); } }, - setActionItem: (actionItem: IActionItem) => { + setActionItem: (actionItem) => { $.actionOutput.data = actionItem; }, }; @@ -151,7 +127,7 @@ const globalVariable = async ( ? [] : await flow?.lastInternalIds(2000); - const isAlreadyProcessed = (internalId: string) => { + const isAlreadyProcessed = (internalId) => { return lastInternalIds?.includes(internalId); }; diff --git a/packages/backend/src/helpers/graphql-instance.ts b/packages/backend/src/helpers/graphql-instance.js similarity index 61% rename from packages/backend/src/helpers/graphql-instance.ts rename to packages/backend/src/helpers/graphql-instance.js index fe5d0398..a8a50db7 100644 --- a/packages/backend/src/helpers/graphql-instance.ts +++ b/packages/backend/src/helpers/graphql-instance.js @@ -1,16 +1,19 @@ -import { join } from 'node:path'; +import path, { join } from 'path'; +import { fileURLToPath } from 'url'; import { graphqlHTTP } from 'express-graphql'; import { loadSchemaSync } from '@graphql-tools/load'; import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; import { addResolversToSchema } from '@graphql-tools/schema'; import { applyMiddleware } from 'graphql-middleware'; -import appConfig from '../config/app'; -import logger from '../helpers/logger'; -import authentication from '../helpers/authentication'; -import * as Sentry from '../helpers/sentry.ee'; -import resolvers from '../graphql/resolvers'; -import HttpError from '../errors/http'; +import appConfig from '../config/app.js'; +import logger from './logger.js'; +import authentication from './authentication.js'; +import * as Sentry from './sentry.ee.js'; +import resolvers from '../graphql/resolvers.js'; +import HttpError from '../errors/http.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const schema = loadSchemaSync(join(__dirname, '../graphql/schema.graphql'), { loaders: [new GraphQLFileLoader()], @@ -22,13 +25,16 @@ const schemaWithResolvers = addResolversToSchema({ }); const graphQLInstance = graphqlHTTP({ - schema: applyMiddleware(schemaWithResolvers, authentication), + schema: applyMiddleware( + schemaWithResolvers, + authentication.generate(schemaWithResolvers) + ), graphiql: appConfig.isDev, customFormatErrorFn: (error) => { logger.error(error.path + ' : ' + error.message + '\n' + error.stack); if (error.originalError instanceof HttpError) { - delete (error.originalError as HttpError).response; + delete error.originalError.response; } Sentry.captureException(error, { @@ -36,9 +42,9 @@ const graphQLInstance = graphqlHTTP({ extra: { source: error.source?.body, positions: error.positions, - path: error.path - } - }) + path: error.path, + }, + }); return error; }, diff --git a/packages/backend/src/helpers/http-client/index.js b/packages/backend/src/helpers/http-client/index.js new file mode 100644 index 00000000..e32482df --- /dev/null +++ b/packages/backend/src/helpers/http-client/index.js @@ -0,0 +1,68 @@ +import { URL } from 'node:url'; +import HttpError from '../../errors/http.js'; +import axios from '../axios-with-proxy.js'; + +const removeBaseUrlForAbsoluteUrls = (requestConfig) => { + try { + const url = new URL(requestConfig.url); + requestConfig.baseURL = url.origin; + requestConfig.url = url.pathname + url.search; + + return requestConfig; + } catch { + return requestConfig; + } +}; + +export default function createHttpClient({ $, baseURL, beforeRequest = [] }) { + const instance = axios.create({ + baseURL, + }); + + instance.interceptors.request.use((requestConfig) => { + const newRequestConfig = removeBaseUrlForAbsoluteUrls(requestConfig); + + const result = beforeRequest.reduce((newConfig, beforeRequestFunc) => { + return beforeRequestFunc($, newConfig); + }, newRequestConfig); + + /** + * axios seems to want InternalAxiosRequestConfig returned not AxioRequestConfig + * anymore even though requests do require AxiosRequestConfig. + * + * Since both interfaces are very similar (InternalAxiosRequestConfig + * extends AxiosRequestConfig), we can utilize an assertion below + **/ + return result; + }); + + instance.interceptors.response.use( + (response) => response, + async (error) => { + const { config, response } = error; + // Do not destructure `status` from `error.response` because it might not exist + const status = response?.status; + + if ( + // TODO: provide a `shouldRefreshToken` function in the app + (status === 401 || status === 403) && + $.app.auth && + $.app.auth.refreshToken && + !$.app.auth.isRefreshTokenRequested + ) { + $.app.auth.isRefreshTokenRequested = true; + await $.app.auth.refreshToken($); + + // retry the previous request before the expired token error + const newResponse = await instance.request(config); + $.app.auth.isRefreshTokenRequested = false; + + return newResponse; + } + + throw new HttpError(error); + } + ); + + return instance; +} diff --git a/packages/backend/src/helpers/http-client/index.ts b/packages/backend/src/helpers/http-client/index.ts deleted file mode 100644 index 741782f5..00000000 --- a/packages/backend/src/helpers/http-client/index.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { IHttpClientParams } from '@automatisch/types'; -import { InternalAxiosRequestConfig } from 'axios'; -import { URL } from 'node:url'; -export { AxiosInstance as IHttpClient } from 'axios'; - -import HttpError from '../../errors/http'; -import axios from '../axios-with-proxy'; - -const removeBaseUrlForAbsoluteUrls = ( - requestConfig: InternalAxiosRequestConfig -): InternalAxiosRequestConfig => { - try { - const url = new URL(requestConfig.url); - requestConfig.baseURL = url.origin; - requestConfig.url = url.pathname + url.search; - - return requestConfig; - } catch { - return requestConfig; - } -}; - -export default function createHttpClient({ - $, - baseURL, - beforeRequest = [], -}: IHttpClientParams) { - const instance = axios.create({ - baseURL, - }); - - instance.interceptors.request.use( - (requestConfig: InternalAxiosRequestConfig): InternalAxiosRequestConfig => { - const newRequestConfig = removeBaseUrlForAbsoluteUrls(requestConfig); - - const result = beforeRequest.reduce((newConfig, beforeRequestFunc) => { - return beforeRequestFunc($, newConfig); - }, newRequestConfig); - - /** - * axios seems to want InternalAxiosRequestConfig returned not AxioRequestConfig - * anymore even though requests do require AxiosRequestConfig. - * - * Since both interfaces are very similar (InternalAxiosRequestConfig - * extends AxiosRequestConfig), we can utilize an assertion below - **/ - return result as InternalAxiosRequestConfig; - } - ); - - instance.interceptors.response.use( - (response) => response, - async (error) => { - const { config, response } = error; - // Do not destructure `status` from `error.response` because it might not exist - const status = response?.status; - - if ( - // TODO: provide a `shouldRefreshToken` function in the app - (status === 401 || status === 403) && - $.app.auth && - $.app.auth.refreshToken && - !$.app.auth.isRefreshTokenRequested - ) { - $.app.auth.isRefreshTokenRequested = true; - await $.app.auth.refreshToken($); - - // retry the previous request before the expired token error - const newResponse = await instance.request(config); - $.app.auth.isRefreshTokenRequested = false; - - return newResponse; - } - - throw new HttpError(error); - } - ); - - return instance; -} diff --git a/packages/backend/src/helpers/inject-bull-board-handler.ts b/packages/backend/src/helpers/inject-bull-board-handler.js similarity index 70% rename from packages/backend/src/helpers/inject-bull-board-handler.ts rename to packages/backend/src/helpers/inject-bull-board-handler.js index 3e35fa29..17266c07 100644 --- a/packages/backend/src/helpers/inject-bull-board-handler.ts +++ b/packages/backend/src/helpers/inject-bull-board-handler.js @@ -1,12 +1,7 @@ -import { Application } from 'express'; -import { ExpressAdapter } from '@bull-board/express'; import basicAuth from 'express-basic-auth'; -import appConfig from '../config/app'; +import appConfig from '../config/app.js'; -const injectBullBoardHandler = async ( - app: Application, - serverAdapter: ExpressAdapter -) => { +const injectBullBoardHandler = async (app, serverAdapter) => { if ( !appConfig.enableBullMQDashboard || !appConfig.bullMQDashboardUsername || diff --git a/packages/backend/src/helpers/license.ee.ts b/packages/backend/src/helpers/license.ee.js similarity index 90% rename from packages/backend/src/helpers/license.ee.ts rename to packages/backend/src/helpers/license.ee.js index 76716985..d3ae30c0 100644 --- a/packages/backend/src/helpers/license.ee.ts +++ b/packages/backend/src/helpers/license.ee.js @@ -1,6 +1,6 @@ import memoryCache from 'memory-cache'; -import appConfig from '../config/app'; -import axios from './axios-with-proxy'; +import appConfig from '../config/app.js'; +import axios from './axios-with-proxy.js'; const CACHE_DURATION = 1000 * 60 * 60 * 24; // 24 hours in milliseconds diff --git a/packages/backend/src/helpers/logger.ts b/packages/backend/src/helpers/logger.js similarity index 95% rename from packages/backend/src/helpers/logger.ts rename to packages/backend/src/helpers/logger.js index e5c9ee82..c929e5ac 100644 --- a/packages/backend/src/helpers/logger.ts +++ b/packages/backend/src/helpers/logger.js @@ -1,5 +1,5 @@ import * as winston from 'winston'; -import appConfig from '../config/app'; +import appConfig from '../config/app.js'; const levels = { error: 0, diff --git a/packages/backend/src/helpers/mailer.ee.ts b/packages/backend/src/helpers/mailer.ee.js similarity index 86% rename from packages/backend/src/helpers/mailer.ee.ts rename to packages/backend/src/helpers/mailer.ee.js index ff6fff51..2a574889 100644 --- a/packages/backend/src/helpers/mailer.ee.ts +++ b/packages/backend/src/helpers/mailer.ee.js @@ -1,5 +1,5 @@ import nodemailer from 'nodemailer'; -import appConfig from '../config/app'; +import appConfig from '../config/app.js'; const mailer = nodemailer.createTransport({ host: appConfig.smtpHost, diff --git a/packages/backend/src/helpers/morgan.ts b/packages/backend/src/helpers/morgan.js similarity index 67% rename from packages/backend/src/helpers/morgan.ts rename to packages/backend/src/helpers/morgan.js index 10652b9a..1afa001f 100644 --- a/packages/backend/src/helpers/morgan.ts +++ b/packages/backend/src/helpers/morgan.js @@ -1,14 +1,13 @@ -import morgan, { StreamOptions } from 'morgan'; -import { Request } from 'express'; -import logger from './logger'; +import morgan from 'morgan'; +import logger from './logger.js'; -const stream: StreamOptions = { +const stream = { write: (message) => logger.http(message.substring(0, message.lastIndexOf('\n'))), }; const registerGraphQLToken = () => { - morgan.token('graphql-query', (req: Request) => { + morgan.token('graphql-query', (req) => { if (req.body.query) { return `GraphQL ${req.body.query}`; } diff --git a/packages/backend/src/helpers/pagination.ts b/packages/backend/src/helpers/pagination.js similarity index 59% rename from packages/backend/src/helpers/pagination.ts rename to packages/backend/src/helpers/pagination.js index 77916052..419df03f 100644 --- a/packages/backend/src/helpers/pagination.ts +++ b/packages/backend/src/helpers/pagination.js @@ -1,12 +1,4 @@ -import { Model } from 'objection'; -import ExtendedQueryBuilder from '../models/query-builder'; -import type Base from '../models/base'; - -const paginate = async ( - query: ExtendedQueryBuilder, - limit: number, - offset: number, -) => { +const paginate = async (query, limit, offset) => { if (limit < 1 || limit > 100) { throw new Error('Limit must be between 1 and 100'); } @@ -22,7 +14,7 @@ const paginate = async ( totalPages: Math.ceil(count / limit), }, totalCount: count, - edges: records.map((record: Base) => ({ + edges: records.map((record) => ({ node: record, })), }; diff --git a/packages/backend/src/helpers/parse-header-link.ts b/packages/backend/src/helpers/parse-header-link.js similarity index 51% rename from packages/backend/src/helpers/parse-header-link.ts rename to packages/backend/src/helpers/parse-header-link.js index b636cae6..face70f8 100644 --- a/packages/backend/src/helpers/parse-header-link.ts +++ b/packages/backend/src/helpers/parse-header-link.js @@ -1,38 +1,16 @@ -type TParameters = { - [key: string]: string; - rel?: string; -}; - -type TReference = { - uri: string; - parameters: TParameters; -}; - -type TRel = 'next' | 'prev' | 'first' | 'last'; - -type TParsedLinkHeader = { - next?: TReference; - prev?: TReference; - first?: TReference; - last?: TReference; -}; - -export default function parseLinkHeader(link: string): TParsedLinkHeader { - const parsed: TParsedLinkHeader = {}; +export default function parseLinkHeader(link) { + const parsed = {}; if (!link) return parsed; const items = link.split(','); for (const item of items) { - const [rawUriReference, ...rawLinkParameters] = item.split(';') as [ - string, - ...string[] - ]; + const [rawUriReference, ...rawLinkParameters] = item.split(';'); const trimmedUriReference = rawUriReference.trim(); const reference = trimmedUriReference.slice(1, -1); - const parameters: TParameters = {}; + const parameters = {}; for (const rawParameter of rawLinkParameters) { const trimmedRawParameter = rawParameter.trim(); @@ -41,7 +19,7 @@ export default function parseLinkHeader(link: string): TParsedLinkHeader { parameters[key.trim()] = value.slice(1, -1); } - parsed[parameters.rel as TRel] = { + parsed[parameters.rel] = { uri: reference, parameters, }; diff --git a/packages/backend/src/helpers/passport.js b/packages/backend/src/helpers/passport.js new file mode 100644 index 00000000..2e7a1430 --- /dev/null +++ b/packages/backend/src/helpers/passport.js @@ -0,0 +1,89 @@ +import { URL } from 'node:url'; +import { MultiSamlStrategy } from '@node-saml/passport-saml'; +import passport from 'passport'; + +import appConfig from '../config/app.js'; +import createAuthTokenByUserId from './create-auth-token-by-user-id.js'; +import SamlAuthProvider from '../models/saml-auth-provider.ee.js'; +import findOrCreateUserBySamlIdentity from './find-or-create-user-by-saml-identity.ee.js'; + +export default function configurePassport(app) { + app.use( + passport.initialize({ + userProperty: 'currentUser', + }) + ); + + passport.use( + new MultiSamlStrategy( + { + passReqToCallback: true, + getSamlOptions: async function (request, done) { + const { issuer } = request.params; + const notFoundIssuer = new Error('Issuer cannot be found!'); + + if (!issuer) return done(notFoundIssuer); + + const authProvider = await SamlAuthProvider.query().findOne({ + issuer: request.params.issuer, + }); + + if (!authProvider) { + return done(notFoundIssuer); + } + + return done(null, authProvider.config); + }, + }, + async function (request, user, done) { + const { issuer } = request.params; + const notFoundIssuer = new Error('Issuer cannot be found!'); + + if (!issuer) return done(notFoundIssuer); + + const authProvider = await SamlAuthProvider.query().findOne({ + issuer: request.params.issuer, + }); + + if (!authProvider) { + return done(notFoundIssuer); + } + + const foundUserWithIdentity = await findOrCreateUserBySamlIdentity( + user, + authProvider + ); + return done(null, foundUserWithIdentity); + }, + function (request, user, done) { + return done(null, null); + } + ) + ); + + app.get( + '/login/saml/:issuer', + passport.authenticate('saml', { + session: false, + successRedirect: '/', + }) + ); + + app.post( + '/login/saml/:issuer/callback', + passport.authenticate('saml', { + session: false, + failureRedirect: '/', + failureFlash: true, + }), + (req, res) => { + const token = createAuthTokenByUserId(req.currentUser.id); + + const redirectUrl = new URL( + `/login/callback?token=${token}`, + appConfig.webAppUrl + ).toString(); + res.redirect(redirectUrl); + } + ); +} diff --git a/packages/backend/src/helpers/passport.ts b/packages/backend/src/helpers/passport.ts deleted file mode 100644 index 19e24d0f..00000000 --- a/packages/backend/src/helpers/passport.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { URL } from 'node:url'; -import { IRequest } from '@automatisch/types'; -import { MultiSamlStrategy } from '@node-saml/passport-saml'; -import { Express } from 'express'; -import passport from 'passport'; - -import appConfig from '../config/app'; -import createAuthTokenByUserId from '../helpers/create-auth-token-by-user-id'; -import SamlAuthProvider from '../models/saml-auth-provider.ee'; -import findOrCreateUserBySamlIdentity from './find-or-create-user-by-saml-identity.ee' - -export default function configurePassport(app: Express) { - app.use(passport.initialize({ - userProperty: 'currentUser', - })); - - passport.use(new MultiSamlStrategy( - { - passReqToCallback: true, - getSamlOptions: async function (request, done) { - const { issuer } = request.params; - const notFoundIssuer = new Error('Issuer cannot be found!'); - - if (!issuer) return done(notFoundIssuer); - - const authProvider = await SamlAuthProvider.query().findOne({ - issuer: request.params.issuer as string, - }); - - if (!authProvider) { - return done(notFoundIssuer); - } - - return done(null, authProvider.config); - }, - }, - async function (request, user: Record, done) { - const { issuer } = request.params; - const notFoundIssuer = new Error('Issuer cannot be found!'); - - if (!issuer) return done(notFoundIssuer); - - const authProvider = await SamlAuthProvider.query().findOne({ - issuer: request.params.issuer as string, - }); - - if (!authProvider) { - return done(notFoundIssuer); - } - - const foundUserWithIdentity = await findOrCreateUserBySamlIdentity(user, authProvider); - return done(null, foundUserWithIdentity as unknown as Record); - }, - function (request, user: Record, done: (error: any, user: Record) => void) { - return done(null, null); - } - )); - - app.get('/login/saml/:issuer', - passport.authenticate('saml', - { - session: false, - successRedirect: '/', - }) - ); - - app.post( - '/login/saml/:issuer/callback', - passport.authenticate('saml', { - session: false, - failureRedirect: '/', - failureFlash: true, - }), - (req: IRequest, res) => { - const token = createAuthTokenByUserId(req.currentUser.id); - - const redirectUrl = new URL( - `/login/callback?token=${token}`, - appConfig.webAppUrl, - ).toString(); - res.redirect(redirectUrl); - } - ); -}; diff --git a/packages/backend/src/helpers/permission-catalog.ee.ts b/packages/backend/src/helpers/permission-catalog.ee.js similarity index 100% rename from packages/backend/src/helpers/permission-catalog.ee.ts rename to packages/backend/src/helpers/permission-catalog.ee.js diff --git a/packages/backend/src/helpers/remove-job-configuration.ts b/packages/backend/src/helpers/remove-job-configuration.js similarity index 100% rename from packages/backend/src/helpers/remove-job-configuration.ts rename to packages/backend/src/helpers/remove-job-configuration.js diff --git a/packages/backend/src/helpers/sentry.ee.ts b/packages/backend/src/helpers/sentry.ee.js similarity index 57% rename from packages/backend/src/helpers/sentry.ee.ts rename to packages/backend/src/helpers/sentry.ee.js index 0810bad0..f48d50bf 100644 --- a/packages/backend/src/helpers/sentry.ee.ts +++ b/packages/backend/src/helpers/sentry.ee.js @@ -1,13 +1,11 @@ -import { Express } from 'express'; import * as Sentry from '@sentry/node'; -import type { CaptureContext } from '@sentry/types'; import * as Tracing from '@sentry/tracing'; -import appConfig from '../config/app'; +import appConfig from '../config/app.js'; const isSentryEnabled = !!appConfig.sentryDsn; -export function init(app?: Express) { +export function init(app) { if (!isSentryEnabled) return; return Sentry.init({ @@ -22,31 +20,32 @@ export function init(app?: Express) { }); } - -export function attachRequestHandler(app: Express) { +export function attachRequestHandler(app) { if (!isSentryEnabled) return; app.use(Sentry.Handlers.requestHandler()); } -export function attachTracingHandler(app: Express) { +export function attachTracingHandler(app) { if (!isSentryEnabled) return; app.use(Sentry.Handlers.tracingHandler()); } -export function attachErrorHandler(app: Express) { +export function attachErrorHandler(app) { if (!isSentryEnabled) return; - app.use(Sentry.Handlers.errorHandler({ - shouldHandleError() { - // TODO: narrow down the captured errors in time as we receive samples - return true; - } - })); + app.use( + Sentry.Handlers.errorHandler({ + shouldHandleError() { + // TODO: narrow down the captured errors in time as we receive samples + return true; + }, + }) + ); } -export function captureException(exception: any, captureContext?: CaptureContext) { +export function captureException(exception, captureContext) { if (!isSentryEnabled) return; return Sentry.captureException(exception, captureContext); diff --git a/packages/backend/src/helpers/telemetry/index.ts b/packages/backend/src/helpers/telemetry/index.js similarity index 77% rename from packages/backend/src/helpers/telemetry/index.ts rename to packages/backend/src/helpers/telemetry/index.js index 38d5472e..7791aec6 100644 --- a/packages/backend/src/helpers/telemetry/index.ts +++ b/packages/backend/src/helpers/telemetry/index.js @@ -1,12 +1,7 @@ -import Analytics, { apiObject } from '@rudderstack/rudder-sdk-node'; -import organizationId from './organization-id'; -import instanceId from './instance-id'; -import appConfig from '../../config/app'; -import Step from '../../models/step'; -import Flow from '../../models/flow'; -import Execution from '../../models/execution'; -import ExecutionStep from '../../models/execution-step'; -import Connection from '../../models/connection'; +import Analytics from '@rudderstack/rudder-sdk-node'; +import organizationId from './organization-id.js'; +import instanceId from './instance-id.js'; +import appConfig from '../../config/app.js'; import os from 'os'; const WRITE_KEY = '284Py4VgK2MsNYV7xlKzyrALx0v'; @@ -15,22 +10,17 @@ const CPUS = os.cpus(); const SIX_HOURS_IN_MILLISECONDS = 21600000; class Telemetry { - organizationId: string; - instanceId: string; - client: Analytics; - serviceType: string; - constructor() { this.client = new Analytics(WRITE_KEY, DATA_PLANE_URL); this.organizationId = organizationId(); this.instanceId = instanceId(); } - setServiceType(type: string) { + setServiceType(type) { this.serviceType = type; } - track(name: string, properties: apiObject) { + track(name, properties) { if (!appConfig.telemetryEnabled) { return; } @@ -48,7 +38,7 @@ class Telemetry { }); } - stepCreated(step: Step) { + stepCreated(step) { this.track('stepCreated', { stepId: step.id, flowId: step.flowId, @@ -57,7 +47,7 @@ class Telemetry { }); } - stepUpdated(step: Step) { + stepUpdated(step) { this.track('stepUpdated', { stepId: step.id, flowId: step.flowId, @@ -71,7 +61,7 @@ class Telemetry { }); } - flowCreated(flow: Flow) { + flowCreated(flow) { this.track('flowCreated', { flowId: flow.id, name: flow.name, @@ -81,7 +71,7 @@ class Telemetry { }); } - flowUpdated(flow: Flow) { + flowUpdated(flow) { this.track('flowUpdated', { flowId: flow.id, name: flow.name, @@ -91,7 +81,7 @@ class Telemetry { }); } - executionCreated(execution: Execution) { + executionCreated(execution) { this.track('executionCreated', { executionId: execution.id, flowId: execution.flowId, @@ -101,7 +91,7 @@ class Telemetry { }); } - executionStepCreated(executionStep: ExecutionStep) { + executionStepCreated(executionStep) { this.track('executionStepCreated', { executionStepId: executionStep.id, executionId: executionStep.executionId, @@ -112,7 +102,7 @@ class Telemetry { }); } - connectionCreated(connection: Connection) { + connectionCreated(connection) { this.track('connectionCreated', { connectionId: connection.id, key: connection.key, @@ -122,7 +112,7 @@ class Telemetry { }); } - connectionUpdated(connection: Connection) { + connectionUpdated(connection) { this.track('connectionUpdated', { connectionId: connection.id, key: connection.key, diff --git a/packages/backend/src/helpers/telemetry/instance-id.ts b/packages/backend/src/helpers/telemetry/instance-id.js similarity index 100% rename from packages/backend/src/helpers/telemetry/instance-id.ts rename to packages/backend/src/helpers/telemetry/instance-id.js diff --git a/packages/backend/src/helpers/telemetry/organization-id.ts b/packages/backend/src/helpers/telemetry/organization-id.js similarity index 84% rename from packages/backend/src/helpers/telemetry/organization-id.ts rename to packages/backend/src/helpers/telemetry/organization-id.js index 34407375..14c7f41a 100644 --- a/packages/backend/src/helpers/telemetry/organization-id.ts +++ b/packages/backend/src/helpers/telemetry/organization-id.js @@ -1,5 +1,5 @@ import CryptoJS from 'crypto-js'; -import appConfig from '../../config/app'; +import appConfig from '../../config/app.js'; const organizationId = () => { const key = appConfig.encryptionKey; diff --git a/packages/backend/src/helpers/user-ability.ts b/packages/backend/src/helpers/user-ability.js similarity index 54% rename from packages/backend/src/helpers/user-ability.ts rename to packages/backend/src/helpers/user-ability.js index b29d5706..74f4620b 100644 --- a/packages/backend/src/helpers/user-ability.ts +++ b/packages/backend/src/helpers/user-ability.js @@ -1,20 +1,23 @@ -import { PureAbility, fieldPatternMatcher, mongoQueryMatcher } from '@casl/ability'; -import type User from '../models/user' +import { + PureAbility, + fieldPatternMatcher, + mongoQueryMatcher, +} from '@casl/ability'; // Must be kept in sync with `packages/web/src/helpers/userAbility.ts`! -export default function userAbility(user: Partial) { +export default function userAbility(user) { const permissions = user?.permissions; const role = user?.role; // We're not using mongo, but our fields, conditions match const options = { conditionsMatcher: mongoQueryMatcher, - fieldMatcher: fieldPatternMatcher + fieldMatcher: fieldPatternMatcher, }; if (!role || !permissions) { return new PureAbility([], options); } - return new PureAbility<[string, string], string[]>(permissions, options); + return new PureAbility(permissions, options); } diff --git a/packages/backend/src/helpers/web-ui-handler.js b/packages/backend/src/helpers/web-ui-handler.js new file mode 100644 index 00000000..c5bd4f35 --- /dev/null +++ b/packages/backend/src/helpers/web-ui-handler.js @@ -0,0 +1,25 @@ +import express from 'express'; +import path, { join } from 'path'; +import appConfig from '../config/app.js'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const webUIHandler = async (app) => { + if (appConfig.serveWebAppSeparately) return; + + const webAppPath = join(__dirname, '../../../web/'); + const webBuildPath = join(webAppPath, 'build'); + const indexHtml = join(webAppPath, 'build', 'index.html'); + + app.use(express.static(webBuildPath)); + + app.get('*', (_req, res) => { + res.set('Content-Security-Policy', 'frame-ancestors: none;'); + res.set('X-Frame-Options', 'DENY'); + + res.sendFile(indexHtml); + }); +}; + +export default webUIHandler; diff --git a/packages/backend/src/helpers/web-ui-handler.ts b/packages/backend/src/helpers/web-ui-handler.ts deleted file mode 100644 index 23484b3e..00000000 --- a/packages/backend/src/helpers/web-ui-handler.ts +++ /dev/null @@ -1,21 +0,0 @@ -import express, { Application } from 'express'; -import { dirname, join } from 'path'; -import appConfig from '../config/app'; - -const webUIHandler = async (app: Application) => { - if (appConfig.serveWebAppSeparately) return; - - const webAppPath = require.resolve('@automatisch/web'); - const webBuildPath = join(dirname(webAppPath), 'build'); - const indexHtml = join(dirname(webAppPath), 'build', 'index.html'); - - app.use(express.static(webBuildPath)); - app.get('*', (_req, res) => { - res.set('Content-Security-Policy', 'frame-ancestors: none;'); - res.set('X-Frame-Options', 'DENY'); - - res.sendFile(indexHtml); - }); -}; - -export default webUIHandler; diff --git a/packages/backend/src/helpers/webhook-handler.ts b/packages/backend/src/helpers/webhook-handler.js similarity index 78% rename from packages/backend/src/helpers/webhook-handler.ts rename to packages/backend/src/helpers/webhook-handler.js index 1f5b5887..fc39b124 100644 --- a/packages/backend/src/helpers/webhook-handler.ts +++ b/packages/backend/src/helpers/webhook-handler.js @@ -1,22 +1,16 @@ -import { Response } from 'express'; -import { IRequest } from '@automatisch/types'; -import isEmpty from 'lodash/isEmpty'; +import isEmpty from 'lodash/isEmpty.js'; -import Flow from '../models/flow'; -import { processTrigger } from '../services/trigger'; -import triggerQueue from '../queues/trigger'; -import globalVariable from './global-variable'; -import QuotaExceededError from '../errors/quote-exceeded'; +import Flow from '../models/flow.js'; +import { processTrigger } from '../services/trigger.js'; +import triggerQueue from '../queues/trigger.js'; +import globalVariable from './global-variable.js'; +import QuotaExceededError from '../errors/quote-exceeded.js'; import { REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from './remove-job-configuration'; +} from './remove-job-configuration.js'; -export default async ( - flowId: string, - request: IRequest, - response: Response -) => { +export default async (flowId, request, response) => { const flow = await Flow.query().findById(flowId).throwIfNotFound(); const user = await flow.$relatedQuery('user'); diff --git a/packages/backend/src/models/app-auth-client.ts b/packages/backend/src/models/app-auth-client.js similarity index 68% rename from packages/backend/src/models/app-auth-client.ts rename to packages/backend/src/models/app-auth-client.js index cc442580..a2837763 100644 --- a/packages/backend/src/models/app-auth-client.ts +++ b/packages/backend/src/models/app-auth-client.js @@ -1,19 +1,10 @@ -import { IJSONObject } from '@automatisch/types'; -import { AES, enc } from 'crypto-js'; -import { ModelOptions, QueryContext } from 'objection'; -import appConfig from '../config/app'; -import AppConfig from './app-config'; -import Base from './base'; +import AES from 'crypto-js/aes.js'; +import enc from 'crypto-js/enc-utf8.js'; +import appConfig from '../config/app.js'; +import AppConfig from './app-config.js'; +import Base from './base.js'; class AppAuthClient extends Base { - id!: string; - name: string; - active: boolean; - appConfigId!: string; - authDefaults: string; - formattedAuthDefaults?: IJSONObject; - appConfig?: AppConfig; - static tableName = 'app_auth_clients'; static jsonSchema = { @@ -42,7 +33,7 @@ class AppAuthClient extends Base { }, }); - encryptData(): void { + encryptData() { if (!this.eligibleForEncryption()) return; this.authDefaults = AES.encrypt( @@ -52,38 +43,35 @@ class AppAuthClient extends Base { delete this.formattedAuthDefaults; } - decryptData(): void { + decryptData() { if (!this.eligibleForDecryption()) return; this.formattedAuthDefaults = JSON.parse( - AES.decrypt(this.authDefaults, appConfig.encryptionKey).toString(enc.Utf8) + AES.decrypt(this.authDefaults, appConfig.encryptionKey).toString(enc) ); } - eligibleForEncryption(): boolean { + eligibleForEncryption() { return this.formattedAuthDefaults ? true : false; } - eligibleForDecryption(): boolean { + eligibleForDecryption() { return this.authDefaults ? true : false; } // TODO: Make another abstraction like beforeSave instead of using // beforeInsert and beforeUpdate separately for the same operation. - async $beforeInsert(queryContext: QueryContext): Promise { + async $beforeInsert(queryContext) { await super.$beforeInsert(queryContext); this.encryptData(); } - async $beforeUpdate( - opt: ModelOptions, - queryContext: QueryContext - ): Promise { + async $beforeUpdate(opt, queryContext) { await super.$beforeUpdate(opt, queryContext); this.encryptData(); } - async $afterFind(): Promise { + async $afterFind() { this.decryptData(); } } diff --git a/packages/backend/src/models/app-config.ts b/packages/backend/src/models/app-config.js similarity index 70% rename from packages/backend/src/models/app-config.ts rename to packages/backend/src/models/app-config.js index e34c014d..eabc3b4b 100644 --- a/packages/backend/src/models/app-config.ts +++ b/packages/backend/src/models/app-config.js @@ -1,16 +1,8 @@ -import App from './app'; -import Base from './base'; -import AppAuthClient from './app-auth-client'; +import App from './app.js'; +import Base from './base.js'; +import AppAuthClient from './app-auth-client.js'; class AppConfig extends Base { - id!: string; - key!: string; - allowCustomConnection: boolean; - shared: boolean; - disabled: boolean; - app?: App; - appAuthClients?: AppAuthClient[]; - static tableName = 'app_configs'; static jsonSchema = { @@ -46,16 +38,13 @@ class AppConfig extends Base { } get canConnect() { - const hasSomeActiveAppAuthClients = !!this.appAuthClients - ?.some(appAuthClient => appAuthClient.active); + const hasSomeActiveAppAuthClients = !!this.appAuthClients?.some( + (appAuthClient) => appAuthClient.active + ); const shared = this.shared; const active = this.disabled === false; - const conditions = [ - hasSomeActiveAppAuthClients, - shared, - active - ]; + const conditions = [hasSomeActiveAppAuthClients, shared, active]; return conditions.every(Boolean); } diff --git a/packages/backend/src/models/app.ts b/packages/backend/src/models/app.js similarity index 52% rename from packages/backend/src/models/app.ts rename to packages/backend/src/models/app.js index 2755c6a7..6131f014 100644 --- a/packages/backend/src/models/app.ts +++ b/packages/backend/src/models/app.js @@ -1,8 +1,10 @@ import fs from 'fs'; -import { join } from 'path'; -import { IApp } from '@automatisch/types'; -import appInfoConverter from '../helpers/app-info-converter'; -import getApp from '../helpers/get-app'; +import path, { join } from 'path'; +import { fileURLToPath } from 'url'; +import appInfoConverter from '../helpers/app-info-converter.js'; +import getApp from '../helpers/get-app.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); class App { static folderPath = join(__dirname, '../apps'); @@ -10,7 +12,7 @@ class App { .readdirSync(this.folderPath) .filter((file) => fs.statSync(this.folderPath + '/' + file).isDirectory()); - static async findAll(name?: string, stripFuncs = true): Promise { + static async findAll(name, stripFuncs = true) { if (!name) return Promise.all( this.list.map( @@ -25,39 +27,45 @@ class App { ); } - static async findOneByName(name: string, stripFuncs = false): Promise { + static async findOneByName(name, stripFuncs = false) { const rawAppData = await getApp(name.toLocaleLowerCase(), stripFuncs); return appInfoConverter(rawAppData); } - static async findOneByKey(key: string, stripFuncs = false): Promise { + static async findOneByKey(key, stripFuncs = false) { const rawAppData = await getApp(key, stripFuncs); return appInfoConverter(rawAppData); } - static async checkAppAndAction(appKey: string, actionKey: string): Promise { + static async checkAppAndAction(appKey, actionKey) { const app = await this.findOneByKey(appKey); if (!actionKey) return; - const hasAction = app.actions?.find(action => action.key === actionKey); + const hasAction = app.actions?.find((action) => action.key === actionKey); if (!hasAction) { - throw new Error(`${app.name} does not have an action with the "${actionKey}" key!`); + throw new Error( + `${app.name} does not have an action with the "${actionKey}" key!` + ); } } - static async checkAppAndTrigger(appKey: string, triggerKey: string): Promise { + static async checkAppAndTrigger(appKey, triggerKey) { const app = await this.findOneByKey(appKey); if (!triggerKey) return; - const hasTrigger = app.triggers?.find(trigger => trigger.key === triggerKey); + const hasTrigger = app.triggers?.find( + (trigger) => trigger.key === triggerKey + ); if (!hasTrigger) { - throw new Error(`${app.name} does not have a trigger with the "${triggerKey}" key!`); + throw new Error( + `${app.name} does not have a trigger with the "${triggerKey}" key!` + ); } } } diff --git a/packages/backend/src/models/base.ts b/packages/backend/src/models/base.js similarity index 61% rename from packages/backend/src/models/base.ts rename to packages/backend/src/models/base.js index bbc916f4..7cd22d72 100644 --- a/packages/backend/src/models/base.ts +++ b/packages/backend/src/models/base.js @@ -1,18 +1,12 @@ import { AjvValidator, Model, snakeCaseMappers } from 'objection'; -import type { QueryContext, ModelOptions, ColumnNameMappers } from 'objection'; import addFormats from 'ajv-formats'; -import ExtendedQueryBuilder from './query-builder'; +import ExtendedQueryBuilder from './query-builder.js'; class Base extends Model { - createdAt!: string; - updatedAt!: string; - deletedAt: string; - - QueryBuilderType!: ExtendedQueryBuilder; static QueryBuilder = ExtendedQueryBuilder; - static get columnNameMappers(): ColumnNameMappers { + static get columnNameMappers() { return snakeCaseMappers(); } @@ -29,17 +23,14 @@ class Base extends Model { }); } - async $beforeInsert(queryContext: QueryContext): Promise { + async $beforeInsert(queryContext) { await super.$beforeInsert(queryContext); this.createdAt = new Date().toISOString(); this.updatedAt = new Date().toISOString(); } - async $beforeUpdate( - opts: ModelOptions, - queryContext: QueryContext - ): Promise { + async $beforeUpdate(opts, queryContext) { this.updatedAt = new Date().toISOString(); await super.$beforeUpdate(opts, queryContext); diff --git a/packages/backend/src/models/config.ts b/packages/backend/src/models/config.js similarity index 69% rename from packages/backend/src/models/config.ts rename to packages/backend/src/models/config.js index a42b8f9d..949c6aaf 100644 --- a/packages/backend/src/models/config.ts +++ b/packages/backend/src/models/config.js @@ -1,11 +1,6 @@ -import { IJSONValue } from '@automatisch/types'; -import Base from './base'; +import Base from './base.js'; class Config extends Base { - id!: string; - key!: string; - value!: { data: IJSONValue }; - static tableName = 'config'; static jsonSchema = { diff --git a/packages/backend/src/models/connection.ts b/packages/backend/src/models/connection.js similarity index 67% rename from packages/backend/src/models/connection.ts rename to packages/backend/src/models/connection.js index 8fccf88f..e79735d2 100644 --- a/packages/backend/src/models/connection.ts +++ b/packages/backend/src/models/connection.js @@ -1,36 +1,16 @@ -import { QueryContext, ModelOptions } from 'objection'; -import type { RelationMappings } from 'objection'; -import { AES, enc } from 'crypto-js'; -import { IRequest } from '@automatisch/types'; -import App from './app'; -import AppConfig from './app-config'; -import AppAuthClient from './app-auth-client'; -import Base from './base'; -import User from './user'; -import Step from './step'; -import ExtendedQueryBuilder from './query-builder'; -import appConfig from '../config/app'; -import { IJSONObject } from '@automatisch/types'; -import Telemetry from '../helpers/telemetry'; -import globalVariable from '../helpers/global-variable'; +import AES from 'crypto-js/aes.js'; +import enc from 'crypto-js/enc-utf8.js'; +import App from './app.js'; +import AppConfig from './app-config.js'; +import AppAuthClient from './app-auth-client.js'; +import Base from './base.js'; +import User from './user.js'; +import Step from './step.js'; +import appConfig from '../config/app.js'; +import Telemetry from '../helpers/telemetry/index.js'; +import globalVariable from '../helpers/global-variable.js'; class Connection extends Base { - id!: string; - key!: string; - data: string; - formattedData?: IJSONObject; - userId!: string; - verified: boolean; - draft: boolean; - count?: number; - flowCount?: number; - user?: User; - steps?: Step[]; - triggerSteps?: Step[]; - appAuthClientId?: string; - appAuthClient?: AppAuthClient; - appConfig?: AppConfig; - static tableName = 'connections'; static jsonSchema = { @@ -56,7 +36,7 @@ class Connection extends Base { return ['reconnectable']; } - static relationMappings = (): RelationMappings => ({ + static relationMappings = () => ({ user: { relation: Base.BelongsToOneRelation, modelClass: User, @@ -80,7 +60,7 @@ class Connection extends Base { from: 'connections.id', to: 'steps.connection_id', }, - filter(builder: ExtendedQueryBuilder) { + filter(builder) { builder.where('type', '=', 'trigger'); }, }, @@ -114,7 +94,7 @@ class Connection extends Base { return true; } - encryptData(): void { + encryptData() { if (!this.eligibleForEncryption()) return; this.data = AES.encrypt( @@ -125,47 +105,44 @@ class Connection extends Base { delete this.formattedData; } - decryptData(): void { + decryptData() { if (!this.eligibleForDecryption()) return; this.formattedData = JSON.parse( - AES.decrypt(this.data, appConfig.encryptionKey).toString(enc.Utf8) + AES.decrypt(this.data, appConfig.encryptionKey).toString(enc) ); } - eligibleForEncryption(): boolean { + eligibleForEncryption() { return this.formattedData ? true : false; } - eligibleForDecryption(): boolean { + eligibleForDecryption() { return this.data ? true : false; } // TODO: Make another abstraction like beforeSave instead of using // beforeInsert and beforeUpdate separately for the same operation. - async $beforeInsert(queryContext: QueryContext): Promise { + async $beforeInsert(queryContext) { await super.$beforeInsert(queryContext); this.encryptData(); } - async $beforeUpdate( - opt: ModelOptions, - queryContext: QueryContext - ): Promise { + async $beforeUpdate(opt, queryContext) { await super.$beforeUpdate(opt, queryContext); this.encryptData(); } - async $afterFind(): Promise { + async $afterFind() { this.decryptData(); } - async $afterInsert(queryContext: QueryContext) { + async $afterInsert(queryContext) { await super.$afterInsert(queryContext); Telemetry.connectionCreated(this); } - async $afterUpdate(opt: ModelOptions, queryContext: QueryContext) { + async $afterUpdate(opt, queryContext) { await super.$afterUpdate(opt, queryContext); Telemetry.connectionUpdated(this); } @@ -176,7 +153,7 @@ class Connection extends Base { return await App.findOneByKey(this.key); } - async verifyWebhook(request: IRequest) { + async verifyWebhook(request) { if (!this.key) return true; const app = await this.getApp(); diff --git a/packages/backend/src/models/execution-step.ts b/packages/backend/src/models/execution-step.js similarity index 74% rename from packages/backend/src/models/execution-step.ts rename to packages/backend/src/models/execution-step.js index 61fa6a5b..267bbfb9 100644 --- a/packages/backend/src/models/execution-step.ts +++ b/packages/backend/src/models/execution-step.js @@ -1,23 +1,10 @@ -import type { QueryContext } from 'objection'; -import { IJSONObject } from '@automatisch/types'; -import appConfig from '../config/app'; -import Base from './base'; -import Execution from './execution'; -import Step from './step'; -import Telemetry from '../helpers/telemetry'; +import appConfig from '../config/app.js'; +import Base from './base.js'; +import Execution from './execution.js'; +import Step from './step.js'; +import Telemetry from '../helpers/telemetry/index.js'; class ExecutionStep extends Base { - id!: string; - executionId!: string; - stepId!: string; - dataIn!: IJSONObject; - dataOut!: IJSONObject; - errorDetails: IJSONObject; - status: 'success' | 'failure'; - step: Step; - execution?: Execution; - count?: number; - static tableName = 'execution_steps'; static jsonSchema = { @@ -60,7 +47,7 @@ class ExecutionStep extends Base { return this.status === 'failure'; } - async $afterInsert(queryContext: QueryContext) { + async $afterInsert(queryContext) { await super.$afterInsert(queryContext); Telemetry.executionStepCreated(this); diff --git a/packages/backend/src/models/execution.ts b/packages/backend/src/models/execution.js similarity index 72% rename from packages/backend/src/models/execution.ts rename to packages/backend/src/models/execution.js index 10670138..9b219700 100644 --- a/packages/backend/src/models/execution.ts +++ b/packages/backend/src/models/execution.js @@ -1,17 +1,9 @@ -import type { QueryContext } from 'objection'; -import Base from './base'; -import Flow from './flow'; -import ExecutionStep from './execution-step'; -import Telemetry from '../helpers/telemetry'; +import Base from './base.js'; +import Flow from './flow.js'; +import ExecutionStep from './execution-step.js'; +import Telemetry from '../helpers/telemetry/index.js'; class Execution extends Base { - id!: string; - flowId!: string; - testRun: boolean; - internalId: string; - executionSteps: ExecutionStep[]; - flow?: Flow; - static tableName = 'executions'; static jsonSchema = { @@ -47,7 +39,7 @@ class Execution extends Base { }, }); - async $afterInsert(queryContext: QueryContext) { + async $afterInsert(queryContext) { await super.$afterInsert(queryContext); Telemetry.executionCreated(this); } diff --git a/packages/backend/src/models/flow.ts b/packages/backend/src/models/flow.js similarity index 73% rename from packages/backend/src/models/flow.ts rename to packages/backend/src/models/flow.js index 81602e3e..5c357156 100644 --- a/packages/backend/src/models/flow.ts +++ b/packages/backend/src/models/flow.js @@ -1,30 +1,11 @@ import { ValidationError } from 'objection'; -import type { - ModelOptions, - QueryContext, - StaticHookArguments, -} from 'objection'; -import ExtendedQueryBuilder from './query-builder'; -import Base from './base'; -import Step from './step'; -import User from './user'; -import Execution from './execution'; -import Telemetry from '../helpers/telemetry'; +import Base from './base.js'; +import Step from './step.js'; +import User from './user.js'; +import Execution from './execution.js'; +import Telemetry from '../helpers/telemetry/index.js'; class Flow extends Base { - id!: string; - name!: string; - userId!: string; - active: boolean; - status: 'paused' | 'published' | 'draft'; - steps: Step[]; - triggerStep: Step; - publishedAt: string; - remoteWebhookId: string; - executions?: Execution[]; - lastExecution?: Execution; - user?: User; - static tableName = 'flows'; static jsonSchema = { @@ -52,7 +33,7 @@ class Flow extends Base { from: 'flows.id', to: 'steps.flow_id', }, - filter(builder: ExtendedQueryBuilder) { + filter(builder) { builder.orderBy('position', 'asc'); }, }, @@ -63,11 +44,8 @@ class Flow extends Base { from: 'flows.id', to: 'steps.flow_id', }, - filter(builder: ExtendedQueryBuilder) { - builder - .where('type', 'trigger') - .limit(1) - .first(); + filter(builder) { + builder.where('type', 'trigger').limit(1).first(); }, }, executions: { @@ -85,7 +63,7 @@ class Flow extends Base { from: 'flows.id', to: 'executions.flow_id', }, - filter(builder: ExtendedQueryBuilder) { + filter(builder) { builder.orderBy('created_at', 'desc').limit(1).first(); }, }, @@ -99,7 +77,7 @@ class Flow extends Base { }, }); - static async afterFind(args: StaticHookArguments): Promise { + static async afterFind(args) { const { result } = args; const referenceFlow = result[0]; @@ -122,7 +100,7 @@ class Flow extends Base { async lastInternalId() { const lastExecution = await this.$relatedQuery('lastExecution'); - return lastExecution ? (lastExecution as Execution).internalId : null; + return lastExecution ? lastExecution.internalId : null; } async lastInternalIds(itemCount = 50) { @@ -134,15 +112,12 @@ class Flow extends Base { return lastExecutions.map((execution) => execution.internalId); } - async $beforeUpdate( - opt: ModelOptions, - queryContext: QueryContext - ): Promise { + async $beforeUpdate(opt, queryContext) { await super.$beforeUpdate(opt, queryContext); if (!this.active) return; - const oldFlow = opt.old as Flow; + const oldFlow = opt.old; const incompleteStep = await oldFlow.$relatedQuery('steps').findOne({ status: 'incomplete', @@ -168,17 +143,17 @@ class Flow extends Base { return; } - async $afterInsert(queryContext: QueryContext) { + async $afterInsert(queryContext) { await super.$afterInsert(queryContext); Telemetry.flowCreated(this); } - async $afterUpdate(opt: ModelOptions, queryContext: QueryContext) { + async $afterUpdate(opt, queryContext) { await super.$afterUpdate(opt, queryContext); Telemetry.flowUpdated(this); } - async getTriggerStep(): Promise { + async getTriggerStep() { return await this.$relatedQuery('steps').findOne({ type: 'trigger', }); diff --git a/packages/backend/src/models/identity.ee.ts b/packages/backend/src/models/identity.ee.js similarity index 69% rename from packages/backend/src/models/identity.ee.ts rename to packages/backend/src/models/identity.ee.js index 68f8ff14..09b37424 100644 --- a/packages/backend/src/models/identity.ee.ts +++ b/packages/backend/src/models/identity.ee.js @@ -1,24 +1,13 @@ -import Base from './base'; -import SamlAuthProvider from './saml-auth-provider.ee'; -import User from './user'; +import Base from './base.js'; +import SamlAuthProvider from './saml-auth-provider.ee.js'; +import User from './user.js'; class Identity extends Base { - id!: string; - remoteId!: string; - userId!: string; - providerId!: string; - providerType!: 'saml'; - static tableName = 'identities'; static jsonSchema = { type: 'object', - required: [ - 'providerId', - 'remoteId', - 'userId', - 'providerType', - ], + required: ['providerId', 'remoteId', 'userId', 'providerType'], properties: { id: { type: 'string', format: 'uuid' }, @@ -43,11 +32,10 @@ class Identity extends Base { modelClass: SamlAuthProvider, join: { from: 'saml_auth_providers.id', - to: 'identities.provider_id' + to: 'identities.provider_id', }, }, }); - } export default Identity; diff --git a/packages/backend/src/models/permission.ts b/packages/backend/src/models/permission.js similarity index 82% rename from packages/backend/src/models/permission.ts rename to packages/backend/src/models/permission.js index 8c5f2784..7ebd79c0 100644 --- a/packages/backend/src/models/permission.ts +++ b/packages/backend/src/models/permission.js @@ -1,12 +1,6 @@ -import Base from './base'; +import Base from './base.js'; class Permission extends Base { - id: string; - roleId: string; - action: string; - subject: string; - conditions: string[]; - static tableName = 'permissions'; static jsonSchema = { diff --git a/packages/backend/src/models/query-builder.js b/packages/backend/src/models/query-builder.js new file mode 100644 index 00000000..d3e0a89e --- /dev/null +++ b/packages/backend/src/models/query-builder.js @@ -0,0 +1,58 @@ +import { Model } from 'objection'; + +const DELETED_COLUMN_NAME = 'deleted_at'; + +const supportsSoftDeletion = (modelClass) => { + return modelClass.jsonSchema.properties.deletedAt; +}; + +const buildQueryBuidlerForClass = () => { + return (modelClass) => { + const qb = Model.QueryBuilder.forClass.call( + ExtendedQueryBuilder, + modelClass + ); + qb.onBuild((builder) => { + if ( + !builder.context().withSoftDeleted && + supportsSoftDeletion(qb.modelClass()) + ) { + builder.whereNull( + `${qb.modelClass().tableName}.${DELETED_COLUMN_NAME}` + ); + } + }); + return qb; + }; +}; + +class ExtendedQueryBuilder extends Model.QueryBuilder { + static forClass = buildQueryBuidlerForClass(); + + delete() { + if (supportsSoftDeletion(this.modelClass())) { + return this.patch({ + [DELETED_COLUMN_NAME]: new Date().toISOString(), + }); + } + + return super.delete(); + } + + hardDelete() { + return super.delete(); + } + + withSoftDeleted() { + this.context().withSoftDeleted = true; + return this; + } + + restore() { + return this.patch({ + [DELETED_COLUMN_NAME]: null, + }); + } +} + +export default ExtendedQueryBuilder; diff --git a/packages/backend/src/models/query-builder.ts b/packages/backend/src/models/query-builder.ts deleted file mode 100644 index 34263d23..00000000 --- a/packages/backend/src/models/query-builder.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - Model, - Page, - ModelClass, - PartialModelObject, - ForClassMethod, - AnyQueryBuilder, -} from 'objection'; - -const DELETED_COLUMN_NAME = 'deleted_at'; - -const supportsSoftDeletion = (modelClass: ModelClass) => { - return modelClass.jsonSchema.properties.deletedAt; -} - -const buildQueryBuidlerForClass = (): ForClassMethod => { - return (modelClass) => { - const qb: AnyQueryBuilder = Model.QueryBuilder.forClass.call( - ExtendedQueryBuilder, - modelClass - ); - qb.onBuild((builder) => { - if (!builder.context().withSoftDeleted && supportsSoftDeletion(qb.modelClass())) { - builder.whereNull( - `${qb.modelClass().tableName}.${DELETED_COLUMN_NAME}` - ); - } - }); - return qb; - }; -}; - -class ExtendedQueryBuilder extends Model.QueryBuilder< - M, - R -> { - ArrayQueryBuilderType!: ExtendedQueryBuilder; - SingleQueryBuilderType!: ExtendedQueryBuilder; - MaybeSingleQueryBuilderType!: ExtendedQueryBuilder; - NumberQueryBuilderType!: ExtendedQueryBuilder; - PageQueryBuilderType!: ExtendedQueryBuilder>; - - static forClass: ForClassMethod = buildQueryBuidlerForClass(); - - delete() { - if (supportsSoftDeletion(this.modelClass())) { - return this.patch({ - [DELETED_COLUMN_NAME]: new Date().toISOString(), - } as unknown as PartialModelObject); - } - - return super.delete(); - } - - hardDelete() { - return super.delete(); - } - - withSoftDeleted() { - this.context().withSoftDeleted = true; - return this; - } - - restore() { - return this.patch({ - [DELETED_COLUMN_NAME]: null, - } as unknown as PartialModelObject); - } -} - -export default ExtendedQueryBuilder; diff --git a/packages/backend/src/models/role.ts b/packages/backend/src/models/role.js similarity index 82% rename from packages/backend/src/models/role.ts rename to packages/backend/src/models/role.js index c2a3666d..af6ccafa 100644 --- a/packages/backend/src/models/role.ts +++ b/packages/backend/src/models/role.js @@ -1,15 +1,8 @@ -import Base from './base'; -import Permission from './permission'; -import User from './user'; +import Base from './base.js'; +import Permission from './permission.js'; +import User from './user.js'; class Role extends Base { - id!: string; - name!: string; - key: string; - description: string; - users?: User[]; - permissions?: Permission[]; - static tableName = 'roles'; static jsonSchema = { diff --git a/packages/backend/src/models/saml-auth-provider.ee.ts b/packages/backend/src/models/saml-auth-provider.ee.js similarity index 78% rename from packages/backend/src/models/saml-auth-provider.ee.ts rename to packages/backend/src/models/saml-auth-provider.ee.js index 075c87eb..21577dc7 100644 --- a/packages/backend/src/models/saml-auth-provider.ee.ts +++ b/packages/backend/src/models/saml-auth-provider.ee.js @@ -1,25 +1,10 @@ import { URL } from 'node:url'; -import type { SamlConfig } from '@node-saml/passport-saml'; -import appConfig from '../config/app'; -import Base from './base'; -import Identity from './identity.ee'; -import SamlAuthProvidersRoleMapping from './saml-auth-providers-role-mapping.ee'; +import appConfig from '../config/app.js'; +import Base from './base.js'; +import Identity from './identity.ee.js'; +import SamlAuthProvidersRoleMapping from './saml-auth-providers-role-mapping.ee.js'; class SamlAuthProvider extends Base { - id!: string; - name: string; - certificate: string; - signatureAlgorithm: SamlConfig['signatureAlgorithm']; - issuer: string; - entryPoint: string; - firstnameAttributeName: string; - surnameAttributeName: string; - emailAttributeName: string; - roleAttributeName: string; - defaultRoleId: string; - active: boolean; - samlAuthProvidersRoleMappings?: SamlAuthProvidersRoleMapping[]; - static tableName = 'saml_auth_providers'; static jsonSchema = { @@ -83,7 +68,7 @@ class SamlAuthProvider extends Base { return new URL(`/login/saml/${this.issuer}`, appConfig.baseUrl).toString(); } - get config(): SamlConfig { + get config() { const callbackUrl = new URL( `/login/saml/${this.issuer}/callback`, appConfig.baseUrl diff --git a/packages/backend/src/models/saml-auth-providers-role-mapping.ee.ts b/packages/backend/src/models/saml-auth-providers-role-mapping.ee.js similarity index 82% rename from packages/backend/src/models/saml-auth-providers-role-mapping.ee.ts rename to packages/backend/src/models/saml-auth-providers-role-mapping.ee.js index 188d0797..00e11bb0 100644 --- a/packages/backend/src/models/saml-auth-providers-role-mapping.ee.ts +++ b/packages/backend/src/models/saml-auth-providers-role-mapping.ee.js @@ -1,12 +1,7 @@ -import Base from './base'; -import SamlAuthProvider from './saml-auth-provider.ee'; +import Base from './base.js'; +import SamlAuthProvider from './saml-auth-provider.ee.js'; class SamlAuthProvidersRoleMapping extends Base { - id!: string; - samlAuthProviderId: string; - roleId: string; - remoteRoleName: string; - static tableName = 'saml_auth_providers_role_mappings'; static jsonSchema = { diff --git a/packages/backend/src/models/step.ts b/packages/backend/src/models/step.js similarity index 80% rename from packages/backend/src/models/step.ts rename to packages/backend/src/models/step.js index f23faec9..03af3312 100644 --- a/packages/backend/src/models/step.ts +++ b/packages/backend/src/models/step.js @@ -1,30 +1,14 @@ import { URL } from 'node:url'; -import { QueryContext, ModelOptions } from 'objection'; import get from 'lodash.get'; -import type { IJSONObject, IStep } from '@automatisch/types'; -import Base from './base'; -import App from './app'; -import Flow from './flow'; -import Connection from './connection'; -import ExecutionStep from './execution-step'; -import Telemetry from '../helpers/telemetry'; -import appConfig from '../config/app'; +import Base from './base.js'; +import App from './app.js'; +import Flow from './flow.js'; +import Connection from './connection.js'; +import ExecutionStep from './execution-step.js'; +import Telemetry from '../helpers/telemetry/index.js'; +import appConfig from '../config/app.js'; class Step extends Base { - id!: string; - flowId!: string; - key?: string; - appKey?: string; - type!: IStep['type']; - connectionId?: string; - status: 'incomplete' | 'completed'; - position!: number; - parameters: IJSONObject; - connection?: Connection; - flow: Flow; - executionSteps: ExecutionStep[]; - webhookPath?: string; - static tableName = 'steps'; static jsonSchema = { @@ -100,18 +84,18 @@ class Step extends Base { if (!triggerCommand) return null; - const { - useSingletonWebhook, - singletonWebhookRefValueParameter, - type, - } = triggerCommand; + const { useSingletonWebhook, singletonWebhookRefValueParameter, type } = + triggerCommand; const isWebhook = type === 'webhook'; if (!isWebhook) return null; if (singletonWebhookRefValueParameter) { - const parameterValue = get(this.parameters, singletonWebhookRefValueParameter); + const parameterValue = get( + this.parameters, + singletonWebhookRefValueParameter + ); return `/webhooks/connections/${this.connectionId}/${parameterValue}`; } @@ -131,21 +115,21 @@ class Step extends Base { return webhookUrl; } - async $afterInsert(queryContext: QueryContext) { + async $afterInsert(queryContext) { await super.$afterInsert(queryContext); Telemetry.stepCreated(this); } - async $afterUpdate(opt: ModelOptions, queryContext: QueryContext) { + async $afterUpdate(opt, queryContext) { await super.$afterUpdate(opt, queryContext); Telemetry.stepUpdated(this); } - get isTrigger(): boolean { + get isTrigger() { return this.type === 'trigger'; } - get isAction(): boolean { + get isAction() { return this.type === 'action'; } diff --git a/packages/backend/src/models/subscription.ee.ts b/packages/backend/src/models/subscription.ee.js similarity index 78% rename from packages/backend/src/models/subscription.ee.ts rename to packages/backend/src/models/subscription.ee.js index 028dc332..bcacf827 100644 --- a/packages/backend/src/models/subscription.ee.ts +++ b/packages/backend/src/models/subscription.ee.js @@ -1,24 +1,10 @@ -import Base from './base'; -import User from './user'; -import UsageData from './usage-data.ee'; +import Base from './base.js'; +import User from './user.js'; +import UsageData from './usage-data.ee.js'; import { DateTime } from 'luxon'; -import { getPlanById } from '../helpers/billing/plans.ee'; +import { getPlanById } from '../helpers/billing/plans.ee.js'; class Subscription extends Base { - id!: string; - userId!: string; - paddleSubscriptionId!: string; - paddlePlanId!: string; - updateUrl!: string; - cancelUrl!: string; - status!: string; - nextBillAmount!: string; - nextBillDate!: string; - lastBillDate?: string; - cancellationEffectiveDate?: string; - usageData?: UsageData[]; - currentUsageData?: UsageData; - static tableName = 'subscriptions'; static jsonSchema = { @@ -87,7 +73,7 @@ class Subscription extends Base { return ( this.status === 'deleted' && Number(this.cancellationEffectiveDate) > - DateTime.now().startOf('day').toMillis() + DateTime.now().startOf('day').toMillis() ); } diff --git a/packages/backend/src/models/usage-data.ee.ts b/packages/backend/src/models/usage-data.ee.js similarity index 81% rename from packages/backend/src/models/usage-data.ee.ts rename to packages/backend/src/models/usage-data.ee.js index ab1c8be2..eebfea37 100644 --- a/packages/backend/src/models/usage-data.ee.ts +++ b/packages/backend/src/models/usage-data.ee.js @@ -1,17 +1,9 @@ import { raw } from 'objection'; -import Base from './base'; -import User from './user'; -import Subscription from './subscription.ee'; +import Base from './base.js'; +import User from './user.js'; +import Subscription from './subscription.ee.js'; class UsageData extends Base { - id!: string; - userId!: string; - subscriptionId?: string; - consumedTaskCount!: number; - nextResetAt!: string; - subscription?: Subscription; - user?: User; - static tableName = 'usage_data'; static jsonSchema = { diff --git a/packages/backend/src/models/user.ts b/packages/backend/src/models/user.js similarity index 78% rename from packages/backend/src/models/user.ts rename to packages/backend/src/models/user.js index 6aaba259..b1a82a71 100644 --- a/packages/backend/src/models/user.ts +++ b/packages/backend/src/models/user.js @@ -1,44 +1,22 @@ import bcrypt from 'bcrypt'; import { DateTime } from 'luxon'; import crypto from 'node:crypto'; -import { ModelOptions, QueryContext } from 'objection'; -import appConfig from '../config/app'; -import { hasValidLicense } from '../helpers/license.ee'; -import userAbility from '../helpers/user-ability'; -import Base from './base'; -import Connection from './connection'; -import Execution from './execution'; -import Flow from './flow'; -import Identity from './identity.ee'; -import Permission from './permission'; -import ExtendedQueryBuilder from './query-builder'; -import Role from './role'; -import Step from './step'; -import Subscription from './subscription.ee'; -import UsageData from './usage-data.ee'; +import appConfig from '../config/app.js'; +import { hasValidLicense } from '../helpers/license.ee.js'; +import userAbility from '../helpers/user-ability.js'; +import Base from './base.js'; +import Connection from './connection.js'; +import Execution from './execution.js'; +import Flow from './flow.js'; +import Identity from './identity.ee.js'; +import Permission from './permission.js'; +import Role from './role.js'; +import Step from './step.js'; +import Subscription from './subscription.ee.js'; +import UsageData from './usage-data.ee.js'; class User extends Base { - id!: string; - fullName!: string; - email!: string; - roleId: string; - password!: string; - resetPasswordToken: string; - resetPasswordTokenSentAt: string; - trialExpiryDate: string; - connections?: Connection[]; - flows?: Flow[]; - steps?: Step[]; - executions?: Execution[]; - usageData?: UsageData[]; - currentUsageData?: UsageData; - subscriptions?: Subscription[]; - currentSubscription?: Subscription; - role: Role; - permissions: Permission[]; - identities: Identity[]; - static tableName = 'users'; static jsonSchema = { @@ -116,7 +94,7 @@ class User extends Base { from: 'usage_data.user_id', to: 'users.id', }, - filter(builder: ExtendedQueryBuilder) { + filter(builder) { builder.orderBy('created_at', 'desc').limit(1).first(); }, }, @@ -135,7 +113,7 @@ class User extends Base { from: 'subscriptions.user_id', to: 'users.id', }, - filter(builder: ExtendedQueryBuilder) { + filter(builder) { builder.orderBy('created_at', 'desc').limit(1).first(); }, }, @@ -165,7 +143,7 @@ class User extends Base { }, }); - login(password: string) { + login(password) { return bcrypt.compare(password, this.password); } @@ -176,7 +154,7 @@ class User extends Base { await this.$query().patch({ resetPasswordToken, resetPasswordTokenSentAt }); } - async resetPassword(password: string) { + async resetPassword(password) { return await this.$query().patch({ resetPasswordToken: null, resetPasswordTokenSentAt: null, @@ -235,9 +213,7 @@ class User extends Base { return false; } - const expiryDate = DateTime.fromJSDate( - this.trialExpiryDate as unknown as Date - ); + const expiryDate = DateTime.fromJSDate(this.trialExpiryDate); const now = DateTime.now(); return now < expiryDate; @@ -261,7 +237,7 @@ class User extends Base { return currentUsageData.consumedTaskCount < plan.quota; } - async $beforeInsert(queryContext: QueryContext) { + async $beforeInsert(queryContext) { await super.$beforeInsert(queryContext); this.email = this.email.toLowerCase(); @@ -272,7 +248,7 @@ class User extends Base { } } - async $beforeUpdate(opt: ModelOptions, queryContext: QueryContext) { + async $beforeUpdate(opt, queryContext) { await super.$beforeUpdate(opt, queryContext); if (this.email) { @@ -282,7 +258,7 @@ class User extends Base { await this.generateHash(); } - async $afterInsert(queryContext: QueryContext) { + async $afterInsert(queryContext) { await super.$afterInsert(queryContext); if (appConfig.isCloud) { @@ -294,7 +270,7 @@ class User extends Base { } } - async $afterFind(): Promise { + async $afterFind() { if (await hasValidLicense()) return this; if (Array.isArray(this.permissions)) { @@ -313,26 +289,26 @@ class User extends Base { return this; } - get ability(): ReturnType { + get ability() { return userAbility(this); } - can(action: string, subject: string) { + can(action, subject) { const can = this.ability.can(action, subject); if (!can) throw new Error('Not authorized!'); const relevantRule = this.ability.relevantRuleFor(action, subject); - const conditions = (relevantRule?.conditions as string[]) || []; - const conditionMap: Record = Object.fromEntries( + const conditions = relevantRule?.conditions || []; + const conditionMap = Object.fromEntries( conditions.map((condition) => [condition, true]) ); return conditionMap; } - cannot(action: string, subject: string) { + cannot(action, subject) { const cannot = this.ability.cannot(action, subject); if (cannot) throw new Error('Not authorized!'); diff --git a/packages/backend/src/queues/action.js b/packages/backend/src/queues/action.js index 48173bf9..f693e9ac 100644 --- a/packages/backend/src/queues/action.js +++ b/packages/backend/src/queues/action.js @@ -1,7 +1,7 @@ import process from 'process'; import { Queue } from 'bullmq'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; const CONNECTION_REFUSED = 'ECONNREFUSED'; diff --git a/packages/backend/src/queues/delete-user.ee.js b/packages/backend/src/queues/delete-user.ee.js index e01c340f..584807a1 100644 --- a/packages/backend/src/queues/delete-user.ee.js +++ b/packages/backend/src/queues/delete-user.ee.js @@ -1,7 +1,7 @@ import process from 'process'; import { Queue } from 'bullmq'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; const CONNECTION_REFUSED = 'ECONNREFUSED'; diff --git a/packages/backend/src/queues/email.js b/packages/backend/src/queues/email.js index 223a97e7..c9da1804 100644 --- a/packages/backend/src/queues/email.js +++ b/packages/backend/src/queues/email.js @@ -1,7 +1,7 @@ import process from 'process'; import { Queue } from 'bullmq'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; const CONNECTION_REFUSED = 'ECONNREFUSED'; diff --git a/packages/backend/src/queues/flow.js b/packages/backend/src/queues/flow.js index bd977955..61fb733c 100644 --- a/packages/backend/src/queues/flow.js +++ b/packages/backend/src/queues/flow.js @@ -1,7 +1,7 @@ import process from 'process'; import { Queue } from 'bullmq'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; const CONNECTION_REFUSED = 'ECONNREFUSED'; diff --git a/packages/backend/src/queues/remove-cancelled-subscriptions.ee.js b/packages/backend/src/queues/remove-cancelled-subscriptions.ee.js index d444fd5e..20fd6d03 100644 --- a/packages/backend/src/queues/remove-cancelled-subscriptions.ee.js +++ b/packages/backend/src/queues/remove-cancelled-subscriptions.ee.js @@ -1,7 +1,7 @@ import process from 'process'; import { Queue } from 'bullmq'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; const CONNECTION_REFUSED = 'ECONNREFUSED'; diff --git a/packages/backend/src/queues/trigger.js b/packages/backend/src/queues/trigger.js index 522c0946..e816272b 100644 --- a/packages/backend/src/queues/trigger.js +++ b/packages/backend/src/queues/trigger.js @@ -1,7 +1,7 @@ import process from 'process'; import { Queue } from 'bullmq'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; const CONNECTION_REFUSED = 'ECONNREFUSED'; diff --git a/packages/backend/src/routes/index.js b/packages/backend/src/routes/index.js index 2a52de7a..8531516b 100644 --- a/packages/backend/src/routes/index.js +++ b/packages/backend/src/routes/index.js @@ -1,7 +1,7 @@ import { Router } from 'express'; -import graphQLInstance from '../helpers/graphql-instance'; -import webhooksRouter from './webhooks'; -import paddleRouter from './paddle.ee'; +import graphQLInstance from '../helpers/graphql-instance.js'; +import webhooksRouter from './webhooks.js'; +import paddleRouter from './paddle.ee.js'; const router = Router(); diff --git a/packages/backend/src/routes/paddle.ee.js b/packages/backend/src/routes/paddle.ee.js index de6e17f5..aeea6453 100644 --- a/packages/backend/src/routes/paddle.ee.js +++ b/packages/backend/src/routes/paddle.ee.js @@ -1,5 +1,5 @@ import { Router } from 'express'; -import webhooksHandler from '../controllers/paddle/webhooks.ee'; +import webhooksHandler from '../controllers/paddle/webhooks.ee.js'; const router = Router(); diff --git a/packages/backend/src/routes/webhooks.js b/packages/backend/src/routes/webhooks.js index 77889ae3..6d6898c9 100644 --- a/packages/backend/src/routes/webhooks.js +++ b/packages/backend/src/routes/webhooks.js @@ -1,9 +1,9 @@ import express, { Router } from 'express'; import multer from 'multer'; -import appConfig from '../config/app'; -import webhookHandlerByFlowId from '../controllers/webhooks/handler-by-flow-id'; -import webhookHandlerByConnectionIdAndRefValue from '../controllers/webhooks/handler-by-connection-id-and-ref-value'; +import appConfig from '../config/app.js'; +import webhookHandlerByFlowId from '../controllers/webhooks/handler-by-flow-id.js'; +import webhookHandlerByConnectionIdAndRefValue from '../controllers/webhooks/handler-by-connection-id-and-ref-value.js'; const router = Router(); const upload = multer(); diff --git a/packages/backend/src/server.js b/packages/backend/src/server.js new file mode 100644 index 00000000..6396088e --- /dev/null +++ b/packages/backend/src/server.js @@ -0,0 +1,18 @@ +import app from './app.js'; +import appConfig from './config/app.js'; +import logger from './helpers/logger.js'; +import telemetry from './helpers/telemetry/index.js'; + +telemetry.setServiceType('main'); + +const server = app.listen(appConfig.port, () => { + logger.info(`Server is listening on ${appConfig.baseUrl}`); +}); + +function shutdown(server) { + server.close(); +} + +process.on('SIGTERM', () => { + shutdown(server); +}); diff --git a/packages/backend/src/server.ts b/packages/backend/src/server.ts deleted file mode 100644 index 2d2b586a..00000000 --- a/packages/backend/src/server.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Server } from 'http'; - -import app from './app'; -import appConfig from './config/app'; -import logger from './helpers/logger'; -import telemetry from './helpers/telemetry'; - -telemetry.setServiceType('main'); - -const server: Server = app.listen(appConfig.port, () => { - logger.info(`Server is listening on ${appConfig.baseUrl}`); -}); - -function shutdown(server: Server) { - server.close(); -} - -process.on('SIGTERM', () => { - shutdown(server); -}); diff --git a/packages/backend/src/services/action.js b/packages/backend/src/services/action.js index 33c45bcf..4bc5fac1 100644 --- a/packages/backend/src/services/action.js +++ b/packages/backend/src/services/action.js @@ -1,13 +1,13 @@ -import Step from '../models/step'; -import Flow from '../models/flow'; -import Execution from '../models/execution'; -import ExecutionStep from '../models/execution-step'; -import computeParameters from '../helpers/compute-parameters'; -import globalVariable from '../helpers/global-variable'; -import { logger } from '../helpers/logger'; -import HttpError from '../errors/http'; -import EarlyExitError from '../errors/early-exit'; -import AlreadyProcessedError from '../errors/already-processed'; +import Step from '../models/step.js'; +import Flow from '../models/flow.js'; +import Execution from '../models/execution.js'; +import ExecutionStep from '../models/execution-step.js'; +import computeParameters from '../helpers/compute-parameters.js'; +import globalVariable from '../helpers/global-variable.js'; +import { logger } from '../helpers/logger.js'; +import HttpError from '../errors/http.js'; +import EarlyExitError from '../errors/early-exit.js'; +import AlreadyProcessedError from '../errors/already-processed.js'; export const processAction = async (options) => { const { flowId, stepId, executionId } = options; diff --git a/packages/backend/src/services/flow.js b/packages/backend/src/services/flow.js index 769fcd3b..e257009e 100644 --- a/packages/backend/src/services/flow.js +++ b/packages/backend/src/services/flow.js @@ -1,9 +1,9 @@ -import Flow from '../models/flow'; -import globalVariable from '../helpers/global-variable'; -import EarlyExitError from '../errors/early-exit'; -import AlreadyProcessedError from '../errors/already-processed'; -import HttpError from '../errors/http'; -import { logger } from '../helpers/logger'; +import Flow from '../models/flow.js'; +import globalVariable from '../helpers/global-variable.js'; +import EarlyExitError from '../errors/early-exit.js'; +import AlreadyProcessedError from '../errors/already-processed.js'; +import HttpError from '../errors/http.js'; +import { logger } from '../helpers/logger.js'; export const processFlow = async (options) => { const { testRun, flowId } = options; diff --git a/packages/backend/src/services/test-run.js b/packages/backend/src/services/test-run.js index dd19b4af..88023821 100644 --- a/packages/backend/src/services/test-run.js +++ b/packages/backend/src/services/test-run.js @@ -1,7 +1,7 @@ -import Step from '../models/step'; -import { processFlow } from './flow'; -import { processTrigger } from './trigger'; -import { processAction } from './action'; +import Step from '../models/step.js'; +import { processFlow } from './flow.js'; +import { processTrigger } from './trigger.js'; +import { processAction } from './action.js'; const testRun = async (options) => { const untilStep = await Step.query() diff --git a/packages/backend/src/services/trigger.js b/packages/backend/src/services/trigger.js index f9c37432..075a9fc3 100644 --- a/packages/backend/src/services/trigger.js +++ b/packages/backend/src/services/trigger.js @@ -1,7 +1,7 @@ -import Step from '../models/step'; -import Flow from '../models/flow'; -import Execution from '../models/execution'; -import globalVariable from '../helpers/global-variable'; +import Step from '../models/step.js'; +import Flow from '../models/flow.js'; +import Execution from '../models/execution.js'; +import globalVariable from '../helpers/global-variable.js'; export const processTrigger = async (options) => { const { flowId, stepId, triggerItem, error, testRun } = options; diff --git a/packages/backend/src/types/app-info.ts b/packages/backend/src/types/app-info.ts deleted file mode 100644 index 76eaa9a2..00000000 --- a/packages/backend/src/types/app-info.ts +++ /dev/null @@ -1,14 +0,0 @@ -import FieldType from './field'; -import AuthenticationStepType from './authentication-step'; - -type AppInfo = { - name: string; - key: string; - iconUrl: string; - docUrl: string; - primaryColor: string; - fields: FieldType[]; - authenticationSteps?: AuthenticationStepType[]; -}; - -export default AppInfo; diff --git a/packages/backend/src/types/authentication-step-field.ts b/packages/backend/src/types/authentication-step-field.ts deleted file mode 100644 index 49d9bb2a..00000000 --- a/packages/backend/src/types/authentication-step-field.ts +++ /dev/null @@ -1,10 +0,0 @@ -type AuthenticationStepField = { - name: string; - value: string | null; - fields?: { - name: string; - value: string | null; - }[]; -}; - -export default AuthenticationStepField; diff --git a/packages/backend/src/types/authentication-step.ts b/packages/backend/src/types/authentication-step.ts deleted file mode 100644 index fc072b97..00000000 --- a/packages/backend/src/types/authentication-step.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { IAuthenticationStepField } from '@automatisch/types'; - -type AuthenticationStep = { - step: number; - type: string; - name: string; - fields: IAuthenticationStepField[]; -}; - -export default AuthenticationStep; diff --git a/packages/backend/src/types/express/context.ts b/packages/backend/src/types/express/context.ts deleted file mode 100644 index 4c37b3ba..00000000 --- a/packages/backend/src/types/express/context.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Request } from 'express'; -import User from '../../models/user'; - -interface Context extends Request { - currentUser: User; -} - -export default Context; diff --git a/packages/backend/src/types/field.d.ts b/packages/backend/src/types/field.d.ts deleted file mode 100644 index 386dd6fc..00000000 --- a/packages/backend/src/types/field.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -type Field = { - key: string; - label: string; - type: string; - required: boolean; - readOnly: boolean; - value: string; - placeholder: string | null; - description: string; - docUrl: string; - clickToCopy: boolean; -}; - -export default Field; diff --git a/packages/backend/src/types/global.d.ts b/packages/backend/src/types/global.d.ts deleted file mode 100644 index ebe4219b..00000000 --- a/packages/backend/src/types/global.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Knex } from 'knex'; - -declare global { - declare namespace globalThis { - // eslint-disable-next-line no-var - var knexInstance: Knex; - // eslint-disable-next-line no-var - var knex: Knex.Transaction; - } -} diff --git a/packages/backend/src/types/interfaces/authentication-interface.ts b/packages/backend/src/types/interfaces/authentication-interface.ts deleted file mode 100644 index 5f93423b..00000000 --- a/packages/backend/src/types/interfaces/authentication-interface.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { IApp, IJSONObject } from '@automatisch/types'; - -export default interface AuthenticationInterface { - appData: IApp; - connectionData: IJSONObject; - client: unknown; - verifyCredentials(): Promise; - isStillVerified(): Promise; -} diff --git a/packages/backend/src/types/interfaces/index.d.ts b/packages/backend/src/types/interfaces/index.d.ts deleted file mode 100644 index e13fa839..00000000 --- a/packages/backend/src/types/interfaces/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'interfaces'; diff --git a/packages/backend/src/types/interfaces/json-object.ts b/packages/backend/src/types/interfaces/json-object.ts deleted file mode 100644 index a051165f..00000000 --- a/packages/backend/src/types/interfaces/json-object.ts +++ /dev/null @@ -1,9 +0,0 @@ -type JSONValue = string | number | boolean | JSONObject | JSONArray; - -interface JSONObject { - [x: string]: JSONValue; -} - -type JSONArray = Array; - -export default JSONObject; diff --git a/packages/backend/src/types/step.ts b/packages/backend/src/types/step.ts deleted file mode 100644 index 4eaacd26..00000000 --- a/packages/backend/src/types/step.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum StepType { - Trigger = 'trigger', - Action = 'action', -} diff --git a/packages/backend/src/worker.js b/packages/backend/src/worker.js new file mode 100644 index 00000000..988cb0cc --- /dev/null +++ b/packages/backend/src/worker.js @@ -0,0 +1,21 @@ +import * as Sentry from './helpers/sentry.ee.js'; +import appConfig from './config/app.js'; + +Sentry.init(); + +import './config/orm.js'; +import './helpers/check-worker-readiness.js'; +import './workers/flow.js'; +import './workers/trigger.js'; +import './workers/action.js'; +import './workers/email.js'; +import './workers/delete-user.ee.js'; + +if (appConfig.isCloud) { + import('./workers/remove-cancelled-subscriptions.ee.js'); + import('./queues/remove-cancelled-subscriptions.ee.js'); +} + +import telemetry from './helpers/telemetry/index.js'; + +telemetry.setServiceType('worker'); diff --git a/packages/backend/src/worker.ts b/packages/backend/src/worker.ts deleted file mode 100644 index 4de664e5..00000000 --- a/packages/backend/src/worker.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as Sentry from './helpers/sentry.ee'; -import appConfig from './config/app'; - -Sentry.init(); - -import './config/orm'; -import './helpers/check-worker-readiness'; -import './workers/flow'; -import './workers/trigger'; -import './workers/action'; -import './workers/email'; -import './workers/delete-user.ee'; - -if (appConfig.isCloud) { - import('./workers/remove-cancelled-subscriptions.ee'); - import('./queues/remove-cancelled-subscriptions.ee'); -} - -import telemetry from './helpers/telemetry'; - -telemetry.setServiceType('worker'); diff --git a/packages/backend/src/workers/action.js b/packages/backend/src/workers/action.js index d5bd1cf1..9564d9a4 100644 --- a/packages/backend/src/workers/action.js +++ b/packages/backend/src/workers/action.js @@ -1,17 +1,17 @@ import { Worker } from 'bullmq'; import process from 'node:process'; -import * as Sentry from '../helpers/sentry.ee'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; -import Step from '../models/step'; -import actionQueue from '../queues/action'; -import { processAction } from '../services/action'; +import * as Sentry from '../helpers/sentry.ee.js'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; +import Step from '../models/step.js'; +import actionQueue from '../queues/action.js'; +import { processAction } from '../services/action.js'; import { REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from '../helpers/remove-job-configuration'; -import delayAsMilliseconds from '../helpers/delay-as-milliseconds'; +} from '../helpers/remove-job-configuration.js'; +import delayAsMilliseconds from '../helpers/delay-as-milliseconds.js'; const DEFAULT_DELAY_DURATION = 0; diff --git a/packages/backend/src/workers/delete-user.ee.js b/packages/backend/src/workers/delete-user.ee.js index c18d3bb4..b033c183 100644 --- a/packages/backend/src/workers/delete-user.ee.js +++ b/packages/backend/src/workers/delete-user.ee.js @@ -1,12 +1,12 @@ import { Worker } from 'bullmq'; import process from 'node:process'; -import * as Sentry from '../helpers/sentry.ee'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; -import appConfig from '../config/app'; -import User from '../models/user'; -import ExecutionStep from '../models/execution-step'; +import * as Sentry from '../helpers/sentry.ee.js'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; +import appConfig from '../config/app.js'; +import User from '../models/user.js'; +import ExecutionStep from '../models/execution-step.js'; export const worker = new Worker( 'delete-user', diff --git a/packages/backend/src/workers/email.js b/packages/backend/src/workers/email.js index 1db4562d..e1297376 100644 --- a/packages/backend/src/workers/email.js +++ b/packages/backend/src/workers/email.js @@ -1,12 +1,12 @@ import { Worker } from 'bullmq'; import process from 'node:process'; -import * as Sentry from '../helpers/sentry.ee'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; -import mailer from '../helpers/mailer.ee'; -import compileEmail from '../helpers/compile-email.ee'; -import appConfig from '../config/app'; +import * as Sentry from '../helpers/sentry.ee.js'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; +import mailer from '../helpers/mailer.ee.js'; +import compileEmail from '../helpers/compile-email.ee.js'; +import appConfig from '../config/app.js'; const isCloudSandbox = () => { return appConfig.isCloud && !appConfig.isProd; diff --git a/packages/backend/src/workers/flow.js b/packages/backend/src/workers/flow.js index 22974465..b1bcce78 100644 --- a/packages/backend/src/workers/flow.js +++ b/packages/backend/src/workers/flow.js @@ -1,17 +1,17 @@ import { Worker } from 'bullmq'; import process from 'node:process'; -import * as Sentry from '../helpers/sentry.ee'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; -import flowQueue from '../queues/flow'; -import triggerQueue from '../queues/trigger'; -import { processFlow } from '../services/flow'; -import Flow from '../models/flow'; +import * as Sentry from '../helpers/sentry.ee.js'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; +import flowQueue from '../queues/flow.js'; +import triggerQueue from '../queues/trigger.js'; +import { processFlow } from '../services/flow.js'; +import Flow from '../models/flow.js'; import { REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from '../helpers/remove-job-configuration'; +} from '../helpers/remove-job-configuration.js'; export const worker = new Worker( 'flow', diff --git a/packages/backend/src/workers/remove-cancelled-subscriptions.ee.js b/packages/backend/src/workers/remove-cancelled-subscriptions.ee.js index 50df129b..7b3952bf 100644 --- a/packages/backend/src/workers/remove-cancelled-subscriptions.ee.js +++ b/packages/backend/src/workers/remove-cancelled-subscriptions.ee.js @@ -1,10 +1,10 @@ import { Worker } from 'bullmq'; import process from 'node:process'; import { DateTime } from 'luxon'; -import * as Sentry from '../helpers/sentry.ee'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; -import Subscription from '../models/subscription.ee'; +import * as Sentry from '../helpers/sentry.ee.js'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; +import Subscription from '../models/subscription.ee.js'; export const worker = new Worker( 'remove-cancelled-subscriptions', diff --git a/packages/backend/src/workers/trigger.js b/packages/backend/src/workers/trigger.js index dbe299ef..58749f75 100644 --- a/packages/backend/src/workers/trigger.js +++ b/packages/backend/src/workers/trigger.js @@ -1,16 +1,16 @@ import { Worker } from 'bullmq'; import process from 'node:process'; -import * as Sentry from '../helpers/sentry.ee'; -import redisConfig from '../config/redis'; -import logger from '../helpers/logger'; -import actionQueue from '../queues/action'; -import Step from '../models/step'; -import { processTrigger } from '../services/trigger'; +import * as Sentry from '../helpers/sentry.ee.js'; +import redisConfig from '../config/redis.js'; +import logger from '../helpers/logger.js'; +import actionQueue from '../queues/action.js'; +import Step from '../models/step.js'; +import { processTrigger } from '../services/trigger.js'; import { REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_7_DAYS_OR_50_JOBS, -} from '../helpers/remove-job-configuration'; +} from '../helpers/remove-job-configuration.js'; export const worker = new Worker( 'trigger', diff --git a/packages/backend/test/factories/config.ts b/packages/backend/test/factories/config.js similarity index 61% rename from packages/backend/test/factories/config.ts rename to packages/backend/test/factories/config.js index 0f709492..fe21d765 100644 --- a/packages/backend/test/factories/config.ts +++ b/packages/backend/test/factories/config.js @@ -1,12 +1,6 @@ -import { IJSONObject } from '@automatisch/types'; import { faker } from '@faker-js/faker'; -type ConfigParams = { - key?: string; - value?: IJSONObject; -}; - -export const createConfig = async (params: ConfigParams = {}) => { +export const createConfig = async (params = {}) => { const configData = { key: params?.key || faker.lorem.word(), value: params?.value || { data: 'sampleConfig' }, diff --git a/packages/backend/test/factories/connection.ts b/packages/backend/test/factories/connection.js similarity index 80% rename from packages/backend/test/factories/connection.ts rename to packages/backend/test/factories/connection.js index 13f081f3..aff7abff 100644 --- a/packages/backend/test/factories/connection.ts +++ b/packages/backend/test/factories/connection.js @@ -1,8 +1,7 @@ -import Connection from '../../src/models/connection'; import appConfig from '../../src/config/app'; import { AES } from 'crypto-js'; -export const createConnection = async (params: Partial = {}) => { +export const createConnection = async (params = {}) => { params.key = params?.key || 'deepl'; const formattedData = params.formattedData || { diff --git a/packages/backend/test/factories/execution-step.ts b/packages/backend/test/factories/execution-step.js similarity index 78% rename from packages/backend/test/factories/execution-step.ts rename to packages/backend/test/factories/execution-step.js index b1d2cb9a..01b9daa5 100644 --- a/packages/backend/test/factories/execution-step.ts +++ b/packages/backend/test/factories/execution-step.js @@ -1,10 +1,7 @@ -import ExecutionStep from '../../src/models/execution-step'; import { createExecution } from './execution'; import { createStep } from './step'; -export const createExecutionStep = async ( - params: Partial = {} -) => { +export const createExecutionStep = async (params = {}) => { params.executionId = params?.executionId || (await createExecution()).id; params.stepId = params?.stepId || (await createStep()).id; params.status = params?.status || 'success'; diff --git a/packages/backend/test/factories/execution.ts b/packages/backend/test/factories/execution.js similarity index 76% rename from packages/backend/test/factories/execution.ts rename to packages/backend/test/factories/execution.js index 34b45fa0..67ea6340 100644 --- a/packages/backend/test/factories/execution.ts +++ b/packages/backend/test/factories/execution.js @@ -1,7 +1,6 @@ -import Execution from '../../src/models/execution'; import { createFlow } from './flow'; -export const createExecution = async (params: Partial = {}) => { +export const createExecution = async (params = {}) => { params.flowId = params?.flowId || (await createFlow()).id; params.testRun = params?.testRun || false; params.createdAt = params?.createdAt || new Date().toISOString(); diff --git a/packages/backend/test/factories/flow.ts b/packages/backend/test/factories/flow.js similarity index 78% rename from packages/backend/test/factories/flow.ts rename to packages/backend/test/factories/flow.js index b43a2b62..09cebbbd 100644 --- a/packages/backend/test/factories/flow.ts +++ b/packages/backend/test/factories/flow.js @@ -1,7 +1,6 @@ -import Flow from '../../src/models/flow'; import { createUser } from './user'; -export const createFlow = async (params: Partial = {}) => { +export const createFlow = async (params = {}) => { params.userId = params?.userId || (await createUser()).id; params.name = params?.name || 'Name your flow!'; params.createdAt = params?.createdAt || new Date().toISOString(); diff --git a/packages/backend/test/factories/permission.ts b/packages/backend/test/factories/permission.js similarity index 74% rename from packages/backend/test/factories/permission.ts rename to packages/backend/test/factories/permission.js index aae670ea..bc604adf 100644 --- a/packages/backend/test/factories/permission.ts +++ b/packages/backend/test/factories/permission.js @@ -1,7 +1,6 @@ -import Permission from '../../src/models/permission'; import { createRole } from './role'; -export const createPermission = async (params: Partial = {}) => { +export const createPermission = async (params = {}) => { params.roleId = params?.roleId || (await createRole()).id; params.action = params?.action || 'read'; params.subject = params?.subject || 'User'; diff --git a/packages/backend/test/factories/role.js b/packages/backend/test/factories/role.js new file mode 100644 index 00000000..f2ed88bc --- /dev/null +++ b/packages/backend/test/factories/role.js @@ -0,0 +1,8 @@ +export const createRole = async (params = {}) => { + params.name = params?.name || 'Viewer'; + params.key = params?.key || 'viewer'; + + const [role] = await global.knex.table('roles').insert(params).returning('*'); + + return role; +}; diff --git a/packages/backend/test/factories/role.ts b/packages/backend/test/factories/role.ts deleted file mode 100644 index ef45291a..00000000 --- a/packages/backend/test/factories/role.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IRole } from '@automatisch/types'; - -type RoleParams = { - name?: string; - key?: string; -}; - -export const createRole = async (params: RoleParams = {}): Promise => { - params.name = params?.name || 'Viewer'; - params.key = params?.key || 'viewer'; - - const [role] = await knex.table('roles').insert(params).returning('*'); - - return role; -}; diff --git a/packages/backend/test/factories/step.ts b/packages/backend/test/factories/step.js similarity index 85% rename from packages/backend/test/factories/step.ts rename to packages/backend/test/factories/step.js index f26d8f7c..9fb0ec84 100644 --- a/packages/backend/test/factories/step.ts +++ b/packages/backend/test/factories/step.js @@ -1,7 +1,6 @@ -import Step from '../../src/models/step'; import { createFlow } from './flow'; -export const createStep = async (params: Partial = {}) => { +export const createStep = async (params = {}) => { params.flowId = params?.flowId || (await createFlow()).id; params.type = params?.type || 'action'; diff --git a/packages/backend/test/factories/user.ts b/packages/backend/test/factories/user.js similarity index 79% rename from packages/backend/test/factories/user.ts rename to packages/backend/test/factories/user.js index 4a057fa8..6ae60d36 100644 --- a/packages/backend/test/factories/user.ts +++ b/packages/backend/test/factories/user.js @@ -1,8 +1,7 @@ import { createRole } from './role'; import { faker } from '@faker-js/faker'; -import User from '../../src/models/user'; -export const createUser = async (params: Partial = {}) => { +export const createUser = async (params = {}) => { params.roleId = params?.roleId || (await createRole()).id; params.fullName = params?.fullName || faker.person.fullName(); params.email = params?.email || faker.internet.email(); diff --git a/packages/backend/test/setup/check-env-file.ts b/packages/backend/test/setup/check-env-file.js similarity index 74% rename from packages/backend/test/setup/check-env-file.ts rename to packages/backend/test/setup/check-env-file.js index 4fb6839c..1250a63b 100644 --- a/packages/backend/test/setup/check-env-file.ts +++ b/packages/backend/test/setup/check-env-file.js @@ -1,6 +1,8 @@ import path from 'path'; import fs from 'fs'; +import { fileURLToPath } from 'url'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const testEnvFile = path.resolve(__dirname, '../../.env.test'); if (!fs.existsSync(testEnvFile)) { diff --git a/packages/backend/test/setup/global-hooks.ts b/packages/backend/test/setup/global-hooks.js similarity index 80% rename from packages/backend/test/setup/global-hooks.ts rename to packages/backend/test/setup/global-hooks.js index efc8305b..e20adce2 100644 --- a/packages/backend/test/setup/global-hooks.ts +++ b/packages/backend/test/setup/global-hooks.js @@ -1,6 +1,6 @@ import { Model } from 'objection'; -import { client as knex } from '../../src/config/database'; -import logger from '../../src/helpers/logger'; +import { client as knex } from '../../src/config/database.js'; +import logger from '../../src/helpers/logger.js'; global.beforeAll(async () => { global.knex = null; @@ -22,8 +22,8 @@ global.afterEach(async () => { await global.knex.rollback(); Model.knex(knex); - jest.restoreAllMocks(); - jest.clearAllMocks(); + // jest.restoreAllMocks(); + // jest.clearAllMocks(); }); global.afterAll(async () => { diff --git a/packages/backend/test/setup/global-teardown.ts b/packages/backend/test/setup/global-teardown.ts deleted file mode 100644 index 0484a1a3..00000000 --- a/packages/backend/test/setup/global-teardown.ts +++ /dev/null @@ -1,5 +0,0 @@ -const exitProcess = (): void => { - process.exit(0); -}; - -export default exitProcess; diff --git a/packages/backend/test/setup/prepare-test-env.ts b/packages/backend/test/setup/prepare-test-env.js similarity index 59% rename from packages/backend/test/setup/prepare-test-env.ts rename to packages/backend/test/setup/prepare-test-env.js index 786ee483..0fc0b9ed 100644 --- a/packages/backend/test/setup/prepare-test-env.ts +++ b/packages/backend/test/setup/prepare-test-env.js @@ -1,8 +1,8 @@ -import './check-env-file'; -import { createDatabaseAndUser } from '../../bin/database/utils'; -import { client as knex } from '../../src/config/database'; -import logger from '../../src/helpers/logger'; -import appConfig from '../../src/config/app'; +import './check-env-file.js'; +import { createDatabaseAndUser } from '../../bin/database/utils.js'; +import { client as knex } from '../../src/config/database.js'; +import logger from '../../src/helpers/logger.js'; +import appConfig from '../../src/config/app.js'; const createAndMigrateDatabase = async () => { if (!appConfig.CI) { diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json deleted file mode 100644 index a4370290..00000000 --- a/packages/backend/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "declaration": true, - "allowJs": true, - "esModuleInterop": true, - "lib": ["es2021"], - "module": "commonjs", - "moduleResolution": "node", - "noImplicitAny": false, - "outDir": "dist", - "paths": { - "*": ["../../node_modules/*", "node_modules/*", "src/types/*"] - }, - "skipLibCheck": true, - "sourceMap": true, - "target": "es2021", - "typeRoots": [ - "node_modules/@types", - "node_modules/@automatisch/types", - "./src/types", - "./src/apps" - ] - }, - "include": ["src/**/*", "bin/**/*"] -} diff --git a/packages/backend/vitest.config.js b/packages/backend/vitest.config.js new file mode 100644 index 00000000..5f4ed961 --- /dev/null +++ b/packages/backend/vitest.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'node', + setupFiles: ['./test/setup/global-hooks.js'], + globals: true, + }, +}); diff --git a/packages/backend/worker.d.ts b/packages/backend/worker.d.ts deleted file mode 100644 index 980540e4..00000000 --- a/packages/backend/worker.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist/src/worker'; diff --git a/packages/backend/worker.js b/packages/backend/worker.js deleted file mode 100644 index 15989d5c..00000000 --- a/packages/backend/worker.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -module.exports = require('./dist/src/worker.js'); diff --git a/packages/cli/package.json b/packages/cli/package.json index 6ad2b62d..ce2ebd87 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -26,7 +26,7 @@ "scripts": { "build": "shx rm -rf dist && tsc -b", "build:watch": "nodemon --watch 'src/**/*.ts' --exec 'shx rm -rf dist && tsc -b' --ext 'ts'", - "lint": "eslint . --ext .ts --ignore-path ../../.eslintignore", + "lint": "eslint . --ext .js --ignore-path ../../.eslintignore", "postpack": "shx rm -f oclif.manifest.json", "posttest": "yarn lint", "prepack": "yarn build && oclif manifest && oclif readme", diff --git a/packages/cli/src/commands/start-worker.ts b/packages/cli/src/commands/start-worker.js similarity index 90% rename from packages/cli/src/commands/start-worker.ts rename to packages/cli/src/commands/start-worker.js index a33061da..14f644f7 100644 --- a/packages/cli/src/commands/start-worker.ts +++ b/packages/cli/src/commands/start-worker.js @@ -1,6 +1,7 @@ import { readFileSync } from 'fs'; import { Command, Flags } from '@oclif/core'; import * as dotenv from 'dotenv'; +import process from 'process'; export default class StartWorker extends Command { static description = 'Run automatisch worker'; @@ -13,7 +14,7 @@ export default class StartWorker extends Command { 'env-file': Flags.string(), }; - async prepareEnvVars(): Promise { + async prepareEnvVars() { const { flags } = await this.parse(StartWorker); if (flags['env-file']) { @@ -37,11 +38,11 @@ export default class StartWorker extends Command { delete process.env.SERVE_WEB_APP_SEPARATELY; } - async runWorker(): Promise { + async runWorker() { await import('@automatisch/backend/worker'); } - async run(): Promise { + async run() { await this.prepareEnvVars(); await this.runWorker(); diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.js similarity index 90% rename from packages/cli/src/commands/start.ts rename to packages/cli/src/commands/start.js index 44c4b09a..577bd309 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.js @@ -1,6 +1,7 @@ import { readFileSync } from 'fs'; import { Command, Flags } from '@oclif/core'; import * as dotenv from 'dotenv'; +import process from 'process'; export default class Start extends Command { static description = 'Run automatisch'; @@ -17,7 +18,7 @@ export default class Start extends Command { return process.env.APP_ENV === 'production'; } - async prepareEnvVars(): Promise { + async prepareEnvVars() { const { flags } = await this.parse(Start); if (flags['env-file']) { @@ -41,7 +42,7 @@ export default class Start extends Command { delete process.env.SERVE_WEB_APP_SEPARATELY; } - async createDatabaseAndUser(): Promise { + async createDatabaseAndUser() { const utils = await import('@automatisch/backend/database-utils'); await utils.createDatabaseAndUser( @@ -50,7 +51,7 @@ export default class Start extends Command { ); } - async runMigrationsIfNeeded(): Promise { + async runMigrationsIfNeeded() { const { logger } = await import('@automatisch/backend/logger'); const database = await import('@automatisch/backend/database'); const migrator = database.client.migrate; @@ -69,17 +70,17 @@ export default class Start extends Command { } } - async seedUser(): Promise { + async seedUser() { const utils = await import('@automatisch/backend/database-utils'); await utils.createUser(); } - async runApp(): Promise { + async runApp() { await import('@automatisch/backend/server'); } - async run(): Promise { + async run() { await this.prepareEnvVars(); if (!this.isProduction) { diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.js similarity index 100% rename from packages/cli/src/index.ts rename to packages/cli/src/index.js diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 61195f40..61ccc6b3 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -1,11 +1,13 @@ { "compilerOptions": { "declaration": true, + "allowJs": true, "esModuleInterop": true, "importHelpers": true, "lib": ["es2021"], "module": "commonjs", "moduleResolution": "node", + "noImplicitAny": false, "outDir": "dist", "rootDir": "src", "skipLibCheck": true, diff --git a/yarn.lock b/yarn.lock index 6ed7c31f..c1c5c1c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -125,14 +125,6 @@ "@algolia/logger-common" "4.12.0" "@algolia/requester-common" "4.12.0" -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@apideck/better-ajv-errors@^0.3.1": version "0.3.2" resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz" @@ -185,24 +177,11 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz" integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== -"@babel/compat-data@^7.22.9": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== - "@babel/core@^7.1.0", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.8.0": version "7.16.7" resolved "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz" @@ -245,27 +224,6 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.11.6": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - "@babel/eslint-parser@^7.12.16": version "7.17.0" resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz" @@ -293,16 +251,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" @@ -328,17 +276,6 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - "@babel/helper-create-class-features-plugin@^7.16.10": version "7.16.10" resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz" @@ -394,11 +331,6 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" @@ -415,14 +347,6 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz" @@ -437,13 +361,6 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-member-expression-to-functions@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz" @@ -458,13 +375,6 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - "@babel/helper-module-transforms@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz" @@ -479,17 +389,6 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" @@ -502,11 +401,6 @@ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" @@ -534,13 +428,6 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" @@ -555,38 +442,16 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== - "@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" @@ -606,15 +471,6 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - "@babel/highlight@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz" @@ -624,15 +480,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz" @@ -648,11 +495,6 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz" integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz" @@ -891,13 +733,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -1524,15 +1359,6 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz" @@ -1565,22 +1391,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - "@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.16.8" resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz" @@ -1589,15 +1399,6 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" @@ -1837,16 +1638,131 @@ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== +"@esbuild/aix-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" + integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== + +"@esbuild/android-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" + integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== + "@esbuild/android-arm@0.15.11": version "0.15.11" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.11.tgz#bdd9c3e098183bdca97075aa4c3e0152ed3e10ee" integrity sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA== +"@esbuild/android-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" + integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== + +"@esbuild/android-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" + integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== + +"@esbuild/darwin-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" + integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== + +"@esbuild/darwin-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" + integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== + +"@esbuild/freebsd-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" + integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== + +"@esbuild/freebsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" + integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== + +"@esbuild/linux-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" + integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== + +"@esbuild/linux-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" + integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== + +"@esbuild/linux-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" + integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== + "@esbuild/linux-loong64@0.15.11": version "0.15.11" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.11.tgz#2f4f9a1083dcb4fc65233b6f59003c406abf32e5" integrity sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw== +"@esbuild/linux-loong64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" + integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== + +"@esbuild/linux-mips64el@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" + integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== + +"@esbuild/linux-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" + integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== + +"@esbuild/linux-riscv64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" + integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== + +"@esbuild/linux-s390x@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" + integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== + +"@esbuild/linux-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" + integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== + +"@esbuild/netbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" + integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== + +"@esbuild/openbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" + integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== + +"@esbuild/sunos-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" + integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== + +"@esbuild/win32-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" + integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== + +"@esbuild/win32-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" + integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== + +"@esbuild/win32-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" + integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== + "@eslint/eslintrc@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz" @@ -1877,11 +1793,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@faker-js/faker@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.1.0.tgz#e14896f1c57af2495e341dc4c7bf04125c8aeafd" - integrity sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ== - "@faker-js/faker@^8.2.0": version "8.2.0" resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.2.0.tgz#d4656d2cb485fe6ec4e7b340da9f16fac2c36c4a" @@ -2107,18 +2018,6 @@ jest-util "^27.4.2" slash "^3.0.0" -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - "@jest/core@^27.4.7": version "27.4.7" resolved "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz" @@ -2153,40 +2052,6 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - "@jest/environment@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz" @@ -2197,31 +2062,6 @@ "@types/node" "*" jest-mock "^27.4.6" -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - "@jest/fake-timers@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz" @@ -2234,18 +2074,6 @@ jest-mock "^27.4.6" jest-util "^27.4.2" -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - "@jest/globals@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz" @@ -2255,16 +2083,6 @@ "@jest/types" "^27.4.2" expect "^27.4.6" -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - "@jest/reporters@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz" @@ -2296,36 +2114,6 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -2342,15 +2130,6 @@ graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - "@jest/test-result@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz" @@ -2361,16 +2140,6 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - "@jest/test-sequencer@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz" @@ -2381,16 +2150,6 @@ jest-haste-map "^27.4.6" jest-runtime "^27.4.6" -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - "@jest/transform@^27.4.6": version "27.4.6" resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz" @@ -2412,27 +2171,6 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" @@ -2455,18 +2193,6 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jridgewell/gen-mapping@^0.3.0": version "0.3.2" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" @@ -2476,15 +2202,6 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/resolve-uri@^3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" @@ -2508,13 +2225,10 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.9": version "0.3.19" @@ -3831,6 +3545,71 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@rollup/rollup-android-arm-eabi@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz#b1094962742c1a0349587040bc06185e2a667c9b" + integrity sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA== + +"@rollup/rollup-android-arm64@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz#96eb86fb549e05b187f2ad06f51d191a23cb385a" + integrity sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA== + +"@rollup/rollup-darwin-arm64@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz#2456630c007cc5905cb368acb9ff9fc04b2d37be" + integrity sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA== + +"@rollup/rollup-darwin-x64@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz#97742214fc7dfd47a0f74efba6f5ae264e29c70c" + integrity sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA== + +"@rollup/rollup-linux-arm-gnueabihf@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz#cd933e61d6f689c9cdefde424beafbd92cfe58e2" + integrity sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw== + +"@rollup/rollup-linux-arm64-gnu@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz#33b09bf462f1837afc1e02a1b352af6b510c78a6" + integrity sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg== + +"@rollup/rollup-linux-arm64-musl@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz#50257fb248832c2308064e3764a16273b6ee4615" + integrity sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A== + +"@rollup/rollup-linux-riscv64-gnu@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz#09589e4e1a073cf56f6249b77eb6c9a8e9b613a8" + integrity sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A== + +"@rollup/rollup-linux-x64-gnu@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz#bd312bb5b5f02e54d15488605d15cfd3f90dda7c" + integrity sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw== + +"@rollup/rollup-linux-x64-musl@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz#25b3bede85d86438ce28cc642842d10d867d40e9" + integrity sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ== + +"@rollup/rollup-win32-arm64-msvc@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz#95957067eb107f571da1d81939f017d37b4958d3" + integrity sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ== + +"@rollup/rollup-win32-ia32-msvc@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz#71b6facad976db527863f698692c6964c0b6e10e" + integrity sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ== + +"@rollup/rollup-win32-x64-msvc@4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz#16295ccae354707c9bc6842906bdeaad4f3ba7a5" + integrity sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw== + "@rudderstack/rudder-sdk-node@^1.1.2": version "1.1.2" resolved "https://registry.npmjs.org/@rudderstack/rudder-sdk-node/-/rudder-sdk-node-1.1.2.tgz" @@ -3917,34 +3696,13 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": +"@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.2": - version "7.1.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers@^8.0.1": version "8.1.0" resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" @@ -3952,20 +3710,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/samsam@^6.0.2": - version "6.0.2" - resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz" - integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== - "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" @@ -4165,11 +3909,6 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@types/accounting@^0.4.2": - version "0.4.2" - resolved "https://registry.npmjs.org/@types/accounting/-/accounting-0.4.2.tgz" - integrity sha512-M8W6tsLZguGdRaSQMmg58PUM/5HgoDuBGVyMiYNGi0FZkLzJDjUBGGYRYj1J9OWELCTqfux+ogVyKObCzfWJgg== - "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" @@ -4213,13 +3952,6 @@ resolved "https://registry.npmjs.org/@types/base16/-/base16-1.0.2.tgz" integrity sha512-oYO/U4VD1DavwrKuCSQWdLG+5K22SLPem2OQaHmFcQuwHoVeGC+JGVRji2MUqZUAIQZHEonOeVfAX09hYiLsdg== -"@types/bcrypt@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz" - integrity sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw== - dependencies: - "@types/node" "*" - "@types/body-parser@*": version "1.19.2" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" @@ -4235,14 +3967,6 @@ dependencies: "@types/node" "*" -"@types/bull@^3.15.8": - version "3.15.8" - resolved "https://registry.npmjs.org/@types/bull/-/bull-3.15.8.tgz" - integrity sha512-8DbSPMSsZH5PWPnGEkAZLYgJEH4ghHJNKF7LB6Wr5R0/v6g+Vs+JoaA7kcvLtHE936xg2WpFPkaoaJgExOmKDw== - dependencies: - "@types/ioredis" "*" - "@types/redis" "^2.8.0" - "@types/chai@*": version "4.3.0" resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz" @@ -4263,21 +3987,6 @@ dependencies: "@types/node" "*" -"@types/cookiejar@*": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.3.tgz#c54976fb8f3a32ea8da844f59f0374dd39656e13" - integrity sha512-LZ8SD3LpNmLMDLkG2oCBjZg+ETnx6XdCjydUE0HwojDmnDfDUnhMKKbtth1TZh+hzcqb03azrYWoXLS8sMXdqg== - -"@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/crypto-js@^4.0.2": - version "4.1.0" - resolved "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.0.tgz" - integrity sha512-DCFfy/vh2lG6qHSGezQ+Sn2Ulf/1Mx51dqOdmOKyW5nMK3maLlxeS3onC7r212OnBM2pBR95HkAmAjjF08YkxQ== - "@types/debug@^4.1.7": version "4.1.8" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz" @@ -4319,6 +4028,11 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/estree@^0.0.51": version "0.0.51" resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" @@ -4338,15 +4052,6 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express-serve-static-core@^4.17.31": - version "4.17.31" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/express-serve-static-core@^4.17.33": version "4.17.35" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" @@ -4377,16 +4082,6 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/express@^4.17.15": - version "4.17.15" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz" - integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.31" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" @@ -4402,13 +4097,6 @@ dependencies: "@types/node" "*" -"@types/graceful-fs@^4.1.3": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" - integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== - dependencies: - "@types/node" "*" - "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" @@ -4422,11 +4110,6 @@ resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/http-errors@^1.8.1": - version "1.8.2" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz" - integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== - "@types/http-proxy@^1.17.5": version "1.17.8" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz" @@ -4434,13 +4117,6 @@ dependencies: "@types/node" "*" -"@types/ioredis@*": - version "4.28.10" - resolved "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz" - integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== - dependencies: - "@types/node" "*" - "@types/is-hotkey@^0.1.1": version "0.1.7" resolved "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.7.tgz" @@ -4481,14 +4157,6 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/jest@^29.5.5": - version "29.5.6" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" - integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" @@ -4499,20 +4167,6 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/jsonwebtoken@^8.5.8": - version "8.5.8" - resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz" - integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== - dependencies: - "@types/node" "*" - -"@types/lodash.get@^4.4.6": - version "4.4.6" - resolved "https://registry.npmjs.org/@types/lodash.get/-/lodash.get-4.4.6.tgz" - integrity sha512-E6zzjR3GtNig8UJG/yodBeJeIOtgPkMgsLjDU3CbgCAPC++vJ0eCMnJhVpRZb/ENqEFlov1+3K9TKtY4UdWKtQ== - dependencies: - "@types/lodash" "*" - "@types/lodash@*", "@types/lodash@^4.14.149": version "4.14.178" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz" @@ -4533,16 +4187,6 @@ resolved "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.9.tgz" integrity sha512-ZuzIc7aN+i2ZDMWIiSmMdubR9EMMSTdEzF6R+FckP4p6xdnOYKqknTo/k+xXQvciSXlNGIwA4OPU5X7JIFzYdA== -"@types/luxon@^2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.1.tgz" - integrity sha512-nAPUltOT28fal2eDZz8yyzNhBjHw1NEymFBP7Q9iCShqpflWPybxHbD7pw/46jQmT+HXOy1QN5hNTms8MOTlOQ== - -"@types/memory-cache@^0.2.2": - version "0.2.2" - resolved "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.2.tgz" - integrity sha512-xNnm6EkmYYhTnLiOHC2bdKgcYY5qjjrq5vl9KXD2nh0em0koZoFS500EL4Q4V/eW+A3P7NC7P7GIYzNOSQp7jQ== - "@types/mime@^1": version "1.3.2" resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" @@ -4558,25 +4202,11 @@ resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/morgan@^1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz" - integrity sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q== - dependencies: - "@types/node" "*" - "@types/ms@*": version "0.7.31" resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/multer@1.4.7": - version "1.4.7" - resolved "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz" - integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== - dependencies: - "@types/express" "*" - "@types/node@*": version "17.0.10" resolved "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz" @@ -4597,11 +4227,6 @@ resolved "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz" integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== -"@types/node@^16.10.2": - version "16.11.21" - resolved "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz" - integrity sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A== - "@types/node@^16.9.4": version "16.11.26" resolved "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz" @@ -4612,13 +4237,6 @@ resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/nodemailer@^6.4.4": - version "6.4.4" - resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz" - integrity sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw== - dependencies: - "@types/node" "*" - "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" @@ -4637,34 +4255,13 @@ "@types/express" "*" "@types/passport" "*" -"@types/passport@*", "@types/passport@^1.0.11", "@types/passport@^1.0.12": +"@types/passport@*", "@types/passport@^1.0.11": version "1.0.12" resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz" integrity sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw== dependencies: "@types/express" "*" -"@types/pg@^8.6.1": - version "8.6.4" - resolved "https://registry.npmjs.org/@types/pg/-/pg-8.6.4.tgz" - integrity sha512-uYA7UMVzDFpJobCrqwW/iWkFmvizy6knIUgr0Quaw7K1Le3ZnF7hI3bKqFoxPZ+fju1Sc7zdTvOl9YfFZPcmeA== - dependencies: - "@types/node" "*" - pg-protocol "*" - pg-types "^2.2.0" - -"@types/pino@^7.0.5": - version "7.0.5" - resolved "https://registry.npmjs.org/@types/pino/-/pino-7.0.5.tgz" - integrity sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg== - dependencies: - pino "*" - -"@types/pluralize@^0.0.30": - version "0.0.30" - resolved "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.30.tgz" - integrity sha512-kVww6xZrW/db5BR9OqiT71J9huRdQ+z/r+LbDuT7/EK50mCmj5FoaIARnVv0rvjUS/YpDox0cDU9lpQT011VBA== - "@types/prettier@^2.1.5": version "2.4.3" resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz" @@ -4732,13 +4329,6 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/redis@^2.8.0": - version "2.8.32" - resolved "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz" - integrity sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w== - dependencies: - "@types/node" "*" - "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" @@ -4786,11 +4376,6 @@ "@types/mime" "^1" "@types/node" "*" -"@types/showdown@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.1.tgz" - integrity sha512-xdnAw2nFqomkaL0QdtEk0t7yz26UkaVPl4v1pYJvtE1T0fmfQEH3JaxErEhGByEAl3zUZrkNBlneuJp0WJGqEA== - "@types/sinon@*": version "10.0.11" resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz" @@ -4815,31 +4400,6 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/strip-bom@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= - -"@types/strip-json-comments@0.0.30": - version "0.0.30" - resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" - integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== - -"@types/superagent@*": - version "4.1.20" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.20.tgz#9248f55ac588794568f02fe9cac6d6ff2650b660" - integrity sha512-GfpwJgYSr3yO+nArFkmyqv3i0vZavyEG5xPd/o95RwpKYpsOKJYI5XLdxLpdRbZI3YiGKKdIOFIf/jlP7A0Jxg== - dependencies: - "@types/cookiejar" "*" - "@types/node" "*" - -"@types/supertest@^2.0.14": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.15.tgz#3d032865048c84c6a3bbbf1f949145b917d2ff65" - integrity sha512-jUCZZ/TMcpGzoSaed9Gjr8HCf3HehExdibyw3OHHEL1als1KmyzcOZZH4MjbObI8TkWsEr7bc7gsW0WTDni+qQ== - dependencies: - "@types/superagent" "*" - "@types/testing-library__jest-dom@^5.9.1": version "5.14.2" resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz" @@ -4899,13 +4459,6 @@ dependencies: "@types/node" "*" -"@types/xmlrpc@^1.3.7": - version "1.3.7" - resolved "https://registry.npmjs.org/@types/xmlrpc/-/xmlrpc-1.3.7.tgz" - integrity sha512-T+jYEZz/dJvI40dkqx/FNNkyyWDyOb0HgQDpni48r4NyB8n7xjKFDACi8O3NkAWz5cLWEmKRzWfzCEZ5EB6CVg== - dependencies: - "@types/node" "*" - "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" @@ -4925,13 +4478,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.8": - version "17.0.29" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" - integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== - dependencies: - "@types/yargs-parser" "*" - "@types/yup@0.29.11": version "0.29.11" resolved "https://registry.npmjs.org/@types/yup/-/yup-0.29.11.tgz" @@ -5132,6 +4678,50 @@ resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.2.tgz" integrity sha512-3zxKNlvA3oNaKDYX0NBclgxTQ1xaFdL7PzwF6zj9tGFziKwmBa3Q/6XcJQxudlT81WxDjEhHmevvIC4Orc1LhQ== +"@vitest/expect@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.1.3.tgz#9667719dffa82e7350dcca7b95f9ec30426d037e" + integrity sha512-MnJqsKc1Ko04lksF9XoRJza0bGGwTtqfbyrsYv5on4rcEkdo+QgUdITenBQBUltKzdxW7K3rWh+nXRULwsdaVg== + dependencies: + "@vitest/spy" "1.1.3" + "@vitest/utils" "1.1.3" + chai "^4.3.10" + +"@vitest/runner@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.1.3.tgz#c71e0ab6aad0a6a75c804e060c295852dc052beb" + integrity sha512-Va2XbWMnhSdDEh/OFxyUltgQuuDRxnarK1hW5QNN4URpQrqq6jtt8cfww/pQQ4i0LjoYxh/3bYWvDFlR9tU73g== + dependencies: + "@vitest/utils" "1.1.3" + p-limit "^5.0.0" + pathe "^1.1.1" + +"@vitest/snapshot@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.1.3.tgz#94f321f80c9fb9e10b83dabb83a0d09f034a74b0" + integrity sha512-U0r8pRXsLAdxSVAyGNcqOU2H3Z4Y2dAAGGelL50O0QRMdi1WWeYHdrH/QWpN1e8juWfVKsb8B+pyJwTC+4Gy9w== + dependencies: + magic-string "^0.30.5" + pathe "^1.1.1" + pretty-format "^29.7.0" + +"@vitest/spy@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.1.3.tgz#244e4e049cd0a5b126a475af327df8b7ffa6b3b5" + integrity sha512-Ec0qWyGS5LhATFQtldvChPTAHv08yHIOZfiNcjwRQbFPHpkih0md9KAbs7TfeIfL7OFKoe7B/6ukBTqByubXkQ== + dependencies: + tinyspy "^2.2.0" + +"@vitest/utils@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.1.3.tgz#1f82122f916b0b6feb5e85fc854cfa1fbd522b55" + integrity sha512-Dyt3UMcdElTll2H75vhxfpZu03uFpXRCHxWnzcrFjZxT1kTbq8ALUYIeBgGolo1gldVdI0YSlQRacsqxTwNqwg== + dependencies: + diff-sequences "^29.6.3" + estree-walker "^3.0.3" + loupe "^2.3.7" + pretty-format "^29.7.0" + "@vue/compiler-core@3.2.37": version "3.2.37" resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz" @@ -5569,11 +5159,21 @@ acorn-walk@^8.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== +acorn-walk@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + acorn@^7.0.0, acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.10.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: version "8.7.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" @@ -5962,6 +5562,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" @@ -5999,11 +5604,6 @@ atob@^2.1.2: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - autoprefixer@^10.4.2: version "10.4.2" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz" @@ -6089,19 +5689,6 @@ babel-jest@^27.4.2, babel-jest@^27.4.6: graceful-fs "^4.2.4" slash "^3.0.0" -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - babel-loader@^8.2.3: version "8.2.3" resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz" @@ -6140,16 +5727,6 @@ babel-plugin-jest-hoist@^27.4.0: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - babel-plugin-macros@^2.6.1: version "2.8.0" resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz" @@ -6228,14 +5805,6 @@ babel-preset-jest@^27.4.0: babel-plugin-jest-hoist "^27.4.0" babel-preset-current-node-syntax "^1.0.0" -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - babel-preset-react-app@^10.0.1: version "10.0.1" resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" @@ -6464,23 +6033,6 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4 node-releases "^2.0.1" picocolors "^1.0.0" -browserslist@^4.21.9: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== - dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - bser@2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" @@ -6601,6 +6153,11 @@ bytes@3.1.2: resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0: version "15.3.0" resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" @@ -6703,11 +6260,6 @@ caniuse-lite@^1.0.30001299: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz" integrity sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA== -caniuse-lite@^1.0.30001541: - version "1.0.30001554" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz#ba80d88dff9acbc0cd4b7535fc30e0191c5e2e2a" - integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== - cardinal@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz" @@ -6726,6 +6278,19 @@ caseless@~0.12.0: resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +chai@^4.3.10: + version "4.4.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.0.tgz#f9ac79f26726a867ac9d90a9b382120479d5f55b" + integrity sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + chalk@^1.0.0: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" @@ -6782,12 +6347,19 @@ charenc@0.0.2: resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + check-types@^11.1.1: version "11.1.2" resolved "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz" integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== -chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.2: +chokidar@^3.4.2, chokidar@^3.5.2: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -6913,15 +6485,6 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz" @@ -7374,11 +6937,6 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, dependencies: safe-buffer "~5.1.1" -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" @@ -7470,19 +7028,6 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" @@ -7881,10 +7426,12 @@ dedent@^0.7.0: resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" deep-equal@^1.0.1: version "1.1.1" @@ -8302,23 +7849,6 @@ duplexer@^0.1.1, duplexer@^0.1.2: resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.0" - -dynamic-dedupe@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" - integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= - dependencies: - xtend "^4.0.0" - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" @@ -8351,16 +7881,6 @@ electron-to-chromium@^1.4.17: resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.48.tgz" integrity sha512-RT3SEmpv7XUA+tKXrZGudAWLDpa7f8qmhjcLaM6OD/ERxjQ/zAojT8/Vvo0BSzbArkElFZ1WyZ9FuwAYbkdBNA== -electron-to-chromium@^1.4.535: - version "1.4.567" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.567.tgz#c92e8fbc2bd15df3068d92571733a218a5413add" - integrity sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - emittery@^0.8.1: version "0.8.1" resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" @@ -8625,6 +8145,35 @@ esbuild@^0.15.9: esbuild-windows-64 "0.15.11" esbuild-windows-arm64 "0.15.11" +esbuild@^0.19.3: + version "0.19.11" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" + integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.11" + "@esbuild/android-arm" "0.19.11" + "@esbuild/android-arm64" "0.19.11" + "@esbuild/android-x64" "0.19.11" + "@esbuild/darwin-arm64" "0.19.11" + "@esbuild/darwin-x64" "0.19.11" + "@esbuild/freebsd-arm64" "0.19.11" + "@esbuild/freebsd-x64" "0.19.11" + "@esbuild/linux-arm" "0.19.11" + "@esbuild/linux-arm64" "0.19.11" + "@esbuild/linux-ia32" "0.19.11" + "@esbuild/linux-loong64" "0.19.11" + "@esbuild/linux-mips64el" "0.19.11" + "@esbuild/linux-ppc64" "0.19.11" + "@esbuild/linux-riscv64" "0.19.11" + "@esbuild/linux-s390x" "0.19.11" + "@esbuild/linux-x64" "0.19.11" + "@esbuild/netbsd-x64" "0.19.11" + "@esbuild/openbsd-x64" "0.19.11" + "@esbuild/sunos-x64" "0.19.11" + "@esbuild/win32-arm64" "0.19.11" + "@esbuild/win32-ia32" "0.19.11" + "@esbuild/win32-x64" "0.19.11" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -9118,6 +8667,13 @@ estree-walker@^2.0.2: resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -9186,6 +8742,21 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -9201,17 +8772,6 @@ expect@^27.4.6: jest-matcher-utils "^27.4.6" jest-message-util "^27.4.6" -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - express-basic-auth@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz" @@ -9361,7 +8921,7 @@ fast-glob@^3.0.3, fast-glob@^3.2.7, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -9378,11 +8938,6 @@ fast-levenshtein@^3.0.0: dependencies: fastest-levenshtein "^1.0.7" -fast-redact@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz" - integrity sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg== - fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" @@ -9734,6 +9289,11 @@ fsevents@2.3.2, fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -9798,6 +9358,11 @@ get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + get-intrinsic@^1.0.2: version "1.1.2" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" @@ -9870,6 +9435,11 @@ get-stream@^6.0.0: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" @@ -10502,6 +10072,11 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" @@ -11064,6 +10639,11 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" @@ -11165,17 +10745,6 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" @@ -11221,15 +10790,6 @@ jest-changed-files@^27.4.2: execa "^5.0.0" throat "^6.0.1" -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - jest-circus@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz" @@ -11255,32 +10815,6 @@ jest-circus@^27.4.6: stack-utils "^2.0.3" throat "^6.0.1" -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-cli@^27.4.7: version "27.4.7" resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz" @@ -11299,23 +10833,6 @@ jest-cli@^27.4.7: prompts "^2.0.1" yargs "^16.2.0" -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - jest-config@^27.4.7: version "27.4.7" resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz" @@ -11344,34 +10861,6 @@ jest-config@^27.4.7: pretty-format "^27.4.6" slash "^3.0.0" -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - jest-diff@^26.0.0: version "26.6.2" resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz" @@ -11392,16 +10881,6 @@ jest-diff@^27.0.0, jest-diff@^27.4.6: jest-get-type "^27.4.0" pretty-format "^27.4.6" -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - jest-docblock@^27.4.0: version "27.4.0" resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz" @@ -11409,13 +10888,6 @@ jest-docblock@^27.4.0: dependencies: detect-newline "^3.0.0" -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - jest-each@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz" @@ -11427,17 +10899,6 @@ jest-each@^27.4.6: jest-util "^27.4.2" pretty-format "^27.4.6" -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - jest-environment-jsdom@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz" @@ -11463,18 +10924,6 @@ jest-environment-node@^27.4.6: jest-mock "^27.4.6" jest-util "^27.4.2" -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz" @@ -11485,11 +10934,6 @@ jest-get-type@^27.4.0: resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz" integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - jest-haste-map@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz" @@ -11510,25 +10954,6 @@ jest-haste-map@^27.4.6: optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - jest-jasmine2@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz" @@ -11560,14 +10985,6 @@ jest-leak-detector@^27.4.6: jest-get-type "^27.4.0" pretty-format "^27.4.6" -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - jest-matcher-utils@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz" @@ -11578,16 +10995,6 @@ jest-matcher-utils@^27.4.6: jest-get-type "^27.4.0" pretty-format "^27.4.6" -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - jest-message-util@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz" @@ -11603,21 +11010,6 @@ jest-message-util@^27.4.6: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-mock@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz" @@ -11626,15 +11018,6 @@ jest-mock@^27.4.6: "@jest/types" "^27.4.2" "@types/node" "*" -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" @@ -11645,11 +11028,6 @@ jest-regex-util@^27.0.0, jest-regex-util@^27.4.0: resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz" integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - jest-resolve-dependencies@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz" @@ -11659,14 +11037,6 @@ jest-resolve-dependencies@^27.4.6: jest-regex-util "^27.4.0" jest-snapshot "^27.4.6" -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - jest-resolve@^27.4.2, jest-resolve@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz" @@ -11683,21 +11053,6 @@ jest-resolve@^27.4.2, jest-resolve@^27.4.6: resolve.exports "^1.1.0" slash "^3.0.0" -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - jest-runner@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz" @@ -11726,33 +11081,6 @@ jest-runner@^27.4.6: source-map-support "^0.5.6" throat "^6.0.1" -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - jest-runtime@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz" @@ -11781,34 +11109,6 @@ jest-runtime@^27.4.6: slash "^3.0.0" strip-bom "^4.0.0" -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - jest-serializer@^27.4.0: version "27.4.0" resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz" @@ -11845,32 +11145,6 @@ jest-snapshot@^27.4.6: pretty-format "^27.4.6" semver "^7.3.2" -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - jest-util@^27.4.2: version "27.4.2" resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz" @@ -11883,18 +11157,6 @@ jest-util@^27.4.2: graceful-fs "^4.2.4" picomatch "^2.2.3" -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - jest-validate@^27.4.6: version "27.4.6" resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz" @@ -11907,18 +11169,6 @@ jest-validate@^27.4.6: leven "^3.1.0" pretty-format "^27.4.6" -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - jest-watch-typeahead@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz" @@ -11945,20 +11195,6 @@ jest-watcher@^27.0.0, jest-watcher@^27.4.6: jest-util "^27.4.2" string-length "^4.0.1" -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" @@ -11977,16 +11213,6 @@ jest-worker@^27.0.2, jest-worker@^27.3.1, jest-worker@^27.4.1, jest-worker@^27.4 merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest@^27.4.3: version "27.4.7" resolved "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz" @@ -11996,16 +11222,6 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.4.7" -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - jmespath@0.16.0: version "0.16.0" resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz" @@ -12143,16 +11359,16 @@ json5@^2.1.2, json5@^2.2.0: dependencies: minimist "^1.2.5" -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonc-parser@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz" integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" @@ -12217,11 +11433,6 @@ just-diff@^5.0.1: resolved "https://registry.npmjs.org/just-diff/-/just-diff-5.0.1.tgz" integrity sha512-X00TokkRIDotUIf3EV4xUm6ELc/IkqhS/vPSHdWnsM5y0HoNMfEqrazizI7g78lpHvnRSRt/PFfKtRqJCOGIuQ== -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== - jwa@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" @@ -12455,6 +11666,14 @@ loader-utils@^3.2.0: resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz" integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== +local-pkg@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" + integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== + dependencies: + mlly "^1.4.2" + pkg-types "^1.0.3" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" @@ -12540,7 +11759,7 @@ lodash.isstring@^4.0.1: resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.memoize@4.x, lodash.memoize@^4.1.2: +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -12622,6 +11841,13 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^2.3.6, loupe@^2.3.7: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -12639,13 +11865,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" @@ -12690,6 +11909,13 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.4" +magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" @@ -12705,7 +11931,7 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -12952,6 +12178,11 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" @@ -13126,6 +12357,16 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mlly@^1.2.0, mlly@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e" + integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== + dependencies: + acorn "^8.10.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.3.0" + mock-stdin@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/mock-stdin/-/mock-stdin-1.0.0.tgz" @@ -13308,6 +12549,11 @@ nanoid@^3.3.6: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -13338,17 +12584,6 @@ nice-try@^1.0.4: resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz" - integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^7.0.4" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -13468,11 +12703,6 @@ node-releases@^2.0.1: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - nodemailer@6.7.0: version "6.7.0" resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.0.tgz" @@ -13703,6 +12933,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955" + integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== + dependencies: + path-key "^4.0.0" + npmlog@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" @@ -13896,11 +13133,6 @@ oclif@^2: yeoman-generator "^5.6.1" yosay "^2.0.2" -on-exit-leak-free@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz" - integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== - on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -13941,6 +13173,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@^8.0.9, open@^8.4.0: version "8.4.0" resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" @@ -14025,7 +13264,7 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-limit@3.1.0, p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@3.1.0, p-limit@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -14046,6 +13285,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" @@ -14251,7 +13497,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0, parse-json@^5.2.0: +parse-json@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -14346,6 +13592,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -14356,13 +13607,6 @@ path-to-regexp@0.1.7: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" @@ -14375,6 +13619,16 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.0, pathe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + pause@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" @@ -14400,12 +13654,12 @@ pg-pool@^3.4.1: resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz" integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== -pg-protocol@*, pg-protocol@^1.5.0: +pg-protocol@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz" integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== -pg-types@^2.1.0, pg-types@^2.2.0: +pg-types@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== @@ -14476,35 +13730,6 @@ pify@^5.0.0: resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== -pino-abstract-transport@v0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz" - integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== - dependencies: - duplexify "^4.1.2" - split2 "^4.0.0" - -pino-std-serializers@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz" - integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== - -pino@*: - version "7.8.0" - resolved "https://registry.npmjs.org/pino/-/pino-7.8.0.tgz" - integrity sha512-Ynw2HRVapiyj+ZGfUcpms+SRgDKFIy0ztaFUf3X6IHh+vsysMvn+tpV/Ej3gyutPp4n9tgH6ZkkCAelSvP5zmQ== - dependencies: - fast-redact "^3.0.0" - on-exit-leak-free "^0.2.0" - pino-abstract-transport v0.5.0 - pino-std-serializers "^4.0.0" - process-warning "^1.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.1.0" - safe-stable-stringify "^2.1.0" - sonic-boom "^2.2.1" - thread-stream "^0.13.0" - pirates@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz" @@ -14517,6 +13742,15 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" @@ -15079,6 +14313,15 @@ postcss@^8.4.18: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.32: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" @@ -15175,7 +14418,7 @@ pretty-format@^27.0.0, pretty-format@^27.4.6: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.7.0: +pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -15194,11 +14437,6 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-warning@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz" - integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz" @@ -15326,11 +14564,6 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== - q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" @@ -15392,11 +14625,6 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" @@ -15851,11 +15079,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -real-require@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz" - integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" @@ -16111,20 +15334,6 @@ resolve.exports@^1.1.0: resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.0.0, resolve@^1.10.1, resolve@^1.21.0: - version "1.22.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0: version "1.21.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz" @@ -16134,6 +15343,15 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.10.1, resolve@^1.21.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.22.1: version "1.22.1" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" @@ -16181,7 +15399,7 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@^2.6.3: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -16219,6 +15437,28 @@ rollup@^2.79.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.2.0: + version "4.9.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.4.tgz#37bc0c09ae6b4538a9c974f4d045bb64b2e7c27c" + integrity sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.9.4" + "@rollup/rollup-android-arm64" "4.9.4" + "@rollup/rollup-darwin-arm64" "4.9.4" + "@rollup/rollup-darwin-x64" "4.9.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.9.4" + "@rollup/rollup-linux-arm64-gnu" "4.9.4" + "@rollup/rollup-linux-arm64-musl" "4.9.4" + "@rollup/rollup-linux-riscv64-gnu" "4.9.4" + "@rollup/rollup-linux-x64-gnu" "4.9.4" + "@rollup/rollup-linux-x64-musl" "4.9.4" + "@rollup/rollup-win32-arm64-msvc" "4.9.4" + "@rollup/rollup-win32-ia32-msvc" "4.9.4" + "@rollup/rollup-win32-x64-msvc" "4.9.4" + fsevents "~2.3.2" + run-async@^2.0.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" @@ -16267,7 +15507,7 @@ safe-stable-stringify@^1.1.0: resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz" integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== -safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: +safe-stable-stringify@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz" integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== @@ -16393,12 +15633,12 @@ semver@7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -16588,11 +15828,21 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" @@ -16600,18 +15850,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sinon@^11.1.2: - version "11.1.2" - resolved "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz" - integrity sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw== - dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^7.1.2" - "@sinonjs/samsam" "^6.0.2" - diff "^5.0.0" - nise "^5.1.0" - supports-color "^7.2.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -16713,13 +15951,6 @@ socks@^2.3.3, socks@^2.6.1: ip "^1.1.5" smart-buffer "^4.1.0" -sonic-boom@^2.2.1: - version "2.6.0" - resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.6.0.tgz" - integrity sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg== - dependencies: - atomic-sleep "^1.0.0" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz" @@ -16761,15 +15992,7 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.12, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -16875,7 +16098,7 @@ split2@^3.0.0: dependencies: readable-stream "^3.0.0" -split2@^4.0.0, split2@^4.1.0: +split2@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz" integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== @@ -16931,6 +16154,11 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + stackframe@^1.1.1: version "1.2.0" resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz" @@ -16951,6 +16179,11 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +std-env@^3.5.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + stdout-stderr@^0.1.9: version "0.1.13" resolved "https://registry.npmjs.org/stdout-stderr/-/stdout-stderr-0.1.13.tgz" @@ -16959,11 +16192,6 @@ stdout-stderr@^0.1.9: debug "^4.1.1" strip-ansi "^6.0.0" -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" @@ -17154,6 +16382,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" @@ -17161,16 +16394,23 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-literal@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" + integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== + dependencies: + acorn "^8.10.0" + stripe@^11.13.0: version "11.13.0" resolved "https://registry.npmjs.org/stripe/-/stripe-11.13.0.tgz" @@ -17252,7 +16492,7 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -17510,13 +16750,6 @@ textextensions@^5.12.0, textextensions@^5.13.0: resolved "https://registry.npmjs.org/textextensions/-/textextensions-5.14.0.tgz" integrity sha512-4cAYwNFNYlIAHBUo7p6zw8POUvWbZor+/R0Tanv+rIhsauEyV9QSrEXL40pI+GfTQxKX8k6Tyw6CmdSDSmASrg== -thread-stream@^0.13.0: - version "0.13.2" - resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.2.tgz" - integrity sha512-woZFt0cLFkPdhsa+IGpRo1jiSouaHxMIljzTgt30CMjBWoUYbbcHqnunW5Yv+BXko9H05MVIcxMipI3Jblallw== - dependencies: - real-require "^0.1.0" - throat@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" @@ -17567,6 +16800,21 @@ tiny-warning@^1.0.3: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinybench@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e" + integrity sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg== + +tinypool@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.1.tgz#b6c4e4972ede3e3e5cda74a3da1679303d386b03" + integrity sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg== + +tinyspy@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" + integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -17700,36 +16948,6 @@ ts-invariant@^0.9.0: dependencies: tslib "^2.1.0" -ts-jest@^29.1.1: - version "29.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" - integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" - -ts-node-dev@^1.1.8: - version "1.1.8" - resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz" - integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== - dependencies: - chokidar "^3.5.1" - dynamic-dedupe "^0.3.0" - minimist "^1.2.5" - mkdirp "^1.0.4" - resolve "^1.0.0" - rimraf "^2.6.1" - source-map-support "^0.5.12" - tree-kill "^1.2.2" - ts-node "^9.0.0" - tsconfig "^7.0.0" - ts-node@^10.2.1: version "10.4.0" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz" @@ -17748,18 +16966,6 @@ ts-node@^10.2.1: make-error "^1.1.1" yn "3.1.1" -ts-node@^9.0.0: - version "9.1.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" - integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== - dependencies: - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - tsconfig-paths@^3.12.0: version "3.12.0" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz" @@ -17770,16 +16976,6 @@ tsconfig-paths@^3.12.0: minimist "^1.2.0" strip-bom "^3.0.0" -tsconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" - integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== - dependencies: - "@types/strip-bom" "^3.0.0" - "@types/strip-json-comments" "0.0.30" - strip-bom "^3.0.0" - strip-json-comments "^2.0.0" - tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" @@ -17823,7 +17019,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -17893,6 +17089,11 @@ typescript@^4.6.3: resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== +ufo@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== + uglify-js@^3.1.4: version "3.14.5" resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz" @@ -18014,14 +17215,6 @@ upath@^2.0.1: resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - update-notifier@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" @@ -18130,15 +17323,6 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" -v8-to-istanbul@^9.0.1: - version "9.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" - integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" @@ -18196,6 +17380,17 @@ vinyl@^2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +vite-node@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.1.3.tgz#196de20a7c2e0467a07da0dd1fe67994f5b79695" + integrity sha512-BLSO72YAkIUuNrOx+8uznYICJfTEbvBAmWClY3hpath5+h1mbPS5OMn42lrTxXuyCazVyZoDkSRnju78GiVCqA== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^5.0.0" + vite@^3.1.6: version "3.2.7" resolved "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz" @@ -18208,6 +17403,17 @@ vite@^3.1.6: optionalDependencies: fsevents "~2.3.2" +vite@^5.0.0: + version "5.0.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.11.tgz#31562e41e004cb68e1d51f5d2c641ab313b289e4" + integrity sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA== + dependencies: + esbuild "^0.19.3" + postcss "^8.4.32" + rollup "^4.2.0" + optionalDependencies: + fsevents "~2.3.3" + vitepress@^1.0.0-alpha.21: version "1.0.0-alpha.21" resolved "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-alpha.21.tgz" @@ -18223,6 +17429,33 @@ vitepress@^1.0.0-alpha.21: vite "^3.1.6" vue "^3.2.40" +vitest@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.1.3.tgz#c911bcbcfd2266d44db6ecb08273b91e0ec20dc7" + integrity sha512-2l8om1NOkiA90/Y207PsEvJLYygddsOyr81wLQ20Ra8IlLKbyQncWsGZjnbkyG2KwwuTXLQjEPOJuxGMG8qJBQ== + dependencies: + "@vitest/expect" "1.1.3" + "@vitest/runner" "1.1.3" + "@vitest/snapshot" "1.1.3" + "@vitest/spy" "1.1.3" + "@vitest/utils" "1.1.3" + acorn-walk "^8.3.1" + cac "^6.7.14" + chai "^4.3.10" + debug "^4.3.4" + execa "^8.0.1" + local-pkg "^0.5.0" + magic-string "^0.30.5" + pathe "^1.1.1" + picocolors "^1.0.0" + std-env "^3.5.0" + strip-literal "^1.3.0" + tinybench "^2.5.1" + tinypool "^0.8.1" + vite "^5.0.0" + vite-node "1.1.3" + why-is-node-running "^2.2.2" + vscode-oniguruma@^1.6.1: version "1.6.2" resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz" @@ -18279,7 +17512,7 @@ walk-up-path@^1.0.0: resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz" integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== -walker@^1.0.7, walker@^1.0.8: +walker@^1.0.7: version "1.0.8" resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -18528,6 +17761,14 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +why-is-node-running@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" @@ -18797,14 +18038,6 @@ write-file-atomic@^4.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.7" -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz" @@ -18944,7 +18177,7 @@ y18n@^5.0.5: resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.0, yallist@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -18969,11 +18202,6 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yargs@^16.1.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -18987,19 +18215,6 @@ yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yarn@^1.22.17: version "1.22.17" resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.17.tgz" @@ -19075,6 +18290,11 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + yosay@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/yosay/-/yosay-2.0.2.tgz"