@git.zone/tsrust 1.13.2 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.smartconfig.json +4 -0
  2. package/assets/notices/gcc-gpl-3.0.txt +674 -0
  3. package/assets/notices/gcc-runtime-library-exception-3.1.txt +73 -0
  4. package/assets/notices/glibc-lgpl-2.1.txt +502 -0
  5. package/assets/notices/musl-copyright.txt +193 -0
  6. package/dist_ts/00_commitinfo_data.js +1 -1
  7. package/dist_ts/index.d.ts +1 -0
  8. package/dist_ts/index.js +2 -1
  9. package/dist_ts/mod_cli/classes.tsrustcli.d.ts +10 -0
  10. package/dist_ts/mod_cli/classes.tsrustcli.js +91 -11
  11. package/dist_ts/mod_cli/helpers.targets.d.ts +2 -0
  12. package/dist_ts/mod_cli/helpers.targets.js +1 -1
  13. package/dist_ts/mod_matrix/classes.nativematrixbuilder.d.ts +6 -0
  14. package/dist_ts/mod_matrix/classes.nativematrixbuilder.js +44 -1
  15. package/dist_ts/mod_notices/classes.nativenoticesgenerator.d.ts +102 -0
  16. package/dist_ts/mod_notices/classes.nativenoticesgenerator.js +946 -0
  17. package/dist_ts/mod_notices/classes.noticetoolchain.d.ts +30 -0
  18. package/dist_ts/mod_notices/classes.noticetoolchain.js +69 -0
  19. package/dist_ts/mod_notices/helpers.licensetext.d.ts +12 -0
  20. package/dist_ts/mod_notices/helpers.licensetext.js +81 -0
  21. package/dist_ts/mod_notices/helpers.muslversion.d.ts +6 -0
  22. package/dist_ts/mod_notices/helpers.muslversion.js +47 -0
  23. package/dist_ts/mod_notices/helpers.noticesconfig.d.ts +71 -0
  24. package/dist_ts/mod_notices/helpers.noticesconfig.js +133 -0
  25. package/dist_ts/mod_notices/helpers.runtimetexts.d.ts +9 -0
  26. package/dist_ts/mod_notices/helpers.runtimetexts.js +45 -0
  27. package/dist_ts/mod_notices/helpers.spdx.d.ts +21 -0
  28. package/dist_ts/mod_notices/helpers.spdx.js +88 -0
  29. package/dist_ts/mod_notices/helpers.staticglibc.d.ts +26 -0
  30. package/dist_ts/mod_notices/helpers.staticglibc.js +45 -0
  31. package/dist_ts/mod_notices/index.d.ts +8 -0
  32. package/dist_ts/mod_notices/index.js +9 -0
  33. package/package.json +5 -5
  34. package/readme.md +123 -13
  35. package/ts/00_commitinfo_data.ts +1 -1
  36. package/ts/index.ts +1 -0
  37. package/ts/mod_cli/classes.tsrustcli.ts +104 -10
  38. package/ts/mod_cli/helpers.targets.ts +2 -0
  39. package/ts/mod_matrix/classes.nativematrixbuilder.ts +44 -0
  40. package/ts/mod_notices/classes.nativenoticesgenerator.ts +1201 -0
  41. package/ts/mod_notices/classes.noticetoolchain.ts +92 -0
  42. package/ts/mod_notices/helpers.licensetext.ts +111 -0
  43. package/ts/mod_notices/helpers.muslversion.ts +46 -0
  44. package/ts/mod_notices/helpers.noticesconfig.ts +235 -0
  45. package/ts/mod_notices/helpers.runtimetexts.ts +63 -0
  46. package/ts/mod_notices/helpers.spdx.ts +107 -0
  47. package/ts/mod_notices/helpers.staticglibc.ts +79 -0
  48. package/ts/mod_notices/index.ts +8 -0
