diff --git a/deno.jsonc b/deno.jsonc index 2d1fed1..7db211e 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -8,7 +8,8 @@ "rules": { "exclude": [ "no-explicit-any", - "camelcase" + "camelcase", + "no-import-prefix" ] } }, diff --git a/deno.lock b/deno.lock index ecf57bf..8104a47 100644 --- a/deno.lock +++ b/deno.lock @@ -6,13 +6,14 @@ "jsr:@std/assert@1": "1.0.13", "jsr:@std/bytes@^1.0.4": "1.0.4", "jsr:@std/csv@*": "1.0.6", + "jsr:@std/csv@1.0.6": "1.0.6", "jsr:@std/fmt@0.221": "0.221.0", "jsr:@std/fmt@1": "1.0.8", "jsr:@std/fs@1": "1.0.19", "jsr:@std/internal@^1.0.1": "1.0.1", "jsr:@std/internal@^1.0.6": "1.0.9", "jsr:@std/internal@^1.0.9": "1.0.9", - "jsr:@std/path@1": "1.0.2", + "jsr:@std/path@1": "1.1.1", "jsr:@std/path@^1.0.2": "1.0.2", "jsr:@std/path@^1.1.1": "1.1.1", "jsr:@ts-morph/bootstrap@0.27": "0.27.0", diff --git a/lib/package_json.test.ts b/lib/package_json.test.ts index 490ecd0..e4c5be6 100644 --- a/lib/package_json.test.ts +++ b/lib/package_json.test.ts @@ -54,6 +54,7 @@ Deno.test("single entrypoint", () => { assertEquals(getPackageJson(props), { name: "package", version: "0.1.0", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", types: "./types/mod.d.ts", @@ -93,6 +94,7 @@ Deno.test("single entrypoint", () => { { name: "package", version: "0.1.0", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", types: "./types/mod.d.ts", @@ -128,6 +130,7 @@ Deno.test("single entrypoint", () => { { name: "package", version: "0.1.0", + type: "module", main: undefined, module: "./esm/mod.js", types: "./types/mod.d.ts", @@ -184,6 +187,7 @@ Deno.test("single entrypoint", () => { { name: "package", version: "0.1.0", + type: "module", main: undefined, module: "./esm/mod.js", types: undefined, @@ -216,6 +220,7 @@ Deno.test("single entrypoint", () => { { name: "package", version: "0.1.0", + type: "module", main: undefined, module: "./esm/mod.js", types: undefined, @@ -324,6 +329,7 @@ Deno.test("multiple entrypoints", () => { version: "0.1.0", main: "./script/mod.js", module: "./esm/mod.js", + type: "module", types: "./types/mod.d.ts", dependencies: { "@deno/shim-deno": "~0.1.0", @@ -401,6 +407,7 @@ Deno.test("binary entrypoints", () => { version: "0.1.0", main: "./script/mod.js", module: "./esm/mod.js", + type: "module", types: "./types/mod.d.ts", bin: { my_bin: "./esm/bin.js", @@ -501,6 +508,7 @@ Deno.test("peer dependencies", () => { scripts: { test: "node test_runner.js", }, + type: "module", dependencies: { dep: "^1.0.0", }, diff --git a/lib/package_json.ts b/lib/package_json.ts index ecdc31d..2156bf5 100644 --- a/lib/package_json.ts +++ b/lib/package_json.ts @@ -35,6 +35,14 @@ export function getPackageJson({ path: e.replace(/\.tsx?$/i, ".js"), types: e.replace(/\.tsx?$/i, ".d.ts"), })); + // include "type" field if we are including esm + const type = { + ...(includeEsModule + ? { + type: "module", + } + : {}), + }; const exports = finalEntryPoints.filter((e) => e.kind === "export"); const binaries = finalEntryPoints.filter((e) => e.kind === "bin"); const dependencies = { @@ -111,6 +119,7 @@ export function getPackageJson({ const final: Record = { ...mainExport, ...binaryExport, + ...type, ...packageJsonObj, scripts: {}, ...deleteEmptyKeys({ diff --git a/lib/test_runner/get_test_runner_code.test.ts b/lib/test_runner/get_test_runner_code.test.ts index 626ce5f..bd790b8 100644 --- a/lib/test_runner/get_test_runner_code.test.ts +++ b/lib/test_runner/get_test_runner_code.test.ts @@ -16,7 +16,10 @@ Deno.test("gets code when no shim used", () => { }); assertEquals( code, - `const pc = require("picocolors"); + `import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const __dirname = new URL(".", import.meta.url).pathname; +const pc = require("picocolors"); const process = require("process"); const filePaths = [ @@ -60,7 +63,10 @@ Deno.test("gets code when shim used", () => { }); assertEquals( code, - `const pc = require("picocolors"); + `import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const __dirname = new URL(".", import.meta.url).pathname; +const pc = require("picocolors"); const process = require("process"); const { pathToFileURL } = require("url"); const { testDefinitions } = require("test-shim-package/test-internals"); @@ -123,7 +129,10 @@ Deno.test("gets code when cjs is not used", () => { }); assertEquals( code, - `const pc = require("picocolors"); + `import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const __dirname = new URL(".", import.meta.url).pathname; +const pc = require("picocolors"); const process = require("process"); const filePaths = [ diff --git a/lib/test_runner/get_test_runner_code.ts b/lib/test_runner/get_test_runner_code.ts index dfb9c6c..8215d16 100644 --- a/lib/test_runner/get_test_runner_code.ts +++ b/lib/test_runner/get_test_runner_code.ts @@ -11,6 +11,16 @@ export function getTestRunnerCode(options: { }) { const usesDenoTest = options.denoTestShimPackageName != null; const writer = createWriter(); + + if (options.includeEsModule) { + // ensure compatibility with esm ("type": "module") + writer.writeLine(`import { createRequire } from 'module';`); + writer.writeLine(`const require = createRequire(import.meta.url);`); + writer.writeLine( + `const __dirname = new URL(".", import.meta.url).pathname;`, + ); + } + writer.writeLine(`const pc = require("picocolors");`) .writeLine(`const process = require("process");`); if (usesDenoTest) { diff --git a/tests/integration.test.ts b/tests/integration.test.ts index f6a8668..14c1cf9 100644 --- a/tests/integration.test.ts +++ b/tests/integration.test.ts @@ -63,6 +63,7 @@ Deno.test("should build test project - basic", async () => { assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", exports: { @@ -211,6 +212,7 @@ Deno.test("should build with all options off", async () => { assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", module: "./esm/mod.js", exports: { ".": { @@ -288,6 +290,7 @@ Deno.test("should build test project with declarations inline by default", async assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", exports: { @@ -369,6 +372,7 @@ Deno.test("should build bin project", async () => { assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", bin: { add: "./esm/mod.js", }, @@ -414,6 +418,7 @@ Deno.test("should build bin project with a shebang", async () => { assertEquals(output.packageJson, { name: "hello", version: "1.0.0", + type: "module", bin: { hello: "./esm/main.js", }, @@ -505,6 +510,7 @@ Deno.test("not error for TLA when not using CommonJS", async () => { assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", module: "./esm/mod.js", exports: { ".": { @@ -621,6 +627,7 @@ Deno.test("should build with package mappings", async () => { assertEquals(output.packageJson, { name: "mappings", version: "1.2.3", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", exports: { @@ -690,6 +697,7 @@ Deno.test("should build with peer dependencies in mappings", async () => { assertEquals(output.packageJson, { name: "mappings", version: "1.2.3", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", exports: { @@ -1162,6 +1170,7 @@ Deno.test("should build jsr project", async () => { assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", exports: { @@ -1232,6 +1241,7 @@ Deno.test("should build workspace project", async () => { assertEquals(output.packageJson, { name: "add", version: "1.0.0", + type: "module", main: "./script/mod.js", module: "./esm/mod.js", exports: { diff --git a/tests/jsr_project/mod.ts b/tests/jsr_project/mod.ts index 4fa865a..ab36001 100644 --- a/tests/jsr_project/mod.ts +++ b/tests/jsr_project/mod.ts @@ -1,6 +1,6 @@ // Copyright 2018-2024 the Deno authors. MIT license. -import { parse } from "jsr:@std/csv/parse"; +import { parse } from "jsr:@std/csv@1.0.6/parse"; import { assertEquals } from "jsr:@std/assert@0.221/assert-equals"; import * as fs from "node:fs";