85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
import { fileURLToPath } from 'node:url';
|
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
import { sep as posixSep } from 'node:path/posix';
|
|
import { readdir, mkdir } from 'node:fs/promises';
|
|
import { styleText } from 'node:util';
|
|
|
|
// Fetch latest version
|
|
|
|
console.log(`Getting latest version of ${styleText('cyan', '@types/chrome')}`);
|
|
await Bun.$`bun install --ignore-scripts -D @types/chrome@latest`;
|
|
|
|
// Generate new package.json
|
|
|
|
console.log(`Generating new ${styleText('cyan', 'package.json')}`);
|
|
|
|
const pkgJsonPath = fileURLToPath(
|
|
import.meta.resolve('@types/chrome/package.json'),
|
|
);
|
|
const pkgDir = dirname(pkgJsonPath);
|
|
const pkgJson = await Bun.file(pkgJsonPath).json();
|
|
const pkgJsonTemplate = await Bun.file('templates/package.json').text();
|
|
const newPkgJson = JSON.parse(
|
|
pkgJsonTemplate.replaceAll('{{chromeTypesVersion}}', pkgJson.version),
|
|
);
|
|
newPkgJson.dependencies = pkgJson.dependencies;
|
|
newPkgJson.peerDependencies = pkgJson.peerDependencies;
|
|
newPkgJson.peerDependenciesMeta = pkgJson.peerDependenciesMeta;
|
|
|
|
const outPkgJsonPath = resolve('package.json');
|
|
await Bun.write(outPkgJsonPath, JSON.stringify(newPkgJson));
|
|
await Bun.$`bun run --cwd ../.. prettier --write "${outPkgJsonPath}"`;
|
|
|
|
// Generate declaration files
|
|
|
|
console.log('Generating declaration files');
|
|
const outDir = resolve('src/gen');
|
|
const declarationFileMapping = (
|
|
await readdir(pkgDir, {
|
|
recursive: true,
|
|
encoding: 'utf8',
|
|
})
|
|
)
|
|
// Filter to .d.ts files
|
|
.filter((file) => file.endsWith('.d.ts'))
|
|
// Map to usable paths
|
|
.map((file) => ({
|
|
file: file.replaceAll(sep, posixSep),
|
|
srcPath: join(pkgDir, file),
|
|
destPath: join(outDir, file),
|
|
}));
|
|
|
|
for (const { file, srcPath, destPath } of declarationFileMapping) {
|
|
const content = await Bun.file(srcPath).text();
|
|
const transformedContent = transformFile(file, content);
|
|
const destDir = dirname(destPath);
|
|
await mkdir(destDir, { recursive: true });
|
|
await Bun.write(destPath, transformedContent);
|
|
console.log(` ${styleText('dim', '-')} ${styleText('cyan', file)}`);
|
|
}
|
|
|
|
await Bun.$`bun install --ignore-scripts`;
|
|
|
|
// Done!
|
|
|
|
console.log(
|
|
`${styleText('green', '✔')} Done in ${performance.now().toFixed(0)} ms`,
|
|
);
|
|
|
|
// Transformations
|
|
|
|
function transformFile(file: string, content: string): string {
|
|
return (
|
|
// Add prefix
|
|
`/* DO NOT EDIT - generated by scripts/generate.ts */\n\n${content}\n`
|
|
// Remove global type declaration
|
|
.replaceAll('chrome: typeof chrome;', '// chrome: typeof chrome;')
|
|
// Rename `chrome` namespace to `Browser` and export it
|
|
.replaceAll('declare namespace chrome', 'export namespace Browser')
|
|
// Update references to `chrome` namespace to `Browser`
|
|
.replaceAll('chrome.', 'Browser.')
|
|
// Fix links to developer.chrome.com
|
|
.replaceAll('developer.Browser.com', 'developer.chrome.com')
|
|
);
|
|
}
|