feat: read from LICENSE file

Sergey Onufrienko created

Change summary

styles/src/buildLicenses.ts | 78 ++++++++++-----------------------------
1 file changed, 20 insertions(+), 58 deletions(-)

Detailed changes

styles/src/buildLicenses.ts 🔗

@@ -1,11 +1,9 @@
 import * as fs from "fs"
 import toml from "toml"
 import { schemeMeta } from "./colorSchemes"
-import { Meta, Verification } from "./themes/common/colorScheme"
-import https from "https"
-import crypto from "crypto"
+import { MetaAndLicense } from "./themes/common/colorScheme"
 
-const accepted_licenses_file = `${__dirname}/../../script/licenses/zed-licenses.toml`
+const ACCEPTED_LICENSES_FILE = `${__dirname}/../../script/licenses/zed-licenses.toml`
 
 // Use the cargo-about configuration file as the source of truth for supported licenses.
 function parseAcceptedToml(file: string): string[] {
@@ -20,8 +18,11 @@ function parseAcceptedToml(file: string): string[] {
     return obj.accepted
 }
 
-function checkLicenses(schemeMeta: Meta[], licenses: string[]) {
-    for (let meta of schemeMeta) {
+function checkLicenses(
+    schemeMetaWithLicense: MetaAndLicense[],
+    licenses: string[]
+) {
+    for (const { meta } of schemeMetaWithLicense) {
         // FIXME: Add support for conjuctions and conditions
         if (licenses.indexOf(meta.license.SPDX) < 0) {
             throw Error(
@@ -31,62 +32,23 @@ function checkLicenses(schemeMeta: Meta[], licenses: string[]) {
     }
 }
 
-function getLicenseText(
-    schemeMeta: Meta[],
-    callback: (meta: Meta, license_text: string) => void
-) {
-    for (let meta of schemeMeta) {
-        if (typeof meta.license.license_text == "string") {
-            callback(meta, meta.license.license_text)
-        } else {
-            let license_text_obj: Verification = meta.license.license_text
-            // The following copied from the example code on nodejs.org:
-            // https://nodejs.org/api/http.html#httpgetoptions-callback
-            https
-                .get(license_text_obj.https_url, (res) => {
-                    const { statusCode } = res
-
-                    if (statusCode < 200 || statusCode >= 300) {
-                        throw new Error(
-                            `Failed to fetch license for: ${meta.name}, Status Code: ${statusCode}`
-                        )
-                    }
-
-                    res.setEncoding("utf8")
-                    let rawData = ""
-                    res.on("data", (chunk) => {
-                        rawData += chunk
-                    })
-                    res.on("end", () => {
-                        const hash = crypto
-                            .createHash("sha256")
-                            .update(rawData)
-                            .digest("hex")
-                        if (license_text_obj.license_checksum == hash) {
-                            callback(meta, rawData)
-                        } else {
-                            throw Error(
-                                `Checksum for ${meta.name} did not match file downloaded from ${license_text_obj.https_url}`
-                            )
-                        }
-                    })
-                })
-                .on("error", (e) => {
-                    throw e
-                })
-        }
+function generateLicenseFile(schemeMetaWithLicense: MetaAndLicense[]) {
+    for (const { meta, licenseFile } of schemeMetaWithLicense) {
+        const licenseText = fs.readFileSync(licenseFile).toString()
+        writeLicense(meta.name, meta.url, licenseText)
     }
 }
 
-function writeLicense(schemeMeta: Meta, text: String) {
+function writeLicense(
+    themeName: string,
+    themeUrl: string,
+    licenseText: String
+) {
     process.stdout.write(
-        `## [${schemeMeta.name}](${schemeMeta.url})\n\n${text}\n********************************************************************************\n\n`
+        `## [${themeName}](${themeUrl})\n\n${licenseText}\n********************************************************************************\n\n`
     )
 }
 
-const accepted_licenses = parseAcceptedToml(accepted_licenses_file)
-checkLicenses(schemeMeta, accepted_licenses)
-
-getLicenseText(schemeMeta, (meta, text) => {
-    writeLicense(meta, text)
-})
+const acceptedLicenses = parseAcceptedToml(ACCEPTED_LICENSES_FILE)
+checkLicenses(schemeMeta, acceptedLicenses)
+generateLicenseFile(schemeMeta)