From 5e27180d83f60615223a9eff6ea4e09eff9450d0 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Thu, 8 May 2025 23:04:16 +0200 Subject: [PATCH 1/6] setup(esm): put it as first --- README.md | 16 +- package.json | 17 +- src/mod.cjs | 4 + index.d.ts => src/mod.d.ts | 0 index.js => src/mod.js | 4 +- test/index.test-d.ts | 2 +- test/test.cjs | 415 +++++++++++++++++++++++++++++++++++++ test/test.js | 10 +- wrapper.mjs | 4 - 9 files changed, 444 insertions(+), 28 deletions(-) create mode 100644 src/mod.cjs rename index.d.ts => src/mod.d.ts (100%) rename index.js => src/mod.js (99%) create mode 100644 test/test.cjs delete mode 100644 wrapper.mjs diff --git a/README.md b/README.md index 389c9b5..931aa52 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # vec3 + [![NPM version](https://img.shields.io/npm/v/vec3.svg)](http://npmjs.com/package/vec3) [![Build Status](https://github.com/PrismarineJS/node-vec3/workflows/CI/badge.svg)](https://github.com/PrismarineJS/node-vec3/actions?query=workflow%3A%22CI%22) @@ -7,20 +8,21 @@ ## Usage ```js -var v = require('vec3'); +import { v, Vec3 } from '../src/mod.js' -var v1 = v(1, 2, 3); +const v1 = v(1, 2, 3); console.log(v1); // prints "(1, 2, 3)" -var v2 = v1.offset(0, 0, 1); +const v2 = v1.offset(0, 0, 1); console.log(v2); // prints "(1, 2, 4)" + +const v3 = new Vec3(0, 1, 2); ``` -Or: +Or _if you prefer_ CommonJS: ```js -var Vec3 = require('vec3').Vec3; - -var v1 = new Vec3(1, 2, 3); +const v = require('../src/mod.cjs') +const Vec3 = v.Vec3 // etc... ``` diff --git a/package.json b/package.json index 2a9dfde..a4616e9 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,9 @@ "name": "vec3", "version": "0.1.10", "description": "3d vector math with good unit tests", - "main": "index.js", - "types": "index.d.ts", + "main": "./src/mod.js", + "types": "./src/mod.d.ts", + "type": "module", "scripts": { "test": "npm run test-js && npm run test-types", "test-js": "mocha --reporter spec", @@ -15,19 +16,17 @@ "keywords": [ "point" ], - "exports": { - "types": "./index.d.ts", - "require": "./index.js", - "import": "./wrapper.mjs" - }, "author": "Andrew Kelley", "license": "BSD", "devDependencies": { "mocha": "^11.0.1", "standard": "^17.0.0", - "tsd": "^0.25.0" + "tsd": "^0.25.0", + "vec3": "file:../src/mod.js" + }, + "exports": { + "require": "./src/mod.cjs" }, - "dependencies": {}, "tsd": { "directory": "test" }, diff --git a/src/mod.cjs b/src/mod.cjs new file mode 100644 index 0000000..0c9f75f --- /dev/null +++ b/src/mod.cjs @@ -0,0 +1,4 @@ +const pkg = require('./mod.js') + +module.exports = pkg.default +module.exports.Vec3 = pkg.Vec3 diff --git a/index.d.ts b/src/mod.d.ts similarity index 100% rename from index.d.ts rename to src/mod.d.ts diff --git a/index.js b/src/mod.js similarity index 99% rename from index.js rename to src/mod.js index 9a0f76b..422cbe9 100644 --- a/index.js +++ b/src/mod.js @@ -265,5 +265,5 @@ function euclideanMod (numerator, denominator) { return result < 0 ? result + denominator : result } -module.exports = v -v.Vec3 = Vec3 +export { Vec3, v } +export default v diff --git a/test/index.test-d.ts b/test/index.test-d.ts index 896d491..c9f83aa 100644 --- a/test/index.test-d.ts +++ b/test/index.test-d.ts @@ -1,5 +1,5 @@ import { expectType } from "tsd"; -import vec3, { Vec3 } from ".."; +import vec3, { Vec3 } from "../src/mod.js"; const vec = vec3([1, 2, 3]); expectType(vec); diff --git a/test/test.cjs b/test/test.cjs new file mode 100644 index 0000000..4457e2b --- /dev/null +++ b/test/test.cjs @@ -0,0 +1,415 @@ +/* eslint-env mocha */ + +const assert = require('node:assert') +const v = require('../src/mod.cjs') +const Vec3 = v.Vec3 + +describe('v() cjs', function () { + it('no args', function () { + const v1 = v() + assert.strictEqual(v1.x, 0) + assert.strictEqual(v1.y, 0) + assert.strictEqual(v1.z, 0) + }) + it('x, y, z', function () { + const v1 = v(-1, 5, 10.10) + assert.strictEqual(v1.x, -1) + assert.strictEqual(v1.y, 5) + assert.strictEqual(v1.z, 10.10) + }) + it('array', function () { + const v1 = v([4, 5, 6]) + assert.strictEqual(v1.x, 4) + assert.strictEqual(v1.y, 5) + assert.strictEqual(v1.z, 6) + }) + it('object', function () { + const v1 = v({ x: 9, y: 8, z: 7 }) + assert.strictEqual(v1.x, 9) + assert.strictEqual(v1.y, 8) + assert.strictEqual(v1.z, 7) + }) + it('string coords', function () { + const v1 = v('1', '1.5', '-30.2') + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, 1.5) + assert.strictEqual(v1.z, -30.2) + }) + it('deserialize', function () { + const v1 = v(v(1, -3.5, 0).toString()) + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, -3.5) + assert.strictEqual(v1.z, 0) + const v2 = v(v(-111, 222, 9876543210.12345).toString()) + assert.strictEqual(v2.x, -111) + assert.strictEqual(v2.y, 222) + assert.strictEqual(v2.z, 9876543210.12345) + }) + it('invalid deserialize', function () { + assert.throws(function () { + return v('lol hax') + }, /cannot parse/) + }) +}) + +describe('vec3 cjs', function () { + it('isZero', function () { + const v1 = new Vec3(0, 1, 2) + const v2 = new Vec3(0, 0, 0) + assert.ok(!v1.isZero()) + assert.ok(v2.isZero()) + }) + it('at', function () { + const v1 = new Vec3(0, 1, 2) + assert.strictEqual(v1.at(0), 0) + assert.strictEqual(v1.at(1), 1) + assert.strictEqual(v1.at(2), 2) + }) + it('xz', function () { + const v1 = new Vec3(0, 1, 2) + const a = v1.xz() + assert.strictEqual(a[0], 0) + assert.strictEqual(a[1], 2) + }) + it('xy', function () { + const v1 = new Vec3(0, 1, 2) + const a = v1.xy() + assert.strictEqual(a[0], 0) + assert.strictEqual(a[1], 1) + }) + it('yz', function () { + const v1 = new Vec3(0, 1, 2) + const a = v1.yz() + assert.strictEqual(a[0], 1) + assert.strictEqual(a[1], 2) + }) + it('xzy', function () { + const v1 = new Vec3(0, 1, 2) + const v2 = v1.xzy() + assert.strictEqual(v2.x, 0) + assert.strictEqual(v2.y, 2) + assert.strictEqual(v2.z, 1) + }) + it('rounded', function () { + const v1 = new Vec3(1.1, -1.5, 1.9) + const v2 = v1.rounded() + v1.x = 10 + assert.strictEqual(v2.x, 1) + assert.strictEqual(v2.y, -1) + assert.strictEqual(v2.z, 2) + }) + it('round', function () { + const v1 = new Vec3(1.1, -1.5, 1.9) + const v2 = v1.round() + assert.strictEqual(v2, v1) + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, -1) + assert.strictEqual(v1.z, 2) + }) + it('floored', function () { + const v1 = new Vec3(1.1, -1.5, 1.9) + const v2 = v1.floored() + v1.x = 10 + assert.strictEqual(v2.x, 1) + assert.strictEqual(v2.y, -2) + assert.strictEqual(v2.z, 1) + }) + it('floor', function () { + const v1 = new Vec3(1.1, -1.5, 1.9) + const v2 = v1.floor() + assert.strictEqual(v2, v1) + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, -2) + assert.strictEqual(v1.z, 1) + }) + it('offset', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = v1.offset(10, -10, 20) + v1.x = -100 + assert.strictEqual(v2.x, 11) + assert.strictEqual(v2.y, -8) + assert.strictEqual(v2.z, 23) + }) + it('translate', function () { + const v1 = new Vec3(1, 2, 3) + v1.translate(10, -10, 20) + assert.strictEqual(v1.x, 11) + assert.strictEqual(v1.y, -8) + assert.strictEqual(v1.z, 23) + }) + it('plus', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = new Vec3(-1, 0, 1) + const v3 = v1.plus(v2) + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, 2) + assert.strictEqual(v1.z, 3) + assert.strictEqual(v2.x, -1) + assert.strictEqual(v2.y, 0) + assert.strictEqual(v2.z, 1) + assert.strictEqual(v3.x, 0) + assert.strictEqual(v3.y, 2) + assert.strictEqual(v3.z, 4) + }) + it('minus', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = new Vec3(-1, 0, 1) + const v3 = v1.minus(v2) + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, 2) + assert.strictEqual(v1.z, 3) + assert.strictEqual(v2.x, -1) + assert.strictEqual(v2.y, 0) + assert.strictEqual(v2.z, 1) + assert.strictEqual(v3.x, 2) + assert.strictEqual(v3.y, 2) + assert.strictEqual(v3.z, 2) + }) + it('scaled', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = v1.scaled(2) + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, 2) + assert.strictEqual(v1.z, 3) + assert.strictEqual(v2.x, 2) + assert.strictEqual(v2.y, 4) + assert.strictEqual(v2.z, 6) + }) + it('abs', function () { + const v1 = new Vec3(1.1, -1.5, 1.9) + const v2 = v1.abs() + v1.x = 10 + assert.strictEqual(v2.x, 1.1) + assert.strictEqual(v2.y, 1.5) + assert.strictEqual(v2.z, 1.9) + }) + it('distanceTo', function () { + const v1 = new Vec3(1, 1, 1) + const v2 = new Vec3(2, 2, 2) + const dist1 = v1.distanceTo(v2) + const dist2 = v2.distanceTo(v1) + const expected = 1.7320508075688772 + assert.strictEqual(dist1, dist2) + assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) + }) + it('distanceSquared', function () { + const v1 = new Vec3(1, 1, 1) + const v2 = new Vec3(2, 2, 2) + const dist1 = v1.distanceSquared(v2) + const dist2 = v2.distanceSquared(v1) + const expected = 3 + assert.strictEqual(dist1, dist2) + assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) + }) + it('equals', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = v1.scaled(0.23424) + const v3 = v1.scaled(0.23424) + assert.ok(v2.equals(v3)) + const v4 = new Vec3(0.1, 0, 0) + const v5 = new Vec3(0.2, 0, 0) + const v6 = new Vec3(0.3, 0, 0) + assert.ok(v4.plus(v5).equals(v6, Number.EPSILON)) + }) + it('toString', function () { + const v1 = new Vec3(1, -1, 3.14) + assert.strictEqual(v1.toString(), '(1, -1, 3.14)') + }) + it('clone', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = v1.clone() + v2.x = 10 + assert.strictEqual(v1.x, 1) + assert.strictEqual(v1.y, 2) + assert.strictEqual(v1.z, 3) + assert.strictEqual(v2.x, 10) + assert.strictEqual(v2.y, 2) + assert.strictEqual(v2.z, 3) + }) + it('add', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = new Vec3(-1, -2, -3) + const v3 = v1.add(v2) + assert.strictEqual(v3, v1) + assert.strictEqual(v1.x, 0) + assert.strictEqual(v1.y, 0) + assert.strictEqual(v1.z, 0) + }) + it('subtract', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = new Vec3(-1, -2, -3) + const v3 = v1.subtract(v2) + assert.strictEqual(v3, v1) + assert.strictEqual(v1.x, 2) + assert.strictEqual(v1.y, 4) + assert.strictEqual(v1.z, 6) + }) + it('multiply', function () { + const v1 = new Vec3(1, 2, 3) + const v2 = new Vec3(-1, -2, -5) + const v3 = v1.multiply(v2) + assert.strictEqual(v3, v1) + assert.strictEqual(v1.x, -1) + assert.strictEqual(v1.y, -4) + assert.strictEqual(v1.z, -15) + }) + it('divide', function () { + const v1 = new Vec3(10, 20, 30) + const v2 = new Vec3(2, 5, 3) + const v3 = v1.divide(v2) + assert.strictEqual(v3, v1) + assert.strictEqual(v1.x, 5) + assert.strictEqual(v1.y, 4) + assert.strictEqual(v1.z, 10) + }) + it('set', function () { + const v1 = new Vec3(12, 32, 46) + const v2 = v1.set(0, 10, 100) + assert.strictEqual(v1, v2) + assert.strictEqual(v1.x, 0) + assert.strictEqual(v1.y, 10) + assert.strictEqual(v1.z, 100) + }) + it('modulus', function () { + const v1 = new Vec3(12, 32, -1) + const v2 = new Vec3(14, 32, 16) + const v3 = v1.modulus(v2) + assert.strictEqual(v1.x, 12) + assert.strictEqual(v1.y, 32) + assert.strictEqual(v1.z, -1) + assert.strictEqual(v2.x, 14) + assert.strictEqual(v2.y, 32) + assert.strictEqual(v2.z, 16) + assert.strictEqual(v3.x, 12) + assert.strictEqual(v3.y, 0) + assert.strictEqual(v3.z, 15) + }) + it('volume', function () { + const v1 = new Vec3(3, 4, 5) + assert.strictEqual(v1.volume(), 60) + }) + it('min', function () { + const v1 = new Vec3(-1, 0, 1) + const v2 = new Vec3(10, -10, 1.1) + const v3 = v1.min(v2) + assert.strictEqual(v3.x, -1) + assert.strictEqual(v3.y, -10) + assert.strictEqual(v3.z, 1) + }) + it('max', function () { + const v1 = new Vec3(-1, 0, 1) + const v2 = new Vec3(10, -10, 1.1) + const v3 = v1.max(v2) + assert.strictEqual(v3.x, 10) + assert.strictEqual(v3.y, 0) + assert.strictEqual(v3.z, 1.1) + }) + it('update', function () { + const v1 = new Vec3(-1, 0, 1) + const v2 = new Vec3(10, -10, 1.1) + const v3 = v1.update(v2) + assert.strictEqual(v3, v1) + assert.strictEqual(v1.x, 10) + assert.strictEqual(v1.y, -10) + assert.strictEqual(v1.z, 1.1) + assert.strictEqual(v2.x, 10) + assert.strictEqual(v2.y, -10) + assert.strictEqual(v2.z, 1.1) + }) + it('norm', function () { + const v1 = new Vec3(-10, 0, 10) + assert.strictEqual(Math.round(v1.norm() * 100000), Math.round(14.1421356237 * 100000)) + }) + it('dot', function () { + const v1 = new Vec3(-1, -1, -1) + const v2 = new Vec3(1, 1, 1) + assert.strictEqual(v1.dot(v2), -3) + }) + it('cross', function () { + const v1 = new Vec3(1, 0, 0) + const v2 = new Vec3(0, 1, 0) + const v3 = new Vec3(0, 0, 1) + assert.ok(v1.cross(v2).equals(v3)) + }) + it('unit', function () { + const v1 = new Vec3(10, -10, 1.1) + const v2 = v1.unit() + assert.strictEqual(Math.round(v2.x * 100000), Math.round(0.70497744020 * 100000)) + assert.strictEqual(Math.round(v2.y * 100000), Math.round(-0.7049774402 * 100000)) + assert.strictEqual(Math.round(v2.z * 100000), Math.round(0.07754751842 * 100000)) + const v3 = new Vec3(0, 0, 0) + const v4 = v3.unit() + assert.strictEqual(v4.x, 0) + assert.strictEqual(v4.y, 0) + assert.strictEqual(v4.z, 0) + }) + it('normalize', function () { + const v1 = new Vec3(10, -10, 1.1) + const v2 = v1.normalize() + assert.strictEqual(Math.round(v2.x * 100000), Math.round(0.70497744020 * 100000)) + assert.strictEqual(Math.round(v2.y * 100000), Math.round(-0.7049774402 * 100000)) + assert.strictEqual(Math.round(v2.z * 100000), Math.round(0.07754751842 * 100000)) + const v3 = new Vec3(0, 0, 0) + const v4 = v3.normalize() + assert.strictEqual(v4.x, 0) + assert.strictEqual(v4.y, 0) + assert.strictEqual(v4.z, 0) + }) + it('scale', function () { + const v1 = new Vec3(10, -10, 1.1) + const v2 = v1.scale(1.5) + assert.strictEqual(v2.x, 15) + assert.strictEqual(v2.y, -15) + assert.strictEqual(Math.round(v2.z * 100000), Math.round(1.65 * 100000)) + }) + it('xyDistanceTo', function () { + const v1 = new Vec3(1, 1, 1) + const v2 = new Vec3(2, 2, 2) + const dist1 = v1.xyDistanceTo(v2) + const dist2 = v2.xyDistanceTo(v1) + const expected = 1.414213562 + assert.strictEqual(dist1, dist2) + assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) + }) + it('xzDistanceTo', function () { + const v1 = new Vec3(1, 1, 1) + const v2 = new Vec3(2, 2, 2) + const dist1 = v1.xzDistanceTo(v2) + const dist2 = v2.xzDistanceTo(v1) + const expected = 1.41421356237 + assert.strictEqual(dist1, dist2) + assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) + }) + it('yzDistanceTo', function () { + const v1 = new Vec3(1, 1, 1) + const v2 = new Vec3(2, 2, 2) + const dist1 = v1.yzDistanceTo(v2) + const dist2 = v2.yzDistanceTo(v1) + const expected = 1.41421356237 + assert.strictEqual(dist1, dist2) + assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) + }) + it('innerProduct', function () { + const v1 = new Vec3(-1, 0, 1) + const v2 = new Vec3(0, 1, 0) + const ip1 = v1.innerProduct(v2) + const ip2 = v2.innerProduct(v1) + assert.strictEqual(ip1, ip2) + assert.strictEqual(ip1, 0) + }) + it('manhattanDistanceTo', function () { + const v1 = new Vec3(-1, 0, 1) + const v2 = new Vec3(10, -10, 1.1) + const dist1 = v1.manhattanDistanceTo(v2) + const dist2 = v2.manhattanDistanceTo(v1) + assert.strictEqual(dist1, dist2) + assert.strictEqual(dist1, 21.1) + }) + it('toArray', function () { + const v1 = new Vec3(1, -1, 3.14) + const array = v1.toArray() + assert.strictEqual(v1.x, array[0]) + assert.strictEqual(v1.y, array[1]) + assert.strictEqual(v1.z, array[2]) + }) +}) diff --git a/test/test.js b/test/test.js index 1c24eec..9c04e78 100644 --- a/test/test.js +++ b/test/test.js @@ -1,10 +1,9 @@ /* eslint-env mocha */ -const v = require('../') -const Vec3 = v.Vec3 -const assert = require('assert') +import assert from 'node:assert' +import { v, Vec3 } from '../src/mod.js' -describe('v()', function () { +describe('v() esm', function () { it('no args', function () { const v1 = v() assert.strictEqual(v1.x, 0) @@ -51,7 +50,8 @@ describe('v()', function () { }, /cannot parse/) }) }) -describe('vec3', function () { + +describe('vec3 esm', function () { it('isZero', function () { const v1 = new Vec3(0, 1, 2) const v2 = new Vec3(0, 0, 0) diff --git a/wrapper.mjs b/wrapper.mjs deleted file mode 100644 index e6ef4fb..0000000 --- a/wrapper.mjs +++ /dev/null @@ -1,4 +0,0 @@ -import mod from './index.js' - -export default mod -export const Vec3 = mod.Vec3 From dd49a986088c06f82e5a98357006c6ba1f04f61a Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Thu, 8 May 2025 23:07:16 +0200 Subject: [PATCH 2/6] doc(readme): fix copy&pasete --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 931aa52..0a00cda 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## Usage ```js -import { v, Vec3 } from '../src/mod.js' +import { v, Vec3 } from 'vec3' const v1 = v(1, 2, 3); console.log(v1); // prints "(1, 2, 3)" @@ -21,7 +21,7 @@ const v3 = new Vec3(0, 1, 2); Or _if you prefer_ CommonJS: ```js -const v = require('../src/mod.cjs') +const v = require('vec3') const Vec3 = v.Vec3 // etc... ``` From 5b041e7eed3da0bb3940e2479f376a131e7d033c Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 10 May 2025 22:05:45 +0200 Subject: [PATCH 3/6] make less change as possible --- src/mod.d.ts => index.d.ts | 0 src/mod.js => index.js | 0 package.json | 17 ++++++++--------- test/index.test-d.ts | 2 +- test/test.cjs | 2 +- test/test.js | 2 +- src/mod.cjs => wrapper.cjs | 2 +- 7 files changed, 12 insertions(+), 13 deletions(-) rename src/mod.d.ts => index.d.ts (100%) rename src/mod.js => index.js (100%) rename src/mod.cjs => wrapper.cjs (64%) diff --git a/src/mod.d.ts b/index.d.ts similarity index 100% rename from src/mod.d.ts rename to index.d.ts diff --git a/src/mod.js b/index.js similarity index 100% rename from src/mod.js rename to index.js diff --git a/package.json b/package.json index a4616e9..aefde08 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "vec3", - "version": "0.1.10", + "version": "0.1.11", "description": "3d vector math with good unit tests", - "main": "./src/mod.js", - "types": "./src/mod.d.ts", + "main": "index.js", + "types": "index.d.ts", "type": "module", "scripts": { "test": "npm run test-js && npm run test-types", @@ -16,16 +16,15 @@ "keywords": [ "point" ], + "exports": { + "require": "./wrapper.cjs" + }, "author": "Andrew Kelley", "license": "BSD", "devDependencies": { "mocha": "^11.0.1", "standard": "^17.0.0", - "tsd": "^0.25.0", - "vec3": "file:../src/mod.js" - }, - "exports": { - "require": "./src/mod.cjs" + "tsd": "^0.25.0" }, "tsd": { "directory": "test" @@ -34,4 +33,4 @@ "type": "git", "url": "https://github.com/PrismarineJS/node-vec3.git" } -} +} \ No newline at end of file diff --git a/test/index.test-d.ts b/test/index.test-d.ts index c9f83aa..3899ab0 100644 --- a/test/index.test-d.ts +++ b/test/index.test-d.ts @@ -1,5 +1,5 @@ import { expectType } from "tsd"; -import vec3, { Vec3 } from "../src/mod.js"; +import vec3, { Vec3 } from "../index"; const vec = vec3([1, 2, 3]); expectType(vec); diff --git a/test/test.cjs b/test/test.cjs index 4457e2b..fa72f6a 100644 --- a/test/test.cjs +++ b/test/test.cjs @@ -1,7 +1,7 @@ /* eslint-env mocha */ const assert = require('node:assert') -const v = require('../src/mod.cjs') +const v = require('../wrapper.cjs') const Vec3 = v.Vec3 describe('v() cjs', function () { diff --git a/test/test.js b/test/test.js index 9c04e78..c69159d 100644 --- a/test/test.js +++ b/test/test.js @@ -1,7 +1,7 @@ /* eslint-env mocha */ import assert from 'node:assert' -import { v, Vec3 } from '../src/mod.js' +import { v, Vec3 } from '../index.js' describe('v() esm', function () { it('no args', function () { diff --git a/src/mod.cjs b/wrapper.cjs similarity index 64% rename from src/mod.cjs rename to wrapper.cjs index 0c9f75f..b7c99a3 100644 --- a/src/mod.cjs +++ b/wrapper.cjs @@ -1,4 +1,4 @@ -const pkg = require('./mod.js') +const pkg = require('./index.js') module.exports = pkg.default module.exports.Vec3 = pkg.Vec3 From a3982f8ab3da8e4ab2303e6db91dbb9304af043f Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 10 May 2025 22:06:59 +0200 Subject: [PATCH 4/6] twik --- test/index.test-d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.test-d.ts b/test/index.test-d.ts index 3899ab0..04508f9 100644 --- a/test/index.test-d.ts +++ b/test/index.test-d.ts @@ -1,5 +1,5 @@ import { expectType } from "tsd"; -import vec3, { Vec3 } from "../index"; +import vec3, { Vec3 } from "../"; const vec = vec3([1, 2, 3]); expectType(vec); From 4dc0e20a808b9ca9f7e14259610e6d7586420221 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Thu, 5 Jun 2025 09:42:50 +0200 Subject: [PATCH 5/6] Update index.js Co-authored-by: Joyee Cheung --- index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 422cbe9..2c09752 100644 --- a/index.js +++ b/index.js @@ -265,5 +265,7 @@ function euclideanMod (numerator, denominator) { return result < 0 ? result + denominator : result } -export { Vec3, v } -export default v +v.Vec3 = Vec3 +export default v // So that import v from 'vec3' works. +export { v as 'module.exports' } // So that const v = require('vec3') works. +export { Vec3 } // So that import { Vec3 } from 'vec3' and const { Vec3 } = require('vec3') work. From 744619e1d6b5b09d8102141993f981e61b4eb075 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:55:36 +0200 Subject: [PATCH 6/6] clean --- index.js | 6 +- package.json | 3 - test/test.cjs | 415 -------------------------------------------------- wrapper.cjs | 4 - 4 files changed, 3 insertions(+), 425 deletions(-) delete mode 100644 test/test.cjs delete mode 100644 wrapper.cjs diff --git a/index.js b/index.js index 2c09752..b6b1bdc 100644 --- a/index.js +++ b/index.js @@ -266,6 +266,6 @@ function euclideanMod (numerator, denominator) { } v.Vec3 = Vec3 -export default v // So that import v from 'vec3' works. -export { v as 'module.exports' } // So that const v = require('vec3') works. -export { Vec3 } // So that import { Vec3 } from 'vec3' and const { Vec3 } = require('vec3') work. +export default v // So that import v from 'vec3' works. +export { v as 'module.exports' } // So that const v = require('vec3') works. +export { Vec3, v } // So that import { Vec3, v } from 'vec3' and const { Vec3, v } = require('vec3') work. diff --git a/package.json b/package.json index aefde08..2ec232d 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,6 @@ "keywords": [ "point" ], - "exports": { - "require": "./wrapper.cjs" - }, "author": "Andrew Kelley", "license": "BSD", "devDependencies": { diff --git a/test/test.cjs b/test/test.cjs deleted file mode 100644 index fa72f6a..0000000 --- a/test/test.cjs +++ /dev/null @@ -1,415 +0,0 @@ -/* eslint-env mocha */ - -const assert = require('node:assert') -const v = require('../wrapper.cjs') -const Vec3 = v.Vec3 - -describe('v() cjs', function () { - it('no args', function () { - const v1 = v() - assert.strictEqual(v1.x, 0) - assert.strictEqual(v1.y, 0) - assert.strictEqual(v1.z, 0) - }) - it('x, y, z', function () { - const v1 = v(-1, 5, 10.10) - assert.strictEqual(v1.x, -1) - assert.strictEqual(v1.y, 5) - assert.strictEqual(v1.z, 10.10) - }) - it('array', function () { - const v1 = v([4, 5, 6]) - assert.strictEqual(v1.x, 4) - assert.strictEqual(v1.y, 5) - assert.strictEqual(v1.z, 6) - }) - it('object', function () { - const v1 = v({ x: 9, y: 8, z: 7 }) - assert.strictEqual(v1.x, 9) - assert.strictEqual(v1.y, 8) - assert.strictEqual(v1.z, 7) - }) - it('string coords', function () { - const v1 = v('1', '1.5', '-30.2') - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, 1.5) - assert.strictEqual(v1.z, -30.2) - }) - it('deserialize', function () { - const v1 = v(v(1, -3.5, 0).toString()) - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, -3.5) - assert.strictEqual(v1.z, 0) - const v2 = v(v(-111, 222, 9876543210.12345).toString()) - assert.strictEqual(v2.x, -111) - assert.strictEqual(v2.y, 222) - assert.strictEqual(v2.z, 9876543210.12345) - }) - it('invalid deserialize', function () { - assert.throws(function () { - return v('lol hax') - }, /cannot parse/) - }) -}) - -describe('vec3 cjs', function () { - it('isZero', function () { - const v1 = new Vec3(0, 1, 2) - const v2 = new Vec3(0, 0, 0) - assert.ok(!v1.isZero()) - assert.ok(v2.isZero()) - }) - it('at', function () { - const v1 = new Vec3(0, 1, 2) - assert.strictEqual(v1.at(0), 0) - assert.strictEqual(v1.at(1), 1) - assert.strictEqual(v1.at(2), 2) - }) - it('xz', function () { - const v1 = new Vec3(0, 1, 2) - const a = v1.xz() - assert.strictEqual(a[0], 0) - assert.strictEqual(a[1], 2) - }) - it('xy', function () { - const v1 = new Vec3(0, 1, 2) - const a = v1.xy() - assert.strictEqual(a[0], 0) - assert.strictEqual(a[1], 1) - }) - it('yz', function () { - const v1 = new Vec3(0, 1, 2) - const a = v1.yz() - assert.strictEqual(a[0], 1) - assert.strictEqual(a[1], 2) - }) - it('xzy', function () { - const v1 = new Vec3(0, 1, 2) - const v2 = v1.xzy() - assert.strictEqual(v2.x, 0) - assert.strictEqual(v2.y, 2) - assert.strictEqual(v2.z, 1) - }) - it('rounded', function () { - const v1 = new Vec3(1.1, -1.5, 1.9) - const v2 = v1.rounded() - v1.x = 10 - assert.strictEqual(v2.x, 1) - assert.strictEqual(v2.y, -1) - assert.strictEqual(v2.z, 2) - }) - it('round', function () { - const v1 = new Vec3(1.1, -1.5, 1.9) - const v2 = v1.round() - assert.strictEqual(v2, v1) - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, -1) - assert.strictEqual(v1.z, 2) - }) - it('floored', function () { - const v1 = new Vec3(1.1, -1.5, 1.9) - const v2 = v1.floored() - v1.x = 10 - assert.strictEqual(v2.x, 1) - assert.strictEqual(v2.y, -2) - assert.strictEqual(v2.z, 1) - }) - it('floor', function () { - const v1 = new Vec3(1.1, -1.5, 1.9) - const v2 = v1.floor() - assert.strictEqual(v2, v1) - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, -2) - assert.strictEqual(v1.z, 1) - }) - it('offset', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = v1.offset(10, -10, 20) - v1.x = -100 - assert.strictEqual(v2.x, 11) - assert.strictEqual(v2.y, -8) - assert.strictEqual(v2.z, 23) - }) - it('translate', function () { - const v1 = new Vec3(1, 2, 3) - v1.translate(10, -10, 20) - assert.strictEqual(v1.x, 11) - assert.strictEqual(v1.y, -8) - assert.strictEqual(v1.z, 23) - }) - it('plus', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = new Vec3(-1, 0, 1) - const v3 = v1.plus(v2) - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, 2) - assert.strictEqual(v1.z, 3) - assert.strictEqual(v2.x, -1) - assert.strictEqual(v2.y, 0) - assert.strictEqual(v2.z, 1) - assert.strictEqual(v3.x, 0) - assert.strictEqual(v3.y, 2) - assert.strictEqual(v3.z, 4) - }) - it('minus', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = new Vec3(-1, 0, 1) - const v3 = v1.minus(v2) - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, 2) - assert.strictEqual(v1.z, 3) - assert.strictEqual(v2.x, -1) - assert.strictEqual(v2.y, 0) - assert.strictEqual(v2.z, 1) - assert.strictEqual(v3.x, 2) - assert.strictEqual(v3.y, 2) - assert.strictEqual(v3.z, 2) - }) - it('scaled', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = v1.scaled(2) - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, 2) - assert.strictEqual(v1.z, 3) - assert.strictEqual(v2.x, 2) - assert.strictEqual(v2.y, 4) - assert.strictEqual(v2.z, 6) - }) - it('abs', function () { - const v1 = new Vec3(1.1, -1.5, 1.9) - const v2 = v1.abs() - v1.x = 10 - assert.strictEqual(v2.x, 1.1) - assert.strictEqual(v2.y, 1.5) - assert.strictEqual(v2.z, 1.9) - }) - it('distanceTo', function () { - const v1 = new Vec3(1, 1, 1) - const v2 = new Vec3(2, 2, 2) - const dist1 = v1.distanceTo(v2) - const dist2 = v2.distanceTo(v1) - const expected = 1.7320508075688772 - assert.strictEqual(dist1, dist2) - assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) - }) - it('distanceSquared', function () { - const v1 = new Vec3(1, 1, 1) - const v2 = new Vec3(2, 2, 2) - const dist1 = v1.distanceSquared(v2) - const dist2 = v2.distanceSquared(v1) - const expected = 3 - assert.strictEqual(dist1, dist2) - assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) - }) - it('equals', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = v1.scaled(0.23424) - const v3 = v1.scaled(0.23424) - assert.ok(v2.equals(v3)) - const v4 = new Vec3(0.1, 0, 0) - const v5 = new Vec3(0.2, 0, 0) - const v6 = new Vec3(0.3, 0, 0) - assert.ok(v4.plus(v5).equals(v6, Number.EPSILON)) - }) - it('toString', function () { - const v1 = new Vec3(1, -1, 3.14) - assert.strictEqual(v1.toString(), '(1, -1, 3.14)') - }) - it('clone', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = v1.clone() - v2.x = 10 - assert.strictEqual(v1.x, 1) - assert.strictEqual(v1.y, 2) - assert.strictEqual(v1.z, 3) - assert.strictEqual(v2.x, 10) - assert.strictEqual(v2.y, 2) - assert.strictEqual(v2.z, 3) - }) - it('add', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = new Vec3(-1, -2, -3) - const v3 = v1.add(v2) - assert.strictEqual(v3, v1) - assert.strictEqual(v1.x, 0) - assert.strictEqual(v1.y, 0) - assert.strictEqual(v1.z, 0) - }) - it('subtract', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = new Vec3(-1, -2, -3) - const v3 = v1.subtract(v2) - assert.strictEqual(v3, v1) - assert.strictEqual(v1.x, 2) - assert.strictEqual(v1.y, 4) - assert.strictEqual(v1.z, 6) - }) - it('multiply', function () { - const v1 = new Vec3(1, 2, 3) - const v2 = new Vec3(-1, -2, -5) - const v3 = v1.multiply(v2) - assert.strictEqual(v3, v1) - assert.strictEqual(v1.x, -1) - assert.strictEqual(v1.y, -4) - assert.strictEqual(v1.z, -15) - }) - it('divide', function () { - const v1 = new Vec3(10, 20, 30) - const v2 = new Vec3(2, 5, 3) - const v3 = v1.divide(v2) - assert.strictEqual(v3, v1) - assert.strictEqual(v1.x, 5) - assert.strictEqual(v1.y, 4) - assert.strictEqual(v1.z, 10) - }) - it('set', function () { - const v1 = new Vec3(12, 32, 46) - const v2 = v1.set(0, 10, 100) - assert.strictEqual(v1, v2) - assert.strictEqual(v1.x, 0) - assert.strictEqual(v1.y, 10) - assert.strictEqual(v1.z, 100) - }) - it('modulus', function () { - const v1 = new Vec3(12, 32, -1) - const v2 = new Vec3(14, 32, 16) - const v3 = v1.modulus(v2) - assert.strictEqual(v1.x, 12) - assert.strictEqual(v1.y, 32) - assert.strictEqual(v1.z, -1) - assert.strictEqual(v2.x, 14) - assert.strictEqual(v2.y, 32) - assert.strictEqual(v2.z, 16) - assert.strictEqual(v3.x, 12) - assert.strictEqual(v3.y, 0) - assert.strictEqual(v3.z, 15) - }) - it('volume', function () { - const v1 = new Vec3(3, 4, 5) - assert.strictEqual(v1.volume(), 60) - }) - it('min', function () { - const v1 = new Vec3(-1, 0, 1) - const v2 = new Vec3(10, -10, 1.1) - const v3 = v1.min(v2) - assert.strictEqual(v3.x, -1) - assert.strictEqual(v3.y, -10) - assert.strictEqual(v3.z, 1) - }) - it('max', function () { - const v1 = new Vec3(-1, 0, 1) - const v2 = new Vec3(10, -10, 1.1) - const v3 = v1.max(v2) - assert.strictEqual(v3.x, 10) - assert.strictEqual(v3.y, 0) - assert.strictEqual(v3.z, 1.1) - }) - it('update', function () { - const v1 = new Vec3(-1, 0, 1) - const v2 = new Vec3(10, -10, 1.1) - const v3 = v1.update(v2) - assert.strictEqual(v3, v1) - assert.strictEqual(v1.x, 10) - assert.strictEqual(v1.y, -10) - assert.strictEqual(v1.z, 1.1) - assert.strictEqual(v2.x, 10) - assert.strictEqual(v2.y, -10) - assert.strictEqual(v2.z, 1.1) - }) - it('norm', function () { - const v1 = new Vec3(-10, 0, 10) - assert.strictEqual(Math.round(v1.norm() * 100000), Math.round(14.1421356237 * 100000)) - }) - it('dot', function () { - const v1 = new Vec3(-1, -1, -1) - const v2 = new Vec3(1, 1, 1) - assert.strictEqual(v1.dot(v2), -3) - }) - it('cross', function () { - const v1 = new Vec3(1, 0, 0) - const v2 = new Vec3(0, 1, 0) - const v3 = new Vec3(0, 0, 1) - assert.ok(v1.cross(v2).equals(v3)) - }) - it('unit', function () { - const v1 = new Vec3(10, -10, 1.1) - const v2 = v1.unit() - assert.strictEqual(Math.round(v2.x * 100000), Math.round(0.70497744020 * 100000)) - assert.strictEqual(Math.round(v2.y * 100000), Math.round(-0.7049774402 * 100000)) - assert.strictEqual(Math.round(v2.z * 100000), Math.round(0.07754751842 * 100000)) - const v3 = new Vec3(0, 0, 0) - const v4 = v3.unit() - assert.strictEqual(v4.x, 0) - assert.strictEqual(v4.y, 0) - assert.strictEqual(v4.z, 0) - }) - it('normalize', function () { - const v1 = new Vec3(10, -10, 1.1) - const v2 = v1.normalize() - assert.strictEqual(Math.round(v2.x * 100000), Math.round(0.70497744020 * 100000)) - assert.strictEqual(Math.round(v2.y * 100000), Math.round(-0.7049774402 * 100000)) - assert.strictEqual(Math.round(v2.z * 100000), Math.round(0.07754751842 * 100000)) - const v3 = new Vec3(0, 0, 0) - const v4 = v3.normalize() - assert.strictEqual(v4.x, 0) - assert.strictEqual(v4.y, 0) - assert.strictEqual(v4.z, 0) - }) - it('scale', function () { - const v1 = new Vec3(10, -10, 1.1) - const v2 = v1.scale(1.5) - assert.strictEqual(v2.x, 15) - assert.strictEqual(v2.y, -15) - assert.strictEqual(Math.round(v2.z * 100000), Math.round(1.65 * 100000)) - }) - it('xyDistanceTo', function () { - const v1 = new Vec3(1, 1, 1) - const v2 = new Vec3(2, 2, 2) - const dist1 = v1.xyDistanceTo(v2) - const dist2 = v2.xyDistanceTo(v1) - const expected = 1.414213562 - assert.strictEqual(dist1, dist2) - assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) - }) - it('xzDistanceTo', function () { - const v1 = new Vec3(1, 1, 1) - const v2 = new Vec3(2, 2, 2) - const dist1 = v1.xzDistanceTo(v2) - const dist2 = v2.xzDistanceTo(v1) - const expected = 1.41421356237 - assert.strictEqual(dist1, dist2) - assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) - }) - it('yzDistanceTo', function () { - const v1 = new Vec3(1, 1, 1) - const v2 = new Vec3(2, 2, 2) - const dist1 = v1.yzDistanceTo(v2) - const dist2 = v2.yzDistanceTo(v1) - const expected = 1.41421356237 - assert.strictEqual(dist1, dist2) - assert.strictEqual(Math.round(dist1 * 100000), Math.round(expected * 100000)) - }) - it('innerProduct', function () { - const v1 = new Vec3(-1, 0, 1) - const v2 = new Vec3(0, 1, 0) - const ip1 = v1.innerProduct(v2) - const ip2 = v2.innerProduct(v1) - assert.strictEqual(ip1, ip2) - assert.strictEqual(ip1, 0) - }) - it('manhattanDistanceTo', function () { - const v1 = new Vec3(-1, 0, 1) - const v2 = new Vec3(10, -10, 1.1) - const dist1 = v1.manhattanDistanceTo(v2) - const dist2 = v2.manhattanDistanceTo(v1) - assert.strictEqual(dist1, dist2) - assert.strictEqual(dist1, 21.1) - }) - it('toArray', function () { - const v1 = new Vec3(1, -1, 3.14) - const array = v1.toArray() - assert.strictEqual(v1.x, array[0]) - assert.strictEqual(v1.y, array[1]) - assert.strictEqual(v1.z, array[2]) - }) -}) diff --git a/wrapper.cjs b/wrapper.cjs deleted file mode 100644 index b7c99a3..0000000 --- a/wrapper.cjs +++ /dev/null @@ -1,4 +0,0 @@ -const pkg = require('./index.js') - -module.exports = pkg.default -module.exports.Vec3 = pkg.Vec3