Skip to content

Commit aa6593d

Browse files
authored
Add in-memory plugins (#1614)
1 parent 7ebbff5 commit aa6593d

File tree

3 files changed

+83
-10
lines changed

3 files changed

+83
-10
lines changed

src/CompilerOptions.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as ts from "typescript";
22
import { JsxEmit } from "typescript";
33
import * as diagnosticFactories from "./transpilation/diagnostics";
4+
import { Plugin } from "./transpilation/plugins";
45

56
type OmitIndexSignature<T> = {
67
[K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
@@ -23,14 +24,19 @@ export interface LuaPluginImport {
2324
[option: string]: any;
2425
}
2526

27+
export interface InMemoryLuaPlugin {
28+
plugin: Plugin | ((options: Record<string, any>) => Plugin);
29+
[option: string]: any;
30+
}
31+
2632
export interface TypeScriptToLuaOptions {
2733
buildMode?: BuildMode;
2834
extension?: string;
2935
luaBundle?: string;
3036
luaBundleEntry?: string;
3137
luaTarget?: LuaTarget;
3238
luaLibImport?: LuaLibImportKind;
33-
luaPlugins?: LuaPluginImport[];
39+
luaPlugins?: Array<LuaPluginImport | InMemoryLuaPlugin>;
3440
noImplicitGlobalVariables?: boolean;
3541
noImplicitSelf?: boolean;
3642
noHeader?: boolean;

src/transpilation/plugins.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,23 @@ export function getPlugins(program: ts.Program): { diagnostics: ts.Diagnostic[];
7777
for (const [index, pluginOption] of (options.luaPlugins ?? []).entries()) {
7878
const optionName = `tstl.luaPlugins[${index}]`;
7979

80-
const { error: resolveError, result: factory } = resolvePlugin(
81-
"plugin",
82-
`${optionName}.name`,
83-
getConfigDirectory(options),
84-
pluginOption.name,
85-
pluginOption.import
86-
);
87-
88-
if (resolveError) diagnostics.push(resolveError);
80+
const factory = (() => {
81+
if ("plugin" in pluginOption) {
82+
return pluginOption.plugin;
83+
} else {
84+
const { error: resolveError, result: factory } = resolvePlugin(
85+
"plugin",
86+
`${optionName}.name`,
87+
getConfigDirectory(options),
88+
pluginOption.name,
89+
pluginOption.import
90+
);
91+
92+
if (resolveError) diagnostics.push(resolveError);
93+
return factory;
94+
}
95+
})();
96+
8997
if (factory === undefined) continue;
9098

9199
const plugin = typeof factory === "function" ? factory(pluginOption) : factory;

test/transpile/plugins/plugins.spec.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as path from "path";
22
import * as util from "../../util";
3+
import { Plugin } from "../../../src/transpilation/plugins";
34
import * as ts from "typescript";
45

56
test("printer", () => {
@@ -182,3 +183,61 @@ test("afterEmit plugin", () => {
182183
expect(diagnostic?.category).toBe(ts.DiagnosticCategory.Message);
183184
expect(diagnostic?.messageText).toContain("After emit");
184185
});
186+
187+
test("in memory plugin", () => {
188+
const { diagnostics } = util.testModule``
189+
.setOptions({
190+
luaPlugins: [
191+
{
192+
plugin: {
193+
afterEmit(program: ts.Program) {
194+
return [
195+
{
196+
category: ts.DiagnosticCategory.Message,
197+
messageText: "In memory plugin diagnostic message!",
198+
code: 1234,
199+
file: program.getSourceFiles()[0],
200+
start: undefined,
201+
length: undefined,
202+
} satisfies ts.Diagnostic,
203+
];
204+
},
205+
} satisfies Plugin,
206+
},
207+
],
208+
})
209+
.getLuaResult();
210+
211+
expect(diagnostics).toHaveLength(1);
212+
expect(diagnostics[0].code).toBe(1234);
213+
});
214+
215+
test("in memory plugin with factory", () => {
216+
const { diagnostics } = util.testModule``
217+
.setOptions({
218+
luaPlugins: [
219+
{
220+
code: 1234,
221+
plugin: options =>
222+
({
223+
afterEmit(program: ts.Program) {
224+
return [
225+
{
226+
category: ts.DiagnosticCategory.Message,
227+
messageText: "In memory plugin diagnostic message!",
228+
code: options.code,
229+
file: program.getSourceFiles()[0],
230+
start: undefined,
231+
length: undefined,
232+
} satisfies ts.Diagnostic,
233+
];
234+
},
235+
} satisfies Plugin),
236+
},
237+
],
238+
})
239+
.getLuaResult();
240+
241+
expect(diagnostics).toHaveLength(1);
242+
expect(diagnostics[0].code).toBe(1234);
243+
});

0 commit comments

Comments
 (0)