- Completion for brand values in .archify (YAML) and Archify JSON sources, from the bundled brand-marks/catalog.json (107 marks); aliases and product names match, so "kafka" offers apache-kafka - brand/unknown diagnostics carry their JSON pointer only at the start of the message; use it when subject.path is missing, so the error lands on the brand line instead of the top of the file - Unit tests for catalog loading, value detection and pointer fallback; integration checks for completion and diagnostic placement Closes #5
34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
import fs from 'node:fs';
|
|
|
|
export interface Brand {
|
|
id: string;
|
|
title: string;
|
|
category: string;
|
|
aliases: string[];
|
|
}
|
|
|
|
/** Archify's built-in brand marks, read from brand-marks/catalog.json. */
|
|
export function loadBrandCatalog(file: string): Brand[] {
|
|
const catalog = JSON.parse(fs.readFileSync(file, 'utf8')) as { marks?: Partial<Brand>[] };
|
|
return (catalog.marks ?? [])
|
|
.filter((mark): mark is Partial<Brand> & { id: string } => typeof mark.id === 'string')
|
|
.map((mark) => ({ id: mark.id, title: mark.title ?? mark.id, category: mark.category ?? '', aliases: mark.aliases ?? [] }));
|
|
}
|
|
|
|
export interface BrandValue {
|
|
/** What has been typed of the value so far. */
|
|
typed: string;
|
|
}
|
|
|
|
/**
|
|
* Whether the text before the cursor ends inside a `brand` value:
|
|
* `brand: post` or `{ id: db, brand: "post` in YAML, `"brand": "post` in JSON.
|
|
*/
|
|
export function brandValueAt(linePrefix: string, format: 'yaml' | 'json'): BrandValue | undefined {
|
|
const match =
|
|
format === 'yaml'
|
|
? /(?:^|[\s{,])brand:\s*["']?([\w.-]*)$/.exec(linePrefix)
|
|
: /"brand"\s*:\s*"([\w.-]*)$/.exec(linePrefix);
|
|
return match ? { typed: match[1] } : undefined;
|
|
}
|