cleanup stuffs
This commit is contained in:
parent
4416646954
commit
2030f714fa
2
.gitignore
vendored
2
.gitignore
vendored
@ -15,5 +15,3 @@ apps/api/db/migration.db-journal
|
|||||||
apps/api/core*
|
apps/api/core*
|
||||||
logs
|
logs
|
||||||
others/certificates
|
others/certificates
|
||||||
apps/api/template.json
|
|
||||||
apps/api/tags.json
|
|
||||||
|
@ -26,8 +26,6 @@
|
|||||||
"@iarna/toml": "2.2.5",
|
"@iarna/toml": "2.2.5",
|
||||||
"@ladjs/graceful": "3.0.2",
|
"@ladjs/graceful": "3.0.2",
|
||||||
"@prisma/client": "4.5.0",
|
"@prisma/client": "4.5.0",
|
||||||
"prisma": "4.5.0",
|
|
||||||
"axios": "1.1.3",
|
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bree": "9.1.2",
|
"bree": "9.1.2",
|
||||||
"cabin": "9.1.2",
|
"cabin": "9.1.2",
|
||||||
@ -51,6 +49,7 @@
|
|||||||
"node-os-utils": "1.3.7",
|
"node-os-utils": "1.3.7",
|
||||||
"p-all": "4.0.0",
|
"p-all": "4.0.0",
|
||||||
"p-throttle": "5.0.0",
|
"p-throttle": "5.0.0",
|
||||||
|
"prisma": "4.5.0",
|
||||||
"public-ip": "6.0.1",
|
"public-ip": "6.0.1",
|
||||||
"pump": "^3.0.0",
|
"pump": "^3.0.0",
|
||||||
"ssh-config": "4.1.6",
|
"ssh-config": "4.1.6",
|
||||||
@ -58,7 +57,6 @@
|
|||||||
"unique-names-generator": "4.7.1"
|
"unique-names-generator": "4.7.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"semver-sort": "1.0.0",
|
|
||||||
"@types/node": "18.11.6",
|
"@types/node": "18.11.6",
|
||||||
"@types/node-os-utils": "1.3.0",
|
"@types/node-os-utils": "1.3.0",
|
||||||
"@typescript-eslint/eslint-plugin": "5.41.0",
|
"@typescript-eslint/eslint-plugin": "5.41.0",
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
import got from 'got';
|
import got from 'got';
|
||||||
import semverSort from 'semver-sort';
|
|
||||||
|
|
||||||
const repositories = [];
|
const repositories = [];
|
||||||
const templates = await fs.readFile('../devTemplates.yaml', 'utf8');
|
const templates = await fs.readFile('../devTemplates.yaml', 'utf8');
|
||||||
@ -31,9 +30,6 @@ for (const repository of repositories) {
|
|||||||
if (!tags.includes('latest')) {
|
if (!tags.includes('latest')) {
|
||||||
tags.push('latest')
|
tags.push('latest')
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
tags = semverSort.desc(tags)
|
|
||||||
} catch (error) { }
|
|
||||||
services.push({ name: repository.name, image: repository.image, tags })
|
services.push({ name: repository.name, image: repository.image, tags })
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -48,15 +44,6 @@ for (const repository of repositories) {
|
|||||||
if (!tags.includes('latest')) {
|
if (!tags.includes('latest')) {
|
||||||
tags.push('latest')
|
tags.push('latest')
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
tags = semverSort.desc(tags)
|
|
||||||
} catch (error) { }
|
|
||||||
|
|
||||||
console.log({
|
|
||||||
name: repository.name,
|
|
||||||
image: repository.image,
|
|
||||||
tags
|
|
||||||
})
|
|
||||||
services.push({
|
services.push({
|
||||||
name: repository.name,
|
name: repository.name,
|
||||||
image: repository.image,
|
image: repository.image,
|
||||||
|
@ -10,13 +10,11 @@ import { asyncExecShell, cleanupDockerStorage, createRemoteEngineConfiguration,
|
|||||||
import { scheduler } from './lib/scheduler';
|
import { scheduler } from './lib/scheduler';
|
||||||
import { compareVersions } from 'compare-versions';
|
import { compareVersions } from 'compare-versions';
|
||||||
import Graceful from '@ladjs/graceful'
|
import Graceful from '@ladjs/graceful'
|
||||||
import axios from 'axios';
|
|
||||||
import yaml from 'js-yaml'
|
import yaml from 'js-yaml'
|
||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import { verifyRemoteDockerEngineFn } from './routes/api/v1/destinations/handlers';
|
import { verifyRemoteDockerEngineFn } from './routes/api/v1/destinations/handlers';
|
||||||
import { checkContainer } from './lib/docker';
|
import { checkContainer } from './lib/docker';
|
||||||
import { migrateServicesToNewTemplate } from './lib';
|
import { migrateServicesToNewTemplate } from './lib';
|
||||||
import { getTemplates } from './lib/services';
|
|
||||||
import { refreshTags, refreshTemplates } from './routes/api/v1/handlers';
|
import { refreshTags, refreshTemplates } from './routes/api/v1/handlers';
|
||||||
declare module 'fastify' {
|
declare module 'fastify' {
|
||||||
interface FastifyInstance {
|
interface FastifyInstance {
|
||||||
@ -129,30 +127,10 @@ const host = '0.0.0.0';
|
|||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { default: got } = await import('got')
|
|
||||||
try {
|
|
||||||
const tags = await got.get('https://get.coollabs.io/coolify/service-tags.json').text()
|
|
||||||
|
|
||||||
if (isDev) {
|
|
||||||
const templates = await fs.readFile('./devTemplates.yaml', 'utf8')
|
|
||||||
await fs.writeFile('./template.json', JSON.stringify(yaml.load(templates)))
|
|
||||||
const tags = await got.get('https://get.coollabs.io/coolify/service-tags.json').text()
|
|
||||||
await fs.writeFile('./tags.json', tags)
|
|
||||||
} else {
|
|
||||||
const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text()
|
|
||||||
await fs.writeFile('/app/template.json', JSON.stringify(yaml.load(response)))
|
|
||||||
await fs.writeFile('/app/tags.json', tags)
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Couldn't get latest templates.")
|
|
||||||
console.log(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
await migrateServicesToNewTemplate()
|
|
||||||
|
|
||||||
await fastify.listen({ port, host })
|
await fastify.listen({ port, host })
|
||||||
console.log(`Coolify's API is listening on ${host}:${port}`);
|
console.log(`Coolify's API is listening on ${host}:${port}`);
|
||||||
|
|
||||||
|
await migrateServicesToNewTemplate()
|
||||||
await initServer();
|
await initServer();
|
||||||
|
|
||||||
const graceful = new Graceful({ brees: [scheduler] });
|
const graceful = new Graceful({ brees: [scheduler] });
|
||||||
@ -192,11 +170,12 @@ const host = '0.0.0.0';
|
|||||||
}, 10000)
|
}, 10000)
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
getTagsTemplates(),
|
||||||
getArch(),
|
getArch(),
|
||||||
getIPAddress(),
|
getIPAddress(),
|
||||||
configureRemoteDockers(),
|
configureRemoteDockers(),
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@ -222,6 +201,27 @@ async function getIPAddress() {
|
|||||||
|
|
||||||
} catch (error) { }
|
} catch (error) { }
|
||||||
}
|
}
|
||||||
|
async function getTagsTemplates() {
|
||||||
|
const { default: got } = await import('got')
|
||||||
|
try {
|
||||||
|
const tags = await got.get('https://get.coollabs.io/coolify/service-tags.json').text()
|
||||||
|
if (isDev) {
|
||||||
|
const templates = await fs.readFile('./devTemplates.yaml', 'utf8')
|
||||||
|
await fs.writeFile('./templates.json', JSON.stringify(yaml.load(templates)))
|
||||||
|
await fs.writeFile('./tags.json', tags)
|
||||||
|
console.log('Tags and templates loaded in dev mode...')
|
||||||
|
} else {
|
||||||
|
const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text()
|
||||||
|
await fs.writeFile('/app/templates.json', JSON.stringify(yaml.load(response)))
|
||||||
|
await fs.writeFile('/app/tags.json', tags)
|
||||||
|
console.log('Tags and templates loaded...')
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Couldn't get latest templates.")
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
async function initServer() {
|
async function initServer() {
|
||||||
try {
|
try {
|
||||||
console.log(`Initializing server...`);
|
console.log(`Initializing server...`);
|
||||||
@ -234,6 +234,7 @@ async function initServer() {
|
|||||||
}
|
}
|
||||||
} catch (error) { }
|
} catch (error) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getArch() {
|
async function getArch() {
|
||||||
try {
|
try {
|
||||||
const settings = await prisma.setting.findFirst({})
|
const settings = await prisma.setting.findFirst({})
|
||||||
@ -263,17 +264,15 @@ async function configureRemoteDockers() {
|
|||||||
|
|
||||||
async function autoUpdater() {
|
async function autoUpdater() {
|
||||||
try {
|
try {
|
||||||
|
const { default: got } = await import('got')
|
||||||
const currentVersion = version;
|
const currentVersion = version;
|
||||||
const { data: versions } = await axios
|
const { coolify } = await got.get('https://get.coollabs.io/versions.json', {
|
||||||
.get(
|
searchParams: {
|
||||||
`https://get.coollabs.io/versions.json`
|
appId: process.env['COOLIFY_APP_ID'] || undefined,
|
||||||
, {
|
version: currentVersion
|
||||||
params: {
|
}
|
||||||
appId: process.env['COOLIFY_APP_ID'] || undefined,
|
}).json()
|
||||||
version: currentVersion
|
const latestVersion = coolify.main.version;
|
||||||
}
|
|
||||||
})
|
|
||||||
const latestVersion = versions['coolify'].main.version;
|
|
||||||
const isUpdateAvailable = compareVersions(latestVersion, currentVersion);
|
const isUpdateAvailable = compareVersions(latestVersion, currentVersion);
|
||||||
if (isUpdateAvailable === 1) {
|
if (isUpdateAvailable === 1) {
|
||||||
const activeCount = 0
|
const activeCount = 0
|
||||||
@ -295,7 +294,9 @@ async function autoUpdater() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) { }
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function checkFluentBit() {
|
async function checkFluentBit() {
|
||||||
|
@ -3,9 +3,9 @@ import fs from 'fs/promises';
|
|||||||
export async function getTemplates() {
|
export async function getTemplates() {
|
||||||
let templates: any = [];
|
let templates: any = [];
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
templates = JSON.parse(await (await fs.readFile('./template.json')).toString())
|
templates = JSON.parse(await (await fs.readFile('./templates.json')).toString())
|
||||||
} else {
|
} else {
|
||||||
templates = JSON.parse(await (await fs.readFile('/app/template.json')).toString())
|
templates = JSON.parse(await (await fs.readFile('/app/templates.json')).toString())
|
||||||
}
|
}
|
||||||
// if (!isDev) {
|
// if (!isDev) {
|
||||||
// templates.push({
|
// templates.push({
|
||||||
@ -141,6 +141,19 @@ export async function getTemplates() {
|
|||||||
// }
|
// }
|
||||||
return templates
|
return templates
|
||||||
}
|
}
|
||||||
|
const compareSemanticVersions = (a: string, b: string) => {
|
||||||
|
const a1 = a.split('.');
|
||||||
|
const b1 = b.split('.');
|
||||||
|
const len = Math.min(a1.length, b1.length);
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
const a2 = +a1[ i ] || 0;
|
||||||
|
const b2 = +b1[ i ] || 0;
|
||||||
|
if (a2 !== b2) {
|
||||||
|
return a2 > b2 ? 1 : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b1.length - a1.length;
|
||||||
|
};
|
||||||
export async function getTags(type?: string) {
|
export async function getTags(type?: string) {
|
||||||
let tags: any = [];
|
let tags: any = [];
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
@ -148,5 +161,7 @@ export async function getTags(type?: string) {
|
|||||||
} else {
|
} else {
|
||||||
tags = JSON.parse(await (await fs.readFile('/app/tags.json')).toString())
|
tags = JSON.parse(await (await fs.readFile('/app/tags.json')).toString())
|
||||||
}
|
}
|
||||||
return tags.find((tag: any) => tag.name.includes(type))
|
tags = tags.find((tag: any) => tag.name.includes(type))
|
||||||
|
tags.tags = tags.tags.sort(compareSemanticVersions).reverse();
|
||||||
|
return tags
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
import cuid from 'cuid';
|
import cuid from 'cuid';
|
||||||
import crypto from 'node:crypto'
|
import crypto from 'node:crypto'
|
||||||
import jsonwebtoken from 'jsonwebtoken';
|
import jsonwebtoken from 'jsonwebtoken';
|
||||||
import axios from 'axios';
|
|
||||||
import { FastifyReply } from 'fastify';
|
import { FastifyReply } from 'fastify';
|
||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
import csv from 'csvtojson';
|
import csv from 'csvtojson';
|
||||||
|
|
||||||
import { day } from '../../../../lib/dayjs';
|
import { day } from '../../../../lib/dayjs';
|
||||||
import { makeLabelForStandaloneApplication, setDefaultBaseImage, setDefaultConfiguration } from '../../../../lib/buildPacks/common';
|
import { setDefaultBaseImage, setDefaultConfiguration } from '../../../../lib/buildPacks/common';
|
||||||
import { checkDomainsIsValidInDNS, checkDoubleBranch, checkExposedPort, createDirectories, decrypt, defaultComposeConfiguration, encrypt, errorHandler, executeDockerCmd, generateSshKeyPair, getContainerUsage, getDomain, isDev, isDomainConfigured, listSettings, prisma, stopBuild, uniqueName } from '../../../../lib/common';
|
import { checkDomainsIsValidInDNS, checkExposedPort, createDirectories, decrypt, defaultComposeConfiguration, encrypt, errorHandler, executeDockerCmd, generateSshKeyPair, getContainerUsage, getDomain, isDev, isDomainConfigured, listSettings, prisma, stopBuild, uniqueName } from '../../../../lib/common';
|
||||||
import { checkContainer, formatLabelsOnDocker, isContainerExited, removeContainer } from '../../../../lib/docker';
|
import { checkContainer, formatLabelsOnDocker, removeContainer } from '../../../../lib/docker';
|
||||||
|
|
||||||
import type { FastifyRequest } from 'fastify';
|
import type { FastifyRequest } from 'fastify';
|
||||||
import type { GetImages, CancelDeployment, CheckDNS, CheckRepository, DeleteApplication, DeleteSecret, DeleteStorage, GetApplicationLogs, GetBuildIdLogs, SaveApplication, SaveApplicationSettings, SaveApplicationSource, SaveDeployKey, SaveDestination, SaveSecret, SaveStorage, DeployApplication, CheckDomain, StopPreviewApplication, RestartPreviewApplication, GetBuilds } from './types';
|
import type { GetImages, CancelDeployment, CheckDNS, CheckRepository, DeleteApplication, DeleteSecret, DeleteStorage, GetApplicationLogs, GetBuildIdLogs, SaveApplication, SaveApplicationSettings, SaveApplicationSource, SaveDeployKey, SaveDestination, SaveSecret, SaveStorage, DeployApplication, CheckDomain, StopPreviewApplication, RestartPreviewApplication, GetBuilds } from './types';
|
||||||
@ -124,7 +123,7 @@ export async function getApplicationStatus(request: FastifyRequest<OnlyId>) {
|
|||||||
for (const container of containersArray) {
|
for (const container of containersArray) {
|
||||||
let isRunning = false;
|
let isRunning = false;
|
||||||
let isExited = false;
|
let isExited = false;
|
||||||
let isRestarting = false;
|
let isRestarting = false;
|
||||||
const containerObj = JSON.parse(container);
|
const containerObj = JSON.parse(container);
|
||||||
const status = containerObj.State
|
const status = containerObj.State
|
||||||
if (status === 'running') {
|
if (status === 'running') {
|
||||||
@ -771,6 +770,7 @@ export async function saveApplicationSource(request: FastifyRequest<SaveApplicat
|
|||||||
|
|
||||||
export async function getGitHubToken(request: FastifyRequest<OnlyId>, reply: FastifyReply) {
|
export async function getGitHubToken(request: FastifyRequest<OnlyId>, reply: FastifyReply) {
|
||||||
try {
|
try {
|
||||||
|
const { default: got } = await import('got')
|
||||||
const { id } = request.params
|
const { id } = request.params
|
||||||
const { teamId } = request.user
|
const { teamId } = request.user
|
||||||
const application: any = await getApplicationFromDB(id, teamId);
|
const application: any = await getApplicationFromDB(id, teamId);
|
||||||
@ -782,13 +782,13 @@ export async function getGitHubToken(request: FastifyRequest<OnlyId>, reply: Fas
|
|||||||
const githubToken = jsonwebtoken.sign(payload, application.gitSource.githubApp.privateKey, {
|
const githubToken = jsonwebtoken.sign(payload, application.gitSource.githubApp.privateKey, {
|
||||||
algorithm: 'RS256'
|
algorithm: 'RS256'
|
||||||
});
|
});
|
||||||
const { data } = await axios.post(`${application.gitSource.apiUrl}/app/installations/${application.gitSource.githubApp.installationId}/access_tokens`, {}, {
|
const { token } = await got.post(`${application.gitSource.apiUrl}/app/installations/${application.gitSource.githubApp.installationId}/access_tokens`, {
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `Bearer ${githubToken}`
|
'Authorization': `Bearer ${githubToken}`,
|
||||||
}
|
}
|
||||||
})
|
}).json()
|
||||||
return reply.code(201).send({
|
return reply.code(201).send({
|
||||||
token: data.token
|
token
|
||||||
})
|
})
|
||||||
} catch ({ status, message }) {
|
} catch ({ status, message }) {
|
||||||
return errorHandler({ status, message })
|
return errorHandler({ status, message })
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import axios from "axios";
|
|
||||||
import { compareVersions } from "compare-versions";
|
import { compareVersions } from "compare-versions";
|
||||||
import cuid from "cuid";
|
import cuid from "cuid";
|
||||||
import bcrypt from "bcryptjs";
|
import bcrypt from "bcryptjs";
|
||||||
@ -66,10 +65,10 @@ export async function refreshTemplates() {
|
|||||||
try {
|
try {
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
const response = await fs.readFile('./devTemplates.yaml', 'utf8')
|
const response = await fs.readFile('./devTemplates.yaml', 'utf8')
|
||||||
await fs.writeFile('./template.json', JSON.stringify(yaml.load(response)))
|
await fs.writeFile('./templates.json', JSON.stringify(yaml.load(response)))
|
||||||
} else {
|
} else {
|
||||||
const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text()
|
const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text()
|
||||||
await fs.writeFile('/app/template.json', JSON.stringify(yaml.load(response)))
|
await fs.writeFile('/app/templates.json', JSON.stringify(yaml.load(response)))
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
@ -86,14 +85,18 @@ export async function refreshTemplates() {
|
|||||||
}
|
}
|
||||||
export async function checkUpdate(request: FastifyRequest) {
|
export async function checkUpdate(request: FastifyRequest) {
|
||||||
try {
|
try {
|
||||||
|
const { default: got } = await import('got')
|
||||||
const isStaging =
|
const isStaging =
|
||||||
request.hostname === "staging.coolify.io" ||
|
request.hostname === "staging.coolify.io" ||
|
||||||
request.hostname === "arm.coolify.io";
|
request.hostname === "arm.coolify.io";
|
||||||
const currentVersion = version;
|
const currentVersion = version;
|
||||||
const { data: versions } = await axios.get(
|
const { coolify } = await got.get('https://get.coollabs.io/versions.json', {
|
||||||
`https://get.coollabs.io/versions.json?appId=${process.env["COOLIFY_APP_ID"]}&version=${currentVersion}`
|
searchParams: {
|
||||||
);
|
appId: process.env['COOLIFY_APP_ID'] || undefined,
|
||||||
const latestVersion = versions["coolify"].main.version;
|
version: currentVersion
|
||||||
|
}
|
||||||
|
}).json()
|
||||||
|
const latestVersion = coolify.main.version;
|
||||||
const isUpdateAvailable = compareVersions(latestVersion, currentVersion);
|
const isUpdateAvailable = compareVersions(latestVersion, currentVersion);
|
||||||
if (isStaging) {
|
if (isStaging) {
|
||||||
return {
|
return {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import axios from "axios";
|
|
||||||
import cuid from "cuid";
|
import cuid from "cuid";
|
||||||
import crypto from "crypto";
|
import crypto from "crypto";
|
||||||
import { encrypt, errorHandler, getDomain, getUIUrl, isDev, prisma } from "../../../lib/common";
|
import { encrypt, errorHandler, getDomain, getUIUrl, isDev, prisma } from "../../../lib/common";
|
||||||
@ -32,13 +31,14 @@ export async function installGithub(request: FastifyRequest<InstallGithub>, repl
|
|||||||
}
|
}
|
||||||
export async function configureGitHubApp(request, reply) {
|
export async function configureGitHubApp(request, reply) {
|
||||||
try {
|
try {
|
||||||
|
const { default: got } = await import('got')
|
||||||
const { code, state } = request.query;
|
const { code, state } = request.query;
|
||||||
const { apiUrl } = await prisma.gitSource.findFirst({
|
const { apiUrl } = await prisma.gitSource.findFirst({
|
||||||
where: { id: state },
|
where: { id: state },
|
||||||
include: { githubApp: true, gitlabApp: true }
|
include: { githubApp: true, gitlabApp: true }
|
||||||
});
|
});
|
||||||
|
|
||||||
const { data }: any = await axios.post(`${apiUrl}/app-manifests/${code}/conversions`);
|
const data: any = await got.post(`${apiUrl}/app-manifests/${code}/conversions`).json()
|
||||||
const { id, client_id, slug, client_secret, pem, webhook_secret } = data
|
const { id, client_id, slug, client_secret, pem, webhook_secret } = data
|
||||||
|
|
||||||
const encryptedClientSecret = encrypt(client_secret);
|
const encryptedClientSecret = encrypt(client_secret);
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import axios from "axios";
|
|
||||||
import cuid from "cuid";
|
import cuid from "cuid";
|
||||||
import crypto from "crypto";
|
import crypto from "crypto";
|
||||||
import type { FastifyReply, FastifyRequest } from "fastify";
|
import type { FastifyReply, FastifyRequest } from "fastify";
|
||||||
@ -10,6 +9,7 @@ import type { ConfigureGitLabApp, GitLabEvents } from "./types";
|
|||||||
|
|
||||||
export async function configureGitLabApp(request: FastifyRequest<ConfigureGitLabApp>, reply: FastifyReply) {
|
export async function configureGitLabApp(request: FastifyRequest<ConfigureGitLabApp>, reply: FastifyReply) {
|
||||||
try {
|
try {
|
||||||
|
const { default: got } = await import('got')
|
||||||
const { code, state } = request.query;
|
const { code, state } = request.query;
|
||||||
const { fqdn } = await listSettings();
|
const { fqdn } = await listSettings();
|
||||||
const { gitSource: { gitlabApp: { appId, appSecret }, htmlUrl } }: any = await getApplicationFromDB(state, undefined);
|
const { gitSource: { gitlabApp: { appId, appSecret }, htmlUrl } }: any = await getApplicationFromDB(state, undefined);
|
||||||
@ -19,19 +19,21 @@ export async function configureGitLabApp(request: FastifyRequest<ConfigureGitLab
|
|||||||
if (isDev) {
|
if (isDev) {
|
||||||
domain = getAPIUrl();
|
domain = getAPIUrl();
|
||||||
}
|
}
|
||||||
const params = new URLSearchParams({
|
|
||||||
client_id: appId,
|
const { access_token } = await got.post(`${htmlUrl}/oauth/token`, {
|
||||||
client_secret: appSecret,
|
searchParams: {
|
||||||
code,
|
client_id: appId,
|
||||||
state,
|
client_secret: appSecret,
|
||||||
grant_type: 'authorization_code',
|
code,
|
||||||
redirect_uri: `${domain}/webhooks/gitlab`
|
state,
|
||||||
});
|
grant_type: 'authorization_code',
|
||||||
const { data } = await axios.post(`${htmlUrl}/oauth/token`, params)
|
redirect_uri: `${domain}/webhooks/gitlab`
|
||||||
|
}
|
||||||
|
}).json()
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
return reply.redirect(`${getUIUrl()}/webhooks/success?token=${data.access_token}`)
|
return reply.redirect(`${getUIUrl()}/webhooks/success?token=${access_token}`)
|
||||||
}
|
}
|
||||||
return reply.redirect(`/webhooks/success?token=${data.access_token}`)
|
return reply.redirect(`/webhooks/success?token=${access_token}`)
|
||||||
} catch ({ status, message, ...other }) {
|
} catch ({ status, message, ...other }) {
|
||||||
return errorHandler({ status, message })
|
return errorHandler({ status, message })
|
||||||
}
|
}
|
||||||
|
1
apps/api/tags.json
Normal file
1
apps/api/tags.json
Normal file
File diff suppressed because one or more lines are too long
1
apps/api/templates.json
Normal file
1
apps/api/templates.json
Normal file
File diff suppressed because one or more lines are too long
@ -91,6 +91,7 @@
|
|||||||
<div class="absolute top-0 right-0 flex justify-center items-center h-full cursor-pointer text-stone-600 hover:text-white mr-3">
|
<div class="absolute top-0 right-0 flex justify-center items-center h-full cursor-pointer text-stone-600 hover:text-white mr-3">
|
||||||
<div class="flex space-x-2">
|
<div class="flex space-x-2">
|
||||||
{#if isPasswordField}
|
{#if isPasswordField}
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div on:click={() => (showPassword = !showPassword)}>
|
<div on:click={() => (showPassword = !showPassword)}>
|
||||||
{#if showPassword}
|
{#if showPassword}
|
||||||
<svg
|
<svg
|
||||||
@ -132,6 +133,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{#if value && isHttps}
|
{#if value && isHttps}
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div on:click={copyToClipboard}>
|
<div on:click={copyToClipboard}>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<a
|
<a
|
||||||
{id}
|
{id}
|
||||||
href={url}
|
href={url}
|
||||||
target="_blank"
|
target="_blank noreferrer"
|
||||||
class="flex no-underline inline-block cursor-pointer"
|
class="flex no-underline inline-block cursor-pointer"
|
||||||
class:icons={!text}
|
class:icons={!text}
|
||||||
>
|
>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
// import Tooltip from './Tooltip.svelte';
|
// import Tooltip from './Tooltip.svelte';
|
||||||
export let explanation = '';
|
export let explanation = '';
|
||||||
export let position = 'dropdown-right'
|
export let position = 'dropdown-right';
|
||||||
// let id: any;
|
// let id: any;
|
||||||
// let self: any;
|
// let self: any;
|
||||||
// onMount(() => {
|
// onMount(() => {
|
||||||
@ -13,32 +13,26 @@
|
|||||||
|
|
||||||
<div class={`dropdown dropdown-end ${position}`}>
|
<div class={`dropdown dropdown-end ${position}`}>
|
||||||
<!-- svelte-ignore a11y-label-has-associated-control -->
|
<!-- svelte-ignore a11y-label-has-associated-control -->
|
||||||
|
<!-- svelte-ignore a11y-no-noninteractive-tabindex -->
|
||||||
<label tabindex="0" class="btn btn-circle btn-ghost btn-xs text-sky-500">
|
<label tabindex="0" class="btn btn-circle btn-ghost btn-xs text-sky-500">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="w-4 h-4 stroke-current"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
class="w-4 h-4 stroke-current"
|
||||||
|
><path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
|
||||||
|
/></svg
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
|
<!-- svelte-ignore a11y-no-noninteractive-tabindex -->
|
||||||
<div tabindex="0" class="card compact dropdown-content shadow bg-coolgray-400 rounded w-64">
|
<div tabindex="0" class="card compact dropdown-content shadow bg-coolgray-400 rounded w-64">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<!-- <h2 class="card-title">You needed more info?</h2> -->
|
<!-- <h2 class="card-title">You needed more info?</h2> -->
|
||||||
<p class="text-xs font-normal">{@html explanation}</p>
|
<p class="text-xs font-normal">{@html explanation}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<!-- <div {id} class="inline-block mx-2 cursor-pointer" bind:this={self}>
|
|
||||||
<svg
|
|
||||||
fill="none"
|
|
||||||
height="14"
|
|
||||||
shape-rendering="geometricPrecision"
|
|
||||||
stroke="currentColor"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="1.4"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="14"
|
|
||||||
><path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z" /><path
|
|
||||||
d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"
|
|
||||||
/><circle cx="12" cy="17" r=".5" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
</div>
|
||||||
{#if id}
|
|
||||||
<Tooltip triggeredBy={`#${id}`}>{@html explanation}</Tooltip>
|
|
||||||
{/if} -->
|
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class:text-center={isCenter} class={`flex justify-center ${customClass}`}>
|
<div class:text-center={isCenter} class={`flex justify-center ${customClass}`}>
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div
|
<div
|
||||||
on:click
|
on:click
|
||||||
aria-pressed="false"
|
aria-pressed="false"
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div
|
<div
|
||||||
on:click={() => dispatch('click')}
|
on:click={() => dispatch('click')}
|
||||||
on:mouseover={() => dispatch('pause')}
|
on:mouseover={() => dispatch('pause')}
|
||||||
|
@ -257,6 +257,7 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div
|
<div
|
||||||
id="logout"
|
id="logout"
|
||||||
class="icons bg-coolgray-200 hover:text-error cursor-pointer"
|
class="icons bg-coolgray-200 hover:text-error cursor-pointer"
|
||||||
@ -285,7 +286,7 @@
|
|||||||
<a
|
<a
|
||||||
class="text-[10px] no-underline"
|
class="text-[10px] no-underline"
|
||||||
href={`https://github.com/coollabsio/coolify/releases/tag/v${$appSession.version}`}
|
href={`https://github.com/coollabsio/coolify/releases/tag/v${$appSession.version}`}
|
||||||
target="_blank">v{$appSession.version}</a
|
target="_blank noreferrer">v{$appSession.version}</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -293,7 +294,7 @@
|
|||||||
</nav>
|
</nav>
|
||||||
{#if $appSession.whiteLabeled}
|
{#if $appSession.whiteLabeled}
|
||||||
<span class="fixed bottom-0 left-[50px] z-50 m-2 px-4 text-xs text-stone-700"
|
<span class="fixed bottom-0 left-[50px] z-50 m-2 px-4 text-xs text-stone-700"
|
||||||
>Powered by <a href="https://coolify.io" target="_blank">Coolify</a></span
|
>Powered by <a href="https://coolify.io" target="_blank noreferrer">Coolify</a></span
|
||||||
>
|
>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
@ -434,6 +435,7 @@
|
|||||||
<UpdateAvailable />
|
<UpdateAvailable />
|
||||||
</div>
|
</div>
|
||||||
<li>
|
<li>
|
||||||
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div class="no-underline icons hover:bg-error" on:click={logout}>
|
<div class="no-underline icons hover:bg-error" on:click={logout}>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
@ -458,7 +460,7 @@
|
|||||||
<a
|
<a
|
||||||
class="text-xs hover:bg-coolgray-200 no-underline hover:text-white text-right"
|
class="text-xs hover:bg-coolgray-200 no-underline hover:text-white text-right"
|
||||||
href={`https://github.com/coollabsio/coolify/releases/tag/v${$appSession.version}`}
|
href={`https://github.com/coollabsio/coolify/releases/tag/v${$appSession.version}`}
|
||||||
target="_blank">v{$appSession.version}</a
|
target="_blank noreferrer">v{$appSession.version}</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -29,7 +29,6 @@ importers:
|
|||||||
'@types/node-os-utils': 1.3.0
|
'@types/node-os-utils': 1.3.0
|
||||||
'@typescript-eslint/eslint-plugin': 5.41.0
|
'@typescript-eslint/eslint-plugin': 5.41.0
|
||||||
'@typescript-eslint/parser': 5.41.0
|
'@typescript-eslint/parser': 5.41.0
|
||||||
axios: 0.27.2
|
|
||||||
bcryptjs: 2.4.3
|
bcryptjs: 2.4.3
|
||||||
bree: 9.1.2
|
bree: 9.1.2
|
||||||
cabin: 9.1.2
|
cabin: 9.1.2
|
||||||
@ -63,7 +62,6 @@ importers:
|
|||||||
public-ip: 6.0.1
|
public-ip: 6.0.1
|
||||||
pump: ^3.0.0
|
pump: ^3.0.0
|
||||||
rimraf: 3.0.2
|
rimraf: 3.0.2
|
||||||
semver-sort: 1.0.0
|
|
||||||
ssh-config: 4.1.6
|
ssh-config: 4.1.6
|
||||||
strip-ansi: 7.0.1
|
strip-ansi: 7.0.1
|
||||||
tsconfig-paths: 4.1.0
|
tsconfig-paths: 4.1.0
|
||||||
@ -81,7 +79,6 @@ importers:
|
|||||||
'@iarna/toml': 2.2.5
|
'@iarna/toml': 2.2.5
|
||||||
'@ladjs/graceful': 3.0.2
|
'@ladjs/graceful': 3.0.2
|
||||||
'@prisma/client': 4.5.0_prisma@4.5.0
|
'@prisma/client': 4.5.0_prisma@4.5.0
|
||||||
axios: 0.27.2
|
|
||||||
bcryptjs: 2.4.3
|
bcryptjs: 2.4.3
|
||||||
bree: 9.1.2
|
bree: 9.1.2
|
||||||
cabin: 9.1.2
|
cabin: 9.1.2
|
||||||
@ -123,7 +120,6 @@ importers:
|
|||||||
nodemon: 2.0.20
|
nodemon: 2.0.20
|
||||||
prettier: 2.7.1
|
prettier: 2.7.1
|
||||||
rimraf: 3.0.2
|
rimraf: 3.0.2
|
||||||
semver-sort: 1.0.0
|
|
||||||
tsconfig-paths: 4.1.0
|
tsconfig-paths: 4.1.0
|
||||||
typescript: 4.8.4
|
typescript: 4.8.4
|
||||||
|
|
||||||
@ -732,7 +728,7 @@ packages:
|
|||||||
eslint: 8.26.0
|
eslint: 8.26.0
|
||||||
ignore: 5.2.0
|
ignore: 5.2.0
|
||||||
regexpp: 3.2.0
|
regexpp: 3.2.0
|
||||||
semver: 7.3.7
|
semver: 7.3.8
|
||||||
tsutils: 3.21.0_typescript@4.8.4
|
tsutils: 3.21.0_typescript@4.8.4
|
||||||
typescript: 4.8.4
|
typescript: 4.8.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@ -806,7 +802,7 @@ packages:
|
|||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
globby: 11.1.0
|
globby: 11.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
semver: 7.3.7
|
semver: 7.3.8
|
||||||
tsutils: 3.21.0_typescript@4.8.4
|
tsutils: 3.21.0_typescript@4.8.4
|
||||||
typescript: 4.8.4
|
typescript: 4.8.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@ -827,7 +823,7 @@ packages:
|
|||||||
eslint: 8.26.0
|
eslint: 8.26.0
|
||||||
eslint-scope: 5.1.1
|
eslint-scope: 5.1.1
|
||||||
eslint-utils: 3.0.0_eslint@8.26.0
|
eslint-utils: 3.0.0_eslint@8.26.0
|
||||||
semver: 7.3.7
|
semver: 7.3.8
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
- typescript
|
- typescript
|
||||||
@ -1079,15 +1075,6 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/axios/0.27.2:
|
|
||||||
resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
|
|
||||||
dependencies:
|
|
||||||
follow-redirects: 1.15.0
|
|
||||||
form-data: 4.0.0
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- debug
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/babel-code-frame/6.26.0:
|
/babel-code-frame/6.26.0:
|
||||||
resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==}
|
resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -3127,7 +3114,7 @@ packages:
|
|||||||
proxy-addr: 2.0.7
|
proxy-addr: 2.0.7
|
||||||
rfdc: 1.3.0
|
rfdc: 1.3.0
|
||||||
secure-json-parse: 2.5.0
|
secure-json-parse: 2.5.0
|
||||||
semver: 7.3.7
|
semver: 7.3.8
|
||||||
tiny-lru: 9.0.2
|
tiny-lru: 9.0.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@ -3243,16 +3230,6 @@ packages:
|
|||||||
mini-svg-data-uri: 1.4.4
|
mini-svg-data-uri: 1.4.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/follow-redirects/1.15.0:
|
|
||||||
resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==}
|
|
||||||
engines: {node: '>=4.0'}
|
|
||||||
peerDependencies:
|
|
||||||
debug: '*'
|
|
||||||
peerDependenciesMeta:
|
|
||||||
debug:
|
|
||||||
optional: true
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/form-data-encoder/2.0.1:
|
/form-data-encoder/2.0.1:
|
||||||
resolution: {integrity: sha512-Oy+P9w5mnO4TWXVgUiQvggNKPI9/ummcSt5usuIV6HkaLKigwzPpoenhEqmGmx3zHqm6ZLJ+CR/99N8JLinaEw==}
|
resolution: {integrity: sha512-Oy+P9w5mnO4TWXVgUiQvggNKPI9/ummcSt5usuIV6HkaLKigwzPpoenhEqmGmx3zHqm6ZLJ+CR/99N8JLinaEw==}
|
||||||
engines: {node: '>= 14.17'}
|
engines: {node: '>= 14.17'}
|
||||||
@ -4707,7 +4684,7 @@ packages:
|
|||||||
last-commit-log: 3.1.2
|
last-commit-log: 3.1.2
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
read-pkg-up: 7.0.1
|
read-pkg-up: 7.0.1
|
||||||
semver: 7.3.7
|
semver: 7.3.8
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/parse-err/0.0.12:
|
/parse-err/0.0.12:
|
||||||
@ -5321,19 +5298,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==}
|
resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/semver-regex/3.1.4:
|
|
||||||
resolution: {integrity: sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==}
|
|
||||||
engines: {node: '>=8'}
|
|
||||||
dev: true
|
|
||||||
|
|
||||||
/semver-sort/1.0.0:
|
|
||||||
resolution: {integrity: sha512-JicVlQKz/C//4BiPmbHEDou6HihXxo5xqB/8Hm9FaLJ6HHkRRvYgCECq4u/z0XF8kyJQ/KAZt++A/kYz/oOSSg==}
|
|
||||||
engines: {node: '>=0.10.0'}
|
|
||||||
dependencies:
|
|
||||||
semver: 5.7.1
|
|
||||||
semver-regex: 3.1.4
|
|
||||||
dev: true
|
|
||||||
|
|
||||||
/semver/5.7.1:
|
/semver/5.7.1:
|
||||||
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
|
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
@ -5343,8 +5307,8 @@ packages:
|
|||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/semver/7.3.7:
|
/semver/7.3.8:
|
||||||
resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
|
resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -5659,7 +5623,7 @@ packages:
|
|||||||
mime: 2.6.0
|
mime: 2.6.0
|
||||||
qs: 6.10.3
|
qs: 6.10.3
|
||||||
readable-stream: 3.6.0
|
readable-stream: 3.6.0
|
||||||
semver: 7.3.7
|
semver: 7.3.8
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
Loading…
Reference in New Issue
Block a user