diff --git a/packages/metamigo-config/package.json b/packages/metamigo-config/package.json index 918bc00..a9fac08 100644 --- a/packages/metamigo-config/package.json +++ b/packages/metamigo-config/package.json @@ -24,14 +24,11 @@ ], "scripts": { "build": "tsc -p tsconfig.json", - "doc:html": "typedoc src/ --exclude '**/*.test.ts' --exclude '**/*.spec.ts' --name $npm_package_name --readme README.md --target es2019 --mode file --out build/docs", - "doc": "yarn run doc:html", + "doc": "typedoc src/ --exclude '**/*.test.ts' --exclude '**/*.spec.ts' --name $npm_package_name --readme README.md --target es2019 --mode file --out build/docs", "fix:lint": "eslint src --ext .ts --fix", - "fix:prettier": "prettier \"src/**/*.ts\" --write", - "lint:lint": "eslint src --ext .ts", - "lint:prettier": "prettier \"src/**/*.ts\" --list-different", + "fmt": "prettier \"src/**/*.ts\" --write", + "lint": "eslint src --ext .ts && prettier \"src/**/*.ts\" --list-different", "test": "echo no tests", - "lint": "yarn lint:lint && yarn lint:prettier", "watch:build": "tsc -p tsconfig.json -w" } } diff --git a/packages/metamigo-db/.eslintrc.js b/packages/metamigo-db/.eslintrc.js index d8da07c..f210182 100644 --- a/packages/metamigo-db/.eslintrc.js +++ b/packages/metamigo-db/.eslintrc.js @@ -1 +1,8 @@ -require("../.eslintrc.js"); +require('eslint-config-link/patch/modern-module-resolution'); +module.exports = { + extends: [ + "eslint-config-link/profile/node", + "eslint-config-link/profile/typescript" + ], + parserOptions: { tsconfigRootDir: __dirname } +}; \ No newline at end of file diff --git a/packages/metamigo-db/index.ts b/packages/metamigo-db/index.ts deleted file mode 100644 index 4d54857..0000000 --- a/packages/metamigo-db/index.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { IAppConfig } from "config"; -import camelcaseKeys from "camelcase-keys"; -import PgSimplifyInflectorPlugin from "@graphile-contrib/pg-simplify-inflector"; -// import PgManyToManyPlugin from "@graphile-contrib/pg-many-to-many"; -import * as ConnectionFilterPlugin from "postgraphile-plugin-connection-filter"; -import type { PostGraphileCoreOptions } from "postgraphile-core"; - -import { - UserRecordRepository, - AccountRecordRepository, - SessionRecordRepository, -} from "@digiresilience/metamigo-common"; - -import { - SettingRecordRepository, - VoiceProviderRecordRepository, - VoiceLineRecordRepository, - WebhookRecordRepository, - WhatsappBotRecordRepository, - WhatsappMessageRecordRepository, - WhatsappAttachmentRecordRepository, - SignalBotRecordRepository, -} from "./records"; - -import type { IInitOptions, IDatabase } from "pg-promise"; - -export interface IRepositories { - users: UserRecordRepository; - sessions: SessionRecordRepository; - accounts: AccountRecordRepository; - settings: SettingRecordRepository; - voiceLines: VoiceLineRecordRepository; - voiceProviders: VoiceProviderRecordRepository; - webhooks: WebhookRecordRepository; - whatsappBots: WhatsappBotRecordRepository; - whatsappMessages: WhatsappMessageRecordRepository; - whatsappAttachments: WhatsappAttachmentRecordRepository; - signalBots: SignalBotRecordRepository; -} - -export type AppDatabase = IDatabase & IRepositories; - -export const dbInitOptions = ( - _config: IAppConfig -): IInitOptions => { - return { - noWarnings: true, - receive(data, result) { - if (result) result.rows = camelcaseKeys(data); - }, - - // Extending the database protocol with our custom repositories; - // API: http://vitaly-t.github.io/pg-promise/global.html#event:extend - extend(obj: any, _dc) { // AppDatase was obj type - // Database Context (_dc) is mainly needed for extending multiple databases with different access API. - - // NOTE: - // This event occurs for every task and transaction being executed (which could be every request!) - // so it should be as fast as possible. Do not use 'require()' or do any other heavy lifting. - obj.users = new UserRecordRepository(obj); - obj.sessions = new SessionRecordRepository(obj); - obj.accounts = new AccountRecordRepository(obj); - obj.settings = new SettingRecordRepository(obj); - obj.voiceLines = new VoiceLineRecordRepository(obj); - obj.voiceProviders = new VoiceProviderRecordRepository(obj); - obj.webhooks = new WebhookRecordRepository(obj); - obj.whatsappBots = new WhatsappBotRecordRepository(obj); - obj.whatsappMessages = new WhatsappMessageRecordRepository(obj); - obj.whatsappAttachments = new WhatsappAttachmentRecordRepository(obj); - obj.signalBots = new SignalBotRecordRepository(obj); - }, - }; -}; - -export const getPostGraphileOptions = (): PostGraphileCoreOptions => { - return { - ignoreRBAC: false, - dynamicJson: true, - ignoreIndexes: false, - appendPlugins: [ - PgSimplifyInflectorPlugin, - // PgManyToManyPlugin, - ConnectionFilterPlugin as any, - ], - }; -}; - -export * from "./helpers"; -export * from "./records"; diff --git a/packages/metamigo-db/package.json b/packages/metamigo-db/package.json index 0c4ec2b..f52639a 100644 --- a/packages/metamigo-db/package.json +++ b/packages/metamigo-db/package.json @@ -25,15 +25,11 @@ }, "scripts": { "build": "tsc -p tsconfig.json", - "build-test": "tsc -p tsconfig.json", - "doc:html": "typedoc src/ --exclude '**/*.test.ts' --exclude '**/*.spec.ts' --name $npm_package_name --readme README.md --target es2019 --mode file --out build/docs", - "doc": "yarn run doc:html", + "doc": "typedoc src/ --exclude '**/*.test.ts' --exclude '**/*.spec.ts' --name $npm_package_name --readme README.md --target es2019 --mode file --out build/docs", "fix:lint": "eslint src --ext .ts --fix", - "fix:prettier": "prettier \"src/**/*.ts\" --write", - "worker": "NODE_ENV=development yarn cli worker", - "lint:lint": "eslint src --ext .ts", - "lint:prettier": "prettier \"src/**/*.ts\" --list-different", - "lint": "npm run lint:lint && npm run lint:prettier", - "watch:build": "tsc -p tsconfig.json -w" + "fmt": "prettier \"src/**/*.ts\" --write", + "lint": "eslint src --ext .ts && prettier \"src/**/*.ts\" --list-different", + "watch:build": "tsc -p tsconfig.json -w", + "worker": "NODE_ENV=development yarn cli worker" } } diff --git a/packages/metamigo-db/helpers.ts b/packages/metamigo-db/src/helpers.ts similarity index 91% rename from packages/metamigo-db/helpers.ts rename to packages/metamigo-db/src/helpers.ts index 5a63cf5..30f286a 100644 --- a/packages/metamigo-db/helpers.ts +++ b/packages/metamigo-db/src/helpers.ts @@ -1,7 +1,7 @@ -import process from "process"; -import { existsSync } from "fs"; -import { exec } from "child_process"; -import type { IAppConfig } from "config"; +import process from "node:process"; +import { existsSync } from "node:fs"; +import { exec } from "node:child_process"; +import type { IAppConfig } from "@digiresilience/metamigo-config"; /** * We use graphile-migrate for managing database migrations. diff --git a/packages/metamigo-db/src/index.ts b/packages/metamigo-db/src/index.ts new file mode 100644 index 0000000..f98e2f4 --- /dev/null +++ b/packages/metamigo-db/src/index.ts @@ -0,0 +1,89 @@ +import type { IAppConfig } from "@digiresilience/metamigo-config"; +import camelcaseKeys from "camelcase-keys"; +import PgSimplifyInflectorPlugin from "@graphile-contrib/pg-simplify-inflector"; +// import PgManyToManyPlugin from "@graphile-contrib/pg-many-to-many"; +import * as ConnectionFilterPlugin from "postgraphile-plugin-connection-filter"; +import type { PostGraphileCoreOptions } from "postgraphile-core"; + +import { + UserRecordRepository, + AccountRecordRepository, + SessionRecordRepository, +} from "@digiresilience/metamigo-common"; + +import { + SettingRecordRepository, + VoiceProviderRecordRepository, + VoiceLineRecordRepository, + WebhookRecordRepository, + WhatsappBotRecordRepository, + WhatsappMessageRecordRepository, + WhatsappAttachmentRecordRepository, + SignalBotRecordRepository, +} from "./records"; + +import type { IInitOptions, IDatabase } from "pg-promise"; + +export interface IRepositories { + users: UserRecordRepository; + sessions: SessionRecordRepository; + accounts: AccountRecordRepository; + settings: SettingRecordRepository; + voiceLines: VoiceLineRecordRepository; + voiceProviders: VoiceProviderRecordRepository; + webhooks: WebhookRecordRepository; + whatsappBots: WhatsappBotRecordRepository; + whatsappMessages: WhatsappMessageRecordRepository; + whatsappAttachments: WhatsappAttachmentRecordRepository; + signalBots: SignalBotRecordRepository; +} + +export type AppDatabase = IDatabase & IRepositories; + +export const dbInitOptions = ( + _config: IAppConfig +): IInitOptions => ({ + noWarnings: true, + receive(e) { + const { data, result } = e; + if (result) result.rows = camelcaseKeys(data); + }, + + // Extending the database protocol with our custom repositories; + // API: http://vitaly-t.github.io/pg-promise/global.html#event:extend + // eslint-disable-next-line @typescript-eslint/no-explicit-any + extend(obj: any, _dc) { + // AppDatase was obj type + // Database Context (_dc) is mainly needed for extending multiple databases with different access API. + + // NOTE: + // This event occurs for every task and transaction being executed (which could be every request!) + // so it should be as fast as possible. Do not use 'require()' or do any other heavy lifting. + obj.users = new UserRecordRepository(obj); + obj.sessions = new SessionRecordRepository(obj); + obj.accounts = new AccountRecordRepository(obj); + obj.settings = new SettingRecordRepository(obj); + obj.voiceLines = new VoiceLineRecordRepository(obj); + obj.voiceProviders = new VoiceProviderRecordRepository(obj); + obj.webhooks = new WebhookRecordRepository(obj); + obj.whatsappBots = new WhatsappBotRecordRepository(obj); + obj.whatsappMessages = new WhatsappMessageRecordRepository(obj); + obj.whatsappAttachments = new WhatsappAttachmentRecordRepository(obj); + obj.signalBots = new SignalBotRecordRepository(obj); + }, +}); + +export const getPostGraphileOptions = (): PostGraphileCoreOptions => ({ + ignoreRBAC: false, + dynamicJson: true, + ignoreIndexes: false, + appendPlugins: [ + PgSimplifyInflectorPlugin, + // PgManyToManyPlugin, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ConnectionFilterPlugin as any, + ], +}); + +export * from "./helpers"; +export * from "./records"; diff --git a/packages/metamigo-db/records/index.ts b/packages/metamigo-db/src/records/index.ts similarity index 100% rename from packages/metamigo-db/records/index.ts rename to packages/metamigo-db/src/records/index.ts diff --git a/packages/metamigo-db/records/settings.ts b/packages/metamigo-db/src/records/settings.ts similarity index 87% rename from packages/metamigo-db/records/settings.ts rename to packages/metamigo-db/src/records/settings.ts index 19545bd..3412b98 100644 --- a/packages/metamigo-db/records/settings.ts +++ b/packages/metamigo-db/src/records/settings.ts @@ -1,5 +1,10 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-unused-vars,@typescript-eslint/no-explicit-any,prefer-destructuring */ -import { RepositoryBase, recordInfo, UUID, Flavor } from "@digiresilience/metamigo-common"; +/* eslint-disable @typescript-eslint/no-unused-vars,@typescript-eslint/no-explicit-any,prefer-destructuring */ +import { + RepositoryBase, + recordInfo, + UUID, + Flavor, +} from "@digiresilience/metamigo-common"; export type SettingId = Flavor; @@ -71,12 +76,12 @@ export const SettingsService = ( repo: SettingRecordRepository ): ISettingsService => ({ name: "settingService", - lookup: async (settingInfo: SettingInfo): Promise => { + async lookup(settingInfo: SettingInfo): Promise { const s = await repo.findByName(settingInfo.name); return s.value; }, - save: async (settingInfo: SettingInfo, value: T): Promise => { + async save(settingInfo: SettingInfo, value: T): Promise { const s = await repo.upsert(settingInfo.name, value); return s.value; }, diff --git a/packages/metamigo-db/records/signal/bots.ts b/packages/metamigo-db/src/records/signal/bots.ts similarity index 89% rename from packages/metamigo-db/records/signal/bots.ts rename to packages/metamigo-db/src/records/signal/bots.ts index a4a6fd9..2bddcb9 100644 --- a/packages/metamigo-db/records/signal/bots.ts +++ b/packages/metamigo-db/src/records/signal/bots.ts @@ -1,4 +1,9 @@ -import { RepositoryBase, recordInfo, UUID, Flavor } from "@digiresilience/metamigo-common"; +import { + RepositoryBase, + recordInfo, + UUID, + Flavor, +} from "@digiresilience/metamigo-common"; export type SignalBotId = Flavor; diff --git a/packages/metamigo-db/records/voice/voice-line.ts b/packages/metamigo-db/src/records/voice/voice-line.ts similarity index 97% rename from packages/metamigo-db/records/voice/voice-line.ts rename to packages/metamigo-db/src/records/voice/voice-line.ts index c2766a4..17d1c35 100644 --- a/packages/metamigo-db/records/voice/voice-line.ts +++ b/packages/metamigo-db/src/records/voice/voice-line.ts @@ -4,7 +4,7 @@ import { UUID, Flavor, } from "@digiresilience/metamigo-common"; -import type { } from "pg-promise"; +import type {} from "pg-promise"; export type VoiceLineId = Flavor; diff --git a/packages/metamigo-db/records/voice/voice-provider.ts b/packages/metamigo-db/src/records/voice/voice-provider.ts similarity index 92% rename from packages/metamigo-db/records/voice/voice-provider.ts rename to packages/metamigo-db/src/records/voice/voice-provider.ts index ef22871..4ff17b2 100644 --- a/packages/metamigo-db/records/voice/voice-provider.ts +++ b/packages/metamigo-db/src/records/voice/voice-provider.ts @@ -1,4 +1,9 @@ -import { RepositoryBase, recordInfo, UUID, Flavor } from "@digiresilience/metamigo-common"; +import { + RepositoryBase, + recordInfo, + UUID, + Flavor, +} from "@digiresilience/metamigo-common"; /* * VoiceProvider diff --git a/packages/metamigo-db/records/webhooks.ts b/packages/metamigo-db/src/records/webhooks.ts similarity index 100% rename from packages/metamigo-db/records/webhooks.ts rename to packages/metamigo-db/src/records/webhooks.ts diff --git a/packages/metamigo-db/records/whatsapp/attachments.ts b/packages/metamigo-db/src/records/whatsapp/attachments.ts similarity index 84% rename from packages/metamigo-db/records/whatsapp/attachments.ts rename to packages/metamigo-db/src/records/whatsapp/attachments.ts index 1dea07f..58a169c 100644 --- a/packages/metamigo-db/records/whatsapp/attachments.ts +++ b/packages/metamigo-db/src/records/whatsapp/attachments.ts @@ -1,4 +1,9 @@ -import { RepositoryBase, recordInfo, UUID, Flavor } from "@digiresilience/metamigo-common"; +import { + RepositoryBase, + recordInfo, + UUID, + Flavor, +} from "@digiresilience/metamigo-common"; export type WhatsappAttachmentId = Flavor; @@ -21,4 +26,4 @@ export const WhatsappAttachmentRecord = recordInfo< export class WhatsappAttachmentRecordRepository extends RepositoryBase( WhatsappAttachmentRecord -) { } +) {} diff --git a/packages/metamigo-db/records/whatsapp/bots.ts b/packages/metamigo-db/src/records/whatsapp/bots.ts similarity index 91% rename from packages/metamigo-db/records/whatsapp/bots.ts rename to packages/metamigo-db/src/records/whatsapp/bots.ts index db37e4a..0133037 100644 --- a/packages/metamigo-db/records/whatsapp/bots.ts +++ b/packages/metamigo-db/src/records/whatsapp/bots.ts @@ -1,4 +1,9 @@ -import { RepositoryBase, recordInfo, UUID, Flavor } from "@digiresilience/metamigo-common"; +import { + RepositoryBase, + recordInfo, + UUID, + Flavor, +} from "@digiresilience/metamigo-common"; export type WhatsappBotId = Flavor; diff --git a/packages/metamigo-db/records/whatsapp/messages.ts b/packages/metamigo-db/src/records/whatsapp/messages.ts similarity index 84% rename from packages/metamigo-db/records/whatsapp/messages.ts rename to packages/metamigo-db/src/records/whatsapp/messages.ts index 1c99293..080cea0 100644 --- a/packages/metamigo-db/records/whatsapp/messages.ts +++ b/packages/metamigo-db/src/records/whatsapp/messages.ts @@ -1,4 +1,9 @@ -import { RepositoryBase, recordInfo, UUID, Flavor } from "@digiresilience/metamigo-common"; +import { + RepositoryBase, + recordInfo, + UUID, + Flavor, +} from "@digiresilience/metamigo-common"; export type WhatsappMessageId = Flavor; @@ -23,4 +28,4 @@ export const WhatsappMessageRecord = recordInfo< export class WhatsappMessageRecordRepository extends RepositoryBase( WhatsappMessageRecord -) { } +) {} diff --git a/packages/metamigo-db/tsconfig.json b/packages/metamigo-db/tsconfig.json index ba4e9e1..77496bb 100644 --- a/packages/metamigo-db/tsconfig.json +++ b/packages/metamigo-db/tsconfig.json @@ -1,8 +1,12 @@ { - "extends": "../tsconfig.json", + "extends": "tsconfig-link", "compilerOptions": { - "outDir": "build/main" + "incremental": true, + "outDir": "build/main", + "rootDir": "src", + "baseUrl": "./", + "types": ["jest", "node"] }, - "include": ["**/*.ts", "**/.*.ts"], - "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"] + "include": ["src/**/*.ts"], + "exclude": ["node_modules/**"] } diff --git a/turbo.json b/turbo.json index cac0d14..86b1b58 100644 --- a/turbo.json +++ b/turbo.json @@ -14,6 +14,7 @@ "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"] }, "lint": {}, + "fmt": {}, "deploy": { "dependsOn": ["build", "test", "lint"] }