From 0e1134919ce49254b57301804374e2d6484d7c89 Mon Sep 17 00:00:00 2001 From: Katsute <58778985+Katsute@users.noreply.github.com> Date: Sun, 27 Aug 2023 12:54:47 -0400 Subject: [PATCH] Include licenses when compiling with ESBuild (#199) --- .gitignore | 13 +++++++----- build.js | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +++- 3 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 build.js diff --git a/.gitignore b/.gitignore index 9b85972..dbba8c0 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 0000000..ede5efc --- /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 78468d8..fca8f9e 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",