1
0
silverbullet/plugs/directive/complete.ts

78 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-08-28 15:12:15 +00:00
import { events } from "$sb/syscalls.ts";
import { CompleteEvent } from "$sb/app_event.ts";
import { buildHandebarOptions } from "./util.ts";
2023-08-28 15:12:15 +00:00
import type {
2023-08-08 14:35:46 +00:00
AttributeCompleteEvent,
AttributeCompletion,
2023-08-28 15:12:15 +00:00
} from "../index/attributes.ts";
import { PageMeta } from "$sb/types.ts";
export async function queryComplete(completeEvent: CompleteEvent) {
2023-08-01 19:35:19 +00:00
const querySourceMatch = /#query\s+([\w\-_]*)$/.exec(
completeEvent.linePrefix,
);
if (querySourceMatch) {
const allEvents = await events.listEvents();
const completionOptions = allEvents
.filter((eventName) =>
eventName.startsWith("query:") && !eventName.includes("*")
)
.map((source) => ({
label: source.substring("query:".length),
}));
const allObjectTypes: string[] = (await events.dispatchEvent("query_", {}))
.flat();
for (const type of allObjectTypes) {
completionOptions.push({
label: type,
});
}
2023-08-01 19:35:19 +00:00
return {
from: completeEvent.pos - querySourceMatch[1].length,
options: completionOptions,
2023-08-01 19:35:19 +00:00
};
}
2023-08-01 19:35:19 +00:00
if (completeEvent.parentNodes.includes("DirectiveStart")) {
const querySourceMatch = /#query\s+([\w\-_\/]+)/.exec(
2023-08-01 19:35:19 +00:00
completeEvent.linePrefix,
);
const whereMatch =
/(where|order\s+by|and|select(\s+[\w\s,]+)?)\s+([\w\-_]*)$/.exec(
completeEvent.linePrefix,
);
if (querySourceMatch && whereMatch) {
const type = querySourceMatch[1];
const attributePrefix = whereMatch[3];
2023-08-08 14:35:46 +00:00
const completions = (await events.dispatchEvent(
`attribute:complete:${type}`,
{
source: type,
prefix: attributePrefix,
} as AttributeCompleteEvent,
)).flat() as AttributeCompletion[];
2023-08-01 19:35:19 +00:00
return {
from: completeEvent.pos - attributePrefix.length,
2023-08-08 14:35:46 +00:00
options: attributeCompletionsToCMCompletion(completions),
2023-08-01 19:35:19 +00:00
};
}
}
return null;
}
2023-08-08 14:35:46 +00:00
export function attributeCompletionsToCMCompletion(
completions: AttributeCompletion[],
) {
return completions.map(
(completion) => ({
label: completion.name,
detail: `${completion.attributeType} (${completion.source})`,
2023-08-08 14:35:46 +00:00
type: "attribute",
}),
);
}