@elarsaks/umap-wasm 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,2 @@
1
1
  export { UMAP, UMAPParameters } from './umap';
2
+ export { initWasm, isWasmAvailable } from './wasmBridge';
package/dist/src/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UMAP = void 0;
3
+ exports.isWasmAvailable = exports.initWasm = exports.UMAP = void 0;
4
4
  var umap_1 = require("./umap");
5
5
  Object.defineProperty(exports, "UMAP", { enumerable: true, get: function () { return umap_1.UMAP; } });
6
+ var wasmBridge_1 = require("./wasmBridge");
7
+ Object.defineProperty(exports, "initWasm", { enumerable: true, get: function () { return wasmBridge_1.initWasm; } });
8
+ Object.defineProperty(exports, "isWasmAvailable", { enumerable: true, get: function () { return wasmBridge_1.isWasmAvailable; } });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var test_1 = require("@playwright/test");
40
+ test_1.test.describe('UMAP WASM Module', function () {
41
+ (0, test_1.test)('should load UMAP from script tag and create instance', function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
42
+ var html, resultText;
43
+ var page = _b.page;
44
+ return __generator(this, function (_c) {
45
+ switch (_c.label) {
46
+ case 0:
47
+ html = "\n<!DOCTYPE html>\n<html>\n<head>\n <title>UMAP WASM Test</title>\n <script src=\"./lib/umap-js.js\"></script>\n</head>\n<body>\n <div id=\"result\">Loading...</div>\n <script>\n try {\n // Check if UMAP is available globally\n if (typeof UMAP === 'undefined') {\n throw new Error('UMAP not loaded globally');\n }\n \n if (typeof UMAP.UMAP !== 'function') {\n throw new Error('UMAP.UMAP class not available');\n }\n \n // Create a simple UMAP instance\n const umap = new UMAP.UMAP({\n nNeighbors: 5,\n minDist: 0.1,\n nComponents: 2\n });\n \n if (typeof umap.fit !== 'function') {\n throw new Error('UMAP instance missing fit method');\n }\n \n document.getElementById('result').textContent = 'SUCCESS: UMAP loaded and instance created';\n \n } catch (error) {\n document.getElementById('result').textContent = 'ERROR: ' + error.message;\n console.error('Test failed:', error);\n }\n </script>\n</body>\n</html>";
48
+ return [4, page.goto('/')];
49
+ case 1:
50
+ _c.sent();
51
+ return [4, page.setContent(html)];
52
+ case 2:
53
+ _c.sent();
54
+ return [4, page.waitForFunction(function () {
55
+ var result = document.getElementById('result');
56
+ return result && result.textContent !== 'Loading...';
57
+ }, { timeout: 10000 })];
58
+ case 3:
59
+ _c.sent();
60
+ return [4, page.locator('#result').textContent()];
61
+ case 4:
62
+ resultText = _c.sent();
63
+ (0, test_1.expect)(resultText).toMatch(/^SUCCESS:/);
64
+ (0, test_1.expect)(resultText).toContain('UMAP loaded');
65
+ return [2];
66
+ }
67
+ });
68
+ }); });
69
+ (0, test_1.test)('should run basic UMAP fit', function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
70
+ var html, resultText;
71
+ var page = _b.page, browserName = _b.browserName;
72
+ return __generator(this, function (_c) {
73
+ switch (_c.label) {
74
+ case 0:
75
+ test_1.test.skip(browserName === 'webkit', 'Webkit may have computation issues');
76
+ html = "\n<!DOCTYPE html>\n<html>\n<head>\n <title>UMAP Basic Fit Test</title>\n <script src=\"./lib/umap-js.js\"></script>\n</head>\n<body>\n <div id=\"result\">Loading...</div>\n <script>\n try {\n // Create test data: simple 2D points that should cluster\n const testData = [\n [0, 0], [0.1, 0.1], [0.2, 0.1], // cluster 1\n [5, 5], [5.1, 5.1], [4.9, 5.2], // cluster 2\n ];\n \n const umap = new UMAP.UMAP({\n nNeighbors: 2,\n minDist: 0.1,\n nComponents: 2,\n nEpochs: 5 // Keep it very short for test\n });\n \n const result = umap.fit(testData);\n \n if (!Array.isArray(result)) {\n throw new Error('fit() should return an array');\n }\n \n if (result.length !== testData.length) {\n throw new Error('Expected ' + testData.length + ' results, got ' + result.length);\n }\n \n if (!Array.isArray(result[0]) || result[0].length !== 2) {\n throw new Error('Each result should be a 2D point');\n }\n \n document.getElementById('result').textContent = \n 'SUCCESS: UMAP fit completed, transformed ' + result.length + ' points';\n \n } catch (error) {\n document.getElementById('result').textContent = 'ERROR: ' + error.message;\n console.error('Fit test failed:', error);\n }\n </script>\n</body>\n</html>";
77
+ return [4, page.goto('/')];
78
+ case 1:
79
+ _c.sent();
80
+ return [4, page.setContent(html)];
81
+ case 2:
82
+ _c.sent();
83
+ return [4, page.waitForFunction(function () {
84
+ var result = document.getElementById('result');
85
+ return result && result.textContent !== 'Loading...';
86
+ }, { timeout: 30000 })];
87
+ case 3:
88
+ _c.sent();
89
+ return [4, page.locator('#result').textContent()];
90
+ case 4:
91
+ resultText = _c.sent();
92
+ (0, test_1.expect)(resultText).toMatch(/^SUCCESS:/);
93
+ (0, test_1.expect)(resultText).toContain('UMAP fit completed');
94
+ return [2];
95
+ }
96
+ });
97
+ }); });
98
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elarsaks/umap-wasm",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "JavaScript implementation of UMAP",
5
5
  "author": {
6
6
  "name": "Andy Coenen",
@@ -31,12 +31,15 @@
31
31
  "scripts": {
32
32
  "test": "vitest run",
33
33
  "test:watch": "vitest",
34
+ "test:playwright": "playwright test",
35
+ "preview": "npx serve . -p 4173",
34
36
  "bundle": "rm -rf lib && webpack --config ./webpack/lib.config.ts && webpack --config ./webpack/lib.min.config.ts",
35
37
  "build": "rm -rf dist && tsc && yarn bundle",
36
38
  "build:wasm": "cd wasm && wasm-pack build --target web --out-dir pkg",
37
39
  "prepublishOnly": "yarn build:wasm && yarn build"
38
40
  },
39
41
  "devDependencies": {
42
+ "@playwright/test": "^1.57.0",
40
43
  "@types/jest": "^30.0.0",
41
44
  "@types/node": "^25.0.3",
42
45
  "jest": "^30.2.0",