From 126e3674d82bfa408ec4dc8bbf29acfc7f785758 Mon Sep 17 00:00:00 2001 From: wanhose Date: Fri, 11 Oct 2024 15:36:10 +0200 Subject: [PATCH] feat: migrate to gitlab.com --- .github/FUNDING.yml | 1 - .gitlab/issue_templates/default.md | 21 + .../merge_request_templates/default.md | 0 docs/README.md => README.md | 4 +- packages/api/.env.example | 4 +- packages/api/{docs => }/README.md | 2 +- packages/api/package.json | 1 - packages/api/src/index.ts | 4 - packages/api/src/routes/v1/entries.ts | 21 +- packages/api/src/routes/v1/report.ts | 21 +- packages/api/src/routes/v2/data.ts | 49 +- packages/api/src/routes/v2/report.ts | 73 +-- packages/api/src/routes/v3/data.ts | 43 +- packages/api/src/routes/v3/report.ts | 77 +-- packages/api/src/routes/v4/data.ts | 45 +- packages/api/src/routes/v5/issues.ts | 33 +- packages/api/src/routes/v5/report.ts | 69 +-- packages/api/src/routes/v5/version.ts | 27 - packages/api/src/services/environment.ts | 9 +- packages/api/src/services/format.ts | 28 + packages/api/src/services/git.ts | 140 +++++ packages/api/src/services/octokit.ts | 4 - packages/api/src/services/rateLimit.ts | 19 + .../browser-extension/{docs => }/README.md | 8 +- packages/web/src/index.html | 47 +- yarn.lock | 507 +----------------- 26 files changed, 467 insertions(+), 790 deletions(-) delete mode 100644 .github/FUNDING.yml create mode 100644 .gitlab/issue_templates/default.md rename docs/pull_request_template.md => .gitlab/merge_request_templates/default.md (100%) rename docs/README.md => README.md (73%) rename packages/api/{docs => }/README.md (95%) delete mode 100644 packages/api/src/routes/v5/version.ts create mode 100644 packages/api/src/services/format.ts create mode 100644 packages/api/src/services/git.ts delete mode 100644 packages/api/src/services/octokit.ts create mode 100644 packages/api/src/services/rateLimit.ts rename packages/browser-extension/{docs => }/README.md (97%) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 90199ee..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -custom: ['https://paypal.me/wanhose'] diff --git a/.gitlab/issue_templates/default.md b/.gitlab/issue_templates/default.md new file mode 100644 index 0000000..6e5ba97 --- /dev/null +++ b/.gitlab/issue_templates/default.md @@ -0,0 +1,21 @@ +## Issue information + +#### 🖥️ Browser + +... + +#### 📱 Device + +... + +#### 📝 Reason + +... + +#### 🔗 URL + +... + +#### 🏷️ Version + +... diff --git a/docs/pull_request_template.md b/.gitlab/merge_request_templates/default.md similarity index 100% rename from docs/pull_request_template.md rename to .gitlab/merge_request_templates/default.md diff --git a/docs/README.md b/README.md similarity index 73% rename from docs/README.md rename to README.md index 803b907..a778c7c 100644 --- a/docs/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Cookie Monster Dialog +# Cookie Dialog Monster -Cookie Monster Dialog is a browser extension that hides cookie consent dialogs without changing user preferences. By default, we do NOT accept cookies (except in [a few cases](https://github.com/wanhose/cookie-dialog-monster/blob/main/database.json#L248) where the pages do not function without accepting them). You can report broken sites with a single click, which will create an issue in this repository to be fixed promptly. +Cookie Dialog Monster is a browser extension that hides cookie consent dialogs without changing user preferences. By default, we do NOT accept cookies (except in [a few cases](https://gitlab.com/wanhose/cookie-dialog-monster/blob/main/database.json#L248) where the pages do not function without accepting them). You can report broken sites with a single click, which will create an issue in this repository to be fixed promptly. ## Repositories diff --git a/packages/api/.env.example b/packages/api/.env.example index e0915c7..c59a5de 100644 --- a/packages/api/.env.example +++ b/packages/api/.env.example @@ -1 +1,3 @@ -GITHUB_TOKEN=? +GITLAB_PROJECT_ID=? +GITLAB_RAW=? +GITLAB_TOKEN=? diff --git a/packages/api/docs/README.md b/packages/api/README.md similarity index 95% rename from packages/api/docs/README.md rename to packages/api/README.md index 3559ffb..26fc638 100644 --- a/packages/api/docs/README.md +++ b/packages/api/README.md @@ -1,4 +1,4 @@ -# Cookie Monster Dialog API +# Cookie Dialog Monster API ## Installation diff --git a/packages/api/package.json b/packages/api/package.json index 96f04d6..a9d3823 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -12,7 +12,6 @@ "@fastify/rate-limit": "^9.1.0", "fastify": "^4.26.2", "node-fetch": "^2.7.0", - "octokit": "^3.2.1", "ua-parser-js": "^1.0.37", "yup": "^1.4.0" }, diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 788b2d2..38e7ed8 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -12,7 +12,6 @@ import v4ReportRoutes from 'routes/v4/report'; import v5DataRoutes from 'routes/v5/data'; import v5IssuesRoutes from 'routes/v5/issues'; import v5ReportRoutes from 'routes/v5/report'; -import v5VersionRoutes from 'routes/v5/version'; import environment from 'services/environment'; const server = fastify({ logger: true }); @@ -27,8 +26,6 @@ server.register(cors, { server.register(rateLimit, { global: false, - max: 1, - timeWindow: 30000, }); server.register(v1EntriesRoutes, { prefix: '/rest/v1' }); @@ -42,7 +39,6 @@ server.register(v4ReportRoutes, { prefix: '/rest/v4' }); server.register(v5DataRoutes, { prefix: '/rest/v5' }); server.register(v5IssuesRoutes, { prefix: '/rest/v5' }); server.register(v5ReportRoutes, { prefix: '/rest/v5' }); -server.register(v5VersionRoutes, { prefix: '/rest/v5' }); server.listen({ host: '0.0.0.0', port: environment.port }, (error, address) => { if (error) { diff --git a/packages/api/src/routes/v1/entries.ts b/packages/api/src/routes/v1/entries.ts index 63c2f5c..6cd07d4 100644 --- a/packages/api/src/routes/v1/entries.ts +++ b/packages/api/src/routes/v1/entries.ts @@ -1,15 +1,24 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; +import { RATE_LIMIT_1_PER_HOUR } from 'services/rateLimit'; /** * @deprecated This API route is no longer supported. Please use a newer version */ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { - server.get('/entries/', async (_request, reply) => { - reply.send({ - success: false, - errors: ['This API route is no longer supported. Please use a newer version'], - }); - }); + server.get( + '/entries/', + { + config: { + rateLimit: RATE_LIMIT_1_PER_HOUR, + }, + }, + async (_request, reply) => { + reply.send({ + success: false, + errors: ['This API route is no longer supported. Please use a newer version'], + }); + } + ); done(); }; diff --git a/packages/api/src/routes/v1/report.ts b/packages/api/src/routes/v1/report.ts index 6ec6f57..c76612d 100644 --- a/packages/api/src/routes/v1/report.ts +++ b/packages/api/src/routes/v1/report.ts @@ -1,15 +1,24 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; +import { RATE_LIMIT_1_PER_HOUR } from 'services/rateLimit'; /** * @deprecated This API route is no longer supported. Please use a newer version */ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { - server.post('/report/', {}, async (_request, reply) => { - reply.send({ - success: false, - errors: ['This API route is no longer supported. Please use a newer version'], - }); - }); + server.post( + '/report/', + { + config: { + rateLimit: RATE_LIMIT_1_PER_HOUR, + }, + }, + async (_request, reply) => { + reply.send({ + success: false, + errors: ['This API route is no longer supported. Please use a newer version'], + }); + } + ); done(); }; diff --git a/packages/api/src/routes/v2/data.ts b/packages/api/src/routes/v2/data.ts index fa0087a..6cc4687 100644 --- a/packages/api/src/routes/v2/data.ts +++ b/packages/api/src/routes/v2/data.ts @@ -2,29 +2,40 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; import { parseNewFix } from 'services/compatibility'; import environment from 'services/environment'; +import { RATE_LIMIT_10_PER_MIN } from 'services/rateLimit'; export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { - server.get('/data/', async (_request, reply) => { - try { - const url = `${environment.github.files}/database.json`; - const result = await (await fetch(url)).json(); + server.get( + '/data/', + { + config: { + rateLimit: RATE_LIMIT_10_PER_MIN, + }, + }, + async (_request, reply) => { + try { + const url = `${environment.gitlab.raw}/database.json`; + const result = await (await fetch(url)).json(); - reply.send({ - data: { - classes: result.tokens.classes, - commonWords: result.commonWords, - elements: result.tokens.selectors, - fixes: result.fixes.map(parseNewFix), - skips: result.skips.domains, - tags: result.skips.tags, - }, - success: true, - }); - } catch (e) { - console.error(e); - reply.send({ success: false }); + reply.send({ + data: { + classes: result.tokens.classes, + commonWords: result.commonWords, + elements: result.tokens.selectors, + fixes: result.fixes.map(parseNewFix), + skips: result.skips.domains, + tags: result.skips.tags, + }, + success: true, + }); + } catch (error) { + reply.send({ + errors: [error.message], + success: false, + }); + } } - }); + ); done(); }; diff --git a/packages/api/src/routes/v2/report.ts b/packages/api/src/routes/v2/report.ts index 140d57c..d0758a5 100644 --- a/packages/api/src/routes/v2/report.ts +++ b/packages/api/src/routes/v2/report.ts @@ -1,6 +1,7 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; -import environment from 'services/environment'; -import { octokit } from 'services/octokit'; +import { formatMessage } from 'services/format'; +import { createIssue, createIssueComment, getIssue, updateIssue } from 'services/git'; +import { RATE_LIMIT_1_PER_MIN } from 'services/rateLimit'; import { validatorCompiler } from 'services/validation'; import { UAParser } from 'ua-parser-js'; import * as yup from 'yup'; @@ -22,6 +23,9 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: server.post<{ Body: PostReportBody }>( '/report/', { + config: { + rateLimit: RATE_LIMIT_1_PER_MIN, + }, schema: { body: PostReportBodySchema, }, @@ -29,45 +33,46 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: }, async (request, reply) => { try { - const issues = await octokit.request('GET /repos/{owner}/{repo}/issues', { - owner: environment.github.owner, - repo: environment.github.repo, - }); - const ua = new UAParser(request.body.userAgent ?? '').getResult(); - const url = new URL(request.body.url).hostname - .split('.') - .slice(-3) - .join('.') - .replace('www.', ''); + const { reason, url, userAgent, version } = request.body; + const hostname = new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', ''); + const issue = await getIssue({ title: hostname }); + const ua = new UAParser(userAgent ?? '').getResult(); - if (issues.data.some((issue) => issue.title.includes(url))) { - throw new Error(); + if (issue) { + if (issue.state === 'closed') { + await updateIssue({ + event: 'reopen', + iid: issue.iid, + labels: ['bug'], + labelsToRemove: issue.labels, + }); + } + + await createIssueComment({ + description: formatMessage({ reason, ua, url, version }), + iid: issue.iid, + }); + + reply.send({ + success: true, + }); + return; } - await octokit.request('POST /repos/{owner}/{repo}/issues', { - assignees: [environment.github.owner], - body: [ - '## Specifications', - '#### Browser', - `${ua.browser.name ? `${ua.browser.name} ${ua.browser.version || ''}` : '-'}`, - '#### Device', - `${ua.device.type && ua.device.vendor ? `${ua.device.vendor} (${ua.device.type})` : '-'}`, - '#### Reason', - request.body.reason ?? '-', - '#### URL', - request.body.url, - '#### Version', - request.body.version, - ].join('\n'), + await createIssue({ + description: formatMessage({ reason, ua, url, version }), labels: ['bug'], - owner: environment.github.owner, - repo: environment.github.repo, - title: url, + title: hostname, }); - reply.send({ success: true }); + reply.send({ + success: true, + }); } catch (error) { - reply.send({ errors: [error.message], success: false }); + reply.send({ + errors: [error.message], + success: false, + }); } } ); diff --git a/packages/api/src/routes/v3/data.ts b/packages/api/src/routes/v3/data.ts index 4dfcaa2..0ef1c84 100644 --- a/packages/api/src/routes/v3/data.ts +++ b/packages/api/src/routes/v3/data.ts @@ -2,27 +2,36 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; import { parseNewFix } from 'services/compatibility'; import environment from 'services/environment'; +import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit'; export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { - server.get('/data/', async (_request, reply) => { - try { - const url = `${environment.github.files}/database.json`; - const result = await (await fetch(url)).json(); + server.get( + '/data/', + { + config: { + rateLimit: RATE_LIMIT_3_PER_MIN, + }, + }, + async (_request, reply) => { + try { + const url = `${environment.gitlab.raw}/database.json`; + const result = await (await fetch(url)).json(); - reply.send({ - data: { - ...result, - fixes: result.fixes.map(parseNewFix), - }, - success: true, - }); - } catch (error) { - reply.send({ - errors: [error.message], - success: false, - }); + reply.send({ + data: { + ...result, + fixes: result.fixes.map(parseNewFix), + }, + success: true, + }); + } catch (error) { + reply.send({ + errors: [error.message], + success: false, + }); + } } - }); + ); done(); }; diff --git a/packages/api/src/routes/v3/report.ts b/packages/api/src/routes/v3/report.ts index 9fa1c89..71d0285 100644 --- a/packages/api/src/routes/v3/report.ts +++ b/packages/api/src/routes/v3/report.ts @@ -1,6 +1,7 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; -import environment from 'services/environment'; -import { octokit } from 'services/octokit'; +import { formatMessage } from 'services/format'; +import { createIssue, createIssueComment, getIssue, updateIssue } from 'services/git'; +import { RATE_LIMIT_1_PER_MIN } from 'services/rateLimit'; import { validatorCompiler } from 'services/validation'; import { UAParser } from 'ua-parser-js'; import * as yup from 'yup'; @@ -22,63 +23,51 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: server.post<{ Body: PostReportBody }>( '/report/', { + config: { + rateLimit: RATE_LIMIT_1_PER_MIN, + }, schema: { body: PostReportBodySchema, }, validatorCompiler, }, async (request, reply) => { - const { url, userAgent } = request.body; - const ua = new UAParser(userAgent ?? '').getResult(); - const hostname = new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', ''); - const existingIssues = await octokit.request('GET /search/issues', { - per_page: 50, - q: `in:title+is:issue+repo:${environment.github.owner}/${environment.github.repo}+${hostname}`, - }); - const existingIssue = existingIssues.data.items.find( - (issue) => - hostname === issue.title && - (issue.state === 'open' || - (issue.state === 'closed' && issue.labels.some((label) => label.name === 'wontfix'))) - ); - try { - if (existingIssue) { - if (existingIssue.state === 'closed') { - await octokit.request('PATCH /repos/{owner}/{repo}/issues/{issue_number}', { - issue_number: existingIssue.number, + const { reason, url, userAgent, version } = request.body; + const hostname = new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', ''); + const issue = await getIssue({ title: hostname }); + const ua = new UAParser(userAgent ?? '').getResult(); + + if (issue) { + if (issue.state === 'closed') { + await updateIssue({ + event: 'reopen', + iid: issue.iid, labels: ['bug'], - owner: environment.github.owner, - repo: environment.github.repo, - state: 'open', + labelsToRemove: issue.labels, }); } - await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', { - body: generateText(request.body, ua), - issue_number: existingIssue.number, - owner: environment.github.owner, - repo: environment.github.repo, + await createIssueComment({ + description: formatMessage({ reason, ua, url, version }), + iid: issue.iid, }); reply.send({ - data: existingIssue.html_url, + data: issue.web_url, success: true, }); return; } - const response = await octokit.request('POST /repos/{owner}/{repo}/issues', { - assignees: [environment.github.owner], - body: generateText(request.body, ua), + const newIssue = await createIssue({ + description: formatMessage({ reason, ua, url, version }), labels: ['bug'], - owner: environment.github.owner, - repo: environment.github.repo, title: hostname, }); reply.send({ - data: response.data.html_url, + data: newIssue.web_url, success: true, }); } catch (error) { @@ -92,21 +81,3 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: done(); }; - -function generateText(body: PostReportBody, ua: UAParser.IResult): string { - return [ - '## Issue information', - ...(ua.browser.name && ua.browser.version - ? ['#### 🖥️ Browser', `${ua.browser.name} (${ua.browser.version})`] - : []), - ...(ua.device.type && ua.device.vendor - ? ['#### 📱 Device', `${ua.device.vendor} (${ua.device.type})`] - : []), - '#### 📝 Reason', - body.reason, - '#### 🔗 URL', - body.url, - '#### 🏷️ Version', - body.version, - ].join('\n'); -} diff --git a/packages/api/src/routes/v4/data.ts b/packages/api/src/routes/v4/data.ts index d7efbfd..17715f5 100644 --- a/packages/api/src/routes/v4/data.ts +++ b/packages/api/src/routes/v4/data.ts @@ -1,28 +1,37 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; import environment from 'services/environment'; +import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit'; export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { - server.get('/data/', async (_request, reply) => { - try { - const options = { headers: { 'Cache-Control': 'no-cache' } }; - const url = `${environment.github.files}/database.json`; - const { rules, ...result } = await (await fetch(url, options)).json(); + server.get( + '/data/', + { + config: { + rateLimit: RATE_LIMIT_3_PER_MIN, + }, + }, + async (_request, reply) => { + try { + const options = { headers: { 'Cache-Control': 'no-cache' } }; + const url = `${environment.gitlab.raw}/database.json`; + const { rules, ...result } = await (await fetch(url, options)).json(); - reply.send({ - data: { - ...result, - rules: rules.map(toDeclarativeNetRequestRule), - }, - success: true, - }); - } catch (error) { - reply.send({ - errors: [error.message], - success: false, - }); + reply.send({ + data: { + ...result, + rules: rules.map(toDeclarativeNetRequestRule), + }, + success: true, + }); + } catch (error) { + reply.send({ + errors: [error.message], + success: false, + }); + } } - }); + ); done(); }; diff --git a/packages/api/src/routes/v5/issues.ts b/packages/api/src/routes/v5/issues.ts index 2d11f53..05fd761 100644 --- a/packages/api/src/routes/v5/issues.ts +++ b/packages/api/src/routes/v5/issues.ts @@ -1,6 +1,6 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; -import environment from 'services/environment'; -import { octokit } from 'services/octokit'; +import { getIssue } from 'services/git'; +import { RATE_LIMIT_10_PER_MIN } from 'services/rateLimit'; import { validatorCompiler } from 'services/validation'; import * as yup from 'yup'; @@ -14,6 +14,9 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: server.get<{ Params: GetIssuesParams }>( '/issues/:hostname', { + config: { + rateLimit: RATE_LIMIT_10_PER_MIN, + }, schema: { params: GetIssuesParamsSchema, }, @@ -22,30 +25,22 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: async (request, reply) => { try { const { hostname } = request.params; - const existingIssues = await octokit.request('GET /search/issues', { - per_page: 50, - q: `in:title+is:issue+repo:${environment.github.owner}/${environment.github.repo}+${hostname}`, - }); - const existingIssue = existingIssues.data.items.find( - (issue) => - hostname === issue.title && - (issue.state === 'open' || - (issue.state === 'closed' && issue.labels.some((label) => label.name === 'wontfix'))) - ); + const issue = await getIssue({ title: hostname }); - if (existingIssue) { + if ( + issue && + ((issue.state === 'closed' && issue.labels.includes('wontfix')) || + issue.state === 'opened') + ) { reply.send({ data: { - flags: existingIssue.labels.map((label) => label.name), - url: existingIssue.html_url, + flags: issue.labels, + url: issue.web_url, }, success: true, }); } else { - reply.send({ - data: {}, - success: true, - }); + throw new Error('Failed to find issue'); } } catch (error) { reply.send({ diff --git a/packages/api/src/routes/v5/report.ts b/packages/api/src/routes/v5/report.ts index 5f2362c..cd00dc2 100644 --- a/packages/api/src/routes/v5/report.ts +++ b/packages/api/src/routes/v5/report.ts @@ -1,8 +1,12 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; -import environment from 'services/environment'; -import { octokit } from 'services/octokit'; +import { formatMessage } from 'services/format'; +import { createIssue, getIssue, updateIssue } from 'services/git'; +import { RATE_LIMIT_1_PER_MIN } from 'services/rateLimit'; +// import environment from 'services/environment'; +// import { octokit } from 'services/octokit'; import { validatorCompiler } from 'services/validation'; import { UAParser } from 'ua-parser-js'; +// import { UAParser } from 'ua-parser-js'; import * as yup from 'yup'; const PostReportBodySchema = yup.object().shape({ @@ -22,35 +26,34 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: server.post<{ Body: PostReportBody }>( '/report/', { + config: { + rateLimit: RATE_LIMIT_1_PER_MIN, + }, schema: { body: PostReportBodySchema, }, validatorCompiler, }, async (request, reply) => { - const { reason, url, userAgent, version } = request.body; - const ua = new UAParser(userAgent ?? '').getResult(); - const hostname = new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', ''); - const existingIssues = await octokit.request('GET /search/issues', { - per_page: 50, - q: `in:title+is:issue+repo:${environment.github.owner}/${environment.github.repo}+${hostname}`, - }); - const existingIssue = existingIssues.data.items.find((issue) => hostname === issue.title); - try { - if (existingIssue) { - if (existingIssue.labels.some((label) => label.name === 'wontfix')) { + const { reason, url, userAgent, version } = request.body; + const hostname = new URL(url).hostname.split('.').slice(-3).join('.').replace('www.', ''); + const issue = await getIssue({ title: hostname }); + const ua = new UAParser(userAgent ?? '').getResult(); + + if (issue) { + if (issue.labels.some((label) => label === 'wontfix')) { reply.send({ - data: existingIssue.html_url, + data: issue.web_url, errors: ['This issue has been marked as "wontfix" and will not be addressed.'], success: false, }); return; } - if (existingIssue.state === 'open') { + if (issue.state === 'opened') { reply.send({ - data: existingIssue.html_url, + data: issue.web_url, errors: [ 'This issue already exists. Please refer to the existing issue for updates.', ], @@ -59,46 +62,28 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: return; } - await octokit.request('PATCH /repos/{owner}/{repo}/issues/{issue_number}', { - issue_number: existingIssue.number, + await updateIssue({ + event: 'reopen', + iid: issue.iid, labels: ['bug'], - owner: environment.github.owner, - repo: environment.github.repo, - state: 'open', + labelsToRemove: issue.labels, }); reply.send({ - data: existingIssue.html_url, + data: issue.web_url, success: true, }); return; } - const response = await octokit.request('POST /repos/{owner}/{repo}/issues', { - assignees: [environment.github.owner], - body: [ - '## Issue information', - ...(ua.browser.name && ua.browser.version - ? ['#### 🖥️ Browser', `${ua.browser.name} (${ua.browser.version})`] - : []), - ...(ua.device.type && ua.device.vendor - ? ['#### 📱 Device', `${ua.device.vendor} (${ua.device.type})`] - : []), - '#### 📝 Reason', - reason, - '#### 🔗 URL', - url, - '#### 🏷️ Version', - version, - ].join('\n'), + const newIssue = await createIssue({ + description: formatMessage({ reason, ua, url, version }), labels: ['bug'], - owner: environment.github.owner, - repo: environment.github.repo, title: hostname, }); reply.send({ - data: response.data.html_url, + data: newIssue.web_url, success: true, }); } catch (error) { diff --git a/packages/api/src/routes/v5/version.ts b/packages/api/src/routes/v5/version.ts deleted file mode 100644 index f6b7b51..0000000 --- a/packages/api/src/routes/v5/version.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { FastifyInstance, RouteShorthandOptions } from 'fastify'; -import fetch from 'node-fetch'; -import environment from 'services/environment'; - -export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { - server.get('/version/', async (_request, reply) => { - try { - const options = { headers: { 'Cache-Control': 'no-cache' } }; - const url = `${environment.github.files}/packages/browser-extension/src/manifest.json`; - const { version } = await (await fetch(url, options)).json(); - - reply.send({ - data: { - version, - }, - success: true, - }); - } catch (error) { - reply.send({ - errors: [error.message], - success: false, - }); - } - }); - - done(); -}; diff --git a/packages/api/src/services/environment.ts b/packages/api/src/services/environment.ts index 85e1bf8..2377909 100644 --- a/packages/api/src/services/environment.ts +++ b/packages/api/src/services/environment.ts @@ -1,9 +1,8 @@ export default { - github: { - files: 'https://raw.githubusercontent.com/wanhose/cookie-dialog-monster/main', - owner: 'wanhose', - repo: 'cookie-dialog-monster', - token: process.env.GITHUB_TOKEN ?? '', + gitlab: { + projectId: process.env.GITLAB_PROJECT_ID ?? '', + raw: process.env.GITLAB_RAW ?? '', + token: process.env.GITLAB_TOKEN ?? '', }, port: (process.env.PORT ? Number(process.env.PORT) : undefined) ?? 8080, }; diff --git a/packages/api/src/services/format.ts b/packages/api/src/services/format.ts new file mode 100644 index 0000000..703d034 --- /dev/null +++ b/packages/api/src/services/format.ts @@ -0,0 +1,28 @@ +import type { IResult as UAParserResult } from 'ua-parser-js'; + +export function formatMessage(params: FormatMessageParams): string { + const { reason = '-', ua, url, version } = params; + + return [ + '## Issue information', + ...(ua.browser.name && ua.browser.version + ? ['#### 🖥️ Browser', `${ua.browser.name} (${ua.browser.version})`] + : []), + ...(ua.device.type && ua.device.vendor + ? ['#### 📱 Device', `${ua.device.vendor} (${ua.device.type})`] + : []), + '#### 📝 Reason', + reason, + '#### 🔗 URL', + url, + '#### 🏷️ Version', + version, + ].join('\n'); +} + +export interface FormatMessageParams { + readonly reason?: string; + readonly ua: UAParserResult; + readonly url: string; + readonly version: string; +} diff --git a/packages/api/src/services/git.ts b/packages/api/src/services/git.ts new file mode 100644 index 0000000..08d1764 --- /dev/null +++ b/packages/api/src/services/git.ts @@ -0,0 +1,140 @@ +import environment from './environment'; + +const API_URL = `https://gitlab.com/api/v4/projects/${environment.gitlab.projectId}`; + +export async function createIssue(params: CreateIssueParams): Promise { + const { description, labels, title } = params; + const body: { [key: string]: string } = { + description, + title, + }; + const headers = new Headers({ + 'Content-Type': 'application/json', + 'PRIVATE-TOKEN': environment.gitlab.token, + }); + + if (labels) { + body['labels'] = `${labels}`; + } + + const response = await fetch(`${API_URL}/issues`, { + body: JSON.stringify(body), + headers, + method: 'POST', + }); + const issue = await response.json(); + + return issue as unknown as Issue; +} + +export async function createIssueComment(params: CreateIssueCommentParams): Promise { + const { description, iid } = params; + const headers = new Headers({ + 'Content-Type': 'application/json', + 'PRIVATE-TOKEN': environment.gitlab.token, + }); + + const response = await fetch(`${API_URL}/issues/${iid}/discussions`, { + body: JSON.stringify({ body: description }), + headers, + method: 'POST', + }); + const issue = await response.json(); + + return issue as unknown as Issue | null; +} + +export async function getIssue(params: GetIssueParams): Promise { + const { labels, not, state, title } = params; + const headers = new Headers({ + 'Content-Type': 'application/json', + 'PRIVATE-TOKEN': environment.gitlab.token, + }); + const search = new URLSearchParams({ in: 'title', title }); + + if (labels) { + search.append('labels', `${labels}`); + } + + if (not) { + if (not.labels) { + search.append('not[labels]', `${not.labels}`); + } + + if (not.state) { + search.append('not[state]', not.state); + } + } + + if (state) { + search.append('state', state); + } + + const response = await fetch(`${API_URL}/issues?${search}`, { headers }); + const issues: readonly Issue[] = (await response.json()) as unknown as readonly Issue[]; + + return issues.find((issue) => issue.title === title) || null; +} + +export async function updateIssue(params: UpdateIssueParams): Promise { + const { event, iid, labels, labelsToRemove } = params; + const body: { [key: string]: string } = {}; + const headers = new Headers({ + 'Content-Type': 'application/json', + 'PRIVATE-TOKEN': environment.gitlab.token, + }); + + if (event) { + body['state_event'] = event; + } + + if (labels) { + body['labels'] = `${labels}`; + } + + if (labelsToRemove) { + body['remove_labels'] = `${labelsToRemove}`; + } + + const response = await fetch(`${API_URL}/issues/${iid}`, { + body: JSON.stringify(body), + headers, + method: 'PUT', + }); + const issue = await response.json(); + + return issue as unknown as Issue | null; +} + +export interface CreateIssueParams { + readonly description: string; + readonly labels?: readonly string[]; + readonly title: string; +} + +export interface CreateIssueCommentParams { + readonly description: string; + readonly iid: number; +} + +export interface GetIssueParams { + readonly labels?: readonly string[]; + readonly not?: Omit; + readonly state?: string; + readonly title: string; +} + +export interface Issue { + readonly iid: number; + readonly labels: readonly string[]; + readonly state: string; + readonly title: string; + readonly web_url: string; +} + +export interface UpdateIssueParams { + readonly event?: 'close' | 'reopen'; + readonly iid: number; + readonly labels?: readonly string[]; + readonly labelsToRemove?: readonly string[]; +} diff --git a/packages/api/src/services/octokit.ts b/packages/api/src/services/octokit.ts deleted file mode 100644 index c943fad..0000000 --- a/packages/api/src/services/octokit.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Octokit } from 'octokit'; -import environment from './environment'; - -export const octokit = new Octokit({ auth: environment.github.token }); diff --git a/packages/api/src/services/rateLimit.ts b/packages/api/src/services/rateLimit.ts new file mode 100644 index 0000000..afdd954 --- /dev/null +++ b/packages/api/src/services/rateLimit.ts @@ -0,0 +1,19 @@ +export const RATE_LIMIT_1_PER_HOUR = { + max: 1, + timeWindow: '1 hour', +}; + +export const RATE_LIMIT_1_PER_MIN = { + max: 1, + timeWindow: '1 minute', +}; + +export const RATE_LIMIT_10_PER_MIN = { + max: 10, + timeWindow: '1 minute', +}; + +export const RATE_LIMIT_3_PER_MIN = { + max: 3, + timeWindow: '1 minute', +}; diff --git a/packages/browser-extension/docs/README.md b/packages/browser-extension/README.md similarity index 97% rename from packages/browser-extension/docs/README.md rename to packages/browser-extension/README.md index 26d284e..d4194e9 100644 --- a/packages/browser-extension/docs/README.md +++ b/packages/browser-extension/README.md @@ -1,4 +1,4 @@ -# Cookie Monster Dialog Browser Extension +# Cookie Dialog Monster Browser Extension ## Downloads @@ -11,9 +11,9 @@ ## Compatibility -- All browsers based on Chromium 124+ (Blisk, Brave, Colibri, Epic Browser, Iron Browser, Vivaldi and many more) -- Google Chrome 124+ -- Microsoft Edge 124+ +- All browsers based on Chromium 127+ (Blisk, Brave, Colibri, Epic Browser, Iron Browser, Vivaldi and many more) +- Google Chrome 127+ +- Microsoft Edge 127+ - Mozilla Firefox 126+ - Mozilla Firefox Mobile 126+ diff --git a/packages/web/src/index.html b/packages/web/src/index.html index 259d5df..3aefefa 100644 --- a/packages/web/src/index.html +++ b/packages/web/src/index.html @@ -86,33 +86,36 @@ @@ -327,8 +330,8 @@

