@@ -26,6 +26,8 @@ import { modern } from "jsr:@vim-fall/std@^0.8.0/builtin/coordinator/modern";
2626import { MODERN_THEME } from "jsr:@vim-fall/std@^0.8.0/builtin/theme/modern" ;
2727import { fzf } from "jsr:@vim-fall/std@^0.8.0/builtin/matcher/fzf" ;
2828
29+ import { ExpectedError } from "./error.ts" ;
30+
2931const 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+
267297export type { ActionPickerParams , PickerParams , Setting } ;
0 commit comments