|
| 1 | +import * as fs from 'node:fs/promises' |
| 2 | +import * as path from 'node:path' |
| 3 | +import { createRequire } from 'node:module' |
| 4 | +import { fileURLToPath } from 'node:url' |
1 | 5 | import esbuild from 'esbuild'
|
2 |
| -import fs from 'fs' |
3 |
| -import { createRequire } from 'module' |
4 | 6 | import minimist from 'minimist'
|
| 7 | +import checker from 'license-checker' |
5 | 8 |
|
6 | 9 | const require = createRequire(import.meta.url)
|
| 10 | +const __dirname = path.dirname(fileURLToPath(import.meta.url)) |
7 | 11 |
|
8 | 12 | const args = minimist(process.argv.slice(2), {
|
9 | 13 | boolean: ['watch', 'minify'],
|
@@ -31,7 +35,7 @@ let ctx = await esbuild.context({
|
31 | 35 |
|
32 | 36 | build.onLoad({ filter: /.*/, namespace: 'css' }, async (args) => ({
|
33 | 37 | contents: `
|
34 |
| - export default ${JSON.stringify(await fs.promises.readFile(args.path, 'utf8'))} |
| 38 | + export default ${JSON.stringify(await fs.readFile(args.path, 'utf8'))} |
35 | 39 | `,
|
36 | 40 | }))
|
37 | 41 | },
|
@@ -72,6 +76,86 @@ let ctx = await esbuild.context({
|
72 | 76 | opts.loader['.node'] = 'file'
|
73 | 77 | },
|
74 | 78 | },
|
| 79 | + { |
| 80 | + name: 'generate-notices', |
| 81 | + async setup() { |
| 82 | + let exclude = [ |
| 83 | + /^@types\//, |
| 84 | + 'esbuild', |
| 85 | + 'rimraf', |
| 86 | + 'prettier', |
| 87 | + 'typescript', |
| 88 | + 'license-checker', |
| 89 | + ] |
| 90 | + |
| 91 | + let allLicenses = { |
| 92 | + ...(await getLicenses(path.resolve(__dirname, 'packages/tailwindcss-language-server'))), |
| 93 | + ...(await getLicenses(path.resolve(__dirname, 'packages/tailwindcss-language-service'))), |
| 94 | + } |
| 95 | + |
| 96 | + let allDeps = [ |
| 97 | + ...(await getDeps(path.resolve(__dirname, 'packages/tailwindcss-language-server'), true)), |
| 98 | + ...(await getDeps(path.resolve(__dirname, 'packages/tailwindcss-language-service'))), |
| 99 | + ] |
| 100 | + |
| 101 | + function isExcluded(name) { |
| 102 | + for (let pattern of exclude) { |
| 103 | + if (typeof pattern === 'string') { |
| 104 | + if (name === pattern) { |
| 105 | + return true |
| 106 | + } |
| 107 | + } else if (pattern.test(name)) { |
| 108 | + return true |
| 109 | + } |
| 110 | + } |
| 111 | + |
| 112 | + return false |
| 113 | + } |
| 114 | + |
| 115 | + async function getDeps(dir, dev = false) { |
| 116 | + let pkg = JSON.parse(await fs.readFile(path.resolve(dir, 'package.json'), 'utf-8')) |
| 117 | + |
| 118 | + let deps = Object.entries(pkg['dependencies'] ?? {}) |
| 119 | + |
| 120 | + if (dev) deps.push(...Object.entries(pkg['devDependencies'] ?? {})) |
| 121 | + |
| 122 | + return deps.map(([name, version]) => `${name}@${version}`) |
| 123 | + } |
| 124 | + |
| 125 | + function getLicenses(dir) { |
| 126 | + return new Promise((resolve, reject) => { |
| 127 | + checker.init({ start: dir }, (err, packages) => { |
| 128 | + if (err) return reject(err) |
| 129 | + return resolve(packages) |
| 130 | + }) |
| 131 | + }) |
| 132 | + } |
| 133 | + |
| 134 | + let contents = [] |
| 135 | + |
| 136 | + for (let pkg in allLicenses) { |
| 137 | + if (!allDeps.includes(pkg)) continue |
| 138 | + |
| 139 | + let parts = pkg.split('@') |
| 140 | + let name = parts.slice(0, parts.length - 1).join('@') |
| 141 | + if (isExcluded(name)) continue |
| 142 | + |
| 143 | + let license = allLicenses[pkg].licenseFile |
| 144 | + ? (await fs.readFile(allLicenses[pkg].licenseFile, 'utf-8')).trim() |
| 145 | + : undefined |
| 146 | + |
| 147 | + if (!license) continue |
| 148 | + |
| 149 | + contents.push(`${pkg}\n\n${license}`) |
| 150 | + } |
| 151 | + |
| 152 | + await fs.writeFile( |
| 153 | + path.resolve(__dirname, 'packages/tailwindcss-language-server/ThirdPartyNotices.txt'), |
| 154 | + contents.join(`\n\n${'='.repeat(80)}\n\n`), |
| 155 | + 'utf-8', |
| 156 | + ) |
| 157 | + }, |
| 158 | + }, |
75 | 159 | ],
|
76 | 160 | })
|
77 | 161 |
|
|
0 commit comments