Files
sveltesociety.dev/scripts/updatePublint.js
Lachlan Collins 156f65436c feat: Add script to check if packages pass publint (#523)
* Add zod schemas for CI validation

* Require npm field for components.json

* Remove svelte-layout-resizable

* Stricter Zod validation

* Stricter repository field validation

* Implement requested changes

* Add back accidentally removed field

* Move SvelteStore to templates.json

* Update category and tags

* Add script to get npm data

* Add script to get publint data

* Re-run updateNpm.js

* Re-run updatePublint.js

* Implement initial feedback

* Use npm.json data

* Update npm.js

* Switch async/await to then/catch

Co-authored-by: MacFJA <MacFJA@users.noreply.github.com>

* Fix prettier

* Run script

* Re-run updateNpm

* Also read tools.json

* Add @types/node

* Restructure npm.json output

* Fix updatePublint.js

* Display last update on components page

* Add to weekly workflow

* Clarify updating npm data

* Update src/lib/utils/injectNpmData.ts

Co-authored-by: MacFJA <MacFJA@users.noreply.github.com>

* Smaller date font, add version

* Improve error text

* Fix property title

* Move json to lib/data directory

* Fix npm.json path

* Also check tools.json

* Add to automated PR

* Add injectPublintData function

* Update publint

---------

Co-authored-by: MacFJA <MacFJA@users.noreply.github.com>
2023-12-18 13:26:25 +11:00

78 lines
2.3 KiB
JavaScript

// @ts-check
// Source: https://github.com/bluwy/publint/blob/master/site/src/utils/worker.js
import { writeFileSync } from 'node:fs';
import { inflate } from 'pako';
import getNpmTarballUrl from 'get-npm-tarball-url';
import { componentsSchema, toolsSchema } from '../src/lib/schemas.js';
import components from '../src/routes/components/components.json' assert { type: 'json' };
import tools from '../src/routes/tools/tools.json' assert { type: 'json' };
import npm from '../src/lib/data/npm.json' assert { type: 'json' };
import { publint } from 'publint';
import { untar } from './untar.js';
import { createTarballVfs } from './tarball.js';
const dataWithoutVersions = [...componentsSchema.parse(components), ...toolsSchema.parse(tools)];
/** @param input {import('zod').infer<typeof toolsSchema>} */
const injectVersions = (input) => {
const output = [];
for (const item of input) {
/** @type {string} */
const version = npm[item.npm]?.version;
if (version) {
output.push({ ...item, version });
}
}
return output;
};
const dataWithVersions = injectVersions(dataWithoutVersions);
const output = await Promise.all(
dataWithVersions.map(async (pkg) => {
try {
return await processPackage(pkg);
} catch (error) {
console.log(error.message);
}
})
).then((values) => {
let versions = {};
for (const value of values) {
if (value) {
versions[value.name] = value.valid;
}
}
return versions;
});
writeFileSync('src/lib/data/publint.json', JSON.stringify(output));
/** @param pkg {ReturnType<typeof injectVersions>[0]} */
async function processPackage(pkg) {
const tarballUrl = getNpmTarballUrl(pkg.npm, pkg.version);
let resultBuffer;
try {
const result = await fetch(tarballUrl);
resultBuffer = await result.arrayBuffer();
} catch (e) {
postMessage({ type: 'error', data: 'Package not found' });
console.error(e);
}
let files;
try {
const tarBuffer = inflate(resultBuffer).buffer; // Handles gzip (gz)
files = untar(tarBuffer); // Handles tar (t)
} catch (e) {
postMessage({ type: 'error', data: 'Failed to unpack package' });
console.error(e);
return;
}
const vfs = createTarballVfs(files);
const pkgDir = files.length ? files[0].name.split('/')[0] : 'package';
const { messages } = await publint({ pkgDir, vfs, level: 'warning' });
return { name: pkg.npm, valid: messages.length === 0 };
}