]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - types/generate-package.ts
a4f049a31ae7a01c22dac1846770ede20b5596da
[github/Chocobozzz/PeerTube.git] / types / generate-package.ts
1 import { execSync } from 'child_process'
2 import depcheck, { PackageDependencies } from 'depcheck'
3 import { copyFile, readJson, remove, writeFile, writeJSON } from 'fs-extra'
4 import { resolve } from 'path'
5 import { cwd } from 'process'
6
7 run()
8 .then(() => process.exit(0))
9 .catch(err => {
10 console.error(err)
11 process.exit(-1)
12 })
13
14 async function run () {
15 const typesPath = resolve(cwd(), './types/')
16 const typesDistPath = resolve(cwd(), typesPath, './dist/')
17 const typesDistPackageJsonPath = resolve(typesDistPath, './package.json')
18 const typesDistGitIgnorePath = resolve(typesDistPath, './.gitignore')
19 const mainPackageJson = await readJson(resolve(cwd(), './package.json'))
20 const distTsConfigPath = resolve(cwd(), typesPath, './tsconfig.dist.json')
21 const distTsConfig = await readJson(distTsConfigPath)
22 const clientPackageJson = await readJson(resolve(cwd(), './client/package.json'))
23
24 await remove(typesDistPath)
25 execSync('npm run tsc -- -b --verbose types', { stdio: 'inherit' })
26
27 const allDependencies = Object.assign(
28 mainPackageJson.dependencies,
29 mainPackageJson.devDepencies,
30 clientPackageJson.dependencies
31 ) as PackageDependencies
32
33 // https://github.com/depcheck/depcheck#api
34 const depcheckOptions = {
35 parsers: { '**/*.ts': depcheck.parser.typescript },
36 detectors: [
37 depcheck.detector.requireCallExpression,
38 depcheck.detector.importDeclaration
39 ],
40 ignoreMatches: Object.keys(distTsConfig?.compilerOptions?.paths || []),
41 package: { dependencies: allDependencies }
42 }
43
44 const { dependencies: unusedDependencies } = await depcheck(resolve(cwd(), './types/'), depcheckOptions)
45 console.log(`Removing ${Object.keys(unusedDependencies).length} unused dependencies.`)
46 const dependencies = Object
47 .keys(allDependencies)
48 .filter(dependencyName => !unusedDependencies.includes(dependencyName))
49 .reduce((dependencies, dependencyName) => {
50 dependencies[dependencyName] = allDependencies[dependencyName]
51 return dependencies
52 }, {})
53
54 const { description, version, licence, engines, author, repository } = mainPackageJson
55 const typesPackageJson = {
56 name: '@peertube/peertube-types',
57 description,
58 version,
59 private: false,
60 license: licence,
61 engines,
62 author,
63 repository,
64 dependencies
65 }
66 console.log(`Writing package.json to ${typesDistPackageJsonPath}`)
67 await writeJSON(typesDistPackageJsonPath, typesPackageJson, { spaces: 2 })
68
69 console.log(`Writing git ignore to ${typesDistGitIgnorePath}`)
70 await writeFile(typesDistGitIgnorePath, '*.tsbuildinfo')
71
72 console.log('Copying tsconfig files')
73 await copyFile(distTsConfigPath, resolve(typesDistPath, './tsconfig.json'))
74 await copyFile(resolve(cwd(), './tsconfig.base.json'), resolve(typesDistPath, './tsconfig.base.json'))
75
76 await copyFile(resolve(typesPath, './README.md'), resolve(typesDistPath, './README.md'))
77 }