Moving triggers into their own service, worried them being in webapp is messing stuff up

This commit is contained in:
Eric Allam
2023-01-26 13:56:30 +00:00
parent f447b98c50
commit f100bfc81f
11 changed files with 451 additions and 141 deletions
+51
View File
@@ -0,0 +1,51 @@
FROM node:16-bullseye AS pruner
RUN apt-get update && apt-get install openssl -y
WORKDIR /app
RUN npm install turbo -g
COPY . .
RUN turbo prune --scope=internal-triggers --docker
RUN find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
# Base strategy to have layer caching
FROM node:16-bullseye AS base
RUN apt-get update && apt-get install openssl
WORKDIR /app
COPY .gitignore .gitignore
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
FROM base AS production-deps
WORKDIR /app
RUN corepack enable
ENV NODE_ENV production
RUN pnpm install --prod --frozen-lockfile
FROM base AS builder
WORKDIR /app
RUN npm install turbo -g
COPY turbo.json turbo.json
RUN corepack enable
COPY --from=pruner /app/out/full/ .
ENV NODE_ENV development
RUN pnpm install --ignore-scripts --frozen-lockfile
ENV NODE_ENV production
RUN pnpm run build --filter=internal-triggers
# Runner
FROM node:16-bullseye AS runner
RUN apt-get update && apt-get install openssl
RUN npm install turbo -g
WORKDIR /app
RUN corepack enable
ENV NODE_ENV production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 internal-triggersjs
RUN chown -R internal-triggersjs:nodejs /app
USER internal-triggersjs
COPY --from=pruner --chown=internal-triggersjs:nodejs /app/out/full/ .
COPY --from=production-deps --chown=internal-triggersjs:nodejs /app .
COPY --from=builder --chown=internal-triggersjs:nodejs /app/apps/internal-triggers/dist/index.js ./apps/internal-triggers/dist/index.js
ENTRYPOINT ["pnpm", "--filter", "internal-triggers", "run", "start"]
+31
View File
@@ -0,0 +1,31 @@
{
"name": "internal-triggers",
"version": "1.0.0",
"description": "A Node.js server that hosts our internal triggers",
"main": "dist/index.js",
"private": true,
"scripts": {
"clean": "rimraf dist",
"build": "npm run clean && npm run build:tsup",
"build:tsup": "tsup",
"dev": "tsx --require ./node_modules/dotenv/config src/index.ts",
"start": "node dist/index.js"
},
"keywords": [],
"author": "",
"dependencies": {
"@trigger.dev/integrations": "^0.1.13",
"@trigger.dev/sdk": "^0.2.10",
"pg": "^8.8.0",
"zod": "^3.20.2"
},
"devDependencies": {
"@trigger.dev/tsconfig": "workspace:*",
"@types/node": "16",
"@types/pg": "^8.6.6",
"dotenv": "^16.0.3",
"rimraf": "^3.0.2",
"tsup": "^6.5.0",
"typescript": "^4.9.4"
}
}
+43
View File
@@ -0,0 +1,43 @@
import { Pool, QueryResultRow } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
export async function query<TQueryResult extends QueryResultRow>(
text: string,
params?: any[]
) {
return pool.query<TQueryResult>(text, params);
}
export async function getTableCount(
tableName: string,
startAt: Date,
endAt: Date
) {
const tableCount = await query<{ count: string }>(
`SELECT COUNT(*) as count FROM "${tableName}" WHERE "${tableName}"."createdAt" >= $1 AND "${tableName}"."createdAt" < $2`,
[startAt, endAt]
).then((result) => parseInt(result.rows[0].count, 10));
return tableCount;
}
export async function getClient() {
const client = await pool.connect();
const query = client.query;
const release = client.release;
// set a timeout of 5 seconds, after which we will log this client's last query
const timeout = setTimeout(() => {
console.error("A client has been checked out for more than 5 seconds!");
}, 5000);
client.release = () => {
// clear our timeout
clearTimeout(timeout);
// set the methods back to their old un-monkey-patched version
client.query = query;
client.release = release;
return release.apply(client);
};
return client;
}
+6
View File
@@ -0,0 +1,6 @@
import { checkScheduler, uptimeCheck, healthCheck } from "./monitoring";
// checkScheduler.listen();
// healthCheck.listen();
uptimeCheck.listen();
@@ -1,34 +1,49 @@
import { Trigger, scheduleEvent, customEvent } from "@trigger.dev/sdk";
import { slack } from "@trigger.dev/integrations";
import { prisma } from "~/db.server";
import { getTableCount } from "./db";
import { z } from "zod";
export const uptimeCheck = new Trigger({
id: "uptime-check",
name: "Uptime Check",
on: scheduleEvent({ rateOf: { minutes: 5 } }),
logLevel: "info",
logLevel: "debug",
triggerTTL: 300,
endpoint: process.env.TRIGGER_WSS_URL,
run: async (event, context) => {
if (context.environment === "development" && !context.isTest) {
return;
}
const filterCondition = {
where: { createdAt: { gte: event.lastRunAt, lt: event.scheduledTime } },
};
const { lastRunAt, scheduledTime } = event;
if (!lastRunAt) {
return;
}
// Grab counts of workflows, runs, and steps
const userCount = await prisma.user.count(filterCondition);
const workflowCount = await prisma.workflow.count(filterCondition);
const runCount = await prisma.workflowRun.count(filterCondition);
const stepCount = await prisma.workflowRunStep.count(filterCondition);
const userCount = await getTableCount("User", lastRunAt, scheduledTime);
const workflowCount = await getTableCount(
"Workflow",
lastRunAt,
scheduledTime
);
const runCount = await getTableCount(
"WorkflowRun",
lastRunAt,
scheduledTime
);
const stepCount = await getTableCount(
"WorkflowRunStep",
lastRunAt,
scheduledTime
);
await slack.postMessage("Uptime Notification", {
channelName: "monitoring",
text: `[${
context.environment
}][${event.scheduledTime.toLocaleString()}] Uptime Check: ${userCount} new users, ${workflowCount} new workflows, ${runCount} new runs, ${stepCount} new steps.`,
}][${event.scheduledTime.toLocaleString()}] Uptime Check: ${userCount} new users, ${workflowCount} new workflows, ${runCount} new runs, ${stepCount} new steps`,
});
},
});
@@ -36,6 +51,9 @@ export const uptimeCheck = new Trigger({
export const healthCheck = new Trigger({
id: "health-check",
name: "Health Check",
endpoint: process.env.TRIGGER_WSS_URL,
logLevel: "debug",
triggerTTL: 600,
on: customEvent({
name: "health.check",
schema: z.object({
@@ -43,8 +61,6 @@ export const healthCheck = new Trigger({
host: z.string(),
}),
}),
logLevel: "info",
triggerTTL: 600,
run: async (event, context) => {
const response = await context.fetch("fetch site", event.url, {
method: "GET",
@@ -71,6 +87,7 @@ export const checkScheduler = new Trigger({
on: scheduleEvent({ rateOf: { minutes: 10 } }),
logLevel: "info",
triggerTTL: 600,
endpoint: process.env.TRIGGER_WSS_URL,
run: async (event, context) => {
if (context.environment === "development" && !context.isTest) {
return;
+9
View File
@@ -0,0 +1,9 @@
{
"extends": "@trigger.dev/tsconfig/node16.json",
"include": ["./src/**/*.ts", "tsup.config.ts"],
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
},
"exclude": ["node_modules"]
}
+19
View File
@@ -0,0 +1,19 @@
import { defineConfig } from "tsup";
export default defineConfig([
{
name: "main",
entry: ["./src/index.ts"],
outDir: "./dist",
platform: "node",
format: ["cjs"],
legacyOutput: true,
sourcemap: true,
clean: true,
bundle: true,
splitting: false,
dts: true,
external: ["http", "https", "util", "events", "tty", "os", "timers"],
esbuildPlugins: [],
},
]);
-2
View File
@@ -3,7 +3,6 @@ import { RemixServer } from "@remix-run/react";
import { renderToString } from "react-dom/server";
import * as Sentry from "~/services/sentry.server";
import * as MessageBroker from "~/services/messageBroker.server";
import * as Triggers from "~/triggers/init.server";
export default function handleRequest(
request: Request,
@@ -27,4 +26,3 @@ export default function handleRequest(
Sentry.init();
MessageBroker.init();
Triggers.init();
-19
View File
@@ -1,19 +0,0 @@
import { uptimeCheck, healthCheck, checkScheduler } from "./monitoring.server";
declare global {
var __triggers_initialized: boolean;
}
export function init() {
if (global.__triggers_initialized) {
return;
}
global.__triggers_initialized = true;
uptimeCheck.listen();
healthCheck.listen();
checkScheduler.listen();
console.log(`🛎 Triggers initialized`);
}
+38 -7
View File
@@ -62,11 +62,10 @@
"packages/internal-pulsar/src/**",
"./pnpm-lock.yaml"
],
"dependsOn": ["p-db"],
"dependsOn": [
"p-db"
],
"envVariables": {
"TRIGGER_API_KEY": {
"fromParameterStore": "/Prod/webapp/TRIGGER_API_KEY"
},
"FROM_EMAIL": "hello@email.trigger.dev",
"REPLY_TO_EMAIL": "hello@trigger.dev",
"RESEND_API_KEY": {
@@ -148,7 +147,37 @@
"fromParameterStore": "/Prod/Pulsar/wss/Role"
},
"PLATFORM_API_URL": "https://app.trigger.dev",
"TRIGGER_LOG_LEVEL": "debug"
"TRIGGER_LOG_LEVEL": "debug",
"TRIGGER_API_KEY": {
"fromParameterStore": "/Prod/webapp/TRIGGER_API_KEY"
}
}
},
{
"id": "p-triggers",
"name": "Prod Triggers",
"type": "fargate-worker",
"buildType": "docker",
"dockerfilePath": "./apps/internal-triggers/Dockerfile",
"dockerContext": ".",
"cpu": 1,
"memory": 2,
"minInstances": 1,
"maxInstances": 2,
"watchPaths": [
"apps/internal-triggers/src/**",
"apps/internal-triggers/tsconfig.json",
"apps/internal-triggers/tsup.config.ts",
"apps/internal-triggers/package.json"
],
"envVariables": {
"TRIGGER_LOG_LEVEL": "debug",
"DATABASE_URL": {
"fromService": {
"id": "p-db",
"value": "dbConnectionString"
}
}
}
},
{
@@ -238,7 +267,9 @@
"packages/internal-pulsar/src/**",
"./pnpm-lock.yaml"
],
"dependsOn": ["s-db"],
"dependsOn": [
"s-db"
],
"envVariables": {
"FROM_EMAIL": "hello@email.trigger.dev",
"REPLY_TO_EMAIL": "hello@trigger.dev",
@@ -348,4 +379,4 @@
]
}
]
}
}
+225 -101
View File
@@ -35,6 +35,33 @@ importers:
devDependencies:
mintlify: 2.0.16
apps/internal-triggers:
specifiers:
'@trigger.dev/integrations': ^0.1.13
'@trigger.dev/sdk': ^0.2.10
'@trigger.dev/tsconfig': workspace:*
'@types/node': '16'
'@types/pg': ^8.6.6
dotenv: ^16.0.3
pg: ^8.8.0
rimraf: ^3.0.2
tsup: ^6.5.0
typescript: ^4.9.4
zod: ^3.20.2
dependencies:
'@trigger.dev/integrations': link:../../packages/trigger-integrations
'@trigger.dev/sdk': link:../../packages/trigger-sdk
pg: 8.8.0
zod: 3.20.2
devDependencies:
'@trigger.dev/tsconfig': link:../../config-packages/tsconfig
'@types/node': 16.18.11
'@types/pg': 8.6.6
dotenv: 16.0.3
rimraf: 3.0.2
tsup: 6.5.0_typescript@4.9.4
typescript: 4.9.4
apps/webapp:
specifiers:
'@aws-sdk/client-s3': ^3.186.0
@@ -184,7 +211,7 @@ importers:
'@aws-sdk/client-s3': 3.245.0
'@aws-sdk/s3-request-presigner': 3.245.0
'@cfworker/json-schema': 1.12.5
'@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde
'@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu
'@codemirror/commands': 6.1.3
'@codemirror/lang-javascript': 6.1.2
'@codemirror/lang-json': 6.0.1
@@ -211,7 +238,7 @@ importers:
'@trigger.dev/integrations': link:../../packages/trigger-integrations
'@trigger.dev/providers': link:../../packages/trigger-providers
'@trigger.dev/sdk': link:../../packages/trigger-sdk
'@uiw/react-codemirror': 4.19.5_aguurb4bmecpxzejz52amioxne
'@uiw/react-codemirror': 4.19.5_k4ec5g7vuuzzonc3d6xbjnmmle
bcryptjs: 2.4.3
classnames: 2.3.2
clsx: 1.2.1
@@ -780,7 +807,7 @@ importers:
tsup: ^6.5.0
zod: ^3.20.2
dependencies:
'@react-email/render': 0.0.3_react@18.2.0
'@react-email/render': 0.0.3
'@trigger.dev/providers': link:../trigger-providers
'@trigger.dev/sdk': link:../trigger-sdk
zod: 3.20.2
@@ -3485,13 +3512,12 @@ packages:
prettier: 2.8.2
dev: false
/@codemirror/autocomplete/6.4.0_eo6pz6bvsllvatnnwfprpuflde:
/@codemirror/autocomplete/6.4.0_czcfkg2f66rxeiodoti7r2gulu:
resolution: {integrity: sha512-HLF2PnZAm1s4kGs30EiqKMgD7XsYaQ0XJnMR0rofEWQ5t5D60SfqpDIkIh1ze5tiEbyUWm8+VJ6W1/erVvBMIA==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
dependencies:
'@codemirror/language': 6.3.2
'@codemirror/state': 6.2.0
@@ -3511,7 +3537,7 @@ packages:
/@codemirror/lang-javascript/6.1.2:
resolution: {integrity: sha512-OcwLfZXdQ1OHrLiIcKCn7MqZ7nx205CMKlhe+vL88pe2ymhT9+2P+QhwkYGxMICj8TDHyp8HFKVwpiisUT7iEQ==}
dependencies:
'@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde
'@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu
'@codemirror/language': 6.3.2
'@codemirror/lint': 6.1.0
'@codemirror/state': 6.2.0
@@ -4719,6 +4745,16 @@ packages:
react-dom: 18.2.0_react@18.2.0
dev: false
/@react-email/render/0.0.3:
resolution: {integrity: sha512-+4eOrLGdTCJjoJU3PunekErjo3PFnhSDFjVINBHrfJT+1wlVdhWfDo7hFdzXJx/JOOYqmnZTilU/umGLdRumKQ==}
engines: {node: '>=18.0.0'}
dependencies:
pretty: 2.0.0
react-dom: 18.2.0
transitivePeerDependencies:
- react
dev: false
/@react-email/render/0.0.3_react@18.2.0:
resolution: {integrity: sha512-+4eOrLGdTCJjoJU3PunekErjo3PFnhSDFjVINBHrfJT+1wlVdhWfDo7hFdzXJx/JOOYqmnZTilU/umGLdRumKQ==}
engines: {node: '>=18.0.0'}
@@ -4834,7 +4870,7 @@ packages:
eslint: 8.31.0
eslint-import-resolver-node: 0.3.6
eslint-import-resolver-typescript: 3.5.3_hnftvkj7qg3s6bbigj4pr6djxy
eslint-plugin-import: 2.27.4_qdjeohovcytra7xto5vgmxssaq
eslint-plugin-import: 2.27.4_2ac3tknkazjoq5fxmuugu665ny
eslint-plugin-jest: 26.9.0_ohsifnwenhmxgcp7mend4dnv74
eslint-plugin-jest-dom: 4.0.3_eslint@8.31.0
eslint-plugin-jsx-a11y: 6.7.1_eslint@8.31.0
@@ -5701,6 +5737,14 @@ packages:
/@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
/@types/pg/8.6.6:
resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==}
dependencies:
'@types/node': 18.11.18
pg-protocol: 1.5.0
pg-types: 2.2.0
dev: true
/@types/prismjs/1.26.0:
resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==}
dev: true
@@ -5814,7 +5858,7 @@ packages:
/@types/ws/8.5.4:
resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.11.18
dev: true
/@types/yargs-parser/21.0.0:
@@ -5964,18 +6008,17 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
/@uiw/codemirror-extensions-basic-setup/4.19.5_tbeldtdcrf45b35pezgkzq2u4e:
/@uiw/codemirror-extensions-basic-setup/4.19.5_wd2tsis3in55bkaiwnc2c46tom:
resolution: {integrity: sha512-1zt7ZPJ01xKkSW/KDy0FZNga0bngN1fC594wCVG7FBi60ehfcAucpooQ+JSPScKXopxcb+ugPKZvVLzr9/OfzA==}
peerDependencies:
'@codemirror/autocomplete': '>=6.0.0'
'@codemirror/commands': '>=6.0.0'
'@codemirror/language': '>=6.0.0'
'@codemirror/lint': '>=6.0.0'
'@codemirror/search': '>=6.0.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
dependencies:
'@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde
'@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu
'@codemirror/commands': 6.1.3
'@codemirror/language': 6.3.2
'@codemirror/lint': 6.1.0
@@ -5984,14 +6027,11 @@ packages:
'@codemirror/view': 6.7.2
dev: false
/@uiw/react-codemirror/4.19.5_aguurb4bmecpxzejz52amioxne:
/@uiw/react-codemirror/4.19.5_k4ec5g7vuuzzonc3d6xbjnmmle:
resolution: {integrity: sha512-ZCHh8d7beXbF8/t7F1+yHht6A9Y6CdKeOkZq4A09lxJEnyTQrj1FMf2zvfaqc7K23KNjkTCtSlbqKKbVDgrWaw==}
peerDependencies:
'@babel/runtime': '>=7.11.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/theme-one-dark': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
codemirror: '>=6.0.0'
react: '>=16.8.0'
react-dom: '>=16.8.0'
dependencies:
@@ -6000,14 +6040,13 @@ packages:
'@codemirror/state': 6.2.0
'@codemirror/theme-one-dark': 6.1.0
'@codemirror/view': 6.7.2
'@uiw/codemirror-extensions-basic-setup': 4.19.5_tbeldtdcrf45b35pezgkzq2u4e
codemirror: 6.0.1_@lezer+common@1.0.2
'@uiw/codemirror-extensions-basic-setup': 4.19.5_wd2tsis3in55bkaiwnc2c46tom
codemirror: 6.0.1
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
transitivePeerDependencies:
- '@codemirror/autocomplete'
- '@codemirror/language'
- '@codemirror/lint'
- '@codemirror/search'
dev: false
@@ -6535,7 +6574,7 @@ packages:
/axios/0.25.0_debug@4.3.4:
resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
dependencies:
follow-redirects: 1.15.2_debug@4.3.4
follow-redirects: 1.15.2
transitivePeerDependencies:
- debug
dev: true
@@ -6543,7 +6582,7 @@ packages:
/axios/0.27.2:
resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
dependencies:
follow-redirects: 1.15.2_debug@4.3.4
follow-redirects: 1.15.2
form-data: 4.0.0
transitivePeerDependencies:
- debug
@@ -6814,6 +6853,11 @@ packages:
resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==}
engines: {node: '>=0.10'}
/buffer-writer/2.0.0:
resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==}
engines: {node: '>=4'}
dev: false
/buffer/5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
dependencies:
@@ -7321,18 +7365,16 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
/codemirror/6.0.1_@lezer+common@1.0.2:
/codemirror/6.0.1:
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
'@codemirror/autocomplete': 6.4.0_eo6pz6bvsllvatnnwfprpuflde
'@codemirror/autocomplete': 6.4.0_czcfkg2f66rxeiodoti7r2gulu
'@codemirror/commands': 6.1.3
'@codemirror/language': 6.3.2
'@codemirror/lint': 6.1.0
'@codemirror/search': 6.2.3
'@codemirror/state': 6.2.0
'@codemirror/view': 6.7.2
transitivePeerDependencies:
- '@lezer/common'
dev: false
/collection-visit/1.0.0:
@@ -8638,7 +8680,7 @@ packages:
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 2.7.1_hnftvkj7qg3s6bbigj4pr6djxy
eslint-plugin-import: 2.27.4_eslint@8.31.0
eslint-plugin-import: 2.27.4_2es4x7ly2gmvaoztzzbbx3tgsy
eslint-plugin-jsx-a11y: 6.7.1_eslint@8.31.0
eslint-plugin-react: 7.31.8_eslint@8.31.0
eslint-plugin-react-hooks: 4.6.0_eslint@8.31.0
@@ -8694,7 +8736,7 @@ packages:
dependencies:
debug: 4.3.4
eslint: 8.31.0
eslint-plugin-import: 2.27.4_eslint@8.31.0
eslint-plugin-import: 2.27.4_2es4x7ly2gmvaoztzzbbx3tgsy
glob: 7.2.3
is-glob: 4.0.3
resolve: 1.22.1
@@ -8713,7 +8755,7 @@ packages:
debug: 4.3.4
enhanced-resolve: 5.12.0
eslint: 8.31.0
eslint-plugin-import: 2.27.4_qdjeohovcytra7xto5vgmxssaq
eslint-plugin-import: 2.27.4_2ac3tknkazjoq5fxmuugu665ny
get-tsconfig: 4.3.0
globby: 13.1.3
is-core-module: 2.11.0
@@ -8723,35 +8765,7 @@ packages:
- supports-color
dev: true
/eslint-module-utils/2.7.4_py7h5widiydke2tta7oabbx7ru:
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: '*'
eslint-import-resolver-node: '*'
eslint-import-resolver-typescript: '*'
eslint-import-resolver-webpack: '*'
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
eslint:
optional: true
eslint-import-resolver-node:
optional: true
eslint-import-resolver-typescript:
optional: true
eslint-import-resolver-webpack:
optional: true
dependencies:
debug: 3.2.7
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
transitivePeerDependencies:
- supports-color
dev: true
/eslint-module-utils/2.7.4_sqt5xxn4ciiurbqrzlaarm6ama:
/eslint-module-utils/2.7.4_co4ldsxivxjwelu6vt6qmibemq:
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
@@ -8776,6 +8790,37 @@ packages:
debug: 3.2.7
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 2.7.1_hnftvkj7qg3s6bbigj4pr6djxy
transitivePeerDependencies:
- supports-color
dev: true
/eslint-module-utils/2.7.4_v73lhamtbyinynmwa5fn7kpmfq:
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: '*'
eslint-import-resolver-node: '*'
eslint-import-resolver-typescript: '*'
eslint-import-resolver-webpack: '*'
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
eslint:
optional: true
eslint-import-resolver-node:
optional: true
eslint-import-resolver-typescript:
optional: true
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe
debug: 3.2.7
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 3.5.3_hnftvkj7qg3s6bbigj4pr6djxy
transitivePeerDependencies:
- supports-color
dev: true
@@ -8800,39 +8845,7 @@ packages:
regexpp: 3.2.0
dev: true
/eslint-plugin-import/2.27.4_eslint@8.31.0:
resolution: {integrity: sha512-Z1jVt1EGKia1X9CnBCkpAOhWy8FgQ7OmJ/IblEkT82yrFU/xJaxwujaTzLWqigewwynRQ9mmHfX9MtAfhxm0sA==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
dependencies:
array-includes: 3.1.6
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4_py7h5widiydke2tta7oabbx7ru
has: 1.0.3
is-core-module: 2.11.0
is-glob: 4.0.3
minimatch: 3.1.2
object.values: 1.1.6
resolve: 1.22.1
semver: 6.3.0
tsconfig-paths: 3.14.1
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
dev: true
/eslint-plugin-import/2.27.4_qdjeohovcytra7xto5vgmxssaq:
/eslint-plugin-import/2.27.4_2ac3tknkazjoq5fxmuugu665ny:
resolution: {integrity: sha512-Z1jVt1EGKia1X9CnBCkpAOhWy8FgQ7OmJ/IblEkT82yrFU/xJaxwujaTzLWqigewwynRQ9mmHfX9MtAfhxm0sA==}
engines: {node: '>=4'}
peerDependencies:
@@ -8850,7 +8863,40 @@ packages:
doctrine: 2.1.0
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4_sqt5xxn4ciiurbqrzlaarm6ama
eslint-module-utils: 2.7.4_v73lhamtbyinynmwa5fn7kpmfq
has: 1.0.3
is-core-module: 2.11.0
is-glob: 4.0.3
minimatch: 3.1.2
object.values: 1.1.6
resolve: 1.22.1
semver: 6.3.0
tsconfig-paths: 3.14.1
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
dev: true
/eslint-plugin-import/2.27.4_2es4x7ly2gmvaoztzzbbx3tgsy:
resolution: {integrity: sha512-Z1jVt1EGKia1X9CnBCkpAOhWy8FgQ7OmJ/IblEkT82yrFU/xJaxwujaTzLWqigewwynRQ9mmHfX9MtAfhxm0sA==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe
array-includes: 3.1.6
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.31.0
eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4_co4ldsxivxjwelu6vt6qmibemq
has: 1.0.3
is-core-module: 2.11.0
is-glob: 4.0.3
@@ -9660,17 +9706,6 @@ packages:
debug:
optional: true
/follow-redirects/1.15.2_debug@4.3.4:
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dependencies:
debug: 4.3.4
/for-each/0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
@@ -13296,6 +13331,10 @@ packages:
semver: 6.3.0
dev: true
/packet-reader/1.0.0:
resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==}
dev: false
/pako/0.2.9:
resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
dev: true
@@ -13454,6 +13493,59 @@ packages:
is-reference: 3.0.1
dev: true
/pg-connection-string/2.5.0:
resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==}
dev: false
/pg-int8/1.0.1:
resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
engines: {node: '>=4.0.0'}
/pg-pool/3.5.2_pg@8.8.0:
resolution: {integrity: sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==}
peerDependencies:
pg: '>=8.0'
dependencies:
pg: 8.8.0
dev: false
/pg-protocol/1.5.0:
resolution: {integrity: sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==}
/pg-types/2.2.0:
resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
engines: {node: '>=4'}
dependencies:
pg-int8: 1.0.1
postgres-array: 2.0.0
postgres-bytea: 1.0.0
postgres-date: 1.0.7
postgres-interval: 1.2.0
/pg/8.8.0:
resolution: {integrity: sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==}
engines: {node: '>= 8.0.0'}
peerDependencies:
pg-native: '>=3.0.1'
peerDependenciesMeta:
pg-native:
optional: true
dependencies:
buffer-writer: 2.0.0
packet-reader: 1.0.0
pg-connection-string: 2.5.0
pg-pool: 3.5.2_pg@8.8.0
pg-protocol: 1.5.0
pg-types: 2.2.0
pgpass: 1.0.5
dev: false
/pgpass/1.0.5:
resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
dependencies:
split2: 4.1.0
dev: false
/picocolors/1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
@@ -13607,6 +13699,24 @@ packages:
picocolors: 1.0.0
source-map-js: 1.0.2
/postgres-array/2.0.0:
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
engines: {node: '>=4'}
/postgres-bytea/1.0.0:
resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
engines: {node: '>=0.10.0'}
/postgres-date/1.0.7:
resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
engines: {node: '>=0.10.0'}
/postgres-interval/1.2.0:
resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
engines: {node: '>=0.10.0'}
dependencies:
xtend: 4.0.2
/posthog-js/1.39.4:
resolution: {integrity: sha512-Elpf1gwyuObueXi89iH+9pP+WhpkiivP8Qwej4RzOLwSTa7Floaa4rgAw7rnCnX1PtRoJ3F0kqb6q9T+aZjRiA==}
dependencies:
@@ -13962,6 +14072,15 @@ packages:
shallow-equal: 1.2.1
dev: false
/react-dom/18.2.0:
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies:
react: ^18.2.0
dependencies:
loose-envify: 1.4.0
scheduler: 0.23.0
dev: false
/react-dom/18.2.0_react@18.2.0:
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies:
@@ -15129,6 +15248,11 @@ packages:
through: 2.3.8
dev: true
/split2/4.1.0:
resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==}
engines: {node: '>= 10.x'}
dev: false
/sprintf-js/1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}