Skip to content

Commit 5d2ba46

Browse files
committed
👍 Improve behavior when loading extension is failed
1 parent 58cbc2f commit 5d2ba46

File tree

2 files changed

+86
-47
lines changed

2 files changed

+86
-47
lines changed

denops/fall/extension.ts

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,56 +71,83 @@ export async function register(name: string, script: string): Promise<void> {
7171
}
7272
}
7373

74-
export function getSource(expr: string, conf: Config): Source {
75-
const [name] = expr.split(":", 1);
76-
const mod = registry.source.get(name);
77-
if (!mod) {
78-
throw new Error(`No source '${name}' is registered`);
74+
export function getSource(expr: string, conf: Config): Source | undefined {
75+
try {
76+
const [name] = expr.split(":", 1);
77+
const mod = registry.source.get(name);
78+
if (!mod) {
79+
throw new Error(`No source '${name}' is registered`);
80+
}
81+
return mod.getSource(config.getSourceOptions(expr, conf));
82+
} catch (err) {
83+
console.error(`[fall] ${err.message ?? err}`);
7984
}
80-
return mod.getSource(config.getSourceOptions(expr, conf));
8185
}
8286

83-
export function getFilter(expr: string, conf: Config): Filter {
84-
const [name] = expr.split(":", 1);
85-
const mod = registry.filter.get(name);
86-
if (!mod) {
87-
throw new Error(`No filter '${name}' is registered`);
87+
export function getFilter(expr: string, conf: Config): Filter | undefined {
88+
try {
89+
const [name] = expr.split(":", 1);
90+
const mod = registry.filter.get(name);
91+
if (!mod) {
92+
throw new Error(`No filter '${name}' is registered`);
93+
}
94+
return mod.getFilter(config.getFilterOptions(expr, conf));
95+
} catch (err) {
96+
console.warn(`[fall] ${err.message ?? err}`);
8897
}
89-
return mod.getFilter(config.getFilterOptions(expr, conf));
9098
}
9199

92-
export function getSorter(expr: string, conf: Config): Sorter {
93-
const [name] = expr.split(":", 1);
94-
const mod = registry.sorter.get(name);
95-
if (!mod) {
96-
throw new Error(`No sorter '${name}' is registered`);
100+
export function getSorter(expr: string, conf: Config): Sorter | undefined {
101+
try {
102+
const [name] = expr.split(":", 1);
103+
const mod = registry.sorter.get(name);
104+
if (!mod) {
105+
throw new Error(`No sorter '${name}' is registered`);
106+
}
107+
return mod.getSorter(config.getSorterOptions(expr, conf));
108+
} catch (err) {
109+
console.warn(`[fall] ${err.message ?? err}`);
97110
}
98-
return mod.getSorter(config.getSorterOptions(expr, conf));
99111
}
100112

101-
export function getRenderer(expr: string, conf: Config): Renderer {
102-
const [name] = expr.split(":", 1);
103-
const mod = registry.renderer.get(name);
104-
if (!mod) {
105-
throw new Error(`No renderer '${name}' is registered`);
113+
export function getRenderer(expr: string, conf: Config): Renderer | undefined {
114+
try {
115+
const [name] = expr.split(":", 1);
116+
const mod = registry.renderer.get(name);
117+
if (!mod) {
118+
throw new Error(`No renderer '${name}' is registered`);
119+
}
120+
return mod.getRenderer(config.getRendererOptions(expr, conf));
121+
} catch (err) {
122+
console.warn(`[fall] ${err.message ?? err}`);
106123
}
107-
return mod.getRenderer(config.getRendererOptions(expr, conf));
108124
}
109125

110-
export function getPreviewer(expr: string, conf: Config): Previewer {
111-
const [name] = expr.split(":", 1);
112-
const mod = registry.previewer.get(name);
113-
if (!mod) {
114-
throw new Error(`No previewer '${name}' is registered`);
126+
export function getPreviewer(
127+
expr: string,
128+
conf: Config,
129+
): Previewer | undefined {
130+
try {
131+
const [name] = expr.split(":", 1);
132+
const mod = registry.previewer.get(name);
133+
if (!mod) {
134+
throw new Error(`No previewer '${name}' is registered`);
135+
}
136+
return mod.getPreviewer(config.getPreviewerOptions(expr, conf));
137+
} catch (err) {
138+
console.warn(`[fall] ${err.message ?? err}`);
115139
}
116-
return mod.getPreviewer(config.getPreviewerOptions(expr, conf));
117140
}
118141

119-
export function getAction(expr: string, conf: Config): Action {
120-
const [name] = expr.split(":", 1);
121-
const mod = registry.action.get(name);
122-
if (!mod) {
123-
throw new Error(`No action '${name}' is registered`);
142+
export function getAction(expr: string, conf: Config): Action | undefined {
143+
try {
144+
const [name] = expr.split(":", 1);
145+
const mod = registry.action.get(name);
146+
if (!mod) {
147+
throw new Error(`No action '${name}' is registered`);
148+
}
149+
return mod.getAction(config.getActionOptions(expr, conf));
150+
} catch (err) {
151+
console.warn(`[fall] ${err.message ?? err}`);
124152
}
125-
return mod.getAction(config.getActionOptions(expr, conf));
126153
}

denops/fall/start.ts

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,38 @@ export async function start(
5454
const spc = getSourcePickerConfig(expr, conf);
5555
const apc = getActionPickerConfig(expr, conf);
5656
const actions = new Map(
57-
(spc.actions ?? defaultActions).map((
58-
v,
59-
) => [v, extension.getAction(v, conf)]),
57+
(spc.actions ?? defaultActions)
58+
.map((v) => {
59+
const ext = extension.getAction(v, conf);
60+
if (!ext) return;
61+
return [v, ext] as const;
62+
})
63+
.filter(isDefined),
6064
);
6165
const filters = (spc.filters ?? defaultFilters)
62-
.map((v) => extension.getFilter(v, conf));
66+
.map((v) => extension.getFilter(v, conf))
67+
.filter(isDefined);
6368
const sorters = (spc.sorters ?? defaultSorters)
64-
.map((v) => extension.getSorter(v, conf));
69+
.map((v) => extension.getSorter(v, conf))
70+
.filter(isDefined);
6571
const renderers = (spc.renderers ?? defaultRenderers)
66-
.map((v) => extension.getRenderer(v, conf));
72+
.map((v) => extension.getRenderer(v, conf))
73+
.filter(isDefined);
6774
const previewers = (spc.previewers ?? defaultPreviewers)
68-
.map((v) => extension.getPreviewer(v, conf));
75+
.map((v) => extension.getPreviewer(v, conf))
76+
.filter(isDefined);
6977
const actionFilters = (apc.filters ?? defaultActionFilters)
70-
.map((v) => extension.getFilter(v, conf));
78+
.map((v) => extension.getFilter(v, conf))
79+
.filter(isDefined);
7180
const actionSorters = (apc.sorters ?? defaultActionSorters)
72-
.map((v) => extension.getSorter(v, conf));
81+
.map((v) => extension.getSorter(v, conf))
82+
.filter(isDefined);
7383
const actionRenderers = (apc.renderers ?? defaultActionRenderers)
74-
.map((v) => extension.getRenderer(v, conf));
84+
.map((v) => extension.getRenderer(v, conf))
85+
.filter(isDefined);
7586
const actionPreviewers = (apc.previewers ?? defaultActionPreviewers)
76-
.map((v) => extension.getPreviewer(v, conf));
87+
.map((v) => extension.getPreviewer(v, conf))
88+
.filter(isDefined);
7789

7890
await using itemsPicker = await SourcePicker.create(
7991
denops,

0 commit comments

Comments
 (0)