Skip to content

Commit d959d11

Browse files
committed
feat: add validation for picker name and action name
1 parent 230faba commit d959d11

File tree

1 file changed

+38
-8
lines changed

1 file changed

+38
-8
lines changed

denops/fall/custom.ts

+38-8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import { modern } from "jsr:@vim-fall/std@^0.8.0/builtin/coordinator/modern";
2626
import { MODERN_THEME } from "jsr:@vim-fall/std@^0.8.0/builtin/theme/modern";
2727
import { fzf } from "jsr:@vim-fall/std@^0.8.0/builtin/matcher/fzf";
2828

29+
import { ExpectedError } from "./error.ts";
30+
2931
const defaultCustomUrl = new URL(
3032
"./_assets/default.custom.ts",
3133
import.meta.url,
@@ -238,18 +240,29 @@ function reset(): void {
238240
pickerParamsMap.clear();
239241
}
240242

241-
function buildContext(denops: Denops) {
242-
// TODO: Validation must be provided in fall.vim itself
243+
function buildContext(denops: Denops): {
244+
denops: Denops;
245+
refineSetting: ReturnType<typeof buildRefineSetting>;
246+
refineActionPicker: ReturnType<typeof buildRefineActionPicker>;
247+
definePickerFromSource: ReturnType<typeof buildDefinePickerFromSource>;
248+
definePickerFromCurator: ReturnType<typeof buildDefinePickerFromCurator>;
249+
} {
250+
const definePickerFromSource = buildDefinePickerFromSource(pickerParamsMap);
251+
const definePickerFromCurator = buildDefinePickerFromCurator(pickerParamsMap);
243252
return {
244253
denops,
245254
refineSetting: buildRefineSetting(setting),
246255
refineActionPicker: buildRefineActionPicker(actionPickerParams),
247-
definePickerFromSource: buildDefinePickerFromSource(
248-
pickerParamsMap,
249-
),
250-
definePickerFromCurator: buildDefinePickerFromCurator(
251-
pickerParamsMap,
252-
),
256+
definePickerFromSource: (name, source, params) => {
257+
validatePickerName(name);
258+
validateActions(params.actions);
259+
return definePickerFromSource(name, source, params);
260+
},
261+
definePickerFromCurator: (name, curator, params) => {
262+
validatePickerName(name);
263+
validateActions(params.actions);
264+
return definePickerFromCurator(name, curator, params);
265+
},
253266
};
254267
}
255268

@@ -264,4 +277,21 @@ async function getUserCustomUrl(denops: Denops): Promise<URL> {
264277
}
265278
}
266279

280+
function validatePickerName(name: string): void {
281+
if (pickerParamsMap.has(name)) {
282+
throw new ExpectedError(`Picker '${name}' is already defined.`);
283+
}
284+
if (name.startsWith("@")) {
285+
throw new ExpectedError(`Picker name must not start with '@': ${name}`);
286+
}
287+
}
288+
289+
function validateActions(actions: Record<PropertyKey, unknown>): void {
290+
Object.keys(actions).forEach((name) => {
291+
if (name.startsWith("@")) {
292+
throw new ExpectedError(`Action name must not start with '@': ${name}`);
293+
}
294+
});
295+
}
296+
267297
export type { ActionPickerParams, PickerParams, Setting };

0 commit comments

Comments
 (0)