feat: migrate to git.wanhose.dev

This commit is contained in:
wanhose 2024-10-13 11:09:44 +02:00
parent c6faa2796b
commit 79afc9feb6
29 changed files with 553 additions and 808 deletions

21
.gitea/ISSUE_TEMPLATE.md Normal file
View File

@ -0,0 +1,21 @@
## Issue information
#### 🖥️ Browser
...
#### 📱 Device
...
#### 📝 Reason
...
#### 🔗 URL
...
#### 🏷️ Version
...

View File

@ -0,0 +1,10 @@
## Description
...
## Browsers
- [ ] Google Chrome (specify version if checked)
- [ ] Microsoft Edge (specify version if checked)
- [ ] Mozilla Firefox (specify version if checked)
- [ ] Opera (specify version if checked)

1
.github/FUNDING.yml vendored
View File

@ -1 +0,0 @@
custom: ['https://paypal.me/wanhose']

19
README.md Normal file
View File

@ -0,0 +1,19 @@
> AN IMPORTANT UPDATE
> <br><br>
> On the morning of October 11, 2024, GitHub unexpectedly hid our repository without any prior notification. This sudden action immediately disrupted all of our API services, as they relied on files from the repository that were no longer accessible. Our team reached out to GitHub support to understand the situation, but we have not yet received any response. Given the critical impact on our services and the lack of communication from GitHub, we decided to migrate the entire repository to an alternative platform to ensure continuity and reliability.
> <br><br>
> We initially migrated the repository, releases, and open issues (excluding discussions) to GitLab. However, during the migration of issues, GitLab's own spam detection mechanism mistakenly identified its bot activity as spam, leading to our issues being hidden. Despite reaching out to GitLab support, we have not yet received a resolution for this incident. Faced with these ongoing platform limitations and communication delays, we have opted to move forward with self-hosting our own Git system using Gitea to ensure full control over our repository and services.
> <br><br>
> We will no longer support platforms that overlook the contributions of our users and the significant work invested over the last five years. Once our GitHub account is reinstated, we will set up a redirect to guide users to our new, self-hosted repository.
> <br><br>
> Thank you to our community for your patience. Your contributions remain vital to this project, and we are committed to ensuring its stability and growth in a more secure environment.
# Cookie Dialog Monster
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://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/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
- [API](/src/branch/main/packages/api)
- [Browser extension](/src/branch/main/packages/api)
- [Web](/src/branch/main/packages/api)

View File

@ -1,9 +0,0 @@
# Cookie Monster Dialog
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.
## Repositories
- [API](/packages/api/)
- [Browser extension](/packages/browser-extension/)
- [Web](/packages/web/)

View File

@ -1,10 +0,0 @@
## Description
Give a short description about this pull request.
## Browsers
- [ ] Google Chrome (specify version if checked).
- [ ] Microsoft Edge (specify version if checked).
- [ ] Mozilla Firefox (specify version if checked).
- [ ] Opera (specify version if checked).

View File

@ -1 +1,2 @@
GITHUB_TOKEN=?
GITEA_RAW=?
GITEA_TOKEN=?

View File

@ -1,4 +1,4 @@
# Cookie Monster Dialog API
# Cookie Dialog Monster API
## Installation

View File

@ -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"
},

View File

@ -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) {

View File

@ -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();
};

View File

@ -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();
};

View File

@ -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.gitea.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();
};

View File

@ -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,45 @@ 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({
id: issue.id,
labels: ['bug'],
state: 'open',
});
}
await createIssueComment({
description: formatMessage({ reason, ua, url, version }),
id: issue.id,
});
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,
});
}
}
);

View File

@ -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.gitea.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();
};

View File

@ -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,50 @@ 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({
id: issue.id,
labels: ['bug'],
owner: environment.github.owner,
repo: environment.github.repo,
state: 'open',
});
}
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 }),
id: issue.id,
});
reply.send({
data: existingIssue.html_url,
data: issue.html_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.html_url,
success: true,
});
} catch (error) {
@ -92,21 +80,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');
}

View File

@ -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.gitea.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();
};

View File

