diff --git a/.gitignore b/.gitignore index 9b859723..dbba8c05 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ -node_modules -dist +/node_modules +/dist -.vscode-test +/.vscode-test -test/__* +/test/__* -*.vsix \ No newline at end of file +/meta.json +/LICENSES.txt + +/*.vsix \ No newline at end of file diff --git a/build.js b/build.js new file mode 100644 index 00000000..ede5efc5 --- /dev/null +++ b/build.js @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2023 Katsute + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +const fs = require("fs"); +const path = require("path"); +const glob = require("glob"); + +const mp = path.join(__dirname, "meta.json"); + +const meta = JSON.parse(fs.readFileSync(mp, "utf-8")); + +let files = []; + +// glob all potential license files +for(const dep of Object.keys(meta.inputs) + .filter(k => k.startsWith("node_modules/")) + .map(p => p.split('/')[1]) + .filter((p, i, self) => self.indexOf(p) === i) + .sort((a, b) => a.length - b.length)){ + for(const license of glob.sync(`node_modules/${dep}/**/LICENSE*`, {nodir: true, nocase: true}).map(p => p.replace(/\\/g, '/'))){ + files.push(license); + } +} + +let licenses = {}; + +// sort so top level (newer) dependency licenses overwrite transient (potentially older) dependency licenses +for(const license of files.sort((a, b) => b.length - a.length)){ + const name = license.split("node_modules").splice(-1)[0].split('/').slice(0, -1).join('/').substring(1); + licenses[name] = fs.readFileSync(license, "utf-8").trim(); +} + +let out = "# Licenses\n\n---"; + +// write sorted licenses +for(const k of Object.keys(licenses).sort()){ + out += `\n\n# ${k}`; + out += `\n\n${licenses[k]}`; +} + +fs.writeFileSync(path.join(__dirname, "LICENSES.txt"), out, "utf-8"); +fs.rmSync(mp); \ No newline at end of file diff --git a/package.json b/package.json index 78468d86..fca8f9ea 100644 --- a/package.json +++ b/package.json @@ -312,7 +312,9 @@ "update": "npm update -D && npm i --package-lock --ignore-scripts && npm run prune", "// -- build -- //": "", "vscode:prepublish": "npm run prepare", - "build": "esbuild src/extension.ts --bundle --outfile=dist/index.js --external:vscode --format=cjs --platform=node --minify --legal-comments=none", + "build:esbuild": "esbuild src/extension.ts --bundle --outfile=dist/index.js --external:vscode --format=cjs --platform=node --minify --legal-comments=none --metafile=meta.json", + "build:post": "node build.js", + "build": "npm run build:esbuild && npm run build:post", "prepare": "npm run clean && npm run build", "// -- deploy -- //": "", "package": "vsce package",