From f0ee42f50760922ceb2ba72fa4f6daf75d49f0fc Mon Sep 17 00:00:00 2001 From: Matthew Fedderly <24275386+mfedderly@users.noreply.github.com> Date: Tue, 19 May 2026 13:28:01 -0400 Subject: [PATCH 1/2] Add consumer-style testing for Turf We add a handful of packages to test using Turf in ways that we might expect a consumer to have. Specifically we test from CommonJS and ESM module types, and we test Node native consuming as well as TypeScript targeted towards NodeJS and bundler consumers. This should hopefully give us more assurance that the package.json entries are actually working as expected and we aren't accidentally breaking compatibility. --- pnpm-lock.yaml | 52 +++++++++++++++++++++++++++ pnpm-workspace.yaml | 1 + test/README.md | 7 ++++ test/node-cjs/index.cjs | 17 +++++++++ test/node-cjs/package.json | 14 ++++++++ test/node-esm/package.json | 15 ++++++++ test/ts-bundler-cjs/package.json | 18 ++++++++++ test/ts-bundler-cjs/ts-bundler-cjs.ts | 16 +++++++++ test/ts-bundler-cjs/tsconfig.json | 12 +++++++ test/ts-bundler-esm/package.json | 19 ++++++++++ test/ts-bundler-esm/ts-bundler-esm.ts | 15 ++++++++ test/ts-bundler-esm/tsconfig.json | 12 +++++++ test/ts-node-cjs/package.json | 18 ++++++++++ test/ts-node-cjs/ts-node-cjs.ts | 16 +++++++++ test/ts-node-cjs/tsconfig.json | 11 ++++++ test/ts-node-esm/package.json | 19 ++++++++++ test/ts-node-esm/ts-node-esm.ts | 15 ++++++++ test/ts-node-esm/tsconfig.json | 11 ++++++ 18 files changed, 288 insertions(+) create mode 100644 test/README.md create mode 100644 test/node-cjs/index.cjs create mode 100644 test/node-cjs/package.json create mode 100644 test/node-esm/package.json create mode 100644 test/ts-bundler-cjs/package.json create mode 100644 test/ts-bundler-cjs/ts-bundler-cjs.ts create mode 100644 test/ts-bundler-cjs/tsconfig.json create mode 100644 test/ts-bundler-esm/package.json create mode 100644 test/ts-bundler-esm/ts-bundler-esm.ts create mode 100644 test/ts-bundler-esm/tsconfig.json create mode 100644 test/ts-node-cjs/package.json create mode 100644 test/ts-node-cjs/ts-node-cjs.ts create mode 100644 test/ts-node-cjs/tsconfig.json create mode 100644 test/ts-node-esm/package.json create mode 100644 test/ts-node-esm/ts-node-esm.ts create mode 100644 test/ts-node-esm/tsconfig.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 948f69f42..aea9e18e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6283,6 +6283,58 @@ importers: specifier: ^6.0.0 version: 6.0.0 + test/node-cjs: + dependencies: + '@turf/turf': + specifier: workspace:* + version: link:../../packages/turf + + test/node-esm: + dependencies: + '@turf/turf': + specifier: workspace:* + version: link:../../packages/turf + + test/ts-bundler-cjs: + dependencies: + '@turf/turf': + specifier: workspace:* + version: link:../../packages/turf + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.8.3 + + test/ts-bundler-esm: + dependencies: + '@turf/turf': + specifier: workspace:* + version: link:../../packages/turf + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.8.3 + + test/ts-node-cjs: + dependencies: + '@turf/turf': + specifier: workspace:* + version: link:../../packages/turf + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.8.3 + + test/ts-node-esm: + dependencies: + '@turf/turf': + specifier: workspace:* + version: link:../../packages/turf + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.8.3 + packages: '@ampproject/remapping@2.3.0': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8226f7e5a..1d9616750 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - "packages/*" + - "test/*" catalog: "@types/benchmark": ^2.1.5 diff --git a/test/README.md b/test/README.md new file mode 100644 index 000000000..0aed57d2c --- /dev/null +++ b/test/README.md @@ -0,0 +1,7 @@ +# Consumer test harnesses + +Each directory is an example configuration that we may expect a Turf consumer to depend on. It allows us to test various configurations in CI and avoid shipping breaking changes unintentionally across a variety of different user groups. + +Note that the CI runs include a matrix of Node versions, so each of these scenarios is tested across those as well. + +The TypeScript settings were inspired by the [Choosing Compiler Options](https://www.typescriptlang.org/docs/handbook/modules/guides/choosing-compiler-options.html) documentation on the recommended configurations in May 2026. diff --git a/test/node-cjs/index.cjs b/test/node-cjs/index.cjs new file mode 100644 index 000000000..01fc2dc7b --- /dev/null +++ b/test/node-cjs/index.cjs @@ -0,0 +1,17 @@ +/* eslint-disable @typescript-eslint/no-require-imports */ + +const turf = require("@turf/turf"); + +const polygon = turf.polygon([ + [ + [125, -15], + [113, -22], + [154, -27], + [144, -15], + [125, -15], + ], +]); + +const area = turf.area(polygon); + +console.log(area); diff --git a/test/node-cjs/package.json b/test/node-cjs/package.json new file mode 100644 index 000000000..1e57e6c3e --- /dev/null +++ b/test/node-cjs/package.json @@ -0,0 +1,14 @@ +{ + "name": "node-cjs", + "version": "1.0.0", + "private": true, + "license": "MIT", + "funding": "https://opencollective.com/turf", + "scripts": { + "test": "pnpm run /test:.*/", + "test:node": "node index.cjs" + }, + "dependencies": { + "@turf/turf": "workspace:*" + } +} diff --git a/test/node-esm/package.json b/test/node-esm/package.json new file mode 100644 index 000000000..66c944c54 --- /dev/null +++ b/test/node-esm/package.json @@ -0,0 +1,15 @@ +{ + "name": "node-esm", + "version": "1.0.0", + "private": true, + "license": "MIT", + "funding": "https://opencollective.com/turf", + "keywords": [], + "scripts": { + "test": "pnpm run /test:.*/", + "test:node": "node index.mjs" + }, + "dependencies": { + "@turf/turf": "workspace:*" + } +} diff --git a/test/ts-bundler-cjs/package.json b/test/ts-bundler-cjs/package.json new file mode 100644 index 000000000..06ad08f9d --- /dev/null +++ b/test/ts-bundler-cjs/package.json @@ -0,0 +1,18 @@ +{ + "name": "ts-bundler-cjs", + "version": "1.0.0", + "private": true, + "license": "MIT", + "funding": "https://opencollective.com/turf", + "keywords": [], + "scripts": { + "test": "pnpm run /test:.*/", + "test:ts": "tsc" + }, + "devDependencies": { + "typescript": "catalog:" + }, + "dependencies": { + "@turf/turf": "workspace:*" + } +} diff --git a/test/ts-bundler-cjs/ts-bundler-cjs.ts b/test/ts-bundler-cjs/ts-bundler-cjs.ts new file mode 100644 index 000000000..365c1ccd7 --- /dev/null +++ b/test/ts-bundler-cjs/ts-bundler-cjs.ts @@ -0,0 +1,16 @@ +/* eslint-disable-next-line @typescript-eslint/no-require-imports */ +const turf = require("@turf/turf"); + +const polygon = turf.polygon([ + [ + [125, -15], + [113, -22], + [154, -27], + [144, -15], + [125, -15], + ], +]); + +const area = turf.area(polygon); + +console.log(area); diff --git a/test/ts-bundler-cjs/tsconfig.json b/test/ts-bundler-cjs/tsconfig.json new file mode 100644 index 000000000..6968a3a4e --- /dev/null +++ b/test/ts-bundler-cjs/tsconfig.json @@ -0,0 +1,12 @@ +{ + "include": ["ts-bundler-cjs.ts"], + "compilerOptions": { + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "esModuleInterop": false, + "verbatimModuleSyntax": true, + "strict": true, + "skipLibCheck": false + } +} diff --git a/test/ts-bundler-esm/package.json b/test/ts-bundler-esm/package.json new file mode 100644 index 000000000..cc08a52a4 --- /dev/null +++ b/test/ts-bundler-esm/package.json @@ -0,0 +1,19 @@ +{ + "name": "ts-bundler-esm", + "version": "1.0.0", + "private": true, + "license": "MIT", + "funding": "https://opencollective.com/turf", + "keywords": [], + "type": "module", + "scripts": { + "test": "pnpm run /test:.*/", + "test:ts": "tsc" + }, + "devDependencies": { + "typescript": "catalog:" + }, + "dependencies": { + "@turf/turf": "workspace:*" + } +} diff --git a/test/ts-bundler-esm/ts-bundler-esm.ts b/test/ts-bundler-esm/ts-bundler-esm.ts new file mode 100644 index 000000000..deb291be6 --- /dev/null +++ b/test/ts-bundler-esm/ts-bundler-esm.ts @@ -0,0 +1,15 @@ +import * as turf from "@turf/turf"; + +const polygon = turf.polygon([ + [ + [125, -15], + [113, -22], + [154, -27], + [144, -15], + [125, -15], + ], +]); + +const area = turf.area(polygon); + +console.log(area); diff --git a/test/ts-bundler-esm/tsconfig.json b/test/ts-bundler-esm/tsconfig.json new file mode 100644 index 000000000..1d643be7e --- /dev/null +++ b/test/ts-bundler-esm/tsconfig.json @@ -0,0 +1,12 @@ +{ + "include": ["ts-bundler-esm.ts"], + "compilerOptions": { + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "esModuleInterop": false, + "verbatimModuleSyntax": true, + "strict": true, + "skipLibCheck": false + } +} diff --git a/test/ts-node-cjs/package.json b/test/ts-node-cjs/package.json new file mode 100644 index 000000000..64e677a29 --- /dev/null +++ b/test/ts-node-cjs/package.json @@ -0,0 +1,18 @@ +{ + "name": "ts-node-cjs", + "version": "1.0.0", + "private": true, + "license": "MIT", + "funding": "https://opencollective.com/turf", + "keywords": [], + "scripts": { + "test": "pnpm run /test:.*/", + "test:ts": "tsc" + }, + "devDependencies": { + "typescript": "catalog:" + }, + "dependencies": { + "@turf/turf": "workspace:*" + } +} diff --git a/test/ts-node-cjs/ts-node-cjs.ts b/test/ts-node-cjs/ts-node-cjs.ts new file mode 100644 index 000000000..365c1ccd7 --- /dev/null +++ b/test/ts-node-cjs/ts-node-cjs.ts @@ -0,0 +1,16 @@ +/* eslint-disable-next-line @typescript-eslint/no-require-imports */ +const turf = require("@turf/turf"); + +const polygon = turf.polygon([ + [ + [125, -15], + [113, -22], + [154, -27], + [144, -15], + [125, -15], + ], +]); + +const area = turf.area(polygon); + +console.log(area); diff --git a/test/ts-node-cjs/tsconfig.json b/test/ts-node-cjs/tsconfig.json new file mode 100644 index 000000000..c5d211dc7 --- /dev/null +++ b/test/ts-node-cjs/tsconfig.json @@ -0,0 +1,11 @@ +{ + "include": ["ts-node-cjs.ts"], + "compilerOptions": { + "noEmit": true, + "module": "nodenext", + "moduleResolution": "nodenext", + "verbatimModuleSyntax": true, + "strict": true, + "skipLibCheck": false + } +} diff --git a/test/ts-node-esm/package.json b/test/ts-node-esm/package.json new file mode 100644 index 000000000..361252867 --- /dev/null +++ b/test/ts-node-esm/package.json @@ -0,0 +1,19 @@ +{ + "name": "ts-node-esm", + "version": "1.0.0", + "private": true, + "license": "MIT", + "funding": "https://opencollective.com/turf", + "keywords": [], + "type": "module", + "scripts": { + "test": "pnpm run /test:.*/", + "test:ts": "tsc" + }, + "devDependencies": { + "typescript": "catalog:" + }, + "dependencies": { + "@turf/turf": "workspace:*" + } +} diff --git a/test/ts-node-esm/ts-node-esm.ts b/test/ts-node-esm/ts-node-esm.ts new file mode 100644 index 000000000..deb291be6 --- /dev/null +++ b/test/ts-node-esm/ts-node-esm.ts @@ -0,0 +1,15 @@ +import * as turf from "@turf/turf"; + +const polygon = turf.polygon([ + [ + [125, -15], + [113, -22], + [154, -27], + [144, -15], + [125, -15], + ], +]); + +const area = turf.area(polygon); + +console.log(area); diff --git a/test/ts-node-esm/tsconfig.json b/test/ts-node-esm/tsconfig.json new file mode 100644 index 000000000..1e10f1e0f --- /dev/null +++ b/test/ts-node-esm/tsconfig.json @@ -0,0 +1,11 @@ +{ + "include": ["ts-node-esm.ts"], + "compilerOptions": { + "noEmit": true, + "module": "nodenext", + "moduleResolution": "nodenext", + "verbatimModuleSyntax": true, + "strict": true, + "skipLibCheck": false + } +} From 9bfc6fdb4913cae7b23bef0dbc0049b0ca0ede8e Mon Sep 17 00:00:00 2001 From: Matthew Fedderly <24275386+mfedderly@users.noreply.github.com> Date: Thu, 21 May 2026 15:23:37 -0400 Subject: [PATCH 2/2] Add node-esm test's index.mjs, remove .gitignore rules that blocked it in the first place --- test/node-esm/index.mjs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 test/node-esm/index.mjs diff --git a/test/node-esm/index.mjs b/test/node-esm/index.mjs new file mode 100644 index 000000000..deb291be6 --- /dev/null +++ b/test/node-esm/index.mjs @@ -0,0 +1,15 @@ +import * as turf from "@turf/turf"; + +const polygon = turf.polygon([ + [ + [125, -15], + [113, -22], + [154, -27], + [144, -15], + [125, -15], + ], +]); + +const area = turf.area(polygon); + +console.log(area);