Skip to content

Commit 17230b8

Browse files
committed
Add support for typescript handlers
1 parent 962ed28 commit 17230b8

File tree

11 files changed

+167
-9
lines changed

11 files changed

+167
-9
lines changed

src/UserFunction.js

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,16 @@ function _hasFolderPackageJsonTypeModule(folder) {
122122
return _hasFolderPackageJsonTypeModule(path.resolve(folder, '..'));
123123
}
124124

125-
function _hasPackageJsonTypeModule(file) {
126-
// File must have a .js extension
127-
const jsPath = file + '.js';
128-
return fs.existsSync(jsPath)
129-
? _hasFolderPackageJsonTypeModule(path.resolve(path.dirname(jsPath)))
130-
: false;
125+
function _runtimeSupportsTypeScript() {
126+
const minimumNodeVersion = 24;
127+
128+
const version = process.versions?.node;
129+
if (!version) {
130+
return false;
131+
}
132+
133+
const major = parseInt(version.split('.')[0], 10);
134+
return !Number.isNaN(major) && major >= minimumNodeVersion;
131135
}
132136

133137
/**
@@ -146,29 +150,37 @@ async function _tryRequire(appRoot, moduleRoot, module) {
146150

147151
const lambdaStylePath = path.resolve(appRoot, moduleRoot, module);
148152

153+
const supportsTs = _runtimeSupportsTypeScript();
154+
149155
// Extensionless files are loaded via require.
150156
const extensionless = _tryRequireFile(lambdaStylePath);
151157
if (extensionless) {
152158
return extensionless;
153159
}
154160

155161
// If package.json type != module, .js files are loaded via require.
156-
const pjHasModule = _hasPackageJsonTypeModule(lambdaStylePath);
162+
const pjHasModule = _hasFolderPackageJsonTypeModule(
163+
path.resolve(path.dirname(lambdaStylePath)),
164+
);
157165
if (!pjHasModule) {
158166
const loaded = _tryRequireFile(lambdaStylePath, '.js');
159167
if (loaded) {
160168
return loaded;
161169
}
162170
}
163171

164-
// If still not loaded, try .js, .mjs, and .cjs in that order.
172+
// If still not loaded, try .js, .mjs, .cjs, .ts, .mts, and .cts in that order.
165173
// Files ending with .js are loaded as ES modules when the nearest parent package.json
166174
// file contains a top-level field "type" with a value of "module".
167175
// https://nodejs.org/api/packages.html#packages_type
168176
const loaded =
169177
(pjHasModule && (await _tryAwaitImport(lambdaStylePath, '.js'))) ||
170178
(await _tryAwaitImport(lambdaStylePath, '.mjs')) ||
171-
_tryRequireFile(lambdaStylePath, '.cjs');
179+
_tryRequireFile(lambdaStylePath, '.cjs') ||
180+
(supportsTs && !pjHasModule && _tryRequireFile(lambdaStylePath, '.ts')) ||
181+
(supportsTs && pjHasModule && (await _tryAwaitImport(lambdaStylePath, '.ts'))) ||
182+
(supportsTs && (await _tryAwaitImport(lambdaStylePath, '.mts'))) ||
183+
(supportsTs && _tryRequireFile(lambdaStylePath, '.cts'));
172184
if (loaded) {
173185
return loaded;
174186
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.handler = async (): Promise<string> => {
2+
return 'basic-cts';
3+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export async function handler(): Promise<string> {
2+
return 'basic-mts';
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.handler = async function handler(): Promise<string> {
2+
return 'basic-ts';
3+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export async function handler(): Promise<string> {
2+
return 'basic-esm';
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.handler = async function handler(): Promise<string> {
2+
return 'precedence-cts';
3+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export async function handler(): Promise<string> {
2+
return 'precedence-mts';
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export async function handler(): Promise<string> {
2+
return 'precedence-mts';
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exports.handler = async function handler(): Promise<string> {
2+
return 'precedence-ts';
3+
};

0 commit comments

Comments
 (0)