Versie 0.2.0

This commit is contained in:
Atreides Assets committed 2026-10-29 11:57:29 +01:00
commit e77d8fd373
495 files changed
+81026

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
// Generated, do not edit. sha256:66149bd143afa432d9d09519581acf122a3b5d0a21975829b89df297fac236de
export { secp256k1, schnorr } from '@noble/curves/secp256k1.js';
export { sha256 } from '@noble/hashes/sha2.js';
export { bytesToHex, hexToBytes, utf8ToBytes, concatBytes } from '@noble/hashes/utils.js';
export { chacha20 } from '@noble/ciphers/chacha.js';
export { extract as hkdfExtract, expand as hkdfExpand } from '@noble/hashes/hkdf.js';
export { hmac } from '@noble/hashes/hmac.js';
export { base64 } from '@scure/base';
export { ripemd160 } from '@noble/hashes/legacy.js';
export { HDKey } from '@scure/bip32';
export { base58check, bech32, bech32m } from '@scure/base';
+189
View File
@@ -0,0 +1,189 @@
// Generated, do not edit. sha256:bd50331802703178a5561c2051cfa66fb4fdc608745b61d6cac1576e04cefdc9
import { readFile, writeFile, mkdir, copyFile, rm, readdir } from 'node:fs/promises';
import { join, resolve, dirname, basename } from 'node:path';
import { fileURLToPath } from 'node:url';
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
const MODULES = join(ROOT, 'node_modules');
const VENDOR = join(ROOT, 'client', 'vendor');
function fout(bericht) {
console.error(`\n[vendor] ${bericht}\n`);
process.exit(1);
}
export function pinnedVersion(naam, pkgJson) {
const alles = { ...((pkgJson && pkgJson.dependencies) || {}), ...((pkgJson && pkgJson.devDependencies) || {}) };
const pin = alles[naam];
return /^\d+\.\d+\.\d+$/.test(String(pin ?? '')) ? pin : null;
}
export function pinMismatch(naam, installed, pkgJson) {
const pin = pinnedVersion(naam, pkgJson);
if (!pin || pin === installed) return null;
return `${naam} staat op ${installed} in node_modules, maar package.json pint ${pin}.\n`
+ ' Dat gebeurt na een `git pull` die package.json wijzigde: er is nog niets geinstalleerd.\n'
+ ' Draai eerst: npm install';
}
let projectPkg = null;
async function pakketVersie(naam) {
let versie;
try {
versie = JSON.parse(await readFile(join(MODULES, naam, 'package.json'), 'utf8')).version;
} catch {
fout(`${naam} niet gevonden in node_modules. Draai eerst: npm install`);
}
projectPkg ??= JSON.parse(await readFile(join(ROOT, 'package.json'), 'utf8'));
const mis = pinMismatch(naam, versie, projectPkg);
if (mis) fout(mis);
return versie;
}
async function vendorInter() {
const naam = '@fontsource-variable/inter';
const versie = await pakketVersie(naam);
const bron = join(MODULES, naam);
const doel = join(VENDOR, 'inter');
await mkdir(join(doel, 'files'), { recursive: true });
let bestanden;
try {
bestanden = (await readdir(join(bron, 'files'))).filter(f => f.endsWith('-opsz-normal.woff2'));
} catch {
fout(`${naam}/files/ ontbreekt: pakket onvolledig of van vorm veranderd.`);
}
if (bestanden.length === 0) fout(`${naam}: geen *-opsz-normal.woff2 gevonden (andere pakketvorm?).`);
for (const f of bestanden) await copyFile(join(bron, 'files', f), join(doel, 'files', f));
let css;
try {
css = await readFile(join(bron, 'opsz.css'), 'utf8');
} catch {
fout(`${naam}/opsz.css ontbreekt: pakket van vorm veranderd; CSS niet af te leiden.`);
}
const gekopieerd = new Set(bestanden);
const blokken = css.split('@font-face').slice(1)
.map(b => `@font-face${b.slice(0, b.indexOf('}') + 1)}`)
.filter(b => {
const m = b.match(/url\(\.\/files\/([^)]+)\)/);
return m && gekopieerd.has(basename(m[1]));
})
.map(b => b.replace(/'Inter Variable'/g, `'Inter'`));
if (blokken.length !== bestanden.length) {
fout(`Inter: ${bestanden.length} woff2 gekopieerd maar ${blokken.length} @font-face-blokken ` +
`gevonden. Die twee horen gelijk te zijn; controleer de vorm van opsz.css.`);
}
const kop = [
'/* GEGENEREERD door scripts/vendor.mjs: niet met de hand bewerken.',
` * Bron: ${naam} ${versie}, opsz.css (upright subsets).`,
" * Aangepast: font-family 'Inter Variable' -> 'Inter'. Verder ongewijzigd.",
' */',
].join('\n');
await writeFile(join(doel, 'inter.css'), `${kop}\n\n${blokken.join('\n\n')}\n`, 'utf8');
return `${naam} ${versie} → client/vendor/inter/ (${bestanden.length} subsets + inter.css)`;
}
const CHART_LIBS = [
{ pakket: 'chart.js', bestand: 'dist/chart.umd.js', doelmap: 'chartjs' },
{ pakket: 'hammerjs', bestand: 'hammer.min.js', doelmap: 'hammerjs' },
{ pakket: 'chartjs-plugin-zoom', bestand: 'dist/chartjs-plugin-zoom.min.js', doelmap: 'chartjs-plugin-zoom' },
];
async function vendorChartLibs() {
const regels = [];
for (const { pakket, bestand, doelmap } of CHART_LIBS) {
const versie = await pakketVersie(pakket);
const naam = basename(bestand);
const doel = join(VENDOR, doelmap);
await mkdir(doel, { recursive: true });
let code;
try {
code = await readFile(join(MODULES, pakket, bestand), 'utf8');
} catch {
fout(`${pakket}/${bestand} ontbreekt: pakket onvolledig of van vorm veranderd.`);
}
const zonderMap = code.replace(/\r?\n\/\/# sourceMappingURL=[^\r\n]*\s*$/, '\n');
if (/sourceMappingURL/.test(zonderMap)) {
fout(`${pakket}: sourceMappingURL-verwijzing niet verwijderd: controleer de vorm van ${naam}.`);
}
await writeFile(join(doel, naam), zonderMap, 'utf8');
regels.push(`${pakket} ${versie} → client/vendor/${doelmap}/${naam}`);
}
return regels;
}
async function vendorCrypto() {
const { build } = await import('esbuild');
const versies = [];
for (const p of ['@noble/curves', '@noble/hashes', '@noble/ciphers', '@scure/bip32', '@scure/base']) {
versies.push(`${p} ${await pakketVersie(p)}`);
}
const esbuildVersie = await pakketVersie('esbuild');
const doel = join(VENDOR, 'crypto');
await mkdir(doel, { recursive: true });
const uit = join(doel, 'noble-scure.js');
try {
await build({
entryPoints: [join(ROOT, 'scripts', 'vendor-entries', 'crypto.js')],
outfile: uit,
bundle: true,
format: 'esm',
target: ['es2022'],
minify: true,
sourcemap: false,
legalComments: 'none',
logLevel: 'warning',
});
} catch (e) {
fout(`esbuild kon de crypto-bundel niet bouwen: ${e.message}`);
}
const code = await readFile(uit, 'utf8');
const verwacht = ['secp256k1', 'schnorr', 'sha256', 'ripemd160', 'HDKey', 'base58check', 'bech32', 'bech32m',
'bytesToHex', 'hexToBytes', 'utf8ToBytes', 'concatBytes',
'chacha20', 'hkdfExtract', 'hkdfExpand', 'hmac', 'base64'];
const exportRegel = code.match(/export\s*\{[^}]*\}/g)?.join(' ') ?? '';
const missend = verwacht.filter(n => !new RegExp(`\\b${n}\\b`).test(exportRegel));
if (missend.length) {
fout(`crypto-bundel mist exports: ${missend.join(', ')}. Controleer scripts/vendor-entries/crypto.js.`);
}
const kb = Math.round(code.length / 1024);
return `${versies.join(' + ')} → client/vendor/crypto/noble-scure.js (${kb} KB, gebundeld met esbuild ${esbuildVersie})`;
}
async function vendorQr() {
const pakket = 'qrcode-generator';
const versie = await pakketVersie(pakket);
const doel = join(VENDOR, 'qrcode');
await mkdir(doel, { recursive: true });
let code;
try {
code = await readFile(join(MODULES, pakket, 'dist', 'qrcode.mjs'), 'utf8');
} catch {
fout(`${pakket}/dist/qrcode.mjs ontbreekt: pakket onvolledig of van vorm veranderd.`);
}
if (!/export default qrcode;/.test(code) || /^\s*import\s/m.test(code) || /sourceMappingURL/.test(code)) {
fout(`${pakket}: dist/qrcode.mjs heeft niet de verwachte vorm (één default export, geen imports, geen sourcemap).`);
}
await writeFile(join(doel, 'qrcode.mjs'), code, 'utf8');
return `${pakket} ${versie} → client/vendor/qrcode/qrcode.mjs`;
}
async function main() {
await rm(VENDOR, { recursive: true, force: true });
await mkdir(VENDOR, { recursive: true });
const regels = [await vendorInter(), ...(await vendorChartLibs()), await vendorCrypto(), await vendorQr()];
console.log('[vendor] klaar:');
for (const r of regels) console.log(` - ${r}`);
}
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) await main();