#!/usr/bin/env ts-node import fs from 'fs'; import path from 'path'; import { URL } from 'url'; import { config as setupEnv } from 'dotenv-flow'; import connectToDatabase from '@/config/db'; import { Page } from '@/entities'; import { getMinimumCommonPath } from '@/resolvers/Extension/utils/get-minimum-page-urls'; import { makeValidURL } from '@/repositories/PageRepository/utils'; setupEnv(); type PageByDomainGroup = { host: string; urls: string[]; }; const main = async () => { await connectToDatabase(); const whitelistFileStream = fs.createWriteStream( path.join(__dirname, '../src/resolvers/Extension/whitelisted-urls.json') ); whitelistFileStream.write('['); // don't prepend command in json on the first result, but every result after. let prependComma = false; await new Promise((resolve, reject) => { Page.createQueryBuilder('Page') // extract the host from a url // eslint-disable-next-line prettier/prettier .select("SUBSTRING(Page.url FROM '(?:.*://)?([^/?]*)')", 'host') .addSelect('ARRAY_AGG(Page.url)', 'urls') .groupBy('host') .stream() .then((stream) => { stream.on('data', ({ host, urls }: PageByDomainGroup) => { stream.pause(); const minCommonPathName = getMinimumCommonPath( urls.map((url) => { return new URL(makeValidURL(url)).pathname; }) ); whitelistFileStream.write( `${prependComma ? ',' : ''}${JSON.stringify({ host, pathname: minCommonPathName.includes('/pdp') || minCommonPathName.includes('/-') ? '/' : minCommonPathName, })}` ); prependComma = true; stream.resume(); }); stream.on('end', () => { whitelistFileStream.write(']'); resolve(); }); stream.on('error', (error) => { reject(error); }); }) .catch(reject); }); }; main().catch((error) => { console.error(error); process.exit(1); });