diff --git a/apps/api/package.json b/apps/api/package.json index c088cb521..b5dcb5823 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -16,7 +16,7 @@ "dependencies": { "@breejs/ts-worker": "2.0.0", "@fastify/autoload": "5.2.0", - "@fastify/cookie": "7.3.1", + "@fastify/cookie": "8.0.0", "@fastify/cors": "8.1.0", "@fastify/env": "4.1.0", "@fastify/jwt": "6.3.2", @@ -29,13 +29,13 @@ "cabin": "9.1.2", "compare-versions": "4.1.3", "cuid": "2.1.8", - "dayjs": "1.11.4", - "dockerode": "3.3.3", + "dayjs": "1.11.5", + "dockerode": "3.3.4", "dotenv-extended": "2.9.0", - "fastify": "4.4.0", - "fastify-plugin": "4.1.0", + "execa": "6.1.0", + "fastify": "4.5.2", + "fastify-plugin": "4.2.0", "generate-password": "1.7.0", - "get-port": "6.1.2", "got": "12.3.1", "is-ip": "5.0.0", "is-port-reachable": "4.0.0", @@ -50,12 +50,12 @@ "unique-names-generator": "4.7.1" }, "devDependencies": { - "@types/node": "18.6.5", + "@types/node": "18.7.11", "@types/node-os-utils": "1.3.0", - "@typescript-eslint/eslint-plugin": "5.33.0", - "@typescript-eslint/parser": "5.33.0", - "esbuild": "0.15.0", - "eslint": "8.21.0", + "@typescript-eslint/eslint-plugin": "5.34.0", + "@typescript-eslint/parser": "5.34.0", + "esbuild": "0.15.5", + "eslint": "8.22.0", "eslint-config-prettier": "8.5.0", "eslint-plugin-prettier": "4.2.1", "nodemon": "2.0.19", diff --git a/apps/api/prisma/migrations/20220823070532_service_searxng/migration.sql b/apps/api/prisma/migrations/20220823070532_service_searxng/migration.sql new file mode 100644 index 000000000..81ecc81c8 --- /dev/null +++ b/apps/api/prisma/migrations/20220823070532_service_searxng/migration.sql @@ -0,0 +1,13 @@ +-- CreateTable +CREATE TABLE "Searxng" ( + "id" TEXT NOT NULL PRIMARY KEY, + "secretKey" TEXT NOT NULL, + "redisPassword" TEXT NOT NULL, + "serviceId" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "Searxng_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateIndex +CREATE UNIQUE INDEX "Searxng_serviceId_key" ON "Searxng"("serviceId"); diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index d4a7ce2f5..02440300b 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -327,23 +327,23 @@ model Service { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt destinationDocker DestinationDocker? @relation(fields: [destinationDockerId], references: [id]) - - fider Fider? - ghost Ghost? - glitchTip GlitchTip? - hasura Hasura? - meiliSearch MeiliSearch? - minio Minio? - moodle Moodle? - plausibleAnalytics PlausibleAnalytics? persistentStorage ServicePersistentStorage[] serviceSecret ServiceSecret[] - umami Umami? - vscodeserver Vscodeserver? - wordpress Wordpress? - appwrite Appwrite? + teams Team[] - teams Team[] + fider Fider? + ghost Ghost? + glitchTip GlitchTip? + hasura Hasura? + meiliSearch MeiliSearch? + minio Minio? + moodle Moodle? + plausibleAnalytics PlausibleAnalytics? + umami Umami? + vscodeserver Vscodeserver? + wordpress Wordpress? + appwrite Appwrite? + searxng Searxng? } model PlausibleAnalytics { @@ -545,3 +545,13 @@ model GlitchTip { updatedAt DateTime @updatedAt service Service @relation(fields: [serviceId], references: [id]) } + +model Searxng { + id String @id @default(cuid()) + secretKey String + redisPassword String + serviceId String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + service Service @relation(fields: [serviceId], references: [id]) +} diff --git a/apps/api/src/lib/buildPacks/common.ts b/apps/api/src/lib/buildPacks/common.ts index 6684664d6..be907ee7e 100644 --- a/apps/api/src/lib/buildPacks/common.ts +++ b/apps/api/src/lib/buildPacks/common.ts @@ -541,9 +541,6 @@ export async function buildImage({ } else { await saveBuildLog({ line: `Building image started.`, buildId, applicationId }); } - if (debug) { - await saveBuildLog({ line: `\n###############\nIMPORTANT: Due to some issues during implementing Remote Docker Engine, the builds logs are not streamed at the moment - but will be soon! You will see the full build log when the build is finished!\n###############`, buildId, applicationId }); - } if (!debug && isCache) { await saveBuildLog({ line: `Debug turned off. To see more details, allow it in the configuration.`, @@ -553,54 +550,7 @@ export async function buildImage({ } const dockerFile = isCache ? `${dockerFileLocation}-cache` : `${dockerFileLocation}` const cache = `${applicationId}:${tag}${isCache ? '-cache' : ''}` - const { stderr } = await executeDockerCmd({ dockerId, command: `docker build --progress plain -f ${workdir}/${dockerFile} -t ${cache} ${workdir}` }) - if (debug) { - const array = stderr.split('\n') - for (const line of array) { - if (line !== '\n') { - await saveBuildLog({ - line: `${line.replace('\n', '')}`, - buildId, - applicationId - }); - } - } - } - - - // await new Promise((resolve, reject) => { - // const command = spawn(`docker`, ['build', '-f', `${workdir}${dockerFile}`, '-t', `${cache}`,`${workdir}`], { - // env: { - // DOCKER_HOST: 'ssh://root@95.217.178.202', - // DOCKER_BUILDKIT: '1' - // } - // }); - // command.stdout.on('data', function (data) { - // console.log('stdout: ' + data); - // }); - // command.stderr.on('data', function (data) { - // console.log('stderr: ' + data); - // }); - // command.on('error', function (error) { - // console.log(error) - // reject(error) - // }) - // command.on('exit', function (code) { - // console.log('exit code: ' + code); - // resolve(code) - // }); - // }) - - - // console.log({ stdout, stderr }) - // const stream = await docker.engine.buildImage( - // { src: ['.'], context: workdir }, - // { - // dockerfile: isCache ? `${dockerFileLocation}-cache` : dockerFileLocation, - // t: `${applicationId}:${tag}${isCache ? '-cache' : ''}` - // } - // ); - // await streamEvents({ stream, docker, buildId, applicationId, debug }); + await executeDockerCmd({ debug, buildId, applicationId, dockerId, command: `docker build --progress plain -f ${workdir}/${dockerFile} -t ${cache} ${workdir}` }) if (isCache) { await saveBuildLog({ line: `Building cache image successful.`, buildId, applicationId }); } else { diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 2985728a8..1a78a47af 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -1,4 +1,4 @@ -import child from 'child_process'; +import { exec } from 'node:child_process' import util from 'util'; import fs from 'fs/promises'; import yaml from 'js-yaml'; @@ -16,8 +16,9 @@ import sshConfig from 'ssh-config' import { checkContainer, removeContainer } from './docker'; import { day } from './dayjs'; import * as serviceFields from './serviceFields' +import { saveBuildLog } from './buildPacks/common'; -export const version = '3.7.0'; +export const version = '3.8.0'; export const isDev = process.env.NODE_ENV === 'development'; const algorithm = 'aes-256-ctr'; @@ -81,10 +82,56 @@ export const include: any = { moodle: true, appwrite: true, glitchTip: true, + searxng: true }; export const uniqueName = (): string => uniqueNamesGenerator(customConfig); -export const asyncExecShell = util.promisify(child.exec); +export const asyncExecShell = util.promisify(exec); +export const asyncExecShellStream = async ({ debug, buildId, applicationId, command, engine }: { debug: boolean, buildId: string, applicationId: string, command: string, engine: string }) => { + return await new Promise(async (resolve, reject) => { + const { execaCommand } = await import('execa') + const subprocess = execaCommand(command, { env: { DOCKER_BUILDKIT: "1", DOCKER_HOST: engine } }) + if (debug) { + await saveBuildLog({ line: `=========================`, buildId, applicationId }); + subprocess.stdout.on('data', async (data) => { + const stdout = data.toString(); + const array = stdout.split('\n') + for (const line of array) { + if (line !== '\n' && line !== '') { + await saveBuildLog({ + line: `${line.replace('\n', '')}`, + buildId, + applicationId + }); + } + } + }) + subprocess.stderr.on('data', async (data) => { + const stderr = data.toString(); + const array = stderr.split('\n') + for (const line of array) { + if (line !== '\n' && line !== '') { + await saveBuildLog({ + line: `${line.replace('\n', '')}`, + buildId, + applicationId + }); + } + } + }) + } + subprocess.on('exit', async (code) => { + await asyncSleep(1000); + await saveBuildLog({ line: `=========================`, buildId, applicationId }); + if (code === 0) { + resolve(code) + } else { + reject(code) + } + }) + }) +} + export const asyncSleep = (delay: number): Promise => new Promise((resolve) => setTimeout(resolve, delay)); export const prisma = new PrismaClient({ @@ -311,6 +358,17 @@ export const supportedServiceTypesAndVersions = [ main: 8000 } }, + { + name: 'searxng', + fancyName: 'SearXNG', + baseImage: 'searxng/searxng', + images: [], + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 8080 + } + }, ]; export async function checkDoubleBranch(branch: string, projectId: number): Promise { @@ -545,21 +603,38 @@ export const supportedDatabaseTypesAndVersions = [ } ]; -export async function getFreeSSHLocalPort(id: string): Promise { - const { default: getPort, portNumbers } = await import('get-port'); +export async function getFreeSSHLocalPort(id: string): Promise { + const { default: isReachable } = await import('is-port-reachable'); const { remoteIpAddress, sshLocalPort } = await prisma.destinationDocker.findUnique({ where: { id } }) if (sshLocalPort) { return Number(sshLocalPort) } + + const data = await prisma.setting.findFirst(); + const { minPort, maxPort } = data; + const ports = await prisma.destinationDocker.findMany({ where: { sshLocalPort: { not: null }, remoteIpAddress: { not: remoteIpAddress } } }) - const alreadyConfigured = await prisma.destinationDocker.findFirst({ where: { remoteIpAddress, id: { not: id }, sshLocalPort: { not: null } } }) + + const alreadyConfigured = await prisma.destinationDocker.findFirst({ + where: { + remoteIpAddress, id: { not: id }, sshLocalPort: { not: null } + } + }) if (alreadyConfigured?.sshLocalPort) { await prisma.destinationDocker.update({ where: { id }, data: { sshLocalPort: alreadyConfigured.sshLocalPort } }) return Number(alreadyConfigured.sshLocalPort) } - const availablePort = await getPort({ port: portNumbers(10000, 10100), exclude: ports.map(p => p.sshLocalPort) }) - await prisma.destinationDocker.update({ where: { id }, data: { sshLocalPort: Number(availablePort) } }) - return Number(availablePort) + const range = generateRangeArray(minPort, maxPort) + console.log({ ports }) + const availablePorts = range.filter(port => !ports.map(p => p.sshLocalPort).includes(port)) + for (const port of availablePorts) { + const found = await isReachable(port, { host: 'localhost' }) + if (!found) { + await prisma.destinationDocker.update({ where: { id }, data: { sshLocalPort: Number(port) } }) + return Number(port) + } + } + return false } export async function createRemoteEngineConfiguration(id: string) { @@ -591,7 +666,7 @@ export async function createRemoteEngineConfiguration(id: string) { config.append({ Host: remoteIpAddress, Hostname: 'localhost', - Port: Number(localPort), + Port: localPort.toString(), User: remoteUser, IdentityFile: sshKeyFile, StrictHostKeyChecking: 'no' @@ -604,7 +679,7 @@ export async function createRemoteEngineConfiguration(id: string) { } return await fs.writeFile(`${homedir}/.ssh/config`, sshConfig.stringify(config)) } -export async function executeDockerCmd({ dockerId, command }: { dockerId: string, command: string }) { +export async function executeDockerCmd({ debug, buildId, applicationId, dockerId, command }: { debug?: boolean, buildId?: string, applicationId?: string, dockerId: string, command: string }): Promise { let { remoteEngine, remoteIpAddress, engine } = await prisma.destinationDocker.findUnique({ where: { id: dockerId } }) if (remoteEngine) { await createRemoteEngineConfiguration(dockerId) @@ -617,6 +692,9 @@ export async function executeDockerCmd({ dockerId, command }: { dockerId: string command = command.replace(/docker compose/gi, 'docker-compose') } } + if (command.startsWith(`docker build --progress plain`)) { + return await asyncExecShellStream({ debug, buildId, applicationId, command, engine }); + } return await asyncExecShell( `DOCKER_BUILDKIT=1 DOCKER_HOST="${engine}" ${command}` ); @@ -736,13 +814,18 @@ export async function listSettings(): Promise { } -export function generatePassword(length = 24, symbols = false): string { - return generator.generate({ +export function generatePassword({ length = 24, symbols = false, isHex = false }: { length?: number, symbols?: boolean, isHex?: boolean } | null): string { + if (isHex) { + return crypto.randomBytes(length).toString("hex"); + } + const password = generator.generate({ length, numbers: true, strict: true, symbols }); + + return password; } export function generateDatabaseConfiguration(database: any, arch: string): @@ -1208,7 +1291,7 @@ export async function checkExposedPort({ id, configuredPort, exposePort, dockerI } } export async function getFreeExposedPort(id, exposePort, dockerId, remoteIpAddress) { - const { default: getPort } = await import('get-port'); + const { default: checkPort } = await import('is-port-reachable'); const applicationUsed = await ( await prisma.application.findMany({ where: { exposePort: { not: null }, id: { not: id }, destinationDockerId: dockerId }, @@ -1222,22 +1305,23 @@ export async function getFreeExposedPort(id, exposePort, dockerId, remoteIpAddre }) ).map((a) => a.exposePort); const usedPorts = [...applicationUsed, ...serviceUsed]; - if (remoteIpAddress) { - const { default: checkPort } = await import('is-port-reachable'); - const found = await checkPort(exposePort, { host: remoteIpAddress }); - if (!found) { - return exposePort - } + if (usedPorts.includes(exposePort)) { return false } - return await getPort({ port: Number(exposePort), exclude: usedPorts }); + const found = await checkPort(exposePort, { host: remoteIpAddress || 'localhost' }); + if (!found) { + return exposePort + } + return false } +export function generateRangeArray(start, end) { + return Array.from({ length: (end - start) }, (v, k) => k + start); +} export async function getFreePublicPort(id, dockerId) { - const { default: getPort, portNumbers } = await import('get-port'); + const { default: isReachable } = await import('is-port-reachable'); const data = await prisma.setting.findFirst(); const { minPort, maxPort } = data; - const dbUsed = await ( await prisma.database.findMany({ where: { publicPort: { not: null }, id: { not: id }, destinationDockerId: dockerId }, @@ -1263,7 +1347,15 @@ export async function getFreePublicPort(id, dockerId) { }) ).map((a) => a.publicPort); const usedPorts = [...dbUsed, ...wpFtpUsed, ...wpUsed, ...minioUsed]; - return await getPort({ port: portNumbers(minPort, maxPort), exclude: usedPorts }); + const range = generateRangeArray(minPort, maxPort) + const availablePorts = range.filter(port => !usedPorts.includes(port)) + for (const port of availablePorts) { + const found = await isReachable(port, { host: 'localhost' }) + if (!found) { + return port + } + } + return false } export async function startTraefikTCPProxy( @@ -1392,11 +1484,11 @@ export async function configureServiceType({ type: string; }): Promise { if (type === 'plausibleanalytics') { - const password = encrypt(generatePassword()); + const password = encrypt(generatePassword({})); const postgresqlUser = cuid(); - const postgresqlPassword = encrypt(generatePassword()); + const postgresqlPassword = encrypt(generatePassword({})); const postgresqlDatabase = 'plausibleanalytics'; - const secretKeyBase = encrypt(generatePassword(64)); + const secretKeyBase = encrypt(generatePassword({ length: 64 })); await prisma.service.update({ where: { id }, @@ -1420,22 +1512,22 @@ export async function configureServiceType({ }); } else if (type === 'minio') { const rootUser = cuid(); - const rootUserPassword = encrypt(generatePassword()); + const rootUserPassword = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, data: { type, minio: { create: { rootUser, rootUserPassword } } } }); } else if (type === 'vscodeserver') { - const password = encrypt(generatePassword()); + const password = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, data: { type, vscodeserver: { create: { password } } } }); } else if (type === 'wordpress') { const mysqlUser = cuid(); - const mysqlPassword = encrypt(generatePassword()); + const mysqlPassword = encrypt(generatePassword({})); const mysqlRootUser = cuid(); - const mysqlRootUserPassword = encrypt(generatePassword()); + const mysqlRootUserPassword = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, data: { @@ -1473,11 +1565,11 @@ export async function configureServiceType({ }); } else if (type === 'ghost') { const defaultEmail = `${cuid()}@example.com`; - const defaultPassword = encrypt(generatePassword()); + const defaultPassword = encrypt(generatePassword({})); const mariadbUser = cuid(); - const mariadbPassword = encrypt(generatePassword()); + const mariadbPassword = encrypt(generatePassword({})); const mariadbRootUser = cuid(); - const mariadbRootUserPassword = encrypt(generatePassword()); + const mariadbRootUserPassword = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, @@ -1496,7 +1588,7 @@ export async function configureServiceType({ } }); } else if (type === 'meilisearch') { - const masterKey = encrypt(generatePassword(32)); + const masterKey = encrypt(generatePassword({ length: 32 })); await prisma.service.update({ where: { id }, data: { @@ -1505,11 +1597,11 @@ export async function configureServiceType({ } }); } else if (type === 'umami') { - const umamiAdminPassword = encrypt(generatePassword()); + const umamiAdminPassword = encrypt(generatePassword({})); const postgresqlUser = cuid(); - const postgresqlPassword = encrypt(generatePassword()); + const postgresqlPassword = encrypt(generatePassword({})); const postgresqlDatabase = 'umami'; - const hashSalt = encrypt(generatePassword(64)); + const hashSalt = encrypt(generatePassword({ length: 64 })); await prisma.service.update({ where: { id }, data: { @@ -1527,9 +1619,9 @@ export async function configureServiceType({ }); } else if (type === 'hasura') { const postgresqlUser = cuid(); - const postgresqlPassword = encrypt(generatePassword()); + const postgresqlPassword = encrypt(generatePassword({})); const postgresqlDatabase = 'hasura'; - const graphQLAdminPassword = encrypt(generatePassword()); + const graphQLAdminPassword = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, data: { @@ -1546,9 +1638,9 @@ export async function configureServiceType({ }); } else if (type === 'fider') { const postgresqlUser = cuid(); - const postgresqlPassword = encrypt(generatePassword()); + const postgresqlPassword = encrypt(generatePassword({})); const postgresqlDatabase = 'fider'; - const jwtSecret = encrypt(generatePassword(64, true)); + const jwtSecret = encrypt(generatePassword({ length: 64, symbols: true })); await prisma.service.update({ where: { id }, data: { @@ -1565,13 +1657,13 @@ export async function configureServiceType({ }); } else if (type === 'moodle') { const defaultUsername = cuid(); - const defaultPassword = encrypt(generatePassword()); + const defaultPassword = encrypt(generatePassword({})); const defaultEmail = `${cuid()} @example.com`; const mariadbUser = cuid(); - const mariadbPassword = encrypt(generatePassword()); + const mariadbPassword = encrypt(generatePassword({})); const mariadbDatabase = 'moodle_db'; const mariadbRootUser = cuid(); - const mariadbRootUserPassword = encrypt(generatePassword()); + const mariadbRootUserPassword = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, data: { @@ -1591,15 +1683,15 @@ export async function configureServiceType({ } }); } else if (type === 'appwrite') { - const opensslKeyV1 = encrypt(generatePassword()); - const executorSecret = encrypt(generatePassword()); - const redisPassword = encrypt(generatePassword()); + const opensslKeyV1 = encrypt(generatePassword({})); + const executorSecret = encrypt(generatePassword({})); + const redisPassword = encrypt(generatePassword({})); const mariadbHost = `${id}-mariadb` const mariadbUser = cuid(); - const mariadbPassword = encrypt(generatePassword()); + const mariadbPassword = encrypt(generatePassword({})); const mariadbDatabase = 'appwrite'; const mariadbRootUser = cuid(); - const mariadbRootUserPassword = encrypt(generatePassword()); + const mariadbRootUserPassword = encrypt(generatePassword({})); await prisma.service.update({ where: { id }, data: { @@ -1622,11 +1714,11 @@ export async function configureServiceType({ } else if (type === 'glitchTip') { const defaultUsername = cuid(); const defaultEmail = `${defaultUsername}@example.com`; - const defaultPassword = encrypt(generatePassword()); + const defaultPassword = encrypt(generatePassword({})); const postgresqlUser = cuid(); - const postgresqlPassword = encrypt(generatePassword()); + const postgresqlPassword = encrypt(generatePassword({})); const postgresqlDatabase = 'glitchTip'; - const secretKeyBase = encrypt(generatePassword(64)); + const secretKeyBase = encrypt(generatePassword({ length: 64 })); await prisma.service.update({ where: { id }, @@ -1645,7 +1737,22 @@ export async function configureServiceType({ } } }); - } else { + } else if (type === 'searxng') { + const secretKey = encrypt(generatePassword({ length: 32, isHex: true })) + const redisPassword = encrypt(generatePassword({})); + await prisma.service.update({ + where: { id }, + data: { + type, + searxng: { + create: { + secretKey, + redisPassword, + } + } + } + }); + } else { await prisma.service.update({ where: { id }, data: { @@ -1670,6 +1777,7 @@ export async function removeService({ id }: { id: string }): Promise { await prisma.glitchTip.deleteMany({ where: { serviceId: id } }); await prisma.moodle.deleteMany({ where: { serviceId: id } }); await prisma.appwrite.deleteMany({ where: { serviceId: id } }); + await prisma.searxng.deleteMany({ where: { serviceId: id } }); await prisma.service.delete({ where: { id } }); } @@ -1769,11 +1877,11 @@ export async function stopBuild(buildId, applicationId) { clearInterval(interval); return resolve(); } - if (count > 100) { + if (count > 50) { clearInterval(interval); return reject(new Error('Build canceled')); } - const { stdout: buildContainers } = await executeDockerCmd({ dockerId, command: `docker container ls--filter "label=coolify.buildId=${buildId}" --format '{{json .}}'` }) + const { stdout: buildContainers } = await executeDockerCmd({ dockerId, command: `docker container ls --filter "label=coolify.buildId=${buildId}" --format '{{json .}}'` }) if (buildContainers) { const containersArray = buildContainers.trim().split('\n'); for (const container of containersArray) { @@ -1781,14 +1889,15 @@ export async function stopBuild(buildId, applicationId) { const id = containerObj.ID; if (!containerObj.Names.startsWith(`${applicationId} `)) { await removeContainer({ id, dockerId }); - await cleanupDB(buildId); clearInterval(interval); return resolve(); } } } count++; - } catch (error) { } + } catch (error) { } finally { + await cleanupDB(buildId); + } }, 100); }); } diff --git a/apps/api/src/lib/serviceFields.ts b/apps/api/src/lib/serviceFields.ts index d0adba9fd..a9d5b379a 100644 --- a/apps/api/src/lib/serviceFields.ts +++ b/apps/api/src/lib/serviceFields.ts @@ -671,3 +671,20 @@ export const glitchTip = [{ isBoolean: true, isEncrypted: false }] + +export const searxng = [{ + name: 'secretKey', + isEditable: false, + isLowerCase: false, + isNumber: false, + isBoolean: false, + isEncrypted: true +}, +{ + name: 'redisPassword', + isEditable: false, + isLowerCase: false, + isNumber: false, + isBoolean: false, + isEncrypted: true +}] \ No newline at end of file diff --git a/apps/api/src/routes/api/v1/applications/handlers.ts b/apps/api/src/routes/api/v1/applications/handlers.ts index 65932ea2b..2abf30b3a 100644 --- a/apps/api/src/routes/api/v1/applications/handlers.ts +++ b/apps/api/src/routes/api/v1/applications/handlers.ts @@ -239,8 +239,8 @@ export async function saveApplication(request: FastifyRequest, exposePort = Number(exposePort); } - const { destinationDockerId } = await prisma.application.findUnique({ where: { id } }) - if (exposePort) await checkExposedPort({ id, exposePort, dockerId: destinationDockerId }) + const { destinationDocker: { id: dockerId, remoteIpAddress } } = await prisma.application.findUnique({ where: { id }, include: { destinationDocker: true } }) + if (exposePort) await checkExposedPort({ id, exposePort, dockerId, remoteIpAddress }) if (denoOptions) denoOptions = denoOptions.trim(); const defaultConfiguration = await setDefaultConfiguration({ buildPack, diff --git a/apps/api/src/routes/api/v1/databases/handlers.ts b/apps/api/src/routes/api/v1/databases/handlers.ts index 96c740440..8372fb76d 100644 --- a/apps/api/src/routes/api/v1/databases/handlers.ts +++ b/apps/api/src/routes/api/v1/databases/handlers.ts @@ -29,9 +29,9 @@ export async function newDatabase(request: FastifyRequest, reply: FastifyReply) const name = uniqueName(); const dbUser = cuid(); - const dbUserPassword = encrypt(generatePassword()); + const dbUserPassword = encrypt(generatePassword({})); const rootUser = cuid(); - const rootUserPassword = encrypt(generatePassword()); + const rootUserPassword = encrypt(generatePassword({})); const defaultDatabase = cuid(); const { id } = await prisma.database.create({ @@ -433,9 +433,13 @@ export async function saveDatabaseSettings(request: FastifyRequest) { if (type === 'glitchTip') { return await startGlitchTipService(request) } + if (type === 'searxng') { + return await startSearXNGService(request) + } throw `Service type ${type} not supported.` } catch (error) { throw { status: 500, message: error?.message || error } @@ -591,56 +594,6 @@ export async function startService(request: FastifyRequest) { export async function stopService(request: FastifyRequest) { try { return await stopServiceContainers(request) - // const { type } = request.params - // if (type === 'plausibleanalytics') { - // return await stopPlausibleAnalyticsService(request) - // } - // if (type === 'nocodb') { - // return await stopNocodbService(request) - // } - // if (type === 'minio') { - // return await stopMinioService(request) - // } - // if (type === 'vscodeserver') { - // return await stopVscodeService(request) - // } - // if (type === 'wordpress') { - // return await stopWordpressService(request) - // } - // if (type === 'vaultwarden') { - // return await stopVaultwardenService(request) - // } - // if (type === 'languagetool') { - // return await stopLanguageToolService(request) - // } - // if (type === 'n8n') { - // return await stopN8nService(request) - // } - // if (type === 'uptimekuma') { - // return await stopUptimekumaService(request) - // } - // if (type === 'ghost') { - // return await stopGhostService(request) - // } - // if (type === 'meilisearch') { - // return await stopMeilisearchService(request) - // } - // if (type === 'umami') { - // return await stopUmamiService(request) - // } - // if (type === 'hasura') { - // return await stopHasuraService(request) - // } - // if (type === 'fider') { - // return await stopFiderService(request) - // } - // if (type === 'moodle') { - // return await stopMoodleService(request) - // } - // if (type === 'glitchTip') { - // return await stopGlitchTipService(request) - // } - // throw `Service type ${type} not supported.` } catch (error) { throw { status: 500, message: error?.message || error } } @@ -2415,6 +2368,7 @@ async function startAppWriteService(request: FastifyRequest) { } async function startServiceContainers(dockerId, composeFileDestination) { await executeDockerCmd({ dockerId, command: `docker compose -f ${composeFileDestination} pull` }) + await executeDockerCmd({ dockerId, command: `docker compose -f ${composeFileDestination} build --no-cache` }) await executeDockerCmd({ dockerId, command: `docker compose -f ${composeFileDestination} create` }) await executeDockerCmd({ dockerId, command: `docker compose -f ${composeFileDestination} start` }) await asyncSleep(1000); @@ -2662,37 +2616,19 @@ async function startGlitchTipService(request: FastifyRequest) container_name: id, image: config.glitchTip.image, environment: config.glitchTip.environmentVariables, - networks: [network], volumes, - restart: 'always', labels: makeLabelForServices('glitchTip'), ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), - deploy: { - restart_policy: { - condition: 'on-failure', - delay: '5s', - max_attempts: 3, - window: '120s' - } - }, - depends_on: [`${id}-postgresql`, `${id}-redis`] + depends_on: [`${id}-postgresql`, `${id}-redis`], + ...defaultComposeConfiguration(network), }, [`${id}-worker`]: { container_name: `${id}-worker`, image: config.glitchTip.image, command: './bin/run-celery-with-beat.sh', environment: config.glitchTip.environmentVariables, - networks: [network], - restart: 'always', - deploy: { - restart_policy: { - condition: 'on-failure', - delay: '5s', - max_attempts: 3, - window: '120s' - } - }, - depends_on: [`${id}-postgresql`, `${id}-redis`] + depends_on: [`${id}-postgresql`, `${id}-redis`], + ...defaultComposeConfiguration(network), }, [`${id}-setup`]: { container_name: `${id}-setup`, @@ -2707,32 +2643,14 @@ async function startGlitchTipService(request: FastifyRequest) image: config.postgresql.image, container_name: `${id}-postgresql`, environment: config.postgresql.environmentVariables, - networks: [network], volumes: [config.postgresql.volume], - restart: 'always', - deploy: { - restart_policy: { - condition: 'on-failure', - delay: '5s', - max_attempts: 3, - window: '120s' - } - } + ...defaultComposeConfiguration(network), }, [`${id}-redis`]: { image: config.redis.image, container_name: `${id}-redis`, - networks: [network], volumes: [config.redis.volume], - restart: 'always', - deploy: { - restart_policy: { - condition: 'on-failure', - delay: '5s', - max_attempts: 3, - window: '120s' - } - } + ...defaultComposeConfiguration(network), } }, networks: { @@ -2761,54 +2679,93 @@ async function startGlitchTipService(request: FastifyRequest) return errorHandler({ status, message }) } } -async function stopGlitchTipService(request: FastifyRequest) { + +async function startSearXNGService(request: FastifyRequest) { try { const { id } = request.params; const teamId = request.user.teamId; const service = await getServiceFromDB({ id, teamId }); - const { destinationDockerId, destinationDocker } = service; - if (destinationDockerId) { - try { - const found = await checkContainer({ dockerId: destinationDocker.id, container: id }); - if (found) { - await removeContainer({ id, dockerId: destinationDocker.id }); - } - } catch (error) { - console.error(error); - } - try { - const found = await checkContainer({ dockerId: destinationDocker.id, container: `${id}-worker` }); - if (found) { - await removeContainer({ id: `${id}-worker`, dockerId: destinationDocker.id }); - } - } catch (error) { - console.error(error); - } - try { - const found = await checkContainer({ dockerId: destinationDocker.id, container: `${id}-setup` }); - if (found) { - await removeContainer({ id: `${id}-setup`, dockerId: destinationDocker.id }); - } - } catch (error) { - console.error(error); - } - try { - const found = await checkContainer({ dockerId: destinationDocker.id, container: `${id}-postgresql` }); - if (found) { - await removeContainer({ id: `${id}-postgresql`, dockerId: destinationDocker.id }); - } - } catch (error) { - console.error(error); - } - try { - const found = await checkContainer({ dockerId: destinationDocker.id, container: `${id}-redis` }); - if (found) { - await removeContainer({ id: `${id}-redis`, dockerId: destinationDocker.id }); - } - } catch (error) { - console.error(error); + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort, persistentStorage, fqdn, searxng: { secretKey, redisPassword } } = + service; + const network = destinationDockerId && destinationDocker.network; + const port = getServiceMainPort('searxng'); + + const { workdir } = await createDirectories({ repository: type, buildId: id }); + const image = getServiceImage(type); + + const config = { + searxng: { + image: `${image}:${version}`, + volume: `${id}-searxng:/etc/searxng`, + environmentVariables: { + SEARXNG_BASE_URL: `${fqdn}` + }, + }, + redis: { + image: 'redis:7-alpine', } + }; + + const settingsYml = ` + # see https://docs.searxng.org/admin/engines/settings.html#use-default-settings + use_default_settings: true + server: + secret_key: ${secretKey} + limiter: true + image_proxy: true + ui: + static_use_hash: true + redis: + url: redis://:${redisPassword}@${id}-redis:6379/0` + + const Dockerfile = ` + FROM ${config.searxng.image} + COPY ./settings.yml /etc/searxng/settings.yml`; + + if (serviceSecret.length > 0) { + serviceSecret.forEach((secret) => { + config.searxng.environmentVariables[secret.name] = secret.value; + }); } + const { volumes, volumeMounts } = persistentVolumes(id, persistentStorage, config) + const composeFile: ComposeFile = { + version: '3.8', + services: { + [id]: { + build: workdir, + container_name: id, + volumes, + environment: config.searxng.environmentVariables, + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), + labels: makeLabelForServices('searxng'), + cap_drop: ['ALL'], + cap_add: ['CHOWN', 'SETGID', 'SETUID', 'DAC_OVERRIDE'], + depends_on: [`${id}-redis`], + ...defaultComposeConfiguration(network), + }, + [`${id}-redis`]: { + container_name: `${id}-redis`, + image: config.redis.image, + command: `redis-server --requirepass ${redisPassword} --save "" --appendonly "no"`, + labels: makeLabelForServices('searxng'), + cap_drop: ['ALL'], + cap_add: ['SETGID', 'SETUID', 'DAC_OVERRIDE'], + ...defaultComposeConfiguration(network), + }, + }, + networks: { + [network]: { + external: true + } + }, + volumes: volumeMounts + }; + const composeFileDestination = `${workdir}/docker-compose.yaml`; + await fs.writeFile(composeFileDestination, yaml.dump(composeFile)); + await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile); + await fs.writeFile(`${workdir}/settings.yml`, settingsYml); + + await startServiceContainers(destinationDocker.id, composeFileDestination) return {} } catch ({ status, message }) { return errorHandler({ status, message }) @@ -2865,7 +2822,7 @@ export async function activateWordpressFtp(request: FastifyRequest diff --git a/apps/ui/src/lib/components/svg/services/Searxng.svelte b/apps/ui/src/lib/components/svg/services/Searxng.svelte new file mode 100644 index 000000000..52cbaed81 --- /dev/null +++ b/apps/ui/src/lib/components/svg/services/Searxng.svelte @@ -0,0 +1,57 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte index fb89bf898..754068e2d 100644 --- a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte +++ b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte @@ -38,4 +38,6 @@ {:else if type === 'glitchTip'} +{:else if type === 'searxng'} + {/if} diff --git a/apps/ui/src/lib/components/svg/services/index.ts b/apps/ui/src/lib/components/svg/services/index.ts index 30b37922a..15fa32f90 100644 --- a/apps/ui/src/lib/components/svg/services/index.ts +++ b/apps/ui/src/lib/components/svg/services/index.ts @@ -16,3 +16,4 @@ export { default as Fider } from './Fider.svelte'; export { default as Appwrite } from './Appwrite.svelte'; export { default as Moodle } from './Moodle.svelte'; export { default as GlitchTip } from './GlitchTip.svelte'; +export { default as Searxng } from './Searxng.svelte'; \ No newline at end of file diff --git a/apps/ui/src/routes/applications/[id]/secrets.svelte b/apps/ui/src/routes/applications/[id]/secrets.svelte index 39f6ee3e9..8570d0546 100644 --- a/apps/ui/src/routes/applications/[id]/secrets.svelte +++ b/apps/ui/src/routes/applications/[id]/secrets.svelte @@ -43,7 +43,8 @@ const batchSecretsPairs = eachValuePair .filter((secret) => !secret.startsWith('#') && secret) .map((secret) => { - const [name, value] = secret.split('='); + const [name, ...rest] = secret.split('='); + const value = rest.join('='); const cleanValue = value?.replaceAll('"', '') || ''; return { name, diff --git a/apps/ui/src/routes/applications/index.svelte b/apps/ui/src/routes/applications/index.svelte index 6dbb09ee4..60644e16d 100644 --- a/apps/ui/src/routes/applications/index.svelte +++ b/apps/ui/src/routes/applications/index.svelte @@ -64,7 +64,7 @@ {/if} -
+
{#if !applications || ownApplications.length === 0}
{$t('application.no_applications_found')}
diff --git a/apps/ui/src/routes/databases/index.svelte b/apps/ui/src/routes/databases/index.svelte index c14c9c3f3..04dbeb768 100644 --- a/apps/ui/src/routes/databases/index.svelte +++ b/apps/ui/src/routes/databases/index.svelte @@ -61,7 +61,7 @@
-
+
{#if !databases || ownDatabases.length === 0}
{$t('database.no_databases_found')}
diff --git a/apps/ui/src/routes/destinations/index.svelte b/apps/ui/src/routes/destinations/index.svelte index 4c8696780..27656cdb7 100644 --- a/apps/ui/src/routes/destinations/index.svelte +++ b/apps/ui/src/routes/destinations/index.svelte @@ -56,7 +56,7 @@ {/if}
-
+
{#if !destinations || ownDestinations.length === 0}
{$t('destination.no_destination_found')}
diff --git a/apps/ui/src/routes/iam/index.svelte b/apps/ui/src/routes/iam/index.svelte index 30e2e0260..e50c2fbdd 100644 --- a/apps/ui/src/routes/iam/index.svelte +++ b/apps/ui/src/routes/iam/index.svelte @@ -212,6 +212,7 @@
+ {#if $appSession.teamId === '0'} + + {/if}
-
+
{#if applications.length > 0} @@ -341,6 +343,8 @@
+ {:else} +
Nothing is configured yet.
{/if} {#if $appSession.teamId === '0'} diff --git a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte index f0136089a..22044229c 100644 --- a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte +++ b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte @@ -57,7 +57,7 @@ {:else if service.type === 'appwrite'} - + {:else if service.type === 'moodle'} @@ -67,4 +67,8 @@ +{:else if service.type === 'searxng'} + + + {/if} diff --git a/apps/ui/src/routes/services/[id]/_Services/_Searxng.svelte b/apps/ui/src/routes/services/[id]/_Services/_Searxng.svelte new file mode 100644 index 000000000..a4d547d58 --- /dev/null +++ b/apps/ui/src/routes/services/[id]/_Services/_Searxng.svelte @@ -0,0 +1,36 @@ + + +
+
SearXNG
+
+ +
+ + +
+
+
Redis
+
+ +
+ + +
diff --git a/apps/ui/src/routes/services/[id]/_Services/_Services.svelte b/apps/ui/src/routes/services/[id]/_Services/_Services.svelte index a755a7d7d..b7d365680 100644 --- a/apps/ui/src/routes/services/[id]/_Services/_Services.svelte +++ b/apps/ui/src/routes/services/[id]/_Services/_Services.svelte @@ -29,6 +29,7 @@ import Wordpress from './_Wordpress.svelte'; import Appwrite from './_Appwrite.svelte'; import Moodle from './_Moodle.svelte'; + import Searxng from './_Searxng.svelte'; const { id } = $page.params; $: isDisabled = @@ -402,6 +403,8 @@ {:else if service.type === 'glitchTip'} + {:else if service.type === 'searxng'} + {/if}
diff --git a/apps/ui/src/routes/services/index.svelte b/apps/ui/src/routes/services/index.svelte index 44b8e6381..fe3bed644 100644 --- a/apps/ui/src/routes/services/index.svelte +++ b/apps/ui/src/routes/services/index.svelte @@ -62,7 +62,7 @@
-
+
{#if !services || ownServices.length === 0}
{$t('service.no_service')}
diff --git a/apps/ui/src/routes/sources/index.svelte b/apps/ui/src/routes/sources/index.svelte index f0e3741da..a5a5f98ff 100644 --- a/apps/ui/src/routes/sources/index.svelte +++ b/apps/ui/src/routes/sources/index.svelte @@ -56,7 +56,7 @@ {/if}
-
+
{#if !sources || ownSources.length === 0}
{$t('source.no_git_sources_found')}
diff --git a/package.json b/package.json index 803ad6d61..99cd0a1e6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coolify", "description": "An open-source & self-hostable Heroku / Netlify alternative.", - "version": "3.7.0", + "version": "3.8.0", "license": "Apache-2.0", "repository": "github:coollabsio/coolify", "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d5078268..45e590081 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,34 +16,34 @@ importers: specifiers: '@breejs/ts-worker': 2.0.0 '@fastify/autoload': 5.2.0 - '@fastify/cookie': 7.3.1 + '@fastify/cookie': 8.0.0 '@fastify/cors': 8.1.0 '@fastify/env': 4.1.0 '@fastify/jwt': 6.3.2 '@fastify/static': 6.5.0 '@iarna/toml': 2.2.5 '@prisma/client': 3.15.2 - '@types/node': 18.6.5 + '@types/node': 18.7.11 '@types/node-os-utils': 1.3.0 - '@typescript-eslint/eslint-plugin': 5.33.0 - '@typescript-eslint/parser': 5.33.0 + '@typescript-eslint/eslint-plugin': 5.34.0 + '@typescript-eslint/parser': 5.34.0 axios: 0.27.2 bcryptjs: 2.4.3 bree: 9.1.2 cabin: 9.1.2 compare-versions: 4.1.3 cuid: 2.1.8 - dayjs: 1.11.4 - dockerode: 3.3.3 + dayjs: 1.11.5 + dockerode: 3.3.4 dotenv-extended: 2.9.0 - esbuild: 0.15.0 - eslint: 8.21.0 + esbuild: 0.15.5 + eslint: 8.22.0 eslint-config-prettier: 8.5.0 eslint-plugin-prettier: 4.2.1 - fastify: 4.4.0 - fastify-plugin: 4.1.0 + execa: 6.1.0 + fastify: 4.5.2 + fastify-plugin: 4.2.0 generate-password: 1.7.0 - get-port: 6.1.2 got: 12.3.1 is-ip: 5.0.0 is-port-reachable: 4.0.0 @@ -63,9 +63,9 @@ importers: typescript: 4.7.4 unique-names-generator: 4.7.1 dependencies: - '@breejs/ts-worker': 2.0.0_bwhsujh6chddr2teptepfka5au + '@breejs/ts-worker': 2.0.0_vko2uubnomvm6mw63pxqdtopyq '@fastify/autoload': 5.2.0 - '@fastify/cookie': 7.3.1 + '@fastify/cookie': 8.0.0 '@fastify/cors': 8.1.0 '@fastify/env': 4.1.0 '@fastify/jwt': 6.3.2 @@ -78,13 +78,13 @@ importers: cabin: 9.1.2 compare-versions: 4.1.3 cuid: 2.1.8 - dayjs: 1.11.4 - dockerode: 3.3.3 + dayjs: 1.11.5 + dockerode: 3.3.4 dotenv-extended: 2.9.0 - fastify: 4.4.0 - fastify-plugin: 4.1.0 + execa: 6.1.0 + fastify: 4.5.2 + fastify-plugin: 4.2.0 generate-password: 1.7.0 - get-port: 6.1.2 got: 12.3.1 is-ip: 5.0.0 is-port-reachable: 4.0.0 @@ -98,14 +98,14 @@ importers: strip-ansi: 7.0.1 unique-names-generator: 4.7.1 devDependencies: - '@types/node': 18.6.5 + '@types/node': 18.7.11 '@types/node-os-utils': 1.3.0 - '@typescript-eslint/eslint-plugin': 5.33.0_njno5y7ry2l2lcmiu4tywxkwnq - '@typescript-eslint/parser': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq - esbuild: 0.15.0 - eslint: 8.21.0 - eslint-config-prettier: 8.5.0_eslint@8.21.0 - eslint-plugin-prettier: 4.2.1_h62lvancfh4b7r6zn2dgodrh5e + '@typescript-eslint/eslint-plugin': 5.34.0_euudt5oqhhodkyae5tf6wjmsda + '@typescript-eslint/parser': 5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq + esbuild: 0.15.5 + eslint: 8.22.0 + eslint-config-prettier: 8.5.0_eslint@8.22.0 + eslint-plugin-prettier: 4.2.1_i2cojdczqdiurzgttlwdgf764e nodemon: 2.0.19 prettier: 2.7.1 prisma: 3.15.2 @@ -202,19 +202,23 @@ packages: regenerator-runtime: 0.13.9 dev: false + /@balena/dockerignore/1.0.2: + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + dev: false + /@breejs/later/4.1.0: resolution: {integrity: sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA==} engines: {node: '>= 10'} dev: false - /@breejs/ts-worker/2.0.0_bwhsujh6chddr2teptepfka5au: + /@breejs/ts-worker/2.0.0_vko2uubnomvm6mw63pxqdtopyq: resolution: {integrity: sha512-6anHRcmgYlF7mrm/YVRn6rx2cegLuiY3VBxkkimOTWC/dVQeH336imVSuIKEGKTwiuNTPr2hswVdDSneNuXg3A==} engines: {node: '>= 12.11'} peerDependencies: bree: '>=9.0.0' dependencies: bree: 9.1.2 - ts-node: 10.8.2_cvilj4l3ytrlnvtlqw3tscihve + ts-node: 10.8.2_yuzmdm4dwbtqx7oi4ad7vmtwja tsconfig-paths: 4.1.0 transitivePeerDependencies: - '@swc/core' @@ -230,8 +234,8 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: false - /@esbuild/linux-loong64/0.15.0: - resolution: {integrity: sha512-7ChD3qsxRPIPp9bfjspZiM/x8B1UZL7IKwp0YdnC1kKsDCB5Q8/TexedeeEbkI9inlunu8Lll2lP2wnkiXTCLA==} + /@esbuild/linux-loong64/0.15.5: + resolution: {integrity: sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -275,18 +279,17 @@ packages: pkg-up: 3.1.0 dev: false - /@fastify/cookie/7.3.1: - resolution: {integrity: sha512-io16UMtIkXKvHUTm63LHPQpMm1NcQ7NT2aAeGYLzX94jJXeQnu0by8VSm3iCrfnFuF0bGTWzUtefHSjKHNxppw==} + /@fastify/cookie/8.0.0: + resolution: {integrity: sha512-VYEKAeJXx0ezormR7IlVd7iwMZDY+ksMUk50ruGKiMiuvMBkivzsPzNckR8dMme+5rxjXgOyfLunpS9jCvWlqA==} dependencies: cookie: 0.5.0 - cookie-signature: 1.2.0 - fastify-plugin: 4.1.0 + fastify-plugin: 4.2.0 dev: false /@fastify/cors/8.1.0: resolution: {integrity: sha512-1OmjwyxQZ8GePxa5t1Rpsn2qS56+1ouKMvZufpgJWhXtoCeM/ffA+PsNW8pyslPr4W0E27gVoFqtvHwhXW1U2w==} dependencies: - fastify-plugin: 4.1.0 + fastify-plugin: 4.2.0 mnemonist: 0.39.2 dev: false @@ -294,7 +297,7 @@ packages: resolution: {integrity: sha512-9l+JTUiFWSwb9dGSeR46aDWBjrAg8lJeqMjbotG5/8Ho90+qzRbt8kdSnVhLm5k6HcqXcBaBAT/6cImRhRq0VQ==} dependencies: env-schema: 5.0.0 - fastify-plugin: 4.1.0 + fastify-plugin: 4.2.0 dev: false /@fastify/error/3.0.0: @@ -313,7 +316,7 @@ packages: '@fastify/error': 3.0.0 '@lukeed/ms': 2.0.0 fast-jwt: 1.5.4 - fastify-plugin: 4.1.0 + fastify-plugin: 4.2.0 steed: 1.1.3 dev: false @@ -322,7 +325,7 @@ packages: dependencies: '@fastify/accept-negotiator': 1.0.0 content-disposition: 0.5.4 - fastify-plugin: 4.1.0 + fastify-plugin: 4.2.0 glob: 8.0.3 p-limit: 3.1.0 readable-stream: 4.0.0 @@ -428,7 +431,6 @@ packages: /@prisma/engines/3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e: resolution: {integrity: sha512-NHlojO1DFTsSi3FtEleL9QWXeSF/UjhCW0fgpi7bumnNZ4wj/eQ+BJJ5n2pgoOliTOGv9nX2qXvmHap7rJMNmg==} requiresBuild: true - dev: true /@rollup/pluginutils/4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -532,7 +534,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.6.5 + '@types/node': 18.7.11 '@types/responselike': 1.0.0 dev: false @@ -555,7 +557,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.6.5 + '@types/node': 18.7.11 dev: false /@types/lodash/4.14.182: @@ -572,6 +574,10 @@ packages: /@types/node/18.6.5: resolution: {integrity: sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==} + dev: true + + /@types/node/18.7.11: + resolution: {integrity: sha512-KZhFpSLlmK/sdocfSAjqPETTMd0ug6HIMIAwkwUpU79olnZdQtMxpQP+G1wDzCH7na+FltSIhbaZuKdwZ8RDrw==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -584,7 +590,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.6.5 + '@types/node': 18.7.11 dev: false /@types/sass/1.43.1: @@ -620,6 +626,33 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin/5.34.0_euudt5oqhhodkyae5tf6wjmsda: + resolution: {integrity: sha512-eRfPPcasO39iwjlUAMtjeueRGuIrW3TQ9WseIDl7i5UWuFbf83yYaU7YPs4j8+4CxUMIsj1k+4kV+E+G+6ypDQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq + '@typescript-eslint/scope-manager': 5.34.0 + '@typescript-eslint/type-utils': 5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq + '@typescript-eslint/utils': 5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq + debug: 4.3.4 + eslint: 8.22.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq: resolution: {integrity: sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -640,6 +673,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser/5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq: + resolution: {integrity: sha512-SZ3NEnK4usd2CXkoV3jPa/vo1mWX1fqRyIVUQZR4As1vyp4fneknBNJj+OFtV8WAVgGf+rOHMSqQbs2Qn3nFZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.34.0 + '@typescript-eslint/types': 5.34.0 + '@typescript-eslint/typescript-estree': 5.34.0_typescript@4.7.4 + debug: 4.3.4 + eslint: 8.22.0 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager/5.33.0: resolution: {integrity: sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -648,6 +701,14 @@ packages: '@typescript-eslint/visitor-keys': 5.33.0 dev: true + /@typescript-eslint/scope-manager/5.34.0: + resolution: {integrity: sha512-HNvASMQlah5RsBW6L6c7IJ0vsm+8Sope/wu5sEAf7joJYWNb1LDbJipzmdhdUOnfrDFE6LR1j57x1EYVxrY4ow==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.34.0 + '@typescript-eslint/visitor-keys': 5.34.0 + dev: true + /@typescript-eslint/type-utils/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq: resolution: {integrity: sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -667,11 +728,35 @@ packages: - supports-color dev: true + /@typescript-eslint/type-utils/5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq: + resolution: {integrity: sha512-Pxlno9bjsQ7hs1pdWRUv9aJijGYPYsHpwMeCQ/Inavhym3/XaKt1ZKAA8FIw4odTBfowBdZJDMxf2aavyMDkLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq + debug: 4.3.4 + eslint: 8.22.0 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types/5.33.0: resolution: {integrity: sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types/5.34.0: + resolution: {integrity: sha512-49fm3xbbUPuzBIOcy2CDpYWqy/X7VBkxVN+DC21e0zIm3+61Z0NZi6J9mqPmSW1BDVk9FIOvuCFyUPjXz93sjA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree/5.33.0_typescript@4.7.4: resolution: {integrity: sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -693,6 +778,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree/5.34.0_typescript@4.7.4: + resolution: {integrity: sha512-mXHAqapJJDVzxauEkfJI96j3D10sd567LlqroyCeJaHnu42sDbjxotGb3XFtGPYKPD9IyLjhsoULML1oI3M86A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.34.0 + '@typescript-eslint/visitor-keys': 5.34.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq: resolution: {integrity: sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -711,6 +817,24 @@ packages: - typescript dev: true + /@typescript-eslint/utils/5.34.0_4rv7y5c6xz3vfxwhbrcxxi73bq: + resolution: {integrity: sha512-kWRYybU4Rn++7lm9yu8pbuydRyQsHRoBDIo11k7eqBWTldN4xUdVUMCsHBiE7aoEkFzrUEaZy3iH477vr4xHAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.34.0 + '@typescript-eslint/types': 5.34.0 + '@typescript-eslint/typescript-estree': 5.34.0_typescript@4.7.4 + eslint: 8.22.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.22.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys/5.33.0: resolution: {integrity: sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -719,6 +843,14 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@typescript-eslint/visitor-keys/5.34.0: + resolution: {integrity: sha512-O1moYjOSrab0a2fUvFpsJe0QHtvTC+cR+ovYpgKrAVXzqQyc74mv76TgY6z+aEtjQE2vgZux3CQVtGryqdcOAw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.34.0 + eslint-visitor-keys: 3.3.0 + dev: true + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true @@ -763,17 +895,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /acorn/8.7.1: - resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - /acorn/8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /aggregate-error/4.0.1: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} @@ -934,7 +1059,6 @@ packages: picocolors: 1.0.0 postcss: 8.4.16 postcss-value-parser: 4.2.0 - dev: true /avvio/8.1.3: resolution: {integrity: sha512-tl9TC0yDRKzP6gFLkrInqPyx8AkfBC/0QRnwkE9Jo31+OJjLrE/73GJuE0QgSB0Vpv38CTJJZGqU9hczowclWw==} @@ -1735,7 +1859,6 @@ packages: electron-to-chromium: 1.4.213 node-releases: 2.0.6 update-browserslist-db: 1.0.5_browserslist@4.21.3 - dev: true /bson-objectid/1.3.1: resolution: {integrity: sha512-eQBNQXsisEAXlwiSy8zRNZdW2xDBJaEVkTPbodYR9hGxxtE548Qq7ilYOd8WAQ86xF7NRUdiWSQ1pa/TkKiE2A==} @@ -1818,7 +1941,6 @@ packages: /caniuse-lite/1.0.30001375: resolution: {integrity: sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==} - dev: true /chalk/1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} @@ -1998,11 +2120,6 @@ packages: safe-buffer: 5.1.2 dev: true - /cookie-signature/1.2.0: - resolution: {integrity: sha512-R0BOPfLGTitaKhgKROKZQN6iyq2iDQcH1DOF8nJoaWapguX5bC2w+Q/I9NmmM5lfcvEarnLZr+cCvmEYYSXvYA==} - engines: {node: '>=6.6.0'} - dev: false - /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} @@ -2123,8 +2240,8 @@ packages: - ts-node dev: false - /dayjs/1.11.4: - resolution: {integrity: sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==} + /dayjs/1.11.5: + resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==} dev: false /debug/2.6.9: @@ -2295,10 +2412,11 @@ packages: - supports-color dev: false - /dockerode/3.3.3: - resolution: {integrity: sha512-lvKV6/NGf2/CYLt5V4c0fd6Fl9XZSCo1Z2HBT9ioKrKLMB2o+gA62Uza8RROpzGvYv57KJx2dKu+ZwSpB//OIA==} + /dockerode/3.3.4: + resolution: {integrity: sha512-3EUwuXnCU+RUlQEheDjmBE0B7q66PV9Rw5NiH1sXwINq0M9c5ERP9fxgkw36ZHOtzf4AGEEYySnkx/sACC9EgQ==} engines: {node: '>= 8.0'} dependencies: + '@balena/dockerignore': 1.0.2 docker-modem: 3.0.5 tar-fs: 2.0.1 transitivePeerDependencies: @@ -2356,7 +2474,6 @@ packages: /electron-to-chromium/1.4.213: resolution: {integrity: sha512-+3DbGHGOCHTVB/Ms63bGqbyC1b8y7Fk86+7ltssB8NQrZtSCvZG6eooSl9U2Q0yw++fL2DpHKOdTU0NVEkFObg==} - dev: true /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2437,8 +2554,8 @@ packages: dev: true optional: true - /esbuild-android-64/0.15.0: - resolution: {integrity: sha512-A9wa6quw4nYIhCDH6rudxSTOAIfSOYU3eME8ZkfP21P+WTxz0pFORFDuBjVAcLhkora3bDc23C8UeloKiiQPOg==} + /esbuild-android-64/0.15.5: + resolution: {integrity: sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2455,8 +2572,8 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.15.0: - resolution: {integrity: sha512-ujdverhuFUfW99HdF+L9n1wzG950lVL1AJVc1SEbJRaQC22tVq9xXNXkLLq7v4hSZWrdz/MT3hwhnQF0KTMxNg==} + /esbuild-android-arm64/0.15.5: + resolution: {integrity: sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2473,8 +2590,8 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.15.0: - resolution: {integrity: sha512-aA5SVtXCetQ9ChREG8xDdzv43XGbdz+u4AxQgQZrRu0gXD3yJfawfZgquaej3CxVAlrOgBPbu5z+tA5SVhXAxQ==} + /esbuild-darwin-64/0.15.5: + resolution: {integrity: sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2491,8 +2608,8 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.15.0: - resolution: {integrity: sha512-CaxPS5JUQpldeIMVqw0K+vlGfyMphvtIWugPMyXPGTDmUAcWXSha1QRgJ5Fxa9d/cC4DKeC8L8/q7ClzinXxfA==} + /esbuild-darwin-arm64/0.15.5: + resolution: {integrity: sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2509,8 +2626,8 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.15.0: - resolution: {integrity: sha512-O9yvjry2bmX8sxx42JfwW6g/usZ0e3ndfb3+bquu20qkuEfDodqHNzotOjaKSREvxpw+Ub1zNtXvA/FFekSaOA==} + /esbuild-freebsd-64/0.15.5: + resolution: {integrity: sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -2527,8 +2644,8 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.15.0: - resolution: {integrity: sha512-Zv8bNAG1lYyCtWi+PVndgys6KRBe5hQgD81tK3zdZ6XEitpCPwF8QShYbV8RacG1YBD7aHKSoWKGkT9+5bMGhw==} + /esbuild-freebsd-arm64/0.15.5: + resolution: {integrity: sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -2545,8 +2662,8 @@ packages: dev: true optional: true - /esbuild-linux-32/0.15.0: - resolution: {integrity: sha512-QZqCG55D5Wof1WmBJMuihNroLM9S2oDXGkqB0ZHMA67CQw+3cAwWxOKW36n6VFaKiE4MhvUuW7jI+lr2D7nXQQ==} + /esbuild-linux-32/0.15.5: + resolution: {integrity: sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -2563,8 +2680,8 @@ packages: dev: true optional: true - /esbuild-linux-64/0.15.0: - resolution: {integrity: sha512-cmB2vAUWf9W8768H0DuOi6VUrQPCinx/oYhRbuR1TZj873vg1GTqc55LAh1cYCC0xEMd9MjO4YfI43OX4ewI1w==} + /esbuild-linux-64/0.15.5: + resolution: {integrity: sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2581,8 +2698,8 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.15.0: - resolution: {integrity: sha512-UyY0Vqd9ngfeWBeJrrqHiXf4ozqXxzNT8ebdNt1ay5hfu/uXes3eVkt1YHP2dcxG/APPE4XDxvKlx0SoSwHP6Q==} + /esbuild-linux-arm/0.15.5: + resolution: {integrity: sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -2599,8 +2716,8 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.15.0: - resolution: {integrity: sha512-bJc8k64Lss+2V8yx9kh4Q48SYPR/k0kxyep2pmvzaGm+AreeMnXI0J33zF4tU/OW9r3pwa74F3/MxF6x275Yhg==} + /esbuild-linux-arm64/0.15.5: + resolution: {integrity: sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -2617,8 +2734,8 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.15.0: - resolution: {integrity: sha512-NoOxC4a1XfM4/zGBIujIuxhPVWvS6UgqE/ksyjZ6qgHQD9lWVjcEv3iPEKKIuHXPE1s+YHvJrdXVup96aVvflQ==} + /esbuild-linux-mips64le/0.15.5: + resolution: {integrity: sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -2635,8 +2752,8 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.15.0: - resolution: {integrity: sha512-OUkEhJAYPaYPvHZxjgnJhWB0qD8q8l1q8CnGLngmPAxb9WZrFwPYmykWBTSqGXeG08stScpkIQXy4HTSF8rH+w==} + /esbuild-linux-ppc64le/0.15.5: + resolution: {integrity: sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -2653,8 +2770,8 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.15.0: - resolution: {integrity: sha512-DuSujKNrdCN+kvA0+BBS/ULaINuOeI0iU9XzhIRtTCR5cFJWd6aQTHluKEc3C/a/ib2KTVNjM21cUHi4Tj0NZA==} + /esbuild-linux-riscv64/0.15.5: + resolution: {integrity: sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -2671,8 +2788,8 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.15.0: - resolution: {integrity: sha512-ttGGhgXRpJbsD+XXS2NIBThuEh8EvAJEnVQ9vzXviniPuvpuwKLFNBRPqtX3gE5o2bUQnh5ZugmDVuD9GW2ROg==} + /esbuild-linux-s390x/0.15.5: + resolution: {integrity: sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -2689,8 +2806,8 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.15.0: - resolution: {integrity: sha512-rb6sIQ/gZeQNrgplSLJ0zLirLwr3vQCzbL1jb0Ypay83Uup2s+OEI+Vw+oJ2SomrhVyOPwk/R4AY713bJKdLsQ==} + /esbuild-netbsd-64/0.15.5: + resolution: {integrity: sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2707,8 +2824,8 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.15.0: - resolution: {integrity: sha512-CeU7hw291UJQpNg/oJLefmM9Rdeddo2ya9Vw9hdDrUyZAAZckqVRLDh9t4OdqJuXFdlo6BM2qhZCcY22O7wfGg==} + /esbuild-openbsd-64/0.15.5: + resolution: {integrity: sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2725,8 +2842,8 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.15.0: - resolution: {integrity: sha512-nE7EcgDw9RT4fR+GJZ5a0spPb2HKT77viCjrGl6GSeb/n3RhxGgVGwPQDI/KRwyVeQMqEOTtHQMNPwNr9TKDDQ==} + /esbuild-sunos-64/0.15.5: + resolution: {integrity: sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2743,8 +2860,8 @@ packages: dev: true optional: true - /esbuild-windows-32/0.15.0: - resolution: {integrity: sha512-FUPwJmPwBoqe8ShhOMfHtSElh1Nyc3s+Kru3m7lDJCjNr3ctx9YJKuzRsz4UXow6Wo79LMQGNyjysQ7UuKgvHQ==} + /esbuild-windows-32/0.15.5: + resolution: {integrity: sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2761,8 +2878,8 @@ packages: dev: true optional: true - /esbuild-windows-64/0.15.0: - resolution: {integrity: sha512-zNM5bSVOY0SzMFB6k3ZdMwg4JmLVLpEmgVd2fU2STDmEOXdY1APAFPVWkbWMtLF/nfLfaJLfps7+IIJgGyQbGA==} + /esbuild-windows-64/0.15.5: + resolution: {integrity: sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2779,8 +2896,8 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.15.0: - resolution: {integrity: sha512-sqhmDwUhUULUnViLD7jAqo4FaOhLN/FMW+dFVSvxSTA9pZSr2w6efky91vTWOcTUmspvYyHyOrJmtktp1ffIaw==} + /esbuild-windows-arm64/0.15.5: + resolution: {integrity: sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2816,39 +2933,38 @@ packages: esbuild-windows-arm64: 0.14.49 dev: true - /esbuild/0.15.0: - resolution: {integrity: sha512-UUDSelGc/EOhzn0zpkdhLA3iB+jq2OS5gnMUMz/BqAKBIsWR2fTHqrddNPt2PNj3OUchqcMcTHSUBr+VpYpcsQ==} + /esbuild/0.15.5: + resolution: {integrity: sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/linux-loong64': 0.15.0 - esbuild-android-64: 0.15.0 - esbuild-android-arm64: 0.15.0 - esbuild-darwin-64: 0.15.0 - esbuild-darwin-arm64: 0.15.0 - esbuild-freebsd-64: 0.15.0 - esbuild-freebsd-arm64: 0.15.0 - esbuild-linux-32: 0.15.0 - esbuild-linux-64: 0.15.0 - esbuild-linux-arm: 0.15.0 - esbuild-linux-arm64: 0.15.0 - esbuild-linux-mips64le: 0.15.0 - esbuild-linux-ppc64le: 0.15.0 - esbuild-linux-riscv64: 0.15.0 - esbuild-linux-s390x: 0.15.0 - esbuild-netbsd-64: 0.15.0 - esbuild-openbsd-64: 0.15.0 - esbuild-sunos-64: 0.15.0 - esbuild-windows-32: 0.15.0 - esbuild-windows-64: 0.15.0 - esbuild-windows-arm64: 0.15.0 + '@esbuild/linux-loong64': 0.15.5 + esbuild-android-64: 0.15.5 + esbuild-android-arm64: 0.15.5 + esbuild-darwin-64: 0.15.5 + esbuild-darwin-arm64: 0.15.5 + esbuild-freebsd-64: 0.15.5 + esbuild-freebsd-arm64: 0.15.5 + esbuild-linux-32: 0.15.5 + esbuild-linux-64: 0.15.5 + esbuild-linux-arm: 0.15.5 + esbuild-linux-arm64: 0.15.5 + esbuild-linux-mips64le: 0.15.5 + esbuild-linux-ppc64le: 0.15.5 + esbuild-linux-riscv64: 0.15.5 + esbuild-linux-s390x: 0.15.5 + esbuild-netbsd-64: 0.15.5 + esbuild-openbsd-64: 0.15.5 + esbuild-sunos-64: 0.15.5 + esbuild-windows-32: 0.15.5 + esbuild-windows-64: 0.15.5 + esbuild-windows-arm64: 0.15.5 dev: true /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -2877,7 +2993,16 @@ packages: eslint: 8.21.0 dev: true - /eslint-plugin-prettier/4.2.1_h62lvancfh4b7r6zn2dgodrh5e: + /eslint-config-prettier/8.5.0_eslint@8.22.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.22.0 + dev: true + + /eslint-plugin-prettier/4.2.1_i2cojdczqdiurzgttlwdgf764e: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2888,8 +3013,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.21.0 - eslint-config-prettier: 8.5.0_eslint@8.21.0 + eslint: 8.22.0 + eslint-config-prettier: 8.5.0_eslint@8.22.0 prettier: 2.7.1 prettier-linter-helpers: 1.0.0 dev: true @@ -2930,6 +3055,16 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-utils/3.0.0_eslint@8.22.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.22.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -2988,6 +3123,54 @@ packages: - supports-color dev: true + /eslint/8.22.0: + resolution: {integrity: sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.0 + '@humanwhocodes/config-array': 0.10.4 + '@humanwhocodes/gitignore-to-minimatch': 1.0.2 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.22.0 + eslint-visitor-keys: 3.3.0 + espree: 9.3.3 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.15.0 + globby: 11.1.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /espree/9.3.3: resolution: {integrity: sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3044,6 +3227,21 @@ packages: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false + /execa/6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + /exit/0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -3122,12 +3320,12 @@ packages: reusify: 1.0.4 dev: false - /fastify-plugin/4.1.0: - resolution: {integrity: sha512-Mf6lkbxHtFgI4sVaC0P/7sqlBvdpoyEUaOCD0cyKpqxjsdN+3EdD/FfSHByb7uXqxYu/DilH9Lb6mTCumN9TQQ==} + /fastify-plugin/4.2.0: + resolution: {integrity: sha512-hovKzEXZc2YgeuXn41/2EA/IaIOdRu1pB9WKgnzDBj3lhKSdDCEsckHa7I6LiT/LhflvAQX7ZY8IQ6eBX0htTg==} dev: false - /fastify/4.4.0: - resolution: {integrity: sha512-ePI4g9vPJXIBF4YlVcDSLxjvtdTrlM8QzdgYAPFGdCH+rot+4MXoFFAUb10fGrIcRRjaq6CvcbIzxiWQzMMHkw==} + /fastify/4.5.2: + resolution: {integrity: sha512-cDLhc0bh1ftzMoS7ccGGPUW/xTUnk6I51TktQqKFeJnhoAfk56tfn+xDs8JcJYfouPK23Ljx4OpMaEi+kIDwEg==} dependencies: '@fastify/ajv-compiler': 3.1.1 '@fastify/error': 3.0.0 @@ -3277,7 +3475,6 @@ packages: /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true /fresh/0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} @@ -3341,11 +3538,6 @@ packages: has: 1.0.3 has-symbols: 1.0.3 - /get-port/6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /get-stream/5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -3553,6 +3745,11 @@ packages: numbered: 1.1.0 dev: false + /human-signals/3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} + dev: false + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3800,6 +3997,11 @@ packages: engines: {node: '>=8'} dev: false + /is-stream/3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-string-and-not-blank/0.0.2: resolution: {integrity: sha512-FyPGAbNVyZpTeDCTXnzuwbu9/WpNXbCfbHXLpCRpN4GANhS00eEIP5Ef+k5HYSNIzIhdN9zRDoBj6unscECvtQ==} engines: {node: '>=6.4.0'} @@ -4154,6 +4356,10 @@ packages: engines: {node: '>= 0.10.0'} dev: true + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -4199,6 +4405,11 @@ packages: engines: {node: '>=6'} dev: true + /mimic-fn/4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + /mimic-response/1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -4321,7 +4532,6 @@ packages: /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} - dev: true /nodemon/2.0.19: resolution: {integrity: sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==} @@ -4367,7 +4577,6 @@ packages: /normalize-range/0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - dev: true /normalize-url/6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} @@ -4390,6 +4599,13 @@ packages: string.prototype.padend: 3.1.3 dev: true + /npm-run-path/5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + /numbered/1.1.0: resolution: {integrity: sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g==} dev: false @@ -4443,6 +4659,13 @@ packages: mimic-fn: 2.1.0 dev: true + /onetime/6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + /opencollective-setup/1.4.1: resolution: {integrity: sha512-XdYWl35SewxvjJCeuFQSkuL1elwOsGYXpzT0/vOaszC16KNmHi1NoLfiN/YJiw/VeP4E+DYVI906oGsXp0b77g==} engines: {node: 11.8.0, npm: 6.5.0} @@ -4654,6 +4877,11 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + /path-key/4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -4830,7 +5058,6 @@ packages: requiresBuild: true dependencies: '@prisma/engines': 3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e - dev: true /private/0.1.8: resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} @@ -5268,7 +5495,6 @@ packages: /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true /simple-swizzle/0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -5458,6 +5684,11 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + /strip-final-newline/3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -5616,7 +5847,6 @@ packages: /svelte/3.49.0: resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==} engines: {node: '>= 8'} - dev: true /sveltekit-i18n/2.2.2_svelte@3.49.0: resolution: {integrity: sha512-6eygICleGCSL7elY7A3trF8XUhV+mlW56ZSoD0UUKXlw+Y6u0MTTHDq48u1LyY73SfnlbPHXgTarhTjZ0BvUKA==} @@ -5758,7 +5988,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /ts-node/10.8.2_cvilj4l3ytrlnvtlqw3tscihve: + /ts-node/10.8.2_yuzmdm4dwbtqx7oi4ad7vmtwja: resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -5777,8 +6007,8 @@ packages: '@tsconfig/node12': 1.0.9 '@tsconfig/node14': 1.0.1 '@tsconfig/node16': 1.0.2 - '@types/node': 18.6.5 - acorn: 8.7.1 + '@types/node': 18.7.11 + acorn: 8.8.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -5850,7 +6080,6 @@ packages: resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true - dev: true /typpy/2.3.11: resolution: {integrity: sha512-Jh/fykZSaxeKO0ceMAs6agki9T5TNA9kiIR6fzKbvafKpIw8UlNlHhzuqKyi5lfJJ5VojJOx9tooIbyy7vHV/g==} @@ -5885,7 +6114,6 @@ packages: browserslist: 4.21.3 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}