@@ -0,0 +1,30 @@
1
+ /** Runs a toolchain command in a directory and returns its standard output. */
2
+ export interface INoticeCommandRunner {
3
+ run(commandArg: string, argsArg: string[], cwdArg: string): Promise<string>;
4
+ }
5
+ /**
6
+ * Runs commands through bash behind an optional toolchain environment prefix
7
+ * (see `ToolchainManager.getEnvPrefix`), the way tsrust runs Cargo.
8
+ */
9
+ export declare class ShellNoticeCommandRunner implements INoticeCommandRunner {
10
+ private readonly envPrefix;
11
+ private readonly shell;
12
+ constructor(envPrefix?: string);
13
+ run(commandArg: string, argsArg: string[], cwdArg: string): Promise<string>;
14
+ }
15
+ /** The Rust toolchain whose runtime the notices describe. */
16
+ export interface INoticeToolchain {
17
+ release: string;
18
+ commitHash: string;
19
+ /** Absolute toolchain sysroot, as printed by `rustc --print sysroot`. */
20
+ sysroot: string;
21
+ }
22
+ export declare const rustSourceLockfile: (sysrootArg: string) => string;
23
+ export declare const muslSelfContainedLibc: (sysrootArg: string, tripleArg: string) => string;
24
+ /**
25
+ * Identifies the toolchain that builds `rustDir` and makes sure it has what
26
+ * notice generation reads: the `rust-src` component and the musl targets.
27
+ * With `installArg` false (every check) it installs nothing and names the
28
+ * missing component instead.
29
+ */
30
+ export declare function resolveNoticeToolchain(runnerArg: INoticeCommandRunner, rustDirArg: string, triplesArg: string[], installArg: boolean): Promise<INoticeToolchain>;
@@ -0,0 +1,69 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as plugins from '../plugins.js';
4
+ const shellQuote = (valueArg) => `'${valueArg.replace(/'/g, `'"'"'`)}'`;
5
+ /**
6
+ * Runs commands through bash behind an optional toolchain environment prefix
7
+ * (see `ToolchainManager.getEnvPrefix`), the way tsrust runs Cargo.
8
+ */
9
+ export class ShellNoticeCommandRunner {
10
+ envPrefix;
11
+ shell = new plugins.smartshell.Smartshell({ executor: 'bash' });
12
+ constructor(envPrefix = '') {
13
+ this.envPrefix = envPrefix;
14
+ }
15
+ async run(commandArg, argsArg, cwdArg) {
16
+ const commandLine = [commandArg, ...argsArg].map(shellQuote).join(' ');
17
+ const result = await this.shell.execSilent(`${this.envPrefix}cd ${shellQuote(cwdArg)} && ${commandLine}`);
18
+ if (result.exitCode !== 0) {
19
+ throw new Error(`${commandArg} ${argsArg.join(' ')} failed with exit code ${result.exitCode}: ${result.stderr.trim().slice(-4000)}`);
20
+ }
21
+ return result.stdout;
22
+ }
23
+ }
24
+ const exists = async (pathArg) => {
25
+ try {
26
+ await fs.promises.access(pathArg);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ };
33
+ export const rustSourceLockfile = (sysrootArg) => path.join(sysrootArg, 'lib', 'rustlib', 'src', 'rust', 'library', 'Cargo.lock');
34
+ export const muslSelfContainedLibc = (sysrootArg, tripleArg) => path.join(sysrootArg, 'lib', 'rustlib', tripleArg, 'lib', 'self-contained', 'libc.a');
35
+ /**
36
+ * Identifies the toolchain that builds `rustDir` and makes sure it has what
37
+ * notice generation reads: the `rust-src` component and the musl targets.
38
+ * With `installArg` false (every check) it installs nothing and names the
39
+ * missing component instead.
40
+ */
41
+ export async function resolveNoticeToolchain(runnerArg, rustDirArg, triplesArg, installArg) {
42
+ const verbose = await runnerArg.run('rustc', ['-vV'], rustDirArg);
43
+ const release = /^release: (\S+)$/m.exec(verbose)?.[1];
44
+ const commitHash = /^commit-hash: ([0-9a-f]{40})$/m.exec(verbose)?.[1];
45
+ if (!release || !commitHash) {
46
+ throw new Error('rustc -vV did not report a release and commit hash');
47
+ }
48
+ const sysroot = (await runnerArg.run('rustc', ['--print', 'sysroot'], rustDirArg)).trim();
49
+ if (!path.isAbsolute(sysroot))
50
+ throw new Error(`rustc reported a relative sysroot: ${sysroot}`);
51
+ const ensure = async (presentArg, installArgs, labelArg) => {
52
+ if (await exists(presentArg))
53
+ return;
54
+ const command = `rustup ${installArgs.join(' ')}`;
55
+ if (!installArg) {
56
+ throw new Error(`${labelArg} of Rust ${release} is not installed; run \`${command}\` (checks install nothing)`);
57
+ }
58
+ await runnerArg.run('rustup', installArgs, rustDirArg);
59
+ if (!(await exists(presentArg))) {
60
+ throw new Error(`${labelArg} of Rust ${release} is still missing at ${sysroot} after \`${command}\``);
61
+ }
62
+ };
63
+ await ensure(rustSourceLockfile(sysroot), ['component', 'add', 'rust-src'], 'The rust-src component');
64
+ for (const triple of triplesArg.filter((triple) => triple.endsWith('-linux-musl'))) {
65
+ await ensure(muslSelfContainedLibc(sysroot, triple), ['target', 'add', triple], `The ${triple} target`);
66
+ }
67
+ return { release, commitHash, sysroot };
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ub3RpY2V0b29sY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfbm90aWNlcy9jbGFzc2VzLm5vdGljZXRvb2xjaGFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQU96QyxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUV4Rjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBR047SUFGWixLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRWpGLFlBQTZCLFlBQW9CLEVBQUU7UUFBdEIsY0FBUyxHQUFULFNBQVMsQ0FBYTtJQUFHLENBQUM7SUFFaEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFrQixFQUFFLE9BQWlCLEVBQUUsTUFBYztRQUNwRSxNQUFNLFdBQVcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUcsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQ2Is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
@@ -0,0 +1,12 @@
1
+ import type { ISpdxTerm } from './helpers.spdx.js';
2
+ /** Returns the license text families a file contains, in a stable order. */
3
+ export declare function classifyLicenseText(contentsArg: Buffer): string[];
4
+ /**
5
+ * Maps an SPDX identifier onto the license text it requires: `-only`,
6
+ * `-or-later` and `+` select a version range of the same text.
7
+ */
8
+ export declare function licenseTextFamily(identifierArg: string): string;
9
+ /** True when the available license texts satisfy every term of one alternative. */
10
+ export declare function licenseAlternativesCovered(alternativesArg: ISpdxTerm[][], familiesArg: ReadonlySet<string>): boolean;
11
+ /** Formats the terms a set of texts leaves uncovered, for error messages. */
12
+ export declare function describeUncoveredTerms(alternativesArg: ISpdxTerm[][], familiesArg: ReadonlySet<string>): string;
@@ -0,0 +1,81 @@
1
+ const has = (...phrasesArg) => (textArg) => phrasesArg.every((phrase) => textArg.includes(phrase));
2
+ // MIT-0 grants the MIT permissions without MIT's notice condition.
3
+ const mitGrant = 'permission is hereby granted, free of charge, to any person obtaining a copy';
4
+ const mitCondition = 'subject to the following conditions';
5
+ const iscGrant = /permission to use, copy, modify, (?:and\/or |and )distribute this software for any purpose with or without fee is hereby granted/;
6
+ const iscCondition = 'provided that the above copyright notice and this permission notice appear in all copies';
7
+ const bsdRedistribution = 'redistribution and use in source and binary forms';
8
+ const bsdEndorsement = /neither the name|may (?:not )?be used to endorse or promote products derived from this software/;
9
+ /**
10
+ * Phrases that identify a license text. They are chosen from the operative
11
+ * wording, so a file that merely names a license (a README or a short
12
+ * "licensed under X or Y" note) is not mistaken for the text itself.
13
+ */
14
+ const fingerprints = [
15
+ { family: 'MIT', matches: (textArg) => textArg.includes(mitGrant) && textArg.includes(mitCondition) },
16
+ { family: 'MIT-0', matches: (textArg) => textArg.includes(mitGrant) && !textArg.includes(mitCondition) },
17
+ {
18
+ family: 'Apache-2.0',
19
+ matches: has('apache license', 'version 2.0', 'terms and conditions for use, reproduction, and distribution'),
20
+ },
21
+ { family: 'LLVM-exception', matches: has('llvm exceptions to the apache 2.0 license') },
22
+ { family: 'Unlicense', matches: has('this is free and unencumbered software released into the public domain') },
23
+ { family: 'BSD-3-Clause', matches: (textArg) => textArg.includes(bsdRedistribution) && bsdEndorsement.test(textArg) },
24
+ { family: 'BSD-2-Clause', matches: (textArg) => textArg.includes(bsdRedistribution) && !bsdEndorsement.test(textArg) },
25
+ { family: 'ISC', matches: (textArg) => iscGrant.test(textArg) && textArg.includes(iscCondition) },
26
+ { family: '0BSD', matches: (textArg) => iscGrant.test(textArg) && !textArg.includes(iscCondition) },
27
+ {
28
+ family: 'Zlib',
29
+ matches: has("this software is provided 'as-is', without any express or implied warranty", 'altered source versions must be plainly marked as such'),
30
+ },
31
+ { family: 'Unicode-3.0', matches: has('unicode license v3') },
32
+ { family: 'Unicode-DFS-2016', matches: has('unicode, inc. license agreement - data files and software') },
33
+ { family: 'BSL-1.0', matches: has('boost software license - version 1.0') },
34
+ { family: 'CC0-1.0', matches: has('cc0 1.0 universal') },
35
+ { family: 'MPL-2.0', matches: has('mozilla public license version 2.0') },
36
+ {
37
+ family: 'GPL-2.0',
38
+ matches: has('gnu general public license', 'version 2, june 1991', 'the gnu general public license is intended to guarantee'),
39
+ },
40
+ { family: 'GPL-3.0', matches: has('the gnu general public license is a free, copyleft license') },
41
+ { family: 'LGPL-2.1', matches: has('gnu lesser general public license', 'version 2.1, february 1999') },
42
+ { family: 'LGPL-3.0', matches: has('gnu lesser general public license', 'version 3, 29 june 2007') },
43
+ { family: 'GCC-exception-3.1', matches: has('gcc runtime library exception', 'version 3.1') },
44
+ ];
45
+ // Line prefixes of license texts kept as source comments.
46
+ const commentPrefix = /^[ \t]*(?:\/\/+|\/\*+|\*+|#+|--|;+)[ \t]?/gm;
47
+ const normalizeText = (bufferArg) => bufferArg
48
+ .toString('utf8')
49
+ .replace(commentPrefix, '')
50
+ .toLowerCase()
51
+ .replace(/[‘’]/g, "'")
52
+ .replace(/[“”]/g, '"')
53
+ .replace(/\s+/g, ' ');
54
+ /** Returns the license text families a file contains, in a stable order. */
55
+ export function classifyLicenseText(contentsArg) {
56
+ const text = normalizeText(contentsArg);
57
+ return fingerprints.filter((fingerprint) => fingerprint.matches(text)).map((fingerprint) => fingerprint.family);
58
+ }
59
+ /**
60
+ * Maps an SPDX identifier onto the license text it requires: `-only`,
61
+ * `-or-later` and `+` select a version range of the same text.
62
+ */
63
+ export function licenseTextFamily(identifierArg) {
64
+ return identifierArg.replace(/\+$/, '').replace(/-(?:only|or-later)$/, '');
65
+ }
66
+ const termCovered = (termArg, familiesArg) => familiesArg.has(licenseTextFamily(termArg.license)) &&
67
+ (termArg.exception === undefined || familiesArg.has(termArg.exception));
68
+ /** True when the available license texts satisfy every term of one alternative. */
69
+ export function licenseAlternativesCovered(alternativesArg, familiesArg) {
70
+ return alternativesArg.some((terms) => terms.every((term) => termCovered(term, familiesArg)));
71
+ }
72
+ /** Formats the terms a set of texts leaves uncovered, for error messages. */
73
+ export function describeUncoveredTerms(alternativesArg, familiesArg) {
74
+ return alternativesArg
75
+ .map((terms) => terms
76
+ .filter((term) => !termCovered(term, familiesArg))
77
+ .map((term) => (term.exception ? `${term.license} WITH ${term.exception}` : term.license))
78
+ .join(' AND '))
79
+ .join(' | ');
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5saWNlbnNldGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9ub3RpY2VzL2hlbHBlcnMubGljZW5zZXRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBZSxFQUFXLEVBQUUsQ0FDcEUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRXpELG1FQUFtRTtBQUNuRSxNQUFNLFFBQVEsR0FBRyw4RUFBOEUsQ0FBQztBQUNoRyxNQUFNLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztBQUMzRCxNQUFNLFFBQVEsR0FDWixrSUFBa0ksQ0FBQztBQUNySSxNQUFNLFlBQVksR0FBRywwRkFBMEYsQ0FBQztBQUNoSCxNQUFNLGlCQUFpQixHQUFHLG1EQUFtRCxDQUFDO0FBQzlFLE1BQU0sY0FBYyxHQUFHLGlHQUFpRyxDQUFDO0FBRXpIOzs7O0dBSUc7QUFDSCxNQUFNLFlBQVksR0FBMEI7SUFDMUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQ3JHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQ3hHO1FBQ0UsTUFBTSxFQUFFLFlBQVk7UUFDcEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVB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
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Reads the musl release from a static `libc.a`. musl compiles its version
3
+ * string into the `version` object (`src/internal/version.c`); the archive
4
+ * member holds exactly one NUL-terminated `major.minor.patch` string.
5
+ */
6
+ export declare function readMuslVersion(archiveArg: Buffer): string;
@@ -0,0 +1,47 @@
1
+ const archiveMagic = '!<arch>\n';
2
+ const headerBytes = 60;
3
+ const versionPattern = /^\d+\.\d+\.\d+$/;
4
+ /**
5
+ * Reads the musl release from a static `libc.a`. musl compiles its version
6
+ * string into the `version` object (`src/internal/version.c`); the archive
7
+ * member holds exactly one NUL-terminated `major.minor.patch` string.
8
+ */
9
+ export function readMuslVersion(archiveArg) {
10
+ if (archiveArg.subarray(0, archiveMagic.length).toString('latin1') !== archiveMagic) {
11
+ throw new Error('musl libc.a is not an ar archive');
12
+ }
13
+ let longNames = '';
14
+ let offset = archiveMagic.length;
15
+ while (offset + headerBytes <= archiveArg.length) {
16
+ const header = archiveArg.subarray(offset, offset + headerBytes).toString('latin1');
17
+ if (header.slice(58, 60) !== '`\n')
18
+ throw new Error('musl libc.a has a malformed member header');
19
+ const size = Number(header.slice(48, 58).trim());
20
+ if (!Number.isSafeInteger(size) || size < 0 || offset + headerBytes + size > archiveArg.length) {
21
+ throw new Error('musl libc.a has a malformed member size');
22
+ }
23
+ const data = archiveArg.subarray(offset + headerBytes, offset + headerBytes + size);
24
+ let name = header.slice(0, 16).trim();
25
+ if (name === '//') {
26
+ longNames = data.toString('latin1');
27
+ }
28
+ else if (/^\/\d+$/.test(name)) {
29
+ const start = Number(name.slice(1));
30
+ const end = longNames.indexOf('/\n', start);
31
+ name = longNames.slice(start, end < 0 ? undefined : end);
32
+ }
33
+ else {
34
+ name = name.replace(/\/$/, '');
35
+ }
36
+ if (name === 'version.lo' || name === 'version.o') {
37
+ const versions = new Set(data.toString('latin1').split('\u0000').filter((value) => versionPattern.test(value)));
38
+ if (versions.size !== 1) {
39
+ throw new Error('musl libc.a version member does not hold exactly one version string');
40
+ }
41
+ return [...versions][0];
42
+ }
43
+ offset += headerBytes + size + (size % 2);
44
+ }
45
+ throw new Error('musl libc.a has no version member');
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5tdXNsdmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9ub3RpY2VzL2hlbHBlcnMubXVzbHZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBQ2pDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN2QixNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztBQUV6Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUNoRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDbkIsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNqQyxPQUFPLE1BQU0sR0FBRyxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEYsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLFdBQVcsR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDcEYsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUN0RixDQUFDO1lBQ0YsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxNQUFNLElBQUksV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMifQ==
@@ -0,0 +1,71 @@
1
+ /**
2
+ * A license text that covers a package whose own files tsrust cannot match to
3
+ * its declared license: a reviewed text kept in the project, or a crate file
4
+ * whose wording tsrust does not recognise.
5
+ */
6
+ export interface ITsrustNoticeFileOverride {
7
+ from: 'project' | 'crate';
8
+ /** Relative to the project root (`project`) or the crate root (`crate`). */
9
+ path: string;
10
+ /** SPDX license identifiers the text satisfies. */
11
+ licenses: string[];
12
+ }
13
+ /** A C/C++ library a Cargo package compiles into the executables. */
14
+ export interface ITsrustNoticeNativeComponent {
15
+ name: string;
16
+ version: string;
17
+ license: string;
18
+ /** License files inside the crate source, relative to the crate root. */
19
+ files: string[];
20
+ }
21
+ /**
22
+ * What an extra text is: the license of a component the crate vendors, or a
23
+ * supplement reproducing the copyright and license comments of its sources.
24
+ */
25
+ export type TTsrustNoticeExtraTextKind = 'component-license' | 'source-attribution';
26
+ /**
27
+ * A reviewed text the project ships with a package in addition to the texts
28
+ * that cover its license. Extra texts never count towards that coverage.
29
+ */
30
+ export interface ITsrustNoticeExtraText {
31
+ /** Relative to the project root. */
32
+ path: string;
33
+ /** Lowercase hex SHA-256 digest of the reviewed file. */
34
+ sha256: string;
35
+ kind: TTsrustNoticeExtraTextKind;
36
+ /** The vendored component the text applies to, for example `once_cell`. */
37
+ component?: string;
38
+ }
39
+ export interface ITsrustNoticePackageOverride {
40
+ /** Only for a package that declares no license, or one tsrust cannot parse. */
41
+ license?: string;
42
+ files?: ITsrustNoticeFileOverride[];
43
+ /** Reviewed texts copied beside the package's license files; they cover nothing. */
44
+ extraTexts?: ITsrustNoticeExtraText[];
45
+ /** Required for every package with a `links` key; `[]` declares that nothing is bundled. */
46
+ native?: ITsrustNoticeNativeComponent[];
47
+ }
48
+ /** Runtime material a target's linker adds beyond what tsrust knows about. */
49
+ export interface ITsrustNoticeRuntimeComponent {
50
+ name: string;
51
+ version?: string;
52
+ license: string;
53
+ /** License files in the project, relative to the project root. */
54
+ files: string[];
55
+ }
56
+ export interface ITsrustNoticesConfig {
57
+ /** Project-relative output directory, `native-notices` by default. */
58
+ directory?: string;
59
+ /** Keyed by the exact `name@version`. */
60
+ packages?: Record<string, ITsrustNoticePackageOverride>;
61
+ /** Keyed by target name, for example `linux_amd64_musl`. */
62
+ runtime?: Record<string, ITsrustNoticeRuntimeComponent[]>;
63
+ }
64
+ export interface IResolvedNoticesConfig {
65
+ directory: string;
66
+ packages: Map<string, ITsrustNoticePackageOverride>;
67
+ runtime: Map<string, ITsrustNoticeRuntimeComponent[]>;
68
+ }
69
+ export declare const defaultNoticesDirectory = "native-notices";
70
+ /** Validates the `notices` section of the tsrust configuration. */
71
+ export declare function resolveNoticesConfig(valueArg: unknown): IResolvedNoticesConfig;
@@ -0,0 +1,133 @@
1
+ export const defaultNoticesDirectory = 'native-notices';
2
+ const directoryPattern = /^[a-z0-9][a-z0-9._-]*(?:\/[a-z0-9][a-z0-9._-]*)*$/;
3
+ const packageKeyPattern = /^[A-Za-z0-9_-]+@[0-9][A-Za-z0-9.+-]*$/;
4
+ const componentNamePattern = /^[a-z0-9][a-z0-9._-]*$/;
5
+ const componentVersionPattern = /^[a-z0-9][a-z0-9.+-]*$/;
6
+ const spdxIdentifierPattern = /^[A-Za-z0-9][A-Za-z0-9.-]*\+?$/;
7
+ const sha256Pattern = /^[0-9a-f]{64}$/;
8
+ const extraTextKinds = ['component-license', 'source-attribution'];
9
+ const isRecord = (valueArg) => !!valueArg && typeof valueArg === 'object' && !Array.isArray(valueArg);
10
+ const assertRecord = (valueArg, labelArg, allowedKeysArg) => {
11
+ if (!isRecord(valueArg))
12
+ throw new Error(`${labelArg} must be an object`);
13
+ const unexpected = Object.keys(valueArg).filter((key) => !allowedKeysArg.includes(key));
14
+ if (unexpected.length > 0) {
15
+ throw new Error(`${labelArg} contains unsupported keys: ${unexpected.join(', ')}`);
16
+ }
17
+ return valueArg;
18
+ };
19
+ const assertEntries = (valueArg, labelArg) => {
20
+ if (!isRecord(valueArg))
21
+ throw new Error(`${labelArg} must be an object`);
22
+ return valueArg;
23
+ };
24
+ const assertString = (valueArg, labelArg, patternArg) => {
25
+ if (typeof valueArg !== 'string' || valueArg.length === 0 || valueArg.length > 1024) {
26
+ throw new Error(`${labelArg} must be a non-empty string`);
27
+ }
28
+ if (patternArg && !patternArg.test(valueArg)) {
29
+ throw new Error(`${labelArg} has an invalid value: ${JSON.stringify(valueArg)}`);
30
+ }
31
+ return valueArg;
32
+ };
33
+ const assertArray = (valueArg, labelArg, nonEmptyArg) => {
34
+ if (!Array.isArray(valueArg) || (nonEmptyArg && valueArg.length === 0)) {
35
+ throw new Error(`${labelArg} must be ${nonEmptyArg ? 'a non-empty' : 'an'} array`);
36
+ }
37
+ return valueArg;
38
+ };
39
+ const relativePath = (valueArg, labelArg) => {
40
+ const value = assertString(valueArg, labelArg);
41
+ if (value.startsWith('/') || value.includes('\\') || value.split('/').some((segment) => segment === '' || segment === '.')) {
42
+ throw new Error(`${labelArg} must be a relative path: ${JSON.stringify(value)}`);
43
+ }
44
+ return value;
45
+ };
46
+ const validateFileOverride = (valueArg, labelArg) => {
47
+ const value = assertRecord(valueArg, labelArg, ['from', 'path', 'licenses']);
48
+ if (value.from !== 'project' && value.from !== 'crate') {
49
+ throw new Error(`${labelArg}.from must be "project" or "crate"`);
50
+ }
51
+ return {
52
+ from: value.from,
53
+ path: relativePath(value.path, `${labelArg}.path`),
54
+ licenses: assertArray(value.licenses, `${labelArg}.licenses`, true).map((license, index) => assertString(license, `${labelArg}.licenses[${index}]`, spdxIdentifierPattern)),
55
+ };
56
+ };
57
+ const validateExtraText = (valueArg, labelArg) => {
58
+ const value = assertRecord(valueArg, labelArg, ['path', 'sha256', 'kind', 'component']);
59
+ const kind = extraTextKinds.find((candidate) => candidate === value.kind);
60
+ if (kind === undefined) {
61
+ throw new Error(`${labelArg}.kind must be one of ${extraTextKinds.map((entry) => `"${entry}"`).join(', ')}`);
62
+ }
63
+ return {
64
+ path: relativePath(value.path, `${labelArg}.path`),
65
+ sha256: assertString(value.sha256, `${labelArg}.sha256`, sha256Pattern),
66
+ kind,
67
+ ...(value.component === undefined
68
+ ? {}
69
+ : { component: assertString(value.component, `${labelArg}.component`, componentNamePattern) }),
70
+ };
71
+ };
72
+ const validateNativeComponent = (valueArg, labelArg) => {
73
+ const value = assertRecord(valueArg, labelArg, ['name', 'version', 'license', 'files']);
74
+ return {
75
+ name: assertString(value.name, `${labelArg}.name`, componentNamePattern),
76
+ version: assertString(value.version, `${labelArg}.version`, componentVersionPattern),
77
+ license: assertString(value.license, `${labelArg}.license`),
78
+ files: assertArray(value.files, `${labelArg}.files`, true).map((file, index) => relativePath(file, `${labelArg}.files[${index}]`)),
79
+ };
80
+ };
81
+ const validateRuntimeComponent = (valueArg, labelArg) => {
82
+ const value = assertRecord(valueArg, labelArg, ['name', 'version', 'license', 'files']);
83
+ return {
84
+ name: assertString(value.name, `${labelArg}.name`, componentNamePattern),
85
+ ...(value.version === undefined
86
+ ? {}
87
+ : { version: assertString(value.version, `${labelArg}.version`, componentVersionPattern) }),
88
+ license: assertString(value.license, `${labelArg}.license`),
89
+ files: assertArray(value.files, `${labelArg}.files`, true).map((file, index) => relativePath(file, `${labelArg}.files[${index}]`)),
90
+ };
91
+ };
92
+ /** Validates the `notices` section of the tsrust configuration. */
93
+ export function resolveNoticesConfig(valueArg) {
94
+ const value = assertRecord(valueArg, 'notices', ['directory', 'packages', 'runtime']);
95
+ const directory = value.directory === undefined
96
+ ? defaultNoticesDirectory
97
+ : assertString(value.directory, 'notices.directory');
98
+ if (!directoryPattern.test(directory) || directory.split('/')[0] === 'dist_rust' || directory.split('/')[0] === 'node_modules') {
99
+ throw new Error(`notices.directory must be a lowercase project-relative path outside dist_rust: ${JSON.stringify(directory)}`);
100
+ }
101
+ const packages = new Map();
102
+ if (value.packages !== undefined) {
103
+ for (const [key, entry] of Object.entries(assertEntries(value.packages, 'notices.packages'))) {
104
+ const label = `notices.packages["${key}"]`;
105
+ if (!packageKeyPattern.test(key))
106
+ throw new Error(`${label} must be keyed by the exact name@version`);
107
+ const override = assertRecord(entry, label, ['license', 'files', 'extraTexts', 'native']);
108
+ const resolved = {};
109
+ if (override.license !== undefined)
110
+ resolved.license = assertString(override.license, `${label}.license`);
111
+ if (override.files !== undefined) {
112
+ resolved.files = assertArray(override.files, `${label}.files`, true).map((file, index) => validateFileOverride(file, `${label}.files[${index}]`));
113
+ }
114
+ if (override.extraTexts !== undefined) {
115
+ resolved.extraTexts = assertArray(override.extraTexts, `${label}.extraTexts`, true).map((text, index) => validateExtraText(text, `${label}.extraTexts[${index}]`));
116
+ }
117
+ if (override.native !== undefined) {
118
+ resolved.native = assertArray(override.native, `${label}.native`, false).map((component, index) => validateNativeComponent(component, `${label}.native[${index}]`));
119
+ }
120
+ if (Object.keys(resolved).length === 0)
121
+ throw new Error(`${label} is empty`);
122
+ packages.set(key, resolved);
123
+ }
124
+ }
125
+ const runtime = new Map();
126
+ if (value.runtime !== undefined) {
127
+ for (const [target, components] of Object.entries(assertEntries(value.runtime, 'notices.runtime'))) {
128
+ runtime.set(target, assertArray(components, `notices.runtime.${target}`, false).map((component, index) => validateRuntimeComponent(component, `notices.runtime.${target}[${index}]`)));
129
+ }
130
+ }
131
+ return { directory, packages, runtime };
132
+ }
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5ub3RpY2VzY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX25vdGljZXMvaGVscGVycy5ub3RpY2VzY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRFQSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUV4RCxNQUFNLGdCQUFnQixHQUFHLG1EQUFtRCxDQUFDO0FBQzdFLE1BQU0saUJBQWlCLEdBQUcsdUNBQXVDLENBQUM7QUFDbEUsTUFBTSxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztBQUN0RCxNQUFNLHVCQUF1QixHQUFHLHdCQUF3QixDQUFDO0FBQ3pELE1BQU0scUJBQXFCLEdBQUcsZ0NBQWdDLENBQUM7QUFDL0QsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFDdkMsTUFBTSxjQUFjLEdBQWlDLENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUVqRyxNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FDMUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBaUIsRUFBRSxRQUFnQixFQUFFLGNBQXdCLEVBQTJCLEVBQUU7SUFDOUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsUUFBUSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RixJQUFJLFVBQVUsQ0FBQyxN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
@@ -0,0 +1,9 @@
1
+ export type TRuntimeLicenseTextId = 'musl' | 'glibc-lgpl-2.1' | 'gcc-gpl-3.0' | 'gcc-runtime-library-exception-3.1';
2
+ export interface IRuntimeLicenseText {
3
+ id: TRuntimeLicenseTextId;
4
+ contents: Buffer;
5
+ }
6
+ /** musl releases whose COPYRIGHT file is the bundled `musl` text. */
7
+ export declare const knownMuslVersions: string[];
8
+ export declare function readRuntimeLicenseText(idArg: TRuntimeLicenseTextId): Promise<Buffer>;
9
+ export declare function readRuntimeLicenseTexts(): Promise<IRuntimeLicenseText[]>;
@@ -0,0 +1,45 @@
1
+ import * as crypto from 'node:crypto';
2
+ import * as fs from 'node:fs';
3
+ import * as url from 'node:url';
4
+ /**
5
+ * Canonical runtime license texts shipped in `assets/notices/`, verified
6
+ * byte-for-byte against their upstream sources.
7
+ */
8
+ const runtimeLicenseTextSources = {
9
+ musl: {
10
+ file: 'musl-copyright.txt',
11
+ sha256: 'f9bc4423732350eb0b3f7ed7e91d530298476f8fec0c6c427a1c04ade22655af',
12
+ source: 'https://git.musl-libc.org/cgit/musl/plain/COPYRIGHT?h=v1.2.3 and ?h=v1.2.5 (identical)',
13
+ },
14
+ 'glibc-lgpl-2.1': {
15
+ file: 'glibc-lgpl-2.1.txt',
16
+ sha256: 'dc626520dcd53a22f727af3ee42c770e56c97a64fe3adb063799d8ab032fe551',
17
+ source: 'https://raw.githubusercontent.com/bminor/glibc/glibc-2.39/COPYING.LIB',
18
+ },
19
+ 'gcc-gpl-3.0': {
20
+ file: 'gcc-gpl-3.0.txt',
21
+ sha256: '8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903',
22
+ source: 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-14.2.0/COPYING3',
23
+ },
24
+ 'gcc-runtime-library-exception-3.1': {
25
+ file: 'gcc-runtime-library-exception-3.1.txt',
26
+ sha256: '9d6b43ce4d8de0c878bf16b54d8e7a10d9bd42b75178153e3af6a815bdc90f74',
27
+ source: 'https://raw.githubusercontent.com/gcc-mirror/gcc/releases/gcc-14.2.0/COPYING.RUNTIME',
28
+ },
29
+ };
30
+ /** musl releases whose COPYRIGHT file is the bundled `musl` text. */
31
+ export const knownMuslVersions = ['1.2.3', '1.2.5'];
32
+ const assetDirectory = new URL('../../assets/notices/', import.meta.url);
33
+ export async function readRuntimeLicenseText(idArg) {
34
+ const source = runtimeLicenseTextSources[idArg];
35
+ const contents = await fs.promises.readFile(url.fileURLToPath(new URL(source.file, assetDirectory)));
36
+ if (crypto.createHash('sha256').update(contents).digest('hex') !== source.sha256) {
37
+ throw new Error(`Bundled runtime license text differs from its reviewed source: ${source.file}`);
38
+ }
39
+ return contents;
40
+ }
41
+ export async function readRuntimeLicenseTexts() {
42
+ const ids = Object.keys(runtimeLicenseTextSources);
43
+ return Promise.all(ids.map(async (id) => ({ id, contents: await readRuntimeLicenseText(id) })));
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5ydW50aW1ldGV4dHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfbm90aWNlcy9oZWxwZXJzLnJ1bnRpbWV0ZXh0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQztBQWdCaEM7OztHQUdHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBNkQ7SUFDMUYsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixNQUFNLEVBQUUsa0VBQWtFO1FBQzFFLE1BQU0sRUFBRSx3RkFBd0Y7S0FDakc7SUFDRCxnQkFBZ0IsRUFBRTtRQUNoQixJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLE1BQU0sRUFBRSxrRUFBa0U7UUFDMUUsTUFBTSxFQUFFLHVFQUF1RTtLQUNoRjtJQUNELGFBQWEsRUFBRTtRQUNiLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsTUFBTSxFQUFFLGtFQUFrRTtRQUMxRSxNQUFNLEVBQUUsK0VBQStFO0tBQ3hGO0lBQ0QsbUNBQW1DLEVBQUU7UUFDbkMsSUFBSSxFQUFFLHVDQUF1QztRQUM3QyxNQUFNLEVBQUUsa0VBQWtFO1FBQzFFLE1BQU0sRUFBRSxzRkFBc0Y7S0FDL0Y7Q0FDRixDQUFDO0FBRUYscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRXBELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFekUsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxLQUE0QjtJQUN2RSxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pGLE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUI7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBNEIsQ0FBQztJQUM5RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEcsQ0FBQyJ9
@@ -0,0 +1,21 @@
1
+ /**
2
+ * One license requirement of an SPDX expression alternative: a license
3
+ * identifier, optionally combined with an exception (`WITH`).
4
+ */
5
+ export interface ISpdxTerm {
6
+ license: string;
7
+ exception?: string;
8
+ }
9
+ /**
10
+ * An SPDX license expression expanded into its alternatives. Satisfying every
11
+ * term of any one alternative satisfies the expression.
12
+ */
13
+ export interface IParsedSpdxExpression {
14
+ alternatives: ISpdxTerm[][];
15
+ }
16
+ /**
17
+ * Parses an SPDX license expression (`AND`, `OR`, `WITH`, parentheses, and
18
+ * Cargo's legacy `/` separator). Operators are case-sensitive; anything the
19
+ * grammar does not describe is rejected rather than guessed.
20
+ */
21
+ export declare function parseSpdxExpression(expressionArg: string): IParsedSpdxExpression;