@ -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.some((label) => label.name === 'wontfix')) ||
issue.state === 'open')
) {
reply.send({
data: {
flags: existingIssue.labels.map((label) => label.name),
url: existingIssue.html_url,
flags: issue.labels.map((label) => label.name),
url: issue.html_url,
},
success: true,
});
} else {
reply.send({
data: {},
success: true,
});
throw new Error('Failed to find issue');
}
} catch (error) {
reply.send({

View File

@ -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, 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,35 +23,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.name === 'wontfix')) {
reply.send({
data: existingIssue.html_url,
data: issue.html_url,
errors: ['This issue has been marked as "wontfix" and will not be addressed.'],
success: false,
});
return;
}
if (existingIssue.state === 'open') {
if (issue.state === 'open') {
reply.send({
data: existingIssue.html_url,
data: issue.html_url,
errors: [
'This issue already exists. Please refer to the existing issue for updates.',
],
@ -59,46 +59,27 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done:
return;
}
await octokit.request('PATCH /repos/{owner}/{repo}/issues/{issue_number}', {
issue_number: existingIssue.number,
await updateIssue({
id: issue.id,
labels: ['bug'],
owner: environment.github.owner,
repo: environment.github.repo,
state: 'open',
});
reply.send({
data: existingIssue.html_url,
data: issue.html_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.html_url,
success: true,
});
} catch (error) {

View File

@ -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();
};

View File

@ -1,9 +1,7 @@
export default {
github: {
files: 'https://raw.githubusercontent.com/wanhose/cookie-dialog-monster/main',
owner: 'wanhose',
repo: 'cookie-dialog-monster',
token: process.env.GITHUB_TOKEN ?? '',
gitea: {
raw: process.env.GITEA_RAW ?? '',
token: process.env.GITEA_TOKEN ?? '',
},
port: (process.env.PORT ? Number(process.env.PORT) : undefined) ?? 8080,
};

View File

@ -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;
}

View File

@ -0,0 +1,150 @@
import environment from './environment';
const API_URL = 'https://git.wanhose.dev/api/v1/repos/wanhose/cookie-dialog-monster';
export async function createIssue(params: CreateIssueParams): Promise<Issue> {
const { description, title } = params;
const body: { [key: string]: number[] | string | string[] } = {
assignees: ['wanhose'],
body: description,
labels: [],
title,
};
const headers = new Headers({
Authorization: `token ${environment.gitea.token}`,
'Content-Type': 'application/json',
});
if (params.labels) {
const response = await fetch(`${API_URL}/labels`, { headers });
const labels = (await response.json()) as readonly Label[];
for (const label of labels) {
if (params.labels.includes(label.name)) {
(body.labels as number[]).push(label.id);
}
}
}
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<Issue | null> {
const { description, id } = params;
const headers = new Headers({
Authorization: `token ${environment.gitea.token}`,
'Content-Type': 'application/json',
});
const response = await fetch(`${API_URL}/issues/${id}/comments`, {
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<Issue | null> {
const { labels, state, title } = params;
const headers = new Headers({
Authorization: `token ${environment.gitea.token}`,
'Content-Type': 'application/json',
});
const search = new URLSearchParams({
q: title,
state: 'all',
type: 'issues',
});
if (labels) {
search.append('labels', `${labels}`);
}
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<Issue | null> {
const { id, labels, state } = params;
const body: { [key: string]: string } = {};
const headers = new Headers({
Authorization: `token ${environment.gitea.token}`,
'Content-Type': 'application/json',
});
if (labels) {
await fetch(`${API_URL}/issues/${id}/labels`, {
headers,
method: 'DELETE',
});
await fetch(`${API_URL}/issues/${id}/labels`, {
body: JSON.stringify({ labels }),
headers,
method: 'POST',
});
}
if (state) {
body['state'] = state;
}
const response = await fetch(`${API_URL}/issues/${id}`, {
body: JSON.stringify(body),
headers,
method: 'PATCH',
});
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 id: number;
}
export interface GetIssueParams {
readonly labels?: readonly string[];
readonly state?: string;
readonly title: string;
}
export interface Issue {
readonly html_url: string;
readonly id: number;
readonly labels: readonly Label[];
readonly state: string;
readonly title: string;
}
export interface Label {
readonly id: number;
readonly name: string;
}
export interface UpdateIssueParams {
readonly id: number;
readonly labels?: readonly string[];
readonly state?: string;
}

View File

@ -1,4 +0,0 @@
import { Octokit } from 'octokit';
import environment from './environment';
export const octokit = new Octokit({ auth: environment.github.token });

View File

@ -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',
};

View File

@ -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+

View File

@ -40,6 +40,48 @@
</head>
<body>
<header>
<div class="bg-gray-300 text-secondary" role="banner">
<div class="max-w-5xl mx-auto p-4 text-justify" id="banner-content-preview">
<p class="font-semibold">AN IMPORTANT UPDATE</p>
<p class="mt-2">
On the morning of October 11, 2024, GitHub unexpectedly hid our repository without any
prior notification. This sudden action immediately disrupted all of our API
services...&nbsp;
<span class="font-bold" id="banner-button" role="button" tabindex="0"> Read more </span>
</p>
</div>
<div class="hidden max-w-5xl mx-auto p-4 text-justify" id="banner-content-full">
<p class="font-semibold">AN IMPORTANT UPDATE</p>
<p class="mt-2">
On the morning of October 11, 2024, GitHub unexpectedly hid our repository without any
prior notification. This sudden action immediately disrupted all of our API services, as
they relied on files from the repository that were no longer accessible. Our team
reached out to GitHub support to understand the situation, but we have not yet received
any response. Given the critical impact on our services and the lack of communication
from GitHub, we decided to migrate the entire repository to an alternative platform to
ensure continuity and reliability.
</p>
<p class="mt-2">
We initially migrated the repository, releases, and open issues (excluding discussions)
to GitLab. However, during the migration of issues, GitLab's own spam detection
mechanism mistakenly identified its bot activity as spam, leading to our issues being
hidden. Despite reaching out to GitLab support, we have not yet received a resolution
for this incident. Faced with these ongoing platform limitations and communication
delays, we have opted to move forward with self-hosting our own Git system using Gitea
to ensure full control over our repository and services.
</p>
<p class="mt-2">
We will no longer support platforms that overlook the contributions of our users and the
significant work invested over the last years. Once our GitHub account is reinstated, we
will set up a redirect to guide users to our new, self-hosted repository.
</p>
<p class="mt-2">
Thank you to our community for your patience. Your contributions remain vital to this
project, and we are committed to ensuring its stability and growth in a more secure
environment.
</p>
</div>
</div>
<nav class="bg-secondary text-white">
<div class="flex items-center max-w-5xl mx-auto p-4">
<svg
@ -84,35 +126,41 @@
<p class="font-medium">Cookie Dialog Monster</p>
<div class="ml-auto">
<div class="flex gap-4 text-white">
<a class="contents" href="mailto:hello@wanhose.dev" title="Email">
<a class="inline-flex" href="mailto:hello@wanhose.dev" title="Email">
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-6 w-6"
viewBox="0 0 20 20"
fill="currentColor"
class="h-6 shrink-0 w-6"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
fill-rule="evenodd"
d="M14.243 5.757a6 6 0 10-.986 9.284 1 1 0 111.087 1.678A8 8 0 1118 10a3 3 0 01-4.8 2.401A4 4 0 1114 10a1 1 0 102 0c0-1.537-.586-3.07-1.757-4.243zM12 10a2 2 0 10-4 0 2 2 0 004 0z"
clip-rule="evenodd"
/>
<circle cx="12" cy="12" r="4"></circle>
<path d="M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94"></path>
</svg>
</a>
<a
class="contents"
href="https://github.com/wanhose/cookie-dialog-monster"
class="inline-flex"
href="https://git.wanhose.dev/wanhose/cookie-dialog-monster"
target="_blank"
title="GitHub"
title="Gitea"
>
<svg
class="h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
class="h-6 shrink-0 w-6"
fill="none"
height="24"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
stroke="currentColor"
viewBox="0 0 24 24"
fill="currentColor"
width="24"
>
<path
d="M10.9,2.1c-4.6,0.5-8.3,4.2-8.8,8.7c-0.5,4.7,2.2,8.9,6.3,10.5C8.7,21.4,9,21.2,9,20.8v-1.6c0,0-0.4,0.1-0.9,0.1 c-1.4,0-2-1.2-2.1-1.9c-0.1-0.4-0.3-0.7-0.6-1C5.1,16.3,5,16.3,5,16.2C5,16,5.3,16,5.4,16c0.6,0,1.1,0.7,1.3,1c0.5,0.8,1.1,1,1.4,1 c0.4,0,0.7-0.1,0.9-0.2c0.1-0.7,0.4-1.4,1-1.8c-2.3-0.5-4-1.8-4-4c0-1.1,0.5-2.2,1.2-3C7.1,8.8,7,8.3,7,7.6C7,7.2,7,6.6,7.3,6 c0,0,1.4,0,2.8,1.3C10.6,7.1,11.3,7,12,7s1.4,0.1,2,0.3C15.3,6,16.8,6,16.8,6C17,6.6,17,7.2,17,7.6c0,0.8-0.1,1.2-0.2,1.4 c0.7,0.8,1.2,1.8,1.2,3c0,2.2-1.7,3.5-4,4c0.6,0.5,1,1.4,1,2.3v2.6c0,0.3,0.3,0.6,0.7,0.5c3.7-1.5,6.3-5.1,6.3-9.3 C22,6.1,16.9,1.4,10.9,2.1z"
/>
<circle cx="18" cy="18" r="3"></circle>
<circle cx="6" cy="6" r="3"></circle>
<path d="M13 6h3a2 2 0 0 1 2 2v7"></path>
<line x1="6" y1="9" x2="6" y2="21"></line>
</svg>
</a>
</div>
@ -327,8 +375,8 @@
<h3 class="font-medium mt-4 text-lg text-secondary">Open source</h3>
<p class="mt-2 text-gray-500">
Feel free to contribute to our
<a href="https://github.com/wanhose/cookie-dialog-monster/pulls" target="_blank">
GitHub repository
<a href="https://git.wanhose.dev/wanhose/cookie-dialog-monster/pulls" target="_blank">
GitLab repository
</a>
</p>
</div>
@ -478,7 +526,7 @@
version following
<a
class="underline"
href="https://github.com/wanhose/cookie-dialog-monster/tree/main/packages/browser-extension#installation-for-mozilla-firefox-users"
href="https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/packages/browser-extension#installation-for-mozilla-firefox-users"
id="firefox-guide-link"
target="_blank"
>
@ -492,7 +540,7 @@
the extension. We recommend you to follow
<a
class="underline"
href="https://github.com/wanhose/cookie-dialog-monster/tree/main/packages/browser-extension#installation-for-advanced-and-non-listed-browser-users"
href="https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/packages/browser-extension#installation-for-advanced-and-non-listed-browser-users"
target="_blank"
>
this guide</a
@ -504,19 +552,29 @@
<div class="max-w-5xl mx-auto">
<p class="text-center text-white text-sm">
An open source project built by you and
<a class="underline" href="https://github.com/wanhose" target="_blank"> wanhose</a>
<a class="underline" href="https://git.wanhose.com/wanhose" target="_blank"> wanhose</a>
</p>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', () => {
const bannerButton = document.getElementById('banner-button');
const firefoxGuideLink = document.getElementById('firefox-guide-link');
const firefoxLink = document.getElementById('firefox-link');
const isMobile = /Android|Mobi/i.test(navigator.userAgent);
bannerButton.addEventListener('click', () => {
const bannerContentFull = document.getElementById('banner-content-full');
const bannerContentPreview = document.getElementById('banner-content-preview');
bannerButton.classList.add('hidden');
bannerContentFull.classList.remove('hidden');
bannerContentPreview.classList.add('hidden');
});
if (isMobile) {
firefoxGuideLink.href =
'https://github.com/wanhose/cookie-dialog-monster/tree/main/packages/browser-extension#installation-for-mozilla-firefox-mobile-users';
'https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/packages/browser-extension#installation-for-mozilla-firefox-mobile-users';
firefoxLink.href = '/releases/latest-mozilla-mobile.xpi';
}
});

View File

@ -23,6 +23,7 @@ module.exports = {
'firefox-3': '#fee545',
primary: '#3dd9eb',
secondary: '#34495e',
tertiary: '#6b7280',
},
fontFamily: {
sans: ['Inter', ...defaultTheme.fontFamily.sans],

507
yarn.lock
View File

@ -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"