Open source

Feel free to contribute to our - - GitHub repository + + GitLab repository

@@ -478,7 +481,7 @@ version following @@ -492,7 +495,7 @@ the extension. We recommend you to follow this guide

An open source project built by you and - wanhose + wanhose

@@ -516,7 +519,7 @@ if (isMobile) { firefoxGuideLink.href = - 'https://github.com/wanhose/cookie-dialog-monster/tree/main/packages/browser-extension#installation-for-mozilla-firefox-mobile-users'; + 'https://gitlab.com/wanhose/cookie-dialog-monster/tree/main/packages/browser-extension#installation-for-mozilla-firefox-mobile-users'; firefoxLink.href = '/releases/latest-mozilla-mobile.xpi'; } }); diff --git a/yarn.lock b/yarn.lock index c8909eb..acaa8b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -498,316 +498,6 @@ __metadata: languageName: node linkType: hard -"@octokit/app@npm:^14.0.2": - version: 14.1.0 - resolution: "@octokit/app@npm:14.1.0" - dependencies: - "@octokit/auth-app": "npm:^6.0.0" - "@octokit/auth-unauthenticated": "npm:^5.0.0" - "@octokit/core": "npm:^5.0.0" - "@octokit/oauth-app": "npm:^6.0.0" - "@octokit/plugin-paginate-rest": "npm:^9.0.0" - "@octokit/types": "npm:^12.0.0" - "@octokit/webhooks": "npm:^12.0.4" - checksum: 10c0/c115209f3c8dd05ec5acb5897f9e914177a07e335a7ffb985133d51302112be98122a1c3e3de05018885657ca4e5c9d42949eeb24b39d5881e80ed6411b81857 - languageName: node - linkType: hard - -"@octokit/auth-app@npm:^6.0.0": - version: 6.1.1 - resolution: "@octokit/auth-app@npm:6.1.1" - dependencies: - "@octokit/auth-oauth-app": "npm:^7.1.0" - "@octokit/auth-oauth-user": "npm:^4.1.0" - "@octokit/request": "npm:^8.3.1" - "@octokit/request-error": "npm:^5.1.0" - "@octokit/types": "npm:^13.1.0" - deprecation: "npm:^2.3.1" - lru-cache: "npm:^10.0.0" - universal-github-app-jwt: "npm:^1.1.2" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/633fa49ef1d688f1db050fd359d224f5529f0df20e2a5f8f7e78d5f81f33d18cbcde735ea5222b0bcf058b5b93bff88d1dd6f614b9c9443bda5fa0921757cf4f - languageName: node - linkType: hard - -"@octokit/auth-oauth-app@npm:^7.0.0, @octokit/auth-oauth-app@npm:^7.1.0": - version: 7.1.0 - resolution: "@octokit/auth-oauth-app@npm:7.1.0" - dependencies: - "@octokit/auth-oauth-device": "npm:^6.1.0" - "@octokit/auth-oauth-user": "npm:^4.1.0" - "@octokit/request": "npm:^8.3.1" - "@octokit/types": "npm:^13.0.0" - "@types/btoa-lite": "npm:^1.0.0" - btoa-lite: "npm:^1.0.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/e23c5968426949181beea3ca89bb193885f4ec481b194a0c3bb252b02b1ff3f78908541f4ee6381563cfe6f23ed07e0c0eb33a842b1a6f85301a8266d4d46649 - languageName: node - linkType: hard - -"@octokit/auth-oauth-device@npm:^6.1.0": - version: 6.1.0 - resolution: "@octokit/auth-oauth-device@npm:6.1.0" - dependencies: - "@octokit/oauth-methods": "npm:^4.1.0" - "@octokit/request": "npm:^8.3.1" - "@octokit/types": "npm:^13.0.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/74e17b76f55c8503dc1b4d95e4f52ee49900f7f720983d1725ad29361c9f413d22aa7621e8809ea644bb225686b3ee70f147a9e5944f3c1c1cccba55fa414422 - languageName: node - linkType: hard - -"@octokit/auth-oauth-user@npm:^4.0.0, @octokit/auth-oauth-user@npm:^4.1.0": - version: 4.1.0 - resolution: "@octokit/auth-oauth-user@npm:4.1.0" - dependencies: - "@octokit/auth-oauth-device": "npm:^6.1.0" - "@octokit/oauth-methods": "npm:^4.1.0" - "@octokit/request": "npm:^8.3.1" - "@octokit/types": "npm:^13.0.0" - btoa-lite: "npm:^1.0.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/5d17d1e86ca89d4f2c440de4e5a648a1646818f0683a6230558279d71151a6b01f1228ccc4fc6e3ae24da92fa18810fac7b2bb6e019646f1f46be3928f522e7f - languageName: node - linkType: hard - -"@octokit/auth-token@npm:^4.0.0": - version: 4.0.0 - resolution: "@octokit/auth-token@npm:4.0.0" - checksum: 10c0/57acaa6c394c5abab2f74e8e1dcf4e7a16b236f713c77a54b8f08e2d14114de94b37946259e33ec2aab0566b26f724c2b71d2602352b59e541a9854897618f3c - languageName: node - linkType: hard - -"@octokit/auth-unauthenticated@npm:^5.0.0": - version: 5.0.1 - resolution: "@octokit/auth-unauthenticated@npm:5.0.1" - dependencies: - "@octokit/request-error": "npm:^5.0.0" - "@octokit/types": "npm:^12.0.0" - checksum: 10c0/c9cad429981a34021ec9f1fdc238c39eba36807683859a3bffb9dd66abf1ce016c9a2ff31fe09313458e59b37f8fa91522c0e34a1daecefdabcdf23a494fbcc2 - languageName: node - linkType: hard - -"@octokit/core@npm:^5.0.0": - version: 5.2.0 - resolution: "@octokit/core@npm:5.2.0" - dependencies: - "@octokit/auth-token": "npm:^4.0.0" - "@octokit/graphql": "npm:^7.1.0" - "@octokit/request": "npm:^8.3.1" - "@octokit/request-error": "npm:^5.1.0" - "@octokit/types": "npm:^13.0.0" - before-after-hook: "npm:^2.2.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/9dc5cf55b335da382f340ef74c8009c06a1f7157b0530d3ff6cacf179887811352dcd405448e37849d73f17b28970b7817995be2260ce902dad52b91905542f0 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^9.0.1": - version: 9.0.5 - resolution: "@octokit/endpoint@npm:9.0.5" - dependencies: - "@octokit/types": "npm:^13.1.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/e9bbb2111abe691c146075abb1b6f724a9b77fa8bfefdaaa82b8ebad6c8790e949f2367bb0b79800fef93ad72807513333e83e8ffba389bc85215535f63534d9 - languageName: node - linkType: hard - -"@octokit/graphql@npm:^7.1.0": - version: 7.1.0 - resolution: "@octokit/graphql@npm:7.1.0" - dependencies: - "@octokit/request": "npm:^8.3.0" - "@octokit/types": "npm:^13.0.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/6d50a013d151f416fc837644e394e8b8872da7b17b181da119842ca569b0971e4dfacda55af6c329b51614e436945415dd5bd75eb3652055fdb754bbcd20d9d1 - languageName: node - linkType: hard - -"@octokit/oauth-app@npm:^6.0.0": - version: 6.1.0 - resolution: "@octokit/oauth-app@npm:6.1.0" - dependencies: - "@octokit/auth-oauth-app": "npm:^7.0.0" - "@octokit/auth-oauth-user": "npm:^4.0.0" - "@octokit/auth-unauthenticated": "npm:^5.0.0" - "@octokit/core": "npm:^5.0.0" - "@octokit/oauth-authorization-url": "npm:^6.0.2" - "@octokit/oauth-methods": "npm:^4.0.0" - "@types/aws-lambda": "npm:^8.10.83" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/9d67ca196eabbb397c677e006d28148d6c5185f88d86e5444c219e43b95e0ecaee5d31807ea24aedb64a76d61c0a53acd8091613e15d10733f41960bd981463c - languageName: node - linkType: hard - -"@octokit/oauth-authorization-url@npm:^6.0.2": - version: 6.0.2 - resolution: "@octokit/oauth-authorization-url@npm:6.0.2" - checksum: 10c0/8c06e538b3e392f0fa68f3347078c32f92c03474eb214e4e82774513a54c164bac14c228f7dbd79d22a920df1a8b2e0765dd6ee45929bda0b77e5cf7f0d92c71 - languageName: node - linkType: hard - -"@octokit/oauth-methods@npm:^4.0.0, @octokit/oauth-methods@npm:^4.1.0": - version: 4.1.0 - resolution: "@octokit/oauth-methods@npm:4.1.0" - dependencies: - "@octokit/oauth-authorization-url": "npm:^6.0.2" - "@octokit/request": "npm:^8.3.1" - "@octokit/request-error": "npm:^5.1.0" - "@octokit/types": "npm:^13.0.0" - btoa-lite: "npm:^1.0.0" - checksum: 10c0/3ab7ab41e82faebb662bfc4cc20756f008adb37b447386c29ddb09cbac5d1867b1b23f2f8dd268e06dca5ff1c874162e01d475f15634b42e6ab0a95471dcc365 - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^20.0.0": - version: 20.0.0 - resolution: "@octokit/openapi-types@npm:20.0.0" - checksum: 10c0/5176dcc3b9d182ede3d446750cfa5cf31139624785a73fcf3511e3102a802b4d7cc45e999c27ed91d73fe8b7d718c8c406facb48688926921a71fe603b7db95d - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^22.2.0": - version: 22.2.0 - resolution: "@octokit/openapi-types@npm:22.2.0" - checksum: 10c0/a45bfc735611e836df0729f5922bbd5811d401052b972d1e3bc1278a2d2403e00f4552ce9d1f2793f77f167d212da559c5cb9f1b02c935114ad6d898779546ee - languageName: node - linkType: hard - -"@octokit/plugin-paginate-graphql@npm:^4.0.0": - version: 4.0.1 - resolution: "@octokit/plugin-paginate-graphql@npm:4.0.1" - peerDependencies: - "@octokit/core": ">=5" - checksum: 10c0/d559cdc2b5de107a7da5384b5241d1dfdc1038db1c4a70aca8a450c996315936844e0a1888216fb568c7a272bc6adf6667f897e0976b01e68085663b166cc533 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:11.3.1": - version: 11.3.1 - resolution: "@octokit/plugin-paginate-rest@npm:11.3.1" - dependencies: - "@octokit/types": "npm:^13.5.0" - peerDependencies: - "@octokit/core": 5 - checksum: 10c0/72107ff7e459c49d1f13bbe44ac07b073497692eba28cb5ac6dbfa41e0ebc059ad7bccfa3dd45d3165348adcc2ede8ac159f8a9b637389b8e335af16aaa01469 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^9.0.0": - version: 9.2.1 - resolution: "@octokit/plugin-paginate-rest@npm:9.2.1" - dependencies: - "@octokit/types": "npm:^12.6.0" - peerDependencies: - "@octokit/core": 5 - checksum: 10c0/1dc55032a9e0c3e6440080a319975c9e4f189913fbc8870a48048d0c712473ea3d902ba247a37a46d45d502859b2728731a0d285107e4b0fa628d380f87163b4 - languageName: node - linkType: hard - -"@octokit/plugin-rest-endpoint-methods@npm:13.2.2": - version: 13.2.2 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:13.2.2" - dependencies: - "@octokit/types": "npm:^13.5.0" - peerDependencies: - "@octokit/core": ^5 - checksum: 10c0/0f2b14b7a185b49908bcc01bcae9849aae2da46c88f500c143d230caa3cd35540839b916e88a4642c60a5499d33e7a37faf1aa42c5bab270cefc10f5d6202893 - languageName: node - linkType: hard - -"@octokit/plugin-retry@npm:^6.0.0": - version: 6.0.1 - resolution: "@octokit/plugin-retry@npm:6.0.1" - dependencies: - "@octokit/request-error": "npm:^5.0.0" - "@octokit/types": "npm:^12.0.0" - bottleneck: "npm:^2.15.3" - peerDependencies: - "@octokit/core": ">=5" - checksum: 10c0/721b5a7949e3defdec5f1b451850ab924162fd2712c9ab59a2aaaad5b9ed6ee2a9447fe82ec1f91086cf23aaaceb14ff4e74de67ba3c63c5029e59c67b50979c - languageName: node - linkType: hard - -"@octokit/plugin-throttling@npm:^8.0.0": - version: 8.2.0 - resolution: "@octokit/plugin-throttling@npm:8.2.0" - dependencies: - "@octokit/types": "npm:^12.2.0" - bottleneck: "npm:^2.15.3" - peerDependencies: - "@octokit/core": ^5.0.0 - checksum: 10c0/e65de9958ac5f29ba473bb969d25738f7466dad1b64e8181199c71438c06a6333ba655bd5194581a24199ca06fc9a6e752d0a4782b554ef603b0acffe9f8bfbd - languageName: node - linkType: hard - -"@octokit/request-error@npm:^5.0.0, @octokit/request-error@npm:^5.1.0": - version: 5.1.0 - resolution: "@octokit/request-error@npm:5.1.0" - dependencies: - "@octokit/types": "npm:^13.1.0" - deprecation: "npm:^2.0.0" - once: "npm:^1.4.0" - checksum: 10c0/61e688abce17dd020ea1e343470b9758f294bfe5432c5cb24bdb5b9b10f90ecec1ecaaa13b48df9288409e0da14252f6579a20f609af155bd61dc778718b7738 - languageName: node - linkType: hard - -"@octokit/request@npm:^8.3.0, @octokit/request@npm:^8.3.1": - version: 8.4.0 - resolution: "@octokit/request@npm:8.4.0" - dependencies: - "@octokit/endpoint": "npm:^9.0.1" - "@octokit/request-error": "npm:^5.1.0" - "@octokit/types": "npm:^13.1.0" - universal-user-agent: "npm:^6.0.0" - checksum: 10c0/b857782ac2ff5387e9cc502759de73ea642c498c97d06ad2ecd8a395e4b9532d9f3bc3fc460e0d3d0e8f0d43c917a90c493e43766d37782b3979d3afffbf1b4b - languageName: node - linkType: hard - -"@octokit/types@npm:^12.0.0, @octokit/types@npm:^12.2.0, @octokit/types@npm:^12.6.0": - version: 12.6.0 - resolution: "@octokit/types@npm:12.6.0" - dependencies: - "@octokit/openapi-types": "npm:^20.0.0" - checksum: 10c0/0bea58bda46c93287f5a80a0e52bc60e7dc7136b8a38c3569d63d073fb9df4a56acdb9d9bdba9978f37c374a4a6e3e52886ef5b08cace048adb0012cacef942c - languageName: node - linkType: hard - -"@octokit/types@npm:^13.0.0, @octokit/types@npm:^13.1.0, @octokit/types@npm:^13.5.0": - version: 13.5.0 - resolution: "@octokit/types@npm:13.5.0" - dependencies: - "@octokit/openapi-types": "npm:^22.2.0" - checksum: 10c0/355ebc6776ce23feace1b1be0927cdda758790fda83068109c4f27b354dcd43d0447d4dc24e5eafdb596465469ea1baed23f3fd63adfec508cc375ccd1dcb0a3 - languageName: node - linkType: hard - -"@octokit/webhooks-methods@npm:^4.1.0": - version: 4.1.0 - resolution: "@octokit/webhooks-methods@npm:4.1.0" - checksum: 10c0/153b344b4b20b48fdf89225f482bd9aa612998c28e43d032756d5a2ec7ebf117922fb6a95ee7c0a985cab6924fa4de3378c60e9ff41e384498b8cb7aad3771f2 - languageName: node - linkType: hard - -"@octokit/webhooks-types@npm:7.4.0": - version: 7.4.0 - resolution: "@octokit/webhooks-types@npm:7.4.0" - checksum: 10c0/c2f06bdee4cb3f8f9e685a5a0289bd59673954b9bd25701480ba204ea23333f9bcc4a6f757f563ae5a1490f58eace8ebbc7aa8a1737c276ccc1cf5c3e2fe2ebe - languageName: node - linkType: hard - -"@octokit/webhooks@npm:^12.0.4": - version: 12.2.0 - resolution: "@octokit/webhooks@npm:12.2.0" - dependencies: - "@octokit/request-error": "npm:^5.0.0" - "@octokit/webhooks-methods": "npm:^4.1.0" - "@octokit/webhooks-types": "npm:7.4.0" - aggregate-error: "npm:^3.1.0" - checksum: 10c0/d22c55e99726c32d55b9faf8cde02274c3f6cd82992a5cedf795de401656cc716ff151b0dd6e4173d12dc335583944415613132a9dbf18ee6ffa0d550479a1c2 - languageName: node - linkType: hard - "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -857,20 +547,6 @@ __metadata: languageName: node linkType: hard -"@types/aws-lambda@npm:^8.10.83": - version: 8.10.137 - resolution: "@types/aws-lambda@npm:8.10.137" - checksum: 10c0/32272f8e9dfa88987cbc68e999554225d07282c3a884d769cdec7116fcec1f7e716914a9ac0d8afd79cf6c955b09e7bcfa6258dda6daa3f532c7eb97bf47bff1 - languageName: node - linkType: hard - -"@types/btoa-lite@npm:^1.0.0": - version: 1.0.2 - resolution: "@types/btoa-lite@npm:1.0.2" - checksum: 10c0/daffbb47e4fe6493df70d83878b550adab48bab2f02b3591a59367af3ecebf34c971e070479ab68d83ca59cbeefbc61a50d9a7552f639dc908706183e0222bab - languageName: node - linkType: hard - "@types/conventional-commits-parser@npm:^5.0.0": version: 5.0.0 resolution: "@types/conventional-commits-parser@npm:5.0.0" @@ -894,15 +570,6 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^9.0.0": - version: 9.0.6 - resolution: "@types/jsonwebtoken@npm:9.0.6" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/9c29e3896e5fb6056e54d87514643e59e0cfb966ae25171a107776270195bba955f0373e98c8ed6450c145b18984f5df9cf0fcac360f382cec3c7c4d3510b202 - languageName: node - linkType: hard - "@types/node-fetch@npm:2.6.11": version: 2.6.11 resolution: "@types/node-fetch@npm:2.6.11" @@ -1159,7 +826,7 @@ __metadata: languageName: node linkType: hard -"aggregate-error@npm:^3.0.0, aggregate-error@npm:^3.1.0": +"aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" dependencies: @@ -1323,7 +990,6 @@ __metadata: fastify: "npm:^4.26.2" node-fetch: "npm:^2.7.0" nodemon: "npm:^3.1.0" - octokit: "npm:^3.2.1" rimraf: "npm:^5.0.5" ts-node: "npm:^10.9.2" tsconfig-paths: "npm:^4.2.0" @@ -1422,13 +1088,6 @@ __metadata: languageName: node linkType: hard -"before-after-hook@npm:^2.2.0": - version: 2.2.3 - resolution: "before-after-hook@npm:2.2.3" - checksum: 10c0/0488c4ae12df758ca9d49b3bb27b47fd559677965c52cae7b335784724fb8bf96c42b6e5ba7d7afcbc31facb0e294c3ef717cc41c5bc2f7bd9e76f8b90acd31c - languageName: node - linkType: hard - "binary-extensions@npm:^2.0.0": version: 2.3.0 resolution: "binary-extensions@npm:2.3.0" @@ -1436,13 +1095,6 @@ __metadata: languageName: node linkType: hard -"bottleneck@npm:^2.15.3": - version: 2.19.5 - resolution: "bottleneck@npm:2.19.5" - checksum: 10c0/b0f72e45b2e0f56a21ba720183f16bef8e693452fb0495d997fa354e42904353a94bd8fd429868e6751bc85e54b6755190519eed5a0ae0a94a5185209ae7c6d0 - languageName: node - linkType: hard - "boxen@npm:7.0.0": version: 7.0.0 resolution: "boxen@npm:7.0.0" @@ -1500,20 +1152,6 @@ __metadata: languageName: unknown linkType: soft -"btoa-lite@npm:^1.0.0": - version: 1.0.0 - resolution: "btoa-lite@npm:1.0.0" - checksum: 10c0/7a4f0568ae3c915464650f98fde7901ae07b13a333a614515a0c86876b3528670fafece28dfef9745d971a613bb83341823afb0c20c6f318b384c1e364b9eb95 - languageName: node - linkType: hard - -"buffer-equal-constant-time@npm:1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e - languageName: node - linkType: hard - "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -2013,13 +1651,6 @@ __metadata: languageName: node linkType: hard -"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": - version: 2.3.1 - resolution: "deprecation@npm:2.3.1" - checksum: 10c0/23d688ba66b74d09b908c40a76179418acbeeb0bfdf218c8075c58ad8d0c315130cb91aa3dffb623aa3a411a3569ce56c6460de6c8d69071c17fe6dd2442f032 - languageName: node - linkType: hard - "didyoumean@npm:^1.2.2": version: 1.2.2 resolution: "didyoumean@npm:1.2.2" @@ -2085,15 +1716,6 @@ __metadata: languageName: node linkType: hard -"ecdsa-sig-formatter@npm:1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c - languageName: node - linkType: hard - "emoji-regex@npm:^10.3.0": version: 10.3.0 resolution: "emoji-regex@npm:10.3.0" @@ -3276,45 +2898,6 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^9.0.2": - version: 9.0.2 - resolution: "jsonwebtoken@npm:9.0.2" - dependencies: - jws: "npm:^3.2.2" - lodash.includes: "npm:^4.3.0" - lodash.isboolean: "npm:^3.0.3" - lodash.isinteger: "npm:^4.0.4" - lodash.isnumber: "npm:^3.0.3" - lodash.isplainobject: "npm:^4.0.6" - lodash.isstring: "npm:^4.0.1" - lodash.once: "npm:^4.0.0" - ms: "npm:^2.1.1" - semver: "npm:^7.5.4" - checksum: 10c0/d287a29814895e866db2e5a0209ce730cbc158441a0e5a70d5e940eb0d28ab7498c6bf45029cc8b479639bca94056e9a7f254e2cdb92a2f5750c7f358657a131 - languageName: node - linkType: hard - -"jwa@npm:^1.4.1": - version: 1.4.1 - resolution: "jwa@npm:1.4.1" - dependencies: - buffer-equal-constant-time: "npm:1.0.1" - ecdsa-sig-formatter: "npm:1.0.11" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/5c533540bf38702e73cf14765805a94027c66a0aa8b16bc3e89d8d905e61a4ce2791e87e21be97d1293a5ee9d4f3e5e47737e671768265ca4f25706db551d5e9 - languageName: node - linkType: hard - -"jws@npm:^3.2.2": - version: 3.2.2 - resolution: "jws@npm:3.2.2" - dependencies: - jwa: "npm:^1.4.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/e770704533d92df358adad7d1261fdecad4d7b66fa153ba80d047e03ca0f1f73007ce5ed3fbc04d2eba09ba6e7e6e645f351e08e5ab51614df1b0aa4f384dfff - languageName: node - linkType: hard - "keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -3432,34 +3015,6 @@ __metadata: languageName: node linkType: hard -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b - languageName: node - linkType: hard - -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: 10c0/0aac604c1ef7e72f9a6b798e5b676606042401dd58e49f051df3cc1e3adb497b3d7695635a5cbec4ae5f66456b951fdabe7d6b387055f13267cde521f10ec7f7 - languageName: node - linkType: hard - -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 10c0/4c3e023a2373bf65bf366d3b8605b97ec830bca702a926939bcaa53f8e02789b6a176e7f166b082f9365bfec4121bfeb52e86e9040cb8d450e64c858583f61b7 - languageName: node - linkType: hard - -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 10c0/2d01530513a1ee4f72dd79528444db4e6360588adcb0e2ff663db2b3f642d4bb3d687051ae1115751ca9082db4fdef675160071226ca6bbf5f0c123dbf0aa12d - languageName: node - linkType: hard - "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -3467,13 +3022,6 @@ __metadata: languageName: node linkType: hard -"lodash.isstring@npm:^4.0.1": - version: 4.0.1 - resolution: "lodash.isstring@npm:4.0.1" - checksum: 10c0/09eaf980a283f9eef58ef95b30ec7fee61df4d6bf4aba3b5f096869cc58f24c9da17900febc8ffd67819b4e29de29793190e88dc96983db92d84c95fa85d1c92 - languageName: node - linkType: hard - "lodash.kebabcase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.kebabcase@npm:4.1.1" @@ -3495,13 +3043,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.0.0": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 - languageName: node - linkType: hard - "lodash.snakecase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.snakecase@npm:4.1.1" @@ -3552,7 +3093,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.0, lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.2.2 resolution: "lru-cache@npm:10.2.2" checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 @@ -3833,13 +3374,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -4006,24 +3540,6 @@ __metadata: languageName: node linkType: hard -"octokit@npm:^3.2.1": - version: 3.2.1 - resolution: "octokit@npm:3.2.1" - dependencies: - "@octokit/app": "npm:^14.0.2" - "@octokit/core": "npm:^5.0.0" - "@octokit/oauth-app": "npm:^6.0.0" - "@octokit/plugin-paginate-graphql": "npm:^4.0.0" - "@octokit/plugin-paginate-rest": "npm:11.3.1" - "@octokit/plugin-rest-endpoint-methods": "npm:13.2.2" - "@octokit/plugin-retry": "npm:^6.0.0" - "@octokit/plugin-throttling": "npm:^8.0.0" - "@octokit/request-error": "npm:^5.0.0" - "@octokit/types": "npm:^13.0.0" - checksum: 10c0/475575a30b351f2578f19f4d7c284c3928a0fd87f553a903436a6728d4d647ce93c8633e1f93cc4efe84ef9fcbfd9740f4198ec573323890084aa39ccf392a87 - languageName: node - linkType: hard - "on-exit-leak-free@npm:^2.1.0": version: 2.1.2 resolution: "on-exit-leak-free@npm:2.1.2" @@ -4038,7 +3554,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -5473,23 +4989,6 @@ __metadata: languageName: node linkType: hard -"universal-github-app-jwt@npm:^1.1.2": - version: 1.1.2 - resolution: "universal-github-app-jwt@npm:1.1.2" - dependencies: - "@types/jsonwebtoken": "npm:^9.0.0" - jsonwebtoken: "npm:^9.0.2" - checksum: 10c0/061d2a52c25f0a09a5ae40167e6006ba89510df9934070996d8ca3019afd34f7f28fbb74a93d1627beb4209faf04ec9173f0dc9ff351ee2ec42ab76cff389a80 - languageName: node - linkType: hard - -"universal-user-agent@npm:^6.0.0": - version: 6.0.1 - resolution: "universal-user-agent@npm:6.0.1" - checksum: 10c0/5c9c46ffe19a975e11e6443640ed4c9e0ce48fcc7203325757a8414ac49940ebb0f4667f2b1fa561489d1eb22cb2d05a0f7c82ec20c5cba42e58e188fb19b187 - languageName: node - linkType: hard - "update-check@npm:1.5.4": version: 1.5.4 resolution: "update-check@npm:1.5.4"