@riddance/host
Version:
91 lines • 15.9 kB
JavaScript
import { readdir, readFile } from 'node:fs/promises';
import { findPackageJSON } from 'node:module';
import { basename, dirname, extname, join, resolve } from 'node:path';
import { pathToFileURL } from 'node:url';
import { getHash } from './git.js';
export function resolveCpu(config, supported) {
const resolved = resolveSupported(config.cpus, supported);
if (!resolved) {
// resolveSupported<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
throw new Error('Unsupported CPUs: ' + config.cpus.join(', '));
}
return resolved;
}
export function resolveOS(config, supported) {
const resolved = resolveSupported(config.os, supported);
if (!resolved) {
// resolveSupported<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
throw new Error('Unsupported operating systems: ' + config.os.join(', '));
}
return resolved;
}
function resolveSupported(config, supported) {
if (!config) {
return supported[0];
}
return supported.find(s => config.includes(s) && !config.includes(`!${s}`));
}
export async function reflect(path) {
const absolutePath = resolve(process.cwd(), path);
const [packageJson, allFiles, revision] = await Promise.all([
readConfig(absolutePath),
readdir(absolutePath),
getHash(absolutePath),
]);
const files = allFiles.filter(file => extname(file) === '.ts' && !file.endsWith('.d.ts'));
const myPackageJson = packageJson.name === '@riddance/host'
? join(absolutePath, 'package.json')
: findPackageJSON('@riddance/host', `${pathToFileURL(absolutePath).href}/`);
if (!myPackageJson) {
throw new Error('Packages not installed');
}
const { getHandlers, setMeta } = (await import(pathToFileURL(join(dirname(myPackageJson), 'host/registry.js')).toString()));
for (const file of files) {
const base = basename(file, '.ts');
setMeta(packageJson.name, base, revision, packageJson.config);
await import(pathToFileURL(join(absolutePath, base + '.js')).toString());
}
return {
name: packageJson.name,
revision,
http: getHandlers('http').map(h => ({
config: {
...h.config,
cpus: packageJson.cpu,
os: packageJson.os,
nodeVersion: packageJson.engines?.node,
},
name: h.meta?.fileName ?? '',
method: h.method,
pathPattern: h.pathPattern,
})),
timers: getHandlers('timer').map(h => ({
config: {
...h.config,
cpus: packageJson.cpu,
os: packageJson.os,
nodeVersion: packageJson.engines?.node,
},
name: h.meta?.fileName ?? '',
schedule: h.schedule,
})),
events: getHandlers('event').map(h => ({
config: {
...h.config,
cpus: packageJson.cpu,
os: packageJson.os,
nodeVersion: packageJson.engines?.node,
},
name: h.meta?.fileName ?? '',
topic: h.topic,
type: h.type,
})),
};
}
async function readConfig(path) {
const packageJson = JSON.parse(await readFile(join(path, 'package.json'), 'utf-8'));
return packageJson;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlZmxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFJeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQStDbEMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFnQyxFQUFFLFNBQWdCO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDekQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ1osbUhBQW1IO1FBQ25ILG9FQUFvRTtRQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFBO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUNyQixNQUFnQyxFQUNoQyxTQUE0QjtJQUU1QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNaLG1IQUFtSDtRQUNuSCxvRUFBb0U7UUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxNQUFNLENBQUMsRUFBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FB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T0FBTyxXQUFXLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IGZpbmRQYWNrYWdlSlNPTiB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnXG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vY29udGV4dC5qcydcbmltcG9ydCB0eXBlIHsgSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vaHR0cC5qcydcbmltcG9ydCB0eXBlIHsgVGltZXJIYW5kbGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3RpbWVyLmpzJ1xuaW1wb3J0IHsgZ2V0SGFzaCB9IGZyb20gJy4vZ2l0LmpzJ1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vbWV0YS5qcydcbmltcG9ydCB0eXBlIHsgSGFuZGxlcnNHZXR0ZXIgfSBmcm9tICcuL3JlZ2lzdHJ5LmpzJ1xuXG50eXBlIENQVSA9XG4gICAgfCAnYXJtJ1xuICAgIHwgJ2FybTY0J1xuICAgIHwgJ2lhMzInXG4gICAgfCAnbWlwcydcbiAgICB8ICdtaXBzZWwnXG4gICAgfCAncHBjJ1xuICAgIHwgJ3BwYzY0J1xuICAgIHwgJ3MzOTAnXG4gICAgfCAnczM5MHgnXG4gICAgfCAneDMyJ1xuICAgIHwgJ3g2NCdcbnR5cGUgQ3B1Q29uZmlnID0gQ1BVIHwgYCEke0NQVX1gXG50eXBlIE9TQ29uZmlnID0gTm9kZUpTLlBsYXRmb3JtIHwgYCEke05vZGVKUy5QbGF0Zm9ybX1gXG5cbmV4cG9ydCB0eXBlIFBhY2thZ2VKc29uQ29uZmlndXJhdGlvbiA9IHtcbiAgICBub2RlVmVyc2lvbj86IHN0cmluZ1xuICAgIGNwdXM/OiBDcHVDb25maWdbXVxuICAgIG9zPzogT1NDb25maWdbXVxufVxuXG5leHBvcnQgdHlwZSBSZWZsZWN0aW9uID0ge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHJldmlzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBodHRwOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICBtZXRob2Q6ICdHRVQnIHwgJ1BVVCcgfCAnUE9TVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURSdcbiAgICAgICAgcGF0aFBhdHRlcm46IHN0cmluZ1xuICAgICAgICBjb25maWc6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiAmIFBhY2thZ2VKc29uQ29uZmlndXJhdGlvblxuICAgIH1bXVxuICAgIHRpbWVyczoge1xuICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgc2NoZWR1bGU6IHN0cmluZ1xuICAgICAgICBjb25maWc6IFRpbWVySGFuZGxlckNvbmZpZ3VyYXRpb24gJiBQYWNrYWdlSnNvbkNvbmZpZ3VyYXRpb25cbiAgICB9W11cbiAgICBldmVudHM6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgIHRvcGljOiBzdHJpbmdcbiAgICAgICAgdHlwZTogc3RyaW5nXG4gICAgICAgIGNvbmZpZzogSGFuZGxlckNvbmZpZ3VyYXRpb24gJiBQYWNrYWdlSnNvbkNvbmZpZ3VyYXRpb25cbiAgICB9W11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDcHUoY29uZmlnOiBQYWNrYWdlSnNvbkNvbmZpZ3VyYXRpb24sIHN1cHBvcnRlZDogQ1BVW10pOiBDUFUge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVN1cHBvcnRlZChjb25maWcuY3B1cywgc3VwcG9ydGVkKVxuICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgLy8gcmVzb2x2ZVN1cHBvcnRlZDxUPihjb25maWcsIHN1cHBvcnRlZCkgYWN0dWFsbHkgYXNzZXJ0cyBjb25maWcgaXMgKFQgfCBgISR7VH1gKVtdLCBidXQgdGhhdCdzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIENQVXM6ICcgKyBjb25maWcuY3B1cyEuam9pbignLCAnKSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT1MoXG4gICAgY29uZmlnOiBQYWNrYWdlSnNvbkNvbmZpZ3VyYXRpb24sXG4gICAgc3VwcG9ydGVkOiBOb2RlSlMuUGxhdGZvcm1bXSxcbik6IE5vZGVKUy5QbGF0Zm9ybSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlU3VwcG9ydGVkKGNvbmZpZy5vcywgc3VwcG9ydGVkKVxuICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgLy8gcmVzb2x2ZVN1cHBvcnRlZDxUPihjb25maWcsIHN1cHBvcnRlZCkgYWN0dWFsbHkgYXNzZXJ0cyBjb25maWcgaXMgKFQgfCBgISR7VH1gKVtdLCBidXQgdGhhdCdzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdGluZyBzeXN0ZW1zOiAnICsgY29uZmlnLm9zIS5qb2luKCcsICcpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWRcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVN1cHBvcnRlZDxUIGV4dGVuZHMgc3RyaW5nPihjb25maWc6IChUIHwgYCEke1R9YClbXSB8IHVuZGVmaW5lZCwgc3VwcG9ydGVkOiBUW10pIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICByZXR1cm4gc3VwcG9ydGVkWzBdXG4gICAgfVxuICAgIHJldHVybiBzdXBwb3J0ZWQuZmluZChzID0+IGNvbmZpZy5pbmNsdWRlcyhzKSAmJiAhY29uZmlnLmluY2x1ZGVzKGAhJHtzfWApKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmbGVjdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlZmxlY3Rpb24+IHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSByZXNvbHZlKHByb2Nlc3MuY3dkKCksIHBhdGgpXG4gICAgY29uc3QgW3BhY2thZ2VKc29uLCBhbGxGaWxlcywgcmV2aXNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICByZWFkQ29uZmlnKGFic29sdXRlUGF0aCksXG4gICAgICAgIHJlYWRkaXIoYWJzb2x1dGVQYXRoKSxcbiAgICAgICAgZ2V0SGFzaChhYnNvbHV0ZVBhdGgpLFxuICAgIF0pXG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoZmlsZSA9PiBleHRuYW1lKGZpbGUpID09PSAnLnRzJyAmJiAhZmlsZS5lbmRzV2l0aCgnLmQudHMnKSlcbiAgICBjb25zdCBteVBhY2thZ2VKc29uID1cbiAgICAgICAgcGFja2FnZUpzb24ubmFtZSA9PT0gJ0ByaWRkYW5jZS9ob3N0J1xuICAgICAgICAgICAgPyBqb2luKGFic29sdXRlUGF0aCwgJ3BhY2thZ2UuanNvbicpXG4gICAgICAgICAgICA6IGZpbmRQYWNrYWdlSlNPTignQHJpZGRhbmNlL2hvc3QnLCBgJHtwYXRoVG9GaWxlVVJMKGFic29sdXRlUGF0aCkuaHJlZn0vYClcbiAgICBpZiAoIW15UGFja2FnZUpzb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlcyBub3QgaW5zdGFsbGVkJylcbiAgICB9XG4gICAgY29uc3QgeyBnZXRIYW5kbGVycywgc2V0TWV0YSB9ID0gKGF3YWl0IGltcG9ydChcbiAgICAgICAgcGF0aFRvRmlsZVVSTChqb2luKGRpcm5hbWUobXlQYWNrYWdlSnNvbiksICdob3N0L3JlZ2lzdHJ5LmpzJykpLnRvU3RyaW5nKClcbiAgICApKSBhcyB7XG4gICAgICAgIGdldEhhbmRsZXJzOiBIYW5kbGVyc0dldHRlclxuICAgICAgICBzZXRNZXRhOiAoXG4gICAgICAgICAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgIHJldjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2ZnOiBQYWNrYWdlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgKSA9PiB2b2lkXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlLCAnLnRzJylcbiAgICAgICAgc2V0TWV0YShwYWNrYWdlSnNvbi5uYW1lLCBiYXNlLCByZXZpc2lvbiwgcGFja2FnZUpzb24uY29uZmlnKVxuICAgICAgICBhd2FpdCBpbXBvcnQocGF0aFRvRmlsZVVSTChqb2luKGFic29sdXRlUGF0aCwgYmFzZSArICcuanMnKSkudG9TdHJpbmcoKSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBwYWNrYWdlSnNvbi5uYW1lLFxuICAgICAgICByZXZpc2lvbixcbiAgICAgICAgaHR0cDogZ2V0SGFuZGxlcnMoJ2h0dHAnKS5tYXAoaCA9PiAoe1xuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgLi4uaC5jb25maWcsXG4gICAgICAgICAgICAgICAgY3B1czogcGFja2FnZUpzb24uY3B1LFxuICAgICAgICAgICAgICAgIG9zOiBwYWNrYWdlSnNvbi5vcyxcbiAgICAgICAgICAgICAgICBub2RlVmVyc2lvbjogcGFja2FnZUpzb24uZW5naW5lcz8ubm9kZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBoLm1ldGE/LmZpbGVOYW1lID8/ICcnLFxuICAgICAgICAgICAgbWV0aG9kOiBoLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGhQYXR0ZXJuOiBoLnBhdGhQYXR0ZXJuLFxuICAgICAgICB9KSksXG4gICAgICAgIHRpbWVyczogZ2V0SGFuZGxlcnMoJ3RpbWVyJykubWFwKGggPT4gKHtcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIC4uLmguY29uZmlnLFxuICAgICAgICAgICAgICAgIGNwdXM6IHBhY2thZ2VKc29uLmNwdSxcbiAgICAgICAgICAgICAgICBvczogcGFja2FnZUpzb24ub3MsXG4gICAgICAgICAgICAgICAgbm9kZVZlcnNpb246IHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5vZGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogaC5tZXRhPy5maWxlTmFtZSA/PyAnJyxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBoLnNjaGVkdWxlLFxuICAgICAgICB9KSksXG4gICAgICAgIGV2ZW50czogZ2V0SGFuZGxlcnMoJ2V2ZW50JykubWFwKGggPT4gKHtcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIC4uLmguY29uZmlnLFxuICAgICAgICAgICAgICAgIGNwdXM6IHBhY2thZ2VKc29uLmNwdSxcbiAgICAgICAgICAgICAgICBvczogcGFja2FnZUpzb24ub3MsXG4gICAgICAgICAgICAgICAgbm9kZVZlcnNpb246IHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5vZGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogaC5tZXRhPy5maWxlTmFtZSA/PyAnJyxcbiAgICAgICAgICAgIHRvcGljOiBoLnRvcGljLFxuICAgICAgICAgICAgdHlwZTogaC50eXBlLFxuICAgICAgICB9KSksXG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29uZmlnKHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKHBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0Zi04JykpIGFzIHtcbiAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgIGVuZ2luZXM/OiB7IFtlbmdpbmU6IHN0cmluZ106IHN0cmluZyB9XG4gICAgICAgIGNwdT86IENwdUNvbmZpZ1tdXG4gICAgICAgIG9zPzogT1NDb25maWdbXVxuICAgICAgICBjb25maWc/OiBvYmplY3RcbiAgICB9XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uXG59XG4iXX0=