Files
MyAiConfiguration/shared/qmd/qmd-config.mjs
T
Julian lechner 7f441d388d
CI / CI configuration security checks (push) Successful in 3s
CI / Capabilities and shell quality (push) Successful in 15s
CI / Python tests and compilation (push) Successful in 23s
CI / QMD unit tests (push) Failing after 11s
CI / Build and inspect generated packages (push) Successful in 17s
CI / PowerShell tests on Ubuntu (push) Successful in 1m2s
CI / Installed client configuration smoke tests (push) Successful in 1m7s
CI / Bash integration and installation guards (push) Successful in 1m17s
fix(qmd): resolve hoisted dependencies from package context
2026-10-08 15:25:33 +02:00

67 lines
3.4 KiB
JavaScript

// shared/qmd/qmd-config.mjs — edits only the models: block and setup-owned collection ignore lists in QMD's index.yml.
import { existsSync, readFileSync } from 'node:fs';
import { pathToFileURL } from 'node:url';
import { MODELS, importQmdDependency, qmdConfigPath, writeTextAtomic } from './qmd-lib.mjs';
export function setModels(text, YAML) {
const document = YAML.parseDocument(text || '');
if (document.errors.length) throw new Error(`index.yml cannot be parsed: ${document.errors[0].message}`);
if (document.contents === null) document.contents = document.createNode({});
document.set('models', document.createNode({ ...MODELS }));
return document.toString();
}
export function previousModels(text, YAML) {
const document = YAML.parseDocument(text || '');
if (document.errors.length) throw new Error(`index.yml cannot be parsed: ${document.errors[0].message}`);
return document.contents === null ? null : document.toJS().models ?? null;
}
export function restoreModels(text, YAML, mapping) {
const document = YAML.parseDocument(text || '');
if (document.errors.length) throw new Error(`index.yml cannot be parsed: ${document.errors[0].message}`);
if (document.contents === null) document.contents = document.createNode({});
document.set('models', document.createNode(mapping));
return document.toString();
}
export function unsetModels(text, YAML) {
const document = YAML.parseDocument(text || '');
if (document.errors.length) throw new Error(`index.yml cannot be parsed: ${document.errors[0].message}`);
if (document.contents !== null) document.delete('models');
return document.contents === null || document.contents.items?.length === 0 ? '' : document.toString();
}
// Returns the new text, or null when index.yml has no such collection (QMD's write-through always creates it).
export function setCollectionIgnore(text, YAML, name, ignore) {
const document = YAML.parseDocument(text || '');
if (document.errors.length) throw new Error(`index.yml cannot be parsed: ${document.errors[0].message}`);
if (!document.hasIn(['collections', name])) return null;
if (ignore.length) document.setIn(['collections', name, 'ignore'], document.createNode(ignore));
else document.deleteIn(['collections', name, 'ignore']);
return document.toString();
}
async function main(action, argument) {
if (!['set-models', 'unset-models', 'restore-models'].includes(action)) throw new Error('usage: qmd-config.mjs set-models|unset-models|restore-models <json>');
const YAML = await importQmdDependency('yaml');
const path = qmdConfigPath();
const current = existsSync(path) ? readFileSync(path, 'utf8') : '';
let next;
if (action === 'set-models') {
const previous = previousModels(current, YAML);
// A block equal to ours is a leftover of an interrupted run, not the user's own.
console.log(JSON.stringify({ previous: JSON.stringify(previous) === JSON.stringify(MODELS) ? null : previous }));
next = setModels(current, YAML);
} else if (action === 'restore-models') {
const mapping = JSON.parse(argument ?? '');
if (mapping === undefined) throw new Error('restore-models needs a JSON value');
next = restoreModels(current, YAML, mapping);
} else next = unsetModels(current, YAML);
writeTextAtomic(path, next);
}
if (import.meta.url === pathToFileURL(process.argv[1] || '').href) {
main(process.argv[2], process.argv[3]).catch((error) => { console.error(`qmd-config: ${error.message}`); process.exit(1); });
}