From 20d16a8de12e2b7c656224befb612dccd332a9b8 Mon Sep 17 00:00:00 2001 From: Sven Rogge Date: Tue, 31 Mar 2026 14:58:20 +0200 Subject: [PATCH] fix: add .js extensions to ESM imports and exports field to package.json Node.js strict ESM requires explicit .js extensions in relative imports. The bundler moduleResolution + verbatimModuleSyntax preserved extensionless paths in the JS output, breaking consumers using Node.js (e.g. Playwright). --- packages/client/package.json | 8 +++++++- packages/client/src/index.ts | 2 +- packages/common/package.json | 8 +++++++- packages/common/src/index.ts | 2 +- packages/core/package.json | 8 +++++++- packages/core/src/audio/audio-processor.ts | 2 +- packages/core/src/images/image-processor.ts | 2 +- packages/core/src/index.ts | 10 +++++----- packages/core/src/util/ffmpeg-processor.ts | 4 ++-- packages/core/src/videos/video-processor.ts | 2 +- packages/server/package.json | 8 +++++++- packages/server/src/audio/process-audio-handler.ts | 4 ++-- packages/server/src/images/process-image-handler.ts | 6 +++--- packages/server/src/index.ts | 2 +- packages/server/src/server.ts | 6 +++--- packages/server/src/util/request-parsing.ts | 2 +- packages/server/src/util/response.ts | 2 +- packages/server/src/videos/process-video-handler.ts | 4 ++-- packages/typebox/package.json | 2 +- 19 files changed, 54 insertions(+), 30 deletions(-) diff --git a/packages/client/package.json b/packages/client/package.json index 1f7dad9..c2728ba 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,10 +1,16 @@ { "name": "@m4k/client", - "version": "0.2.4", + "version": "0.2.5", "type": "module", "module": "./lib/index.js", "main": "./lib/index.js", "types": "./lib/index.d.ts", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "import": "./lib/index.js" + } + }, "license": "MIT", "description": "Client for m4k server", "keywords": [ diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index 5a3a49c..8093122 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -1,2 +1,2 @@ export { ProcessedFile } from "@m4k/common"; -export { processAudio, processImage, processVideo } from "./client"; +export { processAudio, processImage, processVideo } from "./client.js"; diff --git a/packages/common/package.json b/packages/common/package.json index 0367f37..7add20a 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,10 +1,16 @@ { "name": "@m4k/common", - "version": "0.2.4", + "version": "0.2.5", "type": "module", "main": "./lib/index.js", "types": "./lib/index.d.ts", "module": "./lib/index.js", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "import": "./lib/index.js" + } + }, "license": "MIT", "description": "Common types and utilities for m4k", "author": "sv2dev", diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index efe821b..8a92773 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -155,4 +155,4 @@ export class ProcessedFile { ) {} } -export { mimeTypes } from "./mime"; +export { mimeTypes } from "./mime.js"; diff --git a/packages/core/package.json b/packages/core/package.json index 26201f3..2980dc6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,10 +1,16 @@ { "name": "m4k", - "version": "0.3.0", + "version": "0.3.1", "type": "module", "main": "./lib/index.js", "types": "./lib/index.d.ts", "module": "./lib/index.js", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "import": "./lib/index.js" + } + }, "license": "MIT", "description": "Media toolkit for node, bun, and deno", "keywords": [ diff --git a/packages/core/src/audio/audio-processor.ts b/packages/core/src/audio/audio-processor.ts index e2c03cb..e424b25 100644 --- a/packages/core/src/audio/audio-processor.ts +++ b/packages/core/src/audio/audio-processor.ts @@ -1,7 +1,7 @@ import { type AudioOptions } from "@m4k/common"; import { mkdir } from "node:fs/promises"; import { createQueue } from "tasque"; -import { getExtension, processFfmpeg } from "../util/ffmpeg-processor"; +import { getExtension, processFfmpeg } from "../util/ffmpeg-processor.js"; /** * Process an audio file. diff --git a/packages/core/src/images/image-processor.ts b/packages/core/src/images/image-processor.ts index 2932a8d..8c974bb 100644 --- a/packages/core/src/images/image-processor.ts +++ b/packages/core/src/images/image-processor.ts @@ -2,7 +2,7 @@ import { type ImageOptions, ProcessedFile } from "@m4k/common"; import { createReadStream } from "node:fs"; import sharp from "sharp"; import { createQueue } from "tasque"; -import { exhaustAsyncIterableToWritable } from "../util/streams"; +import { exhaustAsyncIterableToWritable } from "../util/streams.js"; export type Format = Required["format"]; export type Fit = Required["resize"]>["fit"]; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e8b9c4b..40f8798 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,8 +7,8 @@ export { type QueuePosition, type VideoOptions } from "@m4k/common"; -export { audioQueue, processAudio } from "./audio/audio-processor"; -export { imageQueue, processImage } from "./images/image-processor"; -export { getExtension } from "./util/ffmpeg-processor"; -export { mimeTypes } from "./util/mime"; -export { processVideo, videoQueue } from "./videos/video-processor"; +export { audioQueue, processAudio } from "./audio/audio-processor.js"; +export { imageQueue, processImage } from "./images/image-processor.js"; +export { getExtension } from "./util/ffmpeg-processor.js"; +export { mimeTypes } from "./util/mime.js"; +export { processVideo, videoQueue } from "./videos/video-processor.js"; diff --git a/packages/core/src/util/ffmpeg-processor.ts b/packages/core/src/util/ffmpeg-processor.ts index 38e228a..aaad1ec 100644 --- a/packages/core/src/util/ffmpeg-processor.ts +++ b/packages/core/src/util/ffmpeg-processor.ts @@ -4,8 +4,8 @@ import { getRandomValues } from "node:crypto"; import { createWriteStream } from "node:fs"; import { rm } from "node:fs/promises"; import { type Tasque } from "tasque"; -import { mimeTypes } from "../util/mime"; -import { exhaustAsyncIterableToWritable } from "../util/streams"; +import { mimeTypes } from "../util/mime.js"; +import { exhaustAsyncIterableToWritable } from "../util/streams.js"; /** * Process a video. diff --git a/packages/core/src/videos/video-processor.ts b/packages/core/src/videos/video-processor.ts index 4432433..4bf2a54 100644 --- a/packages/core/src/videos/video-processor.ts +++ b/packages/core/src/videos/video-processor.ts @@ -1,7 +1,7 @@ import { type VideoOptions } from "@m4k/common"; import { mkdir } from "node:fs/promises"; import { createQueue } from "tasque"; -import { getExtension, processFfmpeg } from "../util/ffmpeg-processor"; +import { getExtension, processFfmpeg } from "../util/ffmpeg-processor.js"; /** * Process a video. * @param input - The input video. Can be a file path, a stream or a blob. diff --git a/packages/server/package.json b/packages/server/package.json index c037794..6f4af1a 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,10 +1,16 @@ { "name": "@m4k/server", - "version": "0.2.5", + "version": "0.2.6", "type": "module", "main": "./lib/index.js", "types": "./lib/index.d.ts", "module": "./lib/index.js", + "exports": { + ".": { + "types": "./lib/index.d.ts", + "import": "./lib/index.js" + } + }, "license": "MIT", "description": "Server for m4k", "keywords": [ diff --git a/packages/server/src/audio/process-audio-handler.ts b/packages/server/src/audio/process-audio-handler.ts index 62beed0..ee060f4 100644 --- a/packages/server/src/audio/process-audio-handler.ts +++ b/packages/server/src/audio/process-audio-handler.ts @@ -4,8 +4,8 @@ import { TypeCompiler } from "@sinclair/typebox/compiler"; import { ProcessedFile, processAudio } from "m4k"; import { rm } from "node:fs/promises"; import { basename } from "node:path"; -import { parseOpts } from "../util/request-parsing"; -import { error, queueAndStream } from "../util/response"; +import { parseOpts } from "../util/request-parsing.js"; +import { error, queueAndStream } from "../util/response.js"; const compiledOptionsSchema = TypeCompiler.Compile(audioOptionsSchema); diff --git a/packages/server/src/images/process-image-handler.ts b/packages/server/src/images/process-image-handler.ts index 69cfc19..f150316 100644 --- a/packages/server/src/images/process-image-handler.ts +++ b/packages/server/src/images/process-image-handler.ts @@ -4,9 +4,9 @@ import { Type as T } from "@sinclair/typebox"; import { TypeCompiler } from "@sinclair/typebox/compiler"; import { ProcessedFile, processImage } from "m4k"; import { rm } from "node:fs/promises"; -import { parseOpts } from "../util/request-parsing"; -import { error, queueAndStream } from "../util/response"; -import { numberQueryParamSchema, parse } from "../util/typebox"; +import { parseOpts } from "../util/request-parsing.js"; +import { error, queueAndStream } from "../util/response.js"; +import { numberQueryParamSchema, parse } from "../util/typebox.js"; const compiledOptionsSchema = TypeCompiler.Compile(imageOptionsSchema); diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 4720b93..250e146 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1,4 +1,4 @@ -import { serveOpts } from "./server"; +import { serveOpts } from "./server.js"; export default { ...serveOpts, diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index add8b86..42db8f1 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -1,8 +1,8 @@ import type { ServeOptions, Server } from "bun"; import { version } from "../package.json"; -import { processAudioHandler } from "./audio/process-audio-handler"; -import { processImageHandler } from "./images/process-image-handler"; -import { processVideoHandler } from "./videos/process-video-handler"; +import { processAudioHandler } from "./audio/process-audio-handler.js"; +import { processImageHandler } from "./images/process-image-handler.js"; +import { processVideoHandler } from "./videos/process-video-handler.js"; export const serveOpts: ServeOptions = { maxRequestBodySize: 2 ** 40, // 1TB diff --git a/packages/server/src/util/request-parsing.ts b/packages/server/src/util/request-parsing.ts index 91cc90e..bd19921 100644 --- a/packages/server/src/util/request-parsing.ts +++ b/packages/server/src/util/request-parsing.ts @@ -1,6 +1,6 @@ import type { StaticDecode, TSchema } from "@sinclair/typebox"; import type { TypeCheck } from "@sinclair/typebox/compiler"; -import { parse } from "./typebox"; +import { parse } from "./typebox.js"; export function parseOpts( request: Request, diff --git a/packages/server/src/util/response.ts b/packages/server/src/util/response.ts index 7d43ab3..d9d86ca 100644 --- a/packages/server/src/util/response.ts +++ b/packages/server/src/util/response.ts @@ -1,6 +1,6 @@ import { ProcessedFile } from "m4k"; import { basename } from "node:path"; -import { BOUNDARY, MultipartMixed } from "./multipart-mixed"; +import { BOUNDARY, MultipartMixed } from "./multipart-mixed.js"; export function error(status: number, message: string) { return new Response(message, { status }); diff --git a/packages/server/src/videos/process-video-handler.ts b/packages/server/src/videos/process-video-handler.ts index e98b03b..0c8f5c1 100644 --- a/packages/server/src/videos/process-video-handler.ts +++ b/packages/server/src/videos/process-video-handler.ts @@ -4,8 +4,8 @@ import { TypeCompiler } from "@sinclair/typebox/compiler"; import { ProcessedFile, processVideo } from "m4k"; import { rm } from "node:fs/promises"; import { basename } from "node:path"; -import { parseOpts } from "../util/request-parsing"; -import { error, queueAndStream } from "../util/response"; +import { parseOpts } from "../util/request-parsing.js"; +import { error, queueAndStream } from "../util/response.js"; const compiledOptionsSchema = TypeCompiler.Compile(videoOptionsSchema); diff --git a/packages/typebox/package.json b/packages/typebox/package.json index 59e82f5..50ff6d1 100644 --- a/packages/typebox/package.json +++ b/packages/typebox/package.json @@ -1,6 +1,6 @@ { "name": "@m4k/typebox", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "main": "./lib/index.js", "types": "./lib/index.d.